diff --git a/.github/workflows/_package-linux.yml b/.github/workflows/_package-linux.yml index 7fc89a5bcf..c659cc014c 100644 --- a/.github/workflows/_package-linux.yml +++ b/.github/workflows/_package-linux.yml @@ -132,6 +132,12 @@ jobs: test -f "${extension_path}" pnpm run smoke:duckdb:vss -- --platform linux --arch "${TARGET_ARCH}" --extension-path "${extension_path}" + - name: Verify packaged Memory runtime + run: >- + pnpm run smoke:harness:memory -- + --resources-path "dist/${{ env.UNPACKED_DIRECTORY }}/resources" + --executable "dist/${{ env.UNPACKED_DIRECTORY }}/deepchat.bin" + - name: Verify packaged OpenDAL native package run: >- pnpm run smoke:opendal:native -- diff --git a/.github/workflows/_package-macos.yml b/.github/workflows/_package-macos.yml index 14ccaf727d..d9b74a2e19 100644 --- a/.github/workflows/_package-macos.yml +++ b/.github/workflows/_package-macos.yml @@ -174,6 +174,12 @@ jobs: test -f "${extension_path}" pnpm run smoke:duckdb:vss -- --platform darwin --arch "${TARGET_ARCH}" --extension-base64-path "${extension_path}" + - name: Verify packaged Memory runtime + run: >- + pnpm run smoke:harness:memory -- + --resources-path "${{ env.APP_DIRECTORY }}/Contents/Resources" + --executable "${{ env.APP_DIRECTORY }}/Contents/MacOS/DeepChat" + - name: Verify packaged OpenDAL native package run: >- pnpm run smoke:opendal:native -- diff --git a/.github/workflows/_package-windows.yml b/.github/workflows/_package-windows.yml index 010ff779d0..5ba2b8d67f 100644 --- a/.github/workflows/_package-windows.yml +++ b/.github/workflows/_package-windows.yml @@ -133,6 +133,12 @@ jobs: test -f "${extension_path}" pnpm run smoke:duckdb:vss -- --platform win32 --arch "${TARGET_ARCH}" --extension-path "${extension_path}" + - name: Verify packaged Memory runtime + run: >- + pnpm run smoke:harness:memory -- + --resources-path "dist/${{ env.UNPACKED_DIRECTORY }}/resources" + --executable "dist/${{ env.UNPACKED_DIRECTORY }}/DeepChat.exe" + - name: Verify packaged OpenDAL native package run: >- pnpm run smoke:opendal:native -- diff --git a/.github/workflows/prcheck.yml b/.github/workflows/prcheck.yml index eb983edfc8..4a2f21d6b8 100644 --- a/.github/workflows/prcheck.yml +++ b/.github/workflows/prcheck.yml @@ -75,6 +75,12 @@ jobs: - name: Install dependencies run: pnpm install --frozen-lockfile + - name: Check Rust host + run: | + cargo fmt --check --manifest-path crates/deepchat-harness/Cargo.toml + cargo clippy --locked --manifest-path crates/deepchat-harness/Cargo.toml --all-targets -- -D warnings + cargo test --locked --manifest-path crates/deepchat-harness/Cargo.toml + - name: Test main process run: pnpm run test:main @@ -153,6 +159,9 @@ jobs: pnpm run installRuntime:duckdb:vss:linux:x64 pnpm run smoke:duckdb:vss -- --platform linux --arch x64 + - name: Build Rutis harness for native integration + run: pnpm run harness:build + - name: Validate portable memory behavior run: pnpm run test:memory @@ -201,9 +210,10 @@ jobs: DEEPCHAT_REQUIRE_NATIVE_SQLITE: '1' run: pnpm run test:memory:eval - - name: Validate memory performance bounds + - name: Validate memory workload bounds and report timings env: DEEPCHAT_REQUIRE_NATIVE_SQLITE: '1' + DEEPCHAT_MEMORY_PERF_REPORT_ONLY: '1' run: pnpm run test:main:memory-perf - name: Upload memory retrieval report diff --git a/.gitignore b/.gitignore index d60b8a031b..501f09e043 100644 --- a/.gitignore +++ b/.gitignore @@ -28,3 +28,6 @@ test-results/ # tsc incremental build info *.tsbuildinfo + +# Rust harness build artifacts +crates/deepchat-harness/target/ diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 34c616b404..6b04ee9890 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -57,6 +57,7 @@ We use GitHub to host code, to track issues and feature requests, as well as acc 2. Install required development tools: - Install [Node.js](https://nodejs.org/) (Latest LTS version recommended) + - Install Rustup for the native Rutis host; `rust-toolchain.toml` pins Rust 1.95.0. `pnpm run dev` and `pnpm run build` build the host automatically; packaged users do not need Rust. 3. Additional setup based on your operating system: diff --git a/CONTRIBUTING.zh.md b/CONTRIBUTING.zh.md index fa6fbe50fa..7f5424d70d 100644 --- a/CONTRIBUTING.zh.md +++ b/CONTRIBUTING.zh.md @@ -57,6 +57,7 @@ 2. 安装必要的开发工具: - 安装 [Node.js](https://nodejs.org/) (推荐使用最新的 LTS 版本) + - Install Rustup for the native Rutis host; `rust-toolchain.toml` pins Rust 1.95.0. `pnpm run dev` and `pnpm run build` build the host automatically; packaged users do not need Rust. 3. 根据您的操作系统进行额外设置: diff --git a/crates/deepchat-harness/Cargo.lock b/crates/deepchat-harness/Cargo.lock new file mode 100644 index 0000000000..6801999a29 --- /dev/null +++ b/crates/deepchat-harness/Cargo.lock @@ -0,0 +1,1241 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "assoc" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfdc70193dadb9d7287fa4b633f15f90c876915b31f6af17da307fc59c9859a8" + +[[package]] +name = "autocfg" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" + +[[package]] +name = "bitflags" +version = "2.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ded4057c258ba199e2d26386d3af3780957ecaee6c4ef4041c6b4b8b97c0b06" + +[[package]] +name = "bitvec" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddcec3d12c579d40898fe0a9a358a803c23e9c52ca3c425707f81c9436211837" +dependencies = [ + "funty", + "radium", + "tap", + "wyz", +] + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "bytes" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04" + +[[package]] +name = "cfg-if" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e7648175b45a9a48536d676f68d918270699102aa8dab5496df06904c914600" + +[[package]] +name = "const-siphasher" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03efed02df0504d71e44bfd51d3329f401b8303a2fd14254acf05c95a0af0153" + +[[package]] +name = "corosensei" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6886a0c0f263965933c438626e7179139a62b978a33aa18281cbf0cd5a975f34" +dependencies = [ + "autocfg", + "cfg-if", + "libc", + "scopeguard", + "windows-sys 0.59.0", +] + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "crypto-common" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "deepchat-harness" +version = "0.1.0" +dependencies = [ + "futures-util", + "rutis", + "rutis-bridge", + "rutis-loader", + "serde", + "serde_json", + "tokio", + "url", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", +] + +[[package]] +name = "displaydoc" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6232dd377dcc64799954cbd3a9bb882e9cdc1308ccd87b1c098f1fb2eaf82a8" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.9", +] + +[[package]] +name = "dyn-clone" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" + +[[package]] +name = "equivalent" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00d174d5400e5e8fd687ad1049e2f578285fa914201b1af7e8b112a4546bd826" + +[[package]] +name = "erased-serde" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2add8a07dd6a8d93ff627029c51de145e12686fbc36ecb298ac22e74cf02dec" +dependencies = [ + "serde", + "serde_core", + "typeid", +] + +[[package]] +name = "errno" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + +[[package]] +name = "fastrand" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da7c62ceae207dd37ea5b845da6a0696c799f85e97da1ab5b7910be3c1c80223" + +[[package]] +name = "foldhash" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" + +[[package]] +name = "form_urlencoded" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + +[[package]] +name = "futures-core" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92d699e522242e69e3003b94ecc1f960f3a5e015aa7c5d7486e65ad01dd94f5e" + +[[package]] +name = "futures-macro" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fb9654ba8355388abeb8dcb4fc62f511300867002afc858860463bdd9fe0c44" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.9", +] + +[[package]] +name = "futures-sink" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1944426bf7d03f1d14f708785e4b33efd750b36d48a157b836b3efc15ede8e1d" + +[[package]] +name = "futures-task" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd417de3d1d015fc3bfd2b1ea46dfc7bab72ef86f1cc7cc9c78e728b34a6d1fd" + +[[package]] +name = "futures-util" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d50a92467f8ba5dd6e3ee5d4bd04d73ab2e4e1c44474a0674821dfce14b79bc" +dependencies = [ + "futures-core", + "futures-macro", + "futures-task", + "pin-project-lite", + "slab", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "getrandom" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099" +dependencies = [ + "cfg-if", + "libc", + "r-efi", +] + +[[package]] +name = "hashbrown" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "icu_collections" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe090a42a0d3140fed8c63263ed1fecc02422cb2f4bfe55cd8de2de1b8e105dd" +dependencies = [ + "displaydoc", + "potential_utf", + "utf8_iter", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locale_core" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25d29b57c17c6528d0dc4c2141cfa2d08200465acb537a3909c8b9b8a4a984c0" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_normalizer" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "404a3b8c486f205c87fe7f23ab6894d84a4ad76d6e4671ae1981ba7def87c599" +dependencies = [ + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20f0088bfb7441f7a37fa0c9e20cb1e9cba1cac6b9ce8cd2a6dc44294f8e8cbc" + +[[package]] +name = "icu_properties" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ea83d991c56158f7cf898bf86436c1dfe7c07ee82fe88951f2695c9f37a379f" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b98f29af82d02b163fe50161388350e743bb3107cc8e8c2f7314cb505faddfcf" + +[[package]] +name = "icu_provider" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413099315636c588ee8f011190b329b971a09a8fae9d157e01dcae8379468514" +dependencies = [ + "displaydoc", + "icu_locale_core", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", +] + +[[package]] +name = "idna" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb68373c0d6620ef8105e855e7745e18b0d00d3bdb07fb532e434244cdb9a714" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "indexmap" +version = "2.14.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc4e190f5d26ca7051642629da2c52fc03bde85a03197c99408dcd291734c855" +dependencies = [ + "equivalent", + "hashbrown", +] + +[[package]] +name = "itoa" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" + +[[package]] +name = "libc" +version = "0.2.191" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65cd87c9a6d60536580b316ad985726104730a5151c99845f2490428ef91240a" + +[[package]] +name = "linux-raw-sys" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" + +[[package]] +name = "litemap" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47d9d19d1d6efa0109d2f65ff4c85cddd50bd572e5a00127ab10987290bcefae" + +[[package]] +name = "memchr" +version = "2.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" + +[[package]] +name = "mio" +version = "1.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1788edb87fdc09c7e26304471e2f5be8cdefb1b6930d6e3985fc02ff53bf86ee" +dependencies = [ + "libc", + "wasi", + "windows-sys 0.61.2", +] + +[[package]] +name = "once_cell" +version = "1.21.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" + +[[package]] +name = "owo-colors" +version = "4.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c45bb4a6ae1280ec0803b1ef9d3455eb50f01efbbe1447ab020f1d54fba9d8" + +[[package]] +name = "percent-encoding" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" + +[[package]] +name = "pin-project-lite" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" + +[[package]] +name = "potential_utf" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d83eb9bc6d8e5cf568e7a1101d60ee05e81ed50ea106026f3d18deeb046d7661" +dependencies = [ + "zerovec", +] + +[[package]] +name = "ppv-lite86" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "proc-macro2" +version = "1.0.107" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "r-efi" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" + +[[package]] +name = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + +[[package]] +name = "rand" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e058c7de0b26af77780c769414d6257830bb240f3c38477dbc2c16e5f54d6d4c" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom 0.2.17", +] + +[[package]] +name = "rand_pcg" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59cad018caf63deb318e5a4586d99a24424a364f40f1e5778c29aca23f4fc73e" +dependencies = [ + "rand_core", +] + +[[package]] +name = "ref-cast" +version = "1.0.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e440fb4e4b4147295338efb76001ab9e4efc0e5839df2c47fc5ac2381d365c3" +dependencies = [ + "ref-cast-impl", +] + +[[package]] +name = "ref-cast-impl" +version = "1.0.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92ecd8964f8453721699a1ed72037b0db49ce2f5a5138486ee89bed6f67cdf3a" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.9", +] + +[[package]] +name = "rustix" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "891efababe418670775f199f0d233d84843c227a0949a883ce15b37c78d6629d" +dependencies = [ + "bitflags", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.61.2", +] + +[[package]] +name = "rutis" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2979977c416f20b5ca9315b94538dc94d7424084461ec56b2af42b7314849a3a" +dependencies = [ + "erased-serde", + "rutis-macros", + "serde", + "serde_json", + "shuttle", + "thiserror", + "tokio", + "tokio-util", +] + +[[package]] +name = "rutis-bridge" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4dcf8d930b1c200a05fca2166bab4ecf412c44d0d57b35d0c4916e13da6ed59c" +dependencies = [ + "getrandom 0.2.17", + "libc", + "rutis", + "serde", + "serde_json", + "sha2", + "tempfile", + "thiserror", + "tokio", + "windows-sys 0.61.2", +] + +[[package]] +name = "rutis-loader" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b66ad6bd4f41d2cb91f6773766c4eaaa91bb8867f0c4c40e75c9d04153451db" +dependencies = [ + "libc", + "rutis", + "rutis-bridge", + "schemars", + "serde", + "serde_json", + "thiserror", + "tokio", + "url", +] + +[[package]] +name = "rutis-macros" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4632181bfad5038d3c412f153711791f3a9e63aeab3bef74822c630b9e088eac" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "schemars" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab508826f74a77ca9d5aba6ff19b522583ee3eaf28a19384ff3d0e5835fadf6e" +dependencies = [ + "dyn-clone", + "ref-cast", + "schemars_derive", + "serde", + "serde_json", +] + +[[package]] +name = "schemars_derive" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1c3a92094fa7d61aa124645844facb6b554dfc797136d0f5fd1f890e2bffc69" +dependencies = [ + "proc-macro2", + "quote", + "serde_derive_internals", + "syn 3.0.9", +] + +[[package]] +name = "scoped-tls" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "serde" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.9", +] + +[[package]] +name = "serde_derive_internals" +version = "0.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f852137cce035d6a4df67ccce505ff6b3e9fd3a10e3e52b24dc71e650bb1a9bd" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.9", +] + +[[package]] +name = "serde_json" +version = "1.0.154" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7e9cc8b1b85264074fbcc02a88680c4096b1e47df8f739dceb03bf482f04bd6" +dependencies = [ + "foldhash", + "indexmap", + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", +] + +[[package]] +name = "sha2" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "shuttle" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90f796ae4996c3fbf039c26d69536f8e112f49fd5e9a25fd353fe4787134b7cb" +dependencies = [ + "bitvec", + "cfg-if", + "const-siphasher", + "corosensei", + "hex", + "owo-colors", + "rand", + "rand_core", + "rand_pcg", + "scoped-tls", + "shuttle-engine", + "shuttle-schedulers", + "shuttle-std", + "tracing", +] + +[[package]] +name = "shuttle-engine" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6bf952ac286e32a98c2f1540b44747ee93a3435a4835eb266eeb53658b9782ca" +dependencies = [ + "assoc", + "bitvec", + "cfg-if", + "const-siphasher", + "corosensei", + "hex", + "owo-colors", + "rand", + "rand_core", + "rand_pcg", + "scoped-tls", + "smallvec", + "tracing", +] + +[[package]] +name = "shuttle-schedulers" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7673a579e1660404067f5aa1344d6530f15b59f53b0fe98767d7ab117d14067" +dependencies = [ + "rand", + "rand_pcg", + "shuttle-engine", + "smallvec", + "tracing", +] + +[[package]] +name = "shuttle-std" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05fa35d22b2671e0184a13d0221055ae9e07a570862798e866118acd4be50f15" +dependencies = [ + "assoc", + "owo-colors", + "shuttle-engine", + "smallvec", + "tracing", +] + +[[package]] +name = "signal-hook-registry" +version = "1.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b" +dependencies = [ + "errno", + "libc", +] + +[[package]] +name = "slab" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" + +[[package]] +name = "smallvec" +version = "1.16.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0d5d4b1981b8bbbb7aed204cae5726d683d5d6ac7e74ec54122ea28f315e7c8" + +[[package]] +name = "socket2" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3d1e2c7f27f8d4cb10542a02c49005dbd6e93095799d6f3be745fae9f8fedd4" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" + +[[package]] +name = "syn" +version = "2.0.119" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "3.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d78c8dee4c7bf0e14673097256fed6142ce9d3b85a408189d07482442145823b" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "synstructure" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "901704edd0dfe137f1987838ee4f259e4e063c31371bdb423f7ae38ec6f77f02" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.9", +] + +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + +[[package]] +name = "tempfile" +version = "3.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd" +dependencies = [ + "fastrand", + "getrandom 0.4.3", + "once_cell", + "rustix", + "windows-sys 0.61.2", +] + +[[package]] +name = "thiserror" +version = "2.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09e52cb86a36cede5cb101bf8908837b3e4c6e5e59fe7fd85c23fb56200d189e" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe5197923287db20a58125f0bc85c062f7f2c892de97b18c356f9efb14b28524" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.9", +] + +[[package]] +name = "tinystr" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abc840c238154d58f9e86b2792261edfde565a17696e1cda1a449de27979801a" +dependencies = [ + "displaydoc", + "zerovec", +] + +[[package]] +name = "tokio" +version = "1.54.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b52fd3255258d26fac7264ab5a76b53c13367136dc011d3d6ad4f8ed070396a3" +dependencies = [ + "bytes", + "libc", + "mio", + "pin-project-lite", + "signal-hook-registry", + "socket2", + "tokio-macros", + "windows-sys 0.61.2", +] + +[[package]] +name = "tokio-macros" +version = "2.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78773a2a397f451582ce068015985c33193cf6dea8b74d2a639fe457b2f07b0e" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.9", +] + +[[package]] +name = "tokio-util" +version = "0.7.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e464cf451ba96ebfc6f9b6542f17ee8b8956e33f1e40d9690624e59d7a7f8a4b" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "futures-util", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tracing" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" +dependencies = [ + "pin-project-lite", + "tracing-core", +] + +[[package]] +name = "tracing-core" +version = "0.1.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" +dependencies = [ + "once_cell", +] + +[[package]] +name = "typeid" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc7d623258602320d5c55d1bc22793b57daff0ec7efc270ea7d55ce1d5f5471c" + +[[package]] +name = "typenum" +version = "1.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20" + +[[package]] +name = "unicode-ident" +version = "1.0.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2c754d6c33795a1c324727428e5a7dedb5b06195f9890bdbcba760d3e246563" + +[[package]] +name = "url" +version = "2.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", + "serde", +] + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "wasi" +version = "0.11.1+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_gnullvm", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "writeable" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ad82d2a33cdc9674dc7465672f271e096168fcdbe0f799d9e6db8c5892679dc" + +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + +[[package]] +name = "yoke" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "417ef3fcf6c300b7dbd25c85531a746931c02ad536f3cf4786ed1e88223340b3" +dependencies = [ + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec8ebde2db3681e8c9980cc27822030e68752690ddfa9473e739aeb4dbde6d71" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.9", + "synstructure", +] + +[[package]] +name = "zerocopy" +version = "0.8.63" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5fe1f8f1b06191a00962174c61aa5005e0bb391a6d80d07e24d115c01a92ed8" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.63" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "863ad3ac83293fb4d740aedbfdc9240dd8d1a50c1099acd76ce80ce7c7230c7f" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "zerofrom" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ec05a11813ea801ff6d75110ad09cd0824ddba17dfe17128ea0d5f68e6c5272" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f75b4683f6c7f45248d4d64056a24298c6281e0993356d7d1b4a1a962ef10d4a" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.9", + "synstructure", +] + +[[package]] +name = "zerotrie" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ea269c3bd32f0a32c321907a2ae912ba6f4649bb0fc764a15627e99a7095a3f" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f58a2799cfe9a1670c7ea8edbd52ef8edb93cb37a7f83bf31ba9e35d9dae6a40" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.11.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3743ddbf47738d929cd1ae2e199d40d0162979dfe31aef8ae646d2bf00bf97a" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.9", +] + +[[package]] +name = "zmij" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b" diff --git a/crates/deepchat-harness/Cargo.toml b/crates/deepchat-harness/Cargo.toml new file mode 100644 index 0000000000..a092c20ea9 --- /dev/null +++ b/crates/deepchat-harness/Cargo.toml @@ -0,0 +1,24 @@ +[package] +name = "deepchat-harness" +version = "0.1.0" +edition = "2021" +rust-version = "1.88" +publish = false + +[dependencies] +futures-util = "0.3" +rutis = "=0.16.0" +rutis-bridge = { version = "=0.16.0", default-features = false, features = ["node"] } +rutis-loader = { version = "=0.16.0", features = ["node"] } +serde_json = "1" +serde = { version = "1", features = ["derive"] } +tokio = { version = "1", features = [ + "rt-multi-thread", + "macros", + "time", + "signal", + "sync", + "io-util", + "io-std" +] } +url = "2" diff --git a/crates/deepchat-harness/src/main.rs b/crates/deepchat-harness/src/main.rs new file mode 100644 index 0000000000..21152d44e5 --- /dev/null +++ b/crates/deepchat-harness/src/main.rs @@ -0,0 +1,463 @@ +use std::{ + collections::HashSet, + error::Error, + future::Future, + io::Read, + path::PathBuf, + pin::Pin, + sync::{Arc, Mutex}, + time::Duration, +}; + +use futures_util::{stream::FuturesUnordered, StreamExt}; +use rutis::{BoxFuture, CordisError, Ctx, Effect, Event, EventKey, Plugin, TypeKey}; +use rutis_bridge::{ + runtime::{Launcher, LocalRuntime, RuntimeHandle, RuntimeState, Stdio}, + session::{host_key, settle, Error as BridgeError, HostDispatch, Value}, + transport::local::{kill_processes, processes_ended}, +}; +use rutis_loader::{ + Chain, Layer, LoaderOptions, LoaderPlugin, Patch, RuntimeResolver, RuntimeRowsPlugin, + ServiceCatalog, +}; +use serde::{Deserialize, Serialize}; +use serde_json::{json, Value as Json}; +use tokio::{ + sync::{mpsc, oneshot}, + time::{sleep, timeout}, +}; + +mod memory; +mod transport; +use transport::Output; + +type Result = std::result::Result>; +const MAX_FRAME: usize = 64 * 1024; +const MAX_MEMORY_FRAME: usize = 256 * 1024; +const MEMORY_FRAME_FLAG: u32 = 0x8000_0000; +const BINARY_FRAME_FLAG: u32 = 0x4000_0000; +const MAX_MEMORY_INITIAL_CHUNK: usize = 64 * 1024; +const MAX_MEMORY_CHUNK: usize = 240 * 1024; +const MAX_CALLS: usize = 1024; + +#[derive(Deserialize)] +#[serde(rename_all = "camelCase")] +enum Method { + Acquire, + Release, + Snapshot, + Close, + FlushObservations, +} +impl Method { + fn name(&self) -> &str { + match self { + Self::Acquire => "acquire", + Self::Release => "release", + Self::Snapshot => "snapshot", + Self::Close => "close", + Self::FlushObservations => "flushObservations", + } + } +} + +#[derive(Deserialize)] +#[serde(tag = "type", rename_all = "camelCase", deny_unknown_fields)] +enum Request { + Call { + id: u64, + method: Method, + args: Vec, + }, + MemoryStart { + config: Json, + }, + MemoryCall { + id: u64, + command: Json, + #[serde(skip)] + data: Option>, + }, +} + +#[derive(Serialize, Deserialize)] +struct Observation(u64, Json); +impl Event for Observation { + const NAME: &'static str = "deepchat/admission/observation"; + type Value = (); +} + +struct ObservationForwarder(Output); +impl rutis::Listener for ObservationForwarder { + fn call<'a>( + &'a self, + _: &'a Ctx, + event: &'a Observation, + _: rutis::Call<'a, ()>, + ) -> BoxFuture<'a, std::result::Result, CordisError>> { + Box::pin(async move { + let value = event.1.clone(); + let _ = self + .0 + .send(json!({ "type": "observation", "sequence": event.0, "value": value })) + .await; + Ok(None) + }) + } +} + +fn error(name: &str, message: impl ToString) -> Json { + fn bounded(value: &str, max: usize) -> &str { + let mut end = max.min(value.len()); + while !value.is_char_boundary(end) { + end -= 1; + } + &value[..end] + } + json!({ "name": bounded(name, 256), "message": bounded(&message.to_string(), 8192) }) +} + +fn response(id: u64, result: std::result::Result) -> Json { + match result { + Ok(value) => json!({ "type": "reply", "id": id, "value": value }), + Err(error) => json!({ "type": "reply", "id": id, "error": error }), + } +} + +fn bridge_error(error: BridgeError) -> Json { + match error { + BridgeError::Remote { name, message, .. } => self::error(&name, message), + other => self::error("HarnessTransportError", other), + } +} + +async fn invoke(value: Value) -> std::result::Result { + let value = settle(value).await.map_err(bridge_error)?; + match value { + Value::Undefined => Ok(Json::Null), + value => value.json().map_err(bridge_error), + } +} + +struct AdmissionGateway { + injects: [TypeKey; 1], + incoming: Mutex>>, + outgoing: Output, +} + +impl Plugin for AdmissionGateway { + fn name(&self) -> &str { + "deepchat-admission-gateway" + } + fn injects(&self) -> &[TypeKey] { + &self.injects + } + fn apply<'a>( + &'a self, + ctx: &'a Ctx, + ) -> BoxFuture<'a, std::result::Result> { + Box::pin(async move { + let service = ctx.require_as::(self.injects[0].clone())?; + ctx.events().on( + ctx, + &EventKey::::of(), + ObservationForwarder(self.outgoing.clone()), + )?; + let runtime = invoke( + service + .invoke("snapshot", Value::List(vec![])) + .map_err(|e| CordisError::PluginFailed(Box::new(e)))?, + ) + .await + .map_err(|e| CordisError::ServiceNotFound(e.to_string()))?; + let _ = self.outgoing.send(json!({ "type": "ready", "protocol": 1, "hostPid": std::process::id(), "runtime": runtime["runtime"] })).await; + let mut incoming = self.incoming.lock().unwrap().take().ok_or_else(|| { + CordisError::ServiceNotFound("Admission generation was replaced".into()) + })?; + type Call = + Pin)> + Send>>; + let mut calls = FuturesUnordered::::new(); + let mut pending = HashSet::::new(); + loop { + tokio::select! { + biased; + _ = ctx.cancelled() => break, + Some((id, result)) = calls.next(), if !calls.is_empty() => { + pending.remove(&id); + if self.outgoing.send(response(id, result)).await.is_err() { break; } + } + request = incoming.recv() => { + match request { + None => break, + Some(Request::Call { id, method, args }) => { + if id == 0 || id > 9_007_199_254_740_991 || pending.contains(&id) || pending.len() >= MAX_CALLS { + return Err(CordisError::ServiceNotFound("Invalid or excessive harness request".into())); + } + let mut args: Vec = args.into_iter().map(Value::from).collect(); + if matches!(method, Method::Acquire) { + if args.len() != 3 { + return Err(CordisError::ServiceNotFound("Invalid acquire arguments".into())); + } + args.insert(2, Value::Signal); + } + let value = match service.invoke("dispatch", Value::List(vec![json!(id).into(), json!(method.name()).into(), Value::List(args)])) { + Ok(value) => value, + Err(error) => { + let _ = self.outgoing.send(response(id, Err(bridge_error(error)))).await; + continue; + } + }; + pending.insert(id); + calls.push(Box::pin(async move { (id, invoke(value).await) })); + } + Some(_) => return Err(CordisError::ServiceNotFound("Invalid admission request".into())), + } + } + } + } + Ok(Effect::Done) + }) + } +} + +fn decode_request(mut bytes: Vec, vector: bool, binary: bool) -> Result { + let data = if binary { + if !vector || bytes.len() < 4 { + return Err("Invalid binary memory frame".into()); + } + let metadata = u32::from_be_bytes(bytes[..4].try_into()?) as usize; + if metadata == 0 || metadata > bytes.len() - 4 { + return Err("Invalid memory metadata length".into()); + } + let data = bytes.split_off(4 + metadata); + if data.is_empty() || data.len() > MAX_MEMORY_CHUNK { + return Err("Invalid memory chunk size".into()); + } + Some(data) + } else { + None + }; + let mut request: Request = serde_json::from_slice(&bytes[if binary { 4 } else { 0 }..])?; + if vector != matches!(request, Request::MemoryCall { .. }) { + return Err("Invalid harness frame kind".into()); + } + if let Some(bytes) = data { + let Request::MemoryCall { command, data, .. } = &mut request else { + return Err("Invalid binary memory request".into()); + }; + if !matches!( + command["method"].as_str(), + Some("begin" | "chunk" | "commit") + ) || command.get("data").is_some() + { + return Err("Invalid binary memory command".into()); + } + *data = Some(bytes); + } + Ok(request) +} + +fn read_requests(sender: mpsc::Sender, memory: mpsc::Sender) -> Result<()> { + let mut input = std::io::stdin().lock(); + loop { + let mut header = [0_u8; 4]; + let header = match input.read_exact(&mut header) { + Ok(_) => u32::from_be_bytes(header), + Err(e) if e.kind() == std::io::ErrorKind::UnexpectedEof => return Ok(()), + Err(e) => return Err(e.into()), + }; + let vector = header & MEMORY_FRAME_FLAG != 0; + let binary = header & BINARY_FRAME_FLAG != 0; + let length = (header & !(MEMORY_FRAME_FLAG | BINARY_FRAME_FLAG)) as usize; + if (binary && !vector) + || length == 0 + || length > if vector { MAX_MEMORY_FRAME } else { MAX_FRAME } + { + return Err("Invalid harness frame size".into()); + } + let mut bytes = vec![0; length]; + input.read_exact(&mut bytes)?; + let request = decode_request(bytes, vector, binary)?; + match request { + Request::Call { .. } => { + if sender.blocking_send(request).is_err() { + return Ok(()); + } + } + _ => { + // A dead vector generation cannot stop admission's inherited input channel. + let _ = memory.blocking_send(request); + } + } + } +} + +async fn runtime_loss(runtime: RuntimeHandle) -> String { + loop { + if let RuntimeState::Down(reason) = runtime.state() { + return reason; + } + sleep(Duration::from_millis(50)).await; + } +} + +async fn mount( + root: &Ctx, + args: &[std::ffi::OsString], + incoming: mpsc::Receiver, + memory_incoming: mpsc::Receiver, + outgoing: Output, +) -> Result { + let electron = PathBuf::from(&args[0]).canonicalize()?; + let runtime = PathBuf::from(&args[1]).canonicalize()?; + let plugin = PathBuf::from(&args[2]).canonicalize()?; + let capacity: u64 = args[3].to_str().ok_or("Invalid capacity")?.parse()?; + let max_pending: u64 = args[4].to_str().ok_or("Invalid pending limit")?.parse()?; + if capacity == 0 || capacity > 9_007_199_254_740_991 || max_pending > 9_007_199_254_740_991 { + return Err("Invalid admission limits".into()); + } + let launcher = Launcher::new(electron) + .env("ELECTRON_RUN_AS_NODE", "1") + .env("NODE_OPTIONS", "") + .env("NODE_PATH", "") + .env("RUTIS_SHUTDOWN_TIMEOUT", "5") + .cwd(&runtime) + .stdout(Stdio::Null) + .stderr(Stdio::Inherit); + #[cfg(unix)] + let launcher = launcher.inherit_fd(); + let admission_runtime = LocalRuntime::launcher( + "harness", + launcher.clone().arg(runtime.join("src/runner.mjs")), + runtime.join("package.json"), + ); + let handle = admission_runtime.handle(); + // Bounded vector uploads do not need a throughput-grown idle nursery. + let memory_runtime = LocalRuntime::launcher( + "memory", + launcher + .arg("--max-semi-space-size=8") + .arg(runtime.join("src/runner.mjs")), + runtime.join("package.json"), + ); + let catalog = ServiceCatalog::new(); + let memory_rows = + Arc::new(RuntimeResolver::modules(memory_runtime.handle()).with_catalog(&catalog)); + let rows = Arc::new(RuntimeResolver::node(handle.clone()).with_catalog(&catalog)); + root.plugin(admission_runtime); + let loader = LoaderPlugin::new( + Chain::new() + .with_shared(rows.clone()) + .with_shared(memory_rows.clone()), + LoaderOptions { + catalog, + ..LoaderOptions::default() + }, + ); + let loader_handle = loader.handle(); + root.plugin(loader).await?; + root.plugin(RuntimeRowsPlugin::new(rows)); + root.plugin(RuntimeRowsPlugin::new(memory_rows)); + root.plugin(AdmissionGateway { + injects: [host_key("harnessAdmission")], + incoming: Mutex::new(Some(incoming)), + outgoing: outgoing.clone(), + }); + let plugin_url = url::Url::from_file_path(plugin).map_err(|_| "Invalid plugin path")?; + let patches: Vec = serde_json::from_value(json!([{ "insert": [{ + "id": "admission", "name": plugin_url.as_str(), "config": { "capacity": capacity, "maxPending": max_pending } + }] }]))?; + loader_handle + .reconcile(vec![Layer::new("harness", patches.clone())], None) + .await?; + root.plugin(memory::Bootstrap::new( + memory_runtime, + memory_incoming, + outgoing, + loader_handle, + patches, + plugin_url, + )); + Ok(handle) +} + +#[tokio::main] +async fn main() -> Result<()> { + let args: Vec<_> = std::env::args_os().skip(1).collect(); + if args.len() != 5 { + return Err( + "Usage: deepchat-harness ".into(), + ); + } + let root = Ctx::root()?; + let (requests, incoming) = mpsc::channel(64); + let (memory_requests, memory_incoming) = mpsc::channel(32); + let (outgoing, responses) = Output::channel(); + let (reader_end, mut reader) = oneshot::channel(); + // A detached blocking reader cannot hold Tokio shutdown open after runtime loss. + std::thread::spawn(move || { + let _ = reader_end.send(read_requests(requests, memory_requests)); + }); + let mut writer = tokio::spawn(transport::write_responses(responses)); + let result = async { + let runtime = timeout(Duration::from_secs(15), mount(&root, &args, incoming, memory_incoming, outgoing)).await??; + tokio::select! { + result = &mut reader => result?, + result = &mut writer => { result??; Err("Harness output closed".into()) }, + reason = runtime_loss(runtime) => Err(format!("Harness runtime stopped: {reason}").into()), + result = tokio::signal::ctrl_c() => { result?; Ok(()) }, + } + }.await; + let shutdown = timeout(Duration::from_secs(10), root.shutdown()).await; + if !matches!(&shutdown, Ok(Ok(()))) { + kill_processes(); + } + // Closing runtime channels does not mean their processes have been reaped yet. + processes_ended().await; + writer.abort(); + result?; + shutdown.map_err(|_| "Harness shutdown timed out")??; + Ok(()) +} + +#[cfg(test)] +mod tests { + use super::*; + + fn binary(command: Json, data: &[u8]) -> Vec { + let metadata = serde_json::to_vec(&json!({ + "type": "memoryCall", "id": 1, "command": command + })) + .unwrap(); + let mut frame = (metadata.len() as u32).to_be_bytes().to_vec(); + frame.extend(metadata); + frame.extend(data); + frame + } + + #[test] + fn binary_upload_preserves_bytes_and_rejects_ambiguous_frames() { + for method in ["begin", "chunk", "commit"] { + let bytes = vec![0, 255, 1, 0]; + let request = + decode_request(binary(json!({ "method": method }), &bytes), true, true).unwrap(); + assert!( + matches!(request, Request::MemoryCall { data: Some(data), .. } if data == bytes) + ); + } + let max = vec![0; MAX_MEMORY_CHUNK]; + assert!(decode_request(binary(json!({ "method": "chunk" }), &max), true, true).is_ok()); + for frame in [ + Vec::new(), + vec![0; 4], + u32::MAX.to_be_bytes().to_vec(), + binary(json!({ "method": "chunk" }), &[]), + binary(json!({ "method": "chunk" }), &vec![0; MAX_MEMORY_CHUNK + 1]), + binary(json!({ "method": "query" }), &[0]), + binary(json!({ "method": "chunk", "data": "AAAA" }), &[0]), + ] { + assert!(decode_request(frame, true, true).is_err()); + } + assert!(decode_request(binary(json!({ "method": "chunk" }), &[0]), false, true).is_err()); + } +} diff --git a/crates/deepchat-harness/src/memory.rs b/crates/deepchat-harness/src/memory.rs new file mode 100644 index 0000000000..ef42899553 --- /dev/null +++ b/crates/deepchat-harness/src/memory.rs @@ -0,0 +1,518 @@ +use super::*; +use rutis_loader::Loader; +use std::sync::atomic::{AtomicU64, Ordering}; + +const MAX_MEMORY_CALLS: usize = 32; + +const MAX_UPLOAD_BYTES: usize = 16 * 1024 * 1024; +const MAX_NATIVE_PART: usize = 8 * 1024 * 1024; + +struct Upload { + id: String, + resource: String, + memory_ids: Json, + expected: usize, + bytes: Vec, + commit: Option, +} + +enum Staged { + Reply(Json), + Call(Vec), +} + +fn stage( + upload: &mut Option, + id: u64, + command: Json, + data: Option>, + generation: &str, +) -> std::result::Result { + let invalid = || { + error( + "MemoryVectorUploadError", + "Invalid memory upload or sequence", + ) + }; + let method = command["method"].as_str().unwrap_or(""); + if !matches!(method, "begin" | "chunk" | "commit" | "abort") { + if data.is_some() { + return Err(invalid()); + } + return Ok(Staged::Call(vec![command.into()])); + } + let fields = command.as_object().ok_or_else(invalid)?; + for key in fields.keys() { + if !(matches!( + key.as_str(), + "method" | "generation" | "operation" | "resource" | "upload" + ) || method == "begin" && matches!(key.as_str(), "memoryIds" | "bytes") + || matches!(method, "chunk" | "commit") && key == "offset") + { + return Err(invalid()); + } + } + for key in ["generation", "operation", "resource", "upload"] { + command[key] + .as_str() + .ok_or_else(invalid)? + .parse::() + .map_err(|_| invalid())?; + } + if command["generation"] != generation { + return Err(invalid()); + } + if method == "begin" { + if upload.is_some() { + return Err(error( + "MemoryVectorUploadError", + "Memory vector upload is busy", + )); + } + let expected = command["bytes"] + .as_u64() + .filter(|n| *n > 0 && *n <= MAX_UPLOAD_BYTES as u64 && *n % 4 == 0) + .ok_or_else(invalid)? as usize; + let ids = command["memoryIds"] + .as_array() + .filter(|ids| !ids.is_empty() && ids.len() <= 50) + .ok_or_else(invalid)?; + let mut unique = HashSet::new(); + for value in ids { + let value = value + .as_str() + .filter(|v| !v.is_empty() && v.encode_utf16().count() <= 1024) + .ok_or_else(invalid)?; + if !unique.insert(value) { + return Err(invalid()); + } + } + let initial = data.unwrap_or_default(); + if initial.len() > MAX_MEMORY_INITIAL_CHUNK || initial.len() > expected { + return Err(invalid()); + } + let mut bytes = Vec::with_capacity(expected); + bytes.extend(initial); + *upload = Some(Upload { + id: command["upload"].as_str().unwrap().into(), + resource: command["resource"].as_str().unwrap().into(), + memory_ids: command["memoryIds"].clone(), + expected, + bytes, + commit: None, + }); + return Ok(Staged::Reply(Json::Null)); + } + let matches = upload + .as_ref() + .is_some_and(|u| command["upload"] == u.id && command["resource"] == u.resource); + if method == "abort" { + if matches && upload.as_ref().unwrap().commit.is_none() { + *upload = None; + } + return Ok(Staged::Reply(Json::Null)); + } + if !matches { + return Err(invalid()); + } + let current = upload.as_mut().unwrap(); + if current.commit.is_some() { + return Err(invalid()); + } + if let Some(bytes) = data { + if command["offset"].as_u64() != Some(current.bytes.len() as u64) + || bytes.is_empty() + || bytes.len() > MAX_MEMORY_CHUNK + || bytes.len() > current.expected - current.bytes.len() + { + return Err(invalid()); + } + current.bytes.extend(bytes); + } else if method == "chunk" || command.get("offset").is_some() { + return Err(invalid()); + } + if method == "chunk" { + return Ok(Staged::Reply(json!(current.bytes.len()))); + } + if current.bytes.len() != current.expected { + return Err(error( + "MemoryVectorUploadError", + "Memory vector upload is incomplete", + )); + } + current.commit = Some(id); + let bytes = std::mem::take(&mut current.bytes); + let calls = bytes + .chunks(MAX_NATIVE_PART) + .enumerate() + .map(|(part, bytes)| { + let mut fields: std::collections::BTreeMap = + ["generation", "operation", "resource", "upload"] + .into_iter() + .map(|key| (key.into(), command[key].clone().into())) + .collect(); + fields.insert("method".into(), json!("upsert").into()); + fields.insert("memoryIds".into(), current.memory_ids.clone().into()); + fields.insert("bytes".into(), json!(current.expected).into()); + fields.insert("offset".into(), json!(part * MAX_NATIVE_PART).into()); + fields.insert("data".into(), Value::Bytes(bytes.to_vec())); + Value::Record(fields) + }) + .collect(); + Ok(Staged::Call(calls)) +} + +pub struct Bootstrap { + runtime: Mutex>, + incoming: Mutex>>, + outgoing: Output, + loader: Loader, + admission: Vec, + plugin: url::Url, +} + +impl Bootstrap { + pub fn new( + runtime: LocalRuntime, + incoming: mpsc::Receiver, + outgoing: Output, + loader: Loader, + admission: Vec, + mut plugin: url::Url, + ) -> Self { + plugin = plugin.join("memory-vector.mjs").expect("Local plugin URL"); + Self { + runtime: Mutex::new(Some(runtime)), + incoming: Mutex::new(Some(incoming)), + outgoing, + loader, + admission, + plugin, + } + } +} + +impl Plugin for Bootstrap { + fn name(&self) -> &str { + "deepchat-memory-bootstrap" + } + + fn apply<'a>( + &'a self, + ctx: &'a Ctx, + ) -> BoxFuture<'a, std::result::Result> { + Box::pin(async move { + let mut incoming = self.incoming.lock().unwrap().take().ok_or_else(|| { + CordisError::ServiceNotFound("Memory generation cannot restart".into()) + })?; + let config = tokio::select! { + _ = ctx.cancelled() => return Ok(Effect::Done), + request = incoming.recv() => match request { + Some(Request::MemoryStart { config }) => config, + _ => return Err(CordisError::ServiceNotFound("Memory handshake required".into())), + } + }; + let runtime = self.runtime.lock().unwrap().take().ok_or_else(|| { + CordisError::ServiceNotFound("Memory generation cannot restart".into()) + })?; + let handle = runtime.handle(); + let processes = runtime.processes(); + if !config["memoryDbDir"] + .as_str() + .is_some_and(|path| std::path::Path::new(path).is_absolute()) + { + return Err(CordisError::ServiceNotFound( + "Invalid memory directory".into(), + )); + } + ctx.plugin(runtime); + ctx.plugin(Gateway { + injects: [host_key("harnessMemoryVector")], + incoming: Mutex::new(Some(incoming)), + outgoing: self.outgoing.clone(), + }); + let memory: Vec = serde_json::from_value(json!([{ "insert": [{ + "id": "memory-vector", "name": format!("memory:{}", self.plugin), "config": config + }] }])) + .map_err(|e| CordisError::ServiceNotFound(e.to_string()))?; + let layers = vec![ + Layer::new("harness", self.admission.clone()), + Layer::new("memory", memory), + ]; + if let Err(error) = self.loader.reconcile(layers, None).await { + processes.kill(); + processes.ended().await; + let _ = self.outgoing.send(json!({ "type": "memoryStopped", "message": "Memory vector plugin failed to load" })).await; + eprintln!("Memory vector plugin failed: {error}"); + return Ok(Effect::Done); + } + tokio::select! { + _ = ctx.cancelled() => {}, + _ = runtime_loss(handle) => { + processes.kill(); + processes.ended().await; + let _ = self.outgoing.send(json!({ "type": "memoryStopped", "message": "Memory vector runtime stopped; restart DeepChat to restore vector recall" })).await; + } + } + Ok(Effect::Done) + }) + } +} + +struct Gateway { + injects: [TypeKey; 1], + incoming: Mutex>>, + outgoing: Output, +} + +impl Plugin for Gateway { + fn name(&self) -> &str { + "deepchat-memory-vector-gateway" + } + fn injects(&self) -> &[TypeKey] { + &self.injects + } + fn apply<'a>( + &'a self, + ctx: &'a Ctx, + ) -> BoxFuture<'a, std::result::Result> { + Box::pin(async move { + let service = ctx.require_as::(self.injects[0].clone())?; + let identity = invoke( + service + .invoke("identity", Value::List(vec![])) + .map_err(|e| CordisError::PluginFailed(Box::new(e)))?, + ) + .await + .map_err(|e| CordisError::ServiceNotFound(e.to_string()))?; + let _ = self + .outgoing + .send(json!({ "type": "memoryReady", "protocol": 1, "runtime": identity })) + .await; + let mut incoming = self.incoming.lock().unwrap().take().ok_or_else(|| { + CordisError::ServiceNotFound("Memory generation cannot restart".into()) + })?; + type Call = Pin< + Box< + dyn Future< + Output = (u64, bool, Option, std::result::Result), + > + Send, + >, + >; + let mut calls = FuturesUnordered::::new(); + let mut pending = HashSet::new(); + let mut upload = None; + let generation = identity["generation"] + .as_str() + .ok_or_else(|| CordisError::ServiceNotFound("Missing memory generation".into()))?; + let mut next_request = 1; + let next_native = Arc::new(AtomicU64::new(1)); + loop { + tokio::select! { + biased; + _ = ctx.cancelled() => break, + Some((id, control, closed, result)) = calls.next(), if !calls.is_empty() => { + pending.remove(&id); + if result.is_ok() && upload.as_ref().is_some_and(|u: &Upload| u.commit.is_none() && closed.as_ref() == Some(&u.resource)) { upload = None; } + if upload.as_ref().is_some_and(|u: &Upload| u.commit == Some(id)) { upload = None; } + let mut reply = response(id, result); + reply["type"] = json!("memoryReply"); + if self.outgoing.send_frame(reply, control).await.is_err() { break; } + } + request = incoming.recv() => { + let Some(Request::MemoryCall { id, command, data }) = request else { break; }; + if id != next_request || id > 9_007_199_254_740_991 || pending.len() >= MAX_MEMORY_CALLS { + return Err(CordisError::ServiceNotFound("Invalid or excessive memory request".into())); + } + let control = matches!(command["method"].as_str(), Some("close" | "abort" | "reset" | "quarantine")); + let closed = if command["method"] == "close" { command["resource"].as_str().map(str::to_owned) } else { None }; + let abort = (command["method"] == "commit").then(|| { + let mut abort = command.clone(); + abort["method"] = json!("abort"); + if let Some(fields) = abort.as_object_mut() { fields.remove("offset"); } + abort + }); + next_request += 1; + let command = match stage(&mut upload, id, command, data, generation) { + Ok(Staged::Call(command)) => command, + result => { + let mut reply = response(id, match result { Ok(Staged::Reply(value)) => Ok(value), Err(error) => Err(error), _ => unreachable!() }); + reply["type"] = json!("memoryReply"); + if self.outgoing.send_frame(reply, control).await.is_err() { break; } + continue; + } + }; + let service = service.clone(); + let next_native = next_native.clone(); + pending.insert(id); + calls.push(Box::pin(async move { + let mut result = Ok(Json::Null); + for command in command { + let sequence = next_native.fetch_add(1, Ordering::Relaxed); + result = match service.invoke("dispatch", Value::List(vec![json!(sequence).into(), command])) { + Ok(value) => invoke(value).await, + Err(error) => Err(bridge_error(error)), + }; + if result.is_err() { break; } + } + if let Some(abort) = abort.filter(|_| result.is_err()) { + let sequence = next_native.fetch_add(1, Ordering::Relaxed); + if let Ok(value) = service.invoke("dispatch", Value::List(vec![json!(sequence).into(), abort.into()])) { + let _ = invoke(value).await; + } + } + (id, control, closed, result) + })); + } + } + } + Ok(Effect::Done) + }) + } +} + +#[cfg(test)] +mod tests { + use super::*; + const ID: &str = "00000000-0000-4000-8000-000000000001"; + + fn command(method: &str) -> Json { + json!({ "method": method, "generation": ID, "operation": ID, "resource": ID, "upload": ID }) + } + fn begin(bytes: usize) -> Json { + let mut value = command("begin"); + value["bytes"] = json!(bytes); + value["memoryIds"] = json!(["memory"]); + value + } + #[test] + fn upload_receipts_never_publish_an_incomplete_batch() { + let mut upload = None; + assert!(matches!( + stage(&mut upload, 1, begin(8), Some(vec![0; 4]), ID), + Ok(Staged::Reply(Json::Null)) + )); + assert!(stage(&mut upload, 2, command("commit"), None, ID).is_err()); + let mut chunk = command("chunk"); + chunk["offset"] = json!(0); + assert!(stage(&mut upload, 3, chunk.clone(), Some(vec![1; 4]), ID).is_err()); + chunk["offset"] = json!(4); + assert!( + matches!(stage(&mut upload, 4, chunk.clone(), Some(vec![1; 4]), ID), Ok(Staged::Reply(value)) if value == 8) + ); + assert!(stage(&mut upload, 5, chunk, Some(vec![1; 4]), ID).is_err()); + let Ok(Staged::Call(calls)) = stage(&mut upload, 6, command("commit"), None, ID) else { + panic!("Expected one native upsert") + }; + let Value::Record(fields) = &calls[0] else { + panic!("Expected native fields") + }; + assert_eq!(fields["method"], Value::from(json!("upsert"))); + assert_eq!(fields["data"], Value::Bytes(vec![0, 0, 0, 0, 1, 1, 1, 1])); + assert_eq!(upload.as_ref().unwrap().commit, Some(6)); + assert!(stage(&mut upload, 7, begin(8), None, ID).is_err()); + assert!(stage(&mut upload, 8, command("abort"), None, ID).is_ok()); + assert!(upload.is_some(), "An abort cannot disown a native write"); + } + #[test] + fn first_and_continuation_chunks_share_one_bounded_batch() { + let mut upload = None; + let expected = MAX_MEMORY_INITIAL_CHUNK + MAX_MEMORY_CHUNK; + assert!(stage( + &mut upload, + 1, + begin(expected), + Some(vec![0; MAX_MEMORY_INITIAL_CHUNK + 1]), + ID + ) + .is_err()); + assert!(upload.is_none()); + assert!(stage( + &mut upload, + 2, + begin(expected), + Some(vec![0; MAX_MEMORY_INITIAL_CHUNK]), + ID + ) + .is_ok()); + let mut commit = command("commit"); + commit["offset"] = json!(MAX_MEMORY_INITIAL_CHUNK); + assert!(stage( + &mut upload, + 3, + commit.clone(), + Some(vec![1; MAX_MEMORY_CHUNK + 1]), + ID + ) + .is_err()); + let Ok(Staged::Call(calls)) = + stage(&mut upload, 4, commit, Some(vec![1; MAX_MEMORY_CHUNK]), ID) + else { + panic!("Expected one complete native batch") + }; + assert_eq!(calls.len(), 1); + let Value::Record(fields) = &calls[0] else { + panic!("Expected native fields") + }; + let Value::Bytes(bytes) = &fields["data"] else { + panic!("Expected packed bytes") + }; + assert_eq!(bytes.len(), expected); + assert_eq!(bytes[MAX_MEMORY_INITIAL_CHUNK - 1], 0); + assert_eq!(bytes[MAX_MEMORY_INITIAL_CHUNK], 1); + } + #[test] + fn upload_bounds_and_identity_are_checked_before_staging() { + let mut upload = None; + for bytes in [0, 3, MAX_UPLOAD_BYTES + 4] { + assert!(stage(&mut upload, 1, begin(bytes), None, ID).is_err()); + assert!(upload.is_none()); + } + let mut invalid = begin(8); + invalid["memoryIds"] = json!(["memory", "memory"]); + assert!(stage(&mut upload, 1, invalid, None, ID).is_err()); + assert!(stage(&mut upload, 1, begin(8), None, "stale").is_err()); + assert!(stage(&mut upload, 1, begin(8), Some(vec![0; 9]), ID).is_err()); + assert!(stage(&mut upload, 1, begin(8), None, ID).is_ok()); + let mut wrong = command("abort"); + wrong["upload"] = json!("00000000-0000-4000-8000-000000000002"); + assert!(stage(&mut upload, 2, wrong, None, ID).is_ok()); + assert!(upload.is_some()); + assert!(stage(&mut upload, 3, command("abort"), None, ID).is_ok()); + assert!(upload.is_none()); + let mut final_chunk = command("commit"); + final_chunk["offset"] = json!(4); + assert!(stage(&mut upload, 4, begin(8), Some(vec![0; 4]), ID).is_ok()); + assert!(matches!( + stage(&mut upload, 5, final_chunk, Some(vec![1; 4]), ID), + Ok(Staged::Call(_)) + )); + } + #[test] + fn maximum_upload_uses_bounded_native_parts() { + let mut upload = None; + assert!(stage(&mut upload, 1, begin(MAX_UPLOAD_BYTES), None, ID).is_ok()); + for offset in (0..MAX_UPLOAD_BYTES).step_by(MAX_MEMORY_CHUNK) { + let mut chunk = command("chunk"); + chunk["offset"] = json!(offset); + let length = MAX_MEMORY_CHUNK.min(MAX_UPLOAD_BYTES - offset); + assert!(stage(&mut upload, 2, chunk, Some(vec![0; length]), ID).is_ok()); + } + let Ok(Staged::Call(calls)) = stage(&mut upload, 3, command("commit"), None, ID) else { + panic!("Expected native parts") + }; + assert_eq!(calls.len(), 2); + for (index, call) in calls.iter().enumerate() { + let Value::Record(fields) = call else { + panic!("Expected native fields") + }; + assert_eq!( + fields["offset"], + Value::from(json!(index * MAX_NATIVE_PART)) + ); + assert!( + matches!(&fields["data"], Value::Bytes(bytes) if bytes.len() == MAX_NATIVE_PART) + ); + } + } +} diff --git a/crates/deepchat-harness/src/transport.rs b/crates/deepchat-harness/src/transport.rs new file mode 100644 index 0000000000..94456d50b8 --- /dev/null +++ b/crates/deepchat-harness/src/transport.rs @@ -0,0 +1,103 @@ +use super::{Json, Result, MAX_FRAME, MAX_MEMORY_FRAME, MEMORY_FRAME_FLAG}; +use std::sync::Arc; +use tokio::{ + io::AsyncWriteExt, + sync::{mpsc, OwnedSemaphorePermit, Semaphore}, +}; + +const BUFFER_BYTES: usize = 1024 * 1024; +const CONTROL_BYTES: usize = MAX_FRAME + 4; + +struct Frame { + bytes: Vec, + vector: bool, + _permit: OwnedSemaphorePermit, +} + +#[derive(Clone)] +pub struct Output { + control: mpsc::Sender, + data: mpsc::Sender, + control_bytes: Arc, + data_bytes: Arc, +} + +pub struct Responses { + control: mpsc::Receiver, + data: mpsc::Receiver, +} + +impl Output { + pub fn channel() -> (Self, Responses) { + let (control, control_rx) = mpsc::channel(64); + let (data, data_rx) = mpsc::channel(32); + ( + Self { + control, + data, + control_bytes: Arc::new(Semaphore::new(CONTROL_BYTES)), + data_bytes: Arc::new(Semaphore::new(BUFFER_BYTES - CONTROL_BYTES)), + }, + Responses { + control: control_rx, + data: data_rx, + }, + ) + } + + pub async fn send(&self, value: Json) -> Result<()> { + self.send_frame(value, true).await + } + + pub async fn send_frame(&self, value: Json, control: bool) -> Result<()> { + let max = if control { MAX_FRAME } else { MAX_MEMORY_FRAME }; + let (sender, quota) = if control { + (&self.control, &self.control_bytes) + } else { + (&self.data, &self.data_bytes) + }; + let mut permit = quota.clone().acquire_many_owned((max + 4) as u32).await?; + let vector = value["type"] == "memoryReply"; + let mut bytes = serde_json::to_vec(&value)?; + if vector && bytes.len() > max { + bytes = serde_json::to_vec(&serde_json::json!({ + "type": "memoryReply", "id": value["id"], + "error": { "name": "MemoryVectorResponseLimitError", "message": "Memory vector response exceeds the frame limit" } + }))?; + } + if bytes.is_empty() || bytes.len() > max { + return Err("Harness response exceeds frame limit".into()); + } + let retained = permit + .split(bytes.len() + 4) + .ok_or("Invalid output byte quota")?; + drop(permit); + sender + .send(Frame { + bytes, + vector, + _permit: retained, + }) + .await + .map_err(|_| "Harness output closed".into()) + } +} + +pub async fn write_responses(mut responses: Responses) -> Result<()> { + let mut output = tokio::io::stdout(); + loop { + let frame = tokio::select! { + biased; + frame = responses.control.recv() => frame, + frame = responses.data.recv() => frame, + }; + let Some(frame) = frame else { + return Ok(()); + }; + output + .write_u32(frame.bytes.len() as u32 | if frame.vector { MEMORY_FRAME_FLAG } else { 0 }) + .await?; + output.write_all(&frame.bytes).await?; + output.flush().await?; + } +} diff --git a/docs/architecture/deepchat-agent-harness-boundaries/spec.md b/docs/architecture/deepchat-agent-harness-boundaries/spec.md index 6f9a9b1bae..6a903ed503 100644 --- a/docs/architecture/deepchat-agent-harness-boundaries/spec.md +++ b/docs/architecture/deepchat-agent-harness-boundaries/spec.md @@ -756,3 +756,15 @@ execution continues to settle independently and commit results in provider call prompt the producer supplied. 9. Focused suites, the full main-process suite, type checks, formatting, i18n validation, lint, and the agent cleanup guard pass, and executed test count does not drop. + +## Invocation admission runtime + +Process-wide delegated-Agent invocation admission is owned by the Rutis TS plugin in +`src/harness/plugins/admission.ts`. Main composition creates one `RutisAgentInvocationAdmission` +client and retains caller-owned lease state through the existing admission port. The local main +queue constructor is removed. The Rust host owns the runtime generation and its bounded private +transport; disconnect closes admission without a local fallback or automatic replacement owner. + +This boundary is distinct from the Harness pending-input pump and its four fences, which retain +their existing owners. The [Rutis runtime RFC](../rutis-multiprocess-backend/spec.md) specifies call +ordering, cancellation/late-grant cleanup, diagnostics and shutdown for this module migration. diff --git a/docs/architecture/main-process-structured-logging/spec.md b/docs/architecture/main-process-structured-logging/spec.md index 1520b982f8..38c8119788 100644 --- a/docs/architecture/main-process-structured-logging/spec.md +++ b/docs/architecture/main-process-structured-logging/spec.md @@ -212,8 +212,9 @@ and diagnostic clock failures cannot change the durable Run lifecycle. ## Admission Diagnostics -`AgentInvocationAdmission` records both low-volume lifecycle events and bounded in-memory -distributions: +The Rutis admission TS plugin's `AgentInvocationAdmission` records both low-volume lifecycle events +and bounded in-memory distributions. The main process consumes these through the typed Rutis client; +it does not own another admission queue: - `agent.admission.queued`; - `agent.admission.granted` with measured `waitMs`, acquisition sequence, active/pending counts; @@ -239,6 +240,12 @@ metrics may continue bounded in-memory accounting but skip observation queue ins `setImmediate` scheduling. Re-enabling an output affects subsequent observations only; disabled-time payloads are never replayed. +The runtime forwards observations with a generation-local sequence; main restores that order before +calling the existing logger. Forwarding is bounded and reports dropped observations in the terminal +summary. Each admission operation carries the current output-enabled snapshot, and main applies its +output gate again at delivery. Teardown flushes the observation stream before stopping the Rust host. +The monotonic intervals measure the queue and permit owner, excluding transport round-trip time. + Recent wait and hold distributions retain at most 256 samples. They are process-local diagnostics, reset on restart, and are not recovery or accounting facts. The admission implementation owns its collector instead of coupling to the Memory diagnostics lifecycle. diff --git a/docs/architecture/rutis-multiprocess-backend/plan.md b/docs/architecture/rutis-multiprocess-backend/plan.md new file mode 100644 index 0000000000..0cebc29e00 --- /dev/null +++ b/docs/architecture/rutis-multiprocess-backend/plan.md @@ -0,0 +1,2764 @@ +# DeepChat Harness and Capability Migration Plan + +## Objective and completion rule + +Extract a reusable Harness, Memory and peripheral capabilities through Rutis, then move selected +owners/computations to Rust where correctness, deployment or measured resource savings justify it. +Work on `dimagent/rutis-harness-bootstrap`, one complete module at a time. Replace actual app wiring, +run matching end-to-end baseline and migrated workloads, and remove the old path after parity. +There is no retained implementation switch or local fallback. + +Current scope: staged implementation in +[Draft PR #2465](https://github.com/ThinkInAIXYZ/deepchat/pull/2465), targeting `dev`. Admission is +committed as `ffcd98770` and the roadmap as `f35adff34`. G3 is complete at `7ee99619b`; G4 is active. +Later goals start only after their dependencies and the preceding selected goal pass validation. + +Use this file as the only tracker. [The RFC](spec.md) defines capability ownership, Memory +dependencies, Rust hypotheses, process placement and Everywhere contracts. Keep status and evidence +here as slices land; do not create a second task ledger. No GitHub issue sync is requested; +review status is maintained in the linked Draft PR. + +For each goal, finish the selected implementation and real default wiring, run the relevant tests +and baseline/migrated application comparison, review ownership/failure/resource behavior, and +remove replaced wiring. Run format, i18n, lint and typechecks before committing. Push each validated +goal separately to this same Draft PR, then update its status before starting the next goal. +Failed checks must be resolved or recorded as a concrete external blocker; they cannot be silently +skipped to advance. Keep the PR in draft and do not merge it as part of this execution. + +Correctness, persistence, ownership, bounded resources and lifecycle behavior remain blocking. +Shared-CI wall-clock overruns are reports, not failed checks. Each slice needs relevant tests and +matching application E2E; a complete performance capture is conditional on material process, IPC, +batching or storage-path changes, or an explicit performance objective. Ordinary async port +extraction does not automatically need another process-tree benchmark. Select affected workloads +and a bounded measurement/confirmation budget first. Treat noise-level differences as inconclusive, +keep all samples, and block adoption only on a reproducible material regression rather than an +isolated timing overrun. A structural change starts with one representative affected resource +workload; only an explicit performance adoption decision requires five paired samples. Allow at +most one predeclared confirmation batch for a suspected regression. If it remains inconclusive, +record the uncertainty and stop measuring; CI timing noise does not block a structural extraction. +Further measurement requires changed code, a changed workload or concrete new evidence. Do not +rerun CI or unchanged benchmarks to obtain a passing timing sample. + +## Live goals and dependencies + +| Goal | State | Dependencies | Completion condition | +| --- | --- | --- | --- | +| G0 Admission | Complete, `ffcd98770` | Existing branch baseline | Default Rutis wiring, matching real-app E2E and old path removed | +| G1 Whole-capability roadmap | Complete; documentation only | G0 and source research | Capability map, Memory boundary, Rust ranking, ordered goals and honest evidence | +| G2 Baselines and first service contract | Complete, `84e3e0ead` | G1 | Reproducible resource baselines and frozen operation/ownership budgets | +| G3 Memory vector resources | Complete, `7ee99619b` | G2 | Actual vector operations through Rutis, preserved native lifecycle and old factory wiring removed | +| G4 Store commands and desktop ports | Local implementation, ownership inventory and batch validation complete; publication CI pending | G2 | Explicit durable operations, writer inventory and asynchronous host capabilities | +| G5 Cohesive TS Harness backend | Planned | G4 | Run/loop/Session/Tape/Provider composition operates under one backend authority | +| G6 Full Memory capability | Planned | G3, G4, G5 | Recall, ingestion, management and maintenance use the one Memory service | +| G7 Rust control owner | Planned | G2, G5 | Admission and cohesive run/interaction settlement preserve all fences | +| G8 Rust batch computations | Conditional | G2, G4, G5; G6 for Memory work | Measured CPU/allocation improvement with output and quality parity, or a recorded no-go | +| G9 Peripheral capabilities | Conditional per selected module | G4, G5 | Independent useful lifetime, real consumer cutover and no duplicate supervisor | +| G10 Rust durable Store | Conditional compatibility project | G4, G5, G6, G7 | One compatible encrypted writer and proven migration/recovery/maintenance behavior | +| G11 Headless Session Host | Planned | G4, G5 and host-port audit | Real CLI execution without Electron and without a connected desktop | +| G12 Multiple clients and devices | Planned | G11 and explicit grants | Reconnect-safe clients and separately authorized, revocable device operations | + +G3 is selected for its bounded file/resource ownership, not an assumed native query speedup. +G2 may reject its process placement if transport or aggregate memory costs are unacceptable. +G4 and G5 remove the shared-storage and synchronous-call blockers for the full Memory service. +G7 and G8 are different objectives: a coherent Rust control owner can have architectural value +without a speed claim; CPU-oriented rewrites require measured gains. G11 does not wait for G8/G10. + +## G0. Admission migration: complete + +### Establish the baseline and contract + +- [x] Inspect all admission callers, leases, diagnostics, startup/shutdown, packaging and E2E fixtures. +- [x] Run existing admission and delegation tests on the original app wiring: 82 tests passed. +- [x] Build and run the original application with isolated profiles and a local model fixture. + Preserve baseline build artifacts outside the source tree for the same migration E2E workload. +- [x] Define ordering, cancellation/late-grant cleanup, per-owner limits, correlation, disconnect, + bounded framing, observation and shutdown requirements in the RFC. + +### Replace the module and its application wiring + +- [x] Move the existing admission queue owner into the TS runtime; preserve its behavior and tests. + Keep shared contracts and caller lease state explicit; remove the main-process queue owner. +- [x] Provide the complete admission operations through Rutis, including owner limits, correlation, + cancellation, release reasons, close and diagnostic flushing. +- [x] Replace the one-shot Rust probe with the application host and a declared admission gateway. + Preserve request order, bound transport resources and close pending work on generation loss. +- [x] Connect the main composition and actual LiveDelegationService to the Rutis client by default. + Stop new admission after runtime failure; keep one shutdown owner. +- [x] Integrate normal builds and packaged artifacts, including the unmodified runtime closure and + correct native host target. Remove the separate developer-only module path. + +### Compare actual execution and remove old wiring + +- [x] Run the same real-app E2E delegation workload against baseline and migrated builds: child + execution, admission queueing, cancellation/interrupt, completion, diagnostics and shutdown. +- [x] Verify process loss rejects pending work and cannot silently create another admission owner. +- [x] Add only durable lifecycle/contract regression coverage after implementation; reuse the + existing owner and delegation suites, avoiding mock implementations of Rutis. +- [x] Remove old composition wiring, obsolete probe code, unused dependencies and temporary + comparison artifacts from the deliverable. Retain no fallback or implementation toggle. + +### Whole-change review and validation + +- [x] Review ownership, public compatibility, queue fairness, lease races, diagnostics gates, + transport validation, resource limits, failure behavior, deployment and shutdown. +- [x] Update directly affected maintained architecture and logging contracts. +- [x] Run format, i18n, lint, typecheck, relevant Vitest suites, Cargo checks and the actual E2E + comparison. Record measured results and unexecuted targets without claiming performance gains. + +## G1. Source-backed roadmap: complete + +- [x] Commit the existing admission migration before broader planning: `ffcd98770`. +- [x] Inspect the actual Harness composition, synchronous ownership/fences, Memory facade and + vector resources, shared database, scheduler writes and existing helper processes. +- [x] Define coherent capabilities separately from process placement and implementation language. + Keep internal helpers internal and preserve desktop/external-plugin trust boundaries. +- [x] Specify Memory as one capability, its vector-resource first slice, shared-storage and + execution-token dependencies, ingestion consistency, maintenance and prompt-trust rules. +- [x] Rank Rust candidates by structural value or measured CPU/allocation/idle-runtime savings. + Account for existing native engines, bounded recall and existing resource eviction. +- [x] Define dependencies, acceptance and stop conditions for Harness, peripheral and Everywhere + goals. Reuse existing perf/quality diagnostics and make no unmeasured gain claims. +- [x] Review doc consistency, local references and scope; run repository format, i18n, lint and + typecheck. This goal changes only this RFC and plan; no new application code or tests. + +## G2. Establish baselines and freeze one extraction contract + +- [x] Preserve immutable pre-admission and `ffcd98770` artifacts, runtime versions and isolated + fixtures. Reproduce baseline workloads before using an old build as performance evidence. +- [x] Profile idle/startup, streaming and delegation, large context/Tape, native Memory recall and + background maintenance. Use at least five paired runs and fixed local Provider fixtures. +- [x] Measure CPU, native operation time and process-tree memory; distinguish Provider fixture + waits from local work and freeze the transport/resource envelope from actual callers. + Record allocation/GC and data-copy risks from source. Collect allocation-stack traces and + vector IPC byte counters with G3/G8 before attributing a measured performance gain. +- [x] Freeze numeric target and allowed regressions before judging the selected implementation; + record hardware, variability, workload sizes and whole-app measurement method here. +- [x] Freeze the selected service's versioned schemas, bounded batches/results, caller identity, + generation/operation IDs, cancellation, unknown outcomes, readiness and shutdown contract. + Keep the admission gateway allowlist unchanged until a deliberate service protocol exists. + +Completion: one concrete module and its placement have a measurable purpose and an executable +end-to-end comparison. Missing measurements do not justify a claimed Rust speedup or extra process. + +### G2 measurement evidence + +Environment: macOS 27.0.1, Apple M5, 10 CPU cores, 24 GiB RAM, Node 24.22.1, pnpm 10.34.5, +Electron 43.8.3, DuckDB Node API 1.5.5-r.4 and Rust 1.95.0. Use fixed exports of `3e9948b72` +(pre-admission) and `f35adff34` (admission code `ffcd98770` plus documentation), linked to the same +installed native dependencies. Build both with `pnpm exec electron-vite build`; include the locked +host/runtime closure in the admission artifact. Both are unpackaged builds with the Playwright +inspector, not signed-release or user-profile footprint measurements. The complete `out` tree hashes were unchanged +before and after all application comparisons: + +- Baseline: 1,054 files, SHA-256 `16c1efc66372897e4d3cb0814dc86c15073b0234f8cd0dfe6ea160e156119ee8`. +- Admission: 1,159 files, SHA-256 `acd0bdc1e65d37ded30f56b49cf14dbcc189cbe7f326b03657b007f8ec58f156`. + +Run the same current E2E harness against both immutable builds with +`DEEPCHAT_E2E_MEASURE_RESOURCES=1`, selecting `01-launch`, `36-chat-streaming` and +`44-admission-delegation` through `test/e2e/playwright.config.ts`. Alternate baseline/admission order +over five pairs. Every launch uses the fixture's disposable profile, except intentional relaunches +within the existing recovery cases. These are fresh-profile tests with a warm OS file cache, not +disk-cache-cold startup. All ten runs pass the same five checks: 50 E2E passes. + +The opt-in resource helper attaches numeric JSON reports without changing production code. It +samples all descendants every 500 ms using the public macOS `proc_pid_rusage` v0 layout, recording +resident size, physical footprint, process identity and cumulative CPU. Convert CPU Mach ticks with +`mach_timebase_info`; calibration matches a 0.2-second CPU-clock workload. Readiness is visibility +of the app root and sidebar. Event-loop histograms begin after inspector attachment. Short-lived +children and between-sample allocation peaks may be missed; sampled CPU excludes shutdown after +the last sample. Physical-footprint sums and RSS sums are separate process-tree measures, not a +claim about unique system-wide physical pages. The observer is identical for both builds. + +Event-loop delay does not attribute GC or allocations. G2 does not claim allocation-stack, GC-pause +or current wire-byte measurements. Vector IPC does not exist in this baseline; G3 instruments its +actual byte counts, and performance-driven Rust work needs stage-specific CPU/allocation profiles +before selection. This keeps the first isolation contract separate from an unproven optimization. + +The following are medians of five runs. Footprint/RSS are sampled per-run peaks; event-loop values +are medians of each run's p99. Provider work uses the existing local fixtures. + +| Case | Build | UI ready, ms | Footprint, MiB | RSS, MiB | Sampled CPU, s | Main loop p99, ms | +| --- | --- | ---: | ---: | ---: | ---: | ---: | +| Startup | Baseline | 1988.70 | 1012.96 | 1475.91 | 4.76 | 44.96 | +| Startup | Admission | 2058.19 | 1036.56 | 1545.00 | 4.68 | 68.81 | +| Streaming | Baseline | 1999.99 | 1372.99 | 1677.64 | 7.74 | 47.78 | +| Streaming | Admission | 2067.01 | 1395.93 | 1759.14 | 7.78 | 54.10 | +| Delegation | Baseline | 1995.45 | 1067.48 | 1482.30 | 6.76 | 45.15 | +| Delegation | Admission | 2069.24 | 1093.26 | 1565.52 | 6.77 | 50.86 | + +Current startup has a 1975-2336 ms range and 82.72 ms median absolute deviation (MAD). Streaming +readiness MAD is 80.01 ms; delegation readiness MAD is 66.13 ms. Current footprint MADs are 12.87, +0.73 and 58.09 MiB respectively; delegation loop-p99 MAD is 2.16 ms. The Rust host and admission TS +runtime have median individual sampled footprints of 2.70 and 28.75 MiB at startup. Admission adds +about 23-26 MiB to the measured application footprint and 67-74 ms to readiness in these cases. +This is a structural migration with a measured cost, not an observed performance improvement. + +Native SQLite/Memory performance checks pass at 1k/10k/50k rows, with Tape cases through 100k +entries. A temporary native-vector scale fixture calls the production `MemoryVectorStore` with +real DuckDB, deterministic 384-dimensional vectors, 50-row upserts and 11 warm query samples. +For row `r` and component `c`, use `((r * 31 + c * 17) % 65521) / 65521`; query row 17 with top 20 +and report the first query separately. Run the existing perf config with native SQLite required +and `--disableConsoleIntercept` to preserve its numeric reports. +Together, 7 performance files/11 checks pass with native SQLite required and no skipped check. +The temporary scale fixture stays outside the deliverable; existing performance suites and the +production adapter supply the repeatable operations. + +| Native operation | Scale | Median, ms | p95, ms | +| --- | ---: | ---: | ---: | +| FTS recall | 1k rows | 0.56 | 0.65 | +| FTS recall | 10k rows | 0.87 | 1.00 | +| FTS recall | 50k rows | 2.89 | 3.20 | +| Vector query, 384 dimensions, top 20 | 1k rows | 0.83 | 0.94 | +| Vector query, 384 dimensions, top 20 | 10k rows | 3.92 | 4.17 | +| Vector query, 384 dimensions, top 20 | 50k rows | 29.01 | 29.14 | +| Tape bounded range | 100k entries | 0.04 | 0.05 | +| Tape full view | 100k entries | 108.22 | 131.52 | + +These are fixture/native-adapter timings, not end-to-end application recall or a JS/Rust comparison. +The Tape result justifies checking range use and materialization before rewriting a fold; it does +not prove the normal turn takes the full-view path. Native DuckDB time is not a JS bottleneck. +Whole-app Memory-active, greater-than-eight-Agent and upload-saturation comparisons belong to G3's +actual module cutover, before deleting its old wiring. No raw history/vector IPC exists in G0; +G3's protocol byte, queue and native-concurrency caps are frozen in the RFC. + +### G3 adoption budgets + +These are policy targets, frozen before G3 implementation. Repeat at least five paired runs with +the same build/runtime, profiles, local fixtures and observer. Use the admission build as the next +module's baseline and preserve G2's pre-admission comparison for aggregate architecture cost. + +Shared PR runners report timing overruns with `DEEPCHAT_MEMORY_PERF_REPORT_ONLY=1`; correctness, +runtime/ABI identity, finite measurements, workload/queue bounds and test timeouts remain blocking. +There is no `continue-on-error` around the suite. The command enforces timing budgets by default. +The completed G3 comparison uses strict operation measurements and paired application runs on +this fixed machine. Its numeric budgets below remain the recorded G3 acceptance policy, not a +mandatory benchmark matrix for every later slice. Select later measurements by the execution rule +above. A documentation or test-only commit with verified identical runtime artifacts does not +require another complete resource capture. Do not repeat shared-runner benchmarks merely to +obtain a green timing sample. + +| Gate | Required result | +| --- | --- | +| Unused Memory | No additional process; UI-ready medians add at most `max(100 ms, 2 x baseline MAD)` per case; sampled footprint medians add at most `max(32 MiB, 2 x baseline MAD)` | +| Memory-active resource cost | After drain, at most 64 MiB extra process-tree footprint; sampled active peaks at most 128 MiB extra for matching vectors/rows; one staged upload of at most 16 MiB; store leases and queues converge | +| Warm native query | p95 overhead at most `max(5 ms, 20% of native baseline p95)`, including every transport/copy; establish the matching real-app baseline before replacing the module | +| Upsert | Mean overhead at most `max(5 ms, 25% of baseline mean batch time)` per logical 50-row batch at the characterized sizes; preserve one atomic native transaction | +| First vector use | Runtime plus native open has median at most 500 ms and p95 at most 1 second; preserve the existing retrieval fallback/deadlines rather than extending them | +| Loaded control loop | Delegation loop-p99 median adds at most `max(10 ms, 2 x baseline MAD)`; bulk transfer cannot starve acquire/release/cancel | +| Correctness and isolation | Same recall selection/quality and durable data; atomic interrupted uploads, known-ID late-open cleanup, stale-generation rejection, FTS degradation and no replacement admission owner | + +Do not accept a rewrite for noise-level gains. Later performance-driven Rust work requires at least +20% lower total CPU for the selected local workload or 15% lower settled aggregate footprint, +including serialization and all participating processes. End-to-end gains must exceed measured +variance, with no readiness/response regression above 5% beyond that variance. A structural owner +migration can instead satisfy its declared lifecycle objective within its frozen resource budget. + +- [x] Repair the two complete-suite CI contracts for the required Harness build and Cargo steps; + both contract files pass locally (9 checks). Full main validation passes: 677 files passed, + 2 skipped; 9,827 tests passed and 4 skipped. +- [x] Typecheck the E2E fixture and measurement helper directly in addition to app typechecks. +- [x] Complete final format/i18n/lint/typechecks, all 29 local references and scope review. + The uninstrumented five-case application E2E also passes; no production module changed in G2. +- [x] Push G2 as `84e3e0ead` to Draft PR #2465. Required CI run `40193664779` passes on exact head + `84e3e0ead952d9ea769246c4ca2851a2338c7eca`: static, main, renderer, native Memory, build and + the required-check barrier all succeed before G3 starts. +- [x] Exact-head package check run `40193664778` passes all six macOS/Windows/Linux x64/arm64 + verification packages and the package-required barrier. This evidence covers G2 artifacts. + +## G3. Extract Memory vector resources through Rutis + +First characterize real native Memory search/management on the preserved application build. +This migration requires a matching executable baseline before replacing the factory, so the +shared application E2E fixture is written before implementation as contract characterization. + +Current evidence: + +The Float32 transport passes local operation budgets. Shared Linux runner timings vary enough +to pass and fail the same implementation; they are reported separately from fixed-device adoption. +G3 is accepted at checkpoint `7ee99619b`. The selected implementation sends bounded raw +upload bytes from Main to Rust. Rust stages one bounded upload and acknowledges each received +chunk; commit dispatches a native atomic upsert through Rutis `Value::Bytes`. Internal native parts +are bounded to eight MiB so encoded messages fit Rutis's 16-MiB limit; all parts belong to one batch +and only the complete batch reaches the existing transaction. This preserves +64-KiB first chunks, 240-KiB continuation chunks, one outstanding chunk acknowledgement, the 16-MiB/50-record logical +limit, atomic writes and control priority. The native owner keeps resource and file authority; +application transfer state belongs to the Rust gateway. Raw forwarding alone shows little local +latency improvement and does not justify retaining a second per-chunk native acknowledgement. +Pinned provider SDK patches validate a finite numeric array and clone it once, preserving response +validation and raw-response isolation without allocating a Zod parsing payload per component. +All 27 real SDK response contract checks pass across OpenAI, compatible, Azure, Google single/batch, +and Vertex Node/edge endpoints. Exact-head required CI, all six package checks and complete +matching resource comparisons pass before the next goal. + +- Actual recall, indexing, deletion, reset and maintenance use one lazy native TS vector runtime + under the existing Rust host. Admission retains its separate runtime and identity. Main keeps + the typed facade, Memory policy and canonical database; Knowledge still uses DuckDB in Main. + The replaced native factory and recovery wiring are removed. +- The vector worker holds the private kernel-owned database lock before recovery or file mutation. + Persistent Agent leases fence uncertain writes, late opens and disposal. Main can synchronously + append quarantine intent, including after worker loss, but only the locked native owner consumes + it. Native quarantine terminates the vector process before uncertain cleanup or GC; admission + survives, vector retrieval degrades to FTS, and restart requires explicit rebuilding. +- Typed native column buffers preserve atomic writes and Float32 values while avoiding per-component + native scalar allocation. Only the vector worker uses eight-MiB V8 semi-spaces. The admission heap + policy remains unchanged; there is no forced GC or retained implementation switch. + +### Matching application resource comparison + +The immutable baseline uses G2 admission source with the same current Provider/ACP catalogs and +shared E2E fixtures. The selected application implementation is `6a2544ddb`; later validation-only +changes preserve its complete output hash. Each disposable-profile vector scenario indexes +1k/10k/50k canonical memories with dense 1536-dimensional Float32 embeddings, checks vector-only +recall, deletion and native row counts, then relaunches and clears every memory plane. + +Six pairs at 1k exclude the first pair as warmup; five pairs at 10k and 50k alternate variant order. +All 32 vector application runs pass. The first launch observes unused Memory. The active launch +includes an unchanged 30-second post-work idle; settled footprint is the median in its final ten +seconds, then the median across five runs. This window does not establish a stationary heap. +Use the G2 macOS/M5 observer and hardware; builds are unpackaged with the Playwright inspector. +Sampled CPU excludes shutdown and processes that live entirely between samples. + +| Rows | Settled baseline / migrated (MiB) | Delta (MiB) | Sampled active peak baseline / migrated (MiB) | Sampled CPU baseline / migrated (s) | +| --- | --- | --- | --- | --- | +| 1,000 | 943.18 / 961.20 | +18.02 | 1110.96 / 1122.17 | 7.27 / 6.50 | +| 10,000 | 700.82 / 722.83 | +22.00 | 1226.11 / 1272.08 | 21.31 / 11.18 | +| 50,000 | 1036.09 / 1023.17 | -12.92 | 1883.62 / 1538.78 | 121.12 / 71.79 | + +Every scale passes the unchanged 64-MiB settled and 128-MiB sampled-peak allowances. Reopen/clear +phases also pass their resource checks. All unused launches have the same process-name counts; +no vector worker starts before vector use. Across vector cases, the largest positive readiness +median delta is 17.72 ms and the largest footprint delta is 3.38 MiB, within their frozen limits. +These figures include SDK/native-buffer changes and do not establish a Rust query speedup. + +The original five loaded-control pairs all pass queue/cancel/release and Memory completion, but +unused-startup readiness fails the original independent-median rule: 2271.99/3376.21 ms gives +1104.22-ms extra against a 326.42-ms allowance. Both variants slow during that group; the median +of adjacent paired differences is 59.42 ms. This result is retained, not relabeled as a pass. + +One independent five-pair control confirmation was declared before collecting more samples. It +requires both the new group and all ten pooled control pairs to meet the original rules, with +all original samples retained. Both pass. Confirmation unused readiness is 2183.80/2105.51 ms; +pooled readiness is 2227.89/2178.13 ms. Pooled Main loop-p99 medians are 99.16/42.39 ms, satisfying +the unchanged loaded-control allowance. Pooled active peak/window footprint deltas are ++25.86/+27.01 MiB. All 20 loaded-control application runs pass. The nine vector phase comparisons +and two pooled control comparisons meet their gates; the independent control group also passes. +Do not use the original 42-run test pass count alone as resource acceptance evidence. + +Frozen inventory and evidence: + +- Baseline: 1,159 output files, SHA-256 + `ce5ddbad74d68dd7745bda91dcf35dc871930e6eebfb094dc5de6d1d6d00c7f4`. +- Migrated: 1,531 output files, SHA-256 + `2970d4a9178ffb4c9ece8959487695d797e68c573510028d7af5851e58faa74a`. +- `.deepchat/rutis-g3-acceptance/artifacts.json` records outputs, external SDK consumers, + shared catalogs/scenarios, patches and lockfiles. Both variants freeze 344 files across the + six SDK consumers, using original baseline and selected patched schemas respectively. +- Sort output path-component tuples, then hash the path including `out/`, a NUL and each raw file + SHA-256; the manifest preserves that exact order. Verify every file and external SDK/caller dependency before and after application runs. + Complete output, SDK, catalog, scenario and metadata hashes match after capture. +- `paired/state.json` and `paired-summary.json` retain the original 42-run data and its failed + readiness comparison. `control-confirmation-design.json` fixes the one confirmation and pooled + acceptance rule; `control-confirmation-summary.json` records both passes. Excluded sleep, + startup and incomplete-indexing attempts remain separate from completed resource samples. +- `resource-acceptance.json` combines the nine vector and two pooled control comparisons with + the independent confirmation, all 52 successful application runs and evidence hashes. + +### Native transport, lifecycle and distribution validation + +Checkpoint `7ee99619b9b21b27339322b36d0cfcce57ea4abe` passes required run `40262089127`: +static, Main, renderer, build, native Memory and the required barrier all succeed. Native job +`121376436278` passes 985 behavior, 306 Tape, 12 OCR, 362 native Memory, seven retrieval-quality +and 13 performance checks; two platform-specific native cases are skipped on Linux. +Its explicit report mode records the 1k write overhead of 5.421 ms against the unchanged 5-ms +allowance as a warning. Finite measurements, operation correctness and bounded work remain hard +checks. Five independent strict local runs below establish the fixed-device operation budgets. + +Package run `40262089169` passes all six macOS/Windows/Linux x64/arm64 verification jobs and +the package-required barrier at the same checkpoint. Every target executes the production +Memory runtime smoke against its packaged host and Electron executable. The application +implementation remains `6a2544ddb`; the selected checkpoint adds validation policy and evidence +without changing the measured runtime output. + +Shared-runner variation remains visible: the same implementation's earlier required run +`40245677754` fails the 1k write gate at 7.948/14.684 ms (6.737-ms extra against the unchanged +5-ms budget), while 10k/50k writes and all query/first-use gates pass. +Numeric budgets, the first 20 write samples and cold-worker +behavior are unchanged. Required run `40254813435` at `89a5a4ff6` again passes all deterministic +checks but fails only the 1k timing threshold (7.958/14.899 ms; 6.941-ms extra). Shared-runner +timing limits now use explicit reporting; the full suite still fails on invalid measurements, +wrong runtime/ABI, failed operations, unbounded work or timeout. Strict repeated fixed-device +measurements below satisfy the unchanged adoption budgets. Run `40248084214` at `07e3f688a` +passes the original shared-runner timing assertions on the same implementation, with write +overheads of 3.338/2.201/1.626 ms at 1k/10k/50k. No production fix is attributed to this variation. + +Five local comparisons of a Float32 exponent-bit finite check show no improvement (median extra +latency 1.864/1.900 ms for current/prototype). A standard native base64 decoder reduces median +extra latency from 1.902 to 1.786 ms locally, insufficient evidence for another compatibility +branch. Neither prototype is selected. Cold-worker native phase timings and V8 sampling leave no +measured justification for further native scalar or decoder changes. Temporary first/last sample, +phase and CPU probes are removed; formal adoption samples, runtime/ABI equality and all 13 +performance checks remain. + +The selected implementation keeps first chunks at 64 KiB, continuation chunks at 240 KiB and stages one 16-MiB/50-record +upload in Rust. Only commit dispatches the native upsert. Native parts are at most eight MiB, +so base64 and bounded metadata fit Rutis's 16-MiB internal message limit. The native owner +validates the complete batch before one transaction and reserves per-resource order from the first +native part. Subsequent reads/mutations wait; abort/close settles an incomplete reservation without +performing a write. Failed partial dispatch aborts its known +native upload; abort cannot abandon a committing write. Contiguous native dispatch sequences are +independent of locally acknowledged application chunks. Existing generation, resource, lease, +quarantine and control-priority rules remain in force. The direct binding dependency is the exact +version already shipped with the Node API; no additional native payload or implementation switch +is introduced. + +Five Rust boundary/lifecycle checks pass and run in required CI alongside Clippy for all targets. +The transport correction passes 362 native checks, with two Windows-only skips on macOS; +123 focused Harness/store/package-contract checks pass, including two runtime byte contracts. +The codec checks cover malformed padding/unused bits, whitespace/non-base64 rejection, exact +independent backing buffers and byte equality through the eight-MiB native-part limit. +The native runtime scope +also passes a valid 45-record, +49,152-dimensional batch spanning internal parts, persistence after close, incomplete-upload and +non-finite rejection, maximum-16-MiB failure cleanup, abort/close cleanup, admission continuity +and strict child exit. Retrieval evaluation passes seven cases. Scoped test types, app types, +format, i18n and lint pass. The full Main/renderer suites and six native package jobs pass +on the selected checkpoint `7ee99619b`. + +Five independent strict operation runs pass all three characterized scales: 15 checks with +matching Electron Node 24.22.0 / ABI 148. The complete seven-file/13-check suite separately passes +in both default strict and explicit report-only modes. The numeric budgets are unchanged. + +| Rows | 50-row write overhead range (ms) | Maximum query p95 overhead (ms) | Maximum first-open median / p95 (ms) | +| --- | --- | --- | --- | +| 1,000 | 1.811-1.967 | 0.489 | 137.098 / 201.337 | +| 10,000 | 1.336-1.424 | 1.059 | 135.859 / 137.561 | +| 50,000 | 1.180-1.263 | 2.346 | 135.841 / 137.134 | + +Focused timing-policy, workflow, scope and entrypoint contracts pass 22 checks. Invalid timing +values still fail in both modes; only the explicit reporting value disables a wall-clock budget +assertion. No job/step uses `continue-on-error`. Format, lint, i18n and app/scoped test types pass. +Evidence logs use `.deepchat/rutis-g3-acceptance/{strict-transport-*,policy-*}.log`. + +Remote timings include encoding, gateway copies and native work. Thirty queries transfer +280,650-280,710 application gateway bytes including replies; pending calls drain to zero. +Five new workers per scale meet the 500-ms median and one-second p95 first-use limits. +Typical 300-KiB writes use only begin and commit; observed pending calls remain at one. +Persisted native checks cover packed batches with +unaligned source offsets, Float32 extremes/negative zero, ordinary/packed writer reuse, whole-batch +duplicate-key rollback and pre-effect rejection of malformed or non-finite input. Shared mutable +buffers are rejected at the native command boundary. + +Seven actual application checks pass: launch and plugin-host failure recovery, streaming chat, +delegation queue/cancel/release, Memory recall/deletion/restart/clear, nine-Agent cache convergence, +model/dimension changes, native-worker loss, FTS/chat continuity and explicit rebuilding. The +clear-after-loss case targets an evicted Agent so deleted vectors cannot reappear after restart. +Complete paired resource evidence above supersedes single diagnostic preflights. Both isolated +application trees pass the same actual Memory E2E. The selected runtime must retain its unchanged +artifact hash for this evidence to apply. +The 50k fixture reserves one minute of its unchanged 300-second test budget for recall, +30-second idle, shutdown and relaunch; smaller fixtures retain their 120-second completion wait. +Two incomplete baseline attempts ended at 120/180 seconds with 2,650/2,300 rows pending and are +excluded. Trace samples show continuous indexing progress through the latter wait. The 31 +completed runs retain their original source-manifest hashes: their successful execution did not +reach either timeout. Comparable protocol records preserve both scenarios/manifests and failed +attempts. Workloads, observer, production deadlines and all numeric adoption budgets are +unchanged; the final sample and all control runs complete under that recorded protocol. + +The six native package jobs execute `smoke:harness:memory` against the packaged Rust host and +Electron executable, using production clients for native CRUD, fractional values, restart/reset, +admission continuity and strict child shutdown. All six pass on the selected checkpoint +`7ee99619b` in run `40262089169`; copied layout checks alone cannot establish distribution parity. + +- [x] Retain DuckDB v2 in TS; move native handles and file-owner lifetime into one Rutis service. + Keep existing lease/embedding policy coherent; adapt synchronous health/quarantine and + object-returning factories through generation-bound resources and acknowledged operations. +- [x] Connect actual Memory recall, embedding writes, deletion, rebuild and maintenance callers. + Keep dense vectors near their resource owner and bound transfer without enlarging the + admission JSON protocol indiscriminately. Start one vector TS runtime lazily under the + existing Rust host; native poison must not force admission-runtime replacement. +- [x] Compare real app recall/FTS degradation, model/dimension changes, more-than-eight-Agent + resource convergence, clear/delete, native quarantine and shutdown against baseline. + Preserve migration/WAL and new-process recovery rules; vector runtime loss must preserve + admission and degrade only vector retrieval to the existing FTS behavior. +- [x] Review and validate the whole slice, including real native operations and relevant Memory + performance/quality checks. Remove old native factory/lifecycle wiring after parity. +- [x] Commit and push G3 checkpoint `7ee99619b`; exact-head required run `40262089127` and all + six platform package checks in `40262089169`, including packaged Memory smoke and both + required barriers, pass before G4. + +Completion: a real Memory resource module uses Rutis with one file owner and proven cleanup. +A standalone query demo or reduced main-process heap does not complete this goal. + +## G4. Define durable Store commands and desktop capability ports + +G4 starts from the accepted G3 application and its immutable candidate artifact. The first actual +cutover is the scheduler's independent shared-database connection. The full goal also includes +Session/Tape/Memory commands, configuration snapshots, maintenance and desktop capabilities; +removing the scheduler connection alone does not complete G4. + +### Audited ownership entrypoints + +| Connection or persistence owner | Current entrypoints | Required boundary | +| --- | --- | --- | +| Shared application database | `MainDatabase`; Session, Tape, Agent, Memory, Provider, MCP, settings, Project, delegation, scheduler and sync facades use its connection | Keep domain transactions together; move the normal writer and its business owners together in G5 | +| Scheduler utility process | Timer and heartbeat only; `CronJobsRepository.queueDueRuns` observes and advances due work in one transaction at the current Store owner | No database path/password/SQL crosses the helper port; preserve request correlation, generation fences and owner-side dispatch | +| Shared-file maintenance | `databaseSecurity.ts`, `mainDatabase.ts`, sync import/config import and backup helpers open active, source or staged files | Fence normal work, explicitly own each file and connection, preserve rekey/import/backup/reopen recovery; main loses these writable paths at G5 cutover | +| Import sources | Provider import, legacy chat import and browser profile import use source/snapshot connections; `DataImporter` currently opens both source and target with writable-capable configuration | Distinguish source ownership from the active target; keep target mutations inside the authoritative maintenance operation | +| Schema catalog | `schemaCatalog.ts` opens an in-memory database for schema inspection | Keep this temporary local connection internal to the Store owner | +| OCR artifacts | `ocrArtifactStore.ts` owns a separate encrypted derived-cache database | Preserve its explicit independent file owner; this is not a second writer of the shared application file | +| Vector stores | The G3 Memory worker and Knowledge's existing DuckDB owner use separate files | Preserve their existing resource authorities and maintenance fences | +| Configuration | Bootstrap constructs legacy app/MCP/ACP settings; runtime settings use database adapters; Provider model stores are required; attached ACP retains only an isolated legacy snapshot | Use acknowledged mutations and versioned read snapshots; hand off the complete legacy-file authority with the cohesive configuration owner at G5 | +| Credentials and desktop state | Main supplies async crypto/unlock; DatabaseSecurity, SecretStore, Sync, MCP and Codex/Grok own explicit private persistence; native configuration readers use a committed projection; the plugin owner uses its independent Conf file | Keep authorized crypto/native operations separate from persistence; preserve consent, one complete file writer and the final handoff inventory | + +### Ordered implementation slices + +1. Replace the scheduler worker's database access with bounded commands at the current Store + authority. Preserve the existing 100-job due-scan bound, schedule reconciliation, unique run + insertion, run claims, manual execution and idle/restart behavior. Timer requests cannot carry + a database path, password, SQL or callback. Committed run dispatch belongs to the owner, so a + lost timer reply cannot strand or replay a durable mutation. Keep at most one scan in flight + per worker generation and fence stale requests/replies before mutation or status publication. +2. Define the Session/Tape/Memory operation boundary around existing atomic business work: + transcript mutation and projection heads, pending-input settlement, Memory cursor/CAS and + maintenance. Keep synchronous repository helpers and transaction closures inside their owner; + do not convert every row method to RPC or split one atomic observation into separate reads. +3. Retarget configuration consumers through versioned snapshots and acknowledged mutations. + Inventory legacy/file adapters before choosing ownership; preserve machine-local bootstrap + settings and keep secrets outside general configuration snapshots. +4. Extract real crypto/unlock, OAuth, helper/native UI and power-event consumers behind narrow + async desktop ports. Preserve sender/principal checks, cancellation identity and maintenance + fencing. Complete the remaining writer/host audit before moving the cohesive core in G5. + +Characterize scheduler behavior on the accepted G3 build before its caller cutover. Reuse existing +scheduler tests and add only the matching real-application migration fixture needed to compare +the two implementations; this baseline characterization is the migration exception to +implementation-first validation. After the cutover, select durable tests for transactional +claims, generation loss and shutdown, then compare the same app workload and process resources. +Keep the existing timer cadence and process count; freeze any additional numeric resource +allowance from the matching baseline before judging the selected implementation. + +The scheduler slice retains G3's fixed-device resource envelope: no extra process while unused; +unused readiness/footprint median deltas within `max(100 ms, 2 x baseline MAD)` and +`max(32 MiB, 2 x baseline MAD)`; active settled/peak footprint deltas within 64/128 MiB; +Main loop-p99 median delta within `max(10 ms, 2 x baseline MAD)`. Use five alternating paired +application runs with the same 30-second quiet-worker window and observer. These unchanged +allowances are selected before implementation; no Rust speed or CPU saving is claimed. Preserve +the existing timer cadence and functional deadlines. The immutable G3 candidate output and SDK +graph form the new baseline, with the same scheduler fixture installed in its separate G4 tree. + +The existing scheduler service and run-session starter suites pass all 28 checks under Electron +Node mode with native persistence enabled and no skipped check. The actual application fixture +`47-scheduler-store.smoke.spec.ts` passes on the accepted G3 runtime: manual and timed runs, +unique scheduled-run identities, persisted outputs, relaunch, disabling and scheduler shutdown. +Its three launches complete in 8.8 seconds without resource instrumentation. +Logs: `.deepchat/rutis-g4-acceptance/baseline-scheduler-{tests,e2e}.log`. + +The scheduler now uses the Store command by default. The helper holds one correlated scan +request, coalesces reconciliation and fences a missing acknowledgement at the existing 30-second +maximum scan interval. The manager validates messages and generation identity before mutation; +committed runs are dispatched before replying to the helper. Scheduled-run insertion and head +advancement roll back together. The independent worker connection, database-password environment +and unused worker-side manual-run command are removed. Existing public routes and manual-run +execution keep their owners. The two native suites pass 36 checks with no skips, including atomic +rollback, catch-up/skip policy, the 100-job scan bound, missing/empty error replies, coalescing, +duplicate/stale requests and a spawn superseded by shutdown. The matching actual app scenario +also passes on the migrated build. Format, lint, i18n, app types and scoped scheduler/E2E types +pass. The normal build refresh of the Provider catalog is retained. + +### Scheduler slice resource evidence + +Five alternating baseline/migrated pairs pass the same application scenario: ten successful runs +and 30 launches with isolated profiles. Every active phase includes the same 30-second quiet +worker window, with no forced GC. Use G2's hardware and 500-ms process-tree physical-footprint +observer; settled values are per-run final-ten-second medians, then medians across five runs. +All three phase comparisons pass the unchanged allowances selected above. + +| Phase / metric | Baseline | Migrated | Delta | +| --- | ---: | ---: | ---: | +| Unused UI ready, ms | 1932.24 | 1927.26 | -4.98 | +| Unused sampled peak footprint, MiB | 1032.93 | 1025.47 | -7.47 | +| Active sampled peak footprint, MiB | 1038.36 | 1039.72 | +1.36 | +| Active settled footprint, MiB | 855.95 | 847.97 | -7.98 | +| Active Main loop p99, ms | 12.45 | 12.33 | -0.12 | +| Reopen sampled peak footprint, MiB | 1061.75 | 1054.50 | -7.25 | + +Unused process-name counts match in every pair. These measurements establish the cost of the +scheduler ownership change in this fixture; they do not establish a Rust or CPU speedup. +The baseline has 1,531 output files with SHA-256 +`2970d4a9178ffb4c9ece8959487695d797e68c573510028d7af5851e58faa74a`; the migrated build has +1,530 files with SHA-256 `0176d47a0a4b26d05def1677fa418cf55400b5763f61b0566fcbf8a440580947`. +Both use the same current catalogs, scenario/observer and 344 frozen files across six SDK +consumers. Full file, dependency and metadata hashes are verified before/after every run; +Root's source and runtime still match the measured candidate after capture. Durable evidence: +`.deepchat/rutis-g4-acceptance/{artifacts.json,paired/state.json,paired-summary.json,outcome-counts.json}`. +Scheduler checkpoint `0add1c1ee` passes required run `40268252480` and all six platform packages +in `40268252495`, including both required barriers. The remaining G4 contracts are still open. + +### Credential crypto port slice + +Extract the real `SecretStore` native dependency behind an async, data-only desktop port. The +pinned Electron runtime exposes `isAsyncEncryptionAvailable`, `encryptStringAsync` and +`decryptStringAsync`; use those operations in the main-process adapter. Keep wrapped values in +their existing storage format and verify that the async decryptor reads legacy synchronous +ciphertext. Reads do not rewrite credentials automatically. + +Retarget all actual consumers together: Sync settings/routes/cloud-service construction, MCP +variable bindings and connection startup, user-plugin configuration, Nowledge connections and +both exporters. Keep existing plugin mutation serialization and Nowledge's update exclusion. +Serialize cloud-config writes across the new awaits; preserve credential rollback if configuration +publication fails. Recheck MCP connection attempt identity after awaited binding resolution. + +The credential owner fences async operations by its lifecycle generation. Capture that generation +before work and check it immediately before returning sensitive reads or committing wrapped +values. Pause/invalidate pending work at database maintenance and shutdown; resume only after +the profile is usable. Existing owner-local guards remain local functions, never wire callbacks. +Do not add a decrypted credential cache or an alternate native implementation. + +Reuse the existing real-app Nowledge/REST/MCP/key-protection scenario. Add only legacy-ciphertext +compatibility and cloud credential persistence characterization before this migration. Existing +Nowledge E2E passes on `0add1c1ee` in 4.7 seconds with real native wrapping and the local MCP +fixture. Native async compatibility passes on Electron 43.8.3, including legacy ciphertext. +Cloud credential persistence passes across three launches, an unrelated configuration update and +relaunch in 6.1 seconds. These characterize the baseline before the production cutover. + +The default application now injects `CredentialCryptoPort` through the main-process native +adapter. `SecretStore` no longer imports Electron or handles native buffers. Every actual Sync, +MCP variable-binding, user-plugin, Nowledge and export consumer awaits credential operations; +no synchronous crypto fallback remains in this owner. Cloud writes are serialized across awaits, +merge the latest committed base, and retain wrapped-secret rollback. The acknowledged view is +computed before publication so a later native read failure cannot turn a successful write into +an apparent failure. Existing plugin serialization and Nowledge update exclusion remain active. +MCP startup rechecks cancellation/attempt identity after credential resolution and OAuth setup; +a stale attempt cannot clean up a newer attempt's transport or timer. + +Maintenance and shutdown synchronously invalidate pending credential operations. Maintenance +resumes the owner only after database reopen/reconciliation; shutdown cannot resume it. +Reads also reject a wrapped credential replaced or removed during native decryption. Consumer +guards run immediately before sensitive return or synchronous persistence, including after a +successful wrapping result. Plaintext is not cached and reads do not rewrite wrapped values. + +Local acceptance passes 251 checks in 12 affected test files, including native failures, +maintenance/resume fencing, pending/queued cloud writes, publication rollback, a maintenance +transition after wrapping, Nowledge mutation exclusion and MCP cancellation during credential +resolution. Scoped credential/E2E types, app types, format, lint, i18n and the normal build pass. +The matching actual application scenarios pass after cutover: Nowledge REST/MCP/key protection +in 5.1 seconds, native legacy compatibility in 2.1 seconds and cloud persistence in 6.1 seconds +(three tests, 13.5 seconds total). Evidence is under +`.deepchat/rutis-g4-crypto-acceptance/`, including baseline/migrated E2E and affected-test logs. +The normal build's Provider catalog refresh is retained. + +This slice adds no process and moves no storage ownership; the data-only port remains in-process +until G5 moves the cohesive backend. No full process-tree recapture or performance improvement +claim is required for this extraction. Native credential compatibility is verified on macOS arm64; +Windows/Linux credential-store behavior remains unverified locally. Credential checkpoint +`c80d36b69` passes required CI `40271838825`, including its barrier; package run `40271838879` +passes all six platform verifications and its required barrier. `DatabaseSecurityService`, +Provider/OAuth credential stores, power events +and the remaining Store/configuration contracts are still G4 work. + +### Scheduler system-resume input slice + +Keep the native `powerMonitor` subscription in the main composition and deliver system resume +through a data-only Scheduler service operation. Remove Electron imports, native event objects +and asynchronous fallback attachment from the Scheduler business owner. Main owns one listener +until shutdown and ignores events during maintenance or shutdown; Scheduler ignores events while +stopped and fences in-flight resume reconciliation across stop/start generations before durable +updates or timer dispatch. Preserve the existing schedule reconciliation and due-run semantics. + +Characterize the existing application with two native-emitter resume notifications in the current +scheduler E2E before changing this consumer. This is migration characterization, not test-first +implementation. Compare the same manual/timed execution and relaunch scenario after cutover; +select durable lifecycle tests after implementation. This port extraction adds no process and +does not require another whole-process performance capture. Actual OS suspend/resume remains +separate from delivery through Electron's native emitter. + +The default main composition now owns one native resume listener and removes it through the +shutdown coordinator. It filters maintenance/shutdown delivery and observes reconciliation +failures. `SchedulerService.handleSystemResume` receives no Electron object or callback. Its +start/stop generation rejects stale reconciliation before schedule writes and timer dispatch, +including an event whose Agent lookup finishes after a stop/start cycle. The business owner +has no Electron import or asynchronous fallback subscription. + +Local acceptance passes 38 native-enabled scheduler checks without skips, plus 18 existing +composition checks. The actual application receives two resume notifications through Electron's +native emitter with exactly one listener, then completes manual/timed execution, durable run +identity checks, relaunch, disabling and shutdown. The matching scenario passes before/after +cutover in 8.6/7.9 seconds. App/scoped types, build, format, lint and i18n pass. Evidence: +`.deepchat/rutis-g4-resume-acceptance/`. This establishes event delivery and lifecycle fencing; +physical device suspend/resume and Windows/Linux native delivery remain unverified locally. + +### Session transcript Store command slice + +Select Session transcript clearing as the next actual durable command. `createSessionDataFromDatabase` +already composes the transcript, pending inputs, settings and Tape against one database. Move the +clear transaction assembly into that owner and connect `SessionTranscriptMutations` to the coarse +operation. Remove main composition's `runInTransaction` callback dependency. Retry truncation +already owns its transaction inside `SessionTranscript.deleteFromOrderSeq`; retain that atomic +operation rather than introducing another generic transaction port. Preserve runtime preparation +before the mutation, post-commit invalidation, clear rollback, Tape incarnation/projection cleanup +and retry behavior. This does not turn internal row APIs or transaction callbacks into RPC. + +Baseline characterization passes 46 existing native-enabled transcript/Tape/runtime checks. +The real local-streaming scenario now also drives the existing renderer Clear Messages action, +then verifies an empty pending queue and empty transcript after graceful relaunch; it passes in +6.4 seconds before this Store cutover. That renderer action awaits the durable acknowledgement +and reloads its message cache. This migration characterization is the exception to implementation-first +validation; no production renderer behavior changes are needed. + +The default composition now connects `SessionTranscriptMutations` to the Session data owner's +`clearTranscript(sessionId)` operation. That owner assembles the one transaction across pending +inputs, transcript projections and Tape reset. The mutation coordinator retains runtime +preparation and post-commit cleanup; it receives no generic transaction callback or separate +settings/pending-input writers. Retry truncation directly uses the transcript owner's existing +atomic range operation. No schema, file location, transport or process placement changes. + +Local acceptance passes 430 native-enabled checks across five affected files without skips. +The real data owner is exercised with a SQLite trigger that rejects Tape deletion: transcript, +queued input, Tape incarnation/head and Memory ingestion projection all survive rollback, and +runtime cleanup is suppressed. Successful clear removes all corresponding rows and creates a +fresh Tape incarnation. A later retry-retraction failure also rolls back earlier Tape writes and +all transcript changes; runtime invalidation occurs only after a successful retry commit. + +The actual renderer Clear Messages action and graceful relaunch pass after cutover in 7.2 seconds +against the 6.4-second matching baseline. The scheduler resume/manual/timed/relaunch scenario +also passes on the combined runtime in 7.5 seconds (two E2E tests, 14.9 seconds total). These are +functional checks. Scoped transcript/E2E types, all 81 scoped Memory test types, app types, build, +format, lint and i18n pass. Evidence is under `.deepchat/rutis-g4-session-store-acceptance/`. +The selected business transaction uses the same database and writes as its baseline; no full +performance recapture or speed claim is required. Other Session/Tape/Memory command boundaries, +configuration snapshots and remaining desktop capabilities still belong to G4. + +The combined resume/Session checkpoint `826b3af16` passes required run `40274014870`, including +`pr-required` job `121414464019`, and package run `40274015002` with all six platform jobs and +`package-required` job `121418838344`. Both workflows completed before the next settings push. + +### Versioned settings snapshot and desktop mutation port + +Keep the existing `settings.getSnapshot`/`settings.update` fields and routes, backed by one +application settings service. That service supplies explicit data-only snapshot/update operations +to routes and acknowledged display mutations to Agent tools. Retain native effects, normalization, +activity recording and existing per-field batch failure behavior; do not introduce a second +persistent settings owner or a generic settings RPC. Configuration entry routes and other +configuration domains remain separate G4 work. + +Use one Main presentation revision sequence for settings snapshots, mutation replies and +`settings.changed` publications. This sequence is scoped to Main's lifetime, which also owns its +renderer contexts; backend-generation checks remain mandatory at the future private transport. +Preserve revisions in the renderer client. Apply values by per-key revision so a delayed initial +read, update reply or partial event cannot revert a newer value or discard unrelated fields. +This is not a durable database revision. At G5, portable preferences must be written directly at +the backend configuration owner and native device effects must stay at Main; avoid a +Core-to-Main-to-Core mutation loop. Refresh the selected snapshot after database maintenance. Reject new owner operations while +maintenance or shutdown is active. Keep secret values outside this allowlisted projection. + +Replace the Agent display port's synchronous native getters/setters with one async validated +mutation request and a data-only acknowledgement containing the owner's previous/applied value. +Skill authorization and dispatch-journal commitment stay at the Agent owner before the mutation. +The default routes and Agent tools now use this service; the replaced route-local implementation +and eight synchronous Agent display getters/setters are removed. The renderer client retains only +bounded per-key revision metadata. Existing stores and OCR controls retain ownership of UI values; +OCR releases its event listener and ignores late successful or failed mutations after unmount. +Launch-at-login applies the owner's accepted value, without a second assignment from the request. + +Local acceptance passes 217 checks across eleven affected files. Durable cases cover delayed +snapshot hydration, mixed partial events, reversed mutation acknowledgements, invalid revisions, +native-owner receipts, strict display requests, fenced operations, failed writes and teardown. +The actual privacy/system-settings scenarios pass before cutover in 4.5/3.6 seconds and after +cutover in 4.1/3.6 seconds. A separate real-app check passes in 6.7 seconds with Main's clock +frozen and then moved backwards: snapshots, events and acknowledgements share a monotonic +sequence, the other window updates, and graceful relaunch preserves the preference. These are +functional results, not performance claims. + +The runtime build, app typechecks, format, lint and i18n pass. Scoped owner/Agent/E2E and renderer +store/OCR test types pass. The broad API-client test fixture has existing unrelated type diagnostics; +its runtime tests pass. Evidence is under `.deepchat/rutis-g4-settings-acceptance/`. No process, +schema, transport, layout or style change requires a full performance recapture. The service remains +in-process; other configuration domains, native capabilities and Store boundaries remain open. + +### Skill host paths and native directory capability + +Move Skill, Skill settings and external-import path acquisition out of Electron-dependent business +code. Main supplies explicit home/temp/user-data/bundled-skill directories and one asynchronous +native directory-open capability. Keep discovery, imports, scoped authorization, operation leases, +plugin source validation and filesystem rollback inside their existing owners. Preserve development +and packaged resource fallback order. Do not add a runtime fallback to Electron or duplicate the +Skill service in Main. This removes a G5 host dependency; it does not create a separate Skill plugin. + +Keep the pure watcher request-ID helper independent of native watcher construction. Shared console +diagnostics must not import Electron through a toolkit package: Main initializes the existing +development debug gate explicitly, while captured console sinks remain console-only. Standalone +Node hosts default to quiet debug output and may set the same data-only flag at their own startup. + +Characterize the existing Skills and scan-worker application scenarios before the cutover, with +the fixture's managed Skills directory isolated in its disposable profile. This characterization +is a migration exception to implementation-first verification. + +The default composition now supplies those paths and the native directory capability to the same +Skill service. Skill settings and import routes receive their required home/temp directories. +The three business modules no longer import Electron; the request-ID helper is available without +constructing a watcher, and shared logger imports no Electron toolkit. Main preserves its existing +`!app.isPackaged` console-debug gate at startup. Existing captured diagnostics still bypass file +persistence. No new dependency, process, database writer or native watcher owner is introduced. + +Local acceptance passes 781 checks across 36 files covering the full Skill group, watcher and +logging suites, routes and composition. New durable cases hold a native directory acknowledgement +through shutdown on both success and failure, reject unsafe Agent scopes before native dispatch, +and verify the explicit console-debug gate and captured sinks. Scoped settings/import/logging/E2E +types, app types, the runtime build, format, lint and i18n pass. + +A separate ordinary Node 24.22.1 run bundles the three selected modules with Electron, electron-store +and Electron toolkit imports rejected. It exercises actual files, ZIP extraction and byte equality, +ordered bundled-directory fallback, external import conversion/cleanup, persisted assignments after +service recreation and real discovery workers. Native directory and watcher capabilities are supplied +by the embedding host in that run; watcher closures drain twice. This proves the selected Skill +owner can run without Electron, not that the Harness or headless Session Host has moved. + +The matching actual application scenarios pass before/after migration: Skills catalog/file/extension +reads in 3.1/3.2 seconds and scan-worker events in 2.9/2.7 seconds. Disposable profiles now seed +their own managed Skills directory, and the catalog check requires delivered builtins. These are +functional checks. Evidence is under `.deepchat/rutis-g4-skill-host-acceptance/`; actual OS file-manager +presentation is not exercised. Process placement, native watcher ownership and storage behavior +are unchanged, so no full resource recapture or speed claim is required. G4 remains open. + +The preceding settings checkpoint `03ebe520b` passes required run `40277920388`, including +`pr-required` job `121426387843`, and package run `40277920393` with all six platforms and +`package-required` job `121430324373`. Both workflows finished before the Skill slice push. + +### Sync host and peer credential ports + +Replace the remaining synchronous Sync host/peer token wrapping and reveal callbacks with +acknowledged asynchronous crypto operations through the existing credential adapter. Preserve +machine-local private files, legacy ciphertext, the Linux basic-text refusal, pairing consent and +one-time-code checks. Do not cache plaintext or route these private tokens through general settings. +Fence cancelled pairing before persistence, cancelled transfers before authenticated requests and +stale connection reads across pairing replacement, forget and shutdown. Retain host transition +serialization and prevent a stopped generation from launching a connector after crypto returns. + +Characterize native peer token persistence and legacy wrapped-token reuse through the actual app +before the cutover, with intercepted fixture-host responses and an isolated profile. This is a +migration compatibility exception to implementation-first verification. The existing full loopback +host scenario remains the matching application comparison; no transport/process/storage-path +change calls for a full performance recapture. + +The default host/peer composition now awaits the existing async native credential adapter. Opaque +unwrap operations use the same maintenance/shutdown generation fence as other SecretStore work. +The private files, encoding, connector-token environment delivery and Linux basic-text policy stay +unchanged. Peer cancellation is checked after crypto and immediately before atomic pairing-file +replacement; connection reads reject changed credential generations. Host stop advances its +generation so pending wrap/unwrap replies cannot start a stale connector; normal restart remains +supported. Replaced synchronous encryption/decryption wiring is removed. + +Local acceptance passes 91 checks across eight files. New durable cases cover cancelled preflight +and token wrapping, saved-pairing preservation, credentials superseded by re-pair/forget/stop, +cancelled transfer unwrap, native failures and maintenance fences. Real loopback sockets/private +files remain in the transfer tests. A controlled local connector starts and restarts through the +async ports; stop during wrap/unwrap never launches its binary or enables its listener. + +The full actual-app host/backup/consent/restart scenario passes before/after cutover in 8.3/9.8 +seconds. A native peer-credential app scenario passes in 4.8/5.0 seconds: pairing responses omit +token material, private persistence is wrapped, an older synchronous ciphertext authenticates +after graceful relaunch without being rewritten, and forget removes pairing. Only the fixture host's +network replies are intercepted; application routing, private persistence and OS crypto are real. +These are functional checks, not a performance claim. Native OS crypto is verified on macOS arm64; +Windows/Linux vault behavior and real Cloudflare account connectivity remain unverified locally. + +Runtime build, app types, scoped crypto/peer/connector/E2E types, format, lint and i18n pass. +Evidence is under `.deepchat/rutis-g4-sync-crypto-acceptance/`. The preceding Skill checkpoint +`e739f5810` passes required run `40280089324`, including `pr-required` job `121432996814`, and +package run `40280089473` with all six platforms and `package-required` job `121437226872`. +Both workflows finish before this slice's push. G4 remains open for other Store/config/native ports. + +### Database security native boundary and migration commit + +The default bootstrap supplies the database path, owner-local metadata facade and asynchronous +native crypto. DatabaseSecurity imports neither Electron nor ElectronStore; unlock presentation and +quit remain desktop-owned. Native encryption remains available to authorized maintenance while +ordinary SecretStore operations are paused. The metadata facade moves with this owner at G5, +without synchronous cross-process settings RPC or another writable instance in Main. + +The per-file lock covers native preparation and commit. Wrapped target metadata is prepared before +closing the writer; rollback remains until target reopen and metadata persistence both succeed. +Runtime failure restores the original writer and metadata. Shutdown fences pending native results +before validation, secret return or mutation; pending preparation excludes another migration, +metadata repair or constructor recovery for that profile. SQLCipher copying, validation, physical +paths, metadata shape and startup file recovery remain compatible. Cross-file crash atomicity is +not established by this slice and remains conditional G10 work. + +Enable/legacy-unlock/change-password/disable was characterized in a disposable application profile +before cutover; this compatibility characterization is an implementation-first exception. The same +two actual-app scenarios pass before/after: database settings/native status in 4.2/4.2 seconds, and +encryption, legacy synchronous ciphertext unlock, wrong-password rejection, rekey, disable and four +graceful launches in 10.8/10.8 seconds. Portable settings survive every transition, encrypted file +headers differ from plaintext SQLite and disable restores a plaintext header. These are functional +comparisons without timing gates or a speed claim. + +Local acceptance passes 122 checks across four behavior files and seven real SQLCipher checks. +Durable regressions cover stopped decrypt/wrap, valid manual unlock with native failure, desktop +quit ownership, native wrap failure before closing the writer, unavailable native storage, per-file +exclusion, original-key recovery after target reopen failure and rollback of both database and +metadata after enable/rekey/disable metadata writes fail. The native file is classified in the +existing required SQLite lane; it uses actual temporary files, filesystem/path modules and +SQLCipher, without Electron or mock SQL. + +Runtime build, app/scoped types, native scope/type gates, format, lint and i18n pass. Evidence is +under `.deepchat/rutis-g4-database-security-acceptance/`. No process, IPC, database path or data-volume +change requires a full resource recapture. Actual OS crypto is exercised on macOS arm64; real +Windows/Linux vaults and power-loss recovery are unverified locally. G4 remains open. + +The preceding Sync checkpoint `7c04844a1` passes required run `40282974786`, including +`pr-required` job `121442092801`, and package run `40282974887` with all six platforms and +`package-required` job `121448087538`. Both workflows finish before this slice's push. + +### Scheduler native launch boundary + +The default Scheduler requires its existing local manager factory, and the manager requires an +asynchronous cancelable launch capability. Main resolves the approved helper entry and creates +the Electron utility process. The manager receives a plain facade for typed commands, data events, +PID observation and termination. It imports no Electron, filesystem or path API. The native module/ +path fallback and both optional service-constructor fallbacks are removed. Factory callbacks stay +local to the business composition; G5 transports capability requests, not these functions. + +A local abort signal cancels pending startup when the manager stops; epochs also reject late +completion from a non-cooperative launcher. Native failure settles once, removes startup listeners +and requests child termination. A post-launch ownership check prevents stale reconciliation after +stop. The timer helper, private protocol, native arguments/environment marker/service label, +packaging paths, Store authority, process count and restart/idle behavior remain compatible. + +Local acceptance passes 63 checks across the complete Scheduler group, native launch and +composition suites. Seven durable launch cases cover the plain command/event facade, pre-canceled +launch, stop during pending native startup, cancellation while fork returns, native exit/error +before spawn and stop superseding a completed launch. Existing real SQLite due claims, dispatch, +restart, stale completion and resume checks remain active with typed host fixtures. + +The same actual-app manual/timed execution, unique run identities, system resume, relaunch, +disable and shutdown scenario passes before/after in 9.3/7.9 seconds. Runtime build, app and scoped +Scheduler/launch/E2E types, format/check, lint and i18n pass. Evidence is under +`.deepchat/rutis-g4-scheduler-launch-acceptance/`. These are functional comparisons. No process, +IPC, storage-path or workload-volume change calls for a full resource capture or speed claim. +Native app execution is verified on macOS arm64; actual Windows/Linux startup and forced native +startup-failure delivery are unverified locally. Other helper/native/config boundaries keep G4 open. + +The preceding database security checkpoint `9e8fa2762` passes required run `40286578817`, including +`pr-required` job `121453178038`, and package run `40286578821` with all six platforms and +`package-required` job `121458134091`. Both workflows finish before this slice's push. + +Integrated baseline: `dev` at `207685009` retains upstream OAuth issuer/redirect compatibility and +Provider/default-MCP additions. Both Baizhi example lifecycle cases use the async credential port; +malformed-issuer OAuth fixtures retain otherwise valid token fields. The integrated tree passes +464 affected checks across 26 files, including all Scheduler, MCP, plugin lifecycle and changed +Provider suites. The final fixture subset passes all 31 checks. Actual-app cloud-browser credential +lifecycle and Scheduler scenarios pass together in 20.4 seconds (9.7/10.4 seconds). Only the local +synthetic MCP server is contacted by the cloud-browser fixture. Build, app/scoped fixture/E2E +types and required quality checks pass; no resource recapture or speed claim is introduced. + +### MCP OAuth native credential and browser boundary + +The default MCP credential store, interactive SDK provider/manager and enterprise identity owner +receive explicit private paths, asynchronous secure crypto and browser-open capabilities from Main. +Their native imports and default Store construction are removed. The actual service, client, +connection-error and diagnostics consumers await these contracts. Replaced synchronous wiring is +removed; the Store remains the same private file owner until G5. + +One bounded mutation queue serializes acknowledged writes and atomic interactive binding-key moves. +RAM publication follows persistence; native encryption and atomic-rename failures retain both old +RAM and disk, and encrypted temporary files are cleaned. Initial decrypt is single-flight. Twenty-four +normal writes leave eight reserved control slots; stop bypasses the queue and rejects pending native +results. Existing v1/v2 formats, size/record limits, Linux basic-text refusal, memory-only fallback +and settings-window credential permissions remain compatible. No extra plaintext cache is added. + +Public discovery metadata supplies the synchronous loopback issuer validator. Discovered identity +is finalized through one settings-owner compare-and-set against server ID, generation, binding hash +and endpoint. Profile mutation rereads current metadata after credential cleanup, preserves other +profiles and rejects replacement of the same profile. Server/profile leases fence delayed SDK, +refresh, browser, status and runtime effects after logout, configuration changes or shutdown. Plugin-owned stops use the existing supervisor; +its auth-scoped leases survive probe waits, integrity/recovery checks, adapter/native starts and +symmetric stops, with cleanup after canceled startup. Connection failures await OAuth classification and suppress late notifications after a stopped +startup. Legacy issuer and registered-callback behavior remain active. + +The disposable-profile compatibility characterization precedes the cutover as an implementation-first +exception. Matching real-app read-only MCP snapshots pass before/after in 6.8/8.7 seconds. Private +machine-credential save, legacy native ciphertext read without file rewrite, settings-window +isolation, graceful relaunch and durable removal pass in 9.4/10.3 seconds. The cloud-browser private +HTTP credential lifecycle passes in 10.7/14.8 seconds around the supervisor change. The final three +scenarios pass together in 34.2 seconds. Only a local synthetic MCP server is contacted; no external +account is used. These are functional comparisons without timing gates or speed claims. + +Local acceptance passes 657 checks across 33 affected MCP, plugin, native-adapter, composition, +route and CLI files. Durable protection covers serialized partial updates, single-flight decrypt, +encryption/rename rollback, atomic key moves, queue reserves, stopped crypto/browser results, +stale runtime stops, pending identity reads, profile-edit conflicts, settings CAS and Linux secure +backend policy. Five supervisor regressions cover canceled launch verification, adapter/native +startup, authentication restart and a stop waiting for another start. Existing SDK issuer, +registered-callback, enterprise refresh/subject and plugin lifecycle checks remain active. App and +scoped test/E2E types, normal and final runtime builds, format/check, lint and i18n pass. Normal +Provider and ACP registry refreshes are retained. + +A broader supplemental E2E selection runs 16 cases: 13 pass, two skip and the unmodified Provider +headers fixture times out waiting for `disabled-providers-toggle`, a selector absent from the +current renderer. Its failure and artifacts remain recorded in `plugin-baseline-e2e.log`; it is not +reported as a passing OAuth acceptance check. Final OAuth/plugin validation uses the three explicit +files above, without retrying that unrelated fixture. + +Evidence is under `.deepchat/rutis-g4-mcp-oauth-acceptance/`. No process, IPC, workload-volume or +storage-path change calls for a full resource capture or speed claim. G5 must frame legal large +native envelopes through bounded transfers without truncation. Native credential compatibility is +verified on macOS arm64; real Windows/Linux vaults and external identity-provider/browser flows +remain unverified locally. Remaining Store, configuration and desktop ports keep G4 open. + +The preceding integrated checkpoint `6a43b8f70` passes required run `40290640902`, including +`pr-required` job `121467164668`, and package run `40290641026` with all six platforms and +`package-required` job `121472173105`. Both workflows finish before this slice's push. + +### Provider OAuth credential and browser ports + +Main supplies explicit private paths, the existing async credential crypto port and browser-open +capabilities to both Codex and Grok credential/auth owners. Their Electron imports and default +native Store construction are removed. Existing v1 encrypted/plain-file envelopes, corrupted-file +backup, fsync/rename commits, load errors and file fallback remain compatible. These provider-specific +formats retain their existing policy, which differs from MCP's memory-only fallback. + +Actual status/events, refresh, logout, global initialization, SDK/direct requests and shutdown await +the selected owners. Grok's synchronous runtime-provider construction carries public configuration; +its synchronous token peek is removed. Both trusted direct requests and SDK requests use the existing +async fetch adapter. Original auth scopes span token acquisition, dispatch and single 401 refresh; +request cancellation or owner replacement cannot become API-key fallback. Ordinary refresh failure +retains API-key fallback. Endpoint restrictions, refresh sharing and account binding remain active. + +Delayed native, browser, discovery, refresh and status results are fenced across logout, account +replacement, canceled attempts and shutdown. A login completing while an old refresh is pending +invalidates that refresh before persisting the new account. Status queries may retry once after an +observed account transition; publication tickets suppress delayed older events. Each auth owner +admits at most 32 HTTP requests, with an 8 MiB declared/streamed body bound. Existing request +deadlines and cancellation cover response bodies as well as headers. + +Each private file owner serializes at most 24 normal and eight reserved control mutations; stop +bypasses admission. Files/envelopes are bounded to 16 MiB and normalized/decrypted token payloads +to 8 MiB before native transport or parsing. Only pending reads coalesce; no plaintext token cache +is retained. Read revisions reject results superseded by admitted writes. Failed deletion or +directory enumeration still attempts known artifact cleanup and rejects logout acknowledgement. +G5 must frame legal payloads within the existing bounded transfer contract. + +The disposable-profile compatibility characterization precedes cutover as an implementation-first +exception. The same real-app scenario passes before/after in 11.4/11.7 seconds (11.6/12.0 seconds +total). Four graceful launches verify plaintext and legacy native ciphertext without rewriting, +public status without tokens, authenticated cancel, durable logout and signed-out relaunch. Discovery +and revocation responses are synthetic; no external account is contacted. These functional results +have no timing gate or speed claim. + +The affected suite passes 1,213 checks across 79 files. Final contract acceptance passes 150 checks +across nine selected files. Shared actual-file regression cases replace two duplicate +mock-only Store suites: encryption/fsync/rename rollback, corrupt backups, unreadable-file recovery, +private permissions, serialized save/clear/save, coalesced decrypt invalidation, queue reserves, +failed logout cleanup, late refresh wrapping, stalled HTTP bodies and upstream size limits remain +covered for both providers. Account replacement, canceled discovery/polling, request-adapter +cancellation and current OAuth headers on each direct catalog request retain separate regressions. +App and scoped test/E2E types, normal and final +runtime builds, format/check, lint and i18n pass. Normal Provider registry refreshes are retained. + +Evidence is under `.deepchat/rutis-g4-provider-oauth-acceptance/`. No process, IPC, workload-volume or +storage-path change requires a full resource capture. Native credential compatibility is verified +on macOS arm64; real Windows/Linux vaults and external identity-provider/browser flows remain +unverified locally. Other provider/browser-window, configuration, shared maintenance and Store +boundaries keep G4 open. + +The MCP OAuth checkpoint `ae0475a65` passes required run `40307676246`, including `pr-required` +job `121523620575`, and package run `40307676364` with all six platforms and `package-required` +job `121530148783`. Both workflows finish before this slice's push; no rerun is requested. + +The Provider OAuth checkpoint `bc4ad41db` passes required run `40317513595`, including +`pr-required` job `121556618773`, and package run `40317513761` with all six platforms and +`package-required` job `121562643275`. No rerun is requested. + +### Shared database maintenance commands + +Main's maintenance entrypoint accepts six explicit data commands for backup-file import, named +local/cloud-backup import, encryption enable/change/disable and live schema repair. Actual peer, +local/cloud import and security-route consumers use these commands; their supplied operation +callbacks are removed. Existing result contracts, route permissions and credential policy remain +active. Commands carry operation arguments, never SQL, a database handle or a transaction closure. +Live repair now uses the same exclusive admission as import and encryption; startup recovery +remains a separate pre-owner operation. + +The owner retains pause, drain, operation, reopen, reconciliation and resume. It admits one operation +at a time, rejects entry during backup or shutdown and rechecks shutdown after draining before +dispatch. Preparation failures enter the existing recovery path. Move this complete owner with the +writer in G5. Internal Session/Tape/Memory transactions stay local to their business owners; +their closures are not candidates for individual RPC methods. Sync snapshot locks, staged-copy/ +config import connections and imported-source reads also stay inside the cohesive Store owner. +This contract does not create another normal writer. + +Matching disposable-profile application workloads pass before/after cutover: encryption, legacy +unlock, failed-password recovery, rekey, disable and four graceful launches in 12.5/11.2 seconds; +backup, rejected import, incremental restoration, overwrite removal, schema repair and durable +session restoration after relaunch in 4.8/5.2 seconds. Empty sessions use the real public creation +route without a Provider request. A final concurrency case holds native encryption preparation, +verifies repair/import are rejected, then releases native work and verifies repair succeeds. +All three migrated scenarios pass together in 19.6 seconds. No external account is contacted. + +Nine directly affected suites pass 158 checks under Electron Node mode with required native SQLite +and no skips. Before cutover, four native suites pass all 37 checks. Existing SQLCipher rollback, +backup snapshot consistency, imported data normalization, route and composition contracts remain +active. App and scoped E2E types, the normal build, format/check, lint and i18n pass. Evidence is +under `.deepchat/rutis-g4-maintenance-acceptance/`; normal generated catalogs remain retained. +No process, IPC or storage-path change requires a full resource capture, and timings are functional +observations without a speed claim. Physical shutdown/power-loss faults and full native workloads +on Windows/Linux remain unverified. Remaining configuration snapshots, normal-writer maintenance +fences and native/window owners keep G4 open. + +The maintenance-command checkpoint `5c7efdc1e` passes required run `40340119446`, including +`pr-required` job `121636236992`, and package run `40340119785` with all six platforms and +`package-required` job `121645123643`. No rerun is requested. + +### Ordinary request admission and maintenance drain + +`DatabaseRequestGate` owns the existing running/maintenance/failed admission state. Main consumers +read that one state; the independent boolean and partial route-prefix checks are removed. Ordinary +requests are refused by default during maintenance. Explicit native window controls, private security +status, static CLI status/version/capabilities and identity-validated CLI approval answers remain +available. Permission and caller checks still run in their existing owners. + +All finite renderer/CLI routes, CLI authorization, audio/OCR RPC, uploads, compute streams and +programmatic-tool dispatch participate in request ownership. Admission is checked again when +startup-scheduled work actually executes, using the original task cancellation signal. A running +handler has its own lifetime: the startup coordinator may reject its reply immediately on cancel +while that handler still runs. Its lifetime remains counted until actual completion. The gate +retains only an active count and one drain waiter, without payload or credential snapshots. + +After session/background cancellation, maintenance drains ordinary requests before any command +can close or replace the writer. The drain has a 30-second failure deadline. If work does not settle, +maintenance fails before dispatch and recovery retains the current database. Rejected requests release +ownership; failed maintenance stays closed to ordinary requests. Native presentation cannot reopen +ordinary admission. + +Maintenance command routes are excluded from their own drain. Cloud download and verified-peer +imports still use the exclusive operation owner. CLI `events.subscribe` counts only its initial +database snapshot; subsequent `TypedEventHub` forwarding holds no database lease. Authenticated +callers, approval settlement and the original cancellation identity remain intact. All request +lifetime callbacks stay local to the owner and are not transport payloads. + +The accepted maintenance scenario is extended with actual built-CLI Provider-list requests before +backup and after relaunch. It passes before/after in 5.0/4.9 seconds; encryption/legacy unlock, +wrong-password recovery, rekey and disable retain parity in 11.2/11.0 seconds. Native preparation +also verifies configuration/Provider and CLI requests are refused while window/security/CLI status +still works. A delayed cloud-secret write must settle before encryption dispatch; its interrupted +result never commits a secret. All four real-app scenarios pass together in 21.5 seconds in owned +disposable profiles, without contacting an external account. + +The affected CLI/route/app suites pass 616 checks across 36 files. Durable regressions cover +rejection cleanup, maintenance self-deadlock, native presentation, bounded drain/retry, queued +execution, a canceled +reply with an uncooperative running body and an open watcher after its initial snapshot drains. +App types, scoped new gate/dispatcher regressions, CLI and E2E types, normal/final runtime builds, +format/check, lint and i18n pass. The existing large legacy dispatcher fixture has unrelated type +drift outside these scoped type checks; its runtime suite remains passing. + +Evidence is under `.deepchat/rutis-g4-request-drain-acceptance/`. There is no process, IPC, +storage-path or workload-volume change requiring a full resource capture; timings remain functional +observations without a performance claim. This slice owns ingress. Background work detached after +an acknowledged request, remaining configuration snapshots and native/window dependencies still +need explicit ownership/lifecycle contracts before G4 closes. Physical shutdown/power-loss and full +native Windows/Linux application workloads remain unverified locally. + +### Startup work completion before maintenance + +The request-ownership checkpoint `99fdb0710` passes required run `40352516093`, including +`pr-required` job `121679711290`, and package run `40352516371` with all six platforms and +`package-required` job `121689282632`. No rerun is requested. + +The startup coordinator separates cancellation acknowledgement from actual callback completion. +`cancelAndDrainTarget` uses the existing in-flight inventory, including canceled older runs, and +waits for actual callbacks. Canceled pending tasks never execute and release their deduplication +entries. Immediate replies and the existing CPU/IO lane limits remain intact. There is no additional +task registry or transport protocol. + +Main maintenance awaits that operation for its startup target before pausing/recreating services or +changing the writer, then rechecks shutdown. A 30-second preflight failure restores ordinary +admission before any service teardown or database replacement. It cannot duplicate an active +startup owner. Successful maintenance schedules background migrations again; a failed preflight +does not reschedule unfinished work. The old cancellation-only maintenance wiring is removed. + +Eight affected coordinator, request, route, composition, logging and migration/usage files pass +139 checks under Electron Node mode with native SQLite required and no skips. Durable regressions +cover an old canceled run and its replacement, late callback failure, unrelated-target isolation, +queued cancellation and a bounded failure followed by another drain. The deadline uses fake time; +these checks enforce lifecycle behavior rather than a shared-runner timing budget. + +The same four real-app scenarios pass before/after in 21.6/21.3 seconds in owned disposable profiles. +Encryption, legacy unlock, wrong-password recovery, rekey and disable take 11.1/10.8 seconds; +CLI Provider-list, backup, incremental/overwrite import, repair and relaunch take 4.9/4.8 seconds. +Concurrent maintenance rejection and delayed native credential drain retain parity in 2.8/2.8 and +2.6/2.6 seconds. No external account is contacted. App/scoped types, the normal build, format/check, +lint and i18n pass. Normal build-generated Provider/ACP catalog refreshes are retained separately. +Evidence is under `.deepchat/rutis-g4-startup-drain-acceptance/`. There is no process, IPC or +storage-path change requiring a full resource capture, and no speed claim is made. + +Held startup callbacks and timeout behavior are verified at the real coordinator boundary; the +application comparison exercises its default maintenance wiring without a held-startup fault. +Other background effects after acknowledgement, shutdown ownership, configuration snapshots and +remaining native/window dependencies keep G4 open. Physical shutdown/power-loss and full native +Windows/Linux application workloads remain unverified locally. + +The branch incorporates `dev` at `5128430a9`. Its business files merge without conflicts; the two +generated catalog conflicts are resolved by the normal build scripts. The integrated tree passes +217 main checks across ten files and 291 related renderer checks across seven files, app types, +normal build, format/check, lint and i18n. The same four real-app scenarios pass in 23.7 seconds +(12.3/5.3/3.0/2.9 seconds). All samples remain recorded as functional observations, without a timing +gate or speed claim. Integration evidence uses the `dev-integration-*` logs in the same directory. + +### Shutdown ownership before writer close + +The startup-drain integration checkpoint `ec74d772c` passes required run `40437135796`, including +`pr-required` job `121970616884`, and package run `40437135856` with all six platforms and +`package-required` job `121975288948`. No rerun is requested. + +`DatabaseRequestGate` owns stopping admission and a completion-only promise for the actual maintenance +operation. The six typed commands, including verified-peer imports, use that owner; results and +credentials are not retained. Ordinary admission may resume before the final asynchronous setup +returns, but another maintenance owner cannot overlap it. CLI authorization retains its ordinary +lifetime. Only the two device dispatches that await shutdown before restart/reset are excluded from +their own drain; validation and the exclusive terminal-action claim remain unchanged. + +Shutdown closes request admission and background availability synchronously, invalidates native +security/credential work and cancels startup replies. Actual startup callbacks then drain after CLI +and OAuth ingress stop, before their service dependencies are disposed. Ordinary requests and the +actual maintenance operation drain before writer close. These critical waits are not best-effort +destroy steps: a bounded failure rejects teardown before closing the database or granting an action. + +Interrupted maintenance checks shutdown before reopen/reconciliation and before resuming services. +A remote initialization that finishes after shutdown is compensated before completion. Failed +recovery starts cleanup only after releasing the maintenance lifetime, avoiding teardown waiting on +its own caller. The cancellation-only shutdown path and recovery-side reopen during shutdown are +replaced by these default paths, without a feature flag or fallback. + +Forty-one affected main/CLI/security/route files pass 722 checks under Electron Node mode with native +SQLite required and no skips. Durable contracts cover concurrent request/maintenance completion, +restart/reset self-waiting, authorization lifetime, bounded failure/retry and final maintenance +exclusivity. App and scoped gate/E2E types, normal build, format/check, lint and i18n pass. The branch +includes `dev` at `2a8a36b3a`; its Provider integration is covered by the selected suites. Normal +build-generated Provider catalog refreshes are retained. + +The baseline launch/close and encrypted-reopen scenarios pass in 14.8 seconds (3.7/10.9 seconds). +The final seven-scenario application matrix passes in 39.1 seconds: launch/close 7.7 seconds; +encryption/legacy unlock/rekey/disable 10.7 seconds; CLI backup/import/repair/relaunch 5.0 seconds; +concurrent maintenance rejection 2.9 seconds; native credential drain 2.7 seconds; shutdown with a +held native credential 4.7 seconds; shutdown with held maintenance 5.0 seconds. Native quit closes +the window while work remains owned, permits release through the still-live Main connection, exits +with code zero, and reopens without an interrupted secret or encryption commit. All profiles are +owned/disposable and no external account is contacted. These whole-scenario durations include +startup and presentation; they are functional observations without a timing gate or speed claim. + +The E2E fixture retains the launched child handle across debugger disposal and recognizes an already +completed exit-zero process as graceful. Resource-measurement errors and forced-close behavior still +fail or report their existing outcomes. Accepted app evidence is `final-e2e.log` and `final-results` +under `.deepchat/rutis-g4-shutdown-acceptance/`; earlier driver probes remain there for diagnosis. +No process, IPC or storage-path change requires a complete resource recapture. Remaining detached +background owners, configuration snapshots and native/window dependencies keep G4 open. Full +Windows/Linux native application and physical power-loss/suspend scenarios remain unverified. + +### Provider configuration authority + +Provider model facts and user overrides require their database adapters at construction. The +runtime helpers have no legacy JSON defaults or mutable store-factory setter, and Provider settings +no longer discovers paths, creates a legacy model directory or reads the Electron version. Main +owns the native settings factory and supplies its version to both migration and Provider +initialization. Legacy import still completes before settings attach to the one writer; no +configuration writer, per-key IPC, schema or public route has been added. + +- [x] Replace the actual helper defaults and mutable store-factory wiring, then remove direct + Electron/path discovery from Provider settings and native-store construction from the + shared settings wrapper. +- [x] Validate affected configuration/migration/Provider contracts and compare actual application + model save, override, reset and reopen behavior against the accepted application artifact. + Process placement, IPC and storage layout are unchanged; no full performance recapture is + required. Catalog bootstrap and the other native/configuration owners still keep G4 open. + +Validation: 83 affected files/1,125 checks pass under Electron Node with native SQLite required; +the modified configuration fixtures and E2E pass scoped types. Normal build, app node/web types, +format, lint and i18n pass. A temporary bundled-import probe loads the settings wrapper and +Provider model helper with both `electron` and `electron-store` forbidden. This does not establish +that the complete Provider graph is portable: catalog bootstrap still imports Electron. + +The immutable `38306fcda` application artifact passes the new model-store E2E in 6.9 s. The migrated +application passes the same case in 6.6 s: atomic custom-model/override save, graceful exit/reopen, +persisted values, reset/removal, another reopen, and unchanged legacy JSON contents throughout. +All five selected application cases pass in 43.8 s, including launch, obsolete-plugin repair, +plugin-startup failure and encrypted legacy unlock/rekey/disable. These are functional observations, +not a speed claim. Evidence and original diagnostic attempts remain under +`.deepchat/rutis-g4-provider-config-acceptance/`. Full native Windows/Linux application behavior +remains unverified locally. G4 remains active for the remaining configuration and host contracts. + +### MCP and ACP configuration bootstrap + +Both settings classes require storage at construction. Main creates the existing named files +from pure default builders. These retain +platform-specific MCP defaults, secret-operation dependencies, startup normalization, legacy +import and database attachment order. ACP's live Agent mutations already use the unified database +repository. Capture registry/manual/install legacy data into an isolated read-only snapshot at +attachment and remove unused legacy mutation entrypoints. Enabled/version/shared MCP selections +remain database-backed. G5 transfers configuration and its database owner together without a +writable Main shadow or per-key IPC. + +- [x] Replace default construction and all real callers, fixtures and exports; preserve MCP + configuration transactions and ACP migration behavior. +- [x] Compare actual MCP and ACP configuration changes across graceful exit/reopen, validate + affected settings/migration/plugin contracts, and verify the settings modules load without + Electron. No process, IPC, layout or storage schema change requires a full resource capture. + +The attached ACP adapter copies legacy input, returns isolated read values and rejects legacy +writes/deletes. A rejected mixed-key batch fails before changing database settings. Seven unused +legacy mutation/access helpers have been removed; actual Agent mutations continue through the +unified repository. Normalization still runs before database attachment and its migration snapshot. +Legacy config import reads the extracted source files and applies database payloads, so it does +not require an active writable JSON adapter. + +Validation: 30 native affected files/380 checks and the separate config-import file/six checks pass +under Electron Node with native SQLite required. Nine plugin files/201 checks pass under normal +Node, matching their child-process fixtures. Modified settings/plugin/E2E scoped types, app node/web +types, normal build, format, lint and i18n pass. A temporary bundled probe constructs both settings +classes and defaults with `electron` and `electron-store` forbidden. The initial combined run used +Electron's executable for Node-only hook fixtures and failed six child-process cases; the correct +Node run passes. That diagnostic and the corrected snapshot-test fixture failure remain in the +acceptance directory. No runtime timeout or environment guard has been relaxed, and no owned hook +process remains. + +The normal build refreshes the generated Provider catalog; three catalog files/50 checks pass. +The generated data is retained in its own commit so the configuration change can be reviewed +independently. + +The immutable `ec82c12b4` application passes the same new configuration E2E in 6.6 s; the migrated +application passes in 6.9 s. It adds a disabled MCP server and manual ACP Agent, updates Agent +configuration and shared MCP selection/global availability, reopens and checks persistence, +removes/resets the configuration, reopens again and verifies absence. Legacy MCP/ACP JSON bytes +remain unchanged. All three selected app cases pass in 27.0 s, including encrypted database +legacy unlock/rekey/disable and native MCP credential/settings-window ownership. These are +functional results without a timing gate or speed claim. Evidence is under +`.deepchat/rutis-g4-mcp-acp-config-acceptance/`. Normal generated catalog refreshes are retained +separately. Catalog bootstrap, other native dependencies and the cohesive writer move keep G4/G5 +open; full native Windows/Linux application behavior remains unverified locally. + +### Provider catalog and request bootstrap + +Remove native dependencies from Provider catalog/settings and HTTP execution bootstrap as one +dependency group. Main supplies the profile/catalog resource paths and default request headers; +the existing locale capability remains live. Package the one built-in catalog outside ASAR for +ordinary Node access. Separate Copilot token exchange from native device-login presentation. +Catalog import stays inert until explicit bootstrap. Retain existing cache ownership, privacy, +TTL, payload limits and request/error behavior. The existing Main idle Provider task owns automatic +refresh, so maintenance cancellation/drain also fences it. Stop and drain all refreshes at shutdown +and fence late writes/publications. + +- [x] Replace actual bootstrap/header/token imports, every affected caller and fixture, and + packaged resource wiring; remove the old native paths and header helper. +- [x] Validate catalog refresh/lifetime, HTTP metadata and token/security contracts, compare + matching real-app operations, verify ordinary Node imports/resource access and run the + affected application/static/package checks. No speed claim is part of this slice. + +The affected Provider, Device, image-cache, package and startup/app-boundary suites pass 1,165 +checks across 81 files with native SQLite required. Durable checks cover inert explicit bootstrap, +unchanged request metadata, token sanitization, absolute image-cache roots, three-platform catalog +resource validation, real refresh drain and late response/body fencing on shutdown or task +cancellation. Ordinary Node imports of Provider settings, Copilot HTTP and the AI SDK Provider pass +with Electron and electron-store forbidden. App/scoped types, normal build, format, lint and i18n +pass. Normal ACP registry refreshes remain in a separate generated-data commit. + +The immutable `7fb11102f` application passes the matching catalog/request E2E in 2.4 s; the migrated +application passes in 2.1 s. Four migrated application checks pass: catalog/header bootstrap, +held-refresh graceful shutdown/reopen without late cache writes, model persistence without legacy +JSON writes, and encrypted legacy unlock/rekey/disable. Evidence is under +`.deepchat/rutis-g4-provider-bootstrap-acceptance/`. These are functional observations. No process +topology, cache schema or data-volume change requires a performance capture, and no performance +suite was repeated. The one built-in catalog moves outside ASAR; package/resource checks cover +ordinary Node access. The existing `7fb11102f` required and all six package CI checks pass; the new +checkpoint still needs its own CI results. G4 remains active and G5 has not started. + +### ACP execution bootstrap + +Remove native version/home/temp lookups from ACP process, terminal and session-persistence owners +as one dependency group. Supply plain bootstrap through the actual lazy runtime composition; make +the existing path-expansion/default-path helper pure and retarget its ACP and MCP callers. Keep +the current launch, containment, protocol, persistence and process cleanup behavior. +The complete Provider import graph also requires passing Ollama's existing TLS debug policy from +Main through its environment port; retain the existing host decision and secure production default. + +- [x] Replace actual bootstrap/helper wiring and remove direct Electron dependencies and unused + native helper methods; do not retain an implicit native construction fallback. +- [x] Compare matching real-app ACP execution on immutable and migrated builds, validate affected + execution/session/terminal/MCP contracts and ordinary Node imports, then run required static + and package checks. No process/IPC/data-volume change or performance claim is selected. + +Main supplies application version and absolute home/temp roots through the existing lazy ACP owner, +client and process manager. Terminal and persistence owners receive their roots explicitly. The +shared helper now exports two pure path functions; its singleton and two unused native methods +are removed. Windows process hiding depends on the target platform rather than Electron presence. +Ollama receives the unchanged host TLS decision through the Provider environment. A host-denied +pull stays secure even if the backend's ambient debug flag is set; an explicit host grant allows +the existing debug behavior. The app's native TLS policy helper remains with Main. + +The final affected Electron suite passes 1,454 checks across 108 files with native SQLite required; +the real PTY auth case separately passes under ordinary Node, for 1,455 checks across 109 files. +The generated catalog suites also pass 59 checks. App types, normal build, final app build, +format/check, lint and i18n pass. Bootstrap validation, supplied terminal roots, protocol version, +session restoration, PATH precedence and TLS host-policy checks retain durable coverage. Four +ACP/core imports and the complete ProviderRuntime module graph load under ordinary Node with +Electron and electron-store forbidden. This proves import portability, not a composed headless host. + +The immutable `a217ff4e5` app passes the matching ACP protocol/structured-answer E2E (7.1 s); the +final app passes (7.7 s). The final group passes three cases in 14.6 s: ACP owning-prompt/child-output +behavior, Provider catalog/header bootstrap, and held-refresh shutdown/reopen without late writes. +ACP settings routes and encrypted legacy unlock/rekey/disable also pass in the preceding app +selection. Timings are functional observations. No performance suite or resource capture was run. +Evidence is `.deepchat/rutis-g4-acp-runtime-acceptance/`; immutable baseline hashes are verified. +Initial failures retain their logs: two tests spied on the deleted helper, and the exact-environment +PTY case needed its ordinary Node executable. No production timeout or security rule was relaxed. +The broader Provider import probe exposed the native TLS helper; passing its host policy removes +that dependency. Normal generated catalog data is retained separately. G4 remains active, and +native Windows/Linux full-app behavior and the cohesive G5 backend/writer move remain unverified. + +### ACP registry ownership and bootstrap + +Main supplies the registry's explicit profile/resource directories and native icon-fetch capability. +AgentSettings receives that owner directly. Load local catalog data without detached network work; +automatic refresh belongs to the existing Main startup task, and manual refresh retains route +ownership. Stop, cancel and drain before database disposal; fence late cache/icon writes, repository +updates, Provider refresh and events. Package one registry/icon snapshot outside ASAR. + +This migration characterizes actual refresh/icon persistence on the immutable application before +implementation, because its network, cache and repository effects must retain one owner. + +- [x] Replace actual registry construction, asset paths, startup/shutdown ownership and refresh + cancellation; remove native imports, cwd fallback and detached initialization. +- [x] Compare real refresh/icon/reopen behavior, validate late replies and task/shutdown fencing, + preserve privacy/TTL/URL/SVG contracts and run affected static/native/package checks. + +Main constructs the registry with absolute profile/built-in roots and a URL-checked, cancelable +native icon-text capability. The service and AgentSettings import no Electron or electron-store; +there is no cwd resource fallback. Initial loading is local. The existing idle Provider task owns +automatic registry and model-catalog refresh concurrently and waits for both to settle before +ending. Registry refresh is single-flight through its service and repository/Provider/event +continuations. Shutdown aborts it and drains actual work; task cancellation fences every late +effect without stopping the owner needed after maintenance. A manifest becomes committed after +its icon work settles, and cancellation cannot prune icons or replace the acknowledged catalog. + +The affected native suite passes 106 checks across eight files, including held headers/body/icon +responses, caller cancellation and fresh reuse, actual drain, late repository/Provider completion, +privacy/TTL, SVG/checksum normalization and three-platform package asset validation. App/scoped +regression types, normal build, format/check, lint and i18n pass. Registry, AgentSettings and the +complete ProviderRuntime module graph load in ordinary Node with Electron/electron-store forbidden. +The one bundled registry/icon snapshot moves outside ASAR; the package hook validates ordinary +files for the manifest and all declared registry icons. Unused implicit-resource constants are +removed. Normal builds introduce no generated-catalog diff in this slice. + +The immutable `45cbdf4c0` app passes the matching refresh/icon/persistence E2E in 4.6 s; the migrated +app passes in 4.4 s. Four selected app scenarios pass in 27.6 s, including real registry refresh, +sanitized icon cache, graceful reopen, unchanged legacy JSON, held-refresh shutdown/reopen without +late catalog or Agent writes, ACP prompt/child-output behavior and encrypted legacy unlock/rekey/ +disable. Timings are functional observations; no performance suite or resource recapture was run. +Evidence is `.deepchat/rutis-g4-acp-registry-acceptance/`. Full native Windows/Linux application +behavior is unverified locally, and the new packaging layout needs its exact-head CI evidence. +This slice owns registry refresh. ACP installation/prewarm jobs and remaining host/writer +dependencies remain G4 work before the cohesive G5 cutover; G4 is not complete. + +### ACP installation and launch preparation ownership + +Own explicit installation, enable-triggered preinstallation, repair, uninstall and binary launch +preparation through one installation resource. Coalesce identical work, serialize conflicting work +for one Agent, propagate cancellation through download/body/extraction boundaries and await real +settlement. Stage and validate a replacement before changing the installed directory. Track the +repository/Provider continuations, fence stale descriptors and preserve the previous acknowledged +install state on canceled work. The existing database admission gate also governs background work; +its local callback moves with the Store in G5 rather than becoming synchronous IPC. + +Characterize actual binary install/reopen behavior on the immutable application before replacement, +because the same cache files and persisted install state must retain a single owner. + +- [x] Connect installation/launch cancellation, actual drain and maintenance/stop admission to + the existing service and callers; preserve prompt enable acknowledgement and archive guards. +- [x] Compare installation/reopen, canceled late bodies, failed repair and maintenance recovery in + the app; run relevant native/static checks and remove the unowned background continuations. + +Install, repair and implicit launch share the existing physical installer. It admits at most 32 +physical installations, coalesces matching work and queues repair behind an ordinary install. +Uninstall reserves its Agent before awaiting canceled work. The Settings owner tracks actual +installation, launch, uninstall and derived Provider lifetimes; stop and database maintenance drain +them before writer teardown. Descriptor changes cancel prior work. Cancellation restores only an +unchanged pending SQL state and cannot publish a late installed/error result. Main supplies the +existing local database admission check; enable still acknowledges before background installation. +Replacements use validated staging and the existing directory activation/rollback helper. A failed +repair retains the original binary; ordinary interrupted activation can restore its `.prev` tree. + +Validation: **244 checks across 20 files pass**, with native SQLite required for the 16-file +affected group (176 checks); four generated-catalog files add 68 checks. App/scoped types, normal +build, final application build, format/check, lint and i18n pass. Installer, AgentSettings and the +complete ProviderRuntime module graph import in ordinary Node with Electron/electron-store +forbidden. The build-generated Provider catalog is retained separately. + +The immutable `3ede3013a` app passes the matching binary install/repair/reopen case (4.2 s); the +candidate passes (4.6 s). Six real-app cases pass in 34.8 s: acknowledged binary persistence, +held-repair graceful shutdown with no late replacement/state commit, database maintenance drain, +failed repair preserving the old binary, post-maintenance repair/reopen, registry refresh/shutdown +and encrypted legacy unlock/rekey/disable. The maintenance case also passes with public uninstall +and persisted `not_installed` verification (5.2 s). These are functional observations without a +timing gate or speed claim; no performance suite/resource capture was repeated. Immutable baseline +hashes match the accepted registry candidate. Evidence is +`.deepchat/rutis-g4-acp-installer-acceptance/`. + +The preceding `45cbdf4c0` required run `40458182691` and all six packages `40458182714`, including +package-required `122042123850`, pass before the registry checkpoint is published. The published +registry head `3ede3013a` passes required `40462217782`/barrier `122051412704` and all six packages +`40462217827`/barrier `122055725559` before this checkpoint is published. This installer checkpoint +still needs its own CI results after publication. Full native Windows/Linux app +behavior, power loss across filesystem activation/SQL publication and moving synchronous archive +extraction out of Main remain unverified. Remaining configuration/host/writer contracts keep G4 +active; G5 has not started. + +### Background execution helper ownership + +Replace the global Electron-aware proxy with one explicitly composed background execution owner. +Supply its typed helper command/event/lifecycle capability from Main, using the existing Scheduler +adapter pattern. Inject that owner into Bash, Tool and Skill consumers. Preserve the dedicated +helper, child/session leases, authority checks and output/Skill-tree cleanup. Fence pending startup +and post-authority continuations during shutdown, await real callbacks and reject terminal restart. +Do not add another process supervisor or generic launch endpoint. + +Characterize the real app's exec/process feedback and child cleanup before replacing ownership, +because command dispatch and helper lifetime must remain identical across the cutover. + +- [x] Compose the helper capability and one owner; replace all implicit singleton/native fallback + wiring and retain process/session recovery contracts. +- [x] Verify ordinary exec/process feedback, cancellation, held startup/authority shutdown and + restart boundaries; compare the actual app and validate affected callers and packaging. + +Main composes one BackgroundExecService with an absolute approved helper entry and a cancelable +native launch adapter. Bash, process tools and Skill execution receive that same owner. The owner +retains actual startup, authority callbacks, RPC and rejected Skill-tree cleanup; terminal stop +cannot restart the helper. Late events from an old helper cannot affect its replacement. Root +shutdown first cancels hydrated Harness generations without reading the database, then stops +command admission. Actual helper/callback cleanup drains before Skill owners and the writer close; +a failed drain cannot become a logged-and-continued teardown step. + +Validation: **988 checks across 36 affected files pass** under Electron with native SQLite required. +App and new regression/E2E types, normal/final application builds, format/check, lint and i18n pass. +The existing ported legacy fixtures retain 107 type errors on both an isolated immutable baseline +source tree and the candidate, with no new diagnostics; these are not represented as passing typed +fixtures. Runtime suites pass. No check, timeout or native-import guard was relaxed. + +Background execution, Skill execution, ProviderRuntime and the actual Harness entry import in +ordinary Node with Electron/electron-store forbidden. The 350-module Harness graph has no native +imports; this verifies module loading, not a composed headless backend or a relocated writer. + +The immutable `edfb8ab43` app passes matching exec/process completion and active-child shutdown/ +reopen cases (5.1/4.8 s); the final candidate passes (5.3/5.0 s). Six final app cases pass in 34.3 s, +including held helper startup shutdown with no command or subsequent model round, child exit and +persisted message recovery, encrypted legacy unlock/rekey/disable and shutdown while native +credential/database maintenance work is held. The held-start case exposed and verifies the early +in-memory generation cancellation requirement. Timings are functional observations only; no +performance/resource suite was repeated and no speed gain is claimed. Evidence is +`.deepchat/rutis-g4-background-exec-acceptance/`. + +The installer baseline `edfb8ab43` passes required `40464593274`/barrier `122059109164` and all six +packages `40464593265`/barrier `122065276883` before this checkpoint is published. Background head +`12a73394f` passes required `40467842999`/barrier `122069829980` and all six packages +`40467843051`/barrier `122075929024`. Native Windows/Linux full-app behavior, Code Mode and other +desktop capability ports, remaining Store ownership and the cohesive backend move remain open. +G4 is active; G5 has not started. + +### Code Mode helper and callback ownership + +Supply the existing Code Mode manager with a required approved helper capability. Keep native +launch configuration, events and bound RSS reads in Main; retain VM/protocol/journal bounds and +session state semantics. Reserve pending startup before any await, track actual callback lifetime +through cancellation and close/drain it before Store teardown. Coalesce RSS reads and fence old +cells without adding a generic process supervisor. + +Characterize actual Code Mode nested execution and isolated VM globals before the +host boundary changes, because tool feedback and journal commitment must remain compatible. + +- [x] Inject the host capability through ToolService; remove native defaults and own pending + startup, sampling and nested callbacks across cancel/shutdown. +- [x] Compare real Code Mode execution/reopen and held readiness shutdown; verify concurrency, + memory limits, lifecycle faults and affected Tool/Harness contracts. + +Main supplies the approved absolute helper entry and a plain host channel through ToolService. +The adapter retains the restricted environment, 64 MiB heap and unsigned-library policy; RSS +reads are bound to that helper rather than an arbitrary PID. The manager retains the existing +READY deadline, heartbeat, source/output bounds, 512 MiB hard RSS limit, execution journal, +permission retry and frontend-specific state semantics. Native imports and path guessing are +removed from the manager. + +Session startup is reserved before asynchronous effects. Cancellation returns promptly while +the owner retains actual startup completion and compensates a late host. Stop closes admission; +shutdown drains actual nested-tool and coalesced RSS callbacks before Skill/Store teardown. +Aborted callbacks cannot publish a late result. Main invokes this critical drain directly rather +than logging a failure and continuing to close the writer. + +Validation: **547 checks across 10 affected native suites and 23 generated-catalog checks across +two files pass**. App and scoped native-adapter/manager/E2E types, normal/final application builds, +format/check, lint and i18n pass. Regression cases cover concurrent startup, canceled startup +reuse, late host compensation, uncooperative nested callbacks, actual RSS drain/coalescing and +the unchanged READY and RSS limits. The touched manager fixtures also pass strict typechecking. + +The immutable `12a73394f` app and candidate pass the same nested execution, cell-global isolation +and persisted-message reopen scenario; the final exact-assertion comparison passes in 6.4/5.2 s. +Seven candidate app cases pass in 33.9 s, including held Code Mode READY shutdown with helper exit +and no subsequent tool/model round, background execution completion/shutdown/held startup and +native credential/database-maintenance shutdown holds. The function frontend is exercised in +the app; Codex store/yield/permission semantics remain covered by the VM/manager suites, without +claiming an authenticated Codex account E2E. + +The manager, actual 350-module Harness entry and ProviderRuntime import in ordinary Node with +Electron/electron-store forbidden and no native imports. This establishes module loading, not a +composed headless backend or a relocated writer. Evidence and artifact hashes are in +`.deepchat/rutis-g4-code-mode-acceptance/`. The normal generated Provider catalog refresh is retained +separately in `f560f941e`. No performance/resource suite was repeated, no timing gate was added and +no speed gain is claimed. The preceding `12a73394f` CI completed before publication. Code Mode head +`32f457ff7` passes required `40473854228`/barrier `122089643930` and all six packages +`40473854200`/barrier `122095514524`. +Remaining desktop/Store boundaries keep G4 active; G5 is unstarted. + +### Agent Tool host inputs + +Supply AgentToolManager's existing desktop port with explicit absolute temporary/profile-temporary +roots and an asynchronous image-dimension capability. Keep nativeImage and app paths in Main; +remove native imports from the business manager. Preserve the existing runtime directory allowlist, +default-workspace creation/fallback, file/symlink checks, image metadata and vision selection. +Recheck cancellation after the host result and before cache/Provider effects. Native image objects +and generic path/root discovery must not cross the boundary; do not introduce a second supervisor. + +- [x] Replace native defaults with required host inputs at the actual ToolService composition. +- [x] Compare real image metadata/text-read/reopen behavior against the accepted app; validate + injected roots, metadata failure, cancellation and affected Tool/Harness contracts. + +Main supplies the existing system/profile temporary roots and native image-size probe through the +required desktop port. The manager validates absolute roots and uses them for the unchanged read +allowlist and default-workspace fallback. It awaits dimensions, preserves unknown-metadata failure +behavior and checks cancellation before preview caching or vision work. The probe returns only +numeric dimensions. The settings-window consumer keeps its original three-method subset rather than +receiving image/filesystem capabilities. Seven obsolete native mocks are removed from pure Tool +suites; ToolService still imports the separate plugin policy Store and is not claimed portable. + +Validation: **689 checks across 14 affected native files and 23 generated-catalog checks across +two files pass**. App and new E2E types, normal/final application builds, format/check, lint and +i18n pass. Durable cases cover supplied roots, default workspace, approval for unrelated files, +metadata failure and cancellation of a delayed image result before cache/Provider effects. The +existing vision preference, journal, symlink and permission suites remain green. No production +guard or timeout was relaxed. + +The same actual image metadata, workspace read and persisted-message reopen scenario passes on +immutable `32f457ff7` and the final candidate (both 5.3 s). Four final app cases pass in 21.0 s, +including background process feedback, Code Mode nested execution and held-READY helper shutdown. +All profiles are disposable and the Provider fixture is local. Artifact hashes and evidence are in +`.deepchat/rutis-g4-agent-tool-host-acceptance/`. +The normal generated Provider catalog refresh is retained separately in `c4f306e01`. + +AgentToolManager's 126-module graph, the actual 350-module Harness entry and ProviderRuntime import +in ordinary Node with Electron/electron-store forbidden. This proves module loading, not a composed +headless backend or relocated writer. Native image decoding retains its current synchronous Main +placement. No performance/resource suite was repeated and no latency or memory gain is claimed. +The preceding `32f457ff7` required and six-platform CI completed before publication. This target +retains the accepted CI evidence below. Remaining configuration and native/Store ports keep G4 +active. G5 has not started. + +Agent Tool head `f0ca555fe` passes required `40478827867`/barrier `122106538990` and all six +packages `40478827913`/barrier `122113041876` before the policy checkpoint is published. + +### Portable application settings file owner + +Make the existing application settings file constructible by the future backend without Electron. +Keep its storage engine, defaults, filename, migration behavior and database attachment contract. +Main supplies required absolute profile/home paths and the current application version. + +- [x] Connect the portable factory to actual Main startup and remove the old app-settings native + factory. Keep the same SettingsStore instance and database-backed routing after attachment. +- [x] Validate legacy JSON, unknown fields, dot paths, corrupt-file rejection, defaults, database + routing and real configuration/credential persistence across graceful relaunch. + +The factory uses `conf@15.1.0`, the exact engine already resolved beneath ElectronStore 11.0.2. +It is now an explicit dependency; the lockfile adds only its root importer entry and resolves no +new engine/package version. `configName`, absolute `cwd` and `projectVersion` replace the native +wrapper's name/path/version mapping. The same defaults remain in the existing settings module. +No replacement JSON serializer, file format, watcher, cache, writable shadow or generic Store RPC +is introduced. Other desktop-owned ElectronStore files retain their existing owners. + +Sensitive and portable settings still route through AppSettingsDbBackedStore after the existing +migration and database attachment. Machine-local keys retain the same file adapter. Main remains +the active writer in G4; the portable constructor does not establish the G5 exclusive handoff or +allow Main and the backend to write different keys concurrently. DesktopSettings/AppSettingsService +still need native observation/effect and acknowledged snapshot/mutation contracts. OS login state +comes from the native API; it is not a persisted preference to copy into a second settings store. + +Validation: **184 checks across 16 affected native files, eight renderer icon checks and 14 +generated-catalog checks across two additional files pass**. Native SQLite is required for the +affected native group. Coverage includes +the six real-file/bootstrap contracts, config migration, attached settings/metadata, private crypto, +database security, public settings, onboarding and Sync settings. App and modified unit/E2E types, +the normal build, format/check, lint and i18n pass. The new file-contract suite explicitly uses the +real filesystem instead of the repository's default fs mock. + +The immutable `cd7cc392f` app and integrated candidate pass the same final legacy/bootstrap/credential/relaunch +workload (5.8/4.8 s). Both use the current package version and resources. It uses an owned profile with an old version, custom workspace and unknown +extension data, updates file-backed language/UI/limits and a database-backed preference, then +reopens with each value retained in its original store. A disabled loopback cloud configuration +keeps its secret wrapped on disk and readable after relaunch without rewriting the ciphertext. +No external service/account or OS login registration is modified. The comparison restores and +hash-verifies the candidate output after the frozen-baseline run; no output swap remains active. + +The settings factory graph (three modules) and database adapter (two) load with Electron and +electron-store forbidden at build/runtime. A real factory creates and writes the legacy file in +ordinary Node. This establishes a portable configuration owner, not a composed headless Harness +or relocated writer. No performance/resource capture or speed claim is added. The branch includes +`dev` at `b62eb0d2b`, including CloudGPU and `1.1.4-beta.7`. Its new Provider fixtures receive the +same required host environment as existing providers; no production fallback is added. App/scoped +types, build and matching application evidence validate this integrated source. The normal build's +Provider catalog refresh is retained. Evidence is `.deepchat/rutis-g4-settings-owner-acceptance/`. + +This checkpoint needs its own exact-head CI after publication. The Hook baseline `cd7cc392f` +passes required `40623544678`/barrier `122604697934` and all six packages `40623544682`/barrier +`122608652902` before this settings-owner checkpoint is pushed. G4 remains active; G5 is unstarted. + +### Hook metadata and command lifetimes + +Keep Hook configuration, subscriptions, enrichment and command ownership together. Supply the +application version from Main for both normal and test payloads. Diagnostic acknowledgement must +not release a native command that still owns open stdio or an accepted Session lookup. + +- [x] Remove HookService's Electron dependency and wire its required application version in the + actual Main composition, preserving the version-1 payload and command environment. +- [x] Retain child ownership through native close, including after timeout/error diagnostics; + stop admission and await accepted enrichment and child completion before Store teardown. +- [x] Compare the existing configuration/test/relaunch workload and verify actual shutdown with + a real model-triggered Hook whose descendant keeps the command's stdio open. + +The existing owner keeps per-session event eligibility/order and concurrent command execution. +Stop sends the existing shell termination signal and waits for actual child/stdio closure and +accepted enrichment. A 30-second drain failure rejects maintenance/shutdown; restart rejects while +prior work remains owned. New explicit test commands reject after stop. Main awaits Hook stop +directly before later teardown, so its failure cannot be swallowed by best-effort cleanup and +permit database closure. Command timeout diagnostics, output bounds/redaction, configuration +persistence, accepted subscriber identity and stopped-event suppression remain compatible. + +Validation: **530 distinct checks across five affected files pass**, with native SQLite required +for the affected group. The final four-file group passes 515 checks, and the RuntimeHookSink's +15 checks pass on the same production sources. App and modified Hook/unit/E2E types, the normal +build, format/check, lint and i18n pass. Durable cases cover both supplied-version payloads, +timeout/error acknowledgement before native close, blocked late test commands, failed drain/restart, +late enrichment suppression and successful restart after prior work finishes. + +The immutable `b7a50e3aa` app and candidate pass the same configuration/test/version/relaunch +workload (6.7/7.0 s). A separate baseline characterization reproduces premature shutdown: the +application closes while the real Hook descendant remains alive and holds stdio. The candidate's +same native-lifetime regression passes in 4.8 s: actual loopback Provider execution emits a +SessionStart payload with the native application version, shell termination leaves the descendant +holding stdio, the app remains alive until the fixture releases that child, shutdown is graceful, +and relaunch does not replay the Hook. Both candidate cases pass in 11.9 s. The baseline failure +and traces are retained. The existing direct-shell signal policy is unchanged; this cutover adds +no detached process group or descendant-tree termination guarantee. Missing close fails the drain. + +HookService (one module), HookSettings (two) and routes (85) load in ordinary Node with +Electron/electron-store forbidden at build/runtime; a plain Hook owner also starts/stops there. +This is module-loading/owner evidence, not a composed headless backend. No schema, public route, +process placement, dependency, layout or performance claim changes. No performance/resource suite +is repeated. Evidence and immutable build hashes are in `.deepchat/rutis-g4-hooks-acceptance/`. + +Published Hook head `cd7cc392f` passes required `40623544678`/barrier `122604697934` and all six +packages `40623544682`/barrier `122608652902`. +The Project baseline `b7a50e3aa` passes required `40621219551`/barrier `122597419315` and all six +packages `40621219651`/barrier `122602071741` before the Hook checkpoint is pushed. G4 remains +active and G5 is unstarted. + +### Project bootstrap and native capabilities + +Keep Project snapshots, settings revisions and environment transactions with their existing owner. +Supply native system/profile roots, optional Documents/Home roots, directory selection and path +opening from Main. Do not introduce awaited native discovery inside a synchronous snapshot. + +- [x] Wire the required host into the actual ProjectService constructor and remove its Electron + import/native directory discovery. Retain the existing shared database and settings owner. +- [x] Validate managed-workspace fallback, native failures, environment mutations, Session clearing, + persisted revisions and the matching baseline/candidate application workload. + +Main resolves the native directories once at bootstrap and preserves diagnostics for unavailable +Documents/Home paths. Project rejects relative host roots and captures normalized candidates; +later host-object changes cannot alter the roots of a versioned snapshot. Candidate order remains +Documents, Home, then the profile's managed workspace. Existing custom defaults, lazy preparation, +directory-creation fallback and temporary-path classification remain compatible. Main supplies the +same DeviceService and shell operations through required asynchronous capabilities. Native picker +cancellation/failure does not commit a selection; shell error strings still reject the operation. + +Project removal still clears Session assignments, project/preferences and the environment projection +in one database transaction. Snapshot/settings reads remain in one uninterrupted turn, revisions +persist through the same SettingsStore, and no second writer/cache, public route, process, IPC or +schema is added. G5 must move this owner with the shared database/configuration authority and carry +only native selection/open operations over the desktop capability boundary. + +Validation: **249 checks across nine affected files and 41 generated-catalog checks across four +files pass**, with native SQLite required. App and modified unit/fixture/new E2E types, the normal +build, format/check, lint and i18n pass. Durable host cases cover absolute roots, unavailable native +directories, stable captured candidates and selection failure without a mutation. Existing snapshot, +transaction, concurrent selection, Session lifecycle and authenticated route checks remain green. + +The immutable `c6758fe56` app and candidate pass the same Project/native-boundary/persistence +workload (5.0/5.8 s). It uses only an owned disposable profile, seeds a custom default before first +launch and creates the managed workspace beneath that profile. Cancellation, selection, open-path +error propagation, reorder/archive/restore, removal clearing a Session/default, graceful shutdown +and exact snapshot/revision persistence on relaunch pass. Native dialog/shell results are supplied +at the Electron API boundary; physical picker interaction and launching a file manager are not +exercised. The fixture's profile preparation is restricted to its owned profile before first launch. +Project (three modules) and its route graph (86) load in ordinary Node with Electron/electron-store +forbidden at build/runtime. This is module-loading evidence, not a composed headless backend. + +No performance/resource suite is repeated and no speed gain is claimed. Normal generated Provider +and ACP registry refreshes are retained separately. Artifact hashes and evidence are in +`.deepchat/rutis-g4-project-acceptance/`. Published head `b7a50e3aa` passes required +`40621219551`/barrier `122597419315` and all six packages `40621219651`/barrier `122602071741`. +Remaining Store/configuration and desktop boundaries keep G4 active. G5 is unstarted. + +The MCP App baseline `c6758fe56` passes required `40498105485`/barrier `122171636540` and all six +packages `40498105509` attempt 2/barrier `122594009042` before this Project checkpoint is pushed. +The single failed-job retry resolves a runner DNS failure downloading pinned Rust; production +checks, timing budgets and source remain unchanged. + +### MCP App registry and desktop adapter + +Keep one registry for instance/source/consent authority. Move native protocol, window observation, +link opening and session permissions to the Main adapter. Require owner observation before creating +an App; bound creation reservations with the existing instance limits and invalidate them on owner, +server and maintenance revocation. Keep authorization and source validation beside the registry. + +- [x] Connect the native-free registry/host to required desktop capabilities and asynchronous + native policy/permission commands; remove the old native registry wiring. +- [x] Compare real App hydration, sandbox policy, consent, tools, source changes, window closure + and relaunch; validate lifecycle/security limits and ordinary Node loading. + +One native-free registry retains instances, source validators, pending consent and pending creation. +Reservations count against the existing 64-instance and 32-per-owner limits. Owner/server revocation +and maintenance clear cancel them and abort observation/metadata waits; the SDK resource request +receives the same owner signal. Late results cannot publish a view. Shared MCP connection startup +and execution remain with the existing server owner. Creation always releases its reservation. + +Main's protocol adapter observes the actual native owner before App hydration and revalidates its +window identity before protocol responses, permission callbacks and approved links. It receives +only policy, browser-permission and owner-revocation business operations. Protocol policy is a +plain isolated projection; browser permission decisions remain with the one registry and require +current source/owner state after consent. Native callbacks settle once even if the caller disappears. +First-party/default-session behavior, separate sandbox origin, CSP, consent bounds/timeouts and +the absence of standing browser grants remain compatible. The old native registry imports, +observer and session-permission implementation are removed; their native adapter is wired by default. + +Validation: **964 checks across 34 affected files and 23 generated-catalog checks across two files +pass**, with native SQLite required. App and all affected MCP unit/new E2E types, normal/final app +builds, format/check, lint and i18n pass. Durable cases cover pending-creation capacity and release, +owner/server/maintenance cancellation, resource reads whose SDK ignores cancellation, revoked +approval, isolated policy, late native policy responses and single native callback settlement. + +The immutable `ef4e8052a` app and final candidate pass the same real model/MCP/persistence/native +protocol/consent/relaunch workload (6.7/6.3 s). A model tool call creates the saved App source; +actual protocol responses retain CSP and permission headers. App tool calls, settings-window +rejection, explicit link allow/deny, graceful shutdown with pending consent, reopening saved sources +and deletion making a saved App inert all pass. The native browser launch is recorded at the shell +boundary; external browser navigation and physical camera/microphone access are not exercised. +The three final policy, stdio and App cases pass in 28.1 s. Timings are functional observations, +without performance gates, resource recapture or speed claims. The normal generated Provider +catalog refresh is retained separately in `5a79f205d`. + +Registry (one module), AppHost (five), the full McpService module graph (34), ToolService (204), +actual Harness entry (350) and ProviderRuntime (131) import in ordinary Node with Electron and +electron-store forbidden at build/runtime. The native protocol adapter remains in Main. This +establishes module loading, not a composed headless backend or a relocated writer. G5 must move +the registry with its source and permission authority, keeping source closures/signals local and +transporting desktop policy/permission/ownership operations through the private gateway with +generation fences. Artifact hashes and evidence are in `.deepchat/rutis-g4-mcp-apps-acceptance/`. +G4 stays active and G5 is unstarted. Published head `c6758fe56` passes required `40498105485`/barrier +`122171636540` and all six packages `40498105509` attempt 2/barrier `122594009042`. + +The preceding MCP environment head `ef4e8052a` passes required `40493590061`/barrier `122156301597` +and all six packages `40493590206`/barrier `122162440119` before this App checkpoint is published. + +### MCP runtime environment + +Supply the existing MCP client and registry probe with required host values and capabilities. +Keep one toolchain owner, preserve live command/PATH selection, home expansion, client identity, +environment isolation and child cleanup. Remove runtime Electron/proxy imports and singleton lookup; +keep native discovery and proxy resolution at composition. Process placement is unchanged. + +- [x] Connect explicit home/version/toolchain and proxy capabilities to every production caller. +- [x] Compare real stdio MCP initialization, command/environment/cwd, calls, restart and cleanup; + validate existing MCP, toolchain and lifecycle contracts and ordinary Node loading. + +Main supplies the absolute home directory, application version and existing ToolchainService owner +to McpService and every client. Commands, configured runtime roots and PATH still read that owner's +current state. Registry probes use the current host proxy URL, including configured credentials, +through a required callback. The client no longer imports Electron or obtains a global toolchain; +the server manager no longer imports the native proxy module. Obsolete native/singleton test mocks +are removed. Native discovery and proxy resolution remain at composition. + +Validation: **976 checks across 36 files pass**, covering MCP transport/auth/settings/policy, +toolchains, plugin lifecycle, ToolService, Harness, composition, runtime bindings and generated +catalogs, with native SQLite required. App and affected MCP unit/E2E types, the normal build, +format/check, lint and i18n pass. Durable cases cover supplied home/version and absolute-path +validation plus live registry-proxy replacement. Environment restrictions, protocol deadlines, +process identity and cancellation tests remain enforced. + +The immutable `3b3890dad` app and candidate pass the same real stdio workload (7.3/7.5 s): public +custom-Node selection, home expansion, client identity, configured working directory and PATH +precedence, minimal-environment secret exclusion, tool calls, stop/restart, graceful close and +persisted relaunch. Every observed child exits. Normal candidate HTTP plugin-policy and stdio +cases pass in 20.9 s; both Code Mode helper cases separately pass. These are functional observations +without timing gates. The normal generated ACP registry refresh is isolated in `08ddc763f`. + +McpClient (18 modules), ServerManager (19), ToolchainService (13), full ToolService (204), actual +Harness entry (350) and ProviderRuntime (131) import in ordinary Node with Electron/electron-store +forbidden at build and runtime. This establishes those loading graphs; MCP AppHost presentation, +a composed headless backend and relocated persistence owners remain open. No process placement, +performance capture or speed claim changes. Evidence and artifact hashes are in +`.deepchat/rutis-g4-mcp-runtime-acceptance/`. G4 stays active and G5 is unstarted; publication and +exact-head CI remain separate acceptance evidence. + +### Plugin tool policy owner + +Move plugin policy reads and mutations into one required, native-free owner. Main constructs the +existing `plugin-tool-policies` file adapter; PluginService, MCP ToolManager/AppHost and ToolService +receive the same owner. Remove module-level native construction and global policy functions. +Preserve file shape, replacement/removal by owner, explicit allow/ask/deny, undeclared-tool closure, +ambiguity and disabled-owner behavior. Policy decisions remain local with the execution owners; +G5 moves this state with them and gives retained desktop writers acknowledged commands. + +- [x] Replace the global policy Store and retarget every production reader/writer to one owner. +- [x] Compare real MCP policy persistence, denied tools, ambiguous owners and disabled policies; + validate mutation failures, owner isolation and Tool/MCP/plugin contracts. + +Main supplies the existing named file adapter after profile selection. One native-free +PluginToolPolicyStore serves activation/migration/disable/shutdown writes and ToolService, MCP +ToolManager and MCP AppHost reads. The owner retains current backing-store reads without a second +decision cache. Owner/server replacement, owner-wide deletion, allow/ask/deny, undeclared closure, +ambiguity and disabled-record behavior remain unchanged. Legacy global functions and ToolService's +obsolete Electron mock are removed. Synchronous operations remain owner-local; G5 must provide +acknowledged mutations for any desktop writer retained outside the moved policy authority. + +Validation: **744 checks across 12 affected native files, 23 generated-model checks across two +files and 16 ACP registry checks across two files pass**. App and new owner-fixture/unit/E2E types, +the normal application build, +format/check, lint and i18n pass. Coverage includes persistence-error propagation, independent +owners, replacement/removal, policy ambiguity, existing plugin lifecycle/MCP App contracts and +current-policy `ask` enforcement even with full access. No production check or timeout is relaxed. + +The frozen `f0ca555fe` app and candidate pass the same real HTTP MCP fixture, stored policy file, +tool catalog filtering, permitted calls, ambiguous-owner rejection, disabled policy and relaunch +workload (13.2/13.3 s). Both comparison runs set the owned E2E profile before loading the unchanged +app entry: the old module-level native constructor ran before the application's profile override. +The driver restores the exact entry bytes afterward. This is test-profile isolation, not a policy +implementation or a performance comparison. Normal candidate startup additionally passes all +four app cases in 29.3 s, including Code Mode complete/held READY, Agent image/workspace reads and +the policy workload without that driver. No real user policy file is modified by the fixture. + +The policy owner, full 204-module ToolService graph, actual 350-module Harness entry and +ProviderRuntime import in ordinary Node with Electron/electron-store forbidden. MCP runtime and +native AppHost dependencies remain outside that claim; no composed headless backend or relocated +writer is established. Artifact hashes and evidence are in +`.deepchat/rutis-g4-plugin-policy-acceptance/`. No performance/resource capture or speed claim is +added. The new checkpoint needs its own exact-head CI. G4 stays active; G5 is unstarted. +The normal generated Provider catalog refreshes are retained in `1952466fd` and `8cabd095e`; the +latter also retains the ACP catalog's website update. + +The branch includes `dev` at `830745fec`, merged as `996efc3b0`. This preserves the upstream Code +Mode subagent contract fix: nested children retain their current authority under the frozen parent +entrypoint ceiling. Its two frontend fixtures use the branch's required public helper capability +and RSS method, with no private factory replacement. The merged app, contract/Tool suites and +matching policy workload are the final validation source; new CI must inspect this integrated head. + + +### Desktop appearance and native settings commands + +- [x] Require plain bootstrap locale and asynchronous theme/login/UI capabilities; remove + Electron imports and native listener ownership from DesktopSettings. +- [x] Route public appearance changes, display receipts and settings snapshots through the same + bounded owner queue; wait for native completion before success and change events. +- [x] Fence/coalesce system-theme observations and drain actual host work during maintenance + and shutdown. Compare the matching application behavior and preserve existing sender checks. + +AppSettingsService serializes appearance commands, display mutations, settings updates and reads. +Normal admission stops at 64 outstanding commands. A coalesced system observation has a reserved +position so saturation cannot lose the latest OS color; an event during active observation can +schedule one following observation. Previous-value display receipts are read inside that ordering +boundary. Native theme and login operations return observed values. Selected snapshots query login +only when requested; a stored login preference cannot replace the OS result. Invalid/fenced/full +commands reject before work, and failed commands do not acknowledge success or wedge the queue. + +Main supplies the Chromium application locale after readiness, NativeTheme operations, observed +login registration and awaited UI refresh. Floating UI receives the resolved locale/color directly, +avoiding a callback into the core command waiting for that host. Tab context menus retain the +resolved locale for new tabs. Main owns the NativeTheme listener, fences it during maintenance and +reconciles after startup/resume. Shutdown removes the listener and directly awaits settings stop +before event/storage teardown. Stop rejects queued/new commands and waits for active host work; +the unchanged 30-second lifecycle deadline leaves the owner fenced and prevents restart while +work remains. It is not a performance budget. There is no additional process, file writer, native +fallback, broad configuration snapshot or public protocol/schema change. + +Validation: **180 distinct checks across 14 files pass**: 165 in 11 affected native-enabled files +and 15 in three renderer state suites. Durable checks cover awaited effects, concurrent display +receipts, OS-observed login values, selected reads, failures, saturation including system events, +coalescing, shutdown and a timed-out native drain. The floating host applies resolved appearance +without reentering pending core work. App and selected owner/native-settings/floating/E2E types, +normal application builds, format, lint and i18n pass. The legacy dispatcher fixture runs in the +native group; it is outside the additional selected test typecheck. + +Immutable `592d32b92` and the final candidate pass the same three real-app cases (18.8/16.7 s): +settings revisions under frozen/rolled-back clocks, legacy file/database/credential persistence, +and desktop appearance/login/relaunch. Theme and Persian/English language changes update both +chat and settings windows. The locale manifest preserves `rtl` for Persian and `auto` for English. +The login setter is replaced at the native SDK boundary inside an owned disposable process: +requesting true can still observe false, and the unrelated stored true remains untouched. No real +OS login registration is written. Both variants close gracefully and preserve restored values on +relaunch. Times are functional observations; no performance/resource capture or speed claim is +added. Baseline and candidate use the same fixture, package version and runtime resources. + +The DesktopSettings graph (three modules) and AppSettingsService graph (87) compile, import and +execute in ordinary Node with Electron/electron-store forbidden at build/runtime. The probe +constructs both owners and exercises bootstrap, language/theme commands, a full settings read and +stop. This proves that boundary, not a composed headless Harness or relocated shared writer. +Immutable hashes, diagnostics and acceptance logs are in +`.deepchat/rutis-g4-desktop-settings-acceptance/`; the final output is restored and hash-verified. + +The settings-file baseline `592d32b92` passes required `40627565171`/barrier `122617966427` and all +six packages `40627565315`/barrier `122622838387` before this slice is published. This slice needs +its own exact-head CI. G4 remains active: font enumeration, logging/restart and other native/config +consumer contracts still require audit/extraction before G5's exclusive profile/writer handoff. +G5–G12 retain their full scope and conditional adoption rules. + + +### Font, logging and content-protection capabilities + +- [x] Move font enumeration and logging-directory access behind required asynchronous native + capabilities; keep normalization, cache and preference persistence with configuration. +- [x] Route font/folder requests and native content-protection/logging changes through the shared + settings queue. Publish success only after the corresponding native operation completes. +- [x] Give Main one restart intent for logging and content protection; remove both unowned timers + and the obsolete WindowPresenter restart callback. Exercise the actual application restart + teardown and preserve settings on relaunch. + +DesktopConfigurationHost uses the existing font-list implementation, the required absolute private +profile path and the Main logging gate. LoggingService and FontSettings no longer import native +platform packages. The existing font normalization, case matching, catalog cache and empty-catalog +failure behavior remain compatible. Public font lookup and folder opening enter AppSettingsService, +so actual native work belongs to its bounded command queue and drain. Main creates only the private +logs directory and checks the native folder-launch result; no renderer path is accepted. +Content-protection and logging mutations await their native effects before events and receipts. + +The native configuration host starts paused. One pending restart intent coalesces logging and +content-protection changes with the existing one-second delay. Main activates it after startup, +pauses it before maintenance drains, and resumes it after successful recovery, including the early +maintenance-rejection path. Shutdown closes it before any awaited teardown step, preventing a +pending timer from taking over a quit. A fired restart transfers to the existing shutdown +coordinator; closing the host never waits on its own restart. Closed hosts reject new work. +WindowPresenter now applies window flags without owning a restart timer or callback. There is no +additional process, supervisor, file writer, dependency, fallback or public schema change. + +Validation: **208 distinct checks across 17 files pass**: 179 native-enabled checks in 12 affected +files, 15 renderer state checks in three files and 14 generated-catalog checks in two files. +Selected owner/native-host/window/unit/E2E types and normal application builds pass. Durable cases +cover native completion and errors, fixed directory ownership, a close during directory creation, +font normalization/cache and actual pending-query drain, queued folder fencing, content/logging +acknowledgements, startup/maintenance pause-resume, shared restart coalescing, close cancellation, +failed restart reporting and transfer without self-deadlock. The legacy dispatcher fixture is +runtime-tested; its wider existing type debt remains outside the additional selected test typecheck. +Format, lint, i18n and app typechecks pass. + +Immutable `5635e8b14` and the candidate pass the same three real-app cases (22.0/21.9 s): settings +revision/clock behavior, desktop appearance/login/relaunch and the native font/logging restart +workload. Actual installed fonts populate the normalized cache and preserve selected families. +The logging-folder SDK boundary records the private path without opening an external folder. +Content-protection calls apply real window flags. The real delayed restart drains the application +and reaches relaunch/exit; the fixture observes those final native calls without spawning a second +app, then completes the intended process exit with code zero. Manual relaunch restores font, +content-protection and logging preferences and the native protected-window flag. Logging produces +the application shutdown record in the owned profile. These are functional observations, not a +performance claim; no performance/resource suite is repeated. + +DesktopSettings, FontSettings, LoggingService and AppSettingsService graphs (3/1/1/87 modules) +compile, import and execute in ordinary Node with Electron, electron-store and font-list forbidden +at build/runtime. The probe constructs all four owners and executes font discovery, canonical +selection, logging/content changes, folder access and stop through explicit host implementations. +This proves these boundaries, not a composed headless Harness or relocated shared writer. +Evidence and verified baseline/candidate hashes are in +`.deepchat/rutis-g4-font-logging-acceptance/`; the candidate output is restored after comparison. +The normal generated Provider catalog refresh is retained separately from the implementation. + +Baseline `5635e8b14` passes required `40630680323`/barrier `122628063550` and all six packages +`40630680405`/barrier `122632459124` before this checkpoint is published. The checkpoint requires +its own exact-head CI. G4 remains active: finish the concrete configuration/native-image/runtime +consumer and writer/reader audit before G5's exclusive profile handoff and cohesive backend move. +G5–G12 retain their full scope and conditional adoption requirements. + +### File preparation and native image actions + +- [x] Require an absolute profile root for FileService and remove its Electron dependency. + Preserve document/image adapters, validation, relative-read containment and generated-name + temporary image writes; await directory creation before the first write. +- [x] Keep save-dialog selection, clipboard decoding/writes and native HTTP image retrieval in + DesktopImageActions. Wire existing renderer routes directly to this Main capability. +- [x] Remove unused arbitrary profile write/delete and generic temporary-write methods. Keep + adapter creation private; the business port returns data rather than adapter instances. + +FileService owns Node-capable preparation and existing size/token/PDF/image behavior. Its explicit +profile root replaces app.getPath, and temporary writes no longer race constructor-side directory +creation. DesktopImageActions owns the existing data-URL, raw base64, image-cache and HTTP image +flows. Main retains Electron net.fetch and native image decoding, including existing MIME/filename +rules and fallback behavior. A canceled dialog performs no save; successful saves write the +original bytes to the selected target. NativeImage values remain inside Main. Existing public +schemas, sender checks and Main request admission/drain remain in place. No extra process, image +engine, dependency, generic filesystem route or fallback is added. + +Validation: **139 distinct checks across 10 files pass**: 125 native-enabled file/dispatcher/image +checks in eight files and 14 generated-catalog checks in two files. Durable image cases cover +dialog cancellation and selected-target byte preservation, encoded cache traversal, failed native +downloads and invalid clipboard decoding. App and selected file/image/unit/E2E types, normal build, +format, lint and i18n pass. The large legacy dispatcher remains runtime-tested; its existing wider +fixture type debt is outside the additional selected test typecheck. + +Immutable `36583fcfe` and the candidate pass the same real-app file/image workload (5.5/4.9 s). +The owned profile supplies actual text/PNG files. Real public routes prepare text and image +thumbnails, persist generated temporary image bytes, read relative files and reject traversal. +All four image source forms save identical bytes and reach actual native decoding. A local HTTP +server exercises Electron's network path. The fixture controls only native dialog selection and +clipboard output, so it writes no system clipboard or user-selected external file. Cancel and +decode failures retain their existing results; graceful close and relaunch preserve profile reads. +These times are functional observations; no performance/resource suite or speed claim is added. + +The full FileService graph (21 modules) compiles, imports and executes in ordinary Node with +Electron/electron-store forbidden at build and runtime. Actual text preparation, sharp image +compression/thumbnail generation, first temporary-directory write, relative reads and symlink/ +traversal fences pass. This proves the file boundary, not the cohesive headless Harness or the G5 +writer handoff. Evidence and verified/restored artifact hashes are in +`.deepchat/rutis-g4-file-boundary-acceptance/`. The normal generated Provider catalog refresh is +retained separately from the implementation. + +Baseline `36583fcfe` passes required `40644539422`/barrier `122672429696` and all six packages +`40644539477`/barrier `122677486296` before this checkpoint is published. This checkpoint needs its +own exact-head CI. G4 remains active: remaining configuration/runtime consumers and the final +writer/reader/desktop inventory precede G5's exclusive profile handoff. G5–G12 keep their full +scope and conditional adoption rules. + +### Storage roots and native folder acknowledgement + +- [x] Remove Electron path discovery from SyncService, SyncSettings and LegacyChatImportService. + Supply required absolute profile/temporary/home/source paths from actual Main composition. +- [x] Await the native sync-folder launch and reject both SDK errors and failed native results. + Keep directory selection and backup/import policy with the business owner. +- [x] Supply Knowledge's existing unpacked extension directory explicitly to the service and + every database create/open path. Keep its DuckDB/VSS engine and file ownership intact. + +Sync retains its existing filenames, archive paths, configuration filtering, snapshot/read locks, +encrypted backup behavior and incremental/overwrite rollback. Source and staged files remain +owned by the existing maintenance operations; this slice adds no writable Main shadow and does +not perform G5's handoff. Legacy startup import uses the same profile chat.db as an explicitly +read-only source and the same shared target facades. Knowledge removes its module-level native +lookup, retains existing VSS loading/fallback and keeps independent file/task state. Main supplies +runtime facts and the asynchronous shell capability. There is no additional process, engine, +dependency, fallback, public schema, generic path-discovery route or permission expansion. + +Validation: **97 distinct checks across nine files pass**: 83 native-enabled sync/Knowledge/import/ +composition checks in seven files and 14 generated-catalog checks in two. New durable cases cover +the supplied home default, waiting for actual native folder completion and propagating returned +errors/rejections. Existing native backup consistency cases retain encrypted snapshot, WAL and +concurrent-copy coverage. An obsolete source assertion requiring an undefined import path is +removed; actual application import/relaunch checks verify the explicit source. App and selected +sync-settings/new-E2E types, normal build, format, lint and i18n pass. + +Immutable `9c67d7431` and the candidate pass the same six application cases (24.4/24.7 s): five +maintenance/backup/rekey/credential/shutdown cases and the storage-root workload. A disposable +chat.db is populated through native SQLite before launch, imported from the expected source, +preserved byte-for-byte and restored on relaunch. Sync creates and opens the configured private +backup directory through the actual route; the fixture observes the final shell SDK call without +opening an external folder. Knowledge loads the existing native VSS extension, creates its file +under app_db/KnowledgeBase, closes gracefully and reopens after relaunch with configuration intact. +No model/provider network call is needed. These are functional observations, not a performance +claim; no performance/resource suite is repeated. + +The full SyncService/SyncSettings/LegacyChatImportService/KnowledgeService graphs (33/1/16/13 +modules) compile and import in ordinary Node with Electron/electron-store forbidden at build and +runtime. The probe executes default/custom sync folder operations and actual native Knowledge +initialization, VSS loading, file listing, close and reopen. It does not claim a native SQLite +backup/import under ordinary Node or a composed headless Harness. Evidence and verified/restored +artifact hashes are in `.deepchat/rutis-g4-storage-roots-acceptance/`. Normal generated Provider +catalog changes are retained separately. G4 remains active for remaining native/configuration +consumer contracts and the final writer/reader/desktop inventory; G5–G12 retain their full scope. + +Baseline `9c67d7431` passes required `40649481834`/barrier `122738133598` and all six packages +`40649481736`/barrier `122746406102` before publication. Initial static/macOS x64 jobs stopped +during dependency downloads, before application checks. Their diagnosed SheetJS connection reset +and npm registry timeout are retained with the retry evidence. Latest required/platform jobs and +both barriers pass. The storage checkpoint requires its own exact-head CI; the documentation-only +native-boundary audit reuses the accepted runtime artifacts without another build or E2E capture. + +- [x] Complete the writer, synchronous-reader and desktop-consumer inventory. + - [x] Enumerate SQLite/DuckDB construction and wrapper entrypoints, inherited shared facades, + staged/import/snapshot connections and independent derived-cache/vector owners. + - [x] Map Session/Tape/pending-input, Memory, Agent deletion, delegation, Scheduler, Project + and Sync transactions to indivisible business operation groups. + - [x] Classify remaining synchronous configuration consumers and desktop effects, including + mixed database/file settings, plugin trust state and native image/runtime inputs. +- [x] Replace cross-boundary closures/row APIs with bounded transactional business commands for + Session/Tape/Memory/config and scheduler claims. Preserve atomic head observations and CAS; + leave exactly one writer authority throughout each cutover. +- [x] Define versioned read snapshots and acknowledged mutations for desktop consumers. Extract + crypto/unlock, OAuth, helper launch, native UI and power events behind narrow async ports. +- [x] Preserve route sender validation, permissions, secret handling and cancellation identity. + Compare real operations and maintenance, remove only replaced dependencies and validate + directly affected storage/host contracts. + +Completion: the core can depend on serializable operations and host ports without synchronous IPC, +generic SQL, duplicated writer state or privileged Electron objects crossing the boundary. + +### Shared-writer inventory evidence + +The source audit at `32f457ff7` finds 11 direct SQLite constructors in seven files and six DuckDB +instance creation sites in four files. The RFC records each constructor family, wrappers, +production callers and file role, including the G3 vector worker's directory-lock database and +Knowledge's independent files. `openSQLiteDatabase` configures WAL and creates a writable-capable +handle; snapshot/read intent alone does not make its callers read-only. `DataImporter` opens +both source and path-based target through writable-capable constructors. Production incremental +import uses these paths while the normal application writer is closed under maintenance. + +The existing data facades inherit the startup `MainDatabase`; they are not independent connection +owners. Atomic groups include Agent deletion plus Memory namespace retirement and audit removal, +Project removal plus Session assignments, Sync conflict/trigger/cursor settlement, pending-input +receipts and Tape/transcript projections. Shared connection readers also include Session references, +history search, the built-in MCP conversation-search server and Tape inspector head subscriptions; +debug mock-session creation remains a writer operation. Memory's current-range query observes its +projection and Tape head in one SQL statement; replacing it with independent remote reads would lose that +guarantee. Existing local transaction closures can move with this cohesive backend without new +row-level RPCs. + +`AppSettingsDbBackedStore` mixes sensitive/portable database keys with machine-local legacy-file +keys; its merged `store` getter remains owner-local. Native consumers use the committed private +allowlist and acknowledged mutations, while general config routes execute beside their settings +authority. Plugin installation/safety and tool-policy persistence retain separate complete file +owners. A full merged Store snapshot is not a public backend payload. Different-key writes still +race because the pinned Conf adapter serializes the whole object before atomic replacement. +G5 hands the complete profile-file authority to the configuration owner after exclusive bootstrap; +Main keeps snapshots/commands, including for UI keys. The RFC's final profile-file inventory also +covers native key files, credentials, caches, bootstrap migration and offline reset. This inventory +does not claim the actual G5 writer handoff or a composed headless backend. +Constructor inventories and source-search evidence are in +`.deepchat/rutis-g4-code-mode-acceptance/`. + +The audit also records 34 direct SettingsStore import consumers and validates all 24 explicit +inventory source references. Format/check, lint, i18n and app typechecks pass. This documentation +checkpoint changes no application code; the accepted `32f457ff7` runtime evidence remains +applicable without repeating builds, application E2E or performance/resource captures. + +### Remaining native-runtime boundary audit + +Complete the remaining native/runtime/configuration contracts and final ownership inventory as +one G4 completion batch. Locally finish each affected owner and its relevant tests/application +comparison before advancing; publish the completed batch after normal quality checks and the +preceding CI barriers. Do not trigger another all-platform publication for each constructor fact +or documentation-only audit. Preserve the full contracts below, then verify the batch's actual +default composition before starting G5. + +| Owner/call chain | Current boundary | Required work before claiming the selected cutover | +| --- | --- | --- | +| RemoteConversationRunner | Session/catalog/turn/projection and workspace-default queries are async; Main supplies the absolute profile root | Preserve file/workspace authorization and the existing cache/generated-asset paths at G5 handoff | +| ChannelAdapter and five built-in factories | Lifecycle/event adapter has no native import; actual downloads remain inside the clients/Runner | Co-locate those business owners at G5; require a carrier only for an actual later host/device transfer | +| RemoteService Feishu/Weixin login | Main owns windows behind operation-ID commands/events; Core drains startup/polls/callback servers and fences late results | Bridge this private port with authenticated G5 ownership and preserve actual cancellation/close/server settlement | +| Provider OAuthService/Copilot windows | Main owns presentation and validates new tokens; Core issues secret-free targets and atomically commits against current configuration | Preserve the private owner commands, maintenance invalidation and authenticated G5 caller grants | +| Window/Tray/Notification/Shortcut/Floating | Configuration readers use a private committed projection; floating bounds use acknowledged owner mutations; Agent/catalogue queries are already async | Preserve the projection and existing async owner queries at G5 handoff | +| Upgrade settings and renderer diagnostics | Core receives the explicit application version; Main reads projected channel/privacy/logging flags | Preserve normalization under the configuration owner and Main's native updater/diagnostic lifetime at G5 | +| Plugin installation, context Hooks and MCP supervision | One portable business owner keeps installation/safety persistence, Tape Hooks and synchronous supervisor decisions local; Main supplies async shell/window effects | Transfer this owner and its independent Conf file with the cohesive backend; preserve physical drain and private native caller grants | + +Attachment I/O follows the actual clients/Runner call chain and stays local to that business +owner. The base adapter's uncalled download methods and their unused 20 MiB constant are removed; +no new size limit, desktop proxy path or native transfer operation is imposed on live downloads. +Any later selected host/device transfer must retain the RFC's bounded carrier/authority contract. +Native window extraction retains auth session and callback-server lifetime; its implementation is +recorded below. These boundaries preserve the full G5–G12 scope. + +Native configuration consumers use resolved language, notifications, close-to-quit, content +protection, shortcut mappings, floating enablement/bounds, logging, privacy and update channel. +The private committed projection covers bounds writes and separate shortcut events explicitly, +including asynchronous error/drain handling for floating persistence. Update-channel normalization +belongs to the configuration owner. Plugin installation/safety metadata has an independent +plugin-settings file owner; tool-policy authority uses the separate plugin-tool-policies owner +already inventoried above. Keep activation, context Hooks/Tape and MCP supervision co-located with +their business consumers. Do not merge those files or retain a second writer during handoff. + +### Native configuration projection + +The actual Main composition supplies Window, Tray, Notification, Shortcut and Floating with a +private `DesktopConfigurationProjection`, replacing their direct DesktopSettings reads. The +configuration owner publishes explicit allowlisted values immediately after each stored mutation, +before native effects and public events. Nested shortcuts and bounds exclude unknown keys; the +projection rejects foreign owner identities, stale/invalid revisions and caller mutations of its +returned objects. It contains no credentials or merged Store state. Native theme reads stay in +Main, avoiding re-entry into a pending configuration command. + +Floating bounds writes receive the existing serialized settings owner's acknowledgement and +publish committed values without optimistic cache changes. Drag mutation handlers validate the +current floating window and main frame. Floating enable/disable awaits actual native presentation +inside the same owner queue, preventing a queued disable or teardown from overtaking creation. +Maintenance/shutdown close native write admission, stop and drain the settings owner, then drain +outstanding native writes; successful recovery refreshes the projection before reopening writes. +The existing 64-command bound and stop deadline remain unchanged. Mutation routes return the +same command's receipt rather than enqueueing another read that a subsequent edit could overtake. + +UpdateSettings receives the explicit application version and retains existing channel defaults and +normalization under the configuration owner. Upgrade reads the projected channel/privacy values. +Renderer diagnostics receives the projected logging flag and explicit profile directory; its file +rotation, sanitization and native lifetime remain Main-owned. The selected classes import without +Electron, electron-store or font-list in ordinary Node: DesktopSettings/FontSettings/Logging/ +AppSettingsService/projection/UpdateSettings/renderer diagnostics contain 3/1/1/88/1/1/85 modules. +The probe executes owner mutations, committed cache publication and shutdown/drain. This does not +prove a composed headless Harness, cross-process owner replacement or G5's exclusive writer move. + +Validation passes 330 checks across 29 files, app and selected test/E2E types, normal build, format, +lint and i18n. The same eight application cases pass on immutable `ae0be4fef` and the candidate: +five maintenance/rekey/credential/shutdown cases, desktop settings, font/logging and +the native projection workload. Actual floating-window drag persists/restores bounds after window +recreation; shortcut registration and updater channel selection observe committed owner values; +graceful profile relaunch preserves configuration. Only the final SDK registration/update check +is observed without registering a system shortcut or contacting the update service. These are +functional checks, with no performance capture or speed claim. Evidence and artifact hashes +are in `.deepchat/rutis-g4-native-projection-acceptance/`. + +One interrupted, uninstrumented follow-up records a forced maintenance close. Both the targeted +two-case diagnostic and the full eight-case run with native process output complete gracefully; +the isolated failure remains an unexplained observation, with its evidence retained. Final G4 +integration must recheck graceful maintenance/shutdown rather than classify it as timing noise. + +The published `ae0be4fef` passes required run `40668735420`/barrier `122752954520` and all six package +targets in `40668735436`/barrier `122759825407`. The native projection belongs to the remaining G4 +completion batch and is not independently published. The final native-consumer inventory +remain required. G4 stays active; G5–G12 retain their full scope. + +### Remote native authentication and profile roots + +RemoteService no longer imports Electron or retains BrowserWindow objects. Main owns Feishu and +Weixin login windows through the required `RemoteAuthWindowPort`: plain operation-ID open/close +commands and closed/error events. Core retains authorization state, nonce, expiry, HTTP callback +server and credential/pairing commitment. Window creation retains the existing dimensions, +brand/redirect navigation restrictions, popup denial and isolated web preferences. A native close +request cannot be retained by a page's beforeunload handler. Closing a loading window preserves +the cancellation outcome; navigation failures from an active window still reach the owner. + +Authorization starts reuse the existing runtime-operation queue. Stop is idempotent, closes +admission before cancellation, marks current Feishu sessions terminal and awaits actual startup, +registration, polling and callback settlement. Initialization waits for that physical stop before +opening another lifetime. Late native startup is compensated by its known operation ID. Feishu +cleanup awaits response completion and callback work before closing partial-header connections +and releasing the loopback server. Weixin HTTP requests and poll sleeps carry owner cancellation; +canceled QR sessions retire and late confirmed results cannot recreate accounts or write secrets. +Main's final native-window close remains separate from Core's credential authority. + +RemoteConversationRunner receives Main's explicit absolute profile directory for the existing +image-cache and fallback generated-asset locations. Its workspace default is queried asynchronously. +File/path authorization, workspace requirements, image promotion/deduplication and generated +filenames remain unchanged. The runner and Weixin SDK graphs compile/import in ordinary Node with +Electron/electron-store/font-list forbidden (10/1 modules); the complete Remote closure is verified +below. This is module portability evidence, not the composed G5 backend or G11 Session Host. + +Validation passes 305 checks across 36 files, app and selected test/E2E types, normal build, format, +lint and i18n. The same six application cases pass on immutable `e2c97edac` and the candidate: +five maintenance/rekey/credential/shutdown cases and native Remote authorization. Actual windows +preserve disabled Node access, invalid nonce rejection, user-close cancellation and physical +closure. Weixin credentials survive graceful profile relaunch with the channel disabled. The +fixture intercepts only vendor HTTP and native loadURL destinations with disposable data; no real +account or external authorization is used. Evidence and artifact hashes are retained in +`.deepchat/rutis-g4-remote-native-acceptance/`. No resource capture or performance claim is added. + +This work belongs to the unpublished G4 completion batch. The final writer/reader/native inventory +remains required before G5. Existing floating Agent/catalogue queries +already use async owner methods and need no extra synchronous-getter replacement. G4 remains active. + +### Remote module closure + +ChannelAdapter retains its existing lifecycle, event and send contract. Unused protected image/file +base64 download methods and their unreferenced 20 MiB constant are removed, eliminating the final +Electron import under `src/main/remote`. Repository consumers, built-in subclasses, plugin/schema +entrypoints and tests contain no calls to those helpers. Real attachment download/decryption stays +inside channel clients and RemoteConversationRunner; no body is sent over a new native/Rutis +operation. Existing transport/file-preparation policies, URL/base64/encrypted media behavior and +timeouts remain. There is no new carrier, download implementation, global cap or proxy substitution. + +The complete RemoteService graph (54 source modules) bundles and imports in ordinary Node with +Electron/electron-store/font-list forbidden at build and runtime. The probe constructs the actual +service with explicit business/native ports, rejects unexpected network/native work, initializes +all disabled channels, applies a configuration mutation, shuts down, reinitializes and shuts down +again. This proves this module's portable composition and selected lifecycle, not live vendor +channels, a moved Store writer, the cohesive Harness or CLI execution. + +The existing 305 Remote/native-window/composition checks across 36 files pass, along with app +typechecks, normal application bundling, format, lint and i18n. The unchanged actual-app Remote +login workload passes on accepted immutable `119a15949` and the candidate: nonce rejection, +user-close cancellation, window cleanup, Weixin account persistence and graceful relaunch. Accepted +baseline evidence from the identical fixture is reused; no unchanged baseline or performance +capture is repeated. Artifact hashes and evidence are in +`.deepchat/rutis-g4-remote-closure-acceptance/`. + +### Provider OAuth configuration settlement + +OAuthService uses required asynchronous Provider owner commands rather than synchronous settings +reads or full Provider writes. Core issues a target containing Provider ID, client ID and an opaque +configuration identity; the Native facade never receives the saved credential or unrelated +configuration. Device and browser login retain their existing presentation and GitHub token +validation, then await actual credential commitment before returning success. Persistence errors +propagate to the caller. Shutdown aborts token validation and fences pending target reads and late +validation results before they can start another effect or submit a write. + +ProviderRuntime compares current identity and writes without an intervening await. The comparison +covers Provider ID, protocol, saved token and trimmed client ID with a private per-runtime key; +current name, enablement and custom headers survive unrelated changes. Concurrent logins cannot +overwrite a winning commit. Foreign-runtime, revoked, removed, reconfigured and malformed-token +requests reject. Maintenance invalidates captured targets before Store work; shutdown rejects +reads and writes. This is a stale-state fence, not authorization or a persisted database revision. +The unregistered generic OAuth method, callback server and window implementation are removed; +registered public route names, inputs and outputs remain unchanged. + +Validation passes 79 checks across four files covering the real ProviderRuntime commands, Native +login facade, existing Copilot token/client behavior and composition. App and selected test/E2E +types, normal build, format, lint and i18n pass. The same owned-profile application workload passes +on immutable `3ddf2b657` and the candidate: actual device login instructions, GitHub verification, +credential receipt, rejection after concurrent configuration change and graceful persisted +relaunch. Vendor HTTP, clipboard and external browser launch are intercepted only in the disposable +app process; instruction windows are real and closed through Native APIs. The candidate also +passes all five existing maintenance/rekey/credential/shutdown cases. Their accepted baseline +remains available from the preceding integration. No resource capture or speed claim is added. +Evidence and verified hashes are in `.deepchat/rutis-g4-provider-oauth-acceptance/`. + +### Plugin business owner and native presentation + +G4 remains active for the final writer/reader/Native inventory. The selected plugin boundary keeps +installation/consent, user-plugin activation, context Hooks and MCP supervision with the cohesive +core; its synchronous local transactions and integrity callbacks do not become row-level RPCs. + +- [x] Replace implicit Electron paths/version and plugin-settings construction with explicit roots + and the same Conf file format/defaults, retaining one installation/safety writer. +- [x] Require asynchronous native shell/settings-window capabilities and await actual native + closure while retaining renderer ownership checks in Main. +- [x] Drain accepted context-hook work before maintenance/shutdown can release Tape; preserve + active-run/update exclusion, cancellation, uncertain outcomes and restart behavior. +- [x] Verify default composition, portable import, relevant regressions and the same real-app + plugin scenarios against immutable artifacts. +- [x] Finish the final writer/reader/native inventory and local completed-batch validation. + The published batch's required and six-platform CI barriers remain mandatory before G5. +- [x] Supply OCR's native cache-key provider explicitly from Main; preserve encrypted cache + persistence, unavailable-key fallback and the same cache clear/relaunch application behavior. +- [x] Supply Codex/Grok auth owner commands to Main's OAuth facade. Keep their controllers, + credential queues and synchronous storage observations with Provider consumers; Main must + not initialize those owners or receive writable credential-store instances at G5 handoff. +- [x] Supply provider-existence results and committed MCP startup readiness to the native + deep-link adapter; preserve latest-pending installation and sender/preview behavior without + passing complete Provider settings or the MCP business owner into native actions. +- [x] Await the native resolved-proxy capability before the existing MCP registry probe; preserve + proxy authentication, live selection, failure propagation and the three-registry batch. + +Native SDK presentation remains Main-owned. These contracts do not move the cohesive backend or +authorize an additional settings writer. Publish the complete G4 batch after final validation. + +PluginService requires absolute profile, home, working and application directories, resource +location, application version, the resolved command environment and native shell/window effects. +It uses Conf directly with the existing plugin-settings name/defaults/version; no file migration, +second installation/safety writer, generic persistence RPC or dependency is introduced. Runtime +supervision, tool-policy decisions, user-plugin update exclusion and Hook integrity callbacks +remain local to their business consumers. Main keeps the renderer ownership lookup. + +Settings-window close destroys the owned window, waits for the actual closed event and retains +sender ownership until then; a page's beforeunload handler cannot veto disable or shutdown. +Failed loading drains its window before propagating; cancellation during loading settles cleanly. +A pending reopen cannot outlive close-all. Context Hooks reject new work on stop, cancel the +captured lifetime and drain the accepted queue, including actual child closure even when process +termination fails. A 30-second drain deadline rejects without releasing ownership; restart stays +blocked until the queue settles. Main directly awaits this stop before database maintenance or +shutdown can release Tape and resumes only after reconciliation. Existing invocation budgets and +uncertain-result/retry rules remain. + +Validation passes **372 distinct checks across 16 affected files**: 231 plugin/native-window/ +composition checks and 141 MCP/Tool/compaction consumer checks. The held-verification test +also passes all 26 checks in its file with a fake-clock drain deadline; unchanged tests are not +counted twice. Changed-test types, app node/web types, normal full build, format/check, lint and +i18n pass. Lint retains the preceding Remote finally warning. + +The full PluginService graph imports in ordinary Node with Electron, electron-store and font-list +forbidden at bundle and runtime resolution: **18 source modules**. The actual owner initializes, +installs/enables a private user plugin, executes its Hook into Tape, stops/resumes, and reconstructs +from the same legacy-shaped Conf file. Enabled intent, unknown metadata and unrelated launch +evidence survive reconstruction. This verifies the portable owner, not a moved backend or headless +Session Host. + +Immutable `d456426f7` and the candidate pass the same two application plugin cases: ZIP review, +disabled installation, MCP activation/tools/disable/uninstall, reviewed context reaching actual +Provider requests and host-owned credential rotation. The final candidate passes **eight app +cases**, adding actual official settings windows with beforeunload handlers, disable, isolated +renderer globals, persisted disabled intent, graceful relaunch and window cleanup at shutdown, +plus all five existing maintenance/credential/shutdown cases. The five cases' accepted baseline +is retained. No performance suite or resource recapture is selected and no speed gain is claimed. +Evidence and verified hashes are in `.deepchat/rutis-g4-plugin-owner-acceptance/`. This work stays +local with the remaining G4 completion batch; G5 and later goals remain pending. + +### OCR native cache-key capability and final ownership inventory + +OcrRuntimeService requires its existing asynchronous key-provider interface. Main constructs the +safeStorage implementation for the unchanged profile `ocr/cache-key.json` path; resource creation +uses that required provider for `ocr/ocr-cache.db`. The runtime imports only the provider's type. +Wrapped-key persistence remains a single native file owner, separate from the OCR cache database; +the native driver, memory fallback, unreadable-key recovery, clear and resource close are unchanged. +No new capability route, default provider, storage engine or process is introduced. + +All **97 selected checks across eight files pass**: 85 runtime/key/asset/attachment/route/composition +checks and 12 native SQLite image/document artifact persistence checks, with SQLite required and no +skip. App and changed-test types, the normal build and the immutable-artifact check pass. Matching +`75-ocr-cache-key.smoke.spec.ts` passes on immutable `3eaf16a21` and the candidate: actual app routes +select the existing Node toolchain, clear the cache, close gracefully, relaunch and clear again. +The candidate reports persistent mode on both launches with native encryption available, an +encrypted database header and an unchanged wrapped-key file. This exercises cache ownership and +native key access; it does not claim a new OCR recognition or performance result. + +The integrated candidate passes **16 application cases across ten files**, including plugin +install/Hooks/settings windows, maintenance and credential drains, MCP child lifecycle, desktop +configuration, font/logging, file/image effects, Remote authorization, Copilot credential commitment +and the OCR cache. Each selected owner's immutable baseline evidence remains available. No +performance/resource recapture or speed claim is selected. OCR-specific evidence and hashes are +in `.deepchat/rutis-g4-ocr-key-acceptance/`. + +The source inventory checks **83 entries and 831 unique transitive inputs** without +Electron, electron-store, font-list or electron-toolkit runtime imports. Skill Sync's modulePath +reference is recorded separately and its actual worker source is checked as an additional entry; +the audit does not substitute a placeholder for runtime/package validation. All 63 direct native +import files have an explicit Main/device role, including UI/OS effects, ingress/bootstrap, +native crypto and key persistence, protocols, updater and OAuth presentation. Workspace's native +file/Git/preview owner has no shared database or settings import. Source graphs/classifications and +connection/configuration call sites are in `.deepchat/rutis-g4-final-inventory/`. + +This is source-boundary evidence, not a composed backend or exclusive writer handoff. The Node +Codex/Grok auth owners and credential queues are constructed alongside Provider consumers; Main's +OAuthService receives acknowledged account commands. Native deep-link actions use provider-existence +and MCP startup observations in place of complete business-owner dependencies. MCP registry selection +awaits the native resolved-proxy capability. Local complete-batch inventory and validation pass; +G4 remains active until its published head's required and six platform package CI barriers pass. +G5 has not started. + +### Provider account owner commands + +Main's OAuthService requires ProviderAccountAuthPort: the existing nine public Codex/Grok account +operations and a private asynchronous stop command. Core composition initializes each existing +controller with its one credential store, publisher and native browser-opening capability. The +same global controller continues to serve Provider token/refresh consumers. Native presentation +receives status/login/callback/cancel/logout/stop commands, with no credential-store access or +business-controller initialization. GitHub's native SDK presentation and credential-owner commands +retain their existing behavior. + +Stop first fences native Copilot work, submits account retirement and target invalidation, then +awaits their acknowledgements. A failed account stop cannot skip target invalidation. The account +receipt preserves the existing controller and credential generation fences; it does not redefine +callback-server or network closure. Credential commits remain synchronous after their owner-side +validation, with no await inside the file commit; backend teardown retains lifetime ownership. + +Validation passes **116 checks across ten files**, including delayed/failed account-stop receipts, +Codex/Grok controller/credential/provider adapters and composition checks. Ordinary Node imports +and runs the actual two owners/stores: status, private persistence, cancel, stop fencing and reopen +preserve the file and expose no access token in public status. Their combined graph has **11 +source modules**; Main's facade graph has **six**, with no Codex/Grok owner/store module. The probe +uses the existing unavailable-crypto file policy; real native wrapping and encrypted-file parity +are covered by the application fixture. + +Immutable `c585dacf5` and the candidate pass the same two application cases: legacy file/native +credential status, cancel, durable logout/relaunch and Copilot commitment/stale-configuration +handling. The integrated candidate passes **17 cases across eleven files**, retaining the prior +plugin/maintenance/MCP/desktop/font/file/image/Remote/OCR cases. App and changed-test types, normal +full build, format/check, lint and i18n pass. No process/resource or performance comparison is +selected. Evidence and artifact hashes are in `.deepchat/rutis-g4-account-auth-acceptance/`. + +### Native deep-link observations + +Native actions require only an asynchronous provider-existence result. Core performs that lookup +under running-database admission and returns a boolean; Provider settings and saved credentials +stay at their business owner. Provider preview validation awaits this result before opening +settings. Incoming credentials remain preview data until the existing user confirmation. + +MCP preview deferral observes successful Core startup in Main. The native adapter starts unready, +retains the latest pending URL, and consumes it once when readiness is observed. Repeated positive +observations do not replay it. Shutdown clears readiness, and a completed startup cannot publish +a positive observation after stopping or maintenance admission closes. This UI observation grants +no configuration or execution authority. Native actions receive no MCP business-service object. + +All **38 selected checks across two files pass**, including delayed negative provider lookup, +latest-pending behavior and composition. Matching application cases pass on immutable `7009bb955` +and the candidate: pending-preview replay and an actual OS open-url event for an existing Provider, +with settings presentation and saved credentials preserved. The candidate additionally passes MCP +child lifecycle and all five maintenance/shutdown cases: **eight cases across four files**. The +OS fixture observes the window opened by the link, preserving its provider navigation. + +App and changed-test types, normal build, format/check, lint and i18n pass. Evidence and verified +hashes are in `.deepchat/rutis-g4-deeplink-owner-acceptance/`. No performance/resource capture or +process change is selected. The shared writer and Harness have not moved. + +### Resolved proxy and final G4 batch + +Each existing three-registry probe batch awaits Main's current resolved proxy URL. Keep the native +system/custom resolution, authentication, cache/custom-registry short circuits and network failure +behavior. A failed host query propagates before any HTTP probe or registry-cache mutation. There +is no new proxy resolver, process, transport, cache or configuration writer. The focused MCP/native +proxy/composition suite passes **86 checks across four files**; the delayed-reply regression also +covers authenticated proxy options, a later direct selection and rejected host observation. + +The final inventory covers all **34 direct SettingsStore consumers**: 31 owner-local Core +configuration/command modules and three explicit bootstrap/composition entrypoints. Those Core +constructors are included in the **83-entry, 831-input** source audit rather than inferred from +type-only consumers. All 63 direct native-import files retain explicit Main/device roles. The RFC +records physical file owners as well as connections, including complete settings files, plugin +safety/policy, credentials, native wrapped keys, derived caches, bootstrap migration and offline +data reset. This establishes G4's handoff inventory, not actual G5 process or writer ownership. + +Final regression protection passes **807 distinct checks across 68 files**: 781 checks in 67 files +under Electron with native SQLite required, plus 26 child-script Hook checks under ordinary Node. +The Hook fixture uses process.execPath as its Node command; its seven failures under Electron are +retained in the initial log. Running that file with its intended Node runtime passes all 26 checks +without changing production code, test deadlines or assertions. Normal generated Provider catalog +checks contribute 44 of the 807 checks and the generated refresh remains a separate commit. + +The final default application passes **19 cases across 13 files**, covering plugin installation, +Hooks and native windows, account/Copilot authorization, maintenance and credential drains, MCP +child lifetime, desktop/font/file/image effects, configuration projection, Remote authorization, +OCR key/cache relaunch and OS deep links. Each owner retains its matching immutable application +comparison; the MCP proxy boundary reuses the verified b16d31799 baseline runtime case. No fresh +19-case baseline or performance result is claimed. App/changed-test types, normal full build, +format/check including Markdown, lint and i18n pass. Source hashes, artifact hashes and receipts +are in `.deepchat/rutis-g4-final-inventory/`; focused proxy receipts are in +`.deepchat/rutis-g4-proxy-port-acceptance/`. + +Publish this completed batch once to the existing Draft PR. G4 remains active while its own +exact-head required checks, all six platform packages and both barriers are pending. Do not start +G5 or merge the PR before those checks pass. Shared-CI timing reports do not trigger reruns. + +## G5. Move the cohesive Harness and shared core into the TS backend + +- [ ] Move the actual Harness composition and its Run/loop/interaction/pending-input feedback + cluster together. Keep Provider streaming and prompt/tool integration local initially. +- [ ] Move the shared database facades, Session/Tape projection/recovery, configuration authority + and scheduler claim transactions with their business owners. Fence/drain old ownership + before opening the backend writer; remove main's writable shadow access. +- [ ] Retarget existing renderer/CLI domain handlers without changing public behavior. Keep + authenticated ingress and native capability presentation in the desktop adapter. +- [ ] Compare real streaming, delegation, pending-input settlement, approvals, cancel/resume, + restart recovery, backup/rekey/import and shutdown. Validate lost replies, stale callbacks, + runtime loss and all supported native/package targets before distribution. +- [ ] Review resource deltas and whole-change contracts; retain only durable regression coverage, + run required checks and remove replaced main composition/lifecycle paths after parity. + +Completion: one backend owns active/durable business state, Electron main remains responsive under +the agreed workload, and ownership loss cannot create two profile owners or duplicate execution. + +## G6. Extract the complete Memory capability + +- [ ] Move the existing facade and internal retrieval/extraction/reflection/persona/directive/ + maintenance services into one TS plugin. Preserve policy, Provider execution and Store ports; + keep Harness ingestion scheduling and execution fences explicit. +- [ ] Replace synchronous cross-boundary assumptions with versioned reads and authoritative + epoch-validated operations. Retarget prompt injection, memory tools, management routes, + Agent lifecycle, cursor settlement and maintenance as one complete service migration. +- [ ] Compare scope/temporal/tombstone filtering, recall quality, mixed-language budgets, + directive approval/trust, FTS/vector degradation, CAS/audit/lineage, background drain, + config changes, Agent delete and database maintenance in the real app. +- [ ] Review resource/quality evidence, run native/evaluation and relevant E2E checks, and remove + the old Memory facade construction and manual lifecycle wiring after parity. + +Completion: all consumers use the one capability; plugin unload/recovery cannot advance an +unsettled cursor, reuse a revoked execution token or resurrect forgotten data. + +## G7. Migrate the control owner to Rust + +- [ ] Move admission queue/permit authority to Rust as a complete slice, preserving ordering, + cancellation/late grants, fairness and diagnostics. Delete the TS queue owner after E2E parity. +- [ ] Move Run transitions, interaction parking/cancellation and pending-input settlement as one + cohesive control owner. Preserve instance/run/operation/message fences and durable claimed + dispositions; do not proxy individual checks or create two run registries. +- [ ] Keep loop/Provider/tool effects behind bounded operation-level calls. Define revalidation + around awaited durable operations and deterministic event ordering back to TS consumers. +- [ ] Compare all control/recovery workloads and resource budgets, validate with the actual app, + and remove replaced TS control ownership. Report architectural gains separately from speed. + +Completion: the Rust owner is authoritative, lifecycle semantics match, and the agreed resource +envelope holds. This phase need not eliminate the TS runtime used by Provider/protocol adapters. + +## G8. Select measured Rust batch work + +- [ ] Select one profiled batch from Tape/context projection, bounded tool-output processing or + Memory computation. Record its expected CPU/allocation mechanism and numeric target first. +- [ ] Co-locate work with its data or pass a bounded batch; preserve Unicode/canonical ordering, + provenance, retractions, token/quality policy and cancellation. Reuse native engines. +- [ ] Connect the actual consumer, compare complete output and real-app resource results, then + remove old wiring only after adoption. If it fails the budget/variance gate, record no-go + and retain the simpler TS implementation instead of retaining a permanent experiment flag. +- [ ] Review, select durable regression protection and run appropriate checks before completion. + +Completion: a measured successful module migration or an explicit evidence-backed no-go. +Rust line count and microbenchmarks that exclude transfer costs are not success criteria. + +## G9. Extract peripheral services with independent useful lifetimes + +- [ ] Select one actual ownership group: process jobs/scheduler/watchers, documents/OCR/search, + Knowledge/RAG, MCP/ACP connections, Skills/hooks or remote channels. Do not create all proposed plugins + merely to match the capability map. +- [ ] Reuse current native helpers and supervisors, preserve tool/route/registration permissions, + and connect actual consumers through one generation-bound lifecycle owner. +- [ ] Compare the module's real workload, unload/lost-reply/restart/revoke cases and resource + envelope; account for idle Node processes removed or added. +- [ ] Review, validate and remove the replaced manual wiring. Repeat only for another selected + module with a concrete lifecycle or measured resource benefit. + +## G10. Decide and migrate durable Store to Rust + +- [ ] Establish compatible encryption/SQLite extension/collation/native packaging support before + selecting a driver. Inventory every writer and maintenance/recovery contract again. +- [ ] Preserve durable schemas and atomic Session/Tape/Memory/scheduler operations with one writer; + compare migration, import/export, rekey, backup, recovery and poisoned/partial failure cases. +- [ ] Measure end-to-end resource savings and deployment cost. If the evidence supports cutover, + connect real consumers, validate signed/platform packages and remove old storage ownership. + Otherwise retain the TS/native Store and record the compatibility or benefit limit. + +This goal is conditional; an independent Harness or headless product does not require it. + +## G11-G12. Deliver Everywhere from the extracted core + +- [ ] G11: provide non-Electron configuration, credentials, filesystem/process and approval ports; + boot a declared headless Node/Rust distribution with actual CLI submit/query/cancel/recovery. +- [ ] G11: verify offline startup, no Electron imports/installation, native packages, storage + ownership, shutdown and service policy after all clients disconnect. +- [ ] G12: add authenticated application ingress and reconnect-safe bounded events/snapshots; + demonstrate desktop and browser clients observing the same authoritative Session. +- [ ] G12: enroll device capabilities with explicit resource grants and revoke/disconnect semantics; + exercise a real approved operation, stale reply rejection and no implied sync authority. +- [ ] Review each horizon separately, run its actual E2E comparison and platform/security/resource + checks, and delete replaced wiring when that horizon cuts over. + +## Validation evidence + +G0 baseline: Node 24.22.1, pinned pnpm 10.34.5, macOS arm64. The existing admission and +LiveDelegationService suites passed together: 2 files, 82 tests. Full application build passed; +normal provider/ACP registry refreshes are retained. + +- Baseline Electron startup/streaming E2E: 4 tests passed. The shared delegation migration workload + separately passed against the baseline build. +- The delegation workload uses two parent Sessions and 8 child turns against a local model fixture: + 6 execute, 2 queue, one queued turn is interrupted, a released slot starts the other queued turn, + and the final state is 7 completed turns and 1 interrupted turn. Graceful shutdown and admission + diagnostics are checked through the actual app, public IPC and stored log. +- Updated owner, delegation, runtime, route, composition/shutdown and package-contract suites pass: + 8 files, 143 tests. Runtime coverage uses the real Rust host and Electron Node mode; one test copies + the artifact closure outside the checkout and verifies launch without repository resolution. +- Runtime cases cover owner limits/fairness, pre-aborted and queued cancellation, lease + suspend/resume/release races, asynchronous observer failures, shutdown, forced runtime loss, and oversized-frame rejection with child teardown. + Runtime loss rejects pending work and leaves no live replacement host. +- Baseline and final migrated application each pass the same 5 Electron E2E checks: 3 startup/ + recovery checks, 1 streaming-chat check and 1 delegation-admission check. The final migrated run + completes all checks with graceful app shutdown. +- Repository format, typecheck, i18n, lint and locked Cargo fmt/clippy checks pass. +- Only the Rutis TS plugin constructs `AgentInvocationAdmission` in application source. Main uses + the typed client; there is no local queue fallback, separate probe command or implementation flag. + The normal build's provider/ACP registry refreshes are retained. +- G0 execution results are local macOS arm64. Signed release packages and native Windows/Linux app + execution remain unverified. G2 records the paired resource baselines; no performance gain is claimed. + +G1 validation: only this RFC and plan changed after the admission commit. All 28 local document +references resolve; diff whitespace checks and repository format, i18n, lint and Node/web typechecks +pass. No new source, dependency, build configuration or test changes were made. G0 tests/E2E were +not rerun for this documentation-only goal; no profiling, Rust comparison or Memory native benchmark +was executed for G1. Implementation evidence is recorded under the corresponding live goal. diff --git a/docs/architecture/rutis-multiprocess-backend/spec.md b/docs/architecture/rutis-multiprocess-backend/spec.md new file mode 100644 index 0000000000..0968ac0431 --- /dev/null +++ b/docs/architecture/rutis-multiprocess-backend/spec.md @@ -0,0 +1,1569 @@ +# DeepChat Everywhere Runtime + +## Status and decision + +Status: G0-G3 complete; Store and desktop boundary extraction in progress (G4). +Evidence date: 2026-10-27. Baseline implementation: `f35adff34` (admission code `ffcd98770`). +Implementation reference: Rutis `v0.16.0`, released on 2026-10-24. Crates and npm packages are pinned +to that version. + +Make DeepChat usable through multiple clients, runnable without a desktop window, and able to use +capabilities on explicitly enrolled devices. Separate client presentation, Session authority, and +device execution. Use Rutis to manage runtime dependencies, generations, and approved links between +execution nodes. The first production milestone is a multiprocess desktop backend. + +Keep Agent execution, Provider calls, Session state, Memory coordination, and Tape transactions +together in one TypeScript backend process initially. Create additional runtimes only for a concrete +isolation, resource-locality, or replacement requirement. The application core must accept host +ports instead of requiring Electron, even while the desktop distribution uses Electron's Node mode. + +The objectives are responsive desktop interaction under backend load, independently recoverable +backend processes, replaceable feature implementations, and access to one authoritative Session +Host from multiple surfaces. Additional processes and plugin counts are not success criteria. +No responsiveness or memory improvement is established; cross-device operation remains unimplemented. + +Implementation proceeds through +[Draft PR #2465](https://github.com/ThinkInAIXYZ/deepchat/pull/2465). The admission migration is +committed as `ffcd98770` (`feat(harness): route admission through rutis`) and its roadmap as +`f35adff34`. Remaining modules follow the dependencies and acceptance gates in [the live plan](plan.md). +Each validated goal is committed and pushed separately before the next selected goal starts. + +Each module migration replaces its real application wiring on the migration branch. Completion +requires running the same end-to-end workload against the baseline and migrated application, +checking lifecycle/failure behavior, and deleting the superseded wiring. A standalone plugin check +is supporting evidence, not a completed module migration. There is no retained local fallback or +parallel production/development owner. + +## Admission module migration + +The first module is Agent invocation admission: capacity, per-owner fairness, pending bounds, +cancellation, permits, and diagnostics. Keep the tested TS implementation as the Rutis plugin's +single owner. The application retains a typed client and caller-owned lease state; it no longer +constructs an in-process admission queue. + +```text +LiveDelegationService / existing admission port + | +Electron main: typed admission client + lease state + | bounded private stdin/stdout frames +Rust/Rutis host: declared service dependency, cancellation, lifetime + | upstream Rutis local runtime transport +Electron Node-mode runtime: first-party admission TS plugin + | +One admission queue and permit owner +``` + +The client preserves synchronous lease suspend/release and asynchronous resume. Commands carry a connection-wide sequence. The TS dispatcher starts operations in caller order +even when concurrent Rutis RPCs arrive out of order; it does not await a queued acquire before +starting a later release. Cancellation during acquire uses an acquisition identity chosen before the call and sends an +ordered release. The RPC remains tracked until it settles; the remote record aborts queued work +or releases a grant even if cancellation races the reply. Repeated release is idempotent. Per-owner limits, +correlation validation, queue bounds, monotonic measurements and bounded diagnostics remain the +existing owner's behavior. Log observers cannot change admission outcomes. + +The admission gateway exposes its method allowlist over inherited pipes. Its frames are limited to 64 KiB, buffered application writes to 1 MiB, and concurrent calls to 1024. +Diagnostics carry a separate sequence and use bounded forwarding/reordering; malformed observer +payloads and observer failures cannot change admission accounting. There is no public listener or renderer access to the +host protocol. Child generation loss rejects pending requests and closes admission; the application +does not start another owner or retry unknown operations. Graceful shutdown stops delegation, +closes admission, flushes diagnostics and then shuts down the host/runtime with bounded deadlines. + +Build the host, compiled plugin and unmodified Rutis runtime closure as application artifacts. +Application startup uses these artifacts both locally and when packaged, with the packaged Electron +executable in Node mode. Missing artifacts fail startup with an actionable build error. `pnpm harness:build` builds the +locked host and compiled plugin; normal dev, test and application builds call it. The repository +pins Rust 1.95.0 through Rustup. `beforePack` rebuilds the native artifact for the selected target, +and `extraResources` installs the closure under `app.asar.unpacked/harness`. Runtime startup has a +15-second deadline, non-acquire RPCs 10 seconds, host root shutdown 10 seconds, and client force +termination 12 seconds. Queue waits remain caller-cancellable without a new task-duration limit. Runtime +packages are release dependencies through the copied closure, not a boot-time download. + +### Rust owner sequence + +| Owner | Current migration direction | Acceptance boundary | +| ------------------------------------------------------ | ------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------- | +| Runtime dependencies and child lifetimes | Rust/Rutis | Actual app startup, bounded shutdown and fail-closed disconnect | +| Invocation admission | TS Rutis plugin with a typed application client | Existing fairness/leases/diagnostics plus end-to-end delegation parity; remove local queue construction | +| Run control, cancellation and pending-input settlement | Extract explicit ports, then migrate as a cohesive Rust owner | Preserve all four fences, synchronous queue feedback, ordering and durable dispositions | +| Provider, MCP, Skills and product hooks | TS plugins where independent resource lifetimes exist | Retain adapters and use operation-level calls, avoiding token-level RPC | +| Tape, persistence and recovery | Dedicated migration after Harness ports | Preserve schema, encryption, same-connection transactions, recovery and one mutation authority | +| UI, OAuth and native capability presentation | Desktop host adapters | Narrow async ports without Electron-main imports in the Harness | + +Every later module follows the same branch workflow: select owner, replace implementation and +callers, run the real application comparison, then remove the old path. Everywhere remains a +product destination; it does not require migrating all modules at once. + +## Harness and capability decomposition + +### Plugin, process and language are separate decisions + +A capability becomes a first-party Rutis plugin when it owns a coherent service, dependencies and +cleanup lifecycle. An ordinary helper, coordinator or memory category does not need its own plugin. +Plugins may share a runtime. Process separation is justified by blocking work, native crash +containment, resource locality or independent recovery; language selection follows measured cost +and deployment requirements. Neither choice follows automatically from making a plugin. + +First-party Rust services initially ship with the application-owned host executable. The +[upstream Rust host guide](https://github.com/arcships/rutis/blob/v0.16.0/docs/guide/rust-host.en.md) +also documents dylib plugins, but arbitrary binary loading, cross-version ABI compatibility +and live code replacement are separate distribution contracts, outside this migration. Preserve +the existing external-plugin permission boundary: a first-party Memory or Store service does not +give marketplace plugins unrestricted access to profiles, credentials or execution authority. + +Use the existing TS runtime for extracted TS capabilities unless a separate failure domain is +required. Shared-runtime plugins share native crashes and process memory. Rust services also share +the host's failure domain unless deliberately isolated; running blocking database/CPU work on the +host routing task would defeat the responsiveness objective. + +### Source-backed capability map + +The following are ownership groups, not a required plugin count or a new directory structure. +Names describe proposed capabilities; only admission is currently connected through Rutis. + +| Capability | Current owners and entry points | Proposed service and authority | Initial placement and Rust direction | +| --- | --- | --- | --- | +| Runtime and admission | `src/main/harness/{runtime,admission}.ts`, `src/harness/plugins/admission.ts`, `crates/deepchat-harness` | Required-service readiness, generation lifetime, bounded admission and permits | Rust host plus existing TS admission plugin; a Rust queue is a structural migration until measured otherwise | +| Run control and interaction | `RunLifecycleCoordinator`, `PendingInputAdmissionCoordinator`, `PendingInputPump`, `InteractionCoordinator`, `InteractionParkingRegistry`, `ProviderPermissionCoordinator` in `src/main/agent/deepchat` | One owner for run transitions, four fences, queued-input dispositions, cancellation and approval settlement | Keep cohesive with the TS Harness first; later one Rust control owner, using atomic transition commands rather than RPC per coordinator | +| Agent execution and context | `DeepChatLoopRunner`, `DeepChatLoopEngine`, `TurnCoordinator`, context/input/compaction coordinators, prompt assembly and `src/main/agent/deepchat/runtime/contextBuilder.ts` | Execute a turn from an admitted input; assemble bounded context; stream ordered results | TS core with Provider streaming nearby; profile JSON, projection, token estimation and pruning before selecting a batched Rust operation | +| Session, Store and Tape | Session lifecycle/settings/identity, transcript mutation and message projection; `src/main/tape`; shared database composition | Durable commands, Tape/projection consistency, recovery and configuration snapshots; exactly one authority for each mutation | Move existing SQLite-backed owners together into TS core; Rust storage is a separate later compatibility project | +| Memory | `src/main/memory/index.ts`, `core/injectionPort.ts`, `ports.ts`; Harness `memory/memoryRuntimeCoordinator.ts` | Recall/injection, extraction, approved directives, management and maintenance; Harness retains turn scheduling and fences | One first-class TS Memory capability, with an optional vector resource boundary; selectively Rust after profiling | +| Knowledge and RAG | `src/main/knowledge/{index,knowledgeBase,taskQueue}.ts`, `database/knowledgeDatabase.ts` | Document/chunk indexing, retrieval, durable file/task status and knowledge-store lifetime | TS capability with its own schema, VSS and file contracts; later evaluate native-worker placement alongside document jobs | +| Provider | `src/main/provider/providerService.ts`, `aiSdk/runtime.ts`, model/embedding/rate-limit managers and `src/main/app/memoryProviderBindings.ts` | Model resolution, request execution, embedding, streaming and request admission | TS ecosystem adapters; credential/OAuth operations through host ports; no per-token cross-language calls | +| Tool execution, MCP and ACP | Tool resolver/deferred executor/output guard in Harness; `src/main/tool`, `src/main/mcp`, `src/main/agent/acp` | Existing permission checks, operation identities, result/artifact bounds, protocol connections and subprocess leases | TS protocol adapters; Rust may own generic process resources later; MCP Apps and ACP terminals retain explicit desktop capability ports | +| Skills and hooks | `src/main/skill/{index,skillExecutionService}.ts`, discovery/sync workers, `src/main/hook`; Harness skill materialization and hook sink | Discover contributions, resolve trusted context, observe lifecycle, execute approved operations and remove registrations on unload | TS contribution plugins where independently useful; keep pure prompt helpers internal and preserve uncertain hook outcome recovery | +| Jobs and process resources | `src/main/scheduler`, `src/main/agent/shared/process`, `src/main/tool/codeMode`, file-watch owners | Schedule calculation, durable run claims, bounded jobs, process-tree cancellation and cleanup | Reuse existing utility processes; Rust supervision/timers are candidates only when an old process or lifecycle owner can actually be removed | +| Documents, OCR and local search | `src/main/ocr`, `src/main/platform/fileSearch/fffSearchService.ts`, attachment capability routing | Bounded extraction/search operations and artifact references, with cache and resource ownership | Reuse existing native engines/helpers; optional isolated job plugin; Rust wrappers alone do not accelerate native work | +| Remote channels and device capabilities | `src/main/remote/runtime/manager.ts`, channel runtimes, existing sync and local control plane | Channel lifecycle and authorized Session ingress; separately scoped device operations and durable sync | TS integration plugins; isolate noisy channels when justified; remote Rutis links do not grant application or filesystem authority | +| Desktop and observability | `src/main/app`, route/preload boundaries, platform adapters and structured logging | Native windows, unlock/crypto/OAuth, authenticated caller creation; bounded content-free diagnostics | Electron adapters remain desktop-owned; diagnostics accompany each capability instead of becoming a new central business owner | + +The Harness root is +[`createDeepChatAgentHarness.ts`](../../../src/main/agent/deepchat/harness/createDeepChatAgentHarness.ts). +Its [runtime services](../../../src/main/agent/deepchat/harness/runtimeServices.ts) already name useful +ports, but synchronous repositories, callbacks, `AbortSignal`, closures and object identities are +not remotely usable contracts. Extracting the composition unchanged into a plugin does not solve +those dependencies. The existing [Harness contract](../deepchat-agent-harness-boundaries/spec.md) +remains authoritative for the four fences and synchronous pending-input settlement. + +Keep run ownership, approval parking and pending-input feedback under one transition authority. +Do not create a transport round trip for each fence check. Similarly, keep Provider token delivery, +tool permission decisions and loop progress local until an operation-level protocol preserves +ordering and backpressure. Progressively remove Electron dependencies through desktop ports; +moving business code out of `src/main` is an outcome of ownership extraction, not a bulk rename. + +## Memory as a first-class capability + +### Ownership and first extraction + +Memory is a suitable independent capability because it already has a facade, repository ports, +execution identities, provider bindings and vector-store lifetimes. Use one Memory plugin with +internal retrieval, working-memory, extraction, reflection, persona, conflict, merge, directive and +maintenance services. These are not separate processes or independently trusted instruction lanes. +The existing [Memory service boundaries](../memory-service-boundaries/spec.md), +[Memory architecture](../memory-system.md) and [vector v2 contract](../memory-vector-store-v2/spec.md) +continue to define behavior. + +The recommended first Memory slice is the vector resource service: query/upsert/delete/list and +open/close/reset/quarantine of per-Agent stores. Its files are separate from the shared database, +and most operations are already asynchronous. Keep the current DuckDB implementation in TS first. +This is a lifecycle and isolation experiment, not a claimed query-speed optimization. Use one +additional TS runtime, started lazily by the existing Rust host when the first store is needed. +Native poison requires a new process; sharing the admission runtime would couple that recovery to +unrelated active Runs. No runtime is created per Agent, and unused Memory starts no extra process. +The additional runtime must pass the G2 resource budgets before adoption. + +`IMemoryVectorStore` still exposes synchronous `isUsable()`, and the factory has synchronous +quarantine notification and object-returning creation. A remote service must use generation-bound +resource identities, acknowledged mutations and explicit health/readiness observations. Cached +health may reject work early; it cannot authorize a stale handle. A query/upsert validates the +Agent, embedding model/dimensions and store generation at its actual owner. Do not serialize class +instances or assume that the current interface can be proxied unchanged. + +Keep `VectorStoreManager` admission/leases and embedding identity changes coherent with resource +disposal. A local facade can retain policy while the resource owner holds native handles, but +there must be one authority for close/quarantine/reset and no reopening while an old owner lives. +Preserve v2 sidecars, legacy migration, staging/rename, WAL handling and quarantine semantics. +The current recovery contract requires a new process after poisoned native state; same-process +reopen or automatic worker replacement is not established recovery behavior. + +### Full Memory service dependencies + +The full capability needs the following contracts before its real wiring can move: + +| Boundary | Existing coupling | Required extraction rule | +| --- | --- | --- | +| Durable facts and mutations | `MemoryDatabase` uses the same main database as Sessions, Tape, settings and Providers; repository methods are synchronous | Keep a single storage authority. Introduce coarse business commands for atomic Memory writes/CAS/tombstones/lineage/audit, or move the repositories with Store. No generic SQL gateway or row-by-row remote repository facade | +| Configuration and execution | `isEnabled`, budgets, directive contribution, execution-token capture/validation and access observation include synchronous operations | Use versioned policy snapshots only for reads that tolerate them; authoritative admission and writes validate execution epochs. Invalidate stale work on Agent delete, config change, clear and shutdown; no synchronous IPC | +| Tape ingestion | `MemoryRuntimeCoordinator` owns scheduling, Tape anchors, persisted Session cursors and late-work fences | Keep scheduling with Harness. Preserve the atomic observation of Tape/projection heads and acknowledge owned extraction before advancing its cursor; do not replace one database observation with independently timed RPC reads | +| Providers | Embedding, extraction, reflection and persona use current model resolution, queues and cancellation | Use the existing Provider execution port; preserve request admission, execution identity, deadlines and cancellation. A lost reply cannot automatically replay a durable write or provider side effect | +| Recall and prompt trust | Vector/FTS candidates require authoritative scope, temporal and tombstone checks; approved directives use a distinct lane | Revalidate recalled rows at the owner before injection. Facts, persona and working memory remain untrusted content; approved directive policy must survive plugin replacement | +| Management and maintenance | Routes, memory tools, backup/rekey/clear/delete, vector rebuild and background maintenance share service lifetimes | Retarget every caller, including management UI and tools. Quiesce and fence work before destructive maintenance, drain native/provider jobs and preserve failure/rollback behavior | + +[`MemoryRuntimeCoordinator`](../../../src/main/agent/deepchat/memory/memoryRuntimeCoordinator.ts) +must remain an explicit Harness collaborator rather than disappearing inside a generic plugin +lifecycle callback. A Rutis generation cannot replace the Agent execution epoch or persisted Tape +incarnation. Plugin unload must settle or fence extraction, release resources and leave ingestion +recovery deterministic; it cannot silently skip inputs or resurrect forgotten memories. + +During staged migration, the existing database owner may serve narrowly defined transactional +commands while it remains the only writer. Its shared repositories do not move merely because +Memory becomes a plugin. The whole-core database cutover moves all remaining facades and scheduler +claim transactions together; main then loses writable shadow access. + +### Existing bounds and the actual optimization question + +The current implementation already bounds recall materialization to 800 candidates, keeps a vector +store soft cap of 8 with a 15-minute idle TTL and active leases, batches embedding work, and limits +background/query embedding concurrency. Do not describe adding an LRU, batching or bounded queues +as a new Rust benefit. Existing numeric-only diagnostics report repository/materialization cost, +DuckDB statements, open stores, active leases, provider work and extraction outcomes. + +[`memoryVectorStore.ts`](../../../src/main/memory/infra/memoryVectorStore.ts) executes cosine queries +in native DuckDB through `@duckdb/node-api`. Writes reuse typed native column buffers, avoiding +one temporary native scalar per embedding component. Query array binding, handle lifetime and +duplicated buffers remain candidates for profiling. +A Rust wrapper using the same engine does not by itself improve the database algorithm. A bounded +800-row score pass is also a weaker candidate than an observed large-history JSON/projection cost. +Model inference and network waits remain Provider costs in either language. + +Knowledge/RAG also imports DuckDB in Electron main through +[`knowledgeDatabase.ts`](../../../src/main/knowledge/database/knowledgeDatabase.ts). Moving Memory +vectors alone therefore does not unload the driver from main or eliminate all native crash risk +there. Do not merge Knowledge's schema/VSS migrations into Memory's v2 format; assess its independent +capability and any shared-worker costs in G9. + +Evaluate query recall/selection, tombstones, scope, temporal rules and injection budget alongside +latency. Retain FTS/degraded behavior and failure diagnostics. Use the existing Memory performance, +native and quality suites; algorithmic fixtures alone do not measure DuckDB or whole-application +memory. G2 records native and fixture characterization in the live plan; those results do not +establish a whole-application Memory improvement. + +### First vector service contract + +G3 keeps the current v2 DuckDB engine and files. The Rust host supervises the lazy runtime generation; +one first-party TS plugin owns native handles, file locks and recovery leases. Memory policy, authoritative +rows, embedding scheduling and vector leases remain in their existing owners. There is no schema +migration or fallback to a second native owner in Electron main. + +- Negotiate a versioned `memoryVector` service at the private application handshake. Admit only + open, query, query-by-ID, atomic upsert, delete-by-IDs, list-IDs, close, reset and quarantine + operations. Validate the Agent and resource identity at both the application adapter and owner; + callers cannot choose a path, SQL statement, module or service name. +- Choose resource and operation UUIDs before dispatch. Every resource binds Agent, model, dimensions + and runtime generation. Late open replies must release the known resource; dropped futures cannot + abandon a native handle. A local `isUsable()` observation may reject early but cannot authorize + a stale operation. Revocation/quarantine immediately disables the local facade, and subsequent + open/reset/disposal waits for the authoritative control acknowledgement or proven process exit. +- Hold a private DuckDB ownership database open in the vector process before startup recovery + or database/WAL/staging mutation. Its native file lock fences an earlier process that outlives its desktop host. + Persist a per-Agent lease before opening vector files. Remove it only after acknowledged clean + closure; preserve it for uncertain writes and runtime disposal. After acquiring ownership, recover + stale leases through the existing quarantine path and require explicit index rebuilding before + issuing usable grants. Keep database writes, removal and marker consumption in the vector process. + The application adapter synchronously creates append-only quarantine intents so cleanup can be + deferred durably even after worker loss, including for previously closed stores. Preserve its + synchronous marker-error contract, fence the native owner even when marker creation fails, and + never unlink or recover database files from that adapter. +- Preserve existing admission calls and their 64-KiB limit. Add a distinct vector frame kind with + a 256-KiB maximum; retain the 1-MiB transport buffer budget and reserve 64 KiB for control. Only + one bulk chunk awaits acknowledgement at a time. Control frames take precedence over the next + chunk, and a loaded-vector E2E case must prove admission is not starved. +- Encode embeddings as little-endian Float32 data, matching the native `FLOAT[]` representation. + Bulk uploads carry raw bytes from Main to Rust: the vector and binary header bits are both set, + followed by a four-byte big-endian metadata length, JSON request metadata and one bounded byte + chunk. Only begin/chunk/commit accept this form; reject empty/oversized chunks and metadata that + already contains data. Rust owns one bounded ephemeral upload and acknowledges received chunks; + only commit forwards an atomic upsert through Rutis `Value::Bytes`. Native parts are at most + 8 MiB, keeping base64 plus bounded metadata below Rutis's 16-MiB internal message limit. + Native parts run sequentially under the same logical upload identity; the native owner assembles + and validates the complete batch before one transaction. Partial transfer failures abort the + known native upload. Reserve the resource's execution order from the first native part, so + subsequent reads and mutations cannot overtake the batch. Abort/close releases an incomplete + reservation; a committing write remains owned until settlement. Keep staging owned until then. + Rutis's internal base64 encoding remains an SDK detail. Query vectors retain canonical base64. + Preserve IDs, dimensions and ordering; validate byte lengths and finite values before effects. No dense-vector JSON number arrays or complete histories + cross this gateway. Verify Float32/native cast parity, including extreme inputs. +- Validate provider response vectors with a finite-number loop and clone the numeric array once, + preserving the SDK's rejection and raw-response isolation contracts without per-component Zod + parsing objects. Keep the installed provider versions pinned and patch only their embedding + response schemas, including Azure's internal OpenAI and Vertex's Node/edge entrypoints. +- Bound one logical upload to 16 MiB of decoded data and 50 records, with one active staged upload + in Rust until the native operation settles. Use explicit begin/chunk/commit/abort operations: + validate the complete batch and invoke the existing atomic native upsert once. Chunk acknowledgement is not a durable write + acknowledgement. Oversized/invalid operations fail before effects; never truncate or split a + logical transaction silently. Inventory every actual caller against these limits before cutover. + Begin and commit can each carry one bounded chunk, avoiding empty transport round trips without + changing the atomic write acknowledgement. Bound the first application chunk to 64 KiB to leave + room for IDs; bound subsequent chunks to 240 KiB within the unchanged 256-KiB frame limit. + Retain one outstanding chunk acknowledgement. Pack complete rows with native Float32 array + conversion and copy partial rows into the current chunk; retain no second full encoded matrix. +- Reuse one typed DuckDB data chunk per store and append bounded pages inside the existing + delete/insert transaction. Close the appender before commit; invalid dimensions or a failed + append roll back the whole logical batch. Preserve Float32 values and smaller subsequent batches. + Keep received Float32 matrices packed through insertion using the pinned DuckDB bindings already + shipped with the Node API. Validate finite values, exact byte length, little-endian host format, + actual FLOAT array type and row capacity before native copies. Set parent/child validity and + honor source byte offsets; never expose an unchecked native memory-copy operation over RPC. +- Keep padded base64 validation strict in the pinned Node runtime. Decode and verify by canonical + round trip with Node's Buffer implementation. Reuse an exact, independently allocated backing + buffer; copy pooled or partial buffers so decoded bytes cannot expose unrelated data. +- Launch only the vector runtime with `--max-semi-space-size=8`. Sustained bounded uploads must + not retain a throughput-grown idle nursery. Preserve the admission runtime's default heap policy + and validate query/write latency alongside aggregate footprint; no forced GC is used. +- Bound query results to the existing recall ceiling of 800, and list/delete operations to 512 + IDs. Current callers use single-item management deletion, at most 50 embedding-orphan IDs, + 256-row prune batches and 512-row orphan reconciliation; retain atomicity for each call. + Permit at most 32 pending vector operations and two active native + jobs; serialize writes and disposal for each store. Backpressure must not occupy admission slots. + Do not retain a second full encoded upload alongside the source vectors in main. +- Keep model/dimension mismatch, migration/staging/WAL, suspect-store leases, operation deadlines + and v1 progress/abandon rules from the current implementation. The 15-second runtime handshake + is separate from a store open/migration; do not impose admission's 10-second RPC deadline on + native work. Cancellation fences the consumer while the owner retains a running native operation + until it settles or its process has demonstrably exited. +- On native failure, preserve the existing quarantine marker and FTS degradation. On vector + runtime loss, invalidate its handles and pending work without replacing admission or replaying + unknown writes. Preserve new-process recovery semantics; G3 introduces no automatic native-worker + restart. Quarantine or terminal native recovery failure terminates the vector process before + native cleanup or GC can release uncertain ownership. The Rust host reaps it before reporting + loss. Map loss to the existing quarantine contract so clear/delete can report deferred cleanup; + erased canonical memories cannot reappear after restart. Normal shutdown drains/fences Memory + work and store leases before terminating that runtime. + +These bounds define the first service contract, not measured performance. G3 must prove native and +quality parity, atomicity under interrupted uploads/lost replies, lifecycle cleanup and resource +budgets through the real application before removing the original factory wiring. + +## Rust selection and resource evidence + +### Candidate ranking + +The ranking distinguishes architectural value from a performance hypothesis. No row below is an +observed speed or memory improvement. Existing native engines stay in place unless their actual +algorithm, binding or resource policy is the measured limitation. + +| Candidate | Priority and proposed language | Possible benefit to verify | Constraint or rejection condition | +| --- | --- | --- | --- | +| Admission and coherent Run control | High structural priority; Rust after TS core boundaries | Headless control authority, compact state/leases, explicit cancellation and fewer JS ownership objects | Queue work is small. Porting it does not remove V8 while TS adapters remain; preserve all fences and settlement semantics | +| Tape effective-view/replay and context projection | First CPU-oriented Rust candidate if profiles confirm cost | Fewer repeated JSON parses, large-history allocations/sorts and GC pauses; batch projection near data | Preserve UTF-8 binary ordering, retractions/replacements, provenance and canonical hashes. Reject full-history IPC copies or per-helper RPC that erase the gain | +| Tool result scanning/pruning and local document preprocessing | Conditional Rust batch operations | Bound large text/JSON traversal and materialization away from the control loop | Existing limits and artifact semantics remain; reuse sharp/OCR/search native work and do not reimplement it based only on language preference | +| Process trees, watchers, timers and scheduler calculation | Conditional Rust resource owner | Remove an existing Node utility host, consolidate idle runtime overhead and improve cancellation ownership | Preserve schedule claims/misfires, shell environment, OS process identities and power events. Reject an extra supervisor around the same live owner | +| Memory vector binding/resource manager | TS first; Rust only for measured allocation/engine integration cost | Reduce JS boxing/copies or eliminate a dedicated Node host once its last TS task moves | Native DuckDB memory remains. Account for IPC buffers and all handles; independent recovery requires a proven file-owner transition | +| Memory ranking, budgeting and pure normalization | Low/conditional Rust priority | Lower allocation/CPU only if a measured stage is significant under bounded workloads | Recall candidates already capped at 800. Preserve selection quality, mixed-language estimates and budget policy; reject noise-level gains | +| Shared Store/Tape persistence | Later Rust decision | Potentially remove JS storage objects/runtime overhead and make durable commands available headlessly | Encryption, migration, SQLite extensions/collation, transaction/recovery and maintenance parity are prerequisites; a new driver is not a free substitution | +| Provider SDKs, MCP/ACP adapters, Skills/hooks, extraction/reflection orchestration and remote channels | Keep TS by default | Mature protocol ecosystem and cheaper integration changes | Mostly I/O or model time. Rust is justified by a proven adapter bottleneck or removal of a runtime, not by a general rewrite objective | +| SQLite, DuckDB, native search, sharp and OCR engines | Reuse existing native implementations | Resource lifetime, batch sizes and data movement may improve without rewriting engines | Do not count engine time as JavaScript time or claim a native-to-Rust wrapper migration changes its core performance | + +Inspect the current Tape folds in +[`effectiveView.ts`](../../../src/main/tape/domain/effectiveView.ts) and +[`replay.ts`](../../../src/main/tape/domain/replay.ts), plus the context builder, as one potential +batch computation. If a remote operation needs the entire history to produce a small view, +co-locate that computation with Store or return a bounded projection from the current owner first. +Durable transaction callbacks and arbitrary synchronous repository calls are not wire protocols. + +### Measurement and adoption gates + +Establish two baselines: the application before admission extraction and committed `ffcd98770`. +Use the first to account for the total architecture cost and the second to attribute each next +module. Preserve immutable artifacts and isolated profiles, with versions and workload parameters. +For an explicit performance adoption decision, run at least five paired samples on the same +machine and report warm/cold results and baseline variance. This sample count does not apply to +ordinary correctness E2E or every structural extraction. Use a deterministic local Provider +fixture for local CPU/memory comparisons, then separately validate real-provider behavior. +Do not benchmark against a live user database. + +| Workload | Evidence required | +| --- | --- | +| Idle, cold startup and shutdown | All process identities, readiness time, CPU wakeups, aggregate memory, artifact size and bounded child cleanup | +| Streaming/delegation under load | Single and concurrent Sessions, existing 6-active/2-queued delegation case, interrupt/approval/pending input, renderer input-to-paint and main event-loop p95/p99, stream latency | +| Context/Tape scale | Fixed small/large histories and payload sizes; fold/build timings, CPU, allocation/GC, materialized bytes, transfer bytes and canonical output parity | +| Memory recall and maintenance | Fixed row counts/dimensions, cold/warm native queries, FTS degradation, reindex/clear and more than 8 Agents to exercise store eviction; quality, leases and queues must converge | +| Lifecycle failures | Lost replies, queue saturation, plugin/runtime death, stale callbacks, poisoned native handles, maintenance and shutdown; no duplicate writer, replay or leaked descendants | + +Reuse [Memory metrics](../memory-quality-gates-and-observability/metrics.md) and the existing +`test/main/performance/memory` workloads before adding another telemetry framework. Separate +orchestrator time, provider wait, native query time and IPC/serialization. Measure CPU seconds and +allocation as well as wall time. Record all process-tree members, not just the main V8 heap. + +For memory, report per-process RSS with its shared-page caveat and an appropriate platform measure: +private footprint on macOS, PSS/private memory on Linux, and private committed/working-set values +on Windows. Do not sum incompatible metrics or equate V8 heap reduction with whole-app savings. +The [Electron process API](https://www.electronjs.org/docs/latest/api/process#processgetprocessmemoryinfo) +documents macOS `private` memory as more representative than resident set size; the Rust +host and non-Electron children need corresponding OS measurements. Include native buffers, mapped +databases and retained IPC queues in interpretation. + +Before implementing a performance-driven Rust slice, record a numeric target and maximum accepted +startup, memory and responsiveness regressions in the live plan from that baseline. Adopt it only +when repeated end-to-end results exceed baseline variance, preserve output/quality and meet those +budgets. An isolation-driven slice may be accepted for proven failure containment within the same +resource budgets; report that purpose explicitly instead of calling it a speed optimization. + +Shared PR runners report wall-clock timing budgets without blocking on an individual overrun. +They still enforce correctness, ownership, bounded work/queues, runtime compatibility, finite +measurements and test timeouts. The explicit test-only `DEEPCHAT_MEMORY_PERF_REPORT_ONLY=1` mode +changes timing assertions only; it must not suppress a failed test or native operation. +Timing checks enforce their unchanged budgets by default when explicitly run for controlled +benchmarking; they are not a mandatory timing gate for each migration slice. Every slice still +requires relevant correctness/lifecycle tests and matching baseline/migrated application E2E. +Select targeted fixed-device resource comparisons when a module materially changes process +placement, IPC volume, batching or storage access, or when measured performance is its adoption +objective. Include transport and the whole process tree where those costs change. For a structural +extraction, start with one representative affected workload; expand only when it exposes a concrete +suspected regression. Ordinary port extraction requires no performance rerun solely because it +changes an async call. Reuse verified immutable runtime evidence for documentation or test-only edits. + +Choose the affected workloads and measurement budget before running. Report central tendency and +spread against a matching local baseline; do not infer a regression or improvement from one sample +or a noise-level difference. An isolated timing overrun does not block the next slice. Investigate +a material suspected regression with at most one predeclared confirmation batch, retaining every +sample; a reproducible material regression must be resolved before adoption. If that batch remains +inconclusive, stop measuring and record the uncertainty without a speed claim. Further measurement +requires a changed implementation, workload or concrete new evidence. CI timing noise alone cannot +block a structural extraction. Do not retry shared CI until it happens to pass, repeat unchanged whole-app captures, or +optimize production code solely to meet a noisy shared-runner sample. +Size completion waits for the bounded fixture and shutdown work; a fixture timeout is not an +additional adoption latency budget. Production handshake, retrieval and ownership deadlines remain +unchanged when a large benchmark needs more completion headroom. + +The present 64-KiB JSON gateway is admission-only. Memory batches, dense vectors, histories and +artifacts cannot be routed through it by simply raising limits. Freeze service-specific schemas, +bounded batch/stream behavior, backpressure and cancellation identities first; keep large data at +its owner and transfer bounded results or authorized artifact references. Consider a binary data +path only when measured copies justify it. Every mutation needs defined acknowledgement, +idempotency/recovery and unknown-outcome behavior, plus stale-generation rejection and shutdown. + +The next execution gate is baseline/contract selection, followed by the vector resource slice if +its costs and wire contract are acceptable. The live plan orders full Memory, cohesive Harness, +selective Rust and Everywhere work by their ownership dependencies. Headless availability does +not depend on rewriting every TS adapter in Rust. + +## Product destination + +"Everywhere" has three independently verifiable meanings: + +| Dimension | Product behavior | Rutis contribution | DeepChat responsibility | +| ---------------------- | ------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------- | +| Access anywhere | Desktop, browser/mobile web, CLI, and messaging channels can access an authorized Session Host | Internal services behind the host | Client UI, versioned application API, identity, permissions, event reconnect/resync | +| Run anywhere supported | The core can run as an embedded desktop backend or an unattended personal/self-hosted service | Runtime composition, language bridges, process lifecycle | Headless host adapter, packaging, configuration, secrets, storage and supervision | +| Use enrolled devices | A Session can request a capability on a selected machine, such as workspace files or desktop automation | Explicit peer services, remote runtimes, reconnect and resource ownership | Device enrollment, capability grants, workspace identity, operation settlement and locality policy | + +An example target workflow is opening a phone browser, submitting work to a home machine or server, +using an explicitly selected laptop workspace, and following the same Session from a desktop or +messaging channel. This is a product acceptance scenario, not current functionality. + +```text +Desktop Browser / Mobile web CLI Messaging adapters + \ | | / + +------- authenticated application API + events -------+ + | + Authoritative Session Host + Rust/Rutis + TypeScript core + Sessions / Tape / State / Policies + | | + Local capabilities Approved node links + | + Workspace / Desktop / Compute nodes +``` + +Rutis's cross-machine service protocol is an internal execution connection. It is not the browser +client protocol, a mobile UI toolkit, a user-account service, a replicated database, or a mechanism +for transferring a live Run between machines. Connecting a service by name also does not establish +equivalent business behavior; DeepChat owns the service's versioned contract and acceptance checks. + +### Deployment profiles + +| Profile | Session authority and lifetime | Client and native capabilities | +| ---------------------- | -------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------- | +| Desktop local | Local profile and backend; desktop application retains its existing quit policy | Desktop IPC adapter, local OS capability ports, offline operation | +| Personal/headless host | An explicitly installed service owns the profile and continues independently of attached UIs | CLI and later authenticated remote clients; desktop-only capabilities may be absent | +| Remote client | The selected Session Host owns execution and persistent state | Desktop, browser or mobile web acts as a client; local device execution requires separate enrollment | + +These are architecture/deployment profiles, not three new user-facing configuration systems. The +first implementation remains desktop local. A headless host uses an explicit Node runtime and +server-native dependency build, without installing Electron. Its credential backend and bootstrap +ports must be configured for that host; desktop safeStorage ciphertext is not portable secret +storage. Core startup must not assume a renderer, window, tray, system keychain, or display server. + +Clients attach to a Session Host; they do not create another writer for its active Session. A +headless host owns its root lifetime through its service supervisor, not an Electron window or a +phone connection. Losing all viewers does not implicitly stop that host. In desktop-local mode, +closing/quitting behavior remains the current explicit application policy. + +### Delivery horizons + +1. **Desktop separation:** prove the Rust/Electron launch path and remove business workload from + main without changing stored data or public behavior. +2. **Headless core:** run the same backend with Node and explicit host ports; attach the existing + CLI to local business operations without any Electron process or window. +3. **Multiple clients:** expose a deliberate authenticated application surface, then a browser + client usable on a phone; desktop and web can observe and submit to the same Session Host. +4. **Device capabilities:** enroll one execution device and prove one workspace-bound operation, + revoke it, and recover correctly from a connection loss during execution. +5. **Selective distributed features:** add independently placed compute or integration runtimes + only when workload locality, replacement, or recovery requires them. + +Native iOS/Android engines, browser-local Node/Rust execution, an unrestricted mesh, multi-user SaaS, +automatic host failover, and live Run migration are outside these delivery horizons. A phone web +client is the initial mobile access path; it does not promise the desktop's native capabilities. + +## Current implementation evidence + +| Boundary | Evidence | Consequence | +| -------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------- | +| Desktop and business composition | [`composition.ts`](../../../src/main/app/composition.ts) constructs business services, initializes plugins/MCP/Skills, closes services, and suspends/resumes database users | Extraction must move ownership, not copy the same composition into a second process | +| Shared persistent database | [`mainProcess.ts`](../../../src/main/app/mainProcess.ts) constructs Settings, Provider, MCP, and Agent database facades from one main database | Moving Session/Tape alone leaves shared storage and synchronous configuration dependencies across the boundary | +| Configuration access | [`settingsStore.ts`](../../../src/main/config/settingsStore.ts) switches a synchronous store to a database-backed implementation | A remote proxy cannot preserve arbitrary synchronous property reads; desktop consumers need explicit snapshots and asynchronous mutations | +| Desktop dependencies | Provider auth, MCP Apps, Skills, ACP, and Remote code import Electron APIs | These calls require narrow desktop ports before their business owners can move | +| Public routing | [`routeRegistry.ts`](../../../src/main/routes/routeRegistry.ts) has caller identity and output projection; shared contracts define route schemas | Preserve the existing renderer/CLI surface while adapting backend-owned handlers | +| Agent ownership | [`Harness boundaries`](../deepchat-agent-harness-boundaries/spec.md) define instance/run/operation/message fences and synchronous queue settlement | Framework generations do not replace these business identities or ordering requirements | +| Existing child processes | Scheduler, Code Mode, background execution, file watching, OCR, MCP, and ACP already use processes; Skill discovery also uses workers | Reuse their launch, cancellation, and recovery contracts; avoid duplicate supervisors | +| Scheduler writes | [`repository.ts`](../../../src/main/scheduler/repository.ts) owns atomic due-job claims; the utility host receives bounded scan replies without a database connection | Move this repository with the shared Store; keep the timer helper outside the writer authority | +| Runtime deployment | [`Managed Toolchains`](../managed-toolchains/spec.md) makes official Node optional; [`build-cli.mjs`](../../../scripts/build-cli.mjs) already uses Electron's Node mode | The core backend must start offline without downloading or selecting a user Node installation | + +The existing [`renderer API core`](../../../src/renderer/api/core.ts) resolves `window.deepchat`, +and preload implements its invocation/event transport. That seam is useful for a web adapter, but +it is not proof that the current renderer is browser-portable. Audit client-level capability and +Electron assumptions before selecting reusable UI code. This RFC introduces no renderer changes. + +The existing [`device sync contract`](../../features/cloudflare-tunnel-sync/spec.md) exchanges +portable durable units with LWW conflict resolution. It excludes active executions, approvals, +scheduler state, machine-local configuration, and arbitrary referenced files. Its pairing and +bounded transfer patterns are useful evidence, but sync access grants no Session control or device +execution authority. The current sync endpoint is not a remote application gateway. + +### Local feasibility observations + +Two ephemeral probes loaded `better-sqlite3-multiple-ciphers`, `@duckdb/node-api`, and `sharp` from the +current dependency tree. SQLite also completed `SELECT 1` against an in-memory database. The probes +did not open a user profile, install dependencies, or rebuild native modules. + +| Probe | Actual runtime | Result | +| -------------------------------------- | --------------------------------------------------------------- | ------------------------ | +| Shell Node | Node `24.21.0`, module ABI `137`, N-API `10` | All three modules loaded | +| Electron with `ELECTRON_RUN_AS_NODE=1` | Electron `43.7.0`, Node `24.21.0`, module ABI `148`, N-API `10` | All three modules loaded | + +These results establish a local runtime option, not packaged compatibility or full database/vector +operation. The checkout declares Node `>=24.22.1 <25` and Electron `43.8.3`; the installed versions +used by the probes differ. Verification must be repeated against the declared release runtime and +each packaged target. The admission integration check separately passed the real Rutis-to-Electron +handshake on Electron `43.8.3` / Node `24.22.0` / module ABI `148` on macOS arm64. That check does not +load SQLite, DuckDB, or image dependencies and establishes no packaged native-module compatibility. + +## Desktop-local process topology + +This is the target core topology. At `ffcd98770`, only admission uses the Rust host and TS runtime; +the remaining business composition and shared database still run in Electron main. + +```text +Renderer processes + Existing UI, typed clients, rendering + | +Electron main + Window lifecycle, OS APIs, renderer authorization, unlock UI, crypto + Renderer/CLI ingress, desktop configuration snapshots, backend availability + | private application gateway +DeepChat runtime host (Rust + Rutis) + Runtime ownership, dependency readiness, generation tracking, service routing + | + +-- Core backend (packaged Electron executable in Node mode) + | Shared database + configuration authority + | Agent + Provider + Session + Tape + Memory + | Business routes, approval lifecycle, plugin contributions + | + +-- Optional first-party feature runtimes, when justified + | For example, a separately restartable Remote channel group + | + +-- Existing tools/helpers through their existing lifecycle owners +``` + +In the desktop-local profile, Electron main starts and stops the Rust host. Rutis owns the core +backend process and its plugin +generation. Only one owner may restart a particular child. Existing utility processes may remain +launched by Electron main through a typed helper port when they require Electron's utility API; +their business leases belong to the requesting backend generation. The Rust host does not call +`utilityProcess.fork` directly. + +The initial migration adds one Rust host and one core backend process, excluding existing helpers +and renderers. Optional Node/Python/Go runtimes are not started at boot. No per-Session, per-Run, or +per-Service operating-system process is introduced. + +## Runtime integration + +### Host and launcher + +Use a small DeepChat Rust executable linking the pinned `rutis`, `rutis-bridge`, and, where needed, +`rutis-loader` crates. Reuse their runtime/session implementation. Do not implement another plugin +kernel, copy Rutis internals, or treat the upstream `rutis-host` CLI as an Electron integration API. + +For desktop-local deployment, the upstream public `Launcher::new`, `arg`, `env`, `cwd`, and +`inherit_fd` builders, together with +`LocalRuntime::launcher`, allow selecting the packaged Electron executable and the unmodified +Rutis Node runner. Set `ELECTRON_RUN_AS_NODE=1` for that child. Compile first-party TypeScript into +JavaScript before packaging; the core does not require a development TypeScript loader at startup. + +Use absolute verified paths for the executable, runner, package anchor, and backend entry. Keep +the external runtime dependency closure in an unpacked, application-owned directory readable by +the Rust host. Preserve the installed app's `runAsNode` capability, signing, and native-module +resolution. Never fall back to PATH Node, enable a managed download, or bundle another official +Node solely to make the desktop-local core start. A headless distribution has its own explicit Node +runtime/package and native-module validation; Electron's Node mode is not the core's API contract. + +Construct a deliberate launch environment for the host and core. Remove inherited debugger/import +overrides and validate required proxy/certificate settings through existing host policy. Do not +copy application secrets or user-plugin environment declarations into the core launcher. + +The admission integration demonstrates the actual launcher and runtime protocol. Each later +capability must also work through that application path; successful direct Electron execution +alone is insufficient. Unsupported native or packaged targets remain feasibility gates before +moving production data or selecting a different host. + +### Transport + +Use inherited stdin/stdout pipes for the application gateway between Electron main and the Rust +host, with a length-bounded JSON framing layer. Keep protocol output separate from diagnostic +output. Reuse Rutis for host-to-runtime traffic rather than exposing that protocol to renderers. + +Rutis `v0.16.0` supports inherited sockets or private Unix sockets on POSIX. Its local runtime +transport on Windows uses loopback TCP with a per-launch token. This internal transport is +distinct from the existing external CLI endpoint, which retains its UDS/named-pipe-only contract. +The Windows spike must verify loopback binding, token rejection, token disposal, and parent/child +termination. The desktop-local milestone does not advertise a public address or enable remote +node access. Later remote deployments require the explicit application/device boundaries below; +they do not expose the private desktop gateway unchanged. + +Application requests use asynchronous service calls. Synchronous cross-process business calls and +cycles through Electron main are excluded. In particular, main must not wait synchronously for a +backend operation that needs a desktop capability callback. + +## Ownership and interfaces + +| Owner | Responsibilities | Cross-process interface | +| -------------------- | ------------------------------------------------------------------------------------------------------------------------------------ | ----------------------------------------------------------------------------------------- | +| Electron main | Windows/tabs, native shell/dialog/browser operations, safeStorage, unlock prompts, app lifecycle, trusted caller creation | Narrow desktop operations, targeted UI events, crypto operations, configuration snapshots | +| Rust host | Runtime lifetimes, readiness, routing to approved services, generation invalidation, bounded shutdown | Application gateway and upstream Rutis runtime/session protocol | +| Core backend | Persistent domain state, business configuration, Agent/Provider/Session/Tape, Memory, queue and approval decisions, plugin ownership | Audited domain commands/queries, cancellation, ordered domain events | +| Renderer | Existing rendering and user interaction | Existing typed routes/events through preload and main authorization | +| CLI ingress | Existing endpoint authentication, principal/scopes, transport quotas | Existing approved domain routes; agent identity and quotas survive forwarding | +| Feature/helper owner | Connections, listeners, tasks, and processes created for its generation | The smallest service and cancellation contract required by its consumers | + +### Database and configuration + +The core backend is the normal writer for the existing shared application database. Preserve its +schema, encryption, transaction boundaries, Tape incarnations, projection ownership, and file +location. Do not introduce a data migration solely to support the process split. + +All main-process database facades move with their owning business services. Database opening, +schema repair/migrations, import/export, rekey, backup coordination, and reopen logic execute in +the backend. Electron main supplies unlock interaction and platform crypto through asynchronous +ports. It does not retain a writable shadow connection after cutover. + +Single-writer authority does not mean one connection for every file and operation. The Store +owner may open maintenance and snapshot connections internally; separate derived-cache/vector +files retain their own owners. A connection used only for reading is still writable-capable when +opened without a read-only option. Do not use that intent as evidence that Main can retain it. + +The current connection inventory is: + +| Source under `src/` | Connection and file role | G5 ownership requirement | +| --- | --- | --- | +| `main/data/databaseConnection.ts`, `main/data/mainDatabase.ts` | Normal shared SQLite writer, reopen and the common writable-capable connection factory; file-repair helper also opens through that factory | Move factory, normal writer, schema and repair with the Store owner; Main receives no connection or password-bearing reopen callback | +| `main/app/mainProcess.ts`, `main/app/composition.ts` and domain `data/database.ts` facades | Settings, Provider, MCP and Agent attach to the same startup database; Session, Memory, Project, delegation, Scheduler and app facades reuse it | Move these facades and synchronous repositories together; constructing a new facade must not open a second shared writer | +| `main/app/databaseSecurity.ts` | Password validation, source copy, encrypted staged file and target verification open writable-capable handles | Execute inside the Store maintenance owner; native wrapping and unlock presentation remain explicit Main capabilities | +| `main/sync/dataImporter.ts`, `main/sync/configImportService.ts`, `main/sync/index.ts` | Incremental import opens source and target paths; configuration import opens the target; overwrite replaces the closed active file; backup cleanup mutates a private copied file | Keep target opening/replacement and all temporary connections in the exclusive maintenance operation; do not leave Main with a path-based target opener | +| `main/data/backupReadLock.ts`, `main/sync/index.ts` | Backup snapshots pin the active file through a connection opened by the writable-capable factory; the active owner drains/checkpoints WAL; fallback ships the matching WAL | Keep snapshot lifetime, checkpoint and file copy with the Store owner; a backup receipt cannot release the actual copy lifetime | +| `main/provider/providerImportService.ts`, `main/app/startupMigrations/legacyChatImportService.ts` | Provider and legacy chat source files are explicitly read-only; legacy import writes through the shared Session facade | Preserve read-only sources; run shared-target mutations at the Store owner, including bootstrap import before ordinary admission | +| `main/desktop/browser/BrowserProfileImportService.ts` | Read-only browser cookie source and staged snapshot; writes a private backup snapshot, not the application database | Keep native browser/keychain consent and temporary-file cleanup in the desktop owner; never treat this as a shared-writer exemption | +| `main/data/schemaCatalog.ts` | Temporary `:memory:` SQLite schema inspection | Keep internal to schema/repair work; no profile writer is created | +| `main/ocr/ocrArtifactStore.ts`, `main/ocr/ocrRuntimeService.ts` | Separate encrypted `ocr/ocr-cache.db`, optional memory fallback and native cache-key provider | Retain the OCR cache owner and explicit crypto/resource lifetime; this file is not the shared application writer | +| `harness/memory-vector.ts`, `main/memory/infra/memoryVectorStore.ts` | G3 worker owns the vector-directory lock database and per-Agent writable DuckDB files | Preserve worker ownership, leases, quarantine and generation fences; Main must not reopen those files | +| `main/memory/infra/legacyV1Reader.ts` | Temporary in-memory DuckDB attaches the legacy vector file with `READ_ONLY` | Keep migration source reads under the existing vector owner and abandonment fence | +| `main/knowledge/database/knowledgeDatabase.ts`, `main/knowledge/index.ts` | Knowledge has independent writable DuckDB files plus temporary extension inspection | Preserve its existing file and initialization owner; G3 did not migrate Knowledge and G5 cannot claim otherwise | + +OCR runtime composition requires its asynchronous cache-key provider. Main supplies the existing +safeStorage provider for the fixed `ocr/cache-key.json` path; the runtime does not construct or +import a native provider. Keep that wrapped-key file under one native owner and the independent +encrypted OCR database under its resource owner. Preserve unavailable-key memory fallback, +unreadable-key recovery, helper lifetime and cache clear/close behavior. G5 transports this private +key operation only to the approved core generation; key material never enters public status, +logs, loader configuration or command arguments. + +The profile handoff also covers file writers and synchronous configuration readers that do not +open a database connection: + +| File or state family | Authority and G5 handoff | +| --- | --- | +| `app-settings.json`, `mcp-settings.json`, `acp_agents.json` and legacy Provider model/config files | Move the complete configuration authority and its attached adapters together. Main's existing bootstrap/migration stores must stop writing before backend admission; preserve legacy snapshots and formats without a second whole-file writer. | +| `plugin-settings.json`, installed plugin configuration and `plugin-tool-policies.json` | Keep installation/consent, activation, Hooks/Tape and synchronous tool-policy decisions with their one business owner. Main receives native presentation commands only. | +| `database-security.json`, wrapped Sync/Provider secrets and Codex/Grok/MCP OAuth credential files | Persistence, generation checks and queues follow their existing owners. Main supplies private crypto/unlock/browser effects, never writable stores or general secret snapshots. | +| OCR wrapped key, OCR derived database, Memory vector files and Knowledge files | Keep the native wrapped-key owner distinct from each encrypted/cache/vector resource owner. Transfer their actual lifetimes and maintenance fences; the shared-database handoff cannot imply these files have drained. | +| Provider/ACP catalogs, Skills metadata, toolchains, file/Remote/OCR caches and artifact spool | Preserve their explicit roots, existing cache writers and helper/resource lifetimes. Move business caches with their consumers; device file/image/browser operations retain narrow host capabilities. | +| Native windows, browser profiles, downloads, updater, logging and OS state | Main/device owners retain native effects and renderer identity checks. Business configuration reads use committed projections or async queries; native state is not a shared Store replica. | + +The current DeviceService reset implementation can remove shared files after the exclusive +shutdown-action claim. G5 must bind that claim to actual backend and independent-resource teardown +before deletion or relaunch; an RPC timeout or lost reply is not proof that writers have stopped. +Main's native database initializer and legacy migration construction are bootstrap entrypoints, +not normal backend readers. Move schema/repair/import work with the Store authority and remove +Main's writable startup shadow when the backend opens its files. + +The boundary follows existing business operations, rather than these connection wrappers: + +| Existing owner and source | Work that stays indivisible inside the backend | Data crossing the boundary | +| --- | --- | --- | +| `SessionTranscript`, `SessionSettingsStore`, `SessionTape` and `main/session/data/index.ts` | Message facts, transcript projection/head changes, retry truncation and clear/reset; existing Tape bootstrap reads can also write | Existing bounded Session/Tape commands and projections with session/incarnation identity; no remote projection-head read followed by a separate mutation | +| `SessionPendingInputs`, `SessionPendingInputStore` and runtime pending-input coordinators | Claim/consume/release receipts, accepted user facts and steer-message settlement under the existing transaction/runtime authority | Input/claim identities and acknowledged outcomes; `runInTransaction` closures remain local | +| `DeepChatMemoryIngestionProjectionTable` and Memory tables | `readCurrentRange` observes Tape and projection heads in one SQL statement; claim/tombstone checks, revisions and ingestion progress retain their existing owner-side consistency | Bounded current-range observations and existing Memory operations, with stale/current results; never split head checks from their rows | +| `AgentRepository`, `DeepChatAgentRepository` | Agent deletion checks protected/session state, retires Memory claims/directives, clears audit and deletes the Agent in one transaction | Agent identity and deletion receipt; namespace-retirement callbacks remain in the same owner | +| `LiveDelegationRepository` and its service/runtime | Capacity observation, contract identity, turn/event writes, effect intent and terminal settlement/CAS | Existing authorized delegation commands and correlated outcomes; mutation callbacks and capacity reads do not become independent RPCs | +| `CronJobsRepository` | Due-run insertion and schedule advancement, run claims and job/run/delivery deletion | Existing bounded Scheduler commands and snapshot; the 100-job scan and owner-side committed dispatch remain unchanged | +| `ProjectService` | Environment removal clears Session project assignments and updates project/preferences/projection together; directory selection commits project activation after native selection | Selected path and acknowledged versioned Project snapshot; native dialogs/open-path operations remain desktop capabilities | +| `SyncReplicaStore` and composition guards | Authorization/session-deletion guard, conflict checks, trigger suppression, imported rows, tombstones and peer cursor advancement | Validated bounded sync batch and result; authenticated transport establishes authority, not a caller-supplied callback | +| Settings, Provider, MCP and ACP database adapters | Configuration identity/CAS and acknowledged mutations remain with their business owners | Explicit public snapshots and mutations; no raw Store, table, row getter or database handle | + +Project bootstrap receives absolute system/profile directories and nullable Documents/Home paths +from Main. Capture these roots before serving snapshots; do not await native directory discovery +between synchronous settings and database reads. Directory selection and open-path operations use +required asynchronous host capabilities. Main supplies the existing DeviceService and shell adapter, +including native lookup failure diagnostics; Project retains candidate ordering, managed-directory +fallback, persisted revisions and its original transaction boundary. No native constructor fallback, +second settings writer or row-level transport is introduced. G5 moves this owner with its shared +database/settings authority and transports only native selection/open commands and plain results. + +Hook configuration, subscriptions, event enrichment and command ownership move together. Supply +the application version at composition instead of importing Electron for payload metadata. A +command's bounded diagnostic result is distinct from native child/stdio closure: timeout or an +error report cannot release that lifetime. Stop rejects new commands, kills existing children and +waits for both accepted enrichment and actual child closure. A 30-second drain failure rejects +maintenance/shutdown before Store teardown, and restart rejects while prior work remains owned. +Main must await this critical stop directly. Preserve command timeout results, redaction, event +eligibility/order, cancellation before enrichment completes and no automatic replay of uncertain +effects. Retain Node command execution with the cohesive owner; it needs no Electron launch adapter. + +Database readers also move with these owners. `main/session/data/sessionReferences.ts`, +`main/session/sessionHistorySearch.ts` and +`main/mcp/inMemoryServers/conversationSearchServer.ts` query the inherited shared connection; +they do not justify a second desktop read facade with schema/migration access. Keep reference +authorization and bounded search contracts at their existing operation boundary. Tape inspector +subscriptions currently combine backend head reads with renderer lifecycle hooks in Main's +composition: split the committed head data from native subscription ownership, preserving initial +snapshot admission, incarnation identity, revisions and renderer destruction cleanup. The debug +mock-session route also writes through the shared connection and must execute at the writer when +enabled. Table getters that initialize or repair schema remain backend work even on a read path. + +This inventory identifies connections and atomic operation groups; it does not establish that +the corresponding owners have moved. Keep the actual Store cutover pending until remaining +configuration/desktop consumers are classified and all Main writable paths are removed. + +Move scheduler claim/update transactions into backend-owned batch operations. Its utility process +may retain timers and schedule calculation, but receives snapshots and requests durable claims +from the backend. Preserve existing misfire and duplicate-run behavior. Inventory all other +connections before cutover; read-only imports and vector stores have separate explicit owners. + +G4 first removes the scheduler utility process's writable shared-database connection. Its timer +requests a bounded durable operation from the current Store authority; the operation observes +schedule state, reconciles due work and commits run insertion and schedule advancement together. +Keep the existing 100-job scan limit, misfire rules, unique scheduled-run identity and executor +claim semantics. The committed run notification originates at the writer, rather than depending +on a later timer-worker reply. Bind requests and snapshots to the worker generation, allow one +scan in flight and reject stale work before effects. The timer process receives neither database +credentials nor SQL. Main remains the Store authority during G4; G5 moves that authority with +the cohesive business services and removes main's writable access. + +System resume is a data-only Scheduler input. Electron main owns the native event subscription +and removes it on shutdown; it suppresses delivery during maintenance and shutdown. The Scheduler +business owner imports no Electron power API, ignores notifications while stopped, and fences +resume reconciliation by its start/stop generation before durable updates or timer dispatch. +Native subscription objects and asynchronous native-loading fallbacks stay outside this owner. + +Scheduler construction requires its local manager factory; the manager requires an asynchronous, +cancelable launch capability. Main alone selects the approved timer-helper entry, arguments and +environment. The returned facade permits only Scheduler commands, data events, PID observation +and termination; it exposes no Electron process object or generic native-launch options. Stop +aborts pending startup, while manager epochs reject late completion from a non-cooperative host. +Native startup errors settle once and release their child/listeners. Recheck ownership before +post-launch reconciliation. Factories and callback subscriptions are local composition inputs, +not serialized wire payloads; G5 supplies the capability through its generation-bound adapter. + +Session/Tape/Memory Store contracts expose the existing atomic business operations and bounded +projections. Keep internal synchronous repositories, SQL and transaction callbacks local to that +authority. These are not wire operations. In particular, Tape/projection-head observations, +pending-input settlement and Memory cursor/CAS operations cannot become independently timed +remote reads and writes. Maintenance commands own their active/source/staged files explicitly +and fence consumers before changing the active writer or encryption state. + +The Session data owner supplies one `clearTranscript` command that deletes pending inputs and +transcript projections and resets Tape in the same transaction. Runtime preparation precedes +that command; runtime cleanup follows its successful commit. Retry truncation retains the atomic +transaction in `SessionTranscript.deleteFromOrderSeq` and invalidates runtime projections only +after it commits. The main composition passes these business operations; transaction callbacks +remain private to the data owner. + +Desktop consumers receive a versioned snapshot of the configuration fields they need. Mutations +are acknowledged by the backend before snapshots/events advance. Keep synchronous reads local to +that snapshot; do not turn every `SettingsStore.get` into RPC. Bootstrap-only legacy settings and +encryption metadata retain a documented file owner. Ownership applies to the physical file as +well as its keys: two processes writing different keys through whole-file serialization can still +overwrite each other's updates. Atomic rename does not provide inter-process read/modify/write +serialization. + +`AppSettingsDbBackedStore` routes sensitive/portable keys to SQLite and other keys to the existing +legacy `app-settings` file; its `store` getter merges both. G5's profile owner controls that file +along with the database-backed configuration authority. Main may perform the existing default/ +migration bootstrap only before an exclusive handoff; it stops file writes before the backend +accepts ownership. During normal operation Main receives allowlisted public snapshots and awaits +acknowledged mutations. It must not keep a second ElectronStore writer, including for unrelated +UI keys. Preserve file format, defaults, migrations and machine-local backup exclusions. Backend +business readers keep owner-local synchronous reads; native UI reads use acknowledged snapshots. + +The private native-consumer projection includes resolved language, notification enablement, +close-to-quit, content protection, shortcut mappings, floating enablement/bounds and the logging +flag needed by Main diagnostics. Native system-theme observation stays in Main. Keep the public +settings projection separate from these internal consumers. Derive committed values at the +configuration owner, fence snapshots by owner generation/revision and install the initial snapshot +before dependent native initialization. Existing events alone are insufficient: floating bounds +currently persist without an event, and shortcut changes use their own event. Every affected +mutation must acknowledge its committed value. Convert floating-bound persistence and its error/ +shutdown handling together; replacing a synchronous setter with an ignored Promise loses failures +and pending writes. Updater channel defaulting can write configuration, so normalize it at the +configuration owner from an explicit version fact rather than inside a Main snapshot getter. + +Construct the application settings file through the same pinned Conf engine used by ElectronStore, +with required absolute profile/home directories and an explicit application version. Main supplies +those bootstrap facts and uses that factory in the actual startup path. Retain `app-settings.json`, +defaults, dot-path semantics, default migration behavior and atomic writes; no replacement JSON +writer or second cache is needed. Declaring the already resolved engine directly makes backend +construction independent of Electron. The database-backed adapter still owns sensitive/portable +keys after attachment. This factory alone does not transfer ownership: G5 must close Main's writable +access and hand the existing file/database authority to the backend before it begins normal work. + +Configuration consumers include Agent defaults/prompt/trace/migration state, Provider-specific +options, Session usage backfill, Project preferences, Skill/Knowledge/Hook/Remote settings, Sync, +Nowledge/export, onboarding and file/Tool limits. Some getters normalize or migrate and write +state, and Nowledge cleanup enumerates the merged store; those operations remain owner-local. +Desktop theme/fonts/window/login, proxy application, updater and renderer logging retain their +native effects in Main. The selected AppSettingsService/public-route snapshot remains a public +projection, not a transport for the merged store or credential-bearing Remote/Hook/Nowledge data. +Desktop appearance and login commands share the settings owner's bounded serial queue. Native +theme/login observations and language/theme refreshes return awaited plain data or completion; +the host receives the resolved locale/color rather than calling back into a pending core command. +Resolve system language from the explicit process bootstrap locale. Query login state from the +OS only when requested, and publish a login mutation's observed OS result rather than a stored +preference. Preserve display receipts' previous value inside the same command ordering boundary. +Main owns the system-theme listener; its coalesced observations use that queue and are fenced +during maintenance. Stop admission and drain actual host work before closing configuration +storage; an expired drain cannot authorize teardown or a second owner. Resume observations after +maintenance and remove the native listener at shutdown. These contracts prepare the G5 handoff; +they do not establish a second writable desktop configuration cache. + +Font enumeration and logging-folder access are awaited native capabilities. Keep font family +normalization and selection persistence with configuration; preserve the current normalized catalog +cache and empty-catalog degradation. Font queries and folder requests enter the same bounded +settings owner as mutations, so shutdown drains actual native work rather than an abandoned reply. +Main owns the existing font-list implementation and private profile/logs path; no renderer-supplied +path or replacement platform enumerator is needed. Propagate a native folder-open error instead of +acknowledging an unsuccessful launch. Content-protection and logging changes await their native +effects before publishing success. Main coalesces logging and content-protection changes into one delayed restart request, +pauses its timer during maintenance without losing the intent, resumes after successful recovery, +and cancels it on shutdown. Once fired, restart authority belongs to the existing Main shutdown +coordinator; draining configuration must not wait on its own restart teardown. + +Storage business owners receive explicit runtime directories rather than importing Electron to +discover them. SyncSettings requires the absolute home directory for its unchanged default folder. +SyncService requires absolute profile and temporary directories for configuration/database files, +archive extraction, staged backup copies and validation. It awaits Main's folder-open capability +and propagates both native rejection and a returned error before acknowledging success. Main keeps +the native shell effect; no database connection or file writer is added there. Backup snapshots, +configuration import, rollback and active/source/staged connection lifetimes remain with the +existing maintenance owner and move with the shared writer at G5. + +LegacyChatImportService requires its absolute source path. Main supplies the existing profile +chat.db path; the importer retains read-only source access and writes through the existing shared +target facades. KnowledgeService receives its absolute DuckDB extension directory from Main and +passes it to every database create/open path. Main performs the existing ASAR-unpacked resource +resolution. Preserve VSS loading/fallback, schema/migrations, task recovery and independent Knowledge +files; these files are not Memory's G3 vector stores. These boundaries add no alternate database +engine, implicit native fallback, separate supervisor or second profile owner. + +Plugin installation, consent, user-plugin activation, context Hooks and MCP supervision stay with +their business owners in the cohesive core. Hook history and execution share Tape authority; +registration and tool authorization share the same supervisor. Their synchronous internal reads, +update leases and integrity callbacks are local operations, not candidate row-level RPCs. +The plugin owner uses the existing Conf format, defaults and independent `plugin-settings.json` +file with explicit profile/home/application/resource/working directories and application version. It is +the only writer of installation and launch-safety metadata; do not merge it with tool policies or +leave a writable Main shadow at G5 handoff. Supply the resolved command environment locally. + +Main owns plugin settings windows and shell presentation through required asynchronous capabilities. +The core awaits native effects; closing a settings window acknowledges its actual closure, and +the renderer-to-plugin ownership lookup remains private to Main. Preserve package validation, +integrity/quarantine, user consent, credential scoping, rollback and uncertain-hook recovery. +Maintenance and shutdown reject new context-hook work, abort and drain accepted work before Tape +teardown; resumption cannot overtake that drain. This preparation does not establish G5 process +ownership or grant third-party Rutis access. + +Plugin tool policies have one explicit business owner with a required local persistence adapter. +Main constructs the existing `plugin-tool-policies` file after the effective profile is selected; +PluginService, MCP ToolManager/AppHost and ToolService use that same owner. Preserve the existing +policy array and owner/server replacement, owner-wide removal, allow/ask/deny, undeclared-tool +closure and ambiguous/disabled-owner semantics. Reads expose decisions or denied tool names, not +the backing Store. No module-level native construction or implicit global lookup remains. +Keep current synchronous policy decisions and mutations local to their shared authority; G5 moves +the policy state with its execution consumers and supplies acknowledged commands to any retained +desktop writer. This extraction does not substitute a cached policy shadow or synchronous IPC. + +Split crypto from persistence: the backend stores wrapped credentials; Electron main performs +authorized wrapping/unwrapping. Send unlock material only through the private transient channel +to the approved core generation. It must not enter command arguments, environment variables, +persisted loader configuration, logs, or crash diagnostics. + +Credential crypto uses an async desktop port with string/boolean results; Electron objects and +native buffers remain in its main-process adapter. The pinned runtime's native async safeStorage +operations must open existing synchronous ciphertext. Retain opaque wrapped-value storage and +keep reads free of credential rewrites. Lifecycle generations fence in-flight crypto results +across maintenance and shutdown, with authoritative checks immediately before sensitive return +or persistence. Await every Sync, MCP, plugin and export consumer; preserve destination binding, +serialized mutations, rollback and cancelled connection-attempt identity. + +MCP OAuth receives its private credential path, secure async crypto and browser-open capability +from Main. Interactive and enterprise identity flows share one credential owner. Preserve v1/v2 +envelopes, bounded records/payloads, Linux basic-text refusal and memory-only behavior. Serialize +acknowledged writes and binding-key moves; publish the existing decrypted record cache only after +persistence succeeds. Initial decrypt is single-flight, and reads do not rewrite v2 envelopes. +Reserve eight of 32 pending mutations for control commands; ordinary writes use at most 24. +Stop bypasses the queue and fences pending native results. G5 must frame legal large envelopes +within bounded transfers rather than raising the gateway limit or truncating payloads. + +Keep loopback callback validation synchronous: expose only the issuer and issuer-parameter policy +from acknowledged public discovery metadata. Never use an asynchronous credential read as a void +callback validator. Finalizing discovered server identity is an owner-local compare-and-set command +against server ID, generation, binding hash and endpoint; preserve concurrent unrelated settings. +Profile updates re-read current metadata after credential cleanup and reject replacement of the same +profile. Runtime stop/restart effects carry the originating server/profile lease through awaits; +logout, replacement and shutdown invalidate old SDK providers and delayed callbacks. Preserve +settings-window credential permissions, registered callback compatibility and exact issuer checks. +Plugin-owned connection changes use their existing supervisor. Carry the originating auth lease +through its probe, integrity/recovery and native launch waits; finish owned cleanup after canceled +startup, and never bypass that owner through generic MCP stop routes. + +Provider-specific Codex/Grok credential owners receive explicit private paths and the existing +async string-only crypto port. Preserve their v1 encrypted/plain-file envelopes, corrupted-file +backups, fsync/rename commits and file fallback policy; it differs from MCP's memory-only fallback. +Bound each file/envelope to 16 MiB and each normalized/decrypted payload to 8 MiB. Serialize at most +24 normal and eight reserved control mutations, fence in-flight reads against queued mutations, +and coalesce only pending reads rather than retaining plaintext tokens. Shutdown bypasses queues; +failed durable credential removal cannot produce a successful logout acknowledgement. + +Provider auth owners receive browser interaction explicitly and fence pending browser/device login, +refresh, status events and token return across account replacement, logout and stop. Keep endpoint +restrictions, refresh sharing, API-key fallback and single 401 retry. Synchronous runtime-provider +construction carries public configuration only. Resolve Grok credentials in its existing async +fetch adapter or direct trusted request immediately before building request headers; do not add a +plaintext credential snapshot to preserve synchronous helpers. Keep global initialization and +shutdown explicit at the actual composition, without default native Store construction. +Carry the originating auth scope through token acquisition and recheck before request dispatch or +401 refresh; cancellation and replaced owners cannot become API-key fallback. Status reads may retry +once after an observed account transition, and newer status publications supersede delayed reads. +Each auth owner admits at most 32 HTTP requests. Bound auth response bodies to 8 MiB using declared +and streamed sizes, and retain cancellation and the existing request deadline through body reads. + +Sync host connector tokens and peer pairing tokens use asynchronous string-only crypto ports +through the same adapter. Their opaque values stay in existing private machine-local files and +remain compatible with legacy ciphertext. Keep Linux basic-text refusal and preflight protection +before consuming a pairing code. Cancelled pairing cannot replace the saved identity before its +atomic commit; stale reads cannot release credentials after re-pairing, forget or shutdown. Transfers +recheck cancellation after unwrap and before authenticated requests. Host lifecycle serialization +and generation checks reject crypto results superseded by stop before starting a connector. +Do not cache plaintext, rewrite credentials during reads or add them to general settings/backups. + +Database security receives its database path, owner-local encryption metadata and asynchronous +native crypto explicitly. Its SQLCipher copy, validation and file replacement stay with the +database owner; Main owns unlock presentation and application quit. Metadata keeps the existing +file shape and opaque native ciphertext. At G5 its one writable facade moves with the owner; +it must not become synchronous RPC to a second Main writer. Maintenance-authorized encryption +uses the native crypto adapter independently of the paused ordinary credential store. + +Hold the per-file migration lock through native preparation and commit. Prepare wrapped target +metadata before closing the writer, then retain the original database until target reopen and +metadata persistence both succeed. Roll back both on runtime failure; stop fences pending native +results before password validation, return or mutation. A second migration or metadata repair +cannot enter while preparation is pending. This runtime rollback preserves the existing startup +file-recovery policy; it does not provide crash-atomic commit across the database and metadata +files. Durable cross-file recovery belongs to the conditional Store compatibility project. + +Live maintenance uses explicit data commands for verified backup-file import, named backup import, +encryption enable/change/disable and schema repair. Keep one exclusive admission through pause, +drain, operation, reopen, reconciliation and resume; caller callbacks, SQL and database handles +cannot cross this boundary. Startup recovery runs before the normal owner exists. Normal business +transactions and maintenance snapshot/staging connections stay internal to the Store owner moved +in G5, including any synchronous closures that never cross an ownership boundary. + +Ordinary request admission shares the maintenance owner's state. Refuse new and not-yet-executing +ordinary requests while maintenance is active; retain only audited native presentation/status +operations. Drain admitted finite operations before closing or replacing the writer, with a bounded +failure path that keeps the existing database. Maintenance command requests cannot wait for their +own acknowledgement as ordinary work. CLI alternate ingress paths participate too; an event +subscription's initial database snapshot is finite work, while subsequent in-memory event forwarding +is not a database lease. Detached background effects keep their own explicit lifecycle ownership. +Track actual handler completion independently of a startup task's reply promise: cancellation can +reject that reply before the handler exits. Recheck the original task signal before execution, and +retain running-handler ownership through cancellation. Bound request drain to 30 seconds before +maintenance dispatch; a timeout must leave the current writer in place. + +Main startup work has a separate actual-completion lifetime from its reply. Before maintenance +pauses or recreates services, cancel the Main startup target and drain running callbacks, including +callbacks from an already canceled run. Pending work never executes and releases its deduplication +entry. Keep immediate cancellation replies and existing resource-lane limits. A 30-second drain +failure rejects maintenance before service teardown or writer replacement and restores ordinary +admission; it must not revive or duplicate a still-running startup owner. Background migrations are +scheduled again after successful maintenance or on the next launch. + +Shutdown closes ordinary admission and background availability before teardown. Cancel and drain +actual startup callbacks before disposing their service dependencies, then drain ordinary requests +and the actual database-maintenance owner before closing the writer. Keep completion-only ownership +for maintenance, including verified-peer commands; do not retain command results or credentials. +The two device commands that await shutdown before restarting or resetting data cannot wait for +their own request lease. Their existing validation and exclusive shutdown-action claim still apply. +CLI authorization completes before dispatch and retains its ordinary lifetime for those commands. + +A maintenance operation interrupted by shutdown must not reopen the database, reconcile runtime +state or resume background services. Recovery-triggered shutdown starts only after that operation +releases its own lifetime. Critical completion barriers have bounded failure paths and propagate +failure before writer close or a terminal action; best-effort cleanup must not swallow them or claim +successful ownership release. These are lifecycle deadlines, not performance acceptance budgets. + +### Public routes and desktop capabilities + +Reuse existing shared route names, schemas, caller types, and output projection. Classify each +route as desktop-owned, backend-owned, or an explicit orchestrated operation. A proxy is registered +only for the audited backend allowlist. Audit `z.custom` and non-JSON values instead of assuming +every current route is already a complete wire validator. + +Electron main validates the actual IPC sender/document or CLI connection, constructs the caller, +and forwards that identity. The backend revalidates input and applies domain permissions. Caller +identity, `internal` authority, and approved desktop capability names cannot come from a renderer +payload. Preserve plugin-settings route ownership and renderer-destruction cancellation. + +Desktop ports cover real operations such as OAuth browser interaction, crypto, approved helper +launch, and targeted approval presentation. They do not expose an Electron module, a generic +method dispatcher, arbitrary eval, or an unrestricted secret/settings store. Permission and +approval lifecycle state stays with the backend Run; main transports authenticated human answers. + +Skills receive explicit home, temporary, user-data and ordered bundled-resource directories at +bootstrap, plus an asynchronous directory-open capability. Settings defaults, temporary imports, +rollback paths and plugin-source checks use those supplied directories. Discovery, filesystem +mutations and scoped operation leases remain local to the Skill owner. Native watcher creation +stays behind its existing injected service; importing its pure request-ID helper must not load +the Electron host. Shared console diagnostics are platform-independent and retain captured sinks; +the desktop entry supplies the development debug flag. Moving a Skill owner must not introduce +Electron imports through logging or utility barrels, a second service instance or a native fallback. + +The desktop entry owns legacy settings-file construction and supplies the current application +version to configuration migration and Provider initialization. The shared settings wrapper must +not import Electron or construct a native store. Provider model facts and user overrides require +the existing database-backed stores at construction; no runtime helper may silently create legacy +JSON storage or replace its storage authority after use. Legacy JSON import remains a startup +operation that completes before module settings attach to the one database writer. Catalog-cache +bootstrap and other native configuration domains require separate explicit ownership before G5. + +MCP and ACP settings receive their initial storage explicitly; pure default builders retain the +existing platform-specific server defaults and ACP migration format. Main constructs native +bootstrap files before import and database attachment. After attachment, MCP configuration uses +its database adapter. ACP enabled/version/shared MCP selection also use the database; its legacy +registry/manual/install metadata becomes an isolated read-only snapshot for import and fallback +reads. Live Agent changes already use the unified Agent repository. Remove unused legacy mutation +entrypoints and reject writes through the attached legacy projection. Normalize legacy ACP data +before the migration snapshot, and transfer the configuration/database owner together at G5 +without retaining a writable Main shadow. + +Provider catalog bootstrap receives its profile cache directory and bundled catalog file from +Main. Importing model capability/settings modules performs no native path lookup or cache I/O +before this bootstrap. Packaged catalog bytes live outside ASAR so ordinary Node can read the +same file. Keep one catalog/cache owner, privacy-aware automatic refresh, existing payload/TTL +bounds and single-flight refresh. Initial catalog loading performs no network work. Automatic +refresh belongs to the existing Main idle Provider task, including its maintenance cancellation +and drain; a canceled task cannot publish or write a late response. Shutdown cancels every refresh, +fences late cache writes/events and waits for actual completion before disposing dependent owners. +Provider request metadata +is a plain bootstrap header snapshot beside the existing locale capability. Token exchange and +HTTP failure sanitization must not import the native Copilot device-login window. +Ollama model pulls receive the existing TLS debug policy from Main through the Provider environment +port. Keep the native development/explicit-debug decision at the host; a backend import must not +load Electron to evaluate it. Production certificate-validation policy is unchanged. +Shared image-cache reads/writes use the existing trusted `DEEPCHAT_USER_DATA_DIR` process bootstrap +set by Main, require an absolute profile directory and have no native/home-directory fallback. +Retain all path, symlink, size, cancellation and remote-address checks. This removes an image +mapper's transitive Electron dependency without changing cache location or granting new access. + +ACP connection/session execution receives application version, home and temporary directories as +plain host bootstrap values. Thread these through the existing lazy runtime owner to its process, +terminal and persistence owners. Keep shell/environment expansion pure and share it with MCP; +remove native lookups from the shared helper. Preserve workspace containment, controlled temporary +fallbacks, launch/toolchain selection, terminal output bounds, persisted links and process cleanup. +This preparation does not relocate ACP execution or its native PTY binding to another process. + +MCP client execution receives an absolute home directory, application version and the existing +toolchain owner explicitly from composition. Preserve command rewriting, live toolchain selection, +PATH precedence, environment binding isolation and process cleanup. Each registry probe batch awaits +the current resolved proxy URL through the host capability, preserving system/custom proxy and +authentication behavior without importing the native proxy module. Neither the client +nor its server manager may construct a native dependency or locate a process-global toolchain. +This boundary does not relocate MCP execution or its AppHost presentation owner. + +MCP App instances, pending creation and consent decisions use one native-free registry beside +their source and tool authorization owners. Count pending creation against the existing total and +per-owner instance limits. Revocation by window, server or maintenance invalidates pending creation +before it can publish a late view. Main supplies required asynchronous owner observation and link +opening. The creation owner aborts pending observation and metadata waits on revocation, including +SDK resource requests, while the server owner retains its shared connection. Main retains +protocol responses and native session permission handlers. Native handlers use +bounded policy and browser-permission business operations, validate the current native owner and +deny uncertain or revoked work. Preserve saved-source/configuration fences, separate sandbox +origin/CSP, explicit per-request consent and the absence of standing browser grants. + +ACP installation owns explicit install/repair, enable-triggered preinstallation, uninstall and +binary launch preparation, including their repository and Provider continuations. Identical work +shares one physical download; conflicting same-Agent mutations cannot publish stale state or +recreate files after uninstall. Cancellation covers headers, bodies and extraction boundaries; +drain waits for actual settlement before database maintenance or close. Canceled work restores its +previous acknowledged install state only while it still owns the pending state. Background +admission uses the existing local database gate, which moves with the Store in G5. Prepare, +validate and chmod a replacement in a managed staging directory before activating it; download or +validation failure preserves the installed binary. Keep archive traversal/checksum guards and the +120-second download timeout. Enable acknowledgement remains prompt. This does not establish +power-loss durability across filesystem activation and SQL publication or move synchronous +extraction out of Main. + +Background command execution keeps its existing dedicated helper and process/session ownership. +Main supplies an approved absolute helper entry and cancelable launch capability; the business +owner accepts a plain command/event/lifecycle facade with no Electron fallback or path guesses. +Tool, Bash and Skill consumers receive the same owner explicitly. Stop rejects new work before +canceling helper startup, fences requests after asynchronous authority checks, compensates a late +spawn and awaits actual callback settlement. Child identity attestation, conversation isolation, +permission/journal commitment, output offloading and owned Skill package cleanup remain intact. +Root shutdown requests current Harness generation cancellation before stopping the command owner, +so a rejected helper startup cannot begin another model round while the app is already stopping. +Helper loss can restart on subsequent ordinary work; terminal shutdown cannot reopen it. Native +process objects remain inside Main's adapter. G5 supplies the corresponding backend-owned launch +capability without exposing arbitrary process-launch IPC. + +Code Mode receives its approved helper launch through a required host capability. Main owns the +absolute helper entry, native events and per-host RSS sampling; preserve the restricted environment, +64 MiB heap, unsigned-library policy, protocol/READY deadline and memory/output limits. Reserve a +session before asynchronous startup. Caller cancellation keeps a prompt receipt while the owner +retains physical startup and compensates a late helper. Shutdown closes admission, cancels pending +startup and waits for actual startup, RSS and nested-tool callbacks before Store teardown. Sampling +coalesces per cell and cannot act after that cell stops. Preserve session-scoped state, permission +retry, capability/journal identities and existing result/yield semantics. No optional native +fallback, process object, raw metric list or generic PID/launch endpoint crosses the boundary. + +AgentToolManager receives absolute system/profile temporary roots and an asynchronous image-size +operation through its required desktop capability. Main owns app-path discovery and nativeImage; +only width/height values leave the adapter. Preserve the existing allowed runtime directories, +default workspace creation and temporary-root fallback, file/symlink authorization, image preview, +metadata failure fallback and vision selection. Carry cancellation through the image probe and +recheck before image caching or Provider work; a late result cannot start those effects. The +business manager has no native import or implicit native host construction. This capability does +not expose a new generic file-read or root-discovery route to renderers or external plugins. + +File preparation remains with its Node-capable business owner: MIME detection, document/image +adapters, validation, generated-name temporary image writes and message-file projections. +Require its absolute profile directory at construction and await temporary-directory creation when +writing. Keep adapter instances internal and expose no arbitrary profile write/delete operation. +Preserve existing size, token, PDF routing and symlink +read checks. Main owns image save dialogs, clipboard decoding/writes and native network image +retrieval as a separate desktop action capability. Route those UI actions directly to Main rather +than looping through the backend. Preserve data-URL/raw/cache/HTTP image handling, MIME and filename +rules, cancellation responses and actual-byte saves; nativeImage values never leave that owner. +Main's image-cache access is read-only, and a save writes only the native dialog's selected target. +This split adds no generic filesystem route, replacement image engine or gateway-size increase. + +Remote's channel/session policy, channel clients, attachment handling and binding/configuration +authority move together. RemoteConversationRunner requires its profile image/generated-asset roots +rather than discovering them through Electron. Actual downloads and decryption remain with the +co-located clients/Runner using their existing fetch implementations, timeouts and file-preparation +policies. ChannelAdapter contains lifecycle/events, with no native network dependency or unused +base64 download API. Preserve the active call chain; do not introduce a per-download host RPC or +a new global size cap for methods that no consumer calls. + +Keep attachment bytes local to this business owner during G5's process move. A later, actual +cross-host/device transfer must define bounded authenticated artifact/staged operations before +adoption. Do not return a Response, stream or oversized base64 control frame, enlarge the gateway +limit, silently truncate legal files or replay a lost download. CLI ArtifactSpool's human/Agent +principal is not channel authority: never fabricate a human CLI caller or borrow unrelated +artifacts. Bind any selected transfer to its trusted request/channel/backend lifetime, reserve +bounded capacity before reading and retain actual cancellation/cleanup ownership. + +Main owns Feishu/Weixin native login windows; the Remote owner retains auth/session state, callback +server, nonce, expiry and credential/configuration commitment. Native capabilities carry plain +operation IDs, URLs and closed/error events, never BrowserWindow/WebContents objects. Preserve +Feishu's brand/redirect navigation rules, popup denial and isolated secure web preferences. +Register an operation before awaiting native startup, fence late opens/close events by generation +and operation identity, compensate a late native open after cancellation, and drain callback-server +and window cleanup before owner teardown. Native events cannot synchronously re-enter a pending +business command. Native module loading alone does not complete Remote's cutover. + +The selected desktop login adapter owns Feishu/Weixin BrowserWindows behind asynchronous +operation-ID open/close commands and closed/error events. Authorization starts reuse Remote's +existing serialized runtime queue. Stop closes admission, aborts owner signals, fences late +registration/login results and waits for actual startup, polling, callback and native-close work; +initialization waits for that stop before admitting a new owner lifetime. A late native open is +closed by its original operation identity. No BrowserWindow, Response or app secret crosses this +port. Main also closes any retained native windows during teardown. + +Feishu retains its loopback server, nonce, TTL, token/user exchange and pairing commitment in Core. +Cleanup waits for active callbacks and response completion, then closes partial-header connections +and acknowledges server release. User window close remains cancellation even when destruction +rejects navigation before the native closed event; a load failure in an active window remains an +error. Native navigation and popup rules and isolated web preferences remain explicit. Weixin +login polling carries owner cancellation through HTTP timeouts and poll sleeps, retires canceled +QR sessions and cannot commit credentials after stop. Profile image/generated-asset paths are +derived from Main's explicit absolute profile directory; the workspace default is queried through +an asynchronous owner port. The complete Remote module can import and initialize in ordinary Node; +G5 still has to move its actual composition and authenticated host-capability wiring. + +ACP registry ownership includes its manifest, icon cache and acknowledged repository/Provider +updates. Main supplies absolute profile/built-in directories and an asynchronous icon-text +capability; the core receives no Electron Response or native object. Retain the existing URL, +SVG, privacy, TTL and request-timeout policies. Package one registry/icon snapshot outside ASAR +and remove implicit app/cwd path lookup. Local initialization performs no network work. The +existing Main startup task owns automatic refresh; manual refresh remains within route ownership. +Keep refresh single-flight, carry cancellation through icon work, and recheck before cache writes, +repository effects and event publication. Terminal stop aborts work; drain waits for actual +completion before database disposal. A canceled startup task cannot write after maintenance, +while a new task or manual request can still use the live owner. + +First-party configuration selects the core entry and service exports. Rutis dependency injection +and scopes are not authorization. This migration introduces no arbitrary third-party Rutis code +loading or untrusted peer access. Existing `.dcplugin` and portable user-plugin behavior retain +their reviewed package, consent, ownership, and execution contracts. + +Provider OAuth presentation stays in Main while ProviderRuntime owns configuration observations +and credential commitment. The private sign-in target contains only Provider ID, public client ID +and an opaque configuration identity. Main receives no saved API key, full Provider configuration +or settings-file mutation capability. It validates the new token with GitHub and awaits the Core +credential command before acknowledging success. + +Codex/Grok login controllers, callback/refresh state and credential queues stay with their Provider +consumers. Main's OAuth facade receives asynchronous status/login/callback/cancel/logout commands; +it does not initialize those business owners or receive their complete writable credential stores. +Keep synchronous load-error/revision observations inside each controller's existing authority. +Native browser opening and crypto remain explicit host capabilities, with the existing public +auth status schemas and stop/drain behavior. + +Native deep-link actions receive an asynchronous provider-existence query instead of Provider +settings. Validation finishes before the settings preview opens; saved Provider credentials stay +at the business owner. MCP installation deferral uses Main's observation of acknowledged Core +startup, with latest-pending semantics. Reset this observation when stopping, and reject a late +startup acknowledgement after shutdown or maintenance admission closes. Readiness observation is +presentation state; actual MCP configuration and execution authority remain in Core. + +Core compares and commits in one command without an await between reading current configuration +and writing. The identity covers Provider ID, protocol, current credential and normalized client +ID using a private per-runtime key. It rejects targets from another runtime, stale concurrent +logins and malformed tokens while merging unrelated current settings. This identity detects stale +configuration; authenticated caller grants remain a separate G5 requirement. Maintenance rotates +the identity key; stopped runtimes reject queries and writes. Main fences late query/validation +results during shutdown and aborts token validation. Existing registered Copilot/Codex/Grok routes +keep their schemas; no generic OAuth fallback or unregistered loopback login server is retained. + +### Gateway and event flow + +Native Window, Tray, Notification, Shortcut and floating-widget readers use a private committed +configuration projection. Its explicit allowlist contains resolved language, notification, +close-to-quit, content-protection, shortcut, floating-widget, diagnostic logging, privacy and +update-channel values. Nested shortcut and bounds objects are allowlisted too. Never copy the +merged settings Store or credentials into this projection. Publish it immediately after the +configuration write, before native effects or ordinary settings events; native effect callbacks +must not query the pending configuration command again. Main reads native theme state directly. + +The projection carries an owner identity and monotonically increasing safe-integer revision, +rejects foreign/stale snapshots and returns defensive copies. These fences do not establish a +cross-process readiness or owner-replacement protocol; G5 must authenticate adoption of a new +backend generation. Main's projection is neither a writer nor a public renderer snapshot. +Floating bounds use an acknowledged owner mutation, with no optimistic cached update. Validate +the current floating window and its main frame before accepting drag writes. Stop native write +admission before draining the configuration queue and outstanding native writes for maintenance +or shutdown. Floating enable/disable awaits actual native completion within the same serialized +configuration command, so a queued disable or Store close cannot overtake window creation. +Update-channel normalization remains with the configuration owner; Main supplies the application +version, native updater and diagnostic-file lifetime explicitly. + +The selected sixteen-field application settings projection uses one Main presentation revision +sequence across snapshots, mutation replies and `settings.changed` events. Renderers retain this +revision and accept values per key, so late replies cannot reverse newer fields or discard unrelated +partial values. The sequence lasts for Main's lifetime and its renderer contexts; it is not a durable +database revision. Refresh the allowlisted projection after database maintenance and reject new +operations while maintenance or shutdown is active. + +Agent display changes use one validated asynchronous data-only mutation and an acknowledgement +with the native owner's previous/applied value. Keep skill authorization and durable dispatch +commitment at the Agent owner. G5 routes portable preferences directly to the backend configuration +owner and native device effects to Main; a Core-to-Main-to-Core mutation loop must not replace +direct ownership. Other configuration entry domains and host capabilities still require their own +G4 boundaries. Neither a second settings writer nor cached secret values belong in this projection. + +The application gateway carries request, reply, cancel, event, and readiness/control messages. +Every message identifies a protocol version and host epoch; requests/replies also identify a +request ID. A core generation change invalidates outstanding requests, subscriptions, and desktop +capability leases from that generation. Keep Session IDs, Run IDs, message IDs, and Tape +incarnations as their existing separate identities. + +Frames and queues have finite byte/count budgets checked before allocation and parsing. Establish +production values from the route payload inventory and benchmark. Oversized legal results must +use existing paging/artifact capabilities or an explicitly bounded transfer contract; never +silently truncate a result or reduce an existing public limit. Cancellation and shutdown have +reserved capacity so progress traffic cannot block control messages. + +Keep Provider streaming, tool execution, context assembly, Tape writes, queue settlement, and +Memory coordination inside the backend. Forward UI-visible progress in bounded batches where +the existing event contract permits coalescing. Ordered facts, approvals, terminal state, and +errors cannot be coalesced away. Do not publish full transcript snapshots for every token or add +per-token service calls through the Rust host. + +Main fans backend events out through existing renderer and CLI projections. Streams carry a +generation and monotonic sequence. A gap or backend change triggers authoritative bounded +resynchronization; it does not create a second durable event store or infer success from a missing +reply. Main and renderer state remain projections of backend facts. + +## Everywhere application and execution boundaries + +### Application clients + +Keep one application command/query/event contract with transport adapters. Desktop local uses +preload/IPC; a headless local CLI uses the existing UDS/named-pipe policy; remote web/CLI clients +use an explicitly enabled HTTPS application gateway and authenticated event stream. Reuse existing +bounded event/SSE patterns where appropriate instead of requiring another protocol for ordinary +chat interaction. No public endpoint is enabled by extracting the desktop backend. + +Remote exposure is an allowlist of application capabilities, not publication of every Electron +route or of the Rutis bus. Establish the authenticated client principal, profile/Session grants, +quotas, origin rules for browser access, credential expiry/revocation, and cancellation ownership +before dispatch. Network clients cannot claim a `webContentsId` or become an internal caller. +Existing local-control, sync-transfer, and native IPC credentials are not interchangeable tokens. + +The renderer bridge must be supplied by the selected client adapter rather than unconditionally +read from `window.deepchat`. Reuse domain clients/types and UI code only after auditing their +desktop assumptions. Capability discovery tells clients which operations the selected host and +device can perform. Native windows, shell APIs, file pickers, CUA permissions, and OAuth presentation +need an explicit supported adapter or an unavailable result; they cannot be simulated by a browser +transport. Network input receives full validation; trusted same-app validation shortcuts do not +automatically apply to remote events. + +Several authenticated clients may observe one Session. Submissions still pass through the same +backend admission/queue and permission owner. On disconnect, do not cancel an accepted Run solely +because one viewer disappeared. Cancel client-owned in-flight presentation/transfer requests +according to their contracts; explicit Run cancellation remains a separate authorized operation. +On reconnect, resume an ordered event cursor or read an authoritative bounded snapshot. Lost +replies retain the existing unknown-outcome and durable-identity rules. + +### Session authority and offline behavior + +Address a live Session by its authoritative Host and Session identity. One host owns its current +execution, queue, approvals, database mutation, and Tape lineage. Connecting another client does +not copy that authority. Keep the database on host-local storage; do not share a writable SQLite +file over a network filesystem or let browser clients write it. + +Existing LWW device sync remains a separate mechanism for portable durable records between +independent profiles. It does not replicate active permissions, pending execution, tool processes, +or provide distributed consensus. A thin client's event cache is a projection, not a writable sync +replica. Imported history never executes tools, and reconnect never imports a client history over +an active host Session. Preserve existing sync safe-application gates. + +Desktop-local operation continues offline. A client disconnected from a remote host can retain +its local view and unsent input, but cannot claim its task was accepted or executed remotely. +Reconnection requires explicit admission/deduplication of unsent work, not blind replay of a +transport queue. Starting a local offline Session creates its own authority; transferring an active +Session's ownership or merging two active executions is outside this design. + +### Device capabilities and locality + +An execution device is separately enrolled for a bounded capability set. Its registration identifies +the device, allowed services/workspaces, current connection generation, and availability. Reuse +existing pairing/transfer primitives where their contracts fit, but issue separate execution grants +with revocation; a paired sync device is not automatically an authorized executor. + +Keep a stable backend-owned capability directory/tool boundary and bind each admitted operation +to the selected device generation. The entire core must not inject every optional device service +as a required Rutis dependency: losing a laptop must not unload the Session Host. Individual feature +plugins and resource owners may depend on their required device service. Reuse existing tool/MCP +ownership patterns rather than making all business services dynamically discoverable. + +Workspace operations identify the enrolled device and registered workspace as well as a path +within its allowed root. A server path, phone attachment, and laptop project directory are not the +same resource. The authoritative host owns explicit uploads/artifacts; referenced local files stay +on their device unless an authorized transfer copies them. Do not infer file replication from a +synced absolute path. Keep local computation near its workspace/data and return bounded artifacts +or results; avoid remote calls for individual tokens, SQL statements, or internal loop functions. + +Native permission checks and execution constraints run on the device that performs the action. +An approval from a remote client cannot grant OS accessibility/screen-recording permission, unlock +another device's keychain, or make an offline workspace available. Provider credentials remain with +their chosen host; unrelated execution devices do not receive the profile's secret store. + +Prefer explicit direct links to the Session Host, including outbound device connections for NAT +where supported. Reuse Rutis peer/runtime transports with TLS for non-loopback links and explicit +service exports/imports. Rutis peer events travel one hop; the Session Host intentionally projects +application state to clients instead of relying on a transparent event mesh. + +Keep remote plugin loading (`host: true`) disabled for ordinary device enrollment. Rutis's static +token examples and reconnect are not a complete device identity/authorization system. An embedded +identity/revocation adapter must close the matching active connection and reject re-enrollment +with revoked credentials without restarting unrelated devices. Validate every operation against +the current grant and generation, including operations already queued when revocation arrives. + +A remote runtime disconnect unloads its rows; reconnect creates another runtime session and loads +them again. This is resource recovery, not continuation of its old function stack. Record remote +operation identity and settlement in the authoritative backend. A lost device reply can mean an +unknown side-effect outcome; query available durable evidence before an explicit retry. Device +loss marks the affected operation/capability unavailable and leaves unrelated Sessions usable. + +## Lifecycle, replacement, and recovery + +### Startup and readiness + +For the desktop-local milestone, create the desktop shell and private gateway first. Establish the protocol/build compatibility +handshake and desktop capabilities, then start the core runtime. The core opens/unlocks the +database, runs existing startup recovery, and publishes readiness only after required owners are +usable. Renderers may show the existing bootstrap/loading state before business readiness. + +Treat runtime process existence, plugin activation, database readiness, and model/tool availability +as distinct states. A missing required service is visible as blocked startup, with a bounded +diagnostic; it cannot leave a request waiting indefinitely. + +### Replacement boundaries + +The extracted Harness composition forms one core backend plugin. Admission and the bounded +vector-resource slice can move independently before that composition. Keep ordinary classes, +pure modules, and narrow ports inside their capability. Introduce additional plugin boundaries +only when they have independent startup/replacement/cleanup responsibilities and allow an old +manual lifecycle path to be removed. + +Optional feature runtimes may restart independently of active Sessions when their existing +contracts permit it. A core replacement first closes admission and settles or cancels active work +through the existing lifecycle owners. Do not hot-reload the whole core on an ordinary model or +settings update. A runtime's process is a shared failure domain for the plugins inside it. + +### Failure and restart + +On core loss, main remains alive, revokes old-generation capability leases, and marks business +operations unavailable. Pending transport calls fail with a distinction between unavailable and +unknown mutation outcome. Never automatically retry a side-effecting request because its reply +was lost. Existing durable mutation identities and recovery records decide whether work committed. + +Before restarting, establish that the previous database owner and its owned descendants have +terminated. An unresponsive but live core is not a safe reason to create a second owner. Reuse +existing child-process identity checks and bounded termination. If ownership cannot be established, +remain unavailable with a diagnostic instead of opening the profile concurrently. + +Only the designated supervisor applies bounded restart/backoff to each child. A recovered core +uses existing Tape, pending-input, interaction, plugin-hook, and delegation recovery contracts. +Uncertain hook/tool outcomes and held historical queue items are not automatically executed again. +Do not promise uninterrupted generation across a process crash. + +### Shutdown and database maintenance + +Close new admission before cancelling or draining active work. Complete business settlement while +its storage is available, release owned tasks/connections, checkpoint/close the database, and then +stop the runtime and host. Apply bounded deadlines with explicit failure outcomes. Rutis invokes +registered cleanup; it does not implement business drain/fence semantics. + +Database maintenance uses the same ownership boundary: quiesce all writers and relevant helpers, +drain/fence Memory and Runs, perform the operation in the backend, reopen/reconcile, refresh +snapshots, and restore admission only after readiness. Preserve current rollback and failed-state +behavior. The four Agent fence semantics and deterministic pending-input feedback loop remain. + +## Deployment and compatibility + +- Pin the compatible Rutis crate/SDK/runtime versions together; never fetch a runtime at app boot. +- Package the Rust host and first-party runtime closure as release-owned artifacts with integrity + verification. Apply existing macOS signing/notarization to the added executable and test the + packaged Electron launcher, its fuses, ASAR paths, and native modules. +- Preserve six Electron targets: macOS arm64/x64, Windows arm64/x64, and Linux arm64/x64. Upstream + `v0.16.0` provides no Windows ARM64 host binary. Building and exercising the application-owned + Rust host/runtime on that target is a release gate, not assumed support. +- Preserve the existing offline core startup and profile isolation. Optional language runtimes + continue to use explicit existing toolchain selection when a feature needs them. +- Validate headless artifacts independently with their declared Node/native dependencies, host-local + storage, credential backend, and service supervision. They must boot and operate without an + Electron installation; desktop packaging tests do not establish this property. +- Keep remote application ingress, Rutis device links, data sync, and local IPC as separately + authenticated surfaces. Remote deployment is explicitly configured and adds no automatic public + listener, tunnel, credential sharing, or hosted service requirement to desktop local mode. +- Keep public renderer/CLI contracts and stored data compatible. Update maintained contracts only + when their implementation actually crosses the new boundary. +- After successful cutover, remove the obsolete main business composition and duplicate lifecycle + paths. Do not ship two concurrently usable database owners or a permanent implementation switch. + +## Feasibility gates and acceptance + +| Gate | Required evidence | Current evidence | +| ------------------- | ------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------- | +| Runtime launch | Rust host loads a compiled plugin through the upstream runner using packaged Electron, exchanges async calls, cancels, and shuts down | Actual app admission E2E and isolated artifact-closure checks passed; signed/packaged launcher validation pending | +| Platform extraction | OAuth, crypto, MCP Apps, helper launch, and desktop snapshots work through narrow ports without backend Electron-main imports | Dependency locations identified; extraction pending | +| Storage ownership | One mutation authority, preserved transactions, scheduler claims, encryption, backup/rekey/import and maintenance recovery | Shared database and secondary scheduler writer identified; migration pending | +| Failure behavior | Core/host loss, lost replies, stale callbacks, full queues, and shutdown cannot create duplicate execution or two profile owners | Admission runtime-loss regression passes with no replacement owner; whole-core/storage fault validation pending | +| Responsiveness | Repeated baseline/spike measurements show improvement beyond baseline variance under the same backend-heavy workload | G2 paired baselines recorded; admission has a measured resource cost and no demonstrated speed improvement | +| Distribution | Offline, signed/packaged launch and cleanup work on every supported target | Local macOS arm64 builds and copied closure validated; signed release targets pending | + +Everywhere delivery has additional gates beyond desktop separation: + +| Horizon | Acceptance scenario | Current evidence | +| ------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | +| Headless host | Boot without Electron, submit/query/cancel through the local CLI, close all clients, and observe the host continue according to service policy | Required host-port and runtime boundaries designed; no headless build | +| Multiple clients | Desktop and phone browser observe one Session; a client reconnects without duplicate input, lost terminal state, or authority escalation | Current typed bridge seam identified; no remote application client | +| Device capabilities | A host performs an explicitly authorized workspace operation on one enrolled device; disconnect/revoke affects only that capability and prevents stale callbacks | Rutis remote-link behavior inspected; current sync pairing confers no execution grant | + +Use the existing desktop baseline for the first milestone. Later horizons also measure WAN event +lag, reconnect/resync cost, transfer bounds, device-operation settlement, and headless idle resource +cost. Do not present browser availability as proof of mobile native execution or data sync as proof +of live Session control. + +For an explicit performance adoption decision, use the same build, profile fixture, local Provider +fixture and machine for at least five paired baseline/spike runs. Other changes follow the affected +workload selection and bounded confirmation rules above. Measure idle and active workloads for the +selected comparison, including simultaneous Sessions and a +background scan. Record main event-loop delay p95/p99, renderer input-to-paint latency p95, startup +to business readiness, stream latency, aggregate and per-process RSS/CPU, IPC bytes/queue depth, and +restart-to-readiness. Reuse existing performance logging where applicable; never log request bodies, +credentials, tokens, SQL parameters, or arbitrary protocol frames. + +Select numeric release budgets after establishing the baseline and before judging the spike. A +result inside baseline variance is not a performance improvement. Report memory/startup costs +alongside responsiveness, and reject a topology that buys negligible isolation at disproportionate +cost. Renderer-local layout/rendering bottlenecks require their own work. + +## Remaining engineering questions + +1. Does the exact packaged Electron/Rutis runner combination preserve local transport, crypto, + cancellation, and native-module loading on all targets? Prove it before moving production data. +2. Which desktop configuration fields need bootstrap snapshots, and which route payloads need + bounded transfer? Resolve the inventory before defining the production wire budgets. +3. Does one core process provide sufficient isolation, or does measured background work justify + a separate feature runtime? Additional processes require measurement or an independent recovery + requirement. +4. Can the same core boot under the headless Node host with a real secret/configuration adapter + and no Electron imports? Prove this before promising unattended server deployment. +5. What exact application capabilities are exposed to remote clients and to each enrolled device? + Freeze the grant, resource-locality, and disconnect contracts before enabling network access. + +These are bounded technical investigations, not permission placeholders or assumed capabilities. + +## References + +- [Rutis v0.16.0 release](https://github.com/arcships/rutis/releases/tag/v0.16.0) +- [Rutis runtime launcher](https://github.com/arcships/rutis/blob/v0.16.0/crates/rutis-bridge/src/runtime/process.rs) +- [Rutis LocalRuntime](https://github.com/arcships/rutis/blob/v0.16.0/crates/rutis-bridge/src/runtime/local.rs) +- [Rutis local transport](https://github.com/arcships/rutis/blob/v0.16.0/crates/rutis-bridge/src/runtime/spawn.rs) +- [Rutis plugin lifecycle and boundary rules](https://github.com/arcships/rutis/blob/v0.16.0/docs/guide/plugin-api.en.md) +- [Rutis Rust services and plugin exports](https://github.com/arcships/rutis/blob/v0.16.0/docs/guide/rust-host.en.md) +- [Rutis nodes, remote runtimes, security and disconnect semantics](https://github.com/arcships/rutis/blob/v0.16.0/docs/guide/nodes.en.md) +- [Electron Node-mode environment variable](https://www.electronjs.org/docs/latest/api/environment-variables#electron_run_as_node) +- [Electron native modules](https://www.electronjs.org/docs/latest/tutorial/using-native-node-modules) +- [Electron process memory measurement](https://www.electronjs.org/docs/latest/api/process#processgetprocessmemoryinfo) +- [DuckDB Node client](https://duckdb.org/docs/stable/clients/node_neo/overview) +- [DuckDB array distance functions](https://duckdb.org/docs/stable/sql/functions/array) +- [DeepChat local control plane](../local-control-plane/spec.md) +- [DeepChat external plugin runtime lifecycle](../plugin-external-runtime-lifecycle/spec.md) +- [DeepChat Tape layering](../tape-layering/spec.md) +- [DeepChat structured logging](../main-process-structured-logging/spec.md) +- [DeepChat device data sync](../../features/cloudflare-tunnel-sync/spec.md) diff --git a/electron-builder.yml b/electron-builder.yml index 82d9d08295..58e4e7d7e2 100644 --- a/electron-builder.yml +++ b/electron-builder.yml @@ -15,6 +15,10 @@ files: - '!runtime/rtk/**' - '!out/main/lightOcrHelper.js' - '!out/cli/**' + - '!out/harness/**' + - '!resources/model-db/**' + - '!resources/acp-registry/**' + - '!crates/**' - '!keys/*' - '!scripts/*' - '!.github/*' @@ -44,6 +48,18 @@ asarUnpack: - '**/node_modules/@arcships/light-ocr*/**/*' - '**/node_modules/@zerob13/nativekit/prebuilds/**/*' extraResources: + - from: ./resources/acp-registry/ + to: app.asar.unpacked/resources/acp-registry + filter: ['registry.json', 'icons/**/*'] + - from: ./resources/model-db/ + to: app.asar.unpacked/resources/model-db + filter: ['providers.json'] + - from: ./out/harness/ + to: app.asar.unpacked/harness + filter: ['**/*'] + - from: ./out/harness/node_modules/ + to: app.asar.unpacked/harness/node_modules + filter: ['**/*'] - from: ./out/cli/ to: app.asar.unpacked/cli filter: ['deepchat', 'deepchat.cmd', 'deepchat.mjs'] @@ -96,6 +112,7 @@ nsis: include: build/nsis-installer.nsh afterSign: scripts/notarize.js artifactBuildCompleted: scripts/notarize-dmg.js +beforePack: scripts/build-harness.mjs afterPack: scripts/afterPack.js mac: signIgnore: diff --git a/package.json b/package.json index 7d8df148b4..a40ff2108a 100644 --- a/package.json +++ b/package.json @@ -13,18 +13,18 @@ "scripts": { "prebuild": "node scripts/generate-icon-collections.mjs && node scripts/fetch-provider-db.mjs && node scripts/fetch-acp-registry.mjs", "preinstall": "npx only-allow pnpm", - "test": "vitest run", - "test:main": "vitest run --config vitest.config.ts test/main", + "test": "pnpm run harness:build && vitest run", + "test:main": "pnpm run harness:build && vitest run --config vitest.config.ts test/main", "test:memory:scope": "node scripts/check-memory-test-scope.mjs", "test:memory:type": "node scripts/typecheck-memory-tests.mjs", "test:memory": "pnpm run test:memory:scope && pnpm run test:memory:type && vitest --config vitest.config.memory.ts --run", "test:memory:eval": "vitest --config vitest.config.memory-eval.ts --run", - "test:main:memory-perf": "vitest --config vitest.config.memory-perf.ts --run", + "test:main:memory-perf": "pnpm run harness:build && cross-env ELECTRON_RUN_AS_NODE=1 electron node_modules/vitest/vitest.mjs --config vitest.config.memory-perf.ts --run", "test:agent:eval": "vitest run --config vitest.config.ts test/main/evals/nativeAgent/nativeAgentBehavior.eval.test.ts", "test:renderer": "vitest run --config vitest.config.renderer.ts test/renderer", - "test:coverage": "vitest run --coverage", - "test:watch": "vitest --watch", - "test:ui": "vitest --ui", + "test:coverage": "pnpm run harness:build && vitest run --coverage", + "test:watch": "pnpm run harness:build && vitest --watch", + "test:ui": "pnpm run harness:build && vitest --ui", "e2e:smoke": "playwright test -c test/e2e/playwright.config.ts", "e2e:smoke:ci": "playwright test -c test/e2e/playwright.ci.config.ts", "format:check": "oxfmt --check .", @@ -41,12 +41,13 @@ "typecheck:web": "vue-tsc --noEmit -p tsconfig.app.json --composite false --incremental --tsBuildInfoFile node_modules/.cache/tsc-web.tsbuildinfo", "typecheck": "pnpm run typecheck:node && pnpm run typecheck:web", "start": "electron-vite preview", - "dev": "electron-vite dev --watch", - "dev:trace": "cross-env DEEPCHAT_VUE_DEVTOOLS_OVERLAY=0 electron-vite dev --watch", - "dev:inspect": "electron-vite dev --watch --inspect=9229", - "dev:linux": "electron-vite dev --watch --noSandbox", - "build": "pnpm run typecheck && electron-vite build && pnpm run cli:build", + "dev": "pnpm run harness:build && electron-vite dev --watch", + "dev:trace": "pnpm run harness:build && cross-env DEEPCHAT_VUE_DEVTOOLS_OVERLAY=0 electron-vite dev --watch", + "dev:inspect": "pnpm run harness:build && electron-vite dev --watch --inspect=9229", + "dev:linux": "pnpm run harness:build && electron-vite dev --watch --noSandbox", + "build": "pnpm run typecheck && pnpm run harness:build && electron-vite build && pnpm run cli:build", "cli:build": "node scripts/build-cli.mjs", + "harness:build": "node scripts/build-harness.mjs", "release:ff": "node scripts/release-fast-forward.mjs", "postinstall": "install-electron && electron-builder install-app-deps", "hooks:install": "git config core.hooksPath .githooks", @@ -93,6 +94,7 @@ "installRuntime:duckdb:vss:linux:x64": "node scripts/installVss.js --platform linux --arch x64", "installRuntime:duckdb:vss:linux:arm64": "node scripts/installVss.js --platform linux --arch arm64", "smoke:duckdb:vss": "node scripts/smoke-duckdb-vss.js", + "smoke:harness:memory": "node scripts/smoke-harness-memory.mjs", "smoke:light-ocr": "node scripts/smoke-light-ocr.js", "smoke:opendal:native": "node scripts/smoke-opendal-native.js", "i18n": "pnpm run i18n:validate && i18n-check -s zh-CN -f i18next --locales src/renderer/src/i18n", @@ -117,6 +119,7 @@ "@aws-sdk/client-bedrock": "^3.1128.0", "@aws-sdk/credential-providers": "^3.1128.0", "@duckdb/node-api": "1.5.5-r.4", + "@duckdb/node-bindings": "1.5.5-r.4", "@electron-toolkit/utils": "^4.0.0", "@ff-labs/fff-node": "^0.10.6", "@jxa/run": "^1.4.0", @@ -132,6 +135,7 @@ "axios": "^1.20.0", "better-sqlite3-multiple-ciphers": "13.0.3", "compare-versions": "^6.1.1", + "conf": "15.1.0", "cron-parser": "^5.10.0", "cross-spawn": "^7.0.6", "diff": "^9.0.0", @@ -165,6 +169,8 @@ }, "devDependencies": { "@antv/infographic": "^0.2.20", + "@arcships/rutis": "0.16.0", + "@arcships/rutis-runtime": "0.16.0", "@commitlint/cli": "^21.2.2", "@commitlint/config-conventional": "^21.2.2", "@electron-toolkit/tsconfig": "^2.0.0", @@ -280,7 +286,12 @@ "vue-demi" ], "patchedDependencies": { - "@electron/notarize@3.1.1": "patches/@electron__notarize@3.1.1.patch" + "@electron/notarize@3.1.1": "patches/@electron__notarize@3.1.1.patch", + "@ai-sdk/openai-compatible@3.0.45": "patches/@ai-sdk__openai-compatible@3.0.45.patch", + "@ai-sdk/openai@4.0.62": "patches/@ai-sdk__openai@4.0.62.patch", + "@ai-sdk/google@4.0.65": "patches/@ai-sdk__google@4.0.65.patch", + "@ai-sdk/google-vertex@5.0.77": "patches/@ai-sdk__google-vertex@5.0.77.patch", + "@arcships/rutis-runtime@0.16.0": "patches/@arcships__rutis-runtime@0.16.0.patch" } } } diff --git a/patches/@ai-sdk__google-vertex@5.0.77.patch b/patches/@ai-sdk__google-vertex@5.0.77.patch new file mode 100644 index 0000000000..ec94fad06a --- /dev/null +++ b/patches/@ai-sdk__google-vertex@5.0.77.patch @@ -0,0 +1,122 @@ +diff --git a/dist/edge/index.js b/dist/edge/index.js +index d9ab3f4a1ac8e4114a9057dd725ad6371fd740bf..4f8d63f6cc8a6f545201d3d436abf2b8a13b7382 100644 +--- a/dist/edge/index.js ++++ b/dist/edge/index.js +@@ -35,6 +35,15 @@ import { + WORKFLOW_DESERIALIZE + } from "@ai-sdk/provider-utils"; + import { z as z3 } from "zod/v4"; ++// Validate and clone dense vectors without per-component parsing payloads. ++const finiteEmbeddingArraySchema = z3.custom((value) => { ++ if (!Array.isArray(value)) return false; ++ for (let index = 0; index < value.length; index++) { ++ if (!Number.isFinite(value[index])) return false; ++ } ++ return true; ++}).transform((value) => value.slice()); ++ + + // src/google-vertex-error.ts + import { createJsonErrorResponseHandler } from "@ai-sdk/provider-utils"; +@@ -236,7 +245,7 @@ var googleVertexTextEmbeddingResponseSchema = z3.object({ + predictions: z3.array( + z3.object({ + embeddings: z3.object({ +- values: z3.array(z3.number()), ++ values: finiteEmbeddingArraySchema, + statistics: z3.object({ + token_count: z3.number() + }) +@@ -246,7 +255,7 @@ var googleVertexTextEmbeddingResponseSchema = z3.object({ + }); + var googleVertexEmbedContentResponseSchema = z3.object({ + embedding: z3.object({ +- values: z3.array(z3.number()) ++ values: finiteEmbeddingArraySchema + }), + usageMetadata: z3.object({ + promptTokenCount: z3.number().nullish() +diff --git a/dist/index.js b/dist/index.js +index 58ba8ad2d175fe8cedd8f7f52ab39ff64f83f818..e055b0ede020cb217dcdea4ed40247bdb6d03be2 100644 +--- a/dist/index.js ++++ b/dist/index.js +@@ -50,6 +50,15 @@ import { + WORKFLOW_DESERIALIZE + } from "@ai-sdk/provider-utils"; + import { z as z3 } from "zod/v4"; ++// Validate and clone dense vectors without per-component parsing payloads. ++const finiteEmbeddingArraySchema = z3.custom((value) => { ++ if (!Array.isArray(value)) return false; ++ for (let index = 0; index < value.length; index++) { ++ if (!Number.isFinite(value[index])) return false; ++ } ++ return true; ++}).transform((value) => value.slice()); ++ + + // src/google-vertex-error.ts + import { createJsonErrorResponseHandler } from "@ai-sdk/provider-utils"; +@@ -251,7 +260,7 @@ var googleVertexTextEmbeddingResponseSchema = z3.object({ + predictions: z3.array( + z3.object({ + embeddings: z3.object({ +- values: z3.array(z3.number()), ++ values: finiteEmbeddingArraySchema, + statistics: z3.object({ + token_count: z3.number() + }) +@@ -261,7 +270,7 @@ var googleVertexTextEmbeddingResponseSchema = z3.object({ + }); + var googleVertexEmbedContentResponseSchema = z3.object({ + embedding: z3.object({ +- values: z3.array(z3.number()) ++ values: finiteEmbeddingArraySchema + }), + usageMetadata: z3.object({ + promptTokenCount: z3.number().nullish() +diff --git a/src/google-vertex-embedding-model.ts b/src/google-vertex-embedding-model.ts +index 1b606de29a4fa91575ec8b82f895a1ca3fab37fe..3a3fc77c90da7395368dd456126c7f74793634dd 100644 +--- a/src/google-vertex-embedding-model.ts ++++ b/src/google-vertex-embedding-model.ts +@@ -13,6 +13,7 @@ import { + WORKFLOW_DESERIALIZE, + } from '@ai-sdk/provider-utils'; + import { z } from 'zod/v4'; ++ + import { googleVertexFailedResponseHandler } from './google-vertex-error'; + import { + googleVertexEmbeddingModelOptions, +@@ -20,6 +21,15 @@ import { + } from './google-vertex-embedding-model-options'; + import type { GoogleVertexConfig } from './google-vertex-config'; + ++// Validate and clone dense vectors without per-component parsing payloads. ++const finiteEmbeddingArraySchema = z.custom((value) => { ++ if (!Array.isArray(value)) return false; ++ for (let index = 0; index < value.length; index++) { ++ if (!Number.isFinite(value[index])) return false; ++ } ++ return true; ++}).transform((value) => value.slice()); ++ + export class GoogleVertexEmbeddingModel implements EmbeddingModelV4 { + readonly specificationVersion = 'v4'; + readonly modelId: GoogleVertexEmbeddingModelId; +@@ -191,7 +201,7 @@ const googleVertexTextEmbeddingResponseSchema = z.object({ + predictions: z.array( + z.object({ + embeddings: z.object({ +- values: z.array(z.number()), ++ values: finiteEmbeddingArraySchema, + statistics: z.object({ + token_count: z.number(), + }), +@@ -202,7 +212,7 @@ const googleVertexTextEmbeddingResponseSchema = z.object({ + + const googleVertexEmbedContentResponseSchema = z.object({ + embedding: z.object({ +- values: z.array(z.number()), ++ values: finiteEmbeddingArraySchema, + }), + usageMetadata: z + .object({ diff --git a/patches/@ai-sdk__google@4.0.65.patch b/patches/@ai-sdk__google@4.0.65.patch new file mode 100644 index 0000000000..5230d58139 --- /dev/null +++ b/patches/@ai-sdk__google@4.0.65.patch @@ -0,0 +1,81 @@ +diff --git a/dist/index.js b/dist/index.js +index d4b1ce08e2a40e383bacce99cf4d26059533101a..0f37e09da67bbda26b95de782220ca3c72787a92 100644 +--- a/dist/index.js ++++ b/dist/index.js +@@ -26,6 +26,15 @@ import { + zodSchema as zodSchema3 + } from "@ai-sdk/provider-utils"; + import { z as z3 } from "zod/v4"; ++// Validate and clone dense vectors without per-component parsing payloads. ++const finiteEmbeddingArraySchema = z3.custom((value) => { ++ if (!Array.isArray(value)) return false; ++ for (let index = 0; index < value.length; index++) { ++ if (!Number.isFinite(value[index])) return false; ++ } ++ return true; ++}).transform((value) => value.slice()); ++ + + // src/google-error.ts + import { +@@ -239,14 +248,14 @@ var GoogleEmbeddingModel = class _GoogleEmbeddingModel { + var googleGenerativeAITextEmbeddingResponseSchema = lazySchema3( + () => zodSchema3( + z3.object({ +- embeddings: z3.array(z3.object({ values: z3.array(z3.number()) })) ++ embeddings: z3.array(z3.object({ values: finiteEmbeddingArraySchema })) + }) + ) + ); + var googleGenerativeAISingleEmbeddingResponseSchema = lazySchema3( + () => zodSchema3( + z3.object({ +- embedding: z3.object({ values: z3.array(z3.number()) }) ++ embedding: z3.object({ values: finiteEmbeddingArraySchema }) + }) + ) + ); +diff --git a/src/google-embedding-model.ts b/src/google-embedding-model.ts +index cb1afa7aa98bd3a89974aafd7ed7393345ac822e..02a5dd943c007ed612af70d5d029d132d1e468ce 100644 +--- a/src/google-embedding-model.ts ++++ b/src/google-embedding-model.ts +@@ -16,11 +16,21 @@ import { + type FetchFunction, + } from '@ai-sdk/provider-utils'; + import { z } from 'zod/v4'; ++ + import { googleFailedResponseHandler } from './google-error'; + import { + googleEmbeddingModelOptions, + type GoogleEmbeddingModelId, + } from './google-embedding-model-options'; ++ ++// Validate and clone dense vectors without per-component parsing payloads. ++const finiteEmbeddingArraySchema = z.custom((value) => { ++ if (!Array.isArray(value)) return false; ++ for (let index = 0; index < value.length; index++) { ++ if (!Number.isFinite(value[index])) return false; ++ } ++ return true; ++}).transform((value) => value.slice()); + type GoogleEmbeddingConfig = { + provider: string; + baseURL: string; +@@ -186,7 +196,7 @@ export class GoogleEmbeddingModel implements EmbeddingModelV4 { + const googleGenerativeAITextEmbeddingResponseSchema = lazySchema(() => + zodSchema( + z.object({ +- embeddings: z.array(z.object({ values: z.array(z.number()) })), ++ embeddings: z.array(z.object({ values: finiteEmbeddingArraySchema })), + }), + ), + ); +@@ -195,7 +205,7 @@ const googleGenerativeAITextEmbeddingResponseSchema = lazySchema(() => + const googleGenerativeAISingleEmbeddingResponseSchema = lazySchema(() => + zodSchema( + z.object({ +- embedding: z.object({ values: z.array(z.number()) }), ++ embedding: z.object({ values: finiteEmbeddingArraySchema }), + }), + ), + ); diff --git a/patches/@ai-sdk__openai-compatible@3.0.45.patch b/patches/@ai-sdk__openai-compatible@3.0.45.patch new file mode 100644 index 0000000000..f37d855799 --- /dev/null +++ b/patches/@ai-sdk__openai-compatible@3.0.45.patch @@ -0,0 +1,66 @@ +diff --git a/dist/index.js b/dist/index.js +index fa70e9b9a5d6c3510c19eea248ec9d5b8a6edbeb..44184aec6ee6548824f53b8e45cb778636d9933f 100644 +--- a/dist/index.js ++++ b/dist/index.js +@@ -1509,6 +1509,15 @@ import { + WORKFLOW_DESERIALIZE as WORKFLOW_DESERIALIZE3 + } from "@ai-sdk/provider-utils"; + import { z as z7 } from "zod/v4"; ++// Validate and clone dense vectors without per-component parsing payloads. ++const finiteEmbeddingArraySchema = z7.custom((value) => { ++ if (!Array.isArray(value)) return false; ++ for (let index = 0; index < value.length; index++) { ++ if (!Number.isFinite(value[index])) return false; ++ } ++ return true; ++}).transform((value) => value.slice()); ++ + + // src/embedding/openai-compatible-embedding-model-options.ts + import { z as z6 } from "zod/v4"; +@@ -1637,7 +1646,7 @@ var OpenAICompatibleEmbeddingModel = class _OpenAICompatibleEmbeddingModel { + } + }; + var openaiTextEmbeddingResponseSchema = z7.object({ +- data: z7.array(z7.object({ embedding: z7.array(z7.number()) })), ++ data: z7.array(z7.object({ embedding: finiteEmbeddingArraySchema })), + usage: z7.object({ prompt_tokens: z7.number() }).nullish(), + providerMetadata: z7.record(z7.string(), z7.record(z7.string(), z7.any())).optional() + }); +diff --git a/src/embedding/openai-compatible-embedding-model.ts b/src/embedding/openai-compatible-embedding-model.ts +index 3c628ad3af95222416cd67797deeea4773dc82bb..67049886a54d3fc494ff1dabe05e7f5f8ad93cfd 100644 +--- a/src/embedding/openai-compatible-embedding-model.ts ++++ b/src/embedding/openai-compatible-embedding-model.ts +@@ -15,6 +15,7 @@ import { + type FetchFunction, + } from '@ai-sdk/provider-utils'; + import { z } from 'zod/v4'; ++ + import { + openaiCompatibleEmbeddingModelOptions, + type OpenAICompatibleEmbeddingModelId, +@@ -25,6 +26,15 @@ import { + } from '../openai-compatible-error'; + import { warnIfDeprecatedProviderOptionsKey } from '../utils/to-camel-case'; + ++// Validate and clone dense vectors without per-component parsing payloads. ++const finiteEmbeddingArraySchema = z.custom((value) => { ++ if (!Array.isArray(value)) return false; ++ for (let index = 0; index < value.length; index++) { ++ if (!Number.isFinite(value[index])) return false; ++ } ++ return true; ++}).transform((value) => value.slice()); ++ + type OpenAICompatibleEmbeddingConfig = { + /** + * Override the maximum number of embeddings per call. +@@ -184,7 +194,7 @@ export class OpenAICompatibleEmbeddingModel implements EmbeddingModelV4 { + // minimal version of the schema, focussed on what is needed for the implementation + // this approach limits breakages when the API changes and increases efficiency + const openaiTextEmbeddingResponseSchema = z.object({ +- data: z.array(z.object({ embedding: z.array(z.number()) })), ++ data: z.array(z.object({ embedding: finiteEmbeddingArraySchema })), + usage: z.object({ prompt_tokens: z.number() }).nullish(), + providerMetadata: z + .record(z.string(), z.record(z.string(), z.any())) diff --git a/patches/@ai-sdk__openai@4.0.62.patch b/patches/@ai-sdk__openai@4.0.62.patch new file mode 100644 index 0000000000..de31bde5d4 --- /dev/null +++ b/patches/@ai-sdk__openai@4.0.62.patch @@ -0,0 +1,78 @@ +diff --git a/dist/index.js b/dist/index.js +index 5d2d710459e9b193a7fdcb43e50c4e3b086460d9..bbf1c5b15f0975e654737779564d092f4a0d93fb 100644 +--- a/dist/index.js ++++ b/dist/index.js +@@ -1980,10 +1980,19 @@ var openaiEmbeddingModelOptions = lazySchema5( + // src/embedding/openai-embedding-api.ts + import { lazySchema as lazySchema6, zodSchema as zodSchema6 } from "@ai-sdk/provider-utils"; + import { z as z7 } from "zod/v4"; ++// Validate and clone dense vectors without per-component parsing payloads. ++const finiteEmbeddingArraySchema = z7.custom((value) => { ++ if (!Array.isArray(value)) return false; ++ for (let index = 0; index < value.length; index++) { ++ if (!Number.isFinite(value[index])) return false; ++ } ++ return true; ++}).transform((value) => value.slice()); ++ + var openaiTextEmbeddingResponseSchema = lazySchema6( + () => zodSchema6( + z7.object({ +- data: z7.array(z7.object({ embedding: z7.array(z7.number()) })), ++ data: z7.array(z7.object({ embedding: finiteEmbeddingArraySchema })), + usage: z7.object({ prompt_tokens: z7.number() }).nullish() + }) + ) +diff --git a/dist/internal/index.js b/dist/internal/index.js +index a4084305fc47da60128b263311da7a7de84d5b63..d1ee9e78c72f64d669b01e82cf7b1fa86d18510f 100644 +--- a/dist/internal/index.js ++++ b/dist/internal/index.js +@@ -1971,10 +1971,19 @@ var openaiEmbeddingModelOptions = lazySchema5( + // src/embedding/openai-embedding-api.ts + import { lazySchema as lazySchema6, zodSchema as zodSchema6 } from "@ai-sdk/provider-utils"; + import { z as z7 } from "zod/v4"; ++// Validate and clone dense vectors without per-component parsing payloads. ++const finiteEmbeddingArraySchema = z7.custom((value) => { ++ if (!Array.isArray(value)) return false; ++ for (let index = 0; index < value.length; index++) { ++ if (!Number.isFinite(value[index])) return false; ++ } ++ return true; ++}).transform((value) => value.slice()); ++ + var openaiTextEmbeddingResponseSchema = lazySchema6( + () => zodSchema6( + z7.object({ +- data: z7.array(z7.object({ embedding: z7.array(z7.number()) })), ++ data: z7.array(z7.object({ embedding: finiteEmbeddingArraySchema })), + usage: z7.object({ prompt_tokens: z7.number() }).nullish() + }) + ) +diff --git a/src/embedding/openai-embedding-api.ts b/src/embedding/openai-embedding-api.ts +index 87ab6c10674dadb705a0093e32a2315203fa91e7..6174ba2091ab9a8591d58a75df5cf7c81fc02866 100644 +--- a/src/embedding/openai-embedding-api.ts ++++ b/src/embedding/openai-embedding-api.ts +@@ -1,12 +1,22 @@ + import { lazySchema, zodSchema } from '@ai-sdk/provider-utils'; + import { z } from 'zod/v4'; + ++// Validate and clone dense vectors without per-component parsing payloads. ++const finiteEmbeddingArraySchema = z.custom((value) => { ++ if (!Array.isArray(value)) return false; ++ for (let index = 0; index < value.length; index++) { ++ if (!Number.isFinite(value[index])) return false; ++ } ++ return true; ++}).transform((value) => value.slice()); ++ ++ + // minimal version of the schema, focussed on what is needed for the implementation + // this approach limits breakages when the API changes and increases efficiency + export const openaiTextEmbeddingResponseSchema = lazySchema(() => + zodSchema( + z.object({ +- data: z.array(z.object({ embedding: z.array(z.number()) })), ++ data: z.array(z.object({ embedding: finiteEmbeddingArraySchema })), + usage: z.object({ prompt_tokens: z.number() }).nullish(), + }), + ), diff --git a/patches/@arcships__rutis-runtime@0.16.0.patch b/patches/@arcships__rutis-runtime@0.16.0.patch new file mode 100644 index 0000000000..ed1ba2e036 --- /dev/null +++ b/patches/@arcships__rutis-runtime@0.16.0.patch @@ -0,0 +1,33 @@ +diff --git a/src/values.mjs b/src/values.mjs +index 4a1a5f56cba813067f410cb76c0eac4822626578..f6bc86e10033daa1cfb3f87ab3a28c2671da46b4 100644 +--- a/src/values.mjs ++++ b/src/values.mjs +@@ -130,8 +130,6 @@ export function instantText(date) { + + // ── Base64 (RFC 4648 §4, padded) ───────────────────────────────────── + +-const ALPHABET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' +- + // The bytes of a Uint8Array, ArrayBuffer or DataView (a Buffer is a + // Uint8Array); undefined for anything else. + export function bytesOf(value) { +@@ -148,12 +146,13 @@ export function base64Encode(bytes) { + // The bytes of padded base64 text. Only the canonical text is taken: no + // whitespace, padding only at the end, unused bits zero. + export function base64Decode(text) { +- const padding = text.endsWith('==') ? 2 : text.endsWith('=') ? 1 : 0 +- const valid = text.length % 4 === 0 && /^[A-Za-z0-9+/]*={0,2}$/.test(text) +- // The bits of the last character before the padding that no byte uses. +- && (padding === 0 || (ALPHABET.indexOf(text[text.length - padding - 1]) & (padding === 2 ? 15 : 3)) === 0) +- if (!valid) throw new ValueError(`invalid bytes (${text.length} characters): expected base64 (RFC 4648 §4) with padding`) +- return new Uint8Array(Buffer.from(text, 'base64')) ++ const bytes = text.length % 4 === 0 ? Buffer.from(text, 'base64') : undefined ++ if (!bytes || bytes.toString('base64') !== text) throw new ValueError(`invalid bytes (${text.length} characters): expected base64 (RFC 4648 §4) with padding`) ++ // Pooled/partial buffers must not expose bytes outside the decoded value. ++ if (bytes.byteLength > 0 && bytes.byteOffset === 0 && bytes.byteLength === bytes.buffer.byteLength) ++ return new Uint8Array(bytes.buffer) ++ return new Uint8Array(bytes) ++ + } + + // ── What crosses as a tagged value ─────────────────────────────────── diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1c5c1497e8..68accdd492 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -16,6 +16,21 @@ overrides: typescript: npm:typescript-native-bridge@6.0.3-bridge.16.tsgo.7.0.2 patchedDependencies: + '@ai-sdk/google-vertex@5.0.77': + hash: 42c1f1bdd677dd0c113abd81be9b17092ddafc7e6547f9004798b8ba6e04715a + path: patches/@ai-sdk__google-vertex@5.0.77.patch + '@ai-sdk/google@4.0.65': + hash: b8f1463345250c901d6c568ef8f18b1a084860495af5faaa13c93cee5607268f + path: patches/@ai-sdk__google@4.0.65.patch + '@ai-sdk/openai-compatible@3.0.45': + hash: 71a48986b4e5f640033a57b993be567406a112254c67de27e14d07e1ffbe73a8 + path: patches/@ai-sdk__openai-compatible@3.0.45.patch + '@ai-sdk/openai@4.0.62': + hash: d540f71958d27ae3c5f065c84b9fdb4d6714c067952674016ce2a0adc5dce783 + path: patches/@ai-sdk__openai@4.0.62.patch + '@arcships/rutis-runtime@0.16.0': + hash: 118a5067c0fb8b1a69ee71008145221773dd67f0722f44a1b71ad5b16113edb1 + path: patches/@arcships__rutis-runtime@0.16.0.patch '@electron/notarize@3.1.1': hash: b2e4a3334f86d72808116962914a4a2062da8c99b2d5cb86e67b73eb5ce3ab87 path: patches/@electron__notarize@3.1.1.patch @@ -38,19 +53,19 @@ importers: version: 4.0.65(zod@4.5.4) '@ai-sdk/google': specifier: ^4.0.65 - version: 4.0.65(zod@4.5.4) + version: 4.0.65(patch_hash=b8f1463345250c901d6c568ef8f18b1a084860495af5faaa13c93cee5607268f)(zod@4.5.4) '@ai-sdk/google-vertex': specifier: ^5.0.77 - version: 5.0.77(zod@4.5.4) + version: 5.0.77(patch_hash=42c1f1bdd677dd0c113abd81be9b17092ddafc7e6547f9004798b8ba6e04715a)(zod@4.5.4) '@ai-sdk/open-responses': specifier: ^2.0.40 version: 2.0.40(zod@4.5.4) '@ai-sdk/openai': specifier: ^4.0.62 - version: 4.0.62(zod@4.5.4) + version: 4.0.62(patch_hash=d540f71958d27ae3c5f065c84b9fdb4d6714c067952674016ce2a0adc5dce783)(zod@4.5.4) '@ai-sdk/openai-compatible': specifier: ^3.0.45 - version: 3.0.45(zod@4.5.4) + version: 3.0.45(patch_hash=71a48986b4e5f640033a57b993be567406a112254c67de27e14d07e1ffbe73a8)(zod@4.5.4) '@ai-sdk/provider': specifier: ^4.0.11 version: 4.0.11 @@ -66,6 +81,9 @@ importers: '@duckdb/node-api': specifier: 1.5.5-r.4 version: 1.5.5-r.4 + '@duckdb/node-bindings': + specifier: 1.5.5-r.4 + version: 1.5.5-r.4 '@electron-toolkit/utils': specifier: ^4.0.0 version: 4.0.0(electron@43.8.3) @@ -111,6 +129,9 @@ importers: compare-versions: specifier: ^6.1.1 version: 6.1.1 + conf: + specifier: 15.1.0 + version: 15.1.0 cron-parser: specifier: ^5.10.0 version: 5.10.0 @@ -205,6 +226,12 @@ importers: '@antv/infographic': specifier: ^0.2.20 version: 0.2.20 + '@arcships/rutis': + specifier: 0.16.0 + version: 0.16.0 + '@arcships/rutis-runtime': + specifier: 0.16.0 + version: 0.16.0(patch_hash=118a5067c0fb8b1a69ee71008145221773dd67f0722f44a1b71ad5b16113edb1) '@commitlint/cli': specifier: ^21.2.2 version: 21.2.2(@types/node@24.13.3)(conventional-commits-parser@7.1.0)(typescript-native-bridge@6.0.3-bridge.16.tsgo.7.0.2) @@ -246,7 +273,7 @@ importers: version: 0.5.20(tailwindcss@4.3.3) '@tailwindcss/vite': specifier: ^4.3.3 - version: 4.3.3(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0)) + version: 4.3.3(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.23.15)(yaml@2.9.0)) '@tiptap/core': specifier: ^3.31.3 version: 3.31.3(@tiptap/pm@3.31.3) @@ -294,7 +321,7 @@ importers: version: 1.7.0(@unovis/ts@1.7.0)(vue@3.5.42(typescript-native-bridge@6.0.3-bridge.16.tsgo.7.0.2)) '@vitejs/plugin-vue': specifier: ^6.0.8 - version: 6.0.8(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0))(vue@3.5.42(typescript-native-bridge@6.0.3-bridge.16.tsgo.7.0.2)) + version: 6.0.8(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.23.15)(yaml@2.9.0))(vue@3.5.42(typescript-native-bridge@6.0.3-bridge.16.tsgo.7.0.2)) '@vitest/ui': specifier: ^4.1.11 version: 4.1.11(vitest@4.1.11) @@ -327,7 +354,7 @@ importers: version: 26.15.3(electron-builder-squirrel-windows@26.15.3) electron-vite: specifier: 5.0.0 - version: 5.0.0(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0)) + version: 5.0.0(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.23.15)(yaml@2.9.0)) jsdom: specifier: ^26.1.0 version: 26.1.0 @@ -396,19 +423,19 @@ importers: version: 4.15.1(vue@3.5.42(typescript-native-bridge@6.0.3-bridge.16.tsgo.7.0.2)) vite: specifier: ^7.3.6 - version: 7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0) + version: 7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.23.15)(yaml@2.9.0) vite-plugin-monaco-editor-esm: specifier: ^2.0.3 version: 2.0.3(monaco-editor@0.55.1) vite-plugin-vue-devtools: specifier: ^8.2.1 - version: 8.2.1(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0))(vue@3.5.42(typescript-native-bridge@6.0.3-bridge.16.tsgo.7.0.2)) + version: 8.2.1(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.23.15)(yaml@2.9.0))(vue@3.5.42(typescript-native-bridge@6.0.3-bridge.16.tsgo.7.0.2)) vite-svg-loader: specifier: ^5.1.3 version: 5.1.3(vue@3.5.42(typescript-native-bridge@6.0.3-bridge.16.tsgo.7.0.2)) vitest: specifier: ^4.1.11 - version: 4.1.11(@types/node@24.13.3)(@vitest/ui@4.1.11)(jsdom@26.1.0)(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0)) + version: 4.1.11(@types/node@24.13.3)(@vitest/ui@4.1.11)(jsdom@26.1.0)(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.23.15)(yaml@2.9.0)) vue: specifier: ^3.5.42 version: 3.5.42(typescript-native-bridge@6.0.3-bridge.16.tsgo.7.0.2) @@ -417,7 +444,7 @@ importers: version: 11.4.10(vue@3.5.42(typescript-native-bridge@6.0.3-bridge.16.tsgo.7.0.2)) vue-router: specifier: ^5.3.1 - version: 5.3.1(@pinia/colada@0.20.0(pinia@3.0.4(typescript-native-bridge@6.0.3-bridge.16.tsgo.7.0.2)(vue@3.5.42(typescript-native-bridge@6.0.3-bridge.16.tsgo.7.0.2)))(vue@3.5.42(typescript-native-bridge@6.0.3-bridge.16.tsgo.7.0.2)))(@vue/compiler-sfc@3.5.42)(esbuild@0.28.1)(pinia@3.0.4(typescript-native-bridge@6.0.3-bridge.16.tsgo.7.0.2)(vue@3.5.42(typescript-native-bridge@6.0.3-bridge.16.tsgo.7.0.2)))(rollup@4.62.2)(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0))(vue@3.5.42(typescript-native-bridge@6.0.3-bridge.16.tsgo.7.0.2)) + version: 5.3.1(@pinia/colada@0.20.0(pinia@3.0.4(typescript-native-bridge@6.0.3-bridge.16.tsgo.7.0.2)(vue@3.5.42(typescript-native-bridge@6.0.3-bridge.16.tsgo.7.0.2)))(vue@3.5.42(typescript-native-bridge@6.0.3-bridge.16.tsgo.7.0.2)))(@vue/compiler-sfc@3.5.42)(esbuild@0.28.1)(pinia@3.0.4(typescript-native-bridge@6.0.3-bridge.16.tsgo.7.0.2)(vue@3.5.42(typescript-native-bridge@6.0.3-bridge.16.tsgo.7.0.2)))(rollup@4.62.2)(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.23.15)(yaml@2.9.0))(vue@3.5.42(typescript-native-bridge@6.0.3-bridge.16.tsgo.7.0.2)) vue-sonner: specifier: ^2.0.9 version: 2.0.9 @@ -615,6 +642,14 @@ packages: engines: {node: ^22.0.0 || ^24.0.0} hasBin: true + '@arcships/rutis-runtime@0.16.0': + resolution: {integrity: sha512-hp46Vu/ZpTN2RRo20X5oCTOh4bfftGa7OXrVf54zX6wSxBOx14R5DF4WD2iC2Fk6/fzrnG3J49hY/GaoXwC9/A==} + engines: {node: '>=22'} + + '@arcships/rutis@0.16.0': + resolution: {integrity: sha512-BS57sHhw5xhHp1oidbmHjGgHpUd9TmXwA3jmIX8TVjWop1hvs4SWK+NZjket3XRwYKfEuwQiJ6mB7aUmsoMHbA==} + engines: {bun: '>=1.4', node: '>=22'} + '@asamuzakjp/css-color@3.2.0': resolution: {integrity: sha512-K1A6z8tS3XsmCMM86xoWdn7Fkdn9m6RSVtocUrJYIwZnFVkng/PvkEoWtOWmP+Scc6saYWHWZYbndEEXxl24jw==} @@ -975,6 +1010,21 @@ packages: resolution: {integrity: sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==} engines: {node: '>=18'} + '@deepseek-ai/cordis@4.0.4': + resolution: {integrity: sha512-obgyxqWAmFn3Re8kvsuUnyW+ihrz6eJCnJO4fh1cQzDtmPYz/zzVeUkH9R94I0OwSVOocK67Kgakm04j/oQXzg==} + hasBin: true + peerDependencies: + '@deepseek-ai/cordis-plugin-include': ~1.0.9 + '@deepseek-ai/cordis-plugin-loader': ~1.0.5 + peerDependenciesMeta: + '@deepseek-ai/cordis-plugin-include': + optional: true + '@deepseek-ai/cordis-plugin-loader': + optional: true + + '@deepseek-ai/cosmokit@1.8.6': + resolution: {integrity: sha512-ZSD/fN52L498LBIOYwjIOlaLv5veY6ZEwI2yzvZUKQtctn0QAPqu8tKdJ+OF5+Tv6NBq1U+wJWH+QI6OGy5EvQ==} + '@duckdb/node-api@1.5.5-r.4': resolution: {integrity: sha512-8v0CZNo7aM6GQCNUHERGTrZWIfss8xKzZPF3ACNhPdMMrt7UjkNI5nRQ9FTFO7Yx8ghxYxVpdotmBBMQ5vXUOA==} @@ -6600,6 +6650,11 @@ packages: tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + tsx@4.23.15: + resolution: {integrity: sha512-Yiex1Ovn8z2xPpOWckIiysV1SSyRMY9BkLF++q0yKiDxCqRhosKfMg3janKkiLBwZ5c/YryloKwGZcrEmtwxKw==} + engines: {node: '>=18.0.0'} + hasBin: true + turndown@7.2.4: resolution: {integrity: sha512-I8yFsfRzmzK0WV1pNNOA4A7y4RDfFxPRxb3t+e3ui14qSGOxGtiSP6GjeX+Y6CHb7HYaFj7ECUD7VE5kQMZWGQ==} engines: {node: '>=18', npm: '>=9'} @@ -7062,6 +7117,18 @@ packages: utf-8-validate: optional: true + ws@8.22.0: + resolution: {integrity: sha512-Ydggc987+RO0AnWtZ/7Wq9FtNvcrL1b/RO0ud9mWjUPgDrsAAwQSF51sm2hm1XofbU/4jkpGEsLFsZZxU+1DOg==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + wsl-utils@0.3.1: resolution: {integrity: sha512-g/eziiSUNBSsdDJtCLB8bdYEUMj4jR7AGeUo96p/3dTafgjHhpF4RiCFPiRILwjQoDXx5MqkBr4fwWtR3Ky4Wg==} engines: {node: '>=20'} @@ -7169,7 +7236,7 @@ snapshots: '@ai-sdk/amazon-bedrock@5.0.78(zod@4.5.4)': dependencies: '@ai-sdk/anthropic': 4.0.50(zod@4.5.4) - '@ai-sdk/openai': 4.0.62(zod@4.5.4) + '@ai-sdk/openai': 4.0.62(patch_hash=d540f71958d27ae3c5f065c84b9fdb4d6714c067952674016ce2a0adc5dce783)(zod@4.5.4) '@ai-sdk/provider': 4.0.11 '@ai-sdk/provider-utils': 5.0.37(zod@4.5.4) '@smithy/eventstream-codec': 4.4.16 @@ -7186,7 +7253,7 @@ snapshots: '@ai-sdk/azure@4.0.65(zod@4.5.4)': dependencies: '@ai-sdk/deepseek': 3.0.40(zod@4.5.4) - '@ai-sdk/openai': 4.0.62(zod@4.5.4) + '@ai-sdk/openai': 4.0.62(patch_hash=d540f71958d27ae3c5f065c84b9fdb4d6714c067952674016ce2a0adc5dce783)(zod@4.5.4) '@ai-sdk/provider': 4.0.11 '@ai-sdk/provider-utils': 5.0.37(zod@4.5.4) zod: 4.5.4 @@ -7204,11 +7271,11 @@ snapshots: '@vercel/oidc': 3.2.0 zod: 4.5.4 - '@ai-sdk/google-vertex@5.0.77(zod@4.5.4)': + '@ai-sdk/google-vertex@5.0.77(patch_hash=42c1f1bdd677dd0c113abd81be9b17092ddafc7e6547f9004798b8ba6e04715a)(zod@4.5.4)': dependencies: '@ai-sdk/anthropic': 4.0.50(zod@4.5.4) - '@ai-sdk/google': 4.0.65(zod@4.5.4) - '@ai-sdk/openai-compatible': 3.0.45(zod@4.5.4) + '@ai-sdk/google': 4.0.65(patch_hash=b8f1463345250c901d6c568ef8f18b1a084860495af5faaa13c93cee5607268f)(zod@4.5.4) + '@ai-sdk/openai-compatible': 3.0.45(patch_hash=71a48986b4e5f640033a57b993be567406a112254c67de27e14d07e1ffbe73a8)(zod@4.5.4) '@ai-sdk/provider': 4.0.11 '@ai-sdk/provider-utils': 5.0.37(zod@4.5.4) google-auth-library: 10.9.1 @@ -7216,7 +7283,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@ai-sdk/google@4.0.65(zod@4.5.4)': + '@ai-sdk/google@4.0.65(patch_hash=b8f1463345250c901d6c568ef8f18b1a084860495af5faaa13c93cee5607268f)(zod@4.5.4)': dependencies: '@ai-sdk/provider': 4.0.11 '@ai-sdk/provider-utils': 5.0.37(zod@4.5.4) @@ -7228,13 +7295,13 @@ snapshots: '@ai-sdk/provider-utils': 5.0.37(zod@4.5.4) zod: 4.5.4 - '@ai-sdk/openai-compatible@3.0.45(zod@4.5.4)': + '@ai-sdk/openai-compatible@3.0.45(patch_hash=71a48986b4e5f640033a57b993be567406a112254c67de27e14d07e1ffbe73a8)(zod@4.5.4)': dependencies: '@ai-sdk/provider': 4.0.11 '@ai-sdk/provider-utils': 5.0.37(zod@4.5.4) zod: 4.5.4 - '@ai-sdk/openai@4.0.62(zod@4.5.4)': + '@ai-sdk/openai@4.0.62(patch_hash=d540f71958d27ae3c5f065c84b9fdb4d6714c067952674016ce2a0adc5dce783)(zod@4.5.4)': dependencies: '@ai-sdk/provider': 4.0.11 '@ai-sdk/provider-utils': 5.0.37(zod@4.5.4) @@ -7348,6 +7415,20 @@ snapshots: '@arcships/light-ocr-model-ppocrv6-small': 0.3.4 '@arcships/light-ocr-runtime': 0.1.7 + '@arcships/rutis-runtime@0.16.0(patch_hash=118a5067c0fb8b1a69ee71008145221773dd67f0722f44a1b71ad5b16113edb1)': + dependencies: + '@deepseek-ai/cordis': 4.0.4 + tsx: 4.23.15 + typescript: typescript-native-bridge@6.0.3-bridge.16.tsgo.7.0.2 + ws: 8.22.0 + transitivePeerDependencies: + - '@deepseek-ai/cordis-plugin-include' + - '@deepseek-ai/cordis-plugin-loader' + - bufferutil + - utf-8-validate + + '@arcships/rutis@0.16.0': {} + '@asamuzakjp/css-color@3.2.0': dependencies: '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) @@ -7890,6 +7971,13 @@ snapshots: '@csstools/css-tokenizer@3.0.4': {} + '@deepseek-ai/cordis@4.0.4': + dependencies: + '@deepseek-ai/cosmokit': 1.8.6 + '@standard-schema/spec': 1.1.0 + + '@deepseek-ai/cosmokit@1.8.6': {} + '@duckdb/node-api@1.5.5-r.4': dependencies: '@duckdb/node-bindings': 1.5.5-r.4 @@ -9340,12 +9428,12 @@ snapshots: postcss-selector-parser: 6.0.10 tailwindcss: 4.3.3 - '@tailwindcss/vite@4.3.3(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0))': + '@tailwindcss/vite@4.3.3(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.23.15)(yaml@2.9.0))': dependencies: '@tailwindcss/node': 4.3.3 '@tailwindcss/oxide': 4.3.3 tailwindcss: 4.3.3 - vite: 7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0) + vite: 7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.23.15)(yaml@2.9.0) '@tanstack/virtual-core@3.17.6': {} @@ -9824,10 +9912,10 @@ snapshots: '@vercel/oidc@3.2.0': {} - '@vitejs/plugin-vue@6.0.8(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0))(vue@3.5.42(typescript-native-bridge@6.0.3-bridge.16.tsgo.7.0.2))': + '@vitejs/plugin-vue@6.0.8(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.23.15)(yaml@2.9.0))(vue@3.5.42(typescript-native-bridge@6.0.3-bridge.16.tsgo.7.0.2))': dependencies: '@rolldown/pluginutils': 1.0.1 - vite: 7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0) + vite: 7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.23.15)(yaml@2.9.0) vue: 3.5.42(typescript-native-bridge@6.0.3-bridge.16.tsgo.7.0.2) '@vitest/expect@4.1.11': @@ -9839,13 +9927,13 @@ snapshots: chai: 6.2.2 tinyrainbow: 3.1.1 - '@vitest/mocker@4.1.11(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0))': + '@vitest/mocker@4.1.11(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.23.15)(yaml@2.9.0))': dependencies: '@vitest/spy': 4.1.11 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0) + vite: 7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.23.15)(yaml@2.9.0) '@vitest/pretty-format@4.1.11': dependencies: @@ -9874,7 +9962,7 @@ snapshots: sirv: 3.0.2 tinyglobby: 0.2.17 tinyrainbow: 3.1.1 - vitest: 4.1.11(@types/node@24.13.3)(@vitest/ui@4.1.11)(jsdom@26.1.0)(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0)) + vitest: 4.1.11(@types/node@24.13.3)(@vitest/ui@4.1.11)(jsdom@26.1.0)(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.23.15)(yaml@2.9.0)) '@vitest/utils@4.1.11': dependencies: @@ -11197,7 +11285,7 @@ snapshots: transitivePeerDependencies: - supports-color - electron-vite@5.0.0(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0)): + electron-vite@5.0.0(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.23.15)(yaml@2.9.0)): dependencies: '@babel/core': 7.29.7 '@babel/plugin-transform-arrow-functions': 7.29.7(@babel/core@7.29.7) @@ -11205,7 +11293,7 @@ snapshots: esbuild: 0.25.12 magic-string: 0.30.21 picocolors: 1.1.1 - vite: 7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0) + vite: 7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.23.15)(yaml@2.9.0) transitivePeerDependencies: - supports-color @@ -13625,6 +13713,12 @@ snapshots: tslib@2.8.1: {} + tsx@4.23.15: + dependencies: + esbuild: 0.28.1 + optionalDependencies: + fsevents: 2.3.3 + turndown@7.2.4: dependencies: '@mixmark-io/domino': 2.2.0 @@ -13721,7 +13815,7 @@ snapshots: pathe: 2.0.3 picomatch: 4.0.5 - unplugin@3.3.0(esbuild@0.28.1)(rollup@4.62.2)(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0)): + unplugin@3.3.0(esbuild@0.28.1)(rollup@4.62.2)(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.23.15)(yaml@2.9.0)): dependencies: '@jridgewell/remapping': 2.3.5 picomatch: 4.0.5 @@ -13729,7 +13823,7 @@ snapshots: optionalDependencies: esbuild: 0.28.1 rollup: 4.62.2 - vite: 7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0) + vite: 7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.23.15)(yaml@2.9.0) unzipper@0.12.5: dependencies: @@ -13771,17 +13865,17 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.3 - vite-dev-rpc@2.0.0(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0)): + vite-dev-rpc@2.0.0(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.23.15)(yaml@2.9.0)): dependencies: birpc: 4.0.0 - vite: 7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0) - vite-hot-client: 2.2.0(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0)) + vite: 7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.23.15)(yaml@2.9.0) + vite-hot-client: 2.2.0(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.23.15)(yaml@2.9.0)) - vite-hot-client@2.2.0(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0)): + vite-hot-client@2.2.0(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.23.15)(yaml@2.9.0)): dependencies: - vite: 7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0) + vite: 7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.23.15)(yaml@2.9.0) - vite-plugin-inspect@11.4.1(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0)): + vite-plugin-inspect@11.4.1(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.23.15)(yaml@2.9.0)): dependencies: ansis: 4.3.1 error-stack-parser-es: 1.0.5 @@ -13791,28 +13885,28 @@ snapshots: perfect-debounce: 2.1.0 sirv: 3.0.2 unplugin-utils: 0.3.2 - vite: 7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0) - vite-dev-rpc: 2.0.0(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0)) + vite: 7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.23.15)(yaml@2.9.0) + vite-dev-rpc: 2.0.0(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.23.15)(yaml@2.9.0)) vite-plugin-monaco-editor-esm@2.0.3(monaco-editor@0.55.1): dependencies: monaco-editor: 0.55.1 - vite-plugin-vue-devtools@8.2.1(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0))(vue@3.5.42(typescript-native-bridge@6.0.3-bridge.16.tsgo.7.0.2)): + vite-plugin-vue-devtools@8.2.1(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.23.15)(yaml@2.9.0))(vue@3.5.42(typescript-native-bridge@6.0.3-bridge.16.tsgo.7.0.2)): dependencies: '@vue/devtools-core': 8.2.1(vue@3.5.42(typescript-native-bridge@6.0.3-bridge.16.tsgo.7.0.2)) '@vue/devtools-kit': 8.2.1 '@vue/devtools-shared': 8.2.1 sirv: 3.0.2 - vite: 7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0) - vite-plugin-inspect: 11.4.1(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0)) - vite-plugin-vue-inspector: 6.0.0(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0)) + vite: 7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.23.15)(yaml@2.9.0) + vite-plugin-inspect: 11.4.1(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.23.15)(yaml@2.9.0)) + vite-plugin-vue-inspector: 6.0.0(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.23.15)(yaml@2.9.0)) transitivePeerDependencies: - '@nuxt/kit' - supports-color - vue - vite-plugin-vue-inspector@6.0.0(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0)): + vite-plugin-vue-inspector@6.0.0(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.23.15)(yaml@2.9.0)): dependencies: '@babel/core': 7.29.7 '@babel/plugin-proposal-decorators': 7.29.7(@babel/core@7.29.7) @@ -13823,7 +13917,7 @@ snapshots: '@vue/compiler-dom': 3.5.40 kolorist: 1.8.0 magic-string: 0.30.21 - vite: 7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0) + vite: 7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.23.15)(yaml@2.9.0) transitivePeerDependencies: - supports-color @@ -13835,7 +13929,7 @@ snapshots: transitivePeerDependencies: - supports-color - vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0): + vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.23.15)(yaml@2.9.0): dependencies: esbuild: 0.28.1 fdir: 6.5.0(picomatch@4.0.5) @@ -13848,12 +13942,13 @@ snapshots: fsevents: 2.3.3 jiti: 2.7.0 lightningcss: 1.32.0 + tsx: 4.23.15 yaml: 2.9.0 - vitest@4.1.11(@types/node@24.13.3)(@vitest/ui@4.1.11)(jsdom@26.1.0)(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0)): + vitest@4.1.11(@types/node@24.13.3)(@vitest/ui@4.1.11)(jsdom@26.1.0)(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.23.15)(yaml@2.9.0)): dependencies: '@vitest/expect': 4.1.11 - '@vitest/mocker': 4.1.11(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0)) + '@vitest/mocker': 4.1.11(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.23.15)(yaml@2.9.0)) '@vitest/pretty-format': 4.1.11 '@vitest/runner': 4.1.11 '@vitest/snapshot': 4.1.11 @@ -13870,7 +13965,7 @@ snapshots: tinyexec: 1.3.0 tinyglobby: 0.2.17 tinyrainbow: 3.1.1 - vite: 7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0) + vite: 7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.23.15)(yaml@2.9.0) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 24.13.3 @@ -13895,7 +13990,7 @@ snapshots: '@vue/devtools-api': 6.6.4 vue: 3.5.42(typescript-native-bridge@6.0.3-bridge.16.tsgo.7.0.2) - vue-router@5.3.1(@pinia/colada@0.20.0(pinia@3.0.4(typescript-native-bridge@6.0.3-bridge.16.tsgo.7.0.2)(vue@3.5.42(typescript-native-bridge@6.0.3-bridge.16.tsgo.7.0.2)))(vue@3.5.42(typescript-native-bridge@6.0.3-bridge.16.tsgo.7.0.2)))(@vue/compiler-sfc@3.5.42)(esbuild@0.28.1)(pinia@3.0.4(typescript-native-bridge@6.0.3-bridge.16.tsgo.7.0.2)(vue@3.5.42(typescript-native-bridge@6.0.3-bridge.16.tsgo.7.0.2)))(rollup@4.62.2)(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0))(vue@3.5.42(typescript-native-bridge@6.0.3-bridge.16.tsgo.7.0.2)): + vue-router@5.3.1(@pinia/colada@0.20.0(pinia@3.0.4(typescript-native-bridge@6.0.3-bridge.16.tsgo.7.0.2)(vue@3.5.42(typescript-native-bridge@6.0.3-bridge.16.tsgo.7.0.2)))(vue@3.5.42(typescript-native-bridge@6.0.3-bridge.16.tsgo.7.0.2)))(@vue/compiler-sfc@3.5.42)(esbuild@0.28.1)(pinia@3.0.4(typescript-native-bridge@6.0.3-bridge.16.tsgo.7.0.2)(vue@3.5.42(typescript-native-bridge@6.0.3-bridge.16.tsgo.7.0.2)))(rollup@4.62.2)(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.23.15)(yaml@2.9.0))(vue@3.5.42(typescript-native-bridge@6.0.3-bridge.16.tsgo.7.0.2)): dependencies: '@vue-macros/common': 3.1.4(vue@3.5.42(typescript-native-bridge@6.0.3-bridge.16.tsgo.7.0.2)) '@vue/devtools-api': 8.1.5 @@ -13911,14 +14006,14 @@ snapshots: picomatch: 4.0.5 scule: 1.3.0 tinyglobby: 0.2.17 - unplugin: 3.3.0(esbuild@0.28.1)(rollup@4.62.2)(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0)) + unplugin: 3.3.0(esbuild@0.28.1)(rollup@4.62.2)(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.23.15)(yaml@2.9.0)) unplugin-utils: 0.3.2 vue: 3.5.42(typescript-native-bridge@6.0.3-bridge.16.tsgo.7.0.2) optionalDependencies: '@pinia/colada': 0.20.0(pinia@3.0.4(typescript-native-bridge@6.0.3-bridge.16.tsgo.7.0.2)(vue@3.5.42(typescript-native-bridge@6.0.3-bridge.16.tsgo.7.0.2)))(vue@3.5.42(typescript-native-bridge@6.0.3-bridge.16.tsgo.7.0.2)) '@vue/compiler-sfc': 3.5.42 pinia: 3.0.4(typescript-native-bridge@6.0.3-bridge.16.tsgo.7.0.2)(vue@3.5.42(typescript-native-bridge@6.0.3-bridge.16.tsgo.7.0.2)) - vite: 7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0) + vite: 7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.23.15)(yaml@2.9.0) transitivePeerDependencies: - '@farmfe/core' - '@rspack/core' @@ -14038,6 +14133,8 @@ snapshots: ws@8.21.1: {} + ws@8.22.0: {} + wsl-utils@0.3.1: dependencies: is-wsl: 3.1.1 diff --git a/resources/acp-registry/registry.json b/resources/acp-registry/registry.json index adcd187945..70748e61f5 100644 --- a/resources/acp-registry/registry.json +++ b/resources/acp-registry/registry.json @@ -68,7 +68,7 @@ { "id": "antigravity-acp", "name": "Google Antigravity", - "version": "1.4.3", + "version": "1.4.4", "description": "Google’s AI coding agent", "website": "https://antigravity.google/docs/ide/extensions", "authors": [ @@ -79,40 +79,40 @@ "distribution": { "binary": { "darwin-aarch64": { - "archive": "https://dl.google.com/agy-extensions/releases/macos/agy-acp-server-1.4.3-darwin-arm64.zip", + "archive": "https://dl.google.com/agy-extensions/releases/macos/agy-acp-server-1.4.4-darwin-arm64.zip", "cmd": "./agy_acp_server.par", - "sha256": "c57db0a9b8b712daa9c3c17cdb990a61842ea569f279e8bd79d7aa85a303b20b" + "sha256": "a3cf324046396380fcd8c055a4a4c83ac4ea74a38ea883ccbfce5ca1e9927ae9" }, "darwin-x86_64": { - "archive": "https://dl.google.com/agy-extensions/releases/macos/agy-acp-server-1.4.3-darwin-x86_64.zip", + "archive": "https://dl.google.com/agy-extensions/releases/macos/agy-acp-server-1.4.4-darwin-x86_64.zip", "cmd": "./agy_acp_server.par", - "sha256": "9392dbbdad7f0663dbfb5a0bf641297b0cf80d2ee9cd2d49a616bbbc7378731d" + "sha256": "019e6ce30cf906ba94b761d752c7ccd01a324f4701efca31542de04b60be8fd7" }, "linux-x86_64": { - "archive": "https://dl.google.com/agy-extensions/releases/linux/agy-acp-server-1.4.3-linux-x86_64.zip", + "archive": "https://dl.google.com/agy-extensions/releases/linux/agy-acp-server-1.4.4-linux-x86_64.zip", "cmd": "./agy_acp_server.par", "args": [ "--uid=" ], - "sha256": "0634ce5306ba92c932945455e7a83fda78e2d99c33fa8aa6ee0566206a382714" + "sha256": "baf31b7a97602dee359cf2a43f72b6e11c6bf354be874987d80660cd3526bb6a" }, "linux-aarch64": { - "archive": "https://dl.google.com/agy-extensions/releases/linux/agy-acp-server-1.4.3-linux-arm64.zip", + "archive": "https://dl.google.com/agy-extensions/releases/linux/agy-acp-server-1.4.4-linux-arm64.zip", "cmd": "./agy_acp_server.par", "args": [ "--uid=" ], - "sha256": "05c153443b0b1175151c760eeddea538950bc9843e317d54786a1f03670182bc" + "sha256": "b0273227c07cfa1ea5c1d9ff869b64c5b2b39b98862081fcd4c597ec316e0c57" }, "windows-x86_64": { - "archive": "https://dl.google.com/agy-extensions/releases/windows/agy-acp-server-1.4.3-windows-x86_64.zip", + "archive": "https://dl.google.com/agy-extensions/releases/windows/agy-acp-server-1.4.4-windows-x86_64.zip", "cmd": "./agy_acp_server.exe", - "sha256": "54c2e16378d9a4952e1da70e355f3c33c4f284308d6de48ab3e6e34a127bd325" + "sha256": "4b68e5936a3d7a60b520aa1ee9479c8be58c43e015f026dc41e7ad17ec54d427" }, "windows-aarch64": { - "archive": "https://dl.google.com/agy-extensions/releases/windows/agy-acp-server-1.4.3-windows-arm64.zip", + "archive": "https://dl.google.com/agy-extensions/releases/windows/agy-acp-server-1.4.4-windows-arm64.zip", "cmd": "./agy_acp_server.exe", - "sha256": "fcd46431ad33d3b510ce0b98fe7b43d095bd8b3f1c363ee2d57faa7ee981c7bb" + "sha256": "655835b095e160d726ee894a10e56960a9a81b03503edbd348079336163b28de" } } }, @@ -186,7 +186,7 @@ { "id": "claude-acp", "name": "Claude Agent", - "version": "0.95.0", + "version": "0.99.0", "description": "ACP wrapper for Anthropic's Claude", "repository": "https://github.com/agentclientprotocol/claude-agent-acp", "authors": [ @@ -198,7 +198,7 @@ "license_url": "https://github.com/agentclientprotocol/claude-agent-acp/blob/main/LICENSE", "distribution": { "npx": { - "package": "@agentclientprotocol/claude-agent-acp@0.95.0" + "package": "@agentclientprotocol/claude-agent-acp@0.99.0" } }, "icon": "https://cdn.agentclientprotocol.com/registry/v1/latest/claude-acp.svg" @@ -228,7 +228,7 @@ { "id": "codebuddy-code", "name": "Codebuddy Code", - "version": "2.176.0", + "version": "2.178.0", "description": "Tencent Cloud's official intelligent coding tool", "website": "https://www.codebuddy.cn/cli/", "authors": [ @@ -238,7 +238,7 @@ "license_url": "https://www.codebuddy.cn/agreement/", "distribution": { "npx": { - "package": "@tencent-ai/codebuddy-code@2.176.0", + "package": "@tencent-ai/codebuddy-code@2.178.0", "args": [ "--acp" ] @@ -249,7 +249,7 @@ { "id": "codex-acp", "name": "Codex", - "version": "2.2.2", + "version": "2.3.0", "description": "ACP adapter for OpenAI's coding assistant", "repository": "https://github.com/agentclientprotocol/codex-acp", "authors": [ @@ -261,7 +261,7 @@ "license_url": "https://github.com/agentclientprotocol/codex-acp/blob/main/LICENSE", "distribution": { "npx": { - "package": "@agentclientprotocol/codex-acp@2.2.2" + "package": "@agentclientprotocol/codex-acp@2.3.0" } }, "icon": "https://cdn.agentclientprotocol.com/registry/v1/latest/codex-acp.svg" @@ -500,7 +500,7 @@ { "id": "devin", "name": "Devin", - "version": "3000.11.205", + "version": "3000.11.228", "description": "Devin CLI coding agent by Cognition", "website": "https://docs.devin.ai/cli", "authors": [ @@ -512,42 +512,42 @@ "distribution": { "binary": { "darwin-aarch64": { - "archive": "https://static.devin.ai/cli/3000.11.205/devin-3000.11.205-aarch64-apple-darwin.tar.gz", + "archive": "https://static.devin.ai/cli/3000.11.228/devin-3000.11.228-aarch64-apple-darwin.tar.gz", "cmd": "./bin/devin", "args": [ "acp" ] }, "darwin-x86_64": { - "archive": "https://static.devin.ai/cli/3000.11.205/devin-3000.11.205-x86_64-apple-darwin.tar.gz", + "archive": "https://static.devin.ai/cli/3000.11.228/devin-3000.11.228-x86_64-apple-darwin.tar.gz", "cmd": "./bin/devin", "args": [ "acp" ] }, "linux-aarch64": { - "archive": "https://static.devin.ai/cli/3000.11.205/devin-3000.11.205-aarch64-unknown-linux.tar.gz", + "archive": "https://static.devin.ai/cli/3000.11.228/devin-3000.11.228-aarch64-unknown-linux.tar.gz", "cmd": "./bin/devin", "args": [ "acp" ] }, "linux-x86_64": { - "archive": "https://static.devin.ai/cli/3000.11.205/devin-3000.11.205-x86_64-unknown-linux.tar.gz", + "archive": "https://static.devin.ai/cli/3000.11.228/devin-3000.11.228-x86_64-unknown-linux.tar.gz", "cmd": "./bin/devin", "args": [ "acp" ] }, "windows-aarch64": { - "archive": "https://static.devin.ai/cli/3000.11.205/devin-3000.11.205-aarch64-pc-windows.zip", + "archive": "https://static.devin.ai/cli/3000.11.228/devin-3000.11.228-aarch64-pc-windows.zip", "cmd": "./bin\\devin.exe", "args": [ "acp" ] }, "windows-x86_64": { - "archive": "https://static.devin.ai/cli/3000.11.205/devin-3000.11.205-x86_64-pc-windows.zip", + "archive": "https://static.devin.ai/cli/3000.11.228/devin-3000.11.228-x86_64-pc-windows.zip", "cmd": "./bin\\devin.exe", "args": [ "acp" @@ -560,9 +560,9 @@ { "id": "dimcode", "name": "DimCode", - "version": "0.5.21", + "version": "0.5.22", "description": "A coding agent that puts leading models at your command.", - "website": "https://dimcode.dev/docs/acp.html", + "website": "https://dimagent.cn/", "authors": [ "ArcShips" ], @@ -570,7 +570,7 @@ "license_url": "https://dimagent.cn/terms", "distribution": { "npx": { - "package": "dimcode@0.5.21", + "package": "dimcode@0.5.22", "args": [ "acp" ] @@ -603,7 +603,7 @@ { "id": "factory-droid", "name": "Factory Droid", - "version": "0.249.0", + "version": "0.251.0", "description": "Factory Droid - AI coding agent powered by Factory AI", "website": "https://factory.ai/product/cli", "authors": [ @@ -613,7 +613,7 @@ "license_url": "https://factory.ai/legal/terms", "distribution": { "npx": { - "package": "droid@0.249.0", + "package": "droid@0.251.0", "args": [ "exec", "--output-format", @@ -655,7 +655,7 @@ { "id": "gemini", "name": "Gemini CLI", - "version": "0.65.0", + "version": "0.66.0", "description": "Google's official CLI for Gemini", "repository": "https://github.com/google-gemini/gemini-cli", "website": "https://geminicli.com", @@ -666,7 +666,7 @@ "license_url": "https://github.com/google-gemini/gemini-cli/blob/main/LICENSE", "distribution": { "npx": { - "package": "@google/gemini-cli@0.65.0", + "package": "@google/gemini-cli@0.66.0", "args": [ "--acp" ] @@ -677,7 +677,7 @@ { "id": "github-copilot-cli", "name": "Copilot", - "version": "1.0.103", + "version": "1.0.105", "description": "GitHub's AI pair programmer", "repository": "https://github.com/github/copilot-cli", "website": "https://github.com/features/copilot/cli/", @@ -688,7 +688,7 @@ "license_url": "https://github.com/github/copilot-cli/blob/main/LICENSE.md", "distribution": { "npx": { - "package": "@github/copilot@1.0.103", + "package": "@github/copilot@1.0.105", "args": [ "--acp" ] @@ -699,7 +699,7 @@ { "id": "glm-acp-agent", "name": "GLM Agent", - "version": "1.15.0", + "version": "1.16.0", "description": "ACP agent powered by Zhipu AI's GLM Coding Plan models (glm-5.1, glm-5-turbo, glm-4.7, glm-4.5-air). Supports streaming, tool calls, mid-session model switching, image input via Z.AI Coding Plan Vision MCP, and session load/fork/resume with on-disk persistence.", "repository": "https://github.com/stefandevo/glm-acp-agent", "authors": [ @@ -710,14 +710,14 @@ "icon": "https://cdn.agentclientprotocol.com/registry/v1/latest/glm-acp-agent.svg", "distribution": { "npx": { - "package": "glm-acp-agent@1.15.0" + "package": "glm-acp-agent@1.16.0" } } }, { "id": "goose", "name": "goose", - "version": "1.56.0", + "version": "1.57.0", "description": "A local, extensible, open source AI agent that automates engineering tasks", "repository": "https://github.com/block/goose", "website": "https://block.github.io/goose/", @@ -729,44 +729,44 @@ "distribution": { "binary": { "darwin-aarch64": { - "archive": "https://github.com/block/goose/releases/download/v1.56.0/goose-aarch64-apple-darwin.tar.bz2", + "archive": "https://github.com/block/goose/releases/download/v1.57.0/goose-aarch64-apple-darwin.tar.bz2", "cmd": "./goose", "args": [ "acp" ], - "sha256": "62d806417b19be167474297eaaec7783ff9917f4fa772e781e977f2bdc155163" + "sha256": "2fbafa227ab28654c47065f1c9ebcd12f527f017e30c08e618bc6fcf363d7935" }, "darwin-x86_64": { - "archive": "https://github.com/block/goose/releases/download/v1.56.0/goose-x86_64-apple-darwin.tar.bz2", + "archive": "https://github.com/block/goose/releases/download/v1.57.0/goose-x86_64-apple-darwin.tar.bz2", "cmd": "./goose", "args": [ "acp" ], - "sha256": "0dabf1bc691a1855bc06d2bb5445d27d9c7c08f7ea5af49d32e460a85b98a2ad" + "sha256": "e48fe024891a4c272a89c74b9ae843d76a73229643c917b785b0680fef9c647a" }, "linux-aarch64": { - "archive": "https://github.com/block/goose/releases/download/v1.56.0/goose-aarch64-unknown-linux-gnu.tar.bz2", + "archive": "https://github.com/block/goose/releases/download/v1.57.0/goose-aarch64-unknown-linux-gnu.tar.bz2", "cmd": "./goose", "args": [ "acp" ], - "sha256": "30b60a49a534ca7af062ec94b752367494ad3a2824744a6d1e8ec3e1040d9922" + "sha256": "17c6b090db6acc5605da904bbe19cc2765bc7a6786019d85a6d0a361de06dbf7" }, "linux-x86_64": { - "archive": "https://github.com/block/goose/releases/download/v1.56.0/goose-x86_64-unknown-linux-gnu.tar.bz2", + "archive": "https://github.com/block/goose/releases/download/v1.57.0/goose-x86_64-unknown-linux-gnu.tar.bz2", "cmd": "./goose", "args": [ "acp" ], - "sha256": "e29544421a6e698aab0fe4becda96096218ff36abe85b83785519d41c555c714" + "sha256": "e54036f3b7f95d3b0d7854c09465af5ef52a28c7fa03d2497d0ea68a6382282d" }, "windows-x86_64": { - "archive": "https://github.com/block/goose/releases/download/v1.56.0/goose-x86_64-pc-windows-msvc.zip", + "archive": "https://github.com/block/goose/releases/download/v1.57.0/goose-x86_64-pc-windows-msvc.zip", "cmd": "./goose-package\\goose.exe", "args": [ "acp" ], - "sha256": "76fbb942579f5851b6593ab0f97b7bd7317d700132443dfa37aa1cddb8af04da" + "sha256": "1ab2117ceec37f95be4d3ad0cdb921d3e97fd8b0fa244046631ecf4b7619d502" } } }, @@ -775,7 +775,7 @@ { "id": "grok-build", "name": "Grok Build", - "version": "1.0.70", + "version": "1.0.73", "description": "xAI's coding agent and CLI", "website": "https://x.ai/cli", "authors": [ @@ -785,7 +785,7 @@ "license_url": "https://x.ai/legal/terms-of-service", "distribution": { "npx": { - "package": "@xai-official/grok@1.0.70", + "package": "@xai-official/grok@1.0.73", "args": [ "agent", "stdio" @@ -860,7 +860,7 @@ { "id": "junie", "name": "Junie", - "version": "3813.9.0", + "version": "3893.6.0", "description": "AI Coding Agent by JetBrains", "repository": "https://github.com/JetBrains/junie-acp-release", "website": "https://junie.jetbrains.com", @@ -872,42 +872,42 @@ "distribution": { "binary": { "darwin-aarch64": { - "archive": "https://github.com/JetBrains/junie-acp-release/releases/download/3813.9/junie-release-3813.9-macos-aarch64.zip", + "archive": "https://github.com/JetBrains/junie-acp-release/releases/download/3893.6/junie-release-3893.6-macos-aarch64.zip", "cmd": "./Applications/junie.app/Contents/MacOS/junie", "args": [ "--acp=true" ] }, "darwin-x86_64": { - "archive": "https://github.com/JetBrains/junie-acp-release/releases/download/3813.9/junie-release-3813.9-macos-amd64.zip", + "archive": "https://github.com/JetBrains/junie-acp-release/releases/download/3893.6/junie-release-3893.6-macos-amd64.zip", "cmd": "./Applications/junie.app/Contents/MacOS/junie", "args": [ "--acp=true" ] }, "linux-aarch64": { - "archive": "https://github.com/JetBrains/junie-acp-release/releases/download/3813.9/junie-release-3813.9-linux-aarch64.zip", + "archive": "https://github.com/JetBrains/junie-acp-release/releases/download/3893.6/junie-release-3893.6-linux-aarch64.zip", "cmd": "./junie-app/bin/junie", "args": [ "--acp=true" ] }, "linux-x86_64": { - "archive": "https://github.com/JetBrains/junie-acp-release/releases/download/3813.9/junie-release-3813.9-linux-amd64.zip", + "archive": "https://github.com/JetBrains/junie-acp-release/releases/download/3893.6/junie-release-3893.6-linux-amd64.zip", "cmd": "./junie-app/bin/junie", "args": [ "--acp=true" ] }, "windows-x86_64": { - "archive": "https://github.com/JetBrains/junie-acp-release/releases/download/3813.9/junie-release-3813.9-windows-amd64.zip", + "archive": "https://github.com/JetBrains/junie-acp-release/releases/download/3893.6/junie-release-3893.6-windows-amd64.zip", "cmd": "./junie/junie.exe", "args": [ "--acp=true" ] }, "windows-aarch64": { - "archive": "https://github.com/JetBrains/junie-acp-release/releases/download/3813.9/junie-release-3813.9-windows-aarch64.zip", + "archive": "https://github.com/JetBrains/junie-acp-release/releases/download/3893.6/junie-release-3893.6-windows-aarch64.zip", "cmd": "./junie/junie.exe", "args": [ "--acp=true" @@ -920,7 +920,7 @@ { "id": "kilo", "name": "Kilo", - "version": "7.8.17", + "version": "7.8.18", "description": "The open source coding agent", "repository": "https://github.com/Kilo-Org/kilocode", "website": "https://kilo.ai/", @@ -933,48 +933,48 @@ "distribution": { "binary": { "darwin-aarch64": { - "archive": "https://github.com/Kilo-Org/kilocode/releases/download/v7.8.17/kilo-darwin-arm64.zip", + "archive": "https://github.com/Kilo-Org/kilocode/releases/download/v7.8.18/kilo-darwin-arm64.zip", "cmd": "./kilo", "args": [ "acp" ], - "sha256": "9f831b47ea48159d1bbbc52dd73e3a7426715b14a36c1c7007660cf8ff12839c" + "sha256": "1ea2285a2f45ec27b7fa3b644f92700adf4a91fd671aaf18ba0cb8f26c795df5" }, "darwin-x86_64": { - "archive": "https://github.com/Kilo-Org/kilocode/releases/download/v7.8.17/kilo-darwin-x64.zip", + "archive": "https://github.com/Kilo-Org/kilocode/releases/download/v7.8.18/kilo-darwin-x64.zip", "cmd": "./kilo", "args": [ "acp" ], - "sha256": "c29ce4ee5e68aa4fa65ef44754a10f061c359b491005ce3f6d21dc1f92be9331" + "sha256": "00f6ac8fb49368e5726dc23780ee1c18fd1fd89a817e8cc38c1fe9d7db6232d2" }, "linux-aarch64": { - "archive": "https://github.com/Kilo-Org/kilocode/releases/download/v7.8.17/kilo-linux-arm64.tar.gz", + "archive": "https://github.com/Kilo-Org/kilocode/releases/download/v7.8.18/kilo-linux-arm64.tar.gz", "cmd": "./kilo", "args": [ "acp" ], - "sha256": "02ac19531143b6691947f7ed9b137e5d64697a3d9f6de4143cf710b6dc96dc64" + "sha256": "55a1c13fca09eb96e5de6ec8206e1e47e5f9ec0dbf02bd1316be737bfd0666ae" }, "linux-x86_64": { - "archive": "https://github.com/Kilo-Org/kilocode/releases/download/v7.8.17/kilo-linux-x64.tar.gz", + "archive": "https://github.com/Kilo-Org/kilocode/releases/download/v7.8.18/kilo-linux-x64.tar.gz", "cmd": "./kilo", "args": [ "acp" ], - "sha256": "73491b15e9816fa1c982331ff4d8418e5aa9fd6d861853ab4c81935200ae8f6a" + "sha256": "503561fb8c4b8ede26703457a912b98cf18c9c9e8961649f3718cf7676b5c02a" }, "windows-x86_64": { - "archive": "https://github.com/Kilo-Org/kilocode/releases/download/v7.8.17/kilo-windows-x64.zip", + "archive": "https://github.com/Kilo-Org/kilocode/releases/download/v7.8.18/kilo-windows-x64.zip", "cmd": "./kilo.exe", "args": [ "acp" ], - "sha256": "dfd6e391c6f0d8e3aaf568784729873ef2ce1f6ca96c2ff8f342caa93ab61917" + "sha256": "4d13c566a3e7d91ceb6986ea037a4eee6aa145918a75b38f8208034c07e74780" } }, "npx": { - "package": "@kilocode/cli@7.8.17", + "package": "@kilocode/cli@7.8.18", "args": [ "acp" ] @@ -984,7 +984,7 @@ { "id": "kimchi", "name": "Kimchi", - "version": "1.21.0", + "version": "1.22.5", "description": "Coding agent powered by multi-model orchestration", "repository": "https://github.com/getkimchi/kimchi", "website": "https://kimchi.dev", @@ -996,8 +996,8 @@ "distribution": { "binary": { "darwin-aarch64": { - "archive": "https://github.com/getkimchi/kimchi/releases/download/v1.21.0/kimchi_darwin_arm64.tar.gz", - "sha256": "2cb5bc08ca1f78ba69a27a4931f97f7a343ede51be5850a4ca05337490ccd2d4", + "archive": "https://github.com/getkimchi/kimchi/releases/download/v1.22.5/kimchi_darwin_arm64.tar.gz", + "sha256": "330a44bca0eb9cd537d8e7499b08af6a1313bfe350788e5985c5642e3373afaa", "cmd": "./bin/kimchi", "args": [ "--mode", @@ -1005,8 +1005,8 @@ ] }, "darwin-x86_64": { - "archive": "https://github.com/getkimchi/kimchi/releases/download/v1.21.0/kimchi_darwin_amd64.tar.gz", - "sha256": "d00fb6d88e8eb3d34ced03dfb027ed8b45c7e40afd857c6d4175bea28ee9c297", + "archive": "https://github.com/getkimchi/kimchi/releases/download/v1.22.5/kimchi_darwin_amd64.tar.gz", + "sha256": "8e8a6da321ec37bd305642f7b94b18683e49a23ea7db02532f74f559aced8016", "cmd": "./bin/kimchi", "args": [ "--mode", @@ -1014,8 +1014,8 @@ ] }, "linux-aarch64": { - "archive": "https://github.com/getkimchi/kimchi/releases/download/v1.21.0/kimchi_linux_arm64.tar.gz", - "sha256": "bf37cd64981c5288d29930d5f54a2415b1afb9438bb7aaa6abeaecdf523de9eb", + "archive": "https://github.com/getkimchi/kimchi/releases/download/v1.22.5/kimchi_linux_arm64.tar.gz", + "sha256": "f5b0970b3e356cfb50f39a23718b275c87f0d665a569e39c294890dd9f662395", "cmd": "./bin/kimchi", "args": [ "--mode", @@ -1023,8 +1023,8 @@ ] }, "linux-x86_64": { - "archive": "https://github.com/getkimchi/kimchi/releases/download/v1.21.0/kimchi_linux_amd64.tar.gz", - "sha256": "e40425789650a71fcc3974ec09ead56c5fadb030790895033e884431ac0c794a", + "archive": "https://github.com/getkimchi/kimchi/releases/download/v1.22.5/kimchi_linux_amd64.tar.gz", + "sha256": "0df8211090135639593bde5692ce68e69edeb00d178e98852edbd70f7e89c06f", "cmd": "./bin/kimchi", "args": [ "--mode", @@ -1032,8 +1032,8 @@ ] }, "windows-x86_64": { - "archive": "https://github.com/getkimchi/kimchi/releases/download/v1.21.0/kimchi_windows_amd64.zip", - "sha256": "2203a1d43d20f569c527eb23cb41beb7417c363ad4c555061d4c4d0f4f2d5a3f", + "archive": "https://github.com/getkimchi/kimchi/releases/download/v1.22.5/kimchi_windows_amd64.zip", + "sha256": "0dda53493308709a246810fa00cdc86723c518ade4d6a18a44ef36ab19401172", "cmd": "./bin/kimchi.exe", "args": [ "--mode", @@ -1147,7 +1147,7 @@ { "id": "mistral-vibe", "name": "Mistral Vibe", - "version": "3.0.1", + "version": "3.0.3", "description": "Mistral's open-source coding assistant", "repository": "https://github.com/mistralai/mistral-vibe", "website": "https://mistral.ai/products/vibe", @@ -1160,29 +1160,29 @@ "distribution": { "binary": { "darwin-aarch64": { - "archive": "https://github.com/mistralai/mistral-vibe/releases/download/v3.0.1/vibe-acp-darwin-aarch64-3.0.1.tar.gz", + "archive": "https://github.com/mistralai/mistral-vibe/releases/download/v3.0.3/vibe-acp-darwin-aarch64-3.0.3.tar.gz", "cmd": "./vibe-acp", - "sha256": "9da1f65d5d233ad0f79efd8abf1f5c1b258059c2cf58af8c1c3be3d7831d0e89" + "sha256": "6ead876685191ab26a91e749aba9452bc13360cf16186c09221ebcdf64145620" }, "darwin-x86_64": { - "archive": "https://github.com/mistralai/mistral-vibe/releases/download/v3.0.1/vibe-acp-darwin-x86_64-3.0.1.tar.gz", + "archive": "https://github.com/mistralai/mistral-vibe/releases/download/v3.0.3/vibe-acp-darwin-x86_64-3.0.3.tar.gz", "cmd": "./vibe-acp", - "sha256": "94cba80888c24e509aa96182c6d8d38656d3da8ff72eae64a1ee396c5586d4b6" + "sha256": "b4e968a5427c89a76363ad2dfb73e8db889b1c20aebfa43a07b30ebc08efb707" }, "linux-aarch64": { - "archive": "https://github.com/mistralai/mistral-vibe/releases/download/v3.0.1/vibe-acp-linux-aarch64-3.0.1.tar.gz", + "archive": "https://github.com/mistralai/mistral-vibe/releases/download/v3.0.3/vibe-acp-linux-aarch64-3.0.3.tar.gz", "cmd": "./vibe-acp", - "sha256": "7ef82101b23d286fb43eb911a6f2d75cf67cbb0ca3d026e7ff1db9d8ccaf32e0" + "sha256": "98f46403512ea44c6432ed4c14e2b2d4cd900fe9db8a5bd8930c594ab6424f83" }, "linux-x86_64": { - "archive": "https://github.com/mistralai/mistral-vibe/releases/download/v3.0.1/vibe-acp-linux-x86_64-3.0.1.tar.gz", + "archive": "https://github.com/mistralai/mistral-vibe/releases/download/v3.0.3/vibe-acp-linux-x86_64-3.0.3.tar.gz", "cmd": "./vibe-acp", - "sha256": "0771544f32f64132731e3d40ca1fdfa628c6076dae1ad4d273fdc31562a13062" + "sha256": "59ae5700ca17a2cb892ce8a3edb3bce02bd10efa0cb15e56afb964d5938e4d99" }, "windows-x86_64": { - "archive": "https://github.com/mistralai/mistral-vibe/releases/download/v3.0.1/vibe-acp-windows-x86_64-3.0.1.zip", + "archive": "https://github.com/mistralai/mistral-vibe/releases/download/v3.0.3/vibe-acp-windows-x86_64-3.0.3.zip", "cmd": "./vibe-acp.exe", - "sha256": "63398f233948da074a3e0c00aa78c3709aed11847b8d4b403cdbdc325883bc52" + "sha256": "91a96c01ee4fa9d7510b777e0bce6d4a9706ed8aa4ac3e715f1a5586d2707d4f" } } } @@ -1190,7 +1190,7 @@ { "id": "nova", "name": "Nova", - "version": "1.1.59", + "version": "1.1.60", "description": "Nova by Compass AI - a fully-fledged software engineer at your command", "repository": "https://github.com/Compass-Agentic-Platform/nova", "website": "https://www.compassap.ai/portfolio/nova.html", @@ -1202,7 +1202,7 @@ "icon": "https://cdn.agentclientprotocol.com/registry/v1/latest/nova.svg", "distribution": { "npx": { - "package": "@compass-ai/nova@1.1.59", + "package": "@compass-ai/nova@1.1.60", "args": [ "acp" ] @@ -1212,7 +1212,7 @@ { "id": "opencode", "name": "OpenCode", - "version": "1.19.4", + "version": "2.2.0", "description": "The open source coding agent", "repository": "https://github.com/anomalyco/opencode", "website": "https://opencode.ai", @@ -1225,52 +1225,52 @@ "distribution": { "binary": { "darwin-aarch64": { - "archive": "https://github.com/anomalyco/opencode/releases/download/v1.19.4/opencode-darwin-arm64.zip", + "archive": "https://github.com/anomalyco/opencode/releases/download/v2.2.0/opencode-darwin-arm64.zip", "cmd": "./opencode", "args": [ "acp" ], - "sha256": "c400a2f8c8ab7e99478a7f4dd1a466b57bf33888e520d85c55780a5464c4b689" + "sha256": "c71b1cd96541539ad38e2a75377d2f43d2a27567289a14371a182e9a0800db3d" }, "darwin-x86_64": { - "archive": "https://github.com/anomalyco/opencode/releases/download/v1.19.4/opencode-darwin-x64.zip", + "archive": "https://github.com/anomalyco/opencode/releases/download/v2.2.0/opencode-darwin-x64.zip", "cmd": "./opencode", "args": [ "acp" ], - "sha256": "123ebd72609c4f8dbae0485cdac39b9aedfeb6576b2eef64f2e73152b1de82f4" + "sha256": "cc191a1cec9b9cd0192d78dc066bbf48730639131422fa54c87c485a821ba1d5" }, "linux-aarch64": { - "archive": "https://github.com/anomalyco/opencode/releases/download/v1.19.4/opencode-linux-arm64.tar.gz", + "archive": "https://github.com/anomalyco/opencode/releases/download/v2.2.0/opencode-linux-arm64.tar.gz", "cmd": "./opencode", "args": [ "acp" ], - "sha256": "8568230ccd847dc93e95b9f6894379077d3e014a16b48040743573e77c23e85f" + "sha256": "1f1ce0fc07b9245a815ffa9d652dbb80e6b0f07e5bf74ea87d2b1c0339fbac52" }, "linux-x86_64": { - "archive": "https://github.com/anomalyco/opencode/releases/download/v1.19.4/opencode-linux-x64.tar.gz", + "archive": "https://github.com/anomalyco/opencode/releases/download/v2.2.0/opencode-linux-x64.tar.gz", "cmd": "./opencode", "args": [ "acp" ], - "sha256": "849bd6b3d959a1d2ef200ed1634a51c79a45ca236aa26665d75debd694805cce" + "sha256": "6d597970a8cc448f1b9a9f645532584b339dd3ab9583bb5f063f13d83e54768f" }, "windows-aarch64": { - "archive": "https://github.com/anomalyco/opencode/releases/download/v1.19.4/opencode-windows-arm64.zip", + "archive": "https://github.com/anomalyco/opencode/releases/download/v2.2.0/opencode-windows-arm64.zip", "cmd": "./opencode.exe", "args": [ "acp" ], - "sha256": "36e696fd1d275b469ab02a1ccc00d161bfdcc0a4ffa93c2b7a4e57399f3ff347" + "sha256": "bceb8b16e4889b7766793e1e7b51e3ab97ad41e09367a5bf192c15c0334b848a" }, "windows-x86_64": { - "archive": "https://github.com/anomalyco/opencode/releases/download/v1.19.4/opencode-windows-x64.zip", + "archive": "https://github.com/anomalyco/opencode/releases/download/v2.2.0/opencode-windows-x64.zip", "cmd": "./opencode.exe", "args": [ "acp" ], - "sha256": "93b899277bd6f68803009e32bf71772ce43c34b18adf1e93b9b4d8780fdf62e5" + "sha256": "a56307bdccdafd3fc5255556f3bf867703ea56dbeffaf00add4e9663edb3b974" } } } @@ -1278,7 +1278,7 @@ { "id": "opencode-v2", "name": "OpenCode V2", - "version": "2.1.4", + "version": "2.2.0", "description": "The open source coding agent, version 2", "repository": "https://github.com/anomalyco/opencode", "website": "https://opencode.ai", @@ -1291,52 +1291,52 @@ "distribution": { "binary": { "darwin-aarch64": { - "archive": "https://opencode.ai/files/bin/2.1.4/opencode-darwin-arm64.zip", + "archive": "https://opencode.ai/files/bin/2.2.0/opencode-darwin-arm64.zip", "cmd": "./opencode", "args": [ "acp" ], - "sha256": "f9edc1dded080e39aa61db94270a51af66772ac572be7d6b15fa6f87251a3dff" + "sha256": "c71b1cd96541539ad38e2a75377d2f43d2a27567289a14371a182e9a0800db3d" }, "darwin-x86_64": { - "archive": "https://opencode.ai/files/bin/2.1.4/opencode-darwin-x64.zip", + "archive": "https://opencode.ai/files/bin/2.2.0/opencode-darwin-x64.zip", "cmd": "./opencode", "args": [ "acp" ], - "sha256": "7f35265b6900ce75b01e03cab2497622026b402c021ecf6e6e68755874245a6b" + "sha256": "cc191a1cec9b9cd0192d78dc066bbf48730639131422fa54c87c485a821ba1d5" }, "linux-aarch64": { - "archive": "https://opencode.ai/files/bin/2.1.4/opencode-linux-arm64.tar.gz", + "archive": "https://opencode.ai/files/bin/2.2.0/opencode-linux-arm64.tar.gz", "cmd": "./opencode", "args": [ "acp" ], - "sha256": "759c9d6e7b246b81bcc93dfc6cc3bb2a38287c75b6202e305eacacb5dd882315" + "sha256": "1f1ce0fc07b9245a815ffa9d652dbb80e6b0f07e5bf74ea87d2b1c0339fbac52" }, "linux-x86_64": { - "archive": "https://opencode.ai/files/bin/2.1.4/opencode-linux-x64.tar.gz", + "archive": "https://opencode.ai/files/bin/2.2.0/opencode-linux-x64.tar.gz", "cmd": "./opencode", "args": [ "acp" ], - "sha256": "2edaf8cf96e81dec5ee996a3196b03345cf59e5a1673d83a4599bb4afc5c5f6d" + "sha256": "6d597970a8cc448f1b9a9f645532584b339dd3ab9583bb5f063f13d83e54768f" }, "windows-aarch64": { - "archive": "https://opencode.ai/files/bin/2.1.4/opencode-windows-arm64.zip", + "archive": "https://opencode.ai/files/bin/2.2.0/opencode-windows-arm64.zip", "cmd": "./opencode.exe", "args": [ "acp" ], - "sha256": "2bf735889e52a817512d57dfe23a03d3861de0da2f2ef398ef9e91d8a4e81a20" + "sha256": "bceb8b16e4889b7766793e1e7b51e3ab97ad41e09367a5bf192c15c0334b848a" }, "windows-x86_64": { - "archive": "https://opencode.ai/files/bin/2.1.4/opencode-windows-x64.zip", + "archive": "https://opencode.ai/files/bin/2.2.0/opencode-windows-x64.zip", "cmd": "./opencode.exe", "args": [ "acp" ], - "sha256": "6d3ee895c0f6e089bb1f1ee3addfa3d700cc4488a7da97f182cb700d3985a799" + "sha256": "a56307bdccdafd3fc5255556f3bf867703ea56dbeffaf00add4e9663edb3b974" } } } @@ -1449,7 +1449,7 @@ { "id": "qwen-code", "name": "Qwen Code", - "version": "0.26.1", + "version": "0.26.3", "description": "Alibaba's Qwen coding assistant", "repository": "https://github.com/QwenLM/qwen-code", "website": "https://qwenlm.github.io/qwen-code-docs/en/users/overview", @@ -1460,7 +1460,7 @@ "license_url": "https://github.com/QwenLM/qwen-code/blob/main/LICENSE", "distribution": { "npx": { - "package": "@qwen-code/qwen-code@0.26.1", + "package": "@qwen-code/qwen-code@0.26.3", "args": [ "--acp", "--experimental-skills" @@ -1472,7 +1472,7 @@ { "id": "sigit", "name": "siGit Code", - "version": "1.7.5", + "version": "1.7.6", "description": "Local-first coding agent. Runs entirely on your machine with optional on-device LLM inference via Onde.", "repository": "https://github.com/getsigit/sigit", "website": "https://github.com/getsigit/sigit", @@ -1484,38 +1484,38 @@ "distribution": { "binary": { "darwin-aarch64": { - "archive": "https://github.com/getsigit/sigit/releases/download/v1.7.5/sigit-macos-arm64.tar.gz", + "archive": "https://github.com/getsigit/sigit/releases/download/v1.7.6/sigit-macos-arm64.tar.gz", "cmd": "./sigit", - "sha256": "e03532f87a92e8e6ea520431a08925ee686168a736ded4a9d986634f2ea4cd8b" + "sha256": "e6c62d6b6eb8fd2df9b5db897aef4aa1ea0f27baf0825aaadd900c968c5212c0" }, "darwin-x86_64": { - "archive": "https://github.com/getsigit/sigit/releases/download/v1.7.5/sigit-macos-amd64.tar.gz", + "archive": "https://github.com/getsigit/sigit/releases/download/v1.7.6/sigit-macos-amd64.tar.gz", "cmd": "./sigit", - "sha256": "5a215b6731a8ce7c2f99a0f790d0d8d9d6643ac7d6d2f7fb700fca6ed9e39d98" + "sha256": "7b3879d57bd41dc465741acfef7e160651202a8052a1daa297f3f20ea9ce6d7d" }, "linux-aarch64": { - "archive": "https://github.com/getsigit/sigit/releases/download/v1.7.5/sigit-linux-arm64", + "archive": "https://github.com/getsigit/sigit/releases/download/v1.7.6/sigit-linux-arm64", "cmd": "./sigit-linux-arm64", - "sha256": "019065bfd16ee1d936bee4af4fd7eaeeae390c62293979a3893aac217b0ccd32" + "sha256": "96eaabc6f97fdb52b7dc76d46dbf0e92085d61ee7e13d65e6bfb7763c56a1e0e" }, "linux-x86_64": { - "archive": "https://github.com/getsigit/sigit/releases/download/v1.7.5/sigit-linux-amd64", + "archive": "https://github.com/getsigit/sigit/releases/download/v1.7.6/sigit-linux-amd64", "cmd": "./sigit-linux-amd64", - "sha256": "152c0218b6d25e17cda758fd1dbffb37b3c3a2edd1ef6471978e99e0c510bae3" + "sha256": "b3310352b58a5ac9bc3c94d502552d3bc28cb416d1d789a299a0dd61d8026c06" }, "windows-aarch64": { - "archive": "https://github.com/getsigit/sigit/releases/download/v1.7.5/sigit-win-arm64.exe", + "archive": "https://github.com/getsigit/sigit/releases/download/v1.7.6/sigit-win-arm64.exe", "cmd": "./sigit-win-arm64.exe", - "sha256": "619c18771846d7812e322aa8634b62cfde8bc6a99f02b71ade3448bd4c8cd0af" + "sha256": "e38188629df6c224b94fa02b0e95921e83f2ad4a0b7787d1a2a8cc84cffcaca3" }, "windows-x86_64": { - "archive": "https://github.com/getsigit/sigit/releases/download/v1.7.5/sigit-win-amd64.exe", + "archive": "https://github.com/getsigit/sigit/releases/download/v1.7.6/sigit-win-amd64.exe", "cmd": "./sigit-win-amd64.exe", - "sha256": "27261d4f68c6193004bfa13be1a88cbdc0bac7812e11887956d6e0cdac51e419" + "sha256": "f1947bbd88ca3c64121c35b6615929943fdf7d491ef74239e7dbb7452bcb4bcf" } }, "npx": { - "package": "@smbcloud/sigit@1.7.5" + "package": "@smbcloud/sigit@1.7.6" } }, "icon": "https://cdn.agentclientprotocol.com/registry/v1/latest/sigit.svg" diff --git a/resources/model-db/providers.json b/resources/model-db/providers.json index c6d3525039..20c88e1817 100644 --- a/resources/model-db/providers.json +++ b/resources/model-db/providers.json @@ -1,27 +1,28 @@ { "providers": { - "minimax-coding-plan": { - "id": "minimax-coding-plan", - "name": "MiniMax Token Plan (minimax.io)", - "display_name": "MiniMax Token Plan (minimax.io)", - "api": "https://api.minimax.io/anthropic/v1", - "doc": "https://platform.minimax.io/docs/token-plan/intro", + "umans-ai": { + "id": "umans-ai", + "name": "Umans AI", + "display_name": "Umans AI", + "api": "https://api.code.umans.ai/v1", + "doc": "https://app.umans.ai/offers/code/docs/orgs", "models": [ { - "id": "MiniMax-M2.7-highspeed", - "name": "MiniMax-M2.7-highspeed", - "display_name": "MiniMax-M2.7-highspeed", + "id": "umans-deepseek-v4.1-flash", + "name": "DeepSeek V4.1 Flash", + "display_name": "DeepSeek V4.1 Flash", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 1048576, + "output": 393215 }, "temperature": true, "tool_call": true, @@ -37,30 +38,38 @@ "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "effort_options": [ + "low", + "high", + "max" ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-03-18", - "last_updated": "2026-03-18", + "knowledge": "2025-05", + "release_date": "2026-10-17", + "last_updated": "2026-10-17", "type": "chat" }, { - "id": "MiniMax-M2.1", - "name": "MiniMax-M2.1", - "display_name": "MiniMax-M2.1", + "id": "umans-glm-5.3-flash", + "name": "GLM 5.3 Flash", + "display_name": "GLM 5.3 Flash", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 1048576, + "output": 131071 }, "temperature": true, "tool_call": true, @@ -70,32 +79,45 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "low", + "high", + "max" + ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2025-12-23", - "last_updated": "2025-12-23", + "release_date": "2026-08-26", + "last_updated": "2026-08-26", "type": "chat" }, { - "id": "MiniMax-M2.7", - "name": "MiniMax-M2.7", - "display_name": "MiniMax-M2.7", + "id": "umans-coder", + "name": "Umans Coder", + "display_name": "Umans Coder", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 1048576, + "output": 131071 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -109,62 +131,38 @@ "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "effort_options": [ + "low", + "high", + "max" ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-03-18", - "last_updated": "2026-03-18", - "type": "chat" - }, - { - "id": "MiniMax-M2", - "name": "MiniMax-M2", - "display_name": "MiniMax-M2", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 204800, - "output": 131072 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2025-10-27", - "last_updated": "2025-10-27", + "release_date": "2026-08-26", + "last_updated": "2026-08-26", "type": "chat" }, { - "id": "MiniMax-M3.1-Flash", - "name": "MiniMax-M3.1-Flash", - "display_name": "MiniMax-M3.1-Flash", + "id": "umans-flash", + "name": "Umans Flash", + "display_name": "Umans Flash", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 524288 + "context": 262144, + "output": 32768 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -172,40 +170,44 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ "low", "medium", - "high", - "xhigh", - "max" + "high" ] } }, "attachment": true, - "open_weights": false, - "release_date": "2026-10-19", - "last_updated": "2026-10-19", + "open_weights": true, + "release_date": "2026-04-17", + "last_updated": "2026-04-17", "type": "chat" }, { - "id": "MiniMax-M3", - "name": "MiniMax-M3", - "display_name": "MiniMax-M3", + "id": "umans-kimi-k3", + "name": "Kimi K3", + "display_name": "Kimi K3", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 524288 + "context": 1048576, + "output": 131072 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -213,19 +215,30 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "low", + "high", + "max" + ] } }, "attachment": true, "open_weights": true, - "release_date": "2026-06-01", - "last_updated": "2026-06-25", + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" }, { - "id": "MiniMax-M2.5", - "name": "MiniMax-M2.5", - "display_name": "MiniMax-M2.5", + "id": "umans-deepseek-v4-flash-0731", + "name": "DeepSeek V4 Flash", + "display_name": "DeepSeek V4 Flash", "modalities": { "input": [ "text" @@ -235,8 +248,8 @@ ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 1048576, + "output": 393215 }, "temperature": true, "tool_call": true, @@ -246,19 +259,31 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "low", + "high", + "max" + ] } }, "attachment": false, "open_weights": true, - "release_date": "2026-02-12", - "last_updated": "2026-02-12", + "knowledge": "2025-05", + "release_date": "2026-07-31", + "last_updated": "2026-07-31", "type": "chat" }, { - "id": "MiniMax-M2.5-highspeed", - "name": "MiniMax-M2.5-highspeed", - "display_name": "MiniMax-M2.5-highspeed", + "id": "umans-glm-5.3", + "name": "GLM 5.3", + "display_name": "GLM 5.3", "modalities": { "input": [ "text" @@ -268,8 +293,8 @@ ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 1048576, + "output": 131071 }, "temperature": true, "tool_call": true, @@ -279,32 +304,42 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "low", + "high", + "max" + ] } }, "attachment": false, "open_weights": true, - "release_date": "2026-02-13", - "last_updated": "2026-02-13", + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "MiniMax-M3.1-Flash-Preview", - "name": "MiniMax-M3.1-Flash-Preview", - "display_name": "MiniMax-M3.1-Flash-Preview", + "id": "umans-deepseek-v4.1-flash-1017", + "name": "DeepSeek V4.1 Flash 1017", + "display_name": "DeepSeek V4.1 Flash 1017", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 512000 + "context": 1048576, + "output": 393215 }, "temperature": true, "tool_call": true, @@ -314,199 +349,174 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ "low", - "medium", "high", - "xhigh", "max" ] } }, "attachment": true, - "open_weights": false, - "release_date": "2026-09-27", - "last_updated": "2026-09-27", + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-10-17", + "last_updated": "2026-10-17", "type": "chat" } ] }, - "poe": { - "id": "poe", - "name": "Poe", - "display_name": "Poe", - "api": "https://api.poe.com/v1", - "doc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "groq": { + "id": "groq", + "name": "Groq", + "display_name": "Groq", + "doc": "https://console.groq.com/docs/models", "models": [ { - "id": "xai/grok-3-mini", - "name": "Grok 3 Mini", - "display_name": "Grok 3 Mini", + "id": "whisper-large-v3", + "name": "Whisper", + "display_name": "Whisper", "modalities": { "input": [ - "text" + "audio" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 448, + "output": 448 }, - "temperature": false, - "tool_call": true, + "temperature": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high" - ] - } + "supported": false }, - "attachment": false, - "open_weights": false, - "release_date": "2025-04-11", - "last_updated": "2025-04-11", - "type": "chat" + "attachment": true, + "open_weights": true, + "release_date": "2023-11-06", + "last_updated": "2023-11-06" }, { - "id": "xai/grok-4.20-multi-agent", - "name": "Grok-4.20-Multi-Agent", - "display_name": "Grok-4.20-Multi-Agent", + "id": "allam-2-7b", + "name": "ALLaM-2-7b", + "display_name": "ALLaM-2-7b", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 4096, + "output": 4096 }, - "temperature": false, - "tool_call": true, + "temperature": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "medium", - "high" - ] - } + "supported": false }, - "attachment": true, - "open_weights": false, - "release_date": "2026-03-13", - "last_updated": "2026-03-13", + "attachment": false, + "open_weights": true, + "release_date": "2025-01-23", + "last_updated": "2025-01-23", "type": "chat" }, { - "id": "xai/grok-4-fast-reasoning", - "name": "Grok-4-Fast-Reasoning", - "display_name": "Grok-4-Fast-Reasoning", + "id": "whisper-large-v3-turbo", + "name": "Whisper Large V3 Turbo", + "display_name": "Whisper Large V3 Turbo", "modalities": { "input": [ - "text", - "image" + "audio" ], "output": [ "text" ] }, "limit": { - "context": 2000000, - "output": 128000 + "context": 448, + "output": 448 }, - "temperature": false, - "tool_call": true, + "temperature": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": true, - "open_weights": false, - "release_date": "2025-12-18", - "last_updated": "2025-12-18", - "type": "chat" + "open_weights": true, + "release_date": "2024-10-01", + "last_updated": "2024-10-01" }, { - "id": "xai/grok-4.1-fast-non-reasoning", - "name": "Grok-4.1-Fast-Non-Reasoning", - "display_name": "Grok-4.1-Fast-Non-Reasoning", + "id": "llama-3.1-8b-instant", + "name": "Llama 3.1 8B", + "display_name": "Llama 3.1 8B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 2000000, - "output": 30000 + "context": 131072, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": true, - "open_weights": false, - "release_date": "2025-11-19", - "last_updated": "2025-11-19", + "attachment": false, + "open_weights": true, + "knowledge": "2023-12", + "release_date": "2024-07-23", + "last_updated": "2024-07-23", "type": "chat" }, { - "id": "xai/grok-4", - "name": "Grok-4", - "display_name": "Grok-4", + "id": "llama-3.3-70b-versatile", + "name": "Llama 3.3 70B", + "display_name": "Llama 3.3 70B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 128000 + "context": 131072, + "output": 32768 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, - "attachment": true, - "open_weights": false, - "release_date": "2025-07-10", - "last_updated": "2025-07-10", + "attachment": false, + "open_weights": true, + "knowledge": "2023-12", + "release_date": "2024-12-06", + "last_updated": "2024-12-06", "type": "chat" }, { - "id": "xai/grok-code-fast-1", - "name": "Grok Code Fast 1", - "display_name": "Grok Code Fast 1", + "id": "meta-llama/llama-prompt-guard-2-86m", + "name": "Prompt Guard 2 86M", + "display_name": "Prompt Guard 2 86M", "modalities": { "input": [ "text" @@ -516,58 +526,51 @@ ] }, "limit": { - "context": 256000, - "output": 128000 + "context": 512, + "output": 512 }, "temperature": false, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2025-09-02", - "last_updated": "2025-09-02", + "open_weights": true, + "release_date": "2025-04-29", + "last_updated": "2025-04-29", "type": "chat" }, { - "id": "xai/grok-4-fast-non-reasoning", - "name": "Grok-4-Fast-Non-Reasoning", - "display_name": "Grok-4-Fast-Non-Reasoning", + "id": "meta-llama/llama-prompt-guard-2-22m", + "name": "Llama Prompt Guard 2 22M", + "display_name": "Llama Prompt Guard 2 22M", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 2000000, - "output": 128000 + "context": 512, + "output": 512 }, "temperature": false, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, - "attachment": true, - "open_weights": false, - "release_date": "2025-12-18", - "last_updated": "2025-12-18", + "attachment": false, + "open_weights": true, + "release_date": "2025-04-29", + "last_updated": "2025-04-29", "type": "chat" }, { - "id": "xai/grok-3", - "name": "Grok 3", - "display_name": "Grok 3", + "id": "openai/gpt-oss-20b", + "name": "GPT OSS 20B", + "display_name": "GPT OSS 20B", "modalities": { "input": [ "text" @@ -578,175 +581,220 @@ }, "limit": { "context": 131072, - "output": 8192 + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "low", + "medium", + "high" + ] + } }, "attachment": false, - "open_weights": false, - "release_date": "2025-04-11", - "last_updated": "2025-04-11", + "open_weights": true, + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "xai/grok-4.1-fast-reasoning", - "name": "Grok-4.1-Fast-Reasoning", - "display_name": "Grok-4.1-Fast-Reasoning", + "id": "openai/gpt-oss-safeguard-20b", + "name": "Safety GPT OSS 20B", + "display_name": "Safety GPT OSS 20B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 2000000, - "output": 30000 + "context": 131072, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": true, - "open_weights": false, - "release_date": "2025-11-19", - "last_updated": "2025-11-19", + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "high" + ] + } + }, + "attachment": false, + "open_weights": true, + "release_date": "2025-10-29", + "last_updated": "2025-10-29", "type": "chat" }, { - "id": "runwayml/runway", - "name": "Runway", - "display_name": "Runway", + "id": "openai/gpt-oss-120b", + "name": "GPT OSS 120B", + "display_name": "GPT OSS 120B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ - "video" + "text" ] }, "limit": { - "context": 256, - "output": 8192 + "context": 131072, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, - "open_weights": false, - "release_date": "2024-10-11", - "last_updated": "2024-10-11" + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "low", + "medium", + "high" + ] + } + }, + "attachment": false, + "open_weights": true, + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", + "type": "chat" }, { - "id": "runwayml/runway-gen-4-turbo", - "name": "Runway-Gen-4-Turbo", - "display_name": "Runway-Gen-4-Turbo", + "id": "canopylabs/orpheus-arabic-saudi", + "name": "Canopy Labs Orpheus Arabic Saudi", + "display_name": "Canopy Labs Orpheus Arabic Saudi", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ - "video" + "audio" ] }, "limit": { - "context": 256, - "output": 8192 + "context": 4000, + "output": 50000 }, "temperature": false, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2025-05-09", - "last_updated": "2025-05-09" + "release_date": "2025-12-16", + "last_updated": "2025-12-16" }, { - "id": "cerebras/llama-3.1-8b-cs", - "name": "Llama-3.1-8B-CS", - "display_name": "Llama-3.1-8B-CS", + "id": "canopylabs/orpheus-v1-english", + "name": "Canopy Labs Orpheus V1 English", + "display_name": "Canopy Labs Orpheus V1 English", "modalities": { "input": [ "text" ], "output": [ - "text" + "audio" ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 4000, + "output": 50000 }, "temperature": false, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, "attachment": false, - "open_weights": true, - "knowledge": "2023-12", - "release_date": "2024-07-23", - "last_updated": "2024-07-23", - "type": "chat" + "open_weights": false, + "release_date": "2025-12-19", + "last_updated": "2025-12-19" }, { - "id": "cerebras/llama-3.3-70b-cs", - "name": "llama-3.3-70b-cs", - "display_name": "llama-3.3-70b-cs", + "id": "qwen/qwen3.6-27b", + "name": "Qwen3.6 27B", + "display_name": "Qwen3.6 27B", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 131072, + "output": 16384 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "none" + ] + } + }, + "attachment": true, "open_weights": true, - "knowledge": "2023-12", - "release_date": "2024-12-06", - "last_updated": "2024-12-06", + "release_date": "2026-04-22", + "last_updated": "2026-04-22", "type": "chat" }, { - "id": "cerebras/gpt-oss-120b-cs", - "name": "GPT-OSS-120B-CS", - "display_name": "GPT-OSS-120B-CS", + "id": "qwen/qwen3.8-27b", + "name": "Qwen3.8 27B", + "display_name": "Qwen3.8 27B", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 131072, + "output": 16384 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -755,23 +803,32 @@ "extra_capabilities": { "reasoning": { "effort_options": [ + "none", "low", "medium", "high" ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" - }, + } + ] + }, + "kuae-cloud-coding-plan": { + "id": "kuae-cloud-coding-plan", + "name": "KUAE Cloud Coding Plan", + "display_name": "KUAE Cloud Coding Plan", + "api": "https://coding-plan-endpoint.kuaecloud.net/v1", + "doc": "https://docs.mthreads.com/kuaecloud/kuaecloud-doc-online/coding_plan/", + "models": [ { - "id": "cerebras/qwen3-235b-2507-cs", - "name": "qwen3-235b-2507-cs", - "display_name": "qwen3-235b-2507-cs", + "id": "GLM-4.7", + "name": "GLM-4.7", + "display_name": "GLM-4.7", "modalities": { "input": [ "text" @@ -781,25 +838,45 @@ ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 204800, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, "attachment": false, "open_weights": true, - "release_date": "2025-07-21", - "last_updated": "2025-07-21", + "knowledge": "2025-04", + "release_date": "2025-12-22", + "last_updated": "2025-12-22", "type": "chat" - }, + } + ] + }, + "qvac": { + "id": "qvac", + "name": "QVAC", + "display_name": "QVAC", + "doc": "https://www.npmjs.com/package/@qvac/ai-sdk-provider", + "models": [ { - "id": "cerebras/qwen3-32b-cs", - "name": "qwen3-32b-cs", - "display_name": "qwen3-32b-cs", + "id": "gpt-oss-20b", + "name": "GPT OSS 20B", + "display_name": "GPT OSS 20B", "modalities": { "input": [ "text" @@ -809,105 +886,102 @@ ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 131072, + "output": 32768 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, "attachment": false, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-04-28", - "last_updated": "2025-04-28", + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "elevenlabs/elevenlabs-v3", - "name": "ElevenLabs-v3", - "display_name": "ElevenLabs-v3", + "id": "gemma4-31b", + "name": "Gemma 4 31B IT", + "display_name": "Gemma 4 31B IT", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ - "audio" - ] - }, - "limit": { - "context": 128000, - "output": 8192 - }, - "temperature": false, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": false, - "release_date": "2025-08-20", - "last_updated": "2025-08-20" - }, - { - "id": "elevenlabs/elevenlabs-v2.5-turbo", - "name": "ElevenLabs-v2.5-Turbo", - "display_name": "ElevenLabs-v2.5-Turbo", - "modalities": { - "input": [ "text" - ], - "output": [ - "audio" ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 262144, + "output": 32768 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": false, - "release_date": "2024-07-19", - "last_updated": "2024-07-19" + "attachment": true, + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-04-02", + "last_updated": "2026-04-02", + "type": "chat" }, { - "id": "elevenlabs/elevenlabs-music", - "name": "ElevenLabs-Music", - "display_name": "ElevenLabs-Music", + "id": "qwen3.6-27b", + "name": "Qwen3.6 27B", + "display_name": "Qwen3.6 27B", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ - "audio" + "text" ] }, "limit": { - "context": 2000, - "output": 8192 + "context": 262144, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": false, - "release_date": "2025-08-29", - "last_updated": "2025-08-29", + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": true, + "open_weights": true, + "release_date": "2026-04-22", + "last_updated": "2026-04-22", "type": "chat" }, { - "id": "trytako/tako", - "name": "Tako", - "display_name": "Tako", + "id": "qwen3.5-2b", + "name": "Qwen3.5 2B", + "display_name": "Qwen3.5 2B", "modalities": { "input": [ "text" @@ -917,92 +991,122 @@ ] }, "limit": { - "context": 2048, + "context": 32768, "output": 8192 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, - "open_weights": false, - "release_date": "2024-08-15", - "last_updated": "2024-08-15", + "open_weights": true, + "release_date": "2026-03-02", + "last_updated": "2026-03-02", "type": "chat" }, { - "id": "google/imagen-3-fast", - "name": "Imagen-3-Fast", - "display_name": "Imagen-3-Fast", + "id": "qwen3.5-9b", + "name": "Qwen3.5 9B", + "display_name": "Qwen3.5 9B", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ - "image" + "text" ] }, "limit": { - "context": 480, + "context": 32768, "output": 8192 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": false, - "release_date": "2024-10-17", - "last_updated": "2024-10-17" + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "none", + "max" + ] + } + }, + "attachment": true, + "open_weights": true, + "release_date": "2026-02-23", + "last_updated": "2026-02-23", + "type": "chat" }, { - "id": "google/imagen-3", - "name": "Imagen-3", - "display_name": "Imagen-3", + "id": "qwen3.5-0.8b", + "name": "Qwen3.5 0.8B", + "display_name": "Qwen3.5 0.8B", "modalities": { "input": [ "text" ], "output": [ - "image" + "text" ] }, "limit": { - "context": 480, + "context": 32768, "output": 8192 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2024-10-15", - "last_updated": "2024-10-15" + "open_weights": true, + "release_date": "2026-03-02", + "last_updated": "2026-03-02", + "type": "chat" }, { - "id": "google/gemini-2.5-pro", - "name": "Gemini-2.5-Pro", - "display_name": "Gemini-2.5-Pro", + "id": "qwen3.6-35b-a3b", + "name": "Qwen3.6 35B-A3B", + "display_name": "Qwen3.6 35B-A3B", "modalities": { "input": [ "text", "image", - "video", - "audio" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1065535, - "output": 65535 + "context": 262144, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -1011,46 +1115,35 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "budget", - "budget": { - "default": -1, - "min": 128, - "max": 32768, - "auto": -1, - "unit": "tokens" - }, + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-06-17", - "last_updated": "2025-06-17", + "open_weights": true, + "release_date": "2026-04-17", + "last_updated": "2026-04-17", "type": "chat" }, { - "id": "google/gemini-3.5-flash", - "name": "Gemini-3.5-Flash", - "display_name": "Gemini-3.5-Flash", + "id": "gpt-oss-120b", + "name": "GPT OSS 120B", + "display_name": "GPT OSS 120B", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 131072, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -1060,66 +1153,71 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", - "low", - "medium", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] + "supported": true } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-05-19", - "last_updated": "2026-05-19", + "attachment": false, + "open_weights": true, + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "google/lyria", - "name": "Lyria", - "display_name": "Lyria", + "id": "qwen3.5-4b", + "name": "Qwen3.5 4B", + "display_name": "Qwen3.5 4B", "modalities": { "input": [ "text" ], "output": [ - "audio" + "text" ] }, "limit": { - "context": 8192, + "context": 32768, "output": 8192 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, - "open_weights": false, - "release_date": "2025-06-04", - "last_updated": "2025-06-04", + "open_weights": true, + "release_date": "2026-03-02", + "last_updated": "2026-03-02", "type": "chat" - }, + } + ] + }, + "baseten": { + "id": "baseten", + "name": "Baseten", + "display_name": "Baseten", + "api": "https://inference.baseten.co/v1", + "doc": "https://docs.baseten.co/inference/model-apis/overview", + "models": [ { - "id": "google/gemini-deep-research", - "name": "gemini-deep-research", - "display_name": "gemini-deep-research", + "id": "moonshotai/Kimi-K3", + "name": "Kimi K3", + "display_name": "Kimi K3", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" @@ -1127,82 +1225,138 @@ }, "limit": { "context": 1048576, - "output": 8192 + "output": 262144 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "none", + "low", + "high", + "max" + ] + } + }, "attachment": true, - "open_weights": false, - "release_date": "2025-12-11", - "last_updated": "2025-12-11", + "open_weights": true, + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" }, { - "id": "google/veo-3", - "name": "Veo-3", - "display_name": "Veo-3", + "id": "openai/gpt-oss-120b", + "name": "OpenAI GPT 120B", + "display_name": "OpenAI GPT 120B", "modalities": { "input": [ "text" ], "output": [ - "video" + "text" ] }, "limit": { - "context": 480, - "output": 8192 + "context": 128072, + "output": 128072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "none", + "minimal", + "low", + "medium", + "high", + "xhigh", + "max" + ] + } }, "attachment": false, - "open_weights": false, - "release_date": "2025-05-21", - "last_updated": "2025-05-21" + "open_weights": true, + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", + "type": "chat" }, { - "id": "google/imagen-4-ultra", - "name": "Imagen-4-Ultra", - "display_name": "Imagen-4-Ultra", + "id": "nvidia/NVIDIA-Nemotron-3-Ultra-550B-A55B", + "name": "Nemotron Ultra", + "display_name": "Nemotron Ultra", "modalities": { "input": [ "text" ], "output": [ - "image" + "text" ] }, "limit": { - "context": 480, - "output": 8192 + "context": 202800, + "output": 202800 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "none", + "high" + ] + } }, "attachment": false, - "open_weights": false, - "release_date": "2025-05-24", - "last_updated": "2025-05-24" + "open_weights": true, + "knowledge": "2025-09", + "release_date": "2026-06-04", + "last_updated": "2026-06-04", + "type": "chat" }, { - "id": "google/gemini-3.5-flash-lite", - "name": "Gemini-3.5-Flash-Lite", - "display_name": "Gemini-3.5-Flash-Lite", + "id": "zai-org/GLM-5.2", + "name": "GLM 5.2", + "display_name": "GLM 5.2", "modalities": { "input": [ "text", - "image", - "video", - "audio" + "image" ], "output": [ "text" @@ -1210,7 +1364,7 @@ }, "limit": { "context": 1048576, - "output": 65536 + "output": 262144 }, "temperature": true, "tool_call": true, @@ -1221,72 +1375,89 @@ "extra_capabilities": { "reasoning": { "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ - "minimal", + "none", "low", - "medium", - "high" + "high", + "max" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-07-21", - "last_updated": "2026-07-21", + "open_weights": true, + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "google/gemini-2.0-flash-lite", - "name": "Gemini-2.0-Flash-Lite", - "display_name": "Gemini-2.0-Flash-Lite", + "id": "zai-org/GLM-5.3-Flash", + "name": "GLM 5.3 Flash", + "display_name": "GLM 5.3 Flash", "modalities": { "input": [ "text", - "image", - "video", - "audio" + "image" ], "output": [ "text" ] }, "limit": { - "context": 990000, - "output": 8192 + "context": 1048576, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "low", + "high", + "max" + ] + } }, "attachment": true, - "open_weights": false, - "knowledge": "2024-06", - "release_date": "2024-12-11", - "last_updated": "2024-12-11", + "open_weights": true, + "release_date": "2026-08-26", + "last_updated": "2026-08-26", "type": "chat" }, { - "id": "google/gemini-2.5-flash", - "name": "Gemini-2.5-Flash", - "display_name": "Gemini-2.5-Flash", + "id": "zai-org/GLM-5.2-Fast", + "name": "GLM 5.2 Fast", + "display_name": "GLM 5.2 Fast", "modalities": { "input": [ "text", - "image", - "video", - "audio" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1065535, - "output": 65535 + "context": 1048576, + "output": 262144 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -1295,40 +1466,34 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "budget", - "budget": { - "default": -1, - "min": 0, - "max": 24576, - "auto": -1, - "off": 0, - "unit": "tokens" - }, + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" + ], + "effort_options": [ + "none", + "low", + "high", + "max" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-06-17", - "last_updated": "2025-06-17", + "open_weights": true, + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "google/gemini-3.8-flash", - "name": "Gemini-3.8-Flash", - "display_name": "Gemini-3.8-Flash", + "id": "zai-org/GLM-5.3", + "name": "GLM 5.3", + "display_name": "GLM 5.3", "modalities": { "input": [ "text", - "image", - "video", - "audio" + "image" ], "output": [ "text" @@ -1336,7 +1501,7 @@ }, "limit": { "context": 1048576, - "output": 65536 + "output": 262144 }, "temperature": true, "tool_call": true, @@ -1347,87 +1512,29 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", - "low", - "medium", - "high" - ], + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" + ], + "effort_options": [ + "low", + "high", + "max" ] } }, "attachment": true, - "open_weights": false, - "release_date": "2026-09-02", - "last_updated": "2026-09-02", + "open_weights": true, + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "google/veo-2", - "name": "Veo-2", - "display_name": "Veo-2", - "modalities": { - "input": [ - "text" - ], - "output": [ - "video" - ] - }, - "limit": { - "context": 480, - "output": 8192 - }, - "temperature": false, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": false, - "release_date": "2024-12-02", - "last_updated": "2024-12-02" - }, - { - "id": "google/gemini-omni-1.1-flash", - "name": "Gemini-Omni-1.1-Flash", - "display_name": "Gemini-Omni-1.1-Flash", - "modalities": { - "input": [ - "text", - "image", - "video" - ], - "output": [ - "video" - ] - }, - "limit": { - "context": 131072, - "output": 57920 - }, - "temperature": false, - "tool_call": false, - "reasoning": { - "supported": true, - "default": true - }, - "attachment": true, - "open_weights": false, - "release_date": "2026-08-27", - "last_updated": "2026-08-27" - }, - { - "id": "google/gemma-4-31b", - "name": "Gemma-4-31B", - "display_name": "Gemma-4-31B", + "id": "zai-org/GLM-5.3-Fast", + "name": "GLM 5.3 Fast", + "display_name": "GLM 5.3 Fast", "modalities": { "input": [ "text", @@ -1438,138 +1545,132 @@ ] }, "limit": { - "context": 262144, - "output": 8192 + "context": 1048576, + "output": 262144 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "high", + "max" + ] + } }, "attachment": true, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "google/veo-3-fast", - "name": "Veo-3-Fast", - "display_name": "Veo-3-Fast", + "id": "deepseek-ai/DeepSeek-V4-Flash-0731", + "name": "DeepSeek V4 Flash 0731", + "display_name": "DeepSeek V4 Flash 0731", "modalities": { "input": [ "text" ], "output": [ - "video" - ] - }, - "limit": { - "context": 480, - "output": 8192 - }, - "temperature": false, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": false, - "release_date": "2025-10-13", - "last_updated": "2025-10-13" - }, - { - "id": "google/imagen-4-fast", - "name": "Imagen-4-Fast", - "display_name": "Imagen-4-Fast", - "modalities": { - "input": [ "text" - ], - "output": [ - "image" ] }, "limit": { - "context": 480, - "output": 8192 + "context": 1048576, + "output": 384000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": false, - "release_date": "2025-06-25", - "last_updated": "2025-06-25" - }, - { - "id": "google/veo-3.1", - "name": "Veo-3.1", - "display_name": "Veo-3.1", - "modalities": { - "input": [ - "text" - ], - "output": [ - "video" - ] - }, - "limit": { - "context": 480, - "output": 8192 + "supported": true, + "default": true }, - "temperature": false, - "tool_call": true, - "reasoning": { - "supported": false + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "none", + "low", + "high", + "max" + ] + } }, "attachment": false, - "open_weights": false, - "release_date": "2025-10-15", - "last_updated": "2025-10-15" + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-07-31", + "last_updated": "2026-07-31", + "type": "chat" }, { - "id": "google/nano-banana", - "name": "Nano-Banana", - "display_name": "Nano-Banana", + "id": "deepseek-ai/DeepSeek-V4.1-Flash-1017-Fast", + "name": "DeepSeek V4.1 Flash 1017 Fast", + "display_name": "DeepSeek V4.1 Flash 1017 Fast", "modalities": { "input": [ "text", "image" ], "output": [ - "text", - "image" + "text" ] }, "limit": { - "context": 65536, - "output": 8192 + "context": 1048576, + "output": 262144 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "none", + "low", + "medium", + "high", + "max" + ] + } }, "attachment": true, - "open_weights": false, - "knowledge": "2024-06", - "release_date": "2025-08-26", - "last_updated": "2025-08-26" + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-10-17", + "last_updated": "2026-10-17", + "type": "chat" }, { - "id": "google/gemini-3.7-flash", - "name": "Gemini-3.7-Flash", - "display_name": "Gemini-3.7-Flash", + "id": "deepseek-ai/DeepSeek-V4.1-Flash-1017", + "name": "DeepSeek V4.1 Flash 1017", + "display_name": "DeepSeek V4.1 Flash 1017", "modalities": { "input": [ "text", - "image", - "video", - "audio" + "image" ], "output": [ "text" @@ -1577,7 +1678,7 @@ }, "limit": { "context": 1048576, - "output": 65536 + "output": 262144 }, "temperature": true, "tool_call": true, @@ -1588,90 +1689,81 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", - "low", - "medium", - "high" - ], + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" + ], + "effort_options": [ + "none", + "low", + "medium", + "high", + "max" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-08-13", - "last_updated": "2026-08-13", + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-10-17", + "last_updated": "2026-10-17", "type": "chat" }, { - "id": "google/gemini-2.5-flash-lite", - "name": "Gemini-2.5-Flash-Lite", - "display_name": "Gemini-2.5-Flash-Lite", + "id": "deepseek-ai/DeepSeek-V4-Pro-0813", + "name": "DeepSeek V4 Pro 0813", + "display_name": "DeepSeek V4 Pro 0813", "modalities": { "input": [ - "text", - "image", - "video", - "audio" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1024000, - "output": 64000 + "context": 1048576, + "output": 262144 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "default": -1, - "min": 512, - "max": 24576, - "auto": -1, - "unit": "tokens" - }, + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" + ], + "effort_options": [ + "none", + "low", + "high", + "max" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-06-17", - "last_updated": "2025-06-17", + "attachment": false, + "open_weights": true, + "release_date": "2026-08-13", + "last_updated": "2026-08-22", "type": "chat" }, { - "id": "google/gemini-3.1-pro", - "name": "Gemini-3.1-Pro", - "display_name": "Gemini-3.1-Pro", + "id": "deepseek-ai/DeepSeek-V4.1-Flash", + "name": "DeepSeek V4.1 Flash", + "display_name": "DeepSeek V4.1 Flash", "modalities": { "input": [ "text", - "image", - "video", - "audio" + "image" ], "output": [ "text" @@ -1679,7 +1771,7 @@ }, "limit": { "context": 1048576, - "output": 65536 + "output": 32768 }, "temperature": true, "tool_call": true, @@ -1690,37 +1782,34 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "low", - "high" - ], + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" + ], + "effort_options": [ + "none", + "high", + "max" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-02-19", - "last_updated": "2026-02-19", + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-09-10", + "last_updated": "2026-09-10", "type": "chat" }, { - "id": "google/gemini-3.6-flash", - "name": "Gemini-3.6-Flash", - "display_name": "Gemini-3.6-Flash", + "id": "deepseek-ai/DeepSeek-V4.1-Flash-Fast", + "name": "DeepSeek V4.1 Flash Fast", + "display_name": "DeepSeek V4.1 Flash Fast", "modalities": { "input": [ "text", - "image", - "video", - "audio" + "image" ], "output": [ "text" @@ -1728,9 +1817,9 @@ }, "limit": { "context": 1048576, - "output": 65536 + "output": 32768 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -1739,65 +1828,67 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", - "low", - "medium", - "high" - ], + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" + ], + "effort_options": [ + "none", + "high", + "max" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-07-21", - "last_updated": "2026-07-21", + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-09-10", + "last_updated": "2026-09-10", "type": "chat" - }, + } + ] + }, + "stepfun-ai": { + "id": "stepfun-ai", + "name": "StepFun (Global)", + "display_name": "StepFun (Global)", + "api": "https://api.stepfun.ai/v1", + "doc": "https://platform.stepfun.ai/docs/en/overview/concept", + "models": [ { - "id": "google/veo-3.1-fast", - "name": "Veo-3.1-Fast", - "display_name": "Veo-3.1-Fast", + "id": "step-tts-2", + "name": "Step TTS 2", + "display_name": "Step TTS 2", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ - "video" + "audio" ] }, "limit": { - "context": 480, + "context": 8192, "output": 8192 }, "temperature": false, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2025-10-15", - "last_updated": "2025-10-15" + "release_date": "2026-03-01", + "last_updated": "2026-07-02" }, { - "id": "google/gemini-3-flash", - "name": "Gemini-3-Flash", - "display_name": "Gemini-3-Flash", + "id": "stepaudio-2.5-asr", + "name": "StepAudio 2.5 ASR", + "display_name": "StepAudio 2.5 ASR", "modalities": { "input": [ - "text", - "image", - "video", "audio" ], "output": [ @@ -1805,59 +1896,34 @@ ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 8192, + "output": 8192 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", - "low", - "medium", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] - } + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-12-17", - "last_updated": "2025-12-17", - "type": "chat" + "release_date": "2026-04-24", + "last_updated": "2026-07-02" }, { - "id": "google/gemini-3.1-flash-lite", - "name": "Gemini-3.1-Flash-Lite", - "display_name": "Gemini-3.1-Flash-Lite", + "id": "step-3.5-flash-2603", + "name": "Step 3.5 Flash 2603", + "display_name": "Step 3.5 Flash 2603", "modalities": { "input": [ - "text", - "image", - "video", - "audio" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 256000, + "output": 256000 }, "temperature": true, "tool_call": true, @@ -1868,109 +1934,150 @@ "extra_capabilities": { "reasoning": { "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ - "minimal", "low", "high" ] } }, - "attachment": true, - "open_weights": false, + "attachment": false, + "open_weights": true, "knowledge": "2025-01", - "release_date": "2026-05-07", - "last_updated": "2026-05-07", + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "google/gemini-2.0-flash", - "name": "Gemini-2.0-Flash", - "display_name": "Gemini-2.0-Flash", + "id": "step-5-preview", + "name": "Step 5 Preview", + "display_name": "Step 5 Preview", "modalities": { "input": [ "text", "image", - "video", - "audio" + "video" ], "output": [ "text" ] }, "limit": { - "context": 990000, - "output": 8192 + "context": 1000000, + "output": 384000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": true, - "open_weights": false, - "knowledge": "2024-06", - "release_date": "2024-12-11", - "last_updated": "2024-12-11", + "open_weights": true, + "release_date": "2026-09-16", + "last_updated": "2026-09-20", "type": "chat" }, { - "id": "google/nano-banana-pro", - "name": "Nano-Banana-Pro", - "display_name": "Nano-Banana-Pro", + "id": "stepaudio-2.5-tts", + "name": "StepAudio 2.5 TTS", + "display_name": "StepAudio 2.5 TTS", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ - "image" + "audio" ] }, "limit": { - "context": 65536, + "context": 8192, "output": 8192 }, "temperature": false, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-11-20", - "last_updated": "2025-11-20" + "release_date": "2026-04-16", + "last_updated": "2026-07-02" }, { - "id": "google/imagen-4", - "name": "Imagen-4", - "display_name": "Imagen-4", + "id": "step-3.7-flash", + "name": "Step 3.7 Flash", + "display_name": "Step 3.7 Flash", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ - "image" + "text" ] }, "limit": { - "context": 480, - "output": 8192 + "context": 256000, + "output": 256000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": false, - "release_date": "2025-05-22", - "last_updated": "2025-05-22" + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "low", + "medium", + "high" + ] + } + }, + "attachment": true, + "open_weights": true, + "knowledge": "2026-03-01", + "release_date": "2026-05-29", + "last_updated": "2026-05-29", + "type": "chat" }, { - "id": "poetools/claude-code", - "name": "claude-code", - "display_name": "claude-code", + "id": "step-3.5-flash", + "name": "Step 3.5 Flash", + "display_name": "Step 3.5 Flash", "modalities": { "input": [ "text" @@ -1980,10 +2087,10 @@ ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 256000, + "output": 256000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -1991,53 +2098,67 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ - "none", "low", - "medium", - "high", - "xhigh", - "max" + "high" ] } }, "attachment": false, - "open_weights": false, - "release_date": "2025-11-27", - "last_updated": "2025-11-27", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-01-29", + "last_updated": "2026-02-13", "type": "chat" - }, + } + ] + }, + "sambanova": { + "id": "sambanova", + "name": "SambaNova", + "display_name": "SambaNova", + "api": "https://api.sambanova.ai/v1", + "doc": "https://docs.sambanova.ai/cloud/docs/get-started/supported-models", + "models": [ { - "id": "topazlabs-co/topazlabs", - "name": "TopazLabs", - "display_name": "TopazLabs", + "id": "Meta-Llama-3.3-70B-Instruct", + "name": "Llama-3.3-70B-Instruct", + "display_name": "Llama-3.3-70B-Instruct", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ - "image" + "text" ] }, "limit": { - "context": 204, - "output": 8192 + "context": 131072, + "output": 3072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": true, - "open_weights": false, - "release_date": "2024-12-03", - "last_updated": "2024-12-03" + "attachment": false, + "open_weights": true, + "knowledge": "2023-12", + "release_date": "2024-12-06", + "last_updated": "2024-12-06", + "type": "chat" }, { - "id": "empiriolabs/deepseek-v4-flash-el", - "name": "DeepSeek-V4-Flash-EL", - "display_name": "DeepSeek-V4-Flash-EL", + "id": "DeepSeek-V3.2", + "name": "DeepSeek V3.2", + "display_name": "DeepSeek V3.2", "modalities": { "input": [ "text" @@ -2047,8 +2168,8 @@ ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 32768, + "output": 7168 }, "temperature": true, "tool_call": true, @@ -2056,28 +2177,35 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, "attachment": false, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "knowledge": "2024-07", + "release_date": "2025-12-01", + "last_updated": "2025-12-01", "type": "chat" }, { - "id": "empiriolabs/deepseek-v4-pro-el", - "name": "DeepSeek-V4-Pro-EL", - "display_name": "DeepSeek-V4-Pro-EL", + "id": "gemma-4-31B-it", + "name": "Gemma 4 31B IT", + "display_name": "Gemma 4 31B IT", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 131072, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -2085,96 +2213,131 @@ "supported": true, "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": true, + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "lumalabs/ray2", - "name": "Ray2", - "display_name": "Ray2", + "id": "DeepSeek-V3.1", + "name": "DeepSeek-V3.1", + "display_name": "DeepSeek-V3.1", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ - "video" + "text" ] }, "limit": { - "context": 5000, - "output": 8192 + "context": 131072, + "output": 7168 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, - "open_weights": false, - "release_date": "2025-02-20", - "last_updated": "2025-02-20" + "attachment": false, + "open_weights": true, + "release_date": "2025-08-21", + "last_updated": "2025-08-21", + "type": "chat" }, { - "id": "openai/gpt-5.2-instant", - "name": "GPT-5.2-Instant", - "display_name": "GPT-5.2-Instant", + "id": "gpt-oss-120b", + "name": "GPT OSS 120B", + "display_name": "GPT OSS 120B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 131072, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ "low", "medium", "high" - ], - "visibility": "hidden" + ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2025-12-11", - "last_updated": "2025-12-11", + "attachment": false, + "open_weights": true, + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "openai/gpt-5.2", - "name": "GPT-5.2", - "display_name": "GPT-5.2", + "id": "MiniMax-M3", + "name": "MiniMax-M3", + "display_name": "MiniMax-M3", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1048576, + "output": 1048576 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": false, + "open_weights": true, + "release_date": "2026-06-01", + "last_updated": "2026-06-01", + "type": "chat" + } + ] + }, + "digitalocean": { + "id": "digitalocean", + "name": "DigitalOcean", + "display_name": "DigitalOcean", + "api": "https://inference.do-ai.run/v1", + "doc": "https://docs.digitalocean.com/products/gradient-ai-platform/details/models/", + "models": [ + { + "id": "openai-gpt-5.5", + "name": "OpenAI GPT-5.5", + "display_name": "OpenAI GPT-5.5", "modalities": { "input": [ "text", @@ -2185,168 +2348,185 @@ ] }, "limit": { - "context": 400000, + "context": 1000000, "output": 128000 }, "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", "effort_options": [ "none", "low", "medium", "high", "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-12-01", + "release_date": "2026-04-23", + "last_updated": "2026-04-23", + "type": "chat" + }, + { + "id": "deepseek-v4-flash-0731", + "name": "DeepSeek V4 Flash 0731", + "display_name": "DeepSeek V4 Flash 0731", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1048576, + "output": 1048576 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ "low", "medium", "high" - ], - "visibility": "hidden" + ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2025-12-11", - "last_updated": "2025-12-11", + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-07-31", + "last_updated": "2026-07-31", "type": "chat" }, { - "id": "openai/gpt-5.4-mini", - "name": "GPT-5.4-Mini", - "display_name": "GPT-5.4-Mini", + "id": "openai-gpt-5.6-sol", + "name": "OpenAI GPT-5.6 Sol", + "display_name": "OpenAI GPT-5.6 Sol", "modalities": { "input": [ "text", "image" ], "output": [ - "text", - "image" + "text" ] }, "limit": { - "context": 400000, + "context": 1050000, "output": 128000 }, "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", "effort_options": [ "none", "low", "medium", "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "xhigh", + "max" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-17", - "last_updated": "2026-03-17", + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "openai/gpt-image-1-mini", - "name": "GPT-Image-1-Mini", - "display_name": "GPT-Image-1-Mini", + "id": "bge-m3", + "name": "BGE M3", + "display_name": "BGE M3", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ - "image" + "text" ] }, "limit": { "context": 8192, - "output": 8192 + "output": 1024 }, "temperature": false, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, - "attachment": true, - "open_weights": false, - "release_date": "2025-10-06", - "last_updated": "2025-10-06" + "attachment": false, + "open_weights": true, + "release_date": "2024-01-30", + "last_updated": "2024-01-30", + "type": "embedding" }, { - "id": "openai/dall-e-3", - "name": "DALL-E-3", - "display_name": "DALL-E-3", + "id": "gte-large-en-v1.5", + "name": "GTE Large (v1.5)", + "display_name": "GTE Large (v1.5)", "modalities": { "input": [ "text" ], "output": [ - "image" + "text" ] }, "limit": { - "context": 800, - "output": 8192 + "context": 8192, + "output": 1024 }, "temperature": false, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2023-11-06", - "last_updated": "2023-11-06" + "open_weights": true, + "release_date": "2024-03-27", + "last_updated": "2026-04-16", + "type": "embedding" }, { - "id": "openai/gpt-5.2-codex", - "name": "GPT-5.2-Codex", - "display_name": "GPT-5.2-Codex", + "id": "glm-5.2", + "name": "GLM-5.2", + "display_name": "GLM-5.2", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 262144, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -2355,35 +2535,164 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ - "low", "medium", "high", "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2025-12-11", - "last_updated": "2025-12-11", + "attachment": false, + "open_weights": true, + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "openai/gpt-5.5-pro", - "name": "GPT-5.5-Pro", - "display_name": "GPT-5.5-Pro", + "id": "deepseek-4-flash", + "name": "Deepseek V4 Flash", + "display_name": "Deepseek V4 Flash", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1048576, + "output": 384000 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", + "type": "chat" + }, + { + "id": "bge-reranker-v2-m3", + "name": "BGE Reranker v2 M3", + "display_name": "BGE Reranker v2 M3", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 8192, + "output": 1 + }, + "temperature": false, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "release_date": "2024-03-15", + "last_updated": "2024-03-15", + "type": "rerank" + }, + { + "id": "wan2-2-t2v-a14b", + "name": "Wan2.2-T2V-A14B", + "display_name": "Wan2.2-T2V-A14B", + "modalities": { + "input": [ + "text" + ], + "output": [ + "video" + ] + }, + "limit": { + "context": 100, + "output": 1 + }, + "temperature": false, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "release_date": "2025-07-28", + "last_updated": "2026-04-30" + }, + { + "id": "all-mini-lm-l6-v2", + "name": "All-MiniLM-L6-v2", + "display_name": "All-MiniLM-L6-v2", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 256, + "output": 384 + }, + "temperature": false, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "release_date": "2021-08-30", + "last_updated": "2021-08-30", + "type": "embedding" + }, + { + "id": "e5-large-v2", + "name": "E5 Large v2", + "display_name": "E5 Large v2", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 512, + "output": 1024 + }, + "temperature": false, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "release_date": "2023-05", + "last_updated": "2023-05", + "type": "embedding" + }, + { + "id": "openai-gpt-image-1.5", + "name": "OpenAI GPT Image 1.5", + "display_name": "OpenAI GPT Image 1.5", "modalities": { "input": [ "text", @@ -2395,8 +2704,35 @@ ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 8192, + "output": 16384 + }, + "temperature": false, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": false, + "release_date": "2025-11-25", + "last_updated": "2025-11-25" + }, + { + "id": "openai-o1", + "name": "OpenAI o1", + "display_name": "OpenAI o1", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 200000, + "output": 100000 }, "temperature": false, "tool_call": true, @@ -2406,25 +2742,24 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ + "low", "medium", - "high", - "xhigh" + "high" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-12-01", - "release_date": "2026-04-23", - "last_updated": "2026-04-23", + "knowledge": "2023-09", + "release_date": "2024-12-05", + "last_updated": "2024-12-05", "type": "chat" }, { - "id": "openai/gpt-5-nano", - "name": "GPT-5-nano", - "display_name": "GPT-5-nano", + "id": "deepseek-v4.1-flash", + "name": "DeepSeek V4.1 Flash", + "display_name": "DeepSeek V4.1 Flash", "modalities": { "input": [ "text", @@ -2435,10 +2770,10 @@ ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 1048576, + "output": 1048576 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -2447,35 +2782,25 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", "effort_options": [ - "minimal", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ "low", - "medium", - "high" - ], - "visibility": "hidden" + "high", + "xhigh", + "max" + ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2024-05-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-09-10", + "last_updated": "2026-09-10", "type": "chat" }, { - "id": "openai/gpt-4o", - "name": "GPT-4o", - "display_name": "GPT-4o", + "id": "openai-gpt-4o", + "name": "OpenAI GPT-4o", + "display_name": "OpenAI GPT-4o", "modalities": { "input": [ "text", @@ -2487,9 +2812,9 @@ }, "limit": { "context": 128000, - "output": 8192 + "output": 16384 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": false @@ -2502,9 +2827,9 @@ "type": "chat" }, { - "id": "openai/gpt-5.2-pro", - "name": "GPT-5.2-Pro", - "display_name": "GPT-5.2-Pro", + "id": "nemotron-3.5-super-vl", + "name": "NVIDIA Nemotron 3.5 Super VL", + "display_name": "NVIDIA Nemotron 3.5 Super VL", "modalities": { "input": [ "text", @@ -2515,179 +2840,142 @@ ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 1048576, + "output": 1048576 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } - }, "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2025-12-11", - "last_updated": "2025-12-11", + "open_weights": true, + "release_date": "2026-10-15", + "last_updated": "2026-10-15", "type": "chat" }, { - "id": "openai/gpt-5.4-nano", - "name": "GPT-5.4-Nano", - "display_name": "GPT-5.4-Nano", + "id": "openai-gpt-6-sol", + "name": "OpenAI GPT-6 Sol", + "display_name": "OpenAI GPT-6 Sol", "modalities": { "input": [ "text", "image" ], "output": [ - "text", - "image" + "text" ] }, "limit": { - "context": 400000, + "context": 1050000, "output": 128000 }, "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", "effort_options": [ "none", "low", "medium", "high", "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-17", - "last_updated": "2026-03-17", + "knowledge": "2026-04-20", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "openai/gpt-3.5-turbo", - "name": "GPT-3.5-Turbo", - "display_name": "GPT-3.5-Turbo", + "id": "gemma-4-31B-it", + "name": "Gemma 4", + "display_name": "Gemma 4", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 16384, - "output": 2048 + "context": 256000, + "output": 8192 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": true, - "open_weights": false, - "knowledge": "2021-09-01", - "release_date": "2023-03-01", - "last_updated": "2023-11-06", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "openai/gpt-5.1-instant", - "name": "GPT-5.1-Instant", - "display_name": "GPT-5.1-Instant", + "id": "nemotron-3-nano-omni", + "name": "Nemotron 3 Nano Omni", + "display_name": "Nemotron 3 Nano Omni", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 65536, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", "effort_options": [ "none", "low", "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "high", + "max" + ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-11-13", - "last_updated": "2025-11-13", + "open_weights": true, + "release_date": "2026-04-28", + "last_updated": "2026-04-28", "type": "chat" }, { - "id": "openai/gpt-5.1-codex-max", - "name": "GPT-5.1-Codex-Max", - "display_name": "GPT-5.1-Codex-Max", + "id": "anthropic-claude-opus-4.5", + "name": "Anthropic Claude Opus 4.5", + "display_name": "Anthropic Claude Opus 4.5", "modalities": { "input": [ "text", @@ -2698,10 +2986,10 @@ ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 200000, + "output": 8192 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -2711,74 +2999,79 @@ "reasoning": { "supported": true, "default_enabled": false, - "mode": "effort", - "effort": "none", + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", "effort_options": [ - "none", "low", "medium", "high" ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ], - "visibility": "hidden" + "notes": [ + "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-11-13", - "last_updated": "2025-11-13", + "knowledge": "2025-05", + "release_date": "2025-11-24", + "last_updated": "2025-11-24", "type": "chat" }, { - "id": "openai/gpt-3.5-turbo-raw", - "name": "GPT-3.5-Turbo-Raw", - "display_name": "GPT-3.5-Turbo-Raw", + "id": "mistral-3-14B", + "name": "Ministral 3 14B", + "display_name": "Ministral 3 14B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 4524, - "output": 2048 + "context": 262144, + "output": 128000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2021-09-01", - "release_date": "2023-03-01", - "last_updated": "2023-11-06", + "attachment": false, + "open_weights": true, + "release_date": "2025-12-02", + "last_updated": "2025-12-02", "type": "chat" }, { - "id": "openai/gpt-5.3-codex-spark", - "name": "GPT-5.3-Codex-Spark", - "display_name": "GPT-5.3-Codex-Spark", + "id": "anthropic-claude-opus-5", + "name": "Anthropic Claude Opus 5", + "display_name": "Anthropic Claude Opus 5", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 1000000, + "output": 128000 }, "temperature": false, "tool_call": true, @@ -2788,36 +3081,26 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", "effort_options": [ "low", "medium", "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "xhigh", + "max" + ] } }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-05", - "last_updated": "2026-02-05", + "knowledge": "2026-05", + "release_date": "2026-07-24", + "last_updated": "2026-07-24", "type": "chat" }, { - "id": "openai/chatgpt-4o-latest", - "name": "ChatGPT-4o-Latest", - "display_name": "ChatGPT-4o-Latest", + "id": "anthropic-claude-sonnet-5.5", + "name": "Anthropic Claude Sonnet 5.5", + "display_name": "Anthropic Claude Sonnet 5.5", "modalities": { "input": [ "text", @@ -2828,38 +3111,50 @@ ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 1000000, + "output": 128000 }, "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } }, "attachment": true, "open_weights": false, - "release_date": "2024-08-14", - "last_updated": "2024-08-14", + "knowledge": "2026-06", + "release_date": "2026-09-28", + "last_updated": "2026-09-28", "type": "chat" }, { - "id": "openai/o3-mini", - "name": "o3-mini", - "display_name": "o3-mini", + "id": "glm-5.3", + "name": "GLM5.3", + "display_name": "GLM5.3", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 1048576, + "output": 128000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -2868,28 +3163,23 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", "effort_options": [ "low", - "medium", - "high" - ], - "visibility": "hidden" + "high", + "max" + ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-05", - "release_date": "2024-12-20", - "last_updated": "2025-01-29", + "attachment": false, + "open_weights": true, + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "openai/o3", - "name": "o3", - "display_name": "o3", + "id": "openai-gpt-5.6-luna", + "name": "OpenAI GPT-5.6 Luna", + "display_name": "OpenAI GPT-5.6 Luna", "modalities": { "input": [ "text", @@ -2900,8 +3190,8 @@ ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 1050000, + "output": 128000 }, "temperature": false, "tool_call": true, @@ -2911,29 +3201,27 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", "effort_options": [ + "none", "low", "medium", - "high" - ], - "visibility": "hidden" + "high", + "xhigh", + "max" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2024-05", - "release_date": "2025-04-16", - "last_updated": "2025-04-16", + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "openai/o1-pro", - "name": "o1-pro", - "display_name": "o1-pro", + "id": "openai-o3-mini", + "name": "OpenAI o3 mini", + "display_name": "OpenAI o3 mini", "modalities": { "input": [ "text", @@ -2955,56 +3243,68 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", "effort_options": [ "low", "medium", "high" - ], - "visibility": "hidden" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2023-09", - "release_date": "2025-03-19", - "last_updated": "2025-03-19", + "knowledge": "2024-05", + "release_date": "2024-12-20", + "last_updated": "2025-01-29", "type": "chat" }, { - "id": "openai/gpt-image-1", - "name": "GPT-Image-1", - "display_name": "GPT-Image-1", + "id": "mimo-v2.5-pro", + "name": "MiMo V2.5 Pro", + "display_name": "MiMo V2.5 Pro", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ - "image" + "text" ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 262144, + "output": 262144 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, - "open_weights": false, - "release_date": "2025-04-24", - "last_updated": "2025-04-24" + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "none", + "high" + ] + } + }, + "attachment": false, + "open_weights": true, + "knowledge": "2024-12", + "release_date": "2026-04-22", + "last_updated": "2026-04-22", + "type": "chat" }, { - "id": "openai/gpt-5-pro", - "name": "GPT-5-Pro", - "display_name": "GPT-5-Pro", + "id": "openai-gpt-4.1", + "name": "OpenAI GPT-4.1", + "display_name": "OpenAI GPT-4.1", "modalities": { "input": [ "text", @@ -3015,41 +3315,25 @@ ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 1047576, + "output": 32768 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "fixed", - "effort": "high", - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-10-06", - "last_updated": "2025-10-06", + "knowledge": "2024-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", "type": "chat" }, { - "id": "openai/gpt-5.3-codex", - "name": "GPT-5.3-Codex", - "display_name": "GPT-5.3-Codex", + "id": "openai-gpt-6-astra", + "name": "OpenAI GPT-6 Astra", + "display_name": "OpenAI GPT-6 Astra", "modalities": { "input": [ "text", @@ -3060,7 +3344,7 @@ ] }, "limit": { - "context": 400000, + "context": 1050000, "output": 128000 }, "temperature": false, @@ -3071,36 +3355,26 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", "effort_options": [ "low", "medium", "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "xhigh", + "max" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-05", - "last_updated": "2026-02-05", + "knowledge": "2026-04-30", + "release_date": "2026-09-04", + "last_updated": "2026-09-04", "type": "chat" }, { - "id": "openai/gpt-4o-search", - "name": "GPT-4o-Search", - "display_name": "GPT-4o-Search", + "id": "reflection-beam", + "name": "Beam", + "display_name": "Beam", "modalities": { "input": [ "text" @@ -3110,35 +3384,48 @@ ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 1048576, + "output": 1048576 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": false - }, + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + }, "attachment": false, "open_weights": false, - "release_date": "2025-03-11", - "last_updated": "2025-03-11", + "release_date": "2026-10-21", + "last_updated": "2026-10-21", "type": "chat" }, { - "id": "openai/o4-mini-deep-research", - "name": "o4-mini-deep-research", - "display_name": "o4-mini-deep-research", + "id": "openai-gpt-5.6-terra", + "name": "OpenAI GPT-5.6 Terra", + "display_name": "OpenAI GPT-5.6 Terra", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 1050000, + "output": 128000 }, "temperature": false, "tool_call": true, @@ -3148,137 +3435,138 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", "effort_options": [ + "none", "low", "medium", - "high" - ], - "visibility": "hidden" + "high", + "xhigh", + "max" + ] } }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2024-05", - "release_date": "2025-06-26", - "last_updated": "2025-06-26", + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "openai/sora-2-pro", - "name": "Sora-2-Pro", - "display_name": "Sora-2-Pro", + "id": "nemotron-3-ultra-550b", + "name": "Nemotron 3 Ultra", + "display_name": "Nemotron 3 Ultra", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ - "video" + "text" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 131072, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": true, - "open_weights": false, - "release_date": "2025-10-06", - "last_updated": "2025-10-06" + "attachment": false, + "open_weights": true, + "knowledge": "2025-09", + "release_date": "2026-06-04", + "last_updated": "2026-06-04", + "type": "chat" }, { - "id": "openai/gpt-image-2", - "name": "GPT-Image-2", - "display_name": "GPT-Image-2", + "id": "openai-gpt-6-luna", + "name": "OpenAI GPT-6 Luna", + "display_name": "OpenAI GPT-6 Luna", "modalities": { "input": [ "text", "image" ], "output": [ - "image" + "text" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 1050000, + "output": 128000 }, "temperature": false, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ] + } }, "attachment": true, "open_weights": false, - "release_date": "2026-04-21", - "last_updated": "2026-04-21" + "knowledge": "2026-05-18", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", + "type": "chat" }, { - "id": "openai/gpt-5.4", - "name": "GPT-5.4", - "display_name": "GPT-5.4", + "id": "qwen3.8-max", + "name": "Qwen3.8-Max", + "display_name": "Qwen3.8-Max", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ - "text", - "image" + "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1000000, + "output": 262144 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", "effort_options": [ "none", "low", "medium", "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "max" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-05", - "last_updated": "2026-03-05", + "release_date": "2026-08-03", + "last_updated": "2026-08-03", "type": "chat" }, { - "id": "openai/gpt-5-codex", - "name": "GPT-5-Codex", - "display_name": "GPT-5-Codex", + "id": "anthropic-claude-haiku-4.5", + "name": "Anthropic Claude Haiku 4.5", + "display_name": "Anthropic Claude Haiku 4.5", "modalities": { "input": [ "text", @@ -3289,47 +3577,47 @@ ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 200000, + "output": 8192 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "minimal", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ], - "visibility": "hidden" + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-09-15", - "last_updated": "2025-09-15", + "knowledge": "2025-02-28", + "release_date": "2025-10-15", + "last_updated": "2025-10-15", "type": "chat" }, { - "id": "openai/o3-pro", - "name": "o3-pro", - "display_name": "o3-pro", + "id": "anthropic-claude-opus-5.5", + "name": "Anthropic Claude Opus 5.5", + "display_name": "Anthropic Claude Opus 5.5", "modalities": { "input": [ "text", @@ -3340,8 +3628,8 @@ ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 1000000, + "output": 128000 }, "temperature": false, "tool_call": true, @@ -3351,29 +3639,26 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", "effort_options": [ "low", "medium", - "high" - ], - "visibility": "hidden" + "high", + "xhigh", + "max" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2024-05", - "release_date": "2025-06-10", - "last_updated": "2025-06-10", + "knowledge": "2026-06", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "openai/gpt-5-chat", - "name": "GPT-5-Chat", - "display_name": "GPT-5-Chat", + "id": "anthropic-claude-4.5-sonnet", + "name": "Anthropic Claude 4.5 Sonnet", + "display_name": "Anthropic Claude 4.5 Sonnet", "modalities": { "input": [ "text", @@ -3384,25 +3669,35 @@ ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 200000, + "output": 64000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "high" + ] + } }, "attachment": true, "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "knowledge": "2025-07-31", + "release_date": "2025-09-29", + "last_updated": "2025-09-29", "type": "chat" }, { - "id": "openai/gpt-5.1", - "name": "GPT-5.1", - "display_name": "GPT-5.1", + "id": "openai-gpt-6-1-sol", + "name": "OpenAI GPT-6.1 Sol", + "display_name": "OpenAI GPT-6.1 Sol", "modalities": { "input": [ "text", @@ -3413,47 +3708,37 @@ ] }, "limit": { - "context": 400000, + "context": 1050000, "output": 128000 }, "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", "effort_options": [ - "none", "low", "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "high", + "xhigh", + "max" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-11-13", - "last_updated": "2025-11-13", + "knowledge": "2026-04-30", + "release_date": "2026-09-29", + "last_updated": "2026-09-29", "type": "chat" }, { - "id": "openai/o3-deep-research", - "name": "o3-deep-research", - "display_name": "o3-deep-research", + "id": "openai-gpt-oss-20b", + "name": "OpenAI GPT-oss-20b", + "display_name": "OpenAI GPT-oss-20b", "modalities": { "input": [ "text" @@ -3463,10 +3748,10 @@ ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 128000, + "output": 4096 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -3474,29 +3759,24 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", "effort_options": [ "low", "medium", "high" - ], - "visibility": "hidden" + ] } }, "attachment": false, - "open_weights": false, - "knowledge": "2024-05", - "release_date": "2025-06-26", - "last_updated": "2025-06-26", + "open_weights": true, + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "openai/gpt-4o-mini-search", - "name": "GPT-4o-mini-Search", - "display_name": "GPT-4o-mini-Search", + "id": "qwen3-embedding-0.6b", + "name": "Qwen3 Embedding 0.6B", + "display_name": "Qwen3 Embedding 0.6B", "modalities": { "input": [ "text" @@ -3506,88 +3786,115 @@ ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 8000, + "output": 1024 }, "temperature": false, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2025-03-11", - "last_updated": "2025-03-11", - "type": "chat" + "open_weights": true, + "release_date": "2025-06-03", + "last_updated": "2026-04-16", + "type": "embedding" }, { - "id": "openai/sora-2", - "name": "Sora-2", - "display_name": "Sora-2", + "id": "anthropic-claude-5-sonnet", + "name": "Anthropic Claude Sonnet 5", + "display_name": "Anthropic Claude Sonnet 5", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ - "video" + "text" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 1000000, + "output": 128000 }, "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "high", + "xhigh" + ] + } + }, + "attachment": false, "open_weights": false, - "release_date": "2025-10-06", - "last_updated": "2025-10-06" + "knowledge": "2026-01-31", + "release_date": "2026-06-30", + "last_updated": "2026-06-30", + "type": "chat" }, { - "id": "openai/gpt-4.1-mini", - "name": "GPT-4.1-mini", - "display_name": "GPT-4.1-mini", + "id": "openai-gpt-oss-120b", + "name": "OpenAI GPT-oss-120b", + "display_name": "OpenAI GPT-oss-120b", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1047576, - "output": 32768 + "context": 128000, + "output": 4096 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-04-14", - "last_updated": "2025-04-14", + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "low", + "medium", + "high" + ] + } + }, + "attachment": false, + "open_weights": true, + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "openai/gpt-5.5", - "name": "GPT-5.5", - "display_name": "GPT-5.5", + "id": "openai-gpt-5", + "name": "OpenAI GPT-5", + "display_name": "OpenAI GPT-5", "modalities": { "input": [ "text", "image" ], "output": [ - "text", - "image" + "text" ] }, "limit": { @@ -3602,36 +3909,25 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ + "minimal", "low", "medium", "high" - ], - "visibility": "hidden" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-12-01", - "release_date": "2026-04-23", - "last_updated": "2026-04-23", + "knowledge": "2024-09-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "openai/gpt-4o-mini", - "name": "GPT-4o-mini", - "display_name": "GPT-4o-mini", + "id": "kimi-k2.6", + "name": "Kimi K2.6", + "display_name": "Kimi K2.6", "modalities": { "input": [ "text", @@ -3642,25 +3938,70 @@ ] }, "limit": { - "context": 124096, - "output": 4096 + "context": 262144, + "output": 262144 }, "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "none", + "low", + "medium", + "high" + ] + } }, "attachment": true, - "open_weights": false, - "knowledge": "2023-09", - "release_date": "2024-07-18", - "last_updated": "2024-07-18", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-04-20", + "last_updated": "2026-04-20", "type": "chat" }, { - "id": "openai/gpt-5-mini", - "name": "GPT-5-mini", - "display_name": "GPT-5-mini", + "id": "multi-qa-mpnet-base-dot-v1", + "name": "Multi-QA-mpnet-base-dot-v1", + "display_name": "Multi-QA-mpnet-base-dot-v1", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 512, + "output": 768 + }, + "temperature": false, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "release_date": "2021-08-23", + "last_updated": "2021-08-23", + "type": "embedding" + }, + { + "id": "minimax-m3.1-flash", + "name": "MiniMax M3.1-Flash (Public Preview)", + "display_name": "MiniMax M3.1-Flash (Public Preview)", "modalities": { "input": [ "text", @@ -3671,10 +4012,10 @@ ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 1048576, + "output": 1048576 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -3682,64 +4023,64 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", "effort_options": [ - "minimal", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ "low", "medium", - "high" - ], - "visibility": "hidden" + "high", + "xhigh", + "max" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2024-05-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "release_date": "2026-10-19", + "last_updated": "2026-10-19", "type": "chat" }, { - "id": "openai/gpt-3.5-turbo-instruct", - "name": "GPT-3.5-Turbo-Instruct", - "display_name": "GPT-3.5-Turbo-Instruct", + "id": "minimax-m2.5", + "name": "MiniMax M2.5 (Public Preview)", + "display_name": "MiniMax M2.5 (Public Preview)", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 3500, - "output": 1024 + "context": 65536, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, - "open_weights": false, - "release_date": "2023-09-20", - "last_updated": "2023-09-20", + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "low", + "medium", + "high" + ] + } + }, + "attachment": false, + "open_weights": true, + "knowledge": "2025-08", + "release_date": "2026-02-12", + "last_updated": "2026-04-16", "type": "chat" }, { - "id": "openai/gpt-5", - "name": "GPT-5", - "display_name": "GPT-5", + "id": "openai-gpt-5.4-pro", + "name": "OpenAI GPT-5.4 Pro", + "display_name": "OpenAI GPT-5.4 Pro", "modalities": { "input": [ "text", @@ -3750,7 +4091,7 @@ ] }, "limit": { - "context": 400000, + "context": 1050000, "output": 128000 }, "temperature": false, @@ -3761,36 +4102,24 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", "effort_options": [ - "minimal", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", "medium", - "high" - ], - "visibility": "hidden" + "high", + "xhigh" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "knowledge": "2025-08-31", + "release_date": "2026-03-05", + "last_updated": "2026-03-05", "type": "chat" }, { - "id": "openai/gpt-4.1", - "name": "GPT-4.1", - "display_name": "GPT-4.1", + "id": "openai-gpt-5.4-nano", + "name": "OpenAI GPT-5.4 Nano", + "display_name": "OpenAI GPT-5.4 Nano", "modalities": { "input": [ "text", @@ -3801,54 +4130,63 @@ ] }, "limit": { - "context": 1047576, - "output": 32768 + "context": 400000, + "output": 128000 }, "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ] + } }, "attachment": true, "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-04-14", - "last_updated": "2025-04-14", + "knowledge": "2025-08-31", + "release_date": "2026-03-17", + "last_updated": "2026-03-17", "type": "chat" }, { - "id": "openai/gpt-4o-aug", - "name": "GPT-4o-Aug", - "display_name": "GPT-4o-Aug", + "id": "qwen3-tts-voicedesign", + "name": "Qwen3 TTS VoiceDesign", + "display_name": "Qwen3 TTS VoiceDesign", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ - "text" + "audio" ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 32768, + "output": 1 }, "temperature": false, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2023-09", - "release_date": "2024-08-06", - "last_updated": "2024-08-06", - "type": "chat" + "attachment": false, + "open_weights": true, + "release_date": "2026-04-21", + "last_updated": "2026-04-30" }, { - "id": "openai/gpt-5.3-instant", - "name": "GPT-5.3-Instant", - "display_name": "GPT-5.3-Instant", + "id": "openai-gpt-5.4-mini", + "name": "OpenAI GPT-5.4 Mini", + "display_name": "OpenAI GPT-5.4 Mini", "modalities": { "input": [ "text", @@ -3859,75 +4197,84 @@ ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 400000, + "output": 128000 }, "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ] + } }, "attachment": true, "open_weights": false, "knowledge": "2025-08-31", - "release_date": "2026-03-03", - "last_updated": "2026-03-03", + "release_date": "2026-03-17", + "last_updated": "2026-03-17", "type": "chat" }, { - "id": "openai/gpt-5.1-codex-mini", - "name": "GPT-5.1-Codex-Mini", - "display_name": "GPT-5.1-Codex-Mini", + "id": "qwen3.5-397b-a17b", + "name": "Qwen 3.5 397B A17B", + "display_name": "Qwen 3.5 397B A17B", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 131072, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ "none", "low", "medium", "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + ] } }, - "attachment": false, - "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-11-13", - "last_updated": "2025-11-13", + "attachment": true, + "open_weights": true, + "release_date": "2026-02-15", + "last_updated": "2026-02-15", "type": "chat" }, { - "id": "openai/o1", - "name": "o1", - "display_name": "o1", + "id": "openai-gpt-5-mini", + "name": "OpenAI GPT-5 Mini", + "display_name": "OpenAI GPT-5 Mini", "modalities": { "input": [ "text", @@ -3938,8 +4285,8 @@ ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 400000, + "output": 128000 }, "temperature": false, "tool_call": true, @@ -3949,58 +4296,76 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", "effort_options": [ + "minimal", "low", "medium", "high" - ], - "visibility": "hidden" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2023-09", - "release_date": "2024-12-05", - "last_updated": "2024-12-05", + "knowledge": "2024-05-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "openai/gpt-4.1-nano", - "name": "GPT-4.1-nano", - "display_name": "GPT-4.1-nano", + "id": "deepseek-v4-pro", + "name": "Deepseek V4 Pro", + "display_name": "Deepseek V4 Pro", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1047576, - "output": 32768 + "context": 1048576, + "output": 384000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-04-14", - "last_updated": "2025-04-14", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "high", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." + ] + } + }, + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "openai/o3-mini-high", - "name": "o3-mini-high", - "display_name": "o3-mini-high", + "id": "deepseek-v4.1-flash-1017", + "name": "DeepSeek V4.1 Flash 1017", + "display_name": "DeepSeek V4.1 Flash 1017", "modalities": { "input": [ "text", @@ -4011,10 +4376,10 @@ ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 1048576, + "output": 1048576 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -4022,29 +4387,25 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", "effort_options": [ "low", - "medium", - "high" - ], - "visibility": "hidden" + "high", + "xhigh", + "max" + ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2024-05", - "release_date": "2024-12-20", - "last_updated": "2025-01-29", + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-10-17", + "last_updated": "2026-10-17", "type": "chat" }, { - "id": "openai/o4-mini", - "name": "o4-mini", - "display_name": "o4-mini", + "id": "anthropic-claude-opus-4.7", + "name": "Anthropic Claude Opus 4.7", + "display_name": "Anthropic Claude Opus 4.7", "modalities": { "input": [ "text", @@ -4056,39 +4417,51 @@ }, "limit": { "context": 200000, - "output": 100000 + "output": 8192 }, "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, + "default_enabled": false, "mode": "effort", - "effort": "medium", + "effort": "high", "effort_options": [ "low", "medium", - "high" + "high", + "xhigh", + "max" ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2024-05", - "release_date": "2025-04-16", - "last_updated": "2025-04-16", + "knowledge": "2026-01-31", + "release_date": "2026-04-16", + "last_updated": "2026-04-16", "type": "chat" }, { - "id": "openai/gpt-5.1-codex", - "name": "GPT-5.1-Codex", - "display_name": "GPT-5.1-Codex", + "id": "openai-gpt-4o-mini", + "name": "OpenAI GPT-4o mini", + "display_name": "OpenAI GPT-4o mini", "modalities": { "input": [ "text", @@ -4099,47 +4472,35 @@ ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 128000, + "output": 16384 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", "effort_options": [ - "none", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ "low", "medium", "high" - ], - "visibility": "hidden" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-11-13", - "last_updated": "2025-11-13", + "knowledge": "2023-09", + "release_date": "2024-07-18", + "last_updated": "2024-07-18", "type": "chat" }, { - "id": "openai/gpt-4-turbo", - "name": "GPT-4-Turbo", - "display_name": "GPT-4-Turbo", + "id": "anthropic-claude-opus-4.8", + "name": "Anthropic Claude Opus 4.8", + "display_name": "Anthropic Claude Opus 4.8", "modalities": { "input": [ "text", @@ -4150,37 +4511,63 @@ ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 1000000, + "output": 128000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." + ] + } }, "attachment": true, "open_weights": false, - "knowledge": "2023-12", - "release_date": "2023-11-06", - "last_updated": "2024-04-09", + "knowledge": "2026-01", + "release_date": "2026-05-28", + "last_updated": "2026-05-28", "type": "chat" }, { - "id": "openai/gpt-5.4-pro", - "name": "GPT-5.4-Pro", - "display_name": "GPT-5.4-Pro", + "id": "anthropic-claude-fable-5.1", + "name": "Anthropic Claude Fable 5.1", + "display_name": "Anthropic Claude Fable 5.1", "modalities": { "input": [ "text", "image" ], "output": [ - "text", - "image" + "text" ] }, "limit": { - "context": 1050000, + "context": 1000000, "output": 128000 }, "temperature": false, @@ -4196,203 +4583,210 @@ "mode": "effort", "effort": "high", "effort_options": [ + "low", "medium", "high", - "xhigh" + "xhigh", + "max" ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" ], - "visibility": "hidden" + "notes": [ + "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", + "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", + "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-05", - "last_updated": "2026-03-05", + "knowledge": "2026-06", + "release_date": "2026-09-01", + "last_updated": "2026-09-01", "type": "chat" }, { - "id": "openai/gpt-image-1.5", - "name": "gpt-image-1.5", - "display_name": "gpt-image-1.5", + "id": "openai-gpt-5.3-codex", + "name": "OpenAI GPT-5.3 Codex", + "display_name": "OpenAI GPT-5.3 Codex", "modalities": { "input": [ "text", "image" ], "output": [ - "image" + "text" ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 400000, + "output": 128000 }, "temperature": false, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, - "open_weights": false, - "release_date": "2025-11-25", - "last_updated": "2025-11-25" - }, - { - "id": "ideogramai/ideogram-v2a", - "name": "Ideogram-v2a", - "display_name": "Ideogram-v2a", - "modalities": { - "input": [ - "text" - ], - "output": [ - "image" - ] - }, - "limit": { - "context": 150, - "output": 8192 - }, - "temperature": false, - "tool_call": true, - "reasoning": { - "supported": false + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ] + } }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2025-02-27", - "last_updated": "2025-02-27" + "knowledge": "2025-08-31", + "release_date": "2026-02-05", + "last_updated": "2026-02-05", + "type": "chat" }, { - "id": "ideogramai/ideogram-v2", - "name": "Ideogram-v2", - "display_name": "Ideogram-v2", + "id": "anthropic-claude-5.5-haiku", + "name": "Anthropic Claude 5.5 Haiku", + "display_name": "Anthropic Claude 5.5 Haiku", "modalities": { "input": [ "text", "image" ], "output": [ - "image" - ] - }, - "limit": { - "context": 150, - "output": 8192 - }, - "temperature": false, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": false, - "release_date": "2024-08-21", - "last_updated": "2024-08-21" - }, - { - "id": "ideogramai/ideogram-v2a-turbo", - "name": "Ideogram-v2a-Turbo", - "display_name": "Ideogram-v2a-Turbo", - "modalities": { - "input": [ "text" - ], - "output": [ - "image" ] }, "limit": { - "context": 150, - "output": 8192 + "context": 1000000, + "output": 128000 }, "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + }, + "attachment": true, "open_weights": false, - "release_date": "2025-02-27", - "last_updated": "2025-02-27" + "knowledge": "2026-06", + "release_date": "2026-10-07", + "last_updated": "2026-10-07", + "type": "chat" }, { - "id": "ideogramai/ideogram", - "name": "Ideogram", - "display_name": "Ideogram", + "id": "openai-gpt-5.2", + "name": "OpenAI GPT-5.2", + "display_name": "OpenAI GPT-5.2", "modalities": { "input": [ "text", "image" ], "output": [ - "image" + "text" ] }, "limit": { - "context": 150, - "output": 8192 + "context": 400000, + "output": 128000 }, "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "minimal", + "low", + "medium", + "high" + ] + } }, "attachment": true, "open_weights": false, - "release_date": "2024-04-03", - "last_updated": "2024-04-03" + "knowledge": "2025-08-31", + "release_date": "2025-12-11", + "last_updated": "2025-12-11", + "type": "chat" }, { - "id": "stabilityai/stablediffusionxl", - "name": "StableDiffusionXL", - "display_name": "StableDiffusionXL", + "id": "openai-gpt-5.2-pro", + "name": "OpenAI GPT-5.2 Pro", + "display_name": "OpenAI GPT-5.2 Pro", "modalities": { "input": [ "text", "image" ], "output": [ - "image" + "text" ] }, "limit": { - "context": 200, - "output": 8192 + "context": 400000, + "output": 128000 }, "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "minimal", + "low", + "medium", + "high" + ] + } }, "attachment": true, "open_weights": false, - "release_date": "2023-07-09", - "last_updated": "2023-07-09" + "knowledge": "2025-08-31", + "release_date": "2025-12-11", + "last_updated": "2025-12-11", + "type": "chat" }, { - "id": "anthropic/claude-sonnet-3.7", - "name": "Claude-Sonnet-3.7", - "display_name": "Claude-Sonnet-3.7", + "id": "kimi-k3", + "name": "Kimi K3", + "display_name": "Kimi K3", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 196608, - "output": 128000 + "context": 1048576, + "output": 131072 }, "temperature": false, "tool_call": true, @@ -4400,89 +4794,87 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "low", + "high", + "max" + ] + } + }, "attachment": true, - "open_weights": false, - "knowledge": "2024-10-31", - "release_date": "2025-02-19", - "last_updated": "2025-02-19", + "open_weights": true, + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" }, { - "id": "anthropic/claude-opus-4.7", - "name": "Claude-Opus-4.7", - "display_name": "Claude-Opus-4.7", + "id": "nemotron-nano-12b-v2-vl", + "name": "Nemotron-nano 12b v2-vl", + "display_name": "Nemotron-nano 12b v2-vl", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 128000 + "context": 128000, + "output": 16384 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "high", "effort_options": [ + "none", "low", "medium", "high", - "xhigh", "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-04-16", - "last_updated": "2026-04-16", + "open_weights": true, + "release_date": "2025-10-28", + "last_updated": "2025-10-28", "type": "chat" }, { - "id": "anthropic/claude-opus-4.6", - "name": "Claude-Opus-4.6", - "display_name": "Claude-Opus-4.6", + "id": "anthropic-claude-opus-4.6", + "name": "Anthropic Claude Opus 4.6", + "display_name": "Anthropic Claude Opus 4.6", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 983040, - "output": 128000 + "context": 200000, + "output": 8192 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -4524,562 +4916,431 @@ "type": "chat" }, { - "id": "anthropic/claude-haiku-3", - "name": "Claude-Haiku-3", - "display_name": "Claude-Haiku-3", + "id": "openai-gpt-5.4", + "name": "OpenAI GPT-5.4", + "display_name": "OpenAI GPT-5.4", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 189096, - "output": 8192 + "context": 400000, + "output": 128000 }, "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ] + } }, "attachment": true, "open_weights": false, - "knowledge": "2023-08-31", - "release_date": "2024-03-13", - "last_updated": "2024-03-13", + "knowledge": "2025-08-31", + "release_date": "2026-03-05", + "last_updated": "2026-03-05", "type": "chat" }, { - "id": "anthropic/claude-sonnet-4", - "name": "Claude-Sonnet-4", - "display_name": "Claude-Sonnet-4", + "id": "deepseek-3.2", + "name": "Deepseek 3.2", + "display_name": "Deepseek 3.2", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 983040, - "output": 64000 + "context": 163840, + "output": 163840 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + "effort_options": [ + "none", + "low", + "medium", + "high" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-03-31", - "release_date": "2025-05-22", - "last_updated": "2025-05-22", + "attachment": false, + "open_weights": true, + "knowledge": "2024-07", + "release_date": "2025-12-01", + "last_updated": "2025-12-01", "type": "chat" }, { - "id": "anthropic/claude-haiku-4.5", - "name": "Claude-Haiku-4.5", - "display_name": "Claude-Haiku-4.5", + "id": "stable-diffusion-3.5-large", + "name": "Stable Diffusion 3.5 Large", + "display_name": "Stable Diffusion 3.5 Large", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ - "text" + "image" ] }, "limit": { - "context": 192000, - "output": 64000 + "context": 256, + "output": 1 }, "temperature": false, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." - ] - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-02-28", - "release_date": "2025-10-15", - "last_updated": "2025-10-15", - "type": "chat" + "attachment": false, + "open_weights": true, + "release_date": "2024-10-22", + "last_updated": "2026-04-30" }, { - "id": "anthropic/claude-opus-4.8", - "name": "Claude-Opus-4.8", - "display_name": "Claude-Opus-4.8", + "id": "anthropic-claude-4.6-sonnet", + "name": "Anthropic Claude Sonnet 4.6", + "display_name": "Anthropic Claude Sonnet 4.6", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 128000 + "context": 200000, + "output": 8192 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "high", "effort_options": [ "low", "medium", "high", - "xhigh", "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-01", - "release_date": "2026-05-28", - "last_updated": "2026-05-28", + "knowledge": "2025-08-31", + "release_date": "2026-02-17", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "anthropic/claude-sonnet-3.5-june", - "name": "Claude-Sonnet-3.5-June", - "display_name": "Claude-Sonnet-3.5-June", + "id": "llama-4-maverick", + "name": "Llama 4 Maverick", + "display_name": "Llama 4 Maverick", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 189096, - "output": 8192 + "context": 128000, + "output": 16384 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": false }, "attachment": true, - "open_weights": false, - "release_date": "2024-11-18", - "last_updated": "2024-11-18", + "open_weights": true, + "knowledge": "2024-08", + "release_date": "2025-04-05", + "last_updated": "2025-04-05", "type": "chat" }, { - "id": "anthropic/claude-haiku-3.5", - "name": "Claude-Haiku-3.5", - "display_name": "Claude-Haiku-3.5", + "id": "openai-gpt-5-nano", + "name": "OpenAI GPT-5 Nano", + "display_name": "OpenAI GPT-5 Nano", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 189096, - "output": 8192 + "context": 400000, + "output": 128000 }, "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "minimal", + "low", + "medium", + "high" + ] + } }, "attachment": true, "open_weights": false, - "knowledge": "2024-07-31", - "release_date": "2024-10-22", - "last_updated": "2024-10-22", + "knowledge": "2024-05-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "anthropic/claude-opus-4.1", - "name": "Claude-Opus-4.1", - "display_name": "Claude-Opus-4.1", + "id": "glm-5.3-flash", + "name": "GLM5.3 Flash", + "display_name": "GLM5.3 Flash", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 196608, - "output": 32000 + "context": 1048576, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-03-31", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", - "type": "chat" - }, - { - "id": "anthropic/claude-sonnet-3.5", - "name": "Claude-Sonnet-3.5", - "display_name": "Claude-Sonnet-3.5", - "modalities": { - "input": [ - "text", - "image", - "pdf" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 189096, - "output": 8192 - }, - "temperature": false, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-04-30", - "release_date": "2024-10-22", - "last_updated": "2024-10-22", + "attachment": false, + "open_weights": true, + "release_date": "2026-08-26", + "last_updated": "2026-08-26", "type": "chat" }, { - "id": "anthropic/claude-opus-4", - "name": "Claude-Opus-4", - "display_name": "Claude-Opus-4", + "id": "openai-o3", + "name": "OpenAI o3", + "display_name": "OpenAI o3", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 192512, - "output": 28672 + "context": 200000, + "output": 100000 }, "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + "effort_options": [ + "low", + "medium", + "high" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-03-31", - "release_date": "2025-05-22", - "last_updated": "2025-05-22", + "knowledge": "2024-05", + "release_date": "2025-04-16", + "last_updated": "2025-04-16", "type": "chat" }, { - "id": "anthropic/claude-opus-4.5", - "name": "Claude-Opus-4.5", - "display_name": "Claude-Opus-4.5", + "id": "arcee-trinity-large-thinking", + "name": "Arcee Trinity Large Thinking (Public Preview)", + "display_name": "Arcee Trinity Large Thinking (Public Preview)", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 196608, - "output": 64000 + "context": 128000, + "output": 32000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", "effort_options": [ "low", "medium", "high" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-05", - "release_date": "2025-11-24", - "last_updated": "2025-11-24", + "attachment": false, + "open_weights": true, + "release_date": "2026-04-01", + "last_updated": "2026-05-28", "type": "chat" }, { - "id": "anthropic/claude-sonnet-4.6", - "name": "Claude-Sonnet-4.6", - "display_name": "Claude-Sonnet-4.6", + "id": "anthropic-claude-fable-5", + "name": "Anthropic Claude Fable 5", + "display_name": "Anthropic Claude Fable 5", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 983040, + "context": 1000000, "output": 128000 }, "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, + "default_enabled": true, + "mode": "effort", "effort": "high", "effort_options": [ "low", "medium", "high", + "xhigh", "max" ], "interleaved": true, "summaries": true, - "visibility": "summary", + "visibility": "omitted", "continuation": [ "thinking_blocks" ], "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." + "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", + "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", + "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-17", - "last_updated": "2026-03-13", + "knowledge": "2026-01-31", + "release_date": "2026-06-09", + "last_updated": "2026-06-09", "type": "chat" }, { - "id": "anthropic/claude-sonnet-4.5", - "name": "Claude-Sonnet-4.5", - "display_name": "Claude-Sonnet-4.5", + "id": "openai-gpt-image-2", + "name": "OpenAI GPT Image 2", + "display_name": "OpenAI GPT Image 2", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ + "image", "text" ] }, "limit": { - "context": 983040, - "output": 32768 + "context": 8192, + "output": 16384 }, "temperature": false, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." - ] - } + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2025-07-31", - "release_date": "2025-09-29", - "last_updated": "2025-09-29", - "type": "chat" + "release_date": "2026-04-21", + "last_updated": "2026-04-21" }, { - "id": "novita/glm-5", - "name": "GLM-5", - "display_name": "GLM-5", + "id": "deepseek-v4-pro-0813", + "name": "DeepSeek V4 Pro 0813", + "display_name": "DeepSeek V4 Pro 0813", "modalities": { "input": [ "text" @@ -5089,8 +5350,8 @@ ] }, "limit": { - "context": 205000, - "output": 131072 + "context": 1048576, + "output": 1048576 }, "temperature": true, "tool_call": true, @@ -5101,30 +5362,31 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "none", + "low", + "high", + "max" ] } }, "attachment": false, "open_weights": true, - "release_date": "2026-02-12", - "last_updated": "2026-02-12", + "release_date": "2026-08-13", + "last_updated": "2026-08-22", "type": "chat" }, { - "id": "novita/glm-4.6", - "name": "GLM-4.6", - "display_name": "GLM-4.6", + "id": "openai-gpt-image-1", + "name": "GPT Image 1", + "display_name": "GPT Image 1", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ - "text" + "image" ] }, "limit": { @@ -5132,134 +5394,136 @@ "output": 8192 }, "temperature": false, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "attachment": true, + "open_weights": false, + "release_date": "2025-04-24", + "last_updated": "2025-04-24" + }, + { + "id": "fal-ai/fast-sdxl", + "name": "Fast SDXL", + "display_name": "Fast SDXL", + "modalities": { + "input": [ + "text" + ], + "output": [ + "image" + ] + }, + "limit": { + "context": 8192, + "output": 8192 + }, + "temperature": false, + "tool_call": false, + "reasoning": { + "supported": false }, "attachment": false, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-09-30", - "last_updated": "2025-09-30", - "type": "chat" + "release_date": "2023-07-26", + "last_updated": "2026-04-16" }, { - "id": "novita/glm-4.7-n", - "name": "glm-4.7-n", - "display_name": "glm-4.7-n", + "id": "fal-ai/stable-audio-25/text-to-audio", + "name": "Stable Audio 2.5 (Text-to-Audio)", + "display_name": "Stable Audio 2.5 (Text-to-Audio)", "modalities": { "input": [ "text" ], "output": [ - "text" + "audio" ] }, "limit": { - "context": 205000, - "output": 131072 + "context": 8192, + "output": 8192 }, "temperature": false, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-12-22", - "last_updated": "2025-12-22", - "type": "chat" + "open_weights": false, + "release_date": "2025-10-08", + "last_updated": "2026-04-16" }, { - "id": "novita/kimi-k2-thinking", - "name": "kimi-k2-thinking", - "display_name": "kimi-k2-thinking", + "id": "fal-ai/flux/schnell", + "name": "FLUX.1 [schnell]", + "display_name": "FLUX.1 [schnell]", "modalities": { "input": [ "text" ], "output": [ - "text" + "image" ] }, "limit": { - "context": 256000, + "context": 8192, "output": 8192 }, "temperature": false, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": false, "open_weights": true, - "knowledge": "2024-08", - "release_date": "2025-11-06", - "last_updated": "2025-11-06", - "type": "chat" + "release_date": "2024-08-01", + "last_updated": "2026-04-16" }, { - "id": "novita/minimax-m2.1", - "name": "minimax-m2.1", - "display_name": "minimax-m2.1", + "id": "fal-ai/elevenlabs/tts/multilingual-v2", + "name": "ElevenLabs Multilingual TTS v2", + "display_name": "ElevenLabs Multilingual TTS v2", "modalities": { "input": [ "text" ], "output": [ - "text" + "audio" ] }, "limit": { - "context": 205000, - "output": 131072 + "context": 8192, + "output": 8192 }, "temperature": false, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, "attachment": false, - "open_weights": true, - "release_date": "2025-12-23", - "last_updated": "2025-12-23", - "type": "chat" - }, + "open_weights": false, + "release_date": "2023-08-22", + "last_updated": "2023-08-22" + } + ] + }, + "amd": { + "id": "amd", + "name": "AMD", + "display_name": "AMD", + "api": "https://developer.amd.com.cn/radeon/api/v1", + "doc": "https://developer.amd.com.cn/radeon/tokenfactory", + "models": [ { - "id": "novita/kimi-k2.6", - "name": "Kimi-K2.6", - "display_name": "Kimi-K2.6", + "id": "MiniCPM-V-4.7-35B-A3B", + "name": "MiniCPM-V 4.7 35B-A3B", + "display_name": "MiniCPM-V 4.7 35B-A3B", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" @@ -5275,65 +5539,55 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, "attachment": true, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2026-04-20", - "last_updated": "2026-04-20", + "release_date": "2026-10-07", + "last_updated": "2026-10-07", "type": "chat" }, { - "id": "novita/glm-4.6v", - "name": "glm-4.6v", - "display_name": "glm-4.6v", + "id": "MiniCPM5-2B", + "name": "MiniCPM5-2B", + "display_name": "MiniCPM5-2B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 131000, - "output": 32768 + "context": 131072, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-12-08", - "last_updated": "2025-12-08", + "release_date": "2026-09-06", + "last_updated": "2026-09-12", "type": "chat" }, { - "id": "novita/kimi-k2.5", - "name": "Kimi-K2.5", - "display_name": "Kimi-K2.5", + "id": "GLM-5.3-Flash", + "name": "GLM-5.3-Flash", + "display_name": "GLM-5.3-Flash", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 262144 + "context": 262144, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -5344,35 +5598,34 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "low", + "high", + "max" ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-01-27", - "last_updated": "2026-01-27", + "release_date": "2026-08-26", + "last_updated": "2026-08-26", "type": "chat" }, { - "id": "novita/glm-4.7", - "name": "glm-4.7", - "display_name": "glm-4.7", + "id": "MiMo-V2.6-Flash", + "name": "MiMo-V2.6-Flash", + "display_name": "MiMo-V2.6-Flash", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 205000, + "context": 1048576, "output": 131072 }, "temperature": true, @@ -5381,39 +5634,28 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-12-22", - "last_updated": "2025-12-22", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "novita/deepseek-v3.2", - "name": "DeepSeek-V3.2", - "display_name": "DeepSeek-V3.2", + "id": "Gemma-4-31B-IT", + "name": "Gemma 4 31B IT", + "display_name": "Gemma 4 31B IT", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 262144, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -5426,17 +5668,17 @@ "supported": true } }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2024-07", - "release_date": "2025-12-01", - "last_updated": "2025-12-01", + "knowledge": "2025-01", + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "novita/glm-4.7-flash", - "name": "glm-4.7-flash", - "display_name": "glm-4.7-flash", + "id": "DeepSeek-V4-Flash", + "name": "DeepSeek V4 Flash 0731", + "display_name": "DeepSeek V4 Flash 0731", "modalities": { "input": [ "text" @@ -5446,10 +5688,10 @@ ] }, "limit": { - "context": 200000, - "output": 65500 + "context": 1048576, + "output": 384000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -5457,20 +5699,37 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "high", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." + ] } }, "attachment": false, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2026-01-19", - "last_updated": "2026-01-19", + "knowledge": "2025-05", + "release_date": "2026-07-31", + "last_updated": "2026-07-31", "type": "chat" }, { - "id": "fireworks-ai/kimi-k2.5-fw", - "name": "Kimi-K2.5-FW", - "display_name": "Kimi-K2.5-FW", + "id": "DeepSeek-V4-Flash-Vision-Exp", + "name": "DeepSeek V4 Flash Vision Exp", + "display_name": "DeepSeek V4 Flash Vision Exp", "modalities": { "input": [ "text", @@ -5481,51 +5740,61 @@ ] }, "limit": { - "context": 262144, - "output": 16384 + "context": 1000000, + "output": 384000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "high", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." + ] + } }, "attachment": true, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-01-27", - "last_updated": "2026-01-27", + "release_date": "2026-08-21", + "last_updated": "2026-09-01", "type": "chat" - } - ] - }, - "ofox": { - "id": "ofox", - "name": "Ofox", - "display_name": "Ofox", - "api": "https://api.ofox.ai/v1", - "doc": "https://ofox.ai/docs", - "models": [ + }, { - "id": "google/gemini-4-argon", - "name": "Gemini 4 Argon", - "display_name": "Gemini 4 Argon", + "id": "Qwen3.8-27B", + "name": "Qwen3.8 27B", + "display_name": "Qwen3.8 27B", "modalities": { "input": [ "text", - "image", - "video", - "audio", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 262144, + "output": 32768 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -5533,39 +5802,36 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "interleaved": true, "effort_options": [ "low", - "medium", - "high" + "medium" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-10-13", - "last_updated": "2026-10-13", + "open_weights": true, + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "google/gemini-2.5-pro", - "name": "Gemini 2.5 Pro", - "display_name": "Gemini 2.5 Pro", + "id": "Qwen3.8-Flash-Next", + "name": "Qwen3.8 Flash Next", + "display_name": "Qwen3.8 Flash Next", "modalities": { "input": [ "text", - "image", - "audio", - "video", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 262144, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -5575,41 +5841,56 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "budget", - "budget": { - "default": -1, - "min": 128, - "max": 32768, - "auto": -1, - "unit": "tokens" - }, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" + "effort_options": [ + "low", + "medium", + "xhigh" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-06-17", - "last_updated": "2025-06-17", + "open_weights": true, + "release_date": "2026-08-27", + "last_updated": "2026-08-27", "type": "chat" }, { - "id": "google/gemini-3.5-flash", - "name": "Gemini 3.5 Flash", - "display_name": "Gemini 3.5 Flash", + "id": "MiniCPM-V-4.7-1B", + "name": "MiniCPM-V 4.7 1B", + "display_name": "MiniCPM-V 4.7 1B", "modalities": { "input": [ "text", - "image", - "video", - "audio", - "pdf" + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 262144, + "output": 262144 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "attachment": true, + "open_weights": true, + "release_date": "2026-10-06", + "last_updated": "2026-10-06", + "type": "chat" + }, + { + "id": "DeepSeek-V4.1-Flash", + "name": "DeepSeek V4.1 Flash", + "display_name": "DeepSeek V4.1 Flash", + "modalities": { + "input": [ + "text", + "image" ], "output": [ "text" @@ -5617,7 +5898,7 @@ }, "limit": { "context": 1048576, - "output": 65536 + "output": 384000 }, "temperature": true, "tool_call": true, @@ -5628,48 +5909,48 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ + "effort_options": [ + "none", "minimal", "low", "medium", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" + "high", + "xhigh", + "max" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-05-19", - "last_updated": "2026-05-19", + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-10-17", + "last_updated": "2026-10-17", "type": "chat" - }, + } + ] + }, + "sarvam": { + "id": "sarvam", + "name": "Sarvam AI", + "display_name": "Sarvam AI", + "api": "https://api.sarvam.ai/v1", + "doc": "https://docs.sarvam.ai/api-reference-docs/getting-started/models", + "models": [ { - "id": "google/gemini-3.5-flash-lite", - "name": "Gemini 3.5 Flash Lite", - "display_name": "Gemini 3.5 Flash Lite", + "id": "sarvam-105b", + "name": "Sarvam-105B", + "display_name": "Sarvam-105B", "modalities": { "input": [ - "text", - "image", - "video", - "audio", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 131072, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -5680,39 +5961,39 @@ "extra_capabilities": { "reasoning": { "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ - "minimal", "low", "medium", "high" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-07-21", - "last_updated": "2026-07-21", + "attachment": false, + "open_weights": true, + "release_date": "2026-02-18", + "last_updated": "2026-02-18", "type": "chat" }, { - "id": "google/gemini-3.1-pro-preview", - "name": "Gemini 3.1 Pro Preview", - "display_name": "Gemini 3.1 Pro Preview", + "id": "sarvam-30b", + "name": "Sarvam-30B", + "display_name": "Sarvam-30B", "modalities": { "input": [ - "text", - "image", - "video", - "audio", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, + "context": 65536, "output": 65536 }, "temperature": true, @@ -5724,37 +6005,69 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "low", - "high" - ], + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" + ], + "effort_options": [ + "low", + "medium", + "high" ] } }, + "attachment": false, + "open_weights": true, + "release_date": "2026-02-18", + "last_updated": "2026-02-18", + "type": "chat" + } + ] + }, + "xai": { + "id": "xai", + "name": "xai", + "display_name": "xai", + "doc": "https://docs.x.ai/docs/models", + "models": [ + { + "id": "grok-imagine-video", + "name": "Grok Imagine Video", + "display_name": "Grok Imagine Video", + "modalities": { + "input": [ + "text", + "image", + "video" + ], + "output": [ + "video" + ] + }, + "limit": { + "context": 1024, + "output": 8192 + }, + "temperature": false, + "tool_call": false, + "reasoning": { + "supported": false + }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-02-19", - "last_updated": "2026-02-19", - "type": "chat" + "release_date": "2026-01-28", + "last_updated": "2026-01-28" }, { - "id": "google/gemini-2.5-flash", - "name": "Gemini 2.5 Flash", - "display_name": "Gemini 2.5 Flash", + "id": "grok-build-0.1", + "name": "Grok Build 0.1", + "display_name": "Grok Build 0.1", "modalities": { "input": [ "text", "image", - "audio", - "video", "pdf" ], "output": [ @@ -5762,8 +6075,8 @@ ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 256000, + "output": 256000 }, "temperature": true, "tool_call": true, @@ -5773,40 +6086,50 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "budget", - "budget": { - "default": -1, - "min": 0, - "max": 24576, - "auto": -1, - "off": 0, - "unit": "tokens" - }, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] + "supported": true } }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-06-17", - "last_updated": "2025-06-17", + "release_date": "2026-04-16", + "last_updated": "2026-04-16", "type": "chat" }, { - "id": "google/gemini-3.8-flash", - "name": "Gemini 3.8 Flash", - "display_name": "Gemini 3.8 Flash", + "id": "grok-imagine-image", + "name": "Grok Imagine Image", + "display_name": "Grok Imagine Image", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "image" + ] + }, + "limit": { + "context": 16000, + "output": 8192 + }, + "temperature": false, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": false, + "release_date": "2026-01-28", + "last_updated": "2026-01-28" + }, + { + "id": "grok-4.6", + "name": "Grok 4.6", + "display_name": "Grok 4.6", "modalities": { "input": [ "text", "image", - "audio", "pdf" ], "output": [ @@ -5814,8 +6137,8 @@ ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 500000, + "output": 500000 }, "temperature": true, "tool_call": true, @@ -5826,38 +6149,29 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", + "effort_options": [ "low", "medium", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" + "high", + "xhigh" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-09-02", - "last_updated": "2026-09-02", + "knowledge": "2026-02-01", + "release_date": "2026-08-12", + "last_updated": "2026-08-12", "type": "chat" }, { - "id": "google/gemini-3.7-flash", - "name": "Gemini 3.7 Flash", - "display_name": "Gemini 3.7 Flash", + "id": "grok-4.20-0309-reasoning", + "name": "Grok 4.20 (Reasoning)", + "display_name": "Grok 4.20 (Reasoning)", "modalities": { "input": [ "text", "image", - "video", - "audio", "pdf" ], "output": [ @@ -5865,8 +6179,8 @@ ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 1000000, + "output": 30000 }, "temperature": true, "tool_call": true, @@ -5874,42 +6188,20 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", - "low", - "medium", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] - } - }, "attachment": true, "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-08-13", - "last_updated": "2026-08-13", + "release_date": "2026-03-09", + "last_updated": "2026-03-09", "type": "chat" }, { - "id": "google/gemini-2.5-flash-lite", - "name": "Gemini 2.5 Flash-Lite", - "display_name": "Gemini 2.5 Flash-Lite", + "id": "grok-4.20-0309-non-reasoning", + "name": "Grok 4.20 (Non-Reasoning)", + "display_name": "Grok 4.20 (Non-Reasoning)", "modalities": { "input": [ "text", "image", - "audio", - "video", "pdf" ], "output": [ @@ -5917,51 +6209,28 @@ ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 1000000, + "output": 30000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "default": -1, - "min": 512, - "max": 24576, - "auto": -1, - "unit": "tokens" - }, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] - } + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-06-17", - "last_updated": "2025-06-17", + "release_date": "2026-03-09", + "last_updated": "2026-03-09", "type": "chat" }, { - "id": "google/gemini-3-flash-preview", - "name": "Gemini 3 Flash Preview", - "display_name": "Gemini 3 Flash Preview", + "id": "grok-4.5", + "name": "Grok 4.5", + "display_name": "Grok 4.5", "modalities": { "input": [ "text", "image", - "video", - "audio", "pdf" ], "output": [ @@ -5969,8 +6238,8 @@ ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 500000, + "output": 500000 }, "temperature": true, "tool_call": true, @@ -5981,39 +6250,28 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", + "effort_options": [ "low", "medium", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" + "high", + "xhigh" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-12-17", - "last_updated": "2025-12-17", + "release_date": "2026-07-08", + "last_updated": "2026-07-08", "type": "chat" }, { - "id": "google/gemini-3.6-flash", - "name": "Gemini 3.6 Flash", - "display_name": "Gemini 3.6 Flash", + "id": "grok-4.20-multi-agent-0309", + "name": "Grok 4.20 Multi-Agent", + "display_name": "Grok 4.20 Multi-Agent", "modalities": { "input": [ "text", "image", - "video", - "audio", "pdf" ], "output": [ @@ -6021,11 +6279,11 @@ ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 1000000, + "output": 30000 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true @@ -6033,39 +6291,110 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", + "effort_options": [ "low", "medium", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" + "high", + "xhigh" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-07-21", - "last_updated": "2026-07-21", + "release_date": "2026-03-09", + "last_updated": "2026-03-09", "type": "chat" }, { - "id": "google/gemini-3.1-flash-lite", - "name": "Gemini 3.1 Flash Lite", - "display_name": "Gemini 3.1 Flash Lite", + "id": "grok-imagine-video-1.5-lite", + "name": "Grok Imagine Video 1.5 Lite", + "display_name": "Grok Imagine Video 1.5 Lite", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "video" + ] + }, + "limit": { + "context": 1024, + "output": 8192 + }, + "temperature": false, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": false, + "release_date": "2026-10-01", + "last_updated": "2026-10-01" + }, + { + "id": "grok-imagine-image-quality", + "name": "Grok Imagine Image Quality", + "display_name": "Grok Imagine Image Quality", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "image" + ] + }, + "limit": { + "context": 16000, + "output": 8192 + }, + "temperature": false, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": false, + "release_date": "2026-04-03", + "last_updated": "2026-04-03" + }, + { + "id": "grok-imagine-video-1.5", + "name": "Grok Imagine Video 1.5", + "display_name": "Grok Imagine Video 1.5", + "modalities": { + "input": [ + "text", + "image", + "audio" + ], + "output": [ + "video" + ] + }, + "limit": { + "context": 1024, + "output": 8192 + }, + "temperature": false, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": false, + "release_date": "2026-05-30", + "last_updated": "2026-05-30" + }, + { + "id": "grok-4.3", + "name": "Grok 4.3", + "display_name": "Grok 4.3", "modalities": { "input": [ "text", "image", - "video", - "audio", "pdf" ], "output": [ @@ -6073,8 +6402,8 @@ ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 1000000, + "output": 30000 }, "temperature": true, "tool_call": true, @@ -6086,35 +6415,37 @@ "reasoning": { "supported": true, "effort_options": [ - "minimal", + "none", "low", "medium", - "high" + "high", + "xhigh" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-05-07", - "last_updated": "2026-05-07", + "release_date": "2026-04-17", + "last_updated": "2026-04-17", "type": "chat" }, { - "id": "minimax/minimax-m2", - "name": "MiniMax-M2", - "display_name": "MiniMax-M2", + "id": "grok-4.7", + "name": "Grok 4.7", + "display_name": "Grok 4.7", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 500000, + "output": 500000 }, "temperature": true, "tool_call": true, @@ -6122,16 +6453,27 @@ "supported": true, "default": true }, - "attachment": false, - "open_weights": true, - "release_date": "2025-10-27", - "last_updated": "2025-10-27", + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "high", + "xhigh" + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2026-05", + "release_date": "2026-09-21", + "last_updated": "2026-09-21", "type": "chat" }, { - "id": "minimax/minimax-m2.5", - "name": "MiniMax-M2.5", - "display_name": "MiniMax-M2.5", + "id": "grok-3-mini-fast-beta", + "name": "Grok 3 Mini Fast Beta", + "display_name": "Grok 3 Mini Fast Beta", "modalities": { "input": [ "text" @@ -6141,30 +6483,26 @@ ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 120000, + "output": 100000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": true, + "effort": "low" }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "search": { + "supported": false }, "attachment": false, - "open_weights": true, - "release_date": "2026-02-12", - "last_updated": "2026-02-12", "type": "chat" }, { - "id": "minimax/minimax-m2.1", - "name": "MiniMax-M2.1", - "display_name": "MiniMax-M2.1", + "id": "grok-3-mini-beta", + "name": "Grok 3 Mini Beta", + "display_name": "Grok 3 Mini Beta", "modalities": { "input": [ "text" @@ -6174,30 +6512,26 @@ ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 120000, + "output": 100000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": true, + "effort": "low" }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "search": { + "supported": false }, "attachment": false, - "open_weights": true, - "release_date": "2025-12-23", - "last_updated": "2025-12-23", "type": "chat" }, { - "id": "minimax/minimax-m2.1-lightning", - "name": "MiniMax-M2.1 Lightning", - "display_name": "MiniMax-M2.1 Lightning", + "id": "grok-3-fast-beta", + "name": "Grok 3 Fast Beta", + "display_name": "Grok 3 Fast Beta", "modalities": { "input": [ "text" @@ -6207,88 +6541,80 @@ ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 120000, + "output": 100000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false + }, + "search": { + "supported": false }, "attachment": false, - "open_weights": true, - "release_date": "2025-12-23", - "last_updated": "2025-12-23", "type": "chat" }, { - "id": "minimax/minimax-m2.5-lightning", - "name": "MiniMax-M2.5 Lightning", - "display_name": "MiniMax-M2.5 Lightning", + "id": "grok-2-vision-1212", + "name": "Grok 2 Vision 1212", + "display_name": "Grok 2 Vision 1212", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 32000, + "output": 32000 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false + }, + "search": { + "supported": false }, "attachment": false, - "open_weights": true, - "release_date": "2026-02-13", - "last_updated": "2026-02-13", "type": "chat" }, { - "id": "minimax/minimax-m3", - "name": "MiniMax-M3", - "display_name": "MiniMax-M3", + "id": "grok-2-image-1212", + "name": "Grok 2 Image 1212", + "display_name": "Grok 2 Image 1212", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 512000 + "context": 130000, + "output": 100000 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "search": { + "supported": false }, - "attachment": true, - "open_weights": true, - "release_date": "2026-06-01", - "last_updated": "2026-06-01", + "attachment": false, "type": "chat" }, { - "id": "minimax/minimax-m2.7", - "name": "MiniMax-M2.7", - "display_name": "MiniMax-M2.7", + "id": "grok-3-beta", + "name": "Grok 3 Beta", + "display_name": "Grok 3 Beta", "modalities": { "input": [ "text" @@ -6298,36 +6624,24 @@ ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 120000, + "output": 100000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "search": { + "supported": false }, "attachment": false, - "open_weights": true, - "release_date": "2026-03-18", - "last_updated": "2026-03-18", "type": "chat" }, { - "id": "minimax/minimax-m2.7-highspeed", - "name": "MiniMax-M2.7-highspeed", - "display_name": "MiniMax-M2.7-highspeed", + "id": "grok-2-1212", + "name": "Grok 2 1212", + "display_name": "Grok 2 1212", "modalities": { "input": [ "text" @@ -6337,36 +6651,33 @@ ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 120000, + "output": 100000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "search": { + "supported": false }, "attachment": false, - "open_weights": true, - "release_date": "2026-03-18", - "last_updated": "2026-03-18", "type": "chat" - }, + } + ] + }, + "crusoe": { + "id": "crusoe", + "name": "Crusoe", + "display_name": "Crusoe", + "api": "https://api.inference.crusoecloud.com/v1", + "doc": "https://docs.crusoecloud.com/managed-inference/overview", + "models": [ { - "id": "minimax/m2-her", - "name": "MiniMax-M2 Her", - "display_name": "MiniMax-M2 Her", + "id": "meta-llama/Llama-3.3-70B-Instruct", + "name": "Llama-3.3-70B-Instruct", + "display_name": "Llama-3.3-70B-Instruct", "modalities": { "input": [ "text" @@ -6376,37 +6687,35 @@ ] }, "limit": { - "context": 65536, - "output": 2048 + "context": 128000, + "output": 4096 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2026-01-23", - "last_updated": "2026-01-23", + "open_weights": true, + "knowledge": "2023-12", + "release_date": "2024-12-06", + "last_updated": "2024-12-06", "type": "chat" }, { - "id": "bailian/qwen3.8-27b", - "name": "Qwen3.8 27B", - "display_name": "Qwen3.8 27B", + "id": "zai/GLM-5.2", + "name": "GLM-5.2", + "display_name": "GLM-5.2", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1131072, + "context": 1000000, "output": 131072 }, "temperature": true, @@ -6415,28 +6724,33 @@ "supported": true, "default": true }, - "attachment": true, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true + } + }, + "attachment": false, "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "bailian/qwen3.5-397b-a17b", - "name": "Qwen3.5 397B-A17B", - "display_name": "Qwen3.5 397B-A17B", + "id": "zai/GLM-5.1", + "name": "GLM-5.1", + "display_name": "GLM-5.1", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 64000 + "context": 200000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -6447,24 +6761,19 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "interleaved": true } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-02-15", - "last_updated": "2026-02-15", + "release_date": "2026-04-07", + "last_updated": "2026-04-07", "type": "chat" }, { - "id": "bailian/qwen3.7-plus", - "name": "Qwen3.7 Plus", - "display_name": "Qwen3.7 Plus", + "id": "moonshotai/Kimi-K2.6", + "name": "Kimi K2.6", + "display_name": "Kimi K2.6", "modalities": { "input": [ "text", @@ -6476,8 +6785,8 @@ ] }, "limit": { - "context": 1000000, - "output": 64000 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, @@ -6487,20 +6796,21 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-04", - "release_date": "2026-06-02", - "last_updated": "2026-06-02", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-04-20", + "last_updated": "2026-04-20", "type": "chat" }, { - "id": "bailian/qwen-max", - "name": "Qwen Max", - "display_name": "Qwen Max", + "id": "openai/gpt-oss-120b", + "name": "GPT OSS 120B", + "display_name": "GPT OSS 120B", "modalities": { "input": [ "text" @@ -6510,37 +6820,50 @@ ] }, "limit": { - "context": 32768, - "output": 8192 + "context": 131072, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "effort_options": [ + "low", + "medium", + "high" + ] + } }, "attachment": false, - "open_weights": false, - "knowledge": "2024-04", - "release_date": "2024-04-03", - "last_updated": "2025-01-25", + "open_weights": true, + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "bailian/qwen3.5-35b-a3b", - "name": "Qwen3.5 35B-A3B", - "display_name": "Qwen3.5 35B-A3B", + "id": "nvidia/Nemotron-3-Nano-Omni-Reasoning-30B-A3B", + "name": "Nemotron 3 Nano Omni 30B A3B Reasoning", + "display_name": "Nemotron 3 Nano Omni 30B A3B Reasoning", "modalities": { "input": [ "text", "image", - "video" + "video", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 262144, + "context": 256000, "output": 65536 }, "temperature": true, @@ -6552,24 +6875,19 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "interleaved": true } }, "attachment": true, "open_weights": true, - "release_date": "2026-02-23", - "last_updated": "2026-02-23", + "release_date": "2026-04-28", + "last_updated": "2026-04-28", "type": "chat" }, { - "id": "bailian/qwen3.6-max-preview", - "name": "Qwen3.6 Max Preview", - "display_name": "Qwen3.6 Max Preview", + "id": "nvidia/NVIDIA-Nemotron-3-Super-120B-A12B", + "name": "Nemotron 3 Super 120B A12B", + "display_name": "Nemotron 3 Super 120B A12B", "modalities": { "input": [ "text" @@ -6580,7 +6898,7 @@ }, "limit": { "context": 262144, - "output": 65536 + "output": 262144 }, "temperature": true, "tool_call": true, @@ -6590,40 +6908,31 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, "attachment": false, - "open_weights": false, - "knowledge": "2025-04", - "release_date": "2026-04-20", - "last_updated": "2026-04-20", + "open_weights": true, + "knowledge": "2025-06", + "release_date": "2026-03-11", + "last_updated": "2026-03-11", "type": "chat" }, { - "id": "bailian/qwen3.8-max", - "name": "Qwen3.8 Max", - "display_name": "Qwen3.8 Max", + "id": "nvidia/NVIDIA-Nemotron-3-Nano-30B-A3B", + "name": "Nemotron 3 Nano 30B A3B", + "display_name": "Nemotron 3 Nano 30B A3B", "modalities": { "input": [ - "text", - "image", - "video", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, @@ -6631,26 +6940,17 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "low", - "medium", - "xhigh" - ] - } - }, - "attachment": true, - "open_weights": false, - "release_date": "2026-08-03", - "last_updated": "2026-08-03", + "attachment": false, + "open_weights": true, + "knowledge": "2025-06-25", + "release_date": "2025-12-15", + "last_updated": "2025-12-15", "type": "chat" }, { - "id": "bailian/qwen3-coder-next", - "name": "Qwen3 Coder Next", - "display_name": "Qwen3 Coder Next", + "id": "Qwen/Qwen3-235B-A22B-Instruct-2507", + "name": "Qwen3 235B-A22B Instruct 2507", + "display_name": "Qwen3 235B-A22B Instruct 2507", "modalities": { "input": [ "text" @@ -6661,7 +6961,7 @@ }, "limit": { "context": 262144, - "output": 65536 + "output": 16384 }, "temperature": true, "tool_call": true, @@ -6670,20 +6970,45 @@ }, "attachment": false, "open_weights": true, - "knowledge": "2025-09", - "release_date": "2026-02-03", - "last_updated": "2026-02-03", + "release_date": "2025-07-21", + "last_updated": "2025-07-21", "type": "chat" }, { - "id": "bailian/qwen3.5-27b", - "name": "Qwen3.5 27B", - "display_name": "Qwen3.5 27B", + "id": "deepseek-ai/DeepSeek-V3-0324", + "name": "DeepSeek V3 0324", + "display_name": "DeepSeek V3 0324", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 163840, + "output": 163840 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "release_date": "2025-03-24", + "last_updated": "2025-03-24", + "type": "chat" + }, + { + "id": "google/gemma-4-31b-it", + "name": "Gemma 4 31B IT", + "display_name": "Gemma 4 31B IT", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" @@ -6691,7 +7016,7 @@ }, "limit": { "context": 262144, - "output": 65536 + "output": 32768 }, "temperature": true, "tool_call": true, @@ -6701,38 +7026,42 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, "attachment": true, "open_weights": true, - "release_date": "2026-02-23", - "last_updated": "2026-02-23", + "knowledge": "2025-01", + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" - }, + } + ] + }, + "neuralwatt": { + "id": "neuralwatt", + "name": "Neuralwatt", + "display_name": "Neuralwatt", + "api": "https://api.neuralwatt.com/v1", + "doc": "https://portal.neuralwatt.com/docs", + "models": [ { - "id": "bailian/qwen3.5-plus", - "name": "Qwen3.5 Plus", - "display_name": "Qwen3.5 Plus", + "id": "mimo-v2.6-pro-flex", + "name": "MiMo-V2.6-Pro Flex", + "display_name": "MiMo-V2.6-Pro Flex", "modalities": { "input": [ "text", "image", - "video" + "audio" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 1048560, + "output": 393216 }, "temperature": true, "tool_call": true, @@ -6744,39 +7073,36 @@ "reasoning": { "supported": true, "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "none", + "high" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-04", - "release_date": "2026-02-16", - "last_updated": "2026-02-16", + "open_weights": true, + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "bailian/qwen3.5-flash", - "name": "Qwen3.5 Flash", - "display_name": "Qwen3.5 Flash", + "id": "kimi-k2.7-code-fast", + "name": "Kimi K2.7 Code Fast", + "display_name": "Kimi K2.7 Code Fast", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 262128, + "output": 262128 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -6785,37 +7111,31 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "interleaved": true } }, "attachment": true, - "open_weights": false, - "release_date": "2026-02-23", - "last_updated": "2026-02-23", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-06-12", + "last_updated": "2026-06-12", "type": "chat" }, { - "id": "bailian/qwen3.6-plus", - "name": "Qwen3.6 Plus", - "display_name": "Qwen3.6 Plus", + "id": "deepseek-v4-flash", + "name": "DeepSeek V4 Flash", + "display_name": "DeepSeek V4 Flash", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 1048560, + "output": 393216 }, "temperature": true, "tool_call": true, @@ -6826,38 +7146,48 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "high", + "max" + ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "notes": [ + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-04", - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "bailian/qwen3.6-flash", - "name": "Qwen3.6 Flash", - "display_name": "Qwen3.6 Flash", + "id": "qwen-3.8-27b-flex", + "name": "Qwen3.8 27B Flex", + "display_name": "Qwen3.8 27B Flex", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 262128, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -6869,90 +7199,103 @@ "reasoning": { "supported": true, "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "none", + "low", + "medium", + "xhigh" ] } }, "attachment": true, - "open_weights": false, - "release_date": "2026-04-27", - "last_updated": "2026-04-27", + "open_weights": true, + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "bailian/qwen3-coder-flash", - "name": "Qwen3 Coder Flash", - "display_name": "Qwen3 Coder Flash", + "id": "kimi-k2.7-code-flex", + "name": "Kimi K2.7 Code Flex", + "display_name": "Kimi K2.7 Code Flex", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 262128, + "output": 262128 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": false, - "knowledge": "2025-04", - "release_date": "2025-07-28", - "last_updated": "2025-07-28", + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true + } + }, + "attachment": true, + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-06-12", + "last_updated": "2026-06-12", "type": "chat" }, { - "id": "bailian/qwen-turbo", - "name": "Qwen Turbo", - "display_name": "Qwen Turbo", + "id": "deepseek-v4.1-flash", + "name": "DeepSeek V4.1 Flash", + "display_name": "DeepSeek V4.1 Flash", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 1048560, + "output": 393216 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "none", + "low", + "high", + "xhigh", + "max" ] } }, - "attachment": false, - "open_weights": false, - "knowledge": "2024-04", - "release_date": "2024-11-01", - "last_updated": "2025-04-28", + "attachment": true, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-10-17", + "last_updated": "2026-10-17", "type": "chat" }, { - "id": "bailian/qwen3-max", - "name": "Qwen3 Max", - "display_name": "Qwen3 Max", + "id": "glm-5.3", + "name": "GLM 5.3", + "display_name": "GLM 5.3", "modalities": { "input": [ "text" @@ -6962,8 +7305,8 @@ ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 1048560, + "output": 1048560 }, "temperature": true, "tool_call": true, @@ -6975,35 +7318,35 @@ "reasoning": { "supported": true, "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "low", + "high", + "max" ] } }, "attachment": false, - "open_weights": false, - "knowledge": "2025-04", - "release_date": "2025-09-23", - "last_updated": "2025-09-23", + "open_weights": true, + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "bailian/qwen3.7-max", - "name": "Qwen3.7 Max", - "display_name": "Qwen3.7 Max", + "id": "glm-5.3-flash-flex", + "name": "GLM-5.3 Flash Flex", + "display_name": "GLM-5.3 Flash Flex", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 1048560, + "output": 1048560 }, "temperature": true, "tool_call": true, @@ -7013,32 +7356,36 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "effort_options": [ + "low", + "high", + "max" + ] } }, - "attachment": false, - "open_weights": false, - "release_date": "2026-05-21", - "last_updated": "2026-05-21", + "attachment": true, + "open_weights": true, + "release_date": "2026-08-26", + "last_updated": "2026-08-26", "type": "chat" }, { - "id": "bailian/qwen3.6-27b", - "name": "Qwen3.6 27B", - "display_name": "Qwen3.6 27B", + "id": "deepseek-v4-flash-speed", + "name": "DeepSeek V4 Flash (Speed)", + "display_name": "DeepSeek V4 Flash (Speed)", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 64000 + "context": 1048560, + "output": 393216 }, "temperature": true, "tool_call": true, @@ -7050,34 +7397,37 @@ "reasoning": { "supported": true, "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "none", + "high", + "max" ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-04-22", - "last_updated": "2026-04-22", + "knowledge": "2025-05", + "release_date": "2026-07-31", + "last_updated": "2026-07-31", "type": "chat" }, { - "id": "bailian/qwen-flash", - "name": "Qwen Flash", - "display_name": "Qwen Flash", + "id": "mimo-v2.6-pro", + "name": "MiMo-V2.6-Pro", + "display_name": "MiMo-V2.6-Pro", "modalities": { "input": [ - "text" + "text", + "image", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 32768 + "context": 1048560, + "output": 393216 }, "temperature": true, "tool_call": true, @@ -7089,35 +7439,34 @@ "reasoning": { "supported": true, "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "none", + "high" ] } }, - "attachment": false, - "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-07-28", - "last_updated": "2025-07-28", + "attachment": true, + "open_weights": true, + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "bailian/qwen-plus", - "name": "Qwen Plus", - "display_name": "Qwen Plus", + "id": "qwen3.6-35b-fast", + "name": "Qwen3.6 35B Fast", + "display_name": "Qwen3.6 35B Fast", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 32768 + "context": 131056, + "output": 131056 }, "temperature": true, "tool_call": true, @@ -7135,33 +7484,30 @@ ] } }, - "attachment": false, - "open_weights": false, - "knowledge": "2024-04", - "release_date": "2024-01-25", - "last_updated": "2025-09-11", + "attachment": true, + "open_weights": true, + "release_date": "2026-04-17", + "last_updated": "2026-04-17", "type": "chat" }, { - "id": "bailian/qwen3.8-max-0902", - "name": "Qwen3.8 Max 0902", - "display_name": "Qwen3.8 Max 0902", + "id": "kimi-k3-flex", + "name": "Kimi K3 Flex", + "display_name": "Kimi K3 Flex", "modalities": { "input": [ "text", - "image", - "video", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 1048560, + "output": 1048560 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -7169,35 +7515,37 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "interleaved": true, "effort_options": [ + "none", "low", - "medium", - "xhigh" + "high", + "max" ] } }, "attachment": true, - "open_weights": false, - "release_date": "2026-09-02", - "last_updated": "2026-09-02", + "open_weights": true, + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" }, { - "id": "bailian/qwen3.5-122b-a10b", - "name": "Qwen3.5 122B-A10B", - "display_name": "Qwen3.5 122B-A10B", + "id": "glm-5.3-flex", + "name": "GLM 5.3 Flex", + "display_name": "GLM 5.3 Flex", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 64000 + "context": 1048560, + "output": 1048560 }, "temperature": true, "tool_call": true, @@ -7209,51 +7557,59 @@ "reasoning": { "supported": true, "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "low", + "high", + "max" ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-02-23", - "last_updated": "2026-02-23", + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "bailian/qwen3-coder-plus", - "name": "Qwen3 Coder Plus", - "display_name": "Qwen3 Coder Plus", + "id": "kimi-k2.7-code", + "name": "Kimi K2.7 Code", + "display_name": "Kimi K2.7 Code", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 262128, + "output": 262128 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": false, - "knowledge": "2025-04", - "release_date": "2025-07-23", - "last_updated": "2025-07-23", + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true + } + }, + "attachment": true, + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-06-12", + "last_updated": "2026-06-12", "type": "chat" }, { - "id": "bailian/qwen-vl-max", - "name": "Qwen-VL Max", - "display_name": "Qwen-VL Max", + "id": "kimi-k3-fast", + "name": "Kimi K3 Fast", + "display_name": "Kimi K3 Fast", "modalities": { "input": [ "text", @@ -7264,37 +7620,35 @@ ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 1048560, + "output": 1048560 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2024-04", - "release_date": "2024-04-08", - "last_updated": "2025-08-13", + "open_weights": true, + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" }, { - "id": "bailian/qwen3.8-flash", - "name": "Qwen3.8 Flash", - "display_name": "Qwen3.8 Flash", + "id": "qwen-3.8-27b", + "name": "Qwen3.8 27B", + "display_name": "Qwen3.8 27B", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, + "context": 262128, "output": 131072 }, "temperature": true, @@ -7305,34 +7659,39 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "effort_options": [ + "none", + "low", + "medium", + "xhigh" + ] } }, "attachment": true, - "open_weights": false, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", + "open_weights": true, + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "moonshotai/kimi-k2.7-code", - "name": "Kimi K2.7 Code", - "display_name": "Kimi K2.7 Code", + "id": "deepseek-v4-flash-flex", + "name": "DeepSeek V4 Flash Flex", + "display_name": "DeepSeek V4 Flash Flex", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1048560, + "output": 393216 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -7340,33 +7699,38 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "effort_options": [ + "none", + "high", + "max" + ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-06-12", - "last_updated": "2026-06-12", + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "moonshotai/kimi-k2.6", - "name": "Kimi K2.6", - "display_name": "Kimi K2.6", + "id": "qwen3.6-35b", + "name": "Qwen3.6 35B", + "display_name": "Qwen3.6 35B", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 131056, + "output": 131056 }, "temperature": true, "tool_call": true, @@ -7376,35 +7740,43 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "none", + "high" + ] } }, "attachment": true, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-20", - "last_updated": "2026-04-20", + "release_date": "2026-04-17", + "last_updated": "2026-04-17", "type": "chat" }, { - "id": "moonshotai/kimi-k3", - "name": "Kimi K3", - "display_name": "Kimi K3", + "id": "deepseek-v4.1-flash-flex", + "name": "DeepSeek V4.1 Flash Flex", + "display_name": "DeepSeek V4.1 Flash Flex", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 1048560, + "output": 393216 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -7412,34 +7784,42 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "effort_options": [ + "none", + "low", + "high", + "xhigh", + "max" + ] } }, "attachment": true, "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-16", + "knowledge": "2025-05", + "release_date": "2026-10-17", + "last_updated": "2026-10-17", "type": "chat" }, { - "id": "moonshotai/kimi-k2.7-code-highspeed", - "name": "Kimi K2.7 Code Highspeed", - "display_name": "Kimi K2.7 Code Highspeed", + "id": "gemma-4-31b", + "name": "Gemma 4 31B", + "display_name": "Gemma 4 31B", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 262128, + "output": 16384 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -7447,33 +7827,37 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "effort_options": [ + "none", + "max" + ] } }, "attachment": true, "open_weights": true, "knowledge": "2025-01", - "release_date": "2026-06-12", - "last_updated": "2026-06-12", + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "x-ai/grok-4.3", - "name": "Grok 4.3", - "display_name": "Grok 4.3", + "id": "qwen3.6-35b-flex", + "name": "Qwen3.6 35B Flex", + "display_name": "Qwen3.6 35B Flex", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 30000 + "context": 131056, + "output": 131056 }, "temperature": true, "tool_call": true, @@ -7484,24 +7868,28 @@ "extra_capabilities": { "reasoning": { "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ "none", - "low", - "medium", "high" ] } }, "attachment": true, - "open_weights": false, + "open_weights": true, "release_date": "2026-04-17", "last_updated": "2026-04-17", "type": "chat" }, { - "id": "x-ai/grok-4.5", - "name": "Grok 4.5", - "display_name": "Grok 4.5", + "id": "kimi-k3", + "name": "Kimi K3", + "display_name": "Kimi K3", "modalities": { "input": [ "text", @@ -7512,10 +7900,10 @@ ] }, "limit": { - "context": 500000, - "output": 65536 + "context": 1048560, + "output": 1048560 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -7524,66 +7912,37 @@ "extra_capabilities": { "reasoning": { "supported": true, + "interleaved": true, "effort_options": [ + "none", "low", - "medium", - "high" + "high", + "max" ] } }, "attachment": true, - "open_weights": false, - "release_date": "2026-07-08", - "last_updated": "2026-07-08", - "type": "chat" - }, - { - "id": "x-ai/grok-4.20", - "name": "Grok 4.20 (Reasoning)", - "display_name": "Grok 4.20 (Reasoning)", - "modalities": { - "input": [ - "text", - "image", - "pdf" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 2000000, - "output": 128000 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "attachment": true, - "open_weights": false, - "release_date": "2026-03-09", - "last_updated": "2026-03-09", + "open_weights": true, + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" }, { - "id": "x-ai/grok-4.7", - "name": "Grok 4.7", - "display_name": "Grok 4.7", + "id": "glm-5.3-flash", + "name": "GLM-5.3 Flash", + "display_name": "GLM-5.3 Flash", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 500000, - "output": 65536 + "context": 1048560, + "output": 1048560 }, "temperature": true, "tool_call": true, @@ -7593,25 +7952,34 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "interleaved": true, "effort_options": [ "low", - "medium", "high", - "xhigh" + "max" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-05", - "release_date": "2026-09-21", - "last_updated": "2026-09-21", + "open_weights": true, + "release_date": "2026-08-26", + "last_updated": "2026-08-26", "type": "chat" - }, + } + ] + }, + "inferx": { + "id": "inferx", + "name": "InferX", + "display_name": "InferX", + "api": "https://model.inferx.net/endpoints/v1", + "doc": "https://model.inferx.net/endpoints", + "models": [ { - "id": "x-ai/grok-4.6", - "name": "Grok 4.6", - "display_name": "Grok 4.6", + "id": "Ornith-1.0-35B-FP8", + "name": "Ornith-1.0-35B-FP8", + "display_name": "Ornith-1.0-35B-FP8", "modalities": { "input": [ "text", @@ -7622,8 +7990,8 @@ ] }, "limit": { - "context": 500000, - "output": 65536 + "context": 262000, + "output": 100000 }, "temperature": true, "tool_call": true, @@ -7631,347 +7999,265 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ] - } - }, "attachment": true, - "open_weights": false, - "knowledge": "2026-02-01", - "release_date": "2026-08-12", - "last_updated": "2026-08-12", + "open_weights": true, + "release_date": "2026-06-25", + "last_updated": "2026-06-25", "type": "chat" }, { - "id": "x-ai/grok-4.1-fast", - "name": "Grok 4.1 Fast", - "display_name": "Grok 4.1 Fast", + "id": "Qwen3-Coder-Next-FP8-no-thinking", + "name": "Qwen3-Coder-Next-FP8-no-thinking", + "display_name": "Qwen3-Coder-Next-FP8-no-thinking", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 2000000, - "output": 30000 + "context": 260000, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": true, - "open_weights": false, - "release_date": "2025-11-19", - "last_updated": "2025-11-19", + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2026-02-03", + "last_updated": "2026-02-03", "type": "chat" }, { - "id": "openai/gpt-5.2", - "name": "GPT-5.2", - "display_name": "GPT-5.2", + "id": "Qwen3.6-27B-FP8", + "name": "Qwen3.6 27B FP8", + "display_name": "Qwen3.6 27B FP8", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 262144, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2025-12-11", - "last_updated": "2025-12-11", + "open_weights": true, + "release_date": "2026-04-22", + "last_updated": "2026-04-22", "type": "chat" }, { - "id": "openai/gpt-5.4-mini", - "name": "GPT-5.4 mini", - "display_name": "GPT-5.4 mini", + "id": "deepseek-v4-flash", + "name": "deepseek-v4-flash", + "display_name": "deepseek-v4-flash", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 1000000, + "output": 100000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, + "default_enabled": true, "mode": "effort", - "effort": "none", + "effort": "high", "effort_options": [ - "none", "low", - "medium", "high", - "xhigh" + "max" ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ], - "visibility": "hidden" + "notes": [ + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." + ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-17", - "last_updated": "2026-03-17", + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "openai/gpt-5.6-sol", - "name": "GPT-5.6 Sol", - "display_name": "GPT-5.6 Sol", + "id": "Qwen3.6-35B-A3B-fp8-no-thinking", + "name": "Qwen3.6-35B-A3B-fp8-no-thinking", + "display_name": "Qwen3.6-35B-A3B-fp8-no-thinking", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 262000, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "open_weights": true, + "release_date": "2026-04-17", + "last_updated": "2026-04-17", "type": "chat" }, { - "id": "openai/gpt-5.2-codex", - "name": "GPT-5.2 Codex", - "display_name": "GPT-5.2 Codex", + "id": "gemma-4-31B-it-fp8", + "name": "Gemma 4 31B IT FP8", + "display_name": "Gemma 4 31B IT FP8", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 262144, + "output": 32768 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } - }, "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2025-12-11", - "last_updated": "2025-12-11", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "openai/gpt-5-nano", - "name": "GPT-5 Nano", - "display_name": "GPT-5 Nano", + "id": "Qwen3-Embedding-8B", + "name": "Qwen3-Embedding-8B", + "display_name": "Qwen3-Embedding-8B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 32768, + "output": 8192 }, "temperature": false, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "minimal", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-05-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", - "type": "chat" + "attachment": false, + "open_weights": true, + "release_date": "2025-06-05", + "last_updated": "2025-06-05", + "type": "embedding" }, { - "id": "openai/gpt-4o", - "name": "GPT-4o", - "display_name": "GPT-4o", + "id": "mimo-v25", + "name": "mimo-v25", + "display_name": "mimo-v25", "modalities": { "input": [ "text", "image", - "pdf" + "audio", + "video" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 1000000, + "output": 100000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": true, - "open_weights": false, - "knowledge": "2023-09", - "release_date": "2024-05-13", - "last_updated": "2024-08-06", + "open_weights": true, + "knowledge": "2024-12", + "release_date": "2026-04-22", + "last_updated": "2026-04-22", "type": "chat" }, { - "id": "openai/gpt-5.4-nano", - "name": "GPT-5.4 nano", - "display_name": "GPT-5.4 nano", + "id": "Agents-A1", + "name": "Agents-A1", + "display_name": "Agents-A1", "modalities": { "input": [ "text", @@ -7982,168 +8268,95 @@ ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 262000, + "output": 100000 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "default": true }, "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-17", - "last_updated": "2026-03-17", + "open_weights": true, + "release_date": "2026-06-26", + "last_updated": "2026-06-26", "type": "chat" }, { - "id": "openai/gpt-5.6-luna", - "name": "GPT-5.6 Luna", - "display_name": "GPT-5.6 Luna", + "id": "Qwen3-Coder-Next-FP8", + "name": "Qwen3 Coder Next FP8", + "display_name": "Qwen3 Coder Next FP8", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 256144, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2026-02-03", + "last_updated": "2026-02-03", "type": "chat" }, { - "id": "openai/gpt-5.1-codex-max", - "name": "GPT-5.1 Codex Max", - "display_name": "GPT-5.1 Codex Max", + "id": "Devstral-2-123B-Instruct-2512-int4-AutoRound", + "name": "Devstral-2-123B-Instruct-2512-int4-AutoRound", + "display_name": "Devstral-2-123B-Instruct-2512-int4-AutoRound", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 256000, + "context": 128000, "output": 128000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-11-13", - "last_updated": "2025-11-13", + "attachment": false, + "open_weights": true, + "knowledge": "2025-12", + "release_date": "2025-12-09", + "last_updated": "2025-12-09", "type": "chat" }, { - "id": "openai/gpt-5.6-terra", - "name": "GPT-5.6 Terra", - "display_name": "GPT-5.6 Terra", + "id": "Qwen3.6-35B-A3B-FP8", + "name": "Qwen3.6 35B A3B FP8", + "display_name": "Qwen3.6 35B A3B FP8", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 262000, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -8152,49 +8365,44 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "open_weights": true, + "release_date": "2026-04-17", + "last_updated": "2026-04-17", "type": "chat" - }, + } + ] + }, + "xpersona": { + "id": "xpersona", + "name": "Xpersona", + "display_name": "Xpersona", + "api": "https://www.xpersona.co/v1", + "doc": "https://www.xpersona.co/docs", + "models": [ { - "id": "openai/gpt-6-sol", - "name": "GPT-6 Sol", - "display_name": "GPT-6 Sol", + "id": "claude-fable-5", + "name": "Claude Fable 5", + "display_name": "Claude Fable 5", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1050000, + "context": 1000000, "output": 128000 }, "temperature": false, @@ -8205,91 +8413,103 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", "effort_options": [ - "none", "low", "medium", "high", "xhigh", "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", + "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", + "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-04-20", - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "knowledge": "2026-01-31", + "release_date": "2026-06-09", + "last_updated": "2026-06-09", "type": "chat" }, { - "id": "openai/gpt-5.3-codex", - "name": "GPT-5.3 Codex", - "display_name": "GPT-5.3 Codex", + "id": "claude-haiku-4-5", + "name": "Claude Haiku 4.5 (latest)", + "display_name": "Claude Haiku 4.5 (latest)", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 400000, + "context": 200000, "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ], - "visibility": "hidden" + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-05", - "last_updated": "2026-02-05", + "knowledge": "2025-02-28", + "release_date": "2025-10-15", + "last_updated": "2025-10-15", "type": "chat" }, { - "id": "openai/gpt-6.1-sol", - "name": "GPT-6.1 Sol", - "display_name": "GPT-6.1 Sol", + "id": "gpt-5.6-terra", + "name": "GPT-5.6 Terra", + "display_name": "GPT-5.6 Terra", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1050000, + "context": 372000, "output": 128000 }, "temperature": false, @@ -8300,31 +8520,47 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ + "none", "low", "medium", "high", "xhigh", "max" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-04-30", - "release_date": "2026-09-29", - "last_updated": "2026-09-29", + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "openai/gpt-5.4", + "id": "gpt-5.4", "name": "GPT-5.4", "display_name": "GPT-5.4", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" @@ -8359,7 +8595,12 @@ "medium", "high" ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": true, @@ -8370,9 +8611,9 @@ "type": "chat" }, { - "id": "openai/gpt-5.1", - "name": "GPT-5.1", - "display_name": "GPT-5.1", + "id": "claude-sonnet-4-6", + "name": "Claude Sonnet 4.6", + "display_name": "Claude Sonnet 4.6", "modalities": { "input": [ "text", @@ -8383,7 +8624,7 @@ ] }, "limit": { - "context": 400000, + "context": 200000, "output": 128000 }, "temperature": true, @@ -8396,76 +8637,52 @@ "reasoning": { "supported": true, "default_enabled": false, - "mode": "effort", - "effort": "none", + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", "effort_options": [ - "none", "low", "medium", - "high" + "high", + "max" ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ], - "visibility": "hidden" + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-11-13", - "last_updated": "2025-11-13", - "type": "chat" - }, - { - "id": "openai/gpt-4.1-mini", - "name": "GPT-4.1 mini", - "display_name": "GPT-4.1 mini", - "modalities": { - "input": [ - "text", - "image", - "pdf" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 1047576, - "output": 32768 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-04-14", - "last_updated": "2025-04-14", + "knowledge": "2025-08-31", + "release_date": "2026-02-17", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "openai/gpt-6-astra", - "name": "GPT-6 Astra", - "display_name": "GPT-6 Astra", + "id": "gpt-5.6-sol", + "name": "GPT-5.6 Sol", + "display_name": "GPT-5.6 Sol", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1050000, + "context": 372000, "output": 128000 }, "temperature": false, @@ -8477,53 +8694,69 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ + "none", "low", "medium", "high", "xhigh", "max" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-04-30", - "release_date": "2026-09-04", - "last_updated": "2026-09-04", + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "openai/gpt-5.5", - "name": "GPT-5.5", - "display_name": "GPT-5.5", + "id": "gpt-5.4-mini", + "name": "GPT-5.4 mini", + "display_name": "GPT-5.4 mini", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1050000, + "context": 272000, "output": 128000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, + "default_enabled": false, "mode": "effort", - "effort": "medium", + "effort": "none", "effort_options": [ + "none", "low", "medium", "high", @@ -8535,50 +8768,25 @@ "medium", "high" ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-12-01", - "release_date": "2026-04-23", - "last_updated": "2026-04-23", - "type": "chat" - }, - { - "id": "openai/gpt-4o-mini", - "name": "GPT-4o mini", - "display_name": "GPT-4o mini", - "modalities": { - "input": [ - "text", - "image", - "pdf" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 128000, - "output": 16384 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": false, - "knowledge": "2023-09", - "release_date": "2024-07-18", - "last_updated": "2024-07-18", + "knowledge": "2025-08-31", + "release_date": "2026-03-17", + "last_updated": "2026-03-17", "type": "chat" }, { - "id": "openai/gpt-5-mini", - "name": "GPT-5 Mini", - "display_name": "GPT-5 Mini", + "id": "claude-opus-4-8", + "name": "Claude Opus 4.8", + "display_name": "Claude Opus 4.8", "modalities": { "input": [ "text", @@ -8589,47 +8797,52 @@ ] }, "limit": { - "context": 256000, - "output": 32768 + "context": 200000, + "output": 128000 }, "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, + "default_enabled": false, "mode": "effort", - "effort": "medium", + "effort": "high", "effort_options": [ - "minimal", "low", "medium", - "high" + "high", + "xhigh", + "max" ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ], - "visibility": "hidden" + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2024-05-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "knowledge": "2026-01", + "release_date": "2026-05-28", + "last_updated": "2026-05-28", "type": "chat" }, { - "id": "openai/gpt-5", - "name": "GPT-5", - "display_name": "GPT-5", + "id": "xpersona-frieren-coder", + "name": "Xpersona Frieren 1", + "display_name": "Xpersona Frieren 1", "modalities": { "input": [ "text", @@ -8640,8 +8853,8 @@ ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 1000000, + "output": 384000 }, "temperature": false, "tool_call": true, @@ -8651,48 +8864,37 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", "effort_options": [ - "minimal", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ "low", "medium", - "high" - ], - "visibility": "hidden" + "high", + "xhigh", + "max" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "knowledge": "2025-12-30", + "release_date": "2026-05-01", + "last_updated": "2026-05-25", "type": "chat" }, { - "id": "openai/gpt-6-luna", - "name": "GPT-6 Luna", - "display_name": "GPT-6 Luna", + "id": "xpersona-gpt-5.5", + "name": "GPT-5.5", + "display_name": "GPT-5.5", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1050000, + "context": 1000000, "output": 128000 }, "temperature": false, @@ -8703,8 +8905,14 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ - "none", "low", "medium", "high", @@ -8715,45 +8923,15 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2026-05-18", - "release_date": "2026-09-22", - "last_updated": "2026-09-22", - "type": "chat" - }, - { - "id": "openai/gpt-4.1", - "name": "GPT-4.1", - "display_name": "GPT-4.1", - "modalities": { - "input": [ - "text", - "image", - "pdf" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 1047576, - "output": 32768 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-04-14", - "last_updated": "2025-04-14", + "knowledge": "2025-12-30", + "release_date": "2026-04-23", + "last_updated": "2026-04-23", "type": "chat" }, { - "id": "openai/gpt-5.1-codex-mini", - "name": "GPT-5.1 Codex mini", - "display_name": "GPT-5.1 Codex mini", + "id": "gpt-5.6", + "name": "GPT-5.6", + "display_name": "GPT-5.6", "modalities": { "input": [ "text", @@ -8764,26 +8942,28 @@ ] }, "limit": { - "context": 256000, - "output": 65536 + "context": 372000, + "output": 128000 }, "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, + "default_enabled": true, "mode": "effort", - "effort": "none", + "effort": "medium", "effort_options": [ "none", "low", "medium", - "high" + "high", + "xhigh", + "max" ], "verbosity": "medium", "verbosity_options": [ @@ -8791,20 +8971,25 @@ "medium", "high" ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-11-13", - "last_updated": "2025-11-13", + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "openai/gpt-5.4-pro", - "name": "GPT-5.4 Pro", - "display_name": "GPT-5.4 Pro", + "id": "gpt-5.5", + "name": "GPT-5.5", + "display_name": "GPT-5.5", "modalities": { "input": [ "text", @@ -8829,8 +9014,9 @@ "supported": true, "default_enabled": true, "mode": "effort", - "effort": "high", + "effort": "medium", "effort_options": [ + "low", "medium", "high", "xhigh" @@ -8841,33 +9027,37 @@ "medium", "high" ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-05", - "last_updated": "2026-03-05", + "knowledge": "2025-12-01", + "release_date": "2026-04-23", + "last_updated": "2026-04-23", "type": "chat" }, { - "id": "qwen/qwen3.8-27b", - "name": "Qwen3.8 27B", - "display_name": "Qwen3.8 27B", + "id": "gemini-3.5-flash", + "name": "Gemini 3.5 Flash", + "display_name": "Gemini 3.5 Flash", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1131072, - "output": 131072 + "context": 1000000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -8875,16 +9065,46 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", + "low", + "medium", + "high" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, "attachment": true, - "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2026-05-19", + "last_updated": "2026-05-19", "type": "chat" - }, + } + ] + }, + "inceptron": { + "id": "inceptron", + "name": "Inceptron", + "display_name": "Inceptron", + "api": "https://api.inceptron.io/v1", + "doc": "https://docs.inceptron.io", + "models": [ { - "id": "qwen/qwen3.5-397b-a17b", - "name": "Qwen3.5 397B-A17B", - "display_name": "Qwen3.5 397B-A17B", + "id": "moonshotai/Kimi-K2.6", + "name": "Kimi K2.6", + "display_name": "Kimi K2.6", "modalities": { "input": [ "text", @@ -8895,8 +9115,8 @@ ] }, "limit": { - "context": 256000, - "output": 64000 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, @@ -8917,27 +9137,27 @@ }, "attachment": true, "open_weights": true, - "release_date": "2026-02-15", - "last_updated": "2026-02-15", + "knowledge": "2025-01", + "release_date": "2026-04-20", + "last_updated": "2026-04-20", "type": "chat" }, { - "id": "qwen/qwen3.7-plus", - "name": "Qwen3.7 Plus", - "display_name": "Qwen3.7 Plus", + "id": "moonshotai/Kimi-K2.7-Code", + "name": "Kimi K2.7 Code", + "display_name": "Kimi K2.7 Code", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1064000, - "output": 64000 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, @@ -8947,20 +9167,26 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-04", - "release_date": "2026-06-02", - "last_updated": "2026-06-02", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-06-12", + "last_updated": "2026-06-12", "type": "chat" }, { - "id": "qwen/qwen-max", - "name": "Qwen Max", - "display_name": "Qwen Max", + "id": "zai-org/GLM-5.2", + "name": "GLM 5.2", + "display_name": "GLM 5.2", "modalities": { "input": [ "text" @@ -8970,37 +9196,8 @@ ] }, "limit": { - "context": 32000, - "output": 8000 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": false, - "knowledge": "2024-04", - "release_date": "2024-04-03", - "last_updated": "2025-01-25", - "type": "chat" - }, - { - "id": "qwen/qwen3.5-35b-a3b", - "name": "Qwen3.5 35B-A3B", - "display_name": "Qwen3.5 35B-A3B", - "modalities": { - "input": [ - "text", - "image" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 256000, - "output": 64000 + "context": 1048576, + "output": 1048576 }, "temperature": true, "tool_call": true, @@ -9016,19 +9213,23 @@ "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "effort_options": [ + "high", + "max" ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-02-23", - "last_updated": "2026-02-23", + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "qwen/qwen3.6-max-preview", - "name": "Qwen3.6 Max Preview", - "display_name": "Qwen3.6 Max Preview", + "id": "zai-org/GLM-5.3-Flash", + "name": "GLM 5.3 Flash", + "display_name": "GLM 5.3 Flash", "modalities": { "input": [ "text" @@ -9038,8 +9239,8 @@ ] }, "limit": { - "context": 256000, - "output": 64000 + "context": 1048576, + "output": 1048576 }, "temperature": true, "tool_call": true, @@ -9055,34 +9256,35 @@ "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "effort_options": [ + "low", + "high", + "max" ] } }, "attachment": false, - "open_weights": false, - "knowledge": "2025-04", - "release_date": "2026-04-20", - "last_updated": "2026-04-20", + "open_weights": true, + "release_date": "2026-08-26", + "last_updated": "2026-08-26", "type": "chat" }, { - "id": "qwen/qwen3.8-max", - "name": "Qwen3.8 Max", - "display_name": "Qwen3.8 Max", + "id": "zai-org/GLM-5.3", + "name": "GLM 5.3", + "display_name": "GLM 5.3", "modalities": { "input": [ - "text", - "image", - "video", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 1048576, + "output": 1048576 }, "temperature": true, "tool_call": true, @@ -9093,63 +9295,40 @@ "extra_capabilities": { "reasoning": { "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ "low", - "medium", - "xhigh" + "high", + "max" ] } }, - "attachment": true, - "open_weights": false, - "release_date": "2026-08-03", - "last_updated": "2026-08-03", - "type": "chat" - }, - { - "id": "qwen/qwen3-coder-next", - "name": "Qwen3 Coder Next", - "display_name": "Qwen3 Coder Next", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 256000, - "output": 64000 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, "attachment": false, "open_weights": true, - "knowledge": "2025-09", - "release_date": "2026-02-03", - "last_updated": "2026-02-03", + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "qwen/qwen3.5-27b", - "name": "Qwen3.5 27B", - "display_name": "Qwen3.5 27B", + "id": "deepseek-ai/DeepSeek-V4-Flash-0731", + "name": "DeepSeek V4 Flash 0731", + "display_name": "DeepSeek V4 Flash 0731", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 64000 + "context": 1048576, + "output": 1048576 }, "temperature": true, "tool_call": true, @@ -9165,34 +9344,48 @@ "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "effort_options": [ + "high", + "max" ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-02-23", - "last_updated": "2026-02-23", + "knowledge": "2025-05", + "release_date": "2026-07-31", + "last_updated": "2026-07-31", "type": "chat" - }, + } + ] + }, + "aixy": { + "id": "aixy", + "name": "Aixy", + "display_name": "Aixy", + "api": "https://api.aixy-gateway.com/v1", + "doc": "https://docs.aixy-gateway.com/integrations/overview", + "models": [ { - "id": "qwen/qwen3.5-plus", - "name": "Qwen3.5 Plus", - "display_name": "Qwen3.5 Plus", + "id": "openai/gpt-5.6-terra", + "name": "GPT-5.6 Terra", + "display_name": "GPT-5.6 Terra", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 64000 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -9201,40 +9394,52 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2025-04", - "release_date": "2026-02-16", - "last_updated": "2026-02-16", + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "qwen/qwen3.5-flash", - "name": "Qwen3.5 Flash", - "display_name": "Qwen3.5 Flash", + "id": "openai/gpt-5.6-sol", + "name": "GPT-5.6 Sol", + "display_name": "GPT-5.6 Sol", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 64000 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -9243,39 +9448,52 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "release_date": "2026-02-23", - "last_updated": "2026-02-23", + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "qwen/qwen3.6-plus", - "name": "Qwen3.6 Plus", - "display_name": "Qwen3.6 Plus", + "id": "openai/gpt-5.6-luna", + "name": "GPT-5.6 Luna", + "display_name": "GPT-5.6 Luna", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 64000 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -9284,40 +9502,52 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2025-04", - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "qwen/qwen3.6-flash", - "name": "Qwen3.6 Flash", - "display_name": "Qwen3.6 Flash", + "id": "openai/gpt-6-luna", + "name": "GPT-6 Luna", + "display_name": "GPT-6 Luna", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 64000 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -9325,105 +9555,85 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-04-27", - "last_updated": "2026-04-27", - "type": "chat" - }, - { - "id": "qwen/qwen3-coder-flash", - "name": "Qwen3 Coder Flash", - "display_name": "Qwen3 Coder Flash", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 1000000, - "output": 64000 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": false, - "knowledge": "2025-04", - "release_date": "2025-07-28", - "last_updated": "2025-07-28", + "knowledge": "2026-05-18", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "qwen/qwen-turbo", - "name": "Qwen Turbo", - "display_name": "Qwen Turbo", + "id": "openai/gpt-6-sol", + "name": "GPT-6 Sol", + "display_name": "GPT-6 Sol", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16000 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" ] } }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2024-04", - "release_date": "2024-11-01", - "last_updated": "2025-04-28", + "knowledge": "2026-04-20", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "qwen/qwen3-max", - "name": "Qwen3 Max", - "display_name": "Qwen3 Max", + "id": "openai/gpt-6.1-sol", + "name": "GPT-6.1 Sol", + "display_name": "GPT-6.1 Sol", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 64000 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -9431,39 +9641,41 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" ] } }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2025-04", - "release_date": "2025-09-23", - "last_updated": "2025-09-23", + "knowledge": "2026-04-30", + "release_date": "2026-09-29", + "last_updated": "2026-09-29", "type": "chat" }, { - "id": "qwen/qwen3.7-max", - "name": "Qwen3.7 Max", - "display_name": "Qwen3.7 Max", + "id": "openai/gpt-6-astra", + "name": "GPT-6 Astra", + "display_name": "GPT-6 Astra", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1064000, - "output": 64000 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -9471,34 +9683,42 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] } }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-05-21", - "last_updated": "2026-05-21", + "knowledge": "2026-04-30", + "release_date": "2026-09-04", + "last_updated": "2026-09-04", "type": "chat" }, { - "id": "qwen/qwen3.6-27b", - "name": "Qwen3.6 27B", - "display_name": "Qwen3.6 27B", + "id": "gemini/gemini-4-argon", + "name": "Gemini 4 Argon", + "display_name": "Gemini 4 Argon", "modalities": { "input": [ "text", "image", - "video" + "audio" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 64000 + "context": 1048576, + "output": 32768 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -9506,36 +9726,37 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "low", + "medium", + "high" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-04-22", - "last_updated": "2026-04-22", + "open_weights": false, + "knowledge": "2026-03", + "release_date": "2026-10-13", + "last_updated": "2026-10-13", "type": "chat" }, { - "id": "qwen/qwen-flash", - "name": "Qwen Flash", - "display_name": "Qwen Flash", + "id": "gemini/gemini-3.8-flash", + "name": "Gemini 3.8 Flash", + "display_name": "Gemini 3.8 Flash", "modalities": { "input": [ - "text" + "text", + "image", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 32000 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -9546,28 +9767,37 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", + "low", + "medium", + "high" + ], "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" + "thought_signatures" ] } }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-07-28", - "last_updated": "2025-07-28", + "release_date": "2026-09-02", + "last_updated": "2026-09-02", "type": "chat" }, { - "id": "qwen/qwen-plus", - "name": "Qwen Plus", - "display_name": "Qwen Plus", + "id": "anthropic/claude-fable-5-1", + "name": "Claude Fable 5.1", + "display_name": "Claude Fable 5.1", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" @@ -9575,40 +9805,55 @@ }, "limit": { "context": 1000000, - "output": 32000 + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], "interleaved": true, "summaries": true, - "visibility": "summary", + "visibility": "omitted", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", + "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", + "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." ] } }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2024-04", - "release_date": "2024-01-25", - "last_updated": "2025-09-11", + "knowledge": "2026-06", + "release_date": "2026-09-01", + "last_updated": "2026-09-01", "type": "chat" }, { - "id": "qwen/qwen3.8-max-0902", - "name": "Qwen3.8 Max 0902", - "display_name": "Qwen3.8 Max 0902", + "id": "anthropic/claude-opus-5-5", + "name": "Claude Opus 5.5", + "display_name": "Claude Opus 5.5", "modalities": { "input": [ "text", "image", - "video", "pdf" ], "output": [ @@ -9617,9 +9862,9 @@ }, "limit": { "context": 1000000, - "output": 131072 + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -9630,34 +9875,38 @@ "effort_options": [ "low", "medium", - "xhigh" + "high", + "xhigh", + "max" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-09-02", - "last_updated": "2026-09-02", + "knowledge": "2026-06", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "qwen/qwen3.5-122b-a10b", - "name": "Qwen3.5 122B-A10B", - "display_name": "Qwen3.5 122B-A10B", + "id": "anthropic/claude-haiku-5-5", + "name": "Claude Haiku 5.5", + "display_name": "Claude Haiku 5.5", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 64000 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -9665,87 +9914,31 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-02-23", - "last_updated": "2026-02-23", - "type": "chat" - }, - { - "id": "qwen/qwen3-coder-plus", - "name": "Qwen3 Coder Plus", - "display_name": "Qwen3 Coder Plus", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 1000000, - "output": 64000 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": false, - "knowledge": "2025-04", - "release_date": "2025-07-23", - "last_updated": "2025-07-23", - "type": "chat" - }, - { - "id": "qwen/qwen-vl-max", - "name": "Qwen-VL Max", - "display_name": "Qwen-VL Max", - "modalities": { - "input": [ - "text", - "image" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 128000, - "output": 8000 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": true, "open_weights": false, - "knowledge": "2024-04", - "release_date": "2024-04-08", - "last_updated": "2025-08-13", + "knowledge": "2026-06", + "release_date": "2026-10-07", + "last_updated": "2026-10-07", "type": "chat" }, { - "id": "qwen/qwen3.8-flash", - "name": "Qwen3.8 Flash", - "display_name": "Qwen3.8 Flash", + "id": "anthropic/claude-sonnet-5-5", + "name": "Claude Sonnet 5.5", + "display_name": "Claude Sonnet 5.5", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" @@ -9753,9 +9946,9 @@ }, "limit": { "context": 1000000, - "output": 131072 + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -9763,19 +9956,35 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", + "knowledge": "2026-06", + "release_date": "2026-09-28", + "last_updated": "2026-09-28", "type": "chat" - }, + } + ] + }, + "clarifai": { + "id": "clarifai", + "name": "Clarifai", + "display_name": "Clarifai", + "api": "https://api.clarifai.com/v2/ext/openai/v1", + "doc": "https://docs.clarifai.com/compute/inference/", + "models": [ { - "id": "z-ai/glm-5.1", - "name": "GLM-5.1", - "display_name": "GLM-5.1", + "id": "arcee_ai/AFM/models/trinity-mini", + "name": "Trinity Mini", + "display_name": "Trinity Mini", "modalities": { "input": [ "text" @@ -9785,7 +9994,7 @@ ] }, "limit": { - "context": 200000, + "context": 131072, "output": 131072 }, "temperature": true, @@ -9794,52 +10003,46 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, "attachment": false, "open_weights": true, - "release_date": "2026-04-07", - "last_updated": "2026-04-07", + "knowledge": "2024-10", + "release_date": "2025-12-01", + "last_updated": "2026-05-28", "type": "chat" }, { - "id": "z-ai/glm-5v-turbo", - "name": "GLM-5V-Turbo", - "display_name": "GLM-5V-Turbo", + "id": "clarifai/main/models/mm-poly-8b", + "name": "MM Poly 8B", + "display_name": "MM Poly 8B", "modalities": { "input": [ "text", "image", - "video", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 131072 + "context": 32768, + "output": 4096 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": true, "open_weights": false, - "release_date": "2026-04-01", - "last_updated": "2026-04-01", + "release_date": "2025-06", + "last_updated": "2026-02-25", "type": "chat" }, { - "id": "z-ai/glm-5", - "name": "GLM-5", - "display_name": "GLM-5", + "id": "minimaxai/chat-completion/models/MiniMax-M2_5-high-throughput", + "name": "MiniMax-M2.5 High Throughput", + "display_name": "MiniMax-M2.5 High Throughput", "modalities": { "input": [ "text" @@ -9858,17 +10061,6 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, "attachment": false, "open_weights": true, "release_date": "2026-02-12", @@ -9876,20 +10068,21 @@ "type": "chat" }, { - "id": "z-ai/glm-4.6", - "name": "GLM-4.6", - "display_name": "GLM-4.6", + "id": "moonshotai/chat-completion/models/Kimi-K2_6", + "name": "Kimi K2.6", + "display_name": "Kimi K2.6", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, @@ -9899,20 +10092,26 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-09-30", - "last_updated": "2025-09-30", + "knowledge": "2025-01", + "release_date": "2026-04-20", + "last_updated": "2026-04-20", "type": "chat" }, { - "id": "z-ai/glm-5.3", - "name": "GLM-5.3", - "display_name": "GLM-5.3", + "id": "openai/chat-completion/models/gpt-oss-20b", + "name": "GPT OSS 20B", + "display_name": "GPT OSS 20B", "modalities": { "input": [ "text" @@ -9922,8 +10121,8 @@ ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 131072, + "output": 16384 }, "temperature": true, "tool_call": true, @@ -9936,21 +10135,22 @@ "supported": true, "effort_options": [ "low", - "high", - "max" + "medium", + "high" ] } }, "attachment": false, "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "z-ai/glm-5.2", - "name": "GLM-5.2", - "display_name": "GLM-5.2", + "id": "openai/chat-completion/models/gpt-oss-120b-high-throughput", + "name": "GPT OSS 120B High Throughput", + "display_name": "GPT OSS 120B High Throughput", "modalities": { "input": [ "text" @@ -9960,8 +10160,8 @@ ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 131072, + "output": 16384 }, "temperature": true, "tool_call": true, @@ -9971,66 +10171,64 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ - "high", - "max" + "low", + "medium", + "high" ] } }, "attachment": false, "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "z-ai/glm-4.7-flashx", - "name": "GLM-4.7-FlashX", - "display_name": "GLM-4.7-FlashX", + "id": "deepseek-ai/deepseek-ocr/models/DeepSeek-OCR", + "name": "DeepSeek OCR", + "display_name": "DeepSeek OCR", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 128000 + "context": 8192, + "output": 8192 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2026-01-19", - "last_updated": "2026-01-19", + "release_date": "2025-10-20", + "last_updated": "2026-02-25", "type": "chat" }, { - "id": "z-ai/glm-5.3-flashx", - "name": "GLM-5.3-FlashX", - "display_name": "GLM-5.3-FlashX", + "id": "mistralai/completion/models/Ministral-3-3B-Reasoning-2512", + "name": "Ministral 3 3B Reasoning 2512", + "display_name": "Ministral 3 3B Reasoning 2512", "modalities": { "input": [ "text", - "image", - "video", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, @@ -10038,39 +10236,28 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "high", - "max" - ] - } - }, "attachment": true, "open_weights": true, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", + "release_date": "2025-12", + "last_updated": "2026-02-25", "type": "chat" }, { - "id": "z-ai/glm-5.3-flash", - "name": "GLM-5.3-Flash", - "display_name": "GLM-5.3-Flash", + "id": "mistralai/completion/models/Ministral-3-14B-Reasoning-2512", + "name": "Ministral 3 14B Reasoning 2512", + "display_name": "Ministral 3 14B Reasoning 2512", "modalities": { "input": [ "text", - "image", - "video", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, @@ -10078,26 +10265,17 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "low", - "high", - "max" - ] - } - }, "attachment": true, "open_weights": true, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", + "knowledge": "2025-12", + "release_date": "2025-12-01", + "last_updated": "2025-12-12", "type": "chat" }, { - "id": "z-ai/glm-5-turbo", - "name": "GLM-5-Turbo", - "display_name": "GLM-5-Turbo", + "id": "qwen/qwenLM/models/Qwen3-30B-A3B-Instruct-2507", + "name": "Qwen3 30B A3B Instruct 2507", + "display_name": "Qwen3 30B A3B Instruct 2507", "modalities": { "input": [ "text" @@ -10107,30 +10285,24 @@ ] }, "limit": { - "context": 200000, - "output": 131072 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2026-03-16", - "last_updated": "2026-03-16", + "open_weights": true, + "release_date": "2025-07-28", + "last_updated": "2025-07-28", "type": "chat" }, { - "id": "z-ai/glm-4.7", - "name": "GLM-4.7", - "display_name": "GLM-4.7", + "id": "qwen/qwenLM/models/Qwen3-30B-A3B-Thinking-2507", + "name": "Qwen3 30B A3B Thinking 2507", + "display_name": "Qwen3 30B A3B Thinking 2507", "modalities": { "input": [ "text" @@ -10140,7 +10312,7 @@ ] }, "limit": { - "context": 204800, + "context": 262144, "output": 131072 }, "temperature": true, @@ -10162,15 +10334,14 @@ }, "attachment": false, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-12-22", - "last_updated": "2025-12-22", + "release_date": "2025-07-31", + "last_updated": "2026-02-25", "type": "chat" }, { - "id": "deepseek/deepseek-v4-flash", - "name": "DeepSeek V4 Flash", - "display_name": "DeepSeek V4 Flash", + "id": "qwen/qwenCoder/models/Qwen3-Coder-30B-A3B-Instruct", + "name": "Qwen3 Coder 30B A3B Instruct", + "display_name": "Qwen3 Coder 30B A3B Instruct", "modalities": { "input": [ "text" @@ -10180,86 +10351,63 @@ ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 262144, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." - ] - } + "supported": false }, "attachment": false, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "knowledge": "2025-04", + "release_date": "2025-07-31", + "last_updated": "2025-07-31", "type": "chat" - }, + } + ] + }, + "helicone": { + "id": "helicone", + "name": "Helicone", + "display_name": "Helicone", + "api": "https://ai-gateway.helicone.ai/v1", + "doc": "https://helicone.ai/models", + "models": [ { - "id": "deepseek/deepseek-v4-flash-0423", - "name": "DeepSeek V4 Flash 0423", - "display_name": "DeepSeek V4 Flash 0423", + "id": "gpt-4.1-nano", + "name": "OpenAI GPT-4.1 Nano", + "display_name": "OpenAI GPT-4.1 Nano", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 1047576, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "high", - "max" - ] - } + "supported": false }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-23", - "last_updated": "2026-04-23", + "attachment": true, + "open_weights": false, + "knowledge": "2025-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", "type": "chat" }, { - "id": "deepseek/deepseek-v4-pro", - "name": "DeepSeek V4 Pro", - "display_name": "DeepSeek V4 Pro", + "id": "mistral-large-2411", + "name": "Mistral-Large", + "display_name": "Mistral-Large", "modalities": { "input": [ "text" @@ -10269,85 +10417,54 @@ ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 128000, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." - ] - } + "supported": false }, "attachment": false, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "knowledge": "2024-07", + "release_date": "2024-11-18", + "last_updated": "2024-11-18", "type": "chat" }, { - "id": "deepseek/deepseek-v4-pro-0813", - "name": "DeepSeek V4 Pro 0813", - "display_name": "DeepSeek V4 Pro 0813", + "id": "claude-3.5-sonnet-v2", + "name": "Anthropic: Claude 3.5 Sonnet v2", + "display_name": "Anthropic: Claude 3.5 Sonnet v2", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 200000, + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "high", - "max" - ] - } + "supported": false }, - "attachment": false, - "open_weights": true, - "release_date": "2026-08-13", - "last_updated": "2026-08-22", + "attachment": true, + "open_weights": false, + "knowledge": "2024-10", + "release_date": "2024-10-22", + "last_updated": "2024-10-22", "type": "chat" }, { - "id": "deepseek/deepseek-v4-flash-0731", - "name": "DeepSeek V4 Flash 0731", - "display_name": "DeepSeek V4 Flash 0731", + "id": "gpt-oss-20b", + "name": "OpenAI GPT-OSS 20b", + "display_name": "OpenAI GPT-OSS 20b", "modalities": { "input": [ "text" @@ -10357,8 +10474,8 @@ ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 131072, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -10371,104 +10488,83 @@ "supported": true, "effort_options": [ "low", - "high", - "max" + "medium", + "high" ] } }, "attachment": false, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-07-31", - "last_updated": "2026-07-31", + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "deepseek/deepseek-v4.1-flash-1017", - "name": "DeepSeek V4.1 Flash 1017", - "display_name": "DeepSeek V4.1 Flash 1017", + "id": "ernie-4.5-21b-a3b-thinking", + "name": "Baidu Ernie 4.5 21B A3B Thinking", + "display_name": "Baidu Ernie 4.5 21B A3B Thinking", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 128000, + "output": 8000 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "high", - "max" - ] - } - }, - "attachment": true, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-10-17", - "last_updated": "2026-10-17", - "type": "chat" - }, + "attachment": false, + "open_weights": false, + "knowledge": "2025-03", + "release_date": "2025-03-16", + "last_updated": "2025-03-16", + "type": "chat" + }, { - "id": "deepseek/deepseek-v4.1-flash", - "name": "DeepSeek V4.1 Flash", - "display_name": "DeepSeek V4.1 Flash", + "id": "kimi-k2-0711", + "name": "Kimi K2 (07/11)", + "display_name": "Kimi K2 (07/11)", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 131072, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "low", - "high", - "max" - ] - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-09-10", - "last_updated": "2026-09-10", + "knowledge": "2025-01", + "release_date": "2025-07-11", + "last_updated": "2025-07-11", "type": "chat" }, { - "id": "deepseek/deepseek-v3.2", - "name": "DeepSeek V3.2", - "display_name": "DeepSeek V3.2", + "id": "gpt-4o", + "name": "OpenAI GPT-4o", + "display_name": "OpenAI GPT-4o", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" @@ -10476,30 +10572,24 @@ }, "limit": { "context": 128000, - "output": 32000 + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-07", - "release_date": "2025-12-01", - "last_updated": "2025-12-01", + "attachment": true, + "open_weights": false, + "knowledge": "2024-05", + "release_date": "2024-05-13", + "last_updated": "2024-08-06", "type": "chat" }, { - "id": "deepseek/deepseek-v4-pro-0423", - "name": "DeepSeek V4 Pro 0423", - "display_name": "DeepSeek V4 Pro 0423", + "id": "sonar-reasoning-pro", + "name": "Perplexity Sonar Reasoning Pro", + "display_name": "Perplexity Sonar Reasoning Pro", "modalities": { "input": [ "text" @@ -10509,11 +10599,11 @@ ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 127000, + "output": 4096 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true @@ -10521,136 +10611,117 @@ "extra_capabilities": { "reasoning": { "effort_options": [ - "high", - "max" + "minimal", + "low", + "medium", + "high" ] } }, "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-23", - "last_updated": "2026-04-23", + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2024-01-01", + "last_updated": "2025-09-01", "type": "chat" }, { - "id": "anthropic/claude-haiku-5.5", - "name": "Claude Haiku 5.5", - "display_name": "Claude Haiku 5.5", + "id": "grok-4-fast-non-reasoning", + "name": "xAI Grok 4 Fast Non-Reasoning", + "display_name": "xAI Grok 4 Fast Non-Reasoning", "modalities": { "input": [ "text", "image", - "pdf" + "audio" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 2000000, + "output": 2000000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ] - } + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-10-07", - "last_updated": "2026-10-07", + "knowledge": "2025-09", + "release_date": "2025-12-18", + "last_updated": "2025-12-18", "type": "chat" }, { - "id": "anthropic/claude-opus-4.7", - "name": "Claude Opus 4.7", - "display_name": "Claude Opus 4.7", + "id": "gemini-2.5-pro", + "name": "Google Gemini 2.5 Pro", + "display_name": "Google Gemini 2.5 Pro", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 1048576, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], - "interleaved": true, + "default_enabled": true, + "mode": "budget", + "budget": { + "default": -1, + "min": 128, + "max": 32768, + "auto": -1, + "unit": "tokens" + }, "summaries": true, - "visibility": "omitted", + "visibility": "summary", "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." + "thought_signatures" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-04-16", - "last_updated": "2026-04-16", + "knowledge": "2025-06", + "release_date": "2025-06-17", + "last_updated": "2025-06-17", "type": "chat" }, { - "id": "anthropic/claude-opus-4.6", - "name": "Claude Opus 4.6", - "display_name": "Claude Opus 4.6", + "id": "gpt-5.1-codex-mini", + "name": "OpenAI: GPT-5.1 Codex Mini", + "display_name": "OpenAI: GPT-5.1 Codex Mini", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, + "context": 400000, "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -10660,56 +10731,76 @@ "reasoning": { "supported": true, "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", + "mode": "effort", + "effort": "none", "effort_options": [ + "none", "low", "medium", - "high", - "max" + "high" ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." - ] + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2025-05-31", - "release_date": "2026-02-05", - "last_updated": "2026-03-13", + "knowledge": "2025-01", + "release_date": "2025-11-13", + "last_updated": "2025-11-13", "type": "chat" }, { - "id": "anthropic/claude-sonnet-5", - "name": "Claude Sonnet 5", - "display_name": "Claude Sonnet 5", + "id": "grok-3", + "name": "xAI Grok 3", + "display_name": "xAI Grok 3", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 131072, + "output": 131072 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": false, + "knowledge": "2024-06", + "release_date": "2024-06-01", + "last_updated": "2024-06-01", + "type": "chat" + }, + { + "id": "grok-4-1-fast-reasoning", + "name": "xAI Grok 4.1 Fast Reasoning", + "display_name": "xAI Grok 4.1 Fast Reasoning", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 2000000, + "output": 2000000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -10717,91 +10808,137 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ] + "supported": true } }, "attachment": true, "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-30", - "last_updated": "2026-06-30", + "knowledge": "2025-11", + "release_date": "2025-11-19", + "last_updated": "2025-11-19", "type": "chat" }, { - "id": "anthropic/claude-haiku-4.5", - "name": "Claude Haiku 4.5 (latest)", - "display_name": "Claude Haiku 4.5 (latest)", + "id": "gemini-3-pro-preview", + "name": "Google Gemini 3 Pro Preview", + "display_name": "Google Gemini 3 Pro Preview", "modalities": { "input": [ "text", "image", - "pdf" + "audio", + "video" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "low", + "high" + ], "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + "thought_signatures" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-02-28", - "release_date": "2025-10-15", - "last_updated": "2025-10-15", + "knowledge": "2025-11", + "release_date": "2025-11-18", + "last_updated": "2025-11-18", "type": "chat" }, { - "id": "anthropic/claude-opus-4.8", - "name": "Claude Opus 4.8", - "display_name": "Claude Opus 4.8", + "id": "gemma-3-12b-it", + "name": "Google Gemma 3 12B", + "display_name": "Google Gemma 3 12B", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, + "context": 131072, + "output": 8192 + }, + "temperature": true, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": true, + "knowledge": "2024-12", + "release_date": "2025-03-12", + "last_updated": "2025-03-12", + "type": "chat" + }, + { + "id": "sonar", + "name": "Perplexity Sonar", + "display_name": "Perplexity Sonar", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 127000, + "output": 4096 + }, + "temperature": true, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2024-01-01", + "last_updated": "2025-09-01", + "type": "chat" + }, + { + "id": "gpt-5.1-codex", + "name": "OpenAI: GPT-5.1 Codex", + "display_name": "OpenAI: GPT-5.1 Codex", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 400000, "output": 128000 }, "temperature": false, @@ -10815,53 +10952,46 @@ "supported": true, "default_enabled": false, "mode": "effort", - "effort": "high", + "effort": "none", "effort_options": [ + "none", "low", "medium", - "high", - "xhigh", - "max" + "high" ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." - ] + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2026-01", - "release_date": "2026-05-28", - "last_updated": "2026-05-28", + "knowledge": "2025-01", + "release_date": "2025-11-13", + "last_updated": "2025-11-13", "type": "chat" }, { - "id": "anthropic/claude-opus-5.5", - "name": "Claude Opus 5.5", - "display_name": "Claude Opus 5.5", + "id": "kimi-k2-thinking", + "name": "Kimi K2 Thinking", + "display_name": "Kimi K2 Thinking", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 256000, + "output": 262144 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -10869,131 +10999,118 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, + "attachment": false, + "open_weights": true, + "knowledge": "2025-11", + "release_date": "2025-11-06", + "last_updated": "2025-11-06", + "type": "chat" + }, + { + "id": "claude-3-haiku-20240307", + "name": "Anthropic: Claude 3 Haiku", + "display_name": "Anthropic: Claude 3 Haiku", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 200000, + "output": 4096 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, "attachment": true, "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "knowledge": "2024-03", + "release_date": "2024-03-13", + "last_updated": "2024-03-13", "type": "chat" }, { - "id": "anthropic/claude-fable-5.1", - "name": "Claude Fable 5.1", - "display_name": "Claude Fable 5.1", + "id": "gpt-4.1", + "name": "OpenAI GPT-4.1", + "display_name": "OpenAI GPT-4.1", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 1047576, + "output": 32768 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", - "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", - "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." - ] - } + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-09-01", - "last_updated": "2026-09-01", + "knowledge": "2025-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", "type": "chat" }, { - "id": "anthropic/claude-opus-5", - "name": "Claude Opus 5", - "display_name": "Claude Opus 5", + "id": "claude-4.5-haiku", + "name": "Anthropic: Claude 4.5 Haiku", + "display_name": "Anthropic: Claude 4.5 Haiku", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 200000, + "output": 8192 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ] - } - }, "attachment": true, "open_weights": false, - "knowledge": "2026-05", - "release_date": "2026-07-24", - "last_updated": "2026-07-24", + "knowledge": "2025-10", + "release_date": "2025-10-15", + "last_updated": "2025-10-15", "type": "chat" }, { - "id": "anthropic/claude-opus-4.5", - "name": "Claude Opus 4.5 (latest)", - "display_name": "Claude Opus 4.5 (latest)", + "id": "claude-opus-4-1-20250805", + "name": "Anthropic: Claude Opus 4.1 (20250805)", + "display_name": "Anthropic: Claude Opus 4.1 (20250805)", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" @@ -11001,7 +11118,7 @@ }, "limit": { "context": 200000, - "output": 64000 + "output": 32000 }, "temperature": true, "tool_call": true, @@ -11013,17 +11130,11 @@ "reasoning": { "supported": true, "default_enabled": false, - "mode": "mixed", + "mode": "budget", "budget": { "min": 1024, "unit": "tokens" }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high" - ], "interleaved": true, "summaries": true, "visibility": "summary", @@ -11031,146 +11142,106 @@ "thinking_blocks" ], "notes": [ - "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-05", - "release_date": "2025-11-24", - "last_updated": "2025-11-24", + "knowledge": "2025-08", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "anthropic/claude-sonnet-4.6", - "name": "Claude Sonnet 4.6", - "display_name": "Claude Sonnet 4.6", + "id": "sonar-deep-research", + "name": "Perplexity Sonar Deep Research", + "display_name": "Perplexity Sonar Deep Research", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 127000, + "output": 4096 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", "effort_options": [ + "minimal", "low", "medium", - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." + "high" ] } }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-17", - "last_updated": "2026-03-13", + "knowledge": "2025-01", + "release_date": "2025-02-01", + "last_updated": "2025-09-01", "type": "chat" }, { - "id": "anthropic/claude-sonnet-4.5", - "name": "Claude Sonnet 4.5 (latest)", - "display_name": "Claude Sonnet 4.5 (latest)", + "id": "grok-4", + "name": "xAI Grok 4", + "display_name": "xAI Grok 4", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 256000, + "output": 256000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": false + "supported": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." - ] + "supported": true } }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-07-31", - "release_date": "2025-09-29", - "last_updated": "2025-09-29", + "knowledge": "2024-07", + "release_date": "2024-07-09", + "last_updated": "2024-07-09", "type": "chat" }, { - "id": "anthropic/claude-sonnet-5.5", - "name": "Claude Sonnet 5.5", - "display_name": "Claude Sonnet 5.5", + "id": "o3-pro", + "name": "OpenAI o3 Pro", + "display_name": "OpenAI o3 Pro", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 200000, + "output": 100000 }, "temperature": false, "tool_call": true, @@ -11180,96 +11251,91 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ "low", "medium", - "high", - "xhigh", - "max" - ] + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-09-28", - "last_updated": "2026-09-28", + "knowledge": "2024-06", + "release_date": "2025-06-10", + "last_updated": "2025-06-10", "type": "chat" }, { - "id": "anthropic/claude-fable-5", - "name": "Claude Fable 5", - "display_name": "Claude Fable 5", + "id": "gpt-5.1", + "name": "OpenAI GPT-5.1", + "display_name": "OpenAI GPT-5.1", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, + "context": 400000, "output": 128000 }, "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, + "default_enabled": false, "mode": "effort", - "effort": "high", + "effort": "none", "effort_options": [ + "none", "low", "medium", - "high", - "xhigh", - "max" + "high" ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" ], - "notes": [ - "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", - "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", - "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." - ] + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-09", - "last_updated": "2026-06-09", + "knowledge": "2025-01", + "release_date": "2025-11-13", + "last_updated": "2025-11-13", "type": "chat" }, { - "id": "volcengine/doubao-seed-character", - "name": "Seed Character", - "display_name": "Seed Character", + "id": "deepseek-v3.1-terminus", + "name": "DeepSeek V3.1 Terminus", + "display_name": "DeepSeek V3.1 Terminus", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 256000 + "context": 128000, + "output": 16384 }, "temperature": true, "tool_call": true, @@ -11277,149 +11343,186 @@ "supported": true, "default": true }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2026-06-23", - "last_updated": "2026-06-23", + "knowledge": "2025-09", + "release_date": "2025-09-22", + "last_updated": "2025-09-22", "type": "chat" }, { - "id": "volcengine/doubao-seed-2.0-pro", - "name": "Seed 2.0 Pro", - "display_name": "Seed 2.0 Pro", + "id": "llama-3.1-8b-instruct-turbo", + "name": "Meta Llama 3.1 8B Instruct Turbo", + "display_name": "Meta Llama 3.1 8B Instruct Turbo", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 256000, + "context": 128000, "output": 128000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": true, - "open_weights": false, - "release_date": "2026-02-14", - "last_updated": "2026-02-14", + "attachment": false, + "open_weights": true, + "knowledge": "2024-07", + "release_date": "2024-07-23", + "last_updated": "2024-07-23", "type": "chat" }, { - "id": "volcengine/doubao-seed-2.0-code", - "name": "Seed 2.0 Code", - "display_name": "Seed 2.0 Code", + "id": "claude-sonnet-4", + "name": "Anthropic: Claude Sonnet 4", + "display_name": "Anthropic: Claude Sonnet 4", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 128000 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + ] + } }, "attachment": true, "open_weights": false, - "release_date": "2026-02-14", - "last_updated": "2026-02-14", + "knowledge": "2025-05", + "release_date": "2025-05-22", + "last_updated": "2025-05-22", "type": "chat" }, { - "id": "volcengine/doubao-seed-2.1-pro", - "name": "Seed 2.1 Pro", - "display_name": "Seed 2.1 Pro", + "id": "gpt-5-codex", + "name": "OpenAI: GPT-5 Codex", + "display_name": "OpenAI: GPT-5 Codex", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 256000 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": true, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "minimal", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": false, "open_weights": false, - "release_date": "2026-06-23", - "last_updated": "2026-06-23", + "knowledge": "2025-01", + "release_date": "2025-09-15", + "last_updated": "2025-09-15", "type": "chat" }, { - "id": "volcengine/doubao-seed-2.0-mini", - "name": "Seed 2.0 Mini", - "display_name": "Seed 2.0 Mini", + "id": "chatgpt-4o-latest", + "name": "OpenAI ChatGPT-4o", + "display_name": "OpenAI ChatGPT-4o", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 32000 + "context": 128000, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": true, "open_weights": false, - "release_date": "2026-02-14", - "last_updated": "2026-02-14", + "knowledge": "2024-08", + "release_date": "2024-08-14", + "last_updated": "2024-08-14", "type": "chat" }, { - "id": "volcengine/doubao-seed-2.1-turbo", - "name": "Seed 2.1 Turbo", - "display_name": "Seed 2.1 Turbo", + "id": "deepseek-r1-distill-llama-70b", + "name": "DeepSeek R1 Distill Llama 70B", + "display_name": "DeepSeek R1 Distill Llama 70B", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 256000 + "context": 128000, + "output": 4096 }, "temperature": true, "tool_call": true, @@ -11427,137 +11530,106 @@ "supported": true, "default": true }, - "attachment": true, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": false, "open_weights": false, - "release_date": "2026-06-23", - "last_updated": "2026-06-23", + "knowledge": "2025-01", + "release_date": "2025-01-20", + "last_updated": "2025-01-20", "type": "chat" }, { - "id": "volcengine/doubao-seed-2.0-lite", - "name": "Seed 2.0 Lite", - "display_name": "Seed 2.0 Lite", + "id": "deepseek-tng-r1t2-chimera", + "name": "DeepSeek TNG R1T2 Chimera", + "display_name": "DeepSeek TNG R1T2 Chimera", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 32000 + "context": 130000, + "output": 163840 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2026-02-14", - "last_updated": "2026-02-14", + "knowledge": "2025-07", + "release_date": "2025-07-02", + "last_updated": "2025-07-02", "type": "chat" }, { - "id": "volcengine/doubao-seed-evolving", - "name": "Seed Evolving", - "display_name": "Seed Evolving", + "id": "qwen3-next-80b-a3b-instruct", + "name": "Qwen3 Next 80B A3B Instruct", + "display_name": "Qwen3 Next 80B A3B Instruct", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 256000 + "context": 262000, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": true, - "open_weights": false, - "release_date": "2026-06-23", - "last_updated": "2026-06-23", + "attachment": false, + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2025-09", + "last_updated": "2025-09", "type": "chat" - } - ] - }, - "lowrouter": { - "id": "lowrouter", - "name": "LowRouter", - "display_name": "LowRouter", - "api": "https://api.lowrouter.ai/v1", - "doc": "https://lowrouter.ai/docs/models/available", - "models": [ + }, { - "id": "auto/openai/gpt-5.2", - "name": "GPT-5.2", - "display_name": "GPT-5.2", + "id": "mistral-nemo", + "name": "Mistral Nemo", + "display_name": "Mistral Nemo", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 128000, + "output": 16400 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": false + "supported": false }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } - }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2025-12-11", - "last_updated": "2025-12-11", + "attachment": false, + "open_weights": true, + "knowledge": "2024-07", + "release_date": "2024-07-18", + "last_updated": "2024-07-18", "type": "chat" }, { - "id": "auto/openai/gpt-5.4-mini", - "name": "GPT-5.4 mini", - "display_name": "GPT-5.4 mini", + "id": "gpt-5-mini", + "name": "OpenAI GPT-5 Mini", + "display_name": "OpenAI GPT-5 Mini", "modalities": { "input": [ "text", @@ -11571,24 +11643,23 @@ "context": 400000, "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, + "default_enabled": true, "mode": "effort", - "effort": "none", + "effort": "medium", "effort_options": [ - "none", + "minimal", "low", "medium", - "high", - "xhigh" + "high" ], "verbosity": "medium", "verbosity_options": [ @@ -11601,150 +11672,122 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-17", - "last_updated": "2026-03-17", + "knowledge": "2025-01", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "auto/openai/gpt-5.6-sol", - "name": "GPT-5.6 Sol", - "display_name": "GPT-5.6 Sol", + "id": "llama-prompt-guard-2-86m", + "name": "Meta Llama Prompt Guard 2 86M", + "display_name": "Meta Llama Prompt Guard 2 86M", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 512, + "output": 2 }, - "temperature": false, - "tool_call": true, + "temperature": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "attachment": false, + "open_weights": true, + "knowledge": "2024-10", + "release_date": "2025-04-29", + "last_updated": "2025-04-29", "type": "chat" }, { - "id": "auto/openai/gpt-5-nano", - "name": "GPT-5 Nano", - "display_name": "GPT-5 Nano", + "id": "llama-3.1-8b-instruct", + "name": "Meta Llama 3.1 8B Instruct", + "display_name": "Meta Llama 3.1 8B Instruct", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 16384, + "output": 16384 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "minimal", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-05-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "attachment": false, + "open_weights": true, + "knowledge": "2024-07", + "release_date": "2024-07-23", + "last_updated": "2024-07-23", "type": "chat" }, { - "id": "auto/openai/gpt-4o", - "name": "GPT-4o", - "display_name": "GPT-4o", + "id": "claude-haiku-4-5-20251001", + "name": "Anthropic: Claude 4.5 Haiku (20251001)", + "display_name": "Anthropic: Claude 4.5 Haiku (20251001)", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 200000, + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + ] + } }, "attachment": true, "open_weights": false, - "knowledge": "2023-09", - "release_date": "2024-05-13", - "last_updated": "2024-08-06", + "knowledge": "2025-10", + "release_date": "2025-10-15", + "last_updated": "2025-10-15", "type": "chat" }, { - "id": "auto/openai/gpt-oss-safeguard-20b", - "name": "GPT OSS Safeguard 20B", - "display_name": "GPT OSS Safeguard 20B", + "id": "qwen3-coder-30b-a3b-instruct", + "name": "Qwen3 Coder 30B A3B Instruct", + "display_name": "Qwen3 Coder 30B A3B Instruct", "modalities": { "input": [ "text" @@ -11754,94 +11797,67 @@ ] }, "limit": { - "context": 131072, - "output": 131072 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, "open_weights": true, - "release_date": "2025-10-29", - "last_updated": "2025-10-29", + "knowledge": "2025-07", + "release_date": "2025-07-31", + "last_updated": "2025-07-31", "type": "chat" }, { - "id": "auto/openai/gpt-5.6-luna", - "name": "GPT-5.6 Luna", - "display_name": "GPT-5.6 Luna", + "id": "qwen2.5-coder-7b-fast", + "name": "Qwen2.5 Coder 7B fast", + "display_name": "Qwen2.5 Coder 7B fast", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 32000, + "output": 8192 }, - "temperature": false, - "tool_call": true, + "temperature": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "knowledge": "2024-09", + "release_date": "2024-09-15", + "last_updated": "2024-09-15", "type": "chat" }, { - "id": "auto/openai/gpt-5.6-terra", - "name": "GPT-5.6 Terra", - "display_name": "GPT-5.6 Terra", + "id": "gemini-2.5-flash", + "name": "Google Gemini 2.5 Flash", + "display_name": "Google Gemini 2.5 Flash", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1048576, + "output": 65535 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -11851,96 +11867,75 @@ "reasoning": { "supported": true, "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "mode": "budget", + "budget": { + "default": -1, + "min": 0, + "max": 24576, + "auto": -1, + "off": 0, + "unit": "tokens" + }, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "knowledge": "2025-06", + "release_date": "2025-06-17", + "last_updated": "2025-06-17", "type": "chat" }, { - "id": "auto/openai/o3", - "name": "o3", - "display_name": "o3", + "id": "mistral-small", + "name": "Mistral Small 3.2", + "display_name": "Mistral Small 3.2", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 128000, + "output": 16384 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2024-05", - "release_date": "2025-04-16", - "last_updated": "2025-04-16", + "open_weights": true, + "knowledge": "2025-03", + "release_date": "2025-06-20", + "last_updated": "2025-06-20", "type": "chat" }, { - "id": "auto/openai/gpt-6-sol", - "name": "GPT-6 Sol", - "display_name": "GPT-6 Sol", + "id": "gpt-oss-120b", + "name": "OpenAI GPT-OSS 120b", + "display_name": "OpenAI GPT-OSS 120b", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 131072, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -11948,67 +11943,55 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ - "none", "low", "medium", - "high", - "xhigh" + "high" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-04-20", - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "attachment": false, + "open_weights": true, + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "auto/openai/gpt-6.1-sol", - "name": "GPT-6.1 Sol", - "display_name": "GPT-6.1 Sol", + "id": "grok-4-fast-reasoning", + "name": "xAI: Grok 4 Fast Reasoning", + "display_name": "xAI: Grok 4 Fast Reasoning", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 2000000, + "output": 2000000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ] - } - }, "attachment": true, "open_weights": false, - "knowledge": "2026-04-30", - "release_date": "2026-09-29", - "last_updated": "2026-09-29", + "knowledge": "2025-09", + "release_date": "2025-12-18", + "last_updated": "2025-12-18", "type": "chat" }, { - "id": "auto/openai/gpt-oss-safeguard-120b", - "name": "GPT OSS Safeguard 120B", - "display_name": "GPT OSS Safeguard 120B", + "id": "llama-prompt-guard-2-22m", + "name": "Meta Llama Prompt Guard 2 22M", + "display_name": "Meta Llama Prompt Guard 2 22M", "modalities": { "input": [ "text" @@ -12018,57 +12001,55 @@ ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 512, + "output": 2 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, "open_weights": true, - "release_date": "2025-10-29", - "last_updated": "2025-10-29", + "knowledge": "2024-10", + "release_date": "2025-04-29", + "last_updated": "2025-04-29", "type": "chat" }, { - "id": "auto/openai/gpt-5.4", - "name": "GPT-5.4", - "display_name": "GPT-5.4", + "id": "gpt-5", + "name": "OpenAI GPT-5", + "display_name": "OpenAI GPT-5", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1050000, + "context": 400000, "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, + "default_enabled": true, "mode": "effort", - "effort": "none", + "effort": "medium", "effort_options": [ - "none", + "minimal", "low", "medium", - "high", - "xhigh" + "high" ], "verbosity": "medium", "verbosity_options": [ @@ -12081,60 +12062,56 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-05", - "last_updated": "2026-03-05", + "knowledge": "2025-01", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "auto/openai/gpt-4.1-mini", - "name": "GPT-4.1 mini", - "display_name": "GPT-4.1 mini", + "id": "qwen3-coder", + "name": "Qwen3 Coder 480B A35B Instruct Turbo", + "display_name": "Qwen3 Coder 480B A35B Instruct Turbo", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1047576, - "output": 32768 + "context": 262144, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-04-14", - "last_updated": "2025-04-14", + "attachment": false, + "open_weights": true, + "knowledge": "2025-07", + "release_date": "2025-07-22", + "last_updated": "2025-07-22", "type": "chat" }, { - "id": "auto/openai/gpt-6-astra", - "name": "GPT-6 Astra", - "display_name": "GPT-6 Astra", + "id": "glm-4.6", + "name": "Zai GLM-4.6", + "display_name": "Zai GLM-4.6", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 204800, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -12142,37 +12119,61 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ] + "supported": true } }, + "attachment": false, + "open_weights": true, + "knowledge": "2024-07", + "release_date": "2025-09-30", + "last_updated": "2025-09-30", + "type": "chat" + }, + { + "id": "gpt-5.1-chat-latest", + "name": "OpenAI GPT-5.1 Chat", + "display_name": "OpenAI GPT-5.1 Chat", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 128000, + "output": 16384 + }, + "temperature": false, + "tool_call": true, + "reasoning": { + "supported": false + }, "attachment": true, "open_weights": false, - "knowledge": "2026-04-30", - "release_date": "2026-09-04", - "last_updated": "2026-09-04", + "knowledge": "2025-01", + "release_date": "2025-11-13", + "last_updated": "2025-11-13", "type": "chat" }, { - "id": "auto/openai/gpt-oss-120b", - "name": "GPT OSS 120B", - "display_name": "GPT OSS 120B", + "id": "claude-4.5-sonnet", + "name": "Anthropic: Claude Sonnet 4.5", + "display_name": "Anthropic: Claude Sonnet 4.5", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, @@ -12180,43 +12181,31 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "low", - "medium", - "high" - ] - } - }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "attachment": true, + "open_weights": false, + "knowledge": "2025-09", + "release_date": "2025-09-29", + "last_updated": "2025-09-29", "type": "chat" }, { - "id": "auto/openai/gpt-5.5", - "name": "GPT-5.5", - "display_name": "GPT-5.5", + "id": "o1-mini", + "name": "OpenAI: o1-mini", + "display_name": "OpenAI: o1-mini", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 128000, + "output": 65536 }, "temperature": false, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true @@ -12228,13 +12217,6 @@ "mode": "effort", "effort": "medium", "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ "low", "medium", "high" @@ -12242,29 +12224,27 @@ "visibility": "hidden" } }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-12-01", - "release_date": "2026-04-23", - "last_updated": "2026-04-23", + "knowledge": "2025-01", + "release_date": "2025-01-01", + "last_updated": "2025-01-01", "type": "chat" }, { - "id": "auto/openai/gpt-4o-mini", - "name": "GPT-4o mini", - "display_name": "GPT-4o mini", + "id": "kimi-k2-0905", + "name": "Kimi K2 (09/05)", + "display_name": "Kimi K2 (09/05)", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 128000, + "context": 262144, "output": 16384 }, "temperature": true, @@ -12272,31 +12252,30 @@ "reasoning": { "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2023-09", - "release_date": "2024-07-18", - "last_updated": "2024-07-18", + "attachment": false, + "open_weights": true, + "knowledge": "2025-09", + "release_date": "2025-09-05", + "last_updated": "2025-09-05", "type": "chat" }, { - "id": "auto/openai/gpt-5-mini", - "name": "GPT-5 Mini", - "display_name": "GPT-5 Mini", + "id": "qwen3-32b", + "name": "Qwen3 32B", + "display_name": "Qwen3 32B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 131072, + "output": 40960 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -12305,35 +12284,25 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "minimal", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-05-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-04-28", + "last_updated": "2025-04-28", "type": "chat" }, { - "id": "auto/openai/gpt-oss-20b", - "name": "GPT OSS 20B", - "display_name": "GPT OSS 20B", + "id": "deepseek-reasoner", + "name": "DeepSeek Reasoner", + "display_name": "DeepSeek Reasoner", "modalities": { "input": [ "text" @@ -12343,11 +12312,11 @@ ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 128000, + "output": 64000 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true @@ -12355,24 +12324,25 @@ "extra_capabilities": { "reasoning": { "supported": true, - "effort_options": [ - "low", - "medium", - "high" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, "attachment": false, "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "knowledge": "2025-01", + "release_date": "2025-12-01", + "last_updated": "2026-02-28", "type": "chat" }, { - "id": "auto/openai/gpt-5", - "name": "GPT-5", - "display_name": "GPT-5", + "id": "llama-4-scout", + "name": "Meta Llama 4 Scout 17B 16E", + "display_name": "Meta Llama 4 Scout 17B 16E", "modalities": { "input": [ "text", @@ -12383,8 +12353,36 @@ ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 131072, + "output": 8192 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2025-04-05", + "last_updated": "2025-04-05", + "type": "chat" + }, + { + "id": "gpt-5-pro", + "name": "OpenAI: GPT-5 Pro", + "display_name": "OpenAI: GPT-5 Pro", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 128000, + "output": 32768 }, "temperature": false, "tool_call": true, @@ -12396,14 +12394,8 @@ "reasoning": { "supported": true, "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "minimal", - "low", - "medium", - "high" - ], + "mode": "fixed", + "effort": "high", "verbosity": "medium", "verbosity_options": [ "low", @@ -12413,89 +12405,96 @@ "visibility": "hidden" } }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "knowledge": "2025-01", + "release_date": "2025-10-06", + "last_updated": "2025-10-06", "type": "chat" }, { - "id": "auto/openai/gpt-6-luna", - "name": "GPT-6 Luna", - "display_name": "GPT-6 Luna", + "id": "claude-opus-4-1", + "name": "Anthropic: Claude Opus 4.1", + "display_name": "Anthropic: Claude Opus 4.1", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 200000, + "output": 32000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" + "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-05-18", - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "knowledge": "2025-08", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "auto/openai/gpt-4.1", - "name": "GPT-4.1", - "display_name": "GPT-4.1", + "id": "sonar-pro", + "name": "Perplexity Sonar Pro", + "display_name": "Perplexity Sonar Pro", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1047576, - "output": 32768 + "context": 200000, + "output": 4096 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-04-14", - "last_updated": "2025-04-14", + "knowledge": "2025-01", + "release_date": "2024-01-01", + "last_updated": "2025-09-01", "type": "chat" }, { - "id": "auto/mistralai/codestral-2508", - "name": "Codestral 25.08", - "display_name": "Codestral 25.08", + "id": "gemma2-9b-it", + "name": "Google Gemma 2", + "display_name": "Google Gemma 2", "modalities": { "input": [ "text" @@ -12505,24 +12504,25 @@ ] }, "limit": { - "context": 128000, + "context": 8192, "output": 8192 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, "attachment": false, "open_weights": false, - "release_date": "2025-07-30", - "last_updated": "2025-07-30", + "knowledge": "2024-06", + "release_date": "2024-06-25", + "last_updated": "2024-06-25", "type": "chat" }, { - "id": "auto/mistralai/mistral-large-4", - "name": "Mistral Large 4", - "display_name": "Mistral Large 4", + "id": "o3", + "name": "OpenAI o3", + "display_name": "OpenAI o3", "modalities": { "input": [ "text", @@ -12533,10 +12533,10 @@ ] }, "limit": { - "context": 524288, - "output": 262144 + "context": 200000, + "output": 100000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -12544,277 +12544,274 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ - "none", + "low", + "medium", "high" - ] + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "release_date": "2026-10-06", - "last_updated": "2026-10-06", + "knowledge": "2024-06", + "release_date": "2025-04-16", + "last_updated": "2025-04-16", "type": "chat" }, { - "id": "auto/mistralai/mistral-large-2512", - "name": "Mistral Large 3", - "display_name": "Mistral Large 3", + "id": "hermes-2-pro-llama-3-8b", + "name": "Hermes 2 Pro Llama 3 8B", + "display_name": "Hermes 2 Pro Llama 3 8B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 131072, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2024-11", - "release_date": "2025-12-02", - "last_updated": "2025-12-02", + "knowledge": "2024-05", + "release_date": "2024-04-30", + "last_updated": "2024-04-30", "type": "chat" }, { - "id": "auto/mistralai/ministral-3b-2512", - "name": "Ministral 3 3B", - "display_name": "Ministral 3 3B", + "id": "llama-3.3-70b-instruct", + "name": "Meta Llama 3.3 70B Instruct", + "display_name": "Meta Llama 3.3 70B Instruct", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 128000, + "output": 16400 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2025-12-02", - "last_updated": "2025-12-02", + "knowledge": "2024-12", + "release_date": "2024-12-06", + "last_updated": "2024-12-06", "type": "chat" }, { - "id": "auto/mistralai/ministral-14b-2512", - "name": "Ministral 3 14B", - "display_name": "Ministral 3 14B", + "id": "sonar-reasoning", + "name": "Perplexity Sonar Reasoning", + "display_name": "Perplexity Sonar Reasoning", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 127000, + "output": 4096 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, - "open_weights": true, - "release_date": "2025-12-02", - "last_updated": "2025-12-02", + "attachment": false, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2025-01-27", + "last_updated": "2025-01-27", "type": "chat" }, { - "id": "auto/mistralai/mistral-small-2603", - "name": "Mistral Small 4", - "display_name": "Mistral Small 4", + "id": "deepseek-v3", + "name": "DeepSeek V3", + "display_name": "DeepSeek V3", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 256000 + "context": 128000, + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "high" - ] - } + "supported": false }, - "attachment": true, - "open_weights": true, - "knowledge": "2025-06", - "release_date": "2026-03-16", - "last_updated": "2026-03-16", + "attachment": false, + "open_weights": false, + "knowledge": "2024-12", + "release_date": "2024-12-26", + "last_updated": "2024-12-26", "type": "chat" }, { - "id": "auto/mistralai/mistral-medium-3.5", - "name": "Mistral Medium 3.5", - "display_name": "Mistral Medium 3.5", + "id": "o1", + "name": "OpenAI: o1", + "display_name": "OpenAI: o1", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 200000, + "output": 100000 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ - "none", + "low", + "medium", "high" - ] + ], + "visibility": "hidden" } }, - "attachment": true, - "open_weights": true, - "release_date": "2026-04-29", - "last_updated": "2026-04-29", + "attachment": false, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2024-12-05", + "last_updated": "2024-12-05", "type": "chat" }, { - "id": "auto/mistralai/ministral-8b-2512", - "name": "Ministral 3 8B", - "display_name": "Ministral 3 8B", + "id": "llama-3.1-8b-instant", + "name": "Meta Llama 3.1 8B Instant", + "display_name": "Meta Llama 3.1 8B Instant", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 131072, + "output": 32678 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2025-12-02", - "last_updated": "2025-12-02", + "knowledge": "2024-07", + "release_date": "2024-07-23", + "last_updated": "2024-07-23", "type": "chat" - } - ] - }, - "neosmith": { - "id": "neosmith", - "name": "NeoSmith", - "display_name": "NeoSmith", - "api": "https://router.neosmith.ai/v1", - "doc": "https://neosmith.ai/docs", - "models": [ + }, { - "id": "neosmith.neolite", - "name": "NeoSmith NeoLite", - "display_name": "NeoSmith NeoLite", + "id": "llama-3.3-70b-versatile", + "name": "Meta Llama 3.3 70B Versatile", + "display_name": "Meta Llama 3.3 70B Versatile", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 512000, - "output": 64000 + "context": 131072, + "output": 32678 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": true, - "open_weights": false, - "release_date": "2026-06-20", - "last_updated": "2026-08-03", + "attachment": false, + "open_weights": true, + "knowledge": "2024-12", + "release_date": "2024-12-06", + "last_updated": "2024-12-06", "type": "chat" }, { - "id": "neosmith.intelligent-basic", - "name": "NeoSmith Basic", - "display_name": "NeoSmith Basic", + "id": "deepseek-v3.2", + "name": "DeepSeek V3.2", + "display_name": "DeepSeek V3.2", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 163840, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": true }, - "attachment": true, - "open_weights": false, - "release_date": "2026-04-26", - "last_updated": "2026-08-03", + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": false, + "open_weights": true, + "knowledge": "2025-09", + "release_date": "2025-12-01", + "last_updated": "2025-12-01", "type": "chat" }, { - "id": "neosmith.intelligent-maestro", - "name": "NeoSmith Maestro", - "display_name": "NeoSmith Maestro", + "id": "gemini-2.5-flash-lite", + "name": "Google Gemini 2.5 Flash Lite", + "display_name": "Google Gemini 2.5 Flash Lite", "modalities": { "input": [ "text", @@ -12825,25 +12822,45 @@ ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 1048576, + "output": 65535 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "default": -1, + "min": 512, + "max": 24576, + "auto": -1, + "unit": "tokens" + }, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] + } }, "attachment": true, "open_weights": false, - "release_date": "2026-08-03", - "last_updated": "2026-08-08", + "knowledge": "2025-07", + "release_date": "2025-06-17", + "last_updated": "2025-06-17", "type": "chat" }, { - "id": "neosmith.intelligent-pro", - "name": "NeoSmith Pro", - "display_name": "NeoSmith Pro", + "id": "llama-4-maverick", + "name": "Meta Llama 4 Maverick 17B 128E", + "display_name": "Meta Llama 4 Maverick 17B 128E", "modalities": { "input": [ "text", @@ -12854,224 +12871,219 @@ ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 131072, + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": true, - "open_weights": false, - "release_date": "2026-04-26", - "last_updated": "2026-07-18", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2025-04-05", + "last_updated": "2025-04-05", "type": "chat" - } - ] - }, - "xai": { - "id": "xai", - "name": "xai", - "display_name": "xai", - "doc": "https://docs.x.ai/docs/models", - "models": [ + }, { - "id": "grok-4.3", - "name": "Grok 4.3", - "display_name": "Grok 4.3", + "id": "claude-3.5-haiku", + "name": "Anthropic: Claude 3.5 Haiku", + "display_name": "Anthropic: Claude 3.5 Haiku", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 30000 + "context": 200000, + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ] - } + "supported": false }, "attachment": true, "open_weights": false, - "release_date": "2026-04-17", - "last_updated": "2026-04-17", + "knowledge": "2024-10", + "release_date": "2024-10-22", + "last_updated": "2024-10-22", "type": "chat" }, { - "id": "grok-4.5", - "name": "Grok 4.5", - "display_name": "Grok 4.5", + "id": "qwen3-30b-a3b", + "name": "Qwen3 30B A3B", + "display_name": "Qwen3 30B A3B", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 500000, - "output": 500000 + "context": 41000, + "output": 41000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": true }, "extra_capabilities": { "reasoning": { "supported": true, - "effort_options": [ - "low", - "medium", - "high", - "xhigh" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, - "attachment": true, - "open_weights": false, - "release_date": "2026-07-08", - "last_updated": "2026-07-08", + "attachment": false, + "open_weights": true, + "knowledge": "2025-06", + "release_date": "2025-04-28", + "last_updated": "2025-04-28", "type": "chat" }, { - "id": "grok-imagine-image", - "name": "Grok Imagine Image", - "display_name": "Grok Imagine Image", + "id": "claude-opus-4", + "name": "Anthropic: Claude Opus 4", + "display_name": "Anthropic: Claude Opus 4", "modalities": { "input": [ "text", "image" ], "output": [ - "image" + "text" ] }, "limit": { - "context": 16000, - "output": 8192 + "context": 200000, + "output": 32000 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + ] + } }, "attachment": true, "open_weights": false, - "release_date": "2026-01-28", - "last_updated": "2026-01-28" + "knowledge": "2025-05", + "release_date": "2025-05-22", + "last_updated": "2025-05-22", + "type": "chat" }, { - "id": "grok-imagine-video-1.5-lite", - "name": "Grok Imagine Video 1.5 Lite", - "display_name": "Grok Imagine Video 1.5 Lite", + "id": "grok-code-fast-1", + "name": "xAI Grok Code Fast 1", + "display_name": "xAI Grok Code Fast 1", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ - "video" + "text" ] }, "limit": { - "context": 1024, - "output": 8192 + "context": 256000, + "output": 10000 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": false, "open_weights": false, - "release_date": "2026-10-01", - "last_updated": "2026-10-01" + "knowledge": "2024-08", + "release_date": "2025-09-02", + "last_updated": "2025-09-02", + "type": "chat" }, { - "id": "grok-4.20-multi-agent-0309", - "name": "Grok 4.20 Multi-Agent", - "display_name": "Grok 4.20 Multi-Agent", + "id": "grok-3-mini", + "name": "xAI Grok 3 Mini", + "display_name": "xAI Grok 3 Mini", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 30000 + "context": 131072, + "output": 131072 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ] - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2026-03-09", - "last_updated": "2026-03-09", + "knowledge": "2024-06", + "release_date": "2024-06-01", + "last_updated": "2024-06-01", "type": "chat" }, { - "id": "grok-4.20-0309-non-reasoning", - "name": "Grok 4.20 (Non-Reasoning)", - "display_name": "Grok 4.20 (Non-Reasoning)", + "id": "qwen3-vl-235b-a22b-instruct", + "name": "Qwen3 VL 235B A22B Instruct", + "display_name": "Qwen3 VL 235B A22B Instruct", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 30000 + "context": 256000, + "output": 16384 }, "temperature": true, "tool_call": true, @@ -13079,219 +13091,211 @@ "supported": false }, "attachment": true, - "open_weights": false, - "release_date": "2026-03-09", - "last_updated": "2026-03-09", + "open_weights": true, + "knowledge": "2025-09", + "release_date": "2025-09-23", + "last_updated": "2025-09-23", "type": "chat" }, { - "id": "grok-4.20-0309-reasoning", - "name": "Grok 4.20 (Reasoning)", - "display_name": "Grok 4.20 (Reasoning)", + "id": "gpt-4.1-mini", + "name": "OpenAI GPT-4.1 Mini", + "display_name": "OpenAI GPT-4.1 Mini", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 30000 + "context": 1047576, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": true, "open_weights": false, - "release_date": "2026-03-09", - "last_updated": "2026-03-09", + "knowledge": "2025-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", "type": "chat" }, { - "id": "grok-4.7", - "name": "Grok 4.7", - "display_name": "Grok 4.7", + "id": "claude-sonnet-4-5-20250929", + "name": "Anthropic: Claude Sonnet 4.5 (20250929)", + "display_name": "Anthropic: Claude Sonnet 4.5 (20250929)", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 500000, - "output": 500000 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "xhigh" + "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-05", - "release_date": "2026-09-21", - "last_updated": "2026-09-21", + "knowledge": "2025-09", + "release_date": "2025-09-29", + "last_updated": "2025-09-29", "type": "chat" }, { - "id": "grok-imagine-video", - "name": "Grok Imagine Video", - "display_name": "Grok Imagine Video", + "id": "gpt-5-chat-latest", + "name": "OpenAI GPT-5 Chat Latest", + "display_name": "OpenAI GPT-5 Chat Latest", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ - "video" + "text" ] }, "limit": { - "context": 1024, - "output": 8192 + "context": 128000, + "output": 16384 }, "temperature": false, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, "attachment": true, "open_weights": false, - "release_date": "2026-01-28", - "last_updated": "2026-01-28" + "knowledge": "2024-09", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", + "type": "chat" }, { - "id": "grok-build-0.1", - "name": "Grok Build 0.1", - "display_name": "Grok Build 0.1", + "id": "grok-4-1-fast-non-reasoning", + "name": "xAI Grok 4.1 Fast Non-Reasoning", + "display_name": "xAI Grok 4.1 Fast Non-Reasoning", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 256000 + "context": 2000000, + "output": 30000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, "attachment": true, "open_weights": false, - "release_date": "2026-04-16", - "last_updated": "2026-04-16", + "knowledge": "2025-11", + "release_date": "2025-11-19", + "last_updated": "2025-11-19", "type": "chat" }, { - "id": "grok-imagine-video-1.5", - "name": "Grok Imagine Video 1.5", - "display_name": "Grok Imagine Video 1.5", + "id": "o3-mini", + "name": "OpenAI o3 Mini", + "display_name": "OpenAI o3 Mini", "modalities": { "input": [ - "text", - "image", - "audio" + "text" ], "output": [ - "video" + "text" ] }, "limit": { - "context": 1024, - "output": 8192 + "context": 200000, + "output": 100000 }, "temperature": false, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": false, - "release_date": "2026-05-30", - "last_updated": "2026-05-30" - }, - { - "id": "grok-imagine-image-quality", - "name": "Grok Imagine Image Quality", - "display_name": "Grok Imagine Image Quality", - "modalities": { - "input": [ - "text", - "image" - ], - "output": [ - "image" - ] - }, - "limit": { - "context": 16000, - "output": 8192 + "supported": true, + "default": true }, - "temperature": false, - "tool_call": false, - "reasoning": { - "supported": false + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2026-04-03", - "last_updated": "2026-04-03" + "knowledge": "2023-10", + "release_date": "2024-12-20", + "last_updated": "2025-01-29", + "type": "chat" }, { - "id": "grok-4.6", - "name": "Grok 4.6", - "display_name": "Grok 4.6", + "id": "o4-mini", + "name": "OpenAI o4 Mini", + "display_name": "OpenAI o4 Mini", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 500000, - "output": 500000 + "context": 200000, + "output": 100000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -13300,110 +13304,136 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ "low", "medium", - "high", - "xhigh" - ] + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2026-02-01", - "release_date": "2026-08-12", - "last_updated": "2026-08-12", + "knowledge": "2024-06", + "release_date": "2025-04-16", + "last_updated": "2025-04-16", "type": "chat" }, { - "id": "grok-3-mini-fast-beta", - "name": "Grok 3 Mini Fast Beta", - "display_name": "Grok 3 Mini Fast Beta", + "id": "llama-guard-4", + "name": "Meta Llama Guard 4 12B", + "display_name": "Meta Llama Guard 4 12B", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 120000, - "output": 100000 + "context": 131072, + "output": 1024 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true, - "effort": "low" - }, - "search": { "supported": false }, - "attachment": false, + "attachment": true, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2025-01-01", + "last_updated": "2025-01-01", "type": "chat" }, { - "id": "grok-3-mini-beta", - "name": "Grok 3 Mini Beta", - "display_name": "Grok 3 Mini Beta", + "id": "gpt-4o-mini", + "name": "OpenAI GPT-4o-mini", + "display_name": "OpenAI GPT-4o-mini", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 120000, - "output": 100000 + "context": 128000, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true, - "effort": "low" - }, - "search": { "supported": false }, - "attachment": false, + "attachment": true, + "open_weights": false, + "knowledge": "2024-07", + "release_date": "2024-07-18", + "last_updated": "2024-07-18", "type": "chat" }, { - "id": "grok-3-fast-beta", - "name": "Grok 3 Fast Beta", - "display_name": "Grok 3 Fast Beta", + "id": "claude-3.7-sonnet", + "name": "Anthropic: Claude 3.7 Sonnet", + "display_name": "Anthropic: Claude 3.7 Sonnet", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 120000, - "output": 100000 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false }, - "search": { - "supported": false + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": false, + "summaries": false, + "visibility": "full", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Anthropic uses thinking budget tokens" + ] + } }, - "attachment": false, + "attachment": true, + "open_weights": false, + "knowledge": "2025-02", + "release_date": "2025-02-19", + "last_updated": "2025-02-19", "type": "chat" }, { - "id": "grok-2-vision-1212", - "name": "Grok 2 Vision 1212", - "display_name": "Grok 2 Vision 1212", + "id": "claude-4.5-opus", + "name": "Anthropic: Claude Opus 4.5", + "display_name": "Anthropic: Claude Opus 4.5", "modalities": { "input": [ "text", @@ -13414,24 +13444,26 @@ ] }, "limit": { - "context": 32000, - "output": 32000 + "context": 200000, + "output": 64000 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false - }, - "search": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "attachment": true, + "open_weights": false, + "knowledge": "2025-11", + "release_date": "2025-11-24", + "last_updated": "2025-11-24", "type": "chat" }, { - "id": "grok-2-image-1212", - "name": "Grok 2 Image 1212", - "display_name": "Grok 2 Image 1212", + "id": "gpt-5-nano", + "name": "OpenAI GPT-5 Nano", + "display_name": "OpenAI GPT-5 Nano", "modalities": { "input": [ "text", @@ -13442,24 +13474,47 @@ ] }, "limit": { - "context": 130000, - "output": 100000 + "context": 400000, + "output": 128000 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "search": { - "supported": false + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "minimal", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } }, - "attachment": false, + "attachment": true, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "grok-3-beta", - "name": "Grok 3 Beta", - "display_name": "Grok 3 Beta", + "id": "qwen3-235b-a22b-thinking", + "name": "Qwen3 235B A22B Thinking", + "display_name": "Qwen3 235B A22B Thinking", "modalities": { "input": [ "text" @@ -13469,90 +13524,102 @@ ] }, "limit": { - "context": 120000, - "output": 100000 + "context": 262144, + "output": 81920 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "search": { - "supported": false + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, + "open_weights": true, + "knowledge": "2025-07", + "release_date": "2025-07-25", + "last_updated": "2025-07-25", "type": "chat" }, { - "id": "grok-2-1212", - "name": "Grok 2 1212", - "display_name": "Grok 2 1212", + "id": "gpt-4.1-mini-2025-04-14", + "name": "OpenAI GPT-4.1 Mini", + "display_name": "OpenAI GPT-4.1 Mini", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 120000, - "output": 100000 + "context": 1047576, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "search": { - "supported": false - }, - "attachment": false, + "attachment": true, + "open_weights": false, + "knowledge": "2025-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", "type": "chat" } ] }, - "amazon-bedrock": { - "id": "amazon-bedrock", - "name": "Amazon Bedrock", - "display_name": "Amazon Bedrock", - "doc": "https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html", + "llmgateway": { + "id": "llmgateway", + "name": "DevPass (LLM Gateway)", + "display_name": "DevPass (LLM Gateway)", + "api": "https://api.llmgateway.io/v1", + "doc": "https://llmgateway.io/docs", "models": [ { - "id": "us.amazon.nova-pro-v1:0", - "name": "Nova Pro (US)", - "display_name": "Nova Pro (US)", + "id": "llama-3.2-11b-instruct", + "name": "Llama 3.2 11B Instruct", + "display_name": "Llama 3.2 11B Instruct", "modalities": { "input": [ - "text", - "image", - "video", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 300000, - "output": 10000 + "context": 128000, + "output": 8192 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-10", - "release_date": "2024-12-03", - "last_updated": "2024-12-03", + "attachment": false, + "open_weights": true, + "release_date": "2024-09-25", + "last_updated": "2024-09-25", "type": "chat" }, { - "id": "eu.anthropic.claude-opus-4-6-v1", - "name": "Claude Opus 4.6 (EU)", - "display_name": "Claude Opus 4.6 (EU)", + "id": "gpt-6.1-terra", + "name": "GPT-6.1 Terra", + "display_name": "GPT-6.1 Terra", "modalities": { "input": [ "text", @@ -13564,99 +13631,91 @@ ] }, "limit": { - "context": 1000000, + "context": 1050000, "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", "effort_options": [ + "none", "low", "medium", "high", + "xhigh", "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-05-31", - "release_date": "2026-02-05", - "last_updated": "2026-03-13", + "knowledge": "2026-06-01", + "release_date": "2026-10-26", + "last_updated": "2026-10-26", "type": "chat" }, { - "id": "apac.amazon.nova-lite-v1:0", - "name": "Nova Lite (APAC)", - "display_name": "Nova Lite (APAC)", + "id": "fugu-ultra-v2.0", + "name": "Fugu Ultra v2.0", + "display_name": "Fugu Ultra v2.0", "modalities": { "input": [ "text", - "image", - "video", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 300000, - "output": 10000 + "context": 1000000, + "output": 1000000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "high", + "xhigh", + "max" + ] + } }, "attachment": true, "open_weights": false, - "knowledge": "2024-10", - "release_date": "2024-12-03", - "last_updated": "2024-12-03", + "release_date": "2026-09-11", + "last_updated": "2026-09-11", "type": "chat" }, { - "id": "us.amazon.nova-2-lite-v1:0", - "name": "Nova 2 Lite (US)", - "display_name": "Nova 2 Lite (US)", + "id": "muse-spark-1.2", + "name": "Muse Spark 1.2", + "display_name": "Muse Spark 1.2", "modalities": { "input": [ "text", "image", "video", - "pdf" + "pdf", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 65535 + "context": 1048576, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -13666,52 +13725,26 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ + "minimal", "low", "medium", - "high" + "high", + "xhigh" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-10", - "release_date": "2025-12-02", - "last_updated": "2025-12-01", - "type": "chat" - }, - { - "id": "amazon.nova-micro-v1:0", - "name": "Nova Micro", - "display_name": "Nova Micro", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 128000, - "output": 10000 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": false, - "knowledge": "2024-10", - "release_date": "2024-12-03", - "last_updated": "2024-12-03", + "release_date": "2026-08-05", + "last_updated": "2026-08-05", "type": "chat" }, { - "id": "apac.anthropic.claude-sonnet-4-20250514-v1:0", - "name": "Claude Sonnet 4 (APAC)", - "display_name": "Claude Sonnet 4 (APAC)", + "id": "claude-sonnet-4-5", + "name": "Claude Sonnet 4.5 (latest)", + "display_name": "Claude Sonnet 4.5 (latest)", "modalities": { "input": [ "text", @@ -13755,28 +13788,30 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2025-03-31", - "release_date": "2025-05-22", - "last_updated": "2025-05-22", + "knowledge": "2025-07-31", + "release_date": "2025-09-29", + "last_updated": "2025-09-29", "type": "chat" }, { - "id": "zai.glm-5", - "name": "GLM-5", - "display_name": "GLM-5", + "id": "claude-fable-5", + "name": "Claude Fable 5", + "display_name": "Claude Fable 5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 202752, - "output": 131072 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -13785,19 +13820,40 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", + "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", + "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." + ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-02-12", - "last_updated": "2026-03-18", + "attachment": true, + "open_weights": false, + "knowledge": "2026-01-31", + "release_date": "2026-06-09", + "last_updated": "2026-06-09", "type": "chat" }, { - "id": "mistral.mistral-large-3-675b-instruct", - "name": "Mistral Large 3", - "display_name": "Mistral Large 3", + "id": "auto", + "name": "Auto Route", + "display_name": "Auto Route", "modalities": { "input": [ "text", @@ -13808,25 +13864,121 @@ ] }, "limit": { - "context": 262144, - "output": 8192 + "context": 128000, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": true, - "open_weights": true, - "knowledge": "2024-11", - "release_date": "2025-12-02", - "last_updated": "2025-12-02", + "open_weights": false, + "release_date": "2024-01-01", + "last_updated": "2024-01-01", "type": "chat" }, { - "id": "us.anthropic.claude-haiku-4-5-20251001-v1:0", - "name": "Claude Haiku 4.5 (US)", - "display_name": "Claude Haiku 4.5 (US)", + "id": "gemini-3.1-pro-preview", + "name": "Gemini 3.1 Pro Preview", + "display_name": "Gemini 3.1 Pro Preview", + "modalities": { + "input": [ + "text", + "image", + "video", + "audio", + "pdf" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1048576, + "output": 65536 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "low", + "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2026-02-19", + "last_updated": "2026-02-19", + "type": "chat" + }, + { + "id": "muse-glimmer-30b", + "name": "Muse Glimmer 30B", + "display_name": "Muse Glimmer 30B", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 131072, + "output": 131072 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "minimal", + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + }, + "attachment": true, + "open_weights": true, + "knowledge": "2026-01-04", + "release_date": "2026-08-10", + "last_updated": "2026-08-10", + "type": "chat" + }, + { + "id": "claude-haiku-4-5", + "name": "Claude Haiku 4.5 (latest)", + "display_name": "Claude Haiku 4.5 (latest)", "modalities": { "input": [ "text", @@ -13876,13 +14028,15 @@ "type": "chat" }, { - "id": "global.anthropic.claude-fable-5-1", - "name": "Claude Fable 5.1 (Global)", - "display_name": "Claude Fable 5.1 (Global)", + "id": "gemini-3-flash-preview", + "name": "Gemini 3 Flash Preview", + "display_name": "Gemini 3 Flash Preview", "modalities": { "input": [ "text", "image", + "video", + "audio", "pdf" ], "output": [ @@ -13890,10 +14044,10 @@ ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 1048576, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -13903,39 +14057,32 @@ "reasoning": { "supported": true, "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ + "mode": "level", + "level": "high", + "level_options": [ + "minimal", "low", "medium", - "high", - "xhigh", - "max" + "high" ], - "interleaved": true, "summaries": true, - "visibility": "omitted", + "visibility": "summary", "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", - "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", - "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." + "thought_signatures" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-09-01", - "last_updated": "2026-09-01", + "knowledge": "2025-01", + "release_date": "2025-12-17", + "last_updated": "2025-12-17", "type": "chat" }, { - "id": "us.openai.gpt-5.6-sol", - "name": "GPT-5.6 Sol (US)", - "display_name": "GPT-5.6 Sol (US)", + "id": "muse-spark-1.2-contributor", + "name": "Muse Spark 1.2 Contributor", + "display_name": "Muse Spark 1.2 Contributor", "modalities": { "input": [ "text", @@ -13946,10 +14093,10 @@ ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1048576, + "output": 1048576 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -13958,72 +14105,91 @@ "extra_capabilities": { "reasoning": { "effort_options": [ - "none", + "minimal", "low", "medium", "high", - "xhigh", - "max" + "xhigh" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "release_date": "2026-08-06", + "last_updated": "2026-08-06", "type": "chat" }, { - "id": "apac.amazon.nova-pro-v1:0", - "name": "Nova Pro (APAC)", - "display_name": "Nova Pro (APAC)", + "id": "qwen3.6-plus", + "name": "Qwen3.6 Plus", + "display_name": "Qwen3.6 Plus", "modalities": { "input": [ "text", "image", - "video", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 300000, - "output": 10000 + "context": 983616, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "none", + "minimal", + "low", + "medium", + "high", + "xhigh", + "max" + ] + } }, "attachment": true, "open_weights": false, - "knowledge": "2024-10", - "release_date": "2024-12-03", - "last_updated": "2024-12-03", + "knowledge": "2025-04", + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "jp.anthropic.claude-haiku-5-5", - "name": "Claude Haiku 5.5 (JP)", - "display_name": "Claude Haiku 5.5 (JP)", + "id": "muse-spark-1.1", + "name": "Muse Spark 1.1", + "display_name": "Muse Spark 1.1", "modalities": { "input": [ "text", "image", - "pdf" + "pdf", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 1048576, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -14031,113 +14197,119 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ + "minimal", "low", "medium", "high", - "xhigh", - "max" + "xhigh" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-10-07", - "last_updated": "2026-10-07", + "release_date": "2026-04-08", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "global.anthropic.claude-opus-4-6-v1", - "name": "Claude Opus 4.6 (Global)", - "display_name": "Claude Opus 4.6 (Global)", + "id": "gpt-oss-20b", + "name": "GPT OSS 20B", + "display_name": "GPT OSS 20B", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 131072, + "output": 32766 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", "effort_options": [ "low", "medium", - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." + "high" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-05-31", - "release_date": "2026-02-05", - "last_updated": "2026-03-13", + "attachment": false, + "open_weights": true, + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "qwen.qwen3-coder-next", - "name": "Qwen3 Coder Next", - "display_name": "Qwen3 Coder Next", + "id": "gpt-5.6-terra", + "name": "GPT-5.6 Terra", + "display_name": "GPT-5.6 Terra", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-09", - "release_date": "2026-02-03", - "last_updated": "2026-02-06", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "moonshot.kimi-k2-thinking", - "name": "Kimi K2 Thinking", - "display_name": "Kimi K2 Thinking", + "id": "hy3", + "name": "Hy3", + "display_name": "Hy3", "modalities": { "input": [ "text" @@ -14148,7 +14320,7 @@ }, "limit": { "context": 262144, - "output": 16000 + "output": 128000 }, "temperature": true, "tool_call": true, @@ -14159,48 +14331,74 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true + "effort_options": [ + "none", + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "attachment": false, "open_weights": true, - "knowledge": "2024-08", - "release_date": "2025-11-06", - "last_updated": "2025-12-02", + "release_date": "2026-07-06", + "last_updated": "2026-07-06", "type": "chat" }, { - "id": "mistral.ministral-3-8b-instruct", - "name": "Ministral 3 8B", - "display_name": "Ministral 3 8B", + "id": "glm-5.2", + "name": "GLM-5.2", + "display_name": "GLM-5.2", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 1048576, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "none", + "minimal", + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + }, + "attachment": false, "open_weights": true, - "release_date": "2025-12-02", - "last_updated": "2025-12-02", + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "global.anthropic.claude-opus-4-8", - "name": "Claude Opus 4.8 (Global)", - "display_name": "Claude Opus 4.8 (Global)", + "id": "grok-4-3", + "name": "Grok 4.3", + "display_name": "Grok 4.3", "modalities": { "input": [ "text", @@ -14213,108 +14411,85 @@ }, "limit": { "context": 1000000, - "output": 128000 + "output": 30000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "high", "effort_options": [ + "none", "low", "medium", - "high", - "xhigh", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." + "high" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-01", - "release_date": "2026-05-28", - "last_updated": "2026-05-28", + "release_date": "2026-04-17", + "last_updated": "2026-04-17", "type": "chat" }, { - "id": "jp.anthropic.claude-opus-4-8", - "name": "Claude Opus 4.8 (JP)", - "display_name": "Claude Opus 4.8 (JP)", + "id": "deepseek-v4-flash", + "name": "DeepSeek V4 Flash", + "display_name": "DeepSeek V4 Flash", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 1050000, + "output": 384000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, + "default_enabled": true, "mode": "effort", "effort": "high", "effort_options": [ "low", - "medium", "high", - "xhigh", "max" ], "interleaved": true, "summaries": true, - "visibility": "omitted", + "visibility": "summary", "continuation": [ "thinking_blocks" ], "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-01", - "release_date": "2026-05-28", - "last_updated": "2026-05-28", + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "minimax.minimax-m2", - "name": "MiniMax-M2", - "display_name": "MiniMax-M2", + "id": "glm-5.3-fast", + "name": "GLM-5.3", + "display_name": "GLM-5.3", "modalities": { "input": [ "text" @@ -14324,8 +14499,8 @@ ] }, "limit": { - "context": 204608, - "output": 128000 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -14333,55 +14508,73 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true - } - }, "attachment": false, "open_weights": true, - "release_date": "2025-10-27", - "last_updated": "2025-10-27", + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "us.meta.llama3-1-70b-instruct-v1:0", - "name": "Llama 3.1 70B Instruct (US)", - "display_name": "Llama 3.1 70B Instruct (US)", + "id": "gpt-5.4", + "name": "GPT-5.4", + "display_name": "GPT-5.4", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 1050000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false }, - "attachment": false, - "open_weights": true, - "knowledge": "2023-12", - "release_date": "2024-07-23", - "last_updated": "2024-07-23", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-03-05", + "last_updated": "2026-03-05", "type": "chat" }, { - "id": "eu.amazon.nova-2-lite-v1:0", - "name": "Nova 2 Lite (EU)", - "display_name": "Nova 2 Lite (EU)", + "id": "claude-sonnet-4-6", + "name": "Claude Sonnet 4.6", + "display_name": "Claude Sonnet 4.6", "modalities": { "input": [ "text", "image", - "video", "pdf" ], "output": [ @@ -14390,34 +14583,53 @@ }, "limit": { "context": 1000000, - "output": 65535 + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", "effort_options": [ "low", "medium", - "high" + "high", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-10", - "release_date": "2025-12-02", - "last_updated": "2025-12-01", + "knowledge": "2025-08-31", + "release_date": "2026-02-17", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "us-gov.openai.gpt-oss-20b-1:0", - "name": "gpt-oss-20b (GovCloud)", - "display_name": "gpt-oss-20b (GovCloud)", + "id": "kimi-k2", + "name": "Kimi K2", + "display_name": "Kimi K2", "modalities": { "input": [ "text" @@ -14427,39 +14639,29 @@ ] }, "limit": { - "context": 128000, + "context": 256000, "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high" - ] - } + "supported": false }, "attachment": false, "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "release_date": "2025-07-11", + "last_updated": "2025-07-11", "type": "chat" }, { - "id": "global.openai.gpt-5.6-luna", - "name": "GPT-5.6 Luna (Global)", - "display_name": "GPT-5.6 Luna (Global)", + "id": "gpt-5.6-sol", + "name": "GPT-5.6 Sol", + "display_name": "GPT-5.6 Sol", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" @@ -14477,6 +14679,10 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ "none", "low", @@ -14484,7 +14690,14 @@ "high", "xhigh", "max" - ] + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, @@ -14495,14 +14708,12 @@ "type": "chat" }, { - "id": "us.anthropic.claude-opus-5-5", - "name": "Claude Opus 5.5 (US)", - "display_name": "Claude Opus 5.5 (US)", + "id": "glm-5.2-fast", + "name": "GLM-5.2", + "display_name": "GLM-5.2", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" @@ -14510,93 +14721,89 @@ }, "limit": { "context": 1000000, - "output": 128000 + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ] - } - }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "attachment": false, + "open_weights": true, + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "us.anthropic.claude-opus-5", - "name": "Claude Opus 5 (US)", - "display_name": "Claude Opus 5 (US)", + "id": "gpt-5.4-mini", + "name": "GPT-5.4 mini", + "display_name": "GPT-5.4 mini", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, + "context": 400000, "output": 128000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", "effort_options": [ + "none", "low", "medium", "high", - "xhigh", - "max" - ] + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2026-05", - "release_date": "2026-07-24", - "last_updated": "2026-07-24", + "knowledge": "2025-08-31", + "release_date": "2026-03-17", + "last_updated": "2026-03-17", "type": "chat" }, { - "id": "anthropic.claude-sonnet-5", - "name": "Claude Sonnet 5", - "display_name": "Claude Sonnet 5", + "id": "minimax-m2.7", + "name": "MiniMax-M2.7", + "display_name": "MiniMax-M2.7", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 204800, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -14604,6 +14811,13 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ "low", "medium", @@ -14613,17 +14827,16 @@ ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-30", - "last_updated": "2026-06-30", + "attachment": false, + "open_weights": true, + "release_date": "2026-03-18", + "last_updated": "2026-03-18", "type": "chat" }, { - "id": "global.xai.grok-4.6", - "name": "Grok 4.6 (Global)", - "display_name": "Grok 4.6 (Global)", + "id": "mistral-small-2603", + "name": "Mistral Small 4", + "display_name": "Mistral Small 4", "modalities": { "input": [ "text", @@ -14634,8 +14847,8 @@ ] }, "limit": { - "context": 500000, - "output": 500000 + "context": 262144, + "output": 256000 }, "temperature": true, "tool_call": true, @@ -14643,27 +14856,17 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ] - } - }, "attachment": true, - "open_weights": false, - "knowledge": "2026-02-01", - "release_date": "2026-08-12", - "last_updated": "2026-08-18", + "open_weights": true, + "knowledge": "2025-06", + "release_date": "2026-03-16", + "last_updated": "2026-03-16", "type": "chat" }, { - "id": "in.openai.gpt-5.6-luna", - "name": "GPT-5.6 Luna (India)", - "display_name": "GPT-5.6 Luna (India)", + "id": "gpt-4o", + "name": "GPT-4o", + "display_name": "GPT-4o", "modalities": { "input": [ "text", @@ -14674,11 +14877,40 @@ "text" ] }, + "limit": { + "context": 128000, + "output": 16384 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": false, + "knowledge": "2023-09", + "release_date": "2024-05-13", + "last_updated": "2024-08-06", + "type": "chat" + }, + { + "id": "deepseek-v4.1-flash", + "name": "DeepSeek V4.1 Flash", + "display_name": "DeepSeek V4.1 Flash", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, "limit": { "context": 1050000, - "output": 128000 + "output": 384000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -14686,70 +14918,90 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ - "none", "low", - "medium", "high", - "xhigh", "max" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-09-10", + "last_updated": "2026-09-10", "type": "chat" }, { - "id": "us.amazon.nova-micro-v1:0", - "name": "Nova Micro (US)", - "display_name": "Nova Micro (US)", + "id": "gpt-5.1-codex-mini", + "name": "GPT-5.1 Codex mini", + "display_name": "GPT-5.1 Codex mini", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 10000 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, "open_weights": false, - "knowledge": "2024-10", - "release_date": "2024-12-03", - "last_updated": "2024-12-03", + "knowledge": "2024-09-30", + "release_date": "2025-11-13", + "last_updated": "2025-11-13", "type": "chat" }, { - "id": "global.anthropic.claude-sonnet-5", - "name": "Claude Sonnet 5 (Global)", - "display_name": "Claude Sonnet 5 (Global)", + "id": "grok-4-7", + "name": "Grok 4.7", + "display_name": "Grok 4.7", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 524288, + "output": 500000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -14758,36 +15010,37 @@ "extra_capabilities": { "reasoning": { "effort_options": [ + "minimal", "low", "medium", "high", - "xhigh", - "max" + "xhigh" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-30", - "last_updated": "2026-06-30", + "knowledge": "2026-05", + "release_date": "2026-09-21", + "last_updated": "2026-09-21", "type": "chat" }, { - "id": "deepseek.v3-v1:0", - "name": "DeepSeek-V3.1", - "display_name": "DeepSeek-V3.1", + "id": "grok-4-1-fast-reasoning", + "name": "Grok 4.1 Fast Reasoning", + "display_name": "Grok 4.1 Fast Reasoning", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 163840, - "output": 81920 + "context": 2000000, + "output": 30000 }, "temperature": true, "tool_call": true, @@ -14798,24 +15051,27 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true + "effort_options": [ + "low", + "medium", + "high" + ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2025-08-21", - "last_updated": "2025-09-18", + "attachment": true, + "open_weights": false, + "release_date": "2025-11-19", + "last_updated": "2025-11-19", "type": "chat" }, { - "id": "eu.amazon.nova-pro-v1:0", - "name": "Nova Pro (EU)", - "display_name": "Nova Pro (EU)", + "id": "gpt-5.6-luna", + "name": "GPT-5.6 Luna", + "display_name": "GPT-5.6 Luna", "modalities": { "input": [ "text", "image", - "video", "pdf" ], "output": [ @@ -14823,29 +15079,55 @@ ] }, "limit": { - "context": 300000, - "output": 10000 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } }, "attachment": true, "open_weights": false, - "knowledge": "2024-10", - "release_date": "2024-12-03", - "last_updated": "2024-12-03", + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "us.anthropic.claude-opus-4-5-20251101-v1:0", - "name": "Claude Opus 4.5 (US)", - "display_name": "Claude Opus 4.5 (US)", + "id": "gemini-3.5-flash-lite", + "name": "Gemini 3.5 Flash Lite", + "display_name": "Gemini 3.5 Flash Lite", "modalities": { "input": [ "text", "image", + "video", + "audio", "pdf" ], "output": [ @@ -14853,66 +15135,48 @@ ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", "effort_options": [ + "minimal", "low", "medium", "high" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-05", - "release_date": "2025-11-24", - "last_updated": "2025-11-24", + "knowledge": "2026-03", + "release_date": "2026-07-21", + "last_updated": "2026-07-21", "type": "chat" }, { - "id": "global.xai.grok-4.7", - "name": "Grok 4.7 (Global)", - "display_name": "Grok 4.7 (Global)", + "id": "minimax-m2.7-highspeed", + "name": "MiniMax-M2.7-highspeed", + "display_name": "MiniMax-M2.7-highspeed", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 500000, - "output": 500000 + "context": 204800, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -14922,25 +15186,32 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ "low", "medium", "high", - "xhigh" + "xhigh", + "max" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-05", - "release_date": "2026-09-21", - "last_updated": "2026-09-28", + "attachment": false, + "open_weights": true, + "release_date": "2026-03-18", + "last_updated": "2026-03-18", "type": "chat" }, { - "id": "us.meta.llama3-1-8b-instruct-v1:0", - "name": "Llama 3.1 8B Instruct (US)", - "display_name": "Llama 3.1 8B Instruct (US)", + "id": "sonar", + "name": "Sonar", + "display_name": "Sonar", "modalities": { "input": [ "text" @@ -14950,25 +15221,25 @@ ] }, "limit": { - "context": 128000, + "context": 130000, "output": 4096 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, "attachment": false, - "open_weights": true, - "knowledge": "2023-12", - "release_date": "2024-07-23", - "last_updated": "2024-07-23", - "type": "chat" + "open_weights": false, + "knowledge": "2025-09-01", + "release_date": "2024-01-01", + "last_updated": "2025-09-01", + "type": "chat" }, { - "id": "meta.llama4-maverick-17b-instruct-v1:0", - "name": "Llama 4 Maverick 17B Instruct", - "display_name": "Llama 4 Maverick 17B Instruct", + "id": "fugu-max", + "name": "Fugu Max", + "display_name": "Fugu Max", "modalities": { "input": [ "text", @@ -14980,37 +15251,48 @@ }, "limit": { "context": 1000000, - "output": 8192 + "output": 1000000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "high", + "xhigh", + "max" + ] + } }, "attachment": true, - "open_weights": true, - "knowledge": "2024-08", - "release_date": "2025-04-05", - "last_updated": "2025-04-05", + "open_weights": false, + "release_date": "2026-09-11", + "last_updated": "2026-09-11", "type": "chat" }, { - "id": "openai.gpt-oss-safeguard-20b", - "name": "GPT OSS Safeguard 20B", - "display_name": "GPT OSS Safeguard 20B", + "id": "kimi-k2.7-code-highspeed", + "name": "Kimi K2.7 Code Highspeed", + "display_name": "Kimi K2.7 Code Highspeed", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 262144, + "output": 262144 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -15018,52 +15300,34 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ + "minimal", "low", "medium", - "high" + "high", + "xhigh", + "max" ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2025-10-29", - "last_updated": "2025-10-29", - "type": "chat" - }, - { - "id": "us.deepseek.r1-v1:0", - "name": "DeepSeek-R1 (US)", - "display_name": "DeepSeek-R1 (US)", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 128000, - "output": 32768 - }, - "temperature": true, - "tool_call": false, - "reasoning": { - "supported": true, - "default": true - }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2024-07", - "release_date": "2025-01-20", - "last_updated": "2025-05-29", + "knowledge": "2025-01", + "release_date": "2026-06-12", + "last_updated": "2026-06-12", "type": "chat" }, { - "id": "us.openai.gpt-6-astra", - "name": "GPT-6 Astra (US)", - "display_name": "GPT-6 Astra (US)", + "id": "qwen-plus-latest", + "name": "Qwen Plus Latest", + "display_name": "Qwen Plus Latest", "modalities": { "input": [ "text", @@ -15074,37 +15338,35 @@ ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1000000, + "output": 8192 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": true }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-04-30", - "release_date": "2026-09-04", - "last_updated": "2026-09-04", + "release_date": "2025-01-25", + "last_updated": "2025-01-25", "type": "chat" }, { - "id": "us.anthropic.claude-opus-4-8", - "name": "Claude Opus 4.8 (US)", - "display_name": "Claude Opus 4.8 (US)", + "id": "claude-opus-4-7", + "name": "Claude Opus 4.7", + "display_name": "Claude Opus 4.7", "modalities": { "input": [ "text", @@ -15153,63 +15415,70 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2026-01", - "release_date": "2026-05-28", - "last_updated": "2026-05-28", + "knowledge": "2026-01-31", + "release_date": "2026-04-16", + "last_updated": "2026-04-16", "type": "chat" }, { - "id": "openai.gpt-6-luna", - "name": "GPT-6 Luna", - "display_name": "GPT-6 Luna", + "id": "gpt-5.1-codex", + "name": "GPT-5.1 Codex", + "display_name": "GPT-5.1 Codex", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1050000, + "context": 400000, "output": 128000 }, "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", "effort_options": [ "none", "low", "medium", - "high", - "xhigh", - "max" - ] + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2026-05-18", - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "knowledge": "2024-09-30", + "release_date": "2025-11-13", + "last_updated": "2025-11-13", "type": "chat" }, { - "id": "google.gemma-4-e2b", - "name": "Gemma 4 E2B IT", - "display_name": "Gemma 4 E2B IT", + "id": "qwen3.5-35b-a3b", + "name": "Qwen3.5 35B-A3B", + "display_name": "Qwen3.5 35B-A3B", "modalities": { "input": [ "text", "image", - "audio", "video" ], "output": [ @@ -15217,8 +15486,8 @@ ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 262144, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -15228,35 +15497,48 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ "none", - "high" + "minimal", + "low", + "medium", + "high", + "xhigh", + "max" ] } }, "attachment": true, "open_weights": true, - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" }, { - "id": "google.gemma-4-26b-a4b", - "name": "Gemma 4 26B A4B IT", - "display_name": "Gemma 4 26B A4B IT", + "id": "glm-5v-turbo", + "name": "GLM-5V-Turbo", + "display_name": "GLM-5V-Turbo", "modalities": { "input": [ "text", "image", - "video" + "video", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 200000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -15267,90 +15549,65 @@ "extra_capabilities": { "reasoning": { "effort_options": [ - "none", - "high" + "low", + "medium", + "high", + "xhigh", + "max" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "open_weights": false, + "release_date": "2026-04-01", + "last_updated": "2026-04-01", "type": "chat" }, { - "id": "anthropic.claude-opus-4-5-20251101-v1:0", - "name": "Claude Opus 4.5", - "display_name": "Claude Opus 4.5", + "id": "gpt-4o-transcribe", + "name": "GPT-4o Transcribe", + "display_name": "GPT-4o Transcribe", "modalities": { "input": [ "text", - "image", - "pdf" + "audio" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 16000, + "output": 16000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." - ] - } + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2025-05", - "release_date": "2025-11-24", - "last_updated": "2025-11-24", + "release_date": "2025-03-20", + "last_updated": "2025-03-20", "type": "chat" }, { - "id": "us-gov.openai.gpt-oss-120b-1:0", - "name": "gpt-oss-120b (GovCloud)", - "display_name": "gpt-oss-120b (GovCloud)", + "id": "qwen3.6-27b", + "name": "Qwen3.6 27B", + "display_name": "Qwen3.6 27B", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 16384, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -15360,71 +15617,67 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "low", - "medium", - "high" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "release_date": "2026-04-22", + "last_updated": "2026-04-22", "type": "chat" }, { - "id": "moonshotai.kimi-k2.5", - "name": "Kimi K2.5", - "display_name": "Kimi K2.5", + "id": "gpt-4.1", + "name": "GPT-4.1", + "display_name": "GPT-4.1", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 16384 + "context": 1000000, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true - } + "supported": false }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-01-27", - "last_updated": "2026-02-06", + "open_weights": false, + "knowledge": "2024-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", "type": "chat" }, { - "id": "openai.gpt-oss-20b", - "name": "gpt-oss-20b", - "display_name": "gpt-oss-20b", + "id": "gemini-pro-latest", + "name": "Gemini Pro Latest", + "display_name": "Gemini Pro Latest", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 131072 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -15441,30 +15694,27 @@ ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "attachment": true, + "open_weights": false, + "release_date": "2026-02-27", + "last_updated": "2026-02-27", "type": "chat" }, { - "id": "us.xai.grok-4.7", - "name": "Grok 4.7 (US)", - "display_name": "Grok 4.7 (US)", + "id": "qwen3.8-2.4t-a95b", + "name": "Qwen3.8 2.4T A95B", + "display_name": "Qwen3.8 2.4T A95B", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 500000, - "output": 500000 + "context": 1010000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -15474,25 +15724,28 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ + "none", + "minimal", "low", "medium", "high", - "xhigh" + "xhigh", + "max" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-05", - "release_date": "2026-09-21", - "last_updated": "2026-09-28", + "attachment": false, + "open_weights": true, + "release_date": "2026-08-12", + "last_updated": "2026-08-12", "type": "chat" }, { - "id": "eu.anthropic.claude-sonnet-4-20250514-v1:0", - "name": "Claude Sonnet 4 (EU)", - "display_name": "Claude Sonnet 4 (EU)", + "id": "claude-fable-5-1", + "name": "Claude Fable 5.1", + "display_name": "Claude Fable 5.1", "modalities": { "input": [ "text", @@ -15504,78 +15757,79 @@ ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], "interleaved": true, "summaries": true, - "visibility": "summary", + "visibility": "omitted", "continuation": [ "thinking_blocks" ], "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", + "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", + "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-03-31", - "release_date": "2025-05-22", - "last_updated": "2025-05-22", + "knowledge": "2026-06", + "release_date": "2026-09-01", + "last_updated": "2026-09-01", "type": "chat" }, { - "id": "us.amazon.nova-premier-v1:0", - "name": "Nova Premier (US)", - "display_name": "Nova Premier (US)", + "id": "glm-4-32b-0414-128k", + "name": "GLM-4 32B (0414-128k)", + "display_name": "GLM-4 32B (0414-128k)", "modalities": { "input": [ - "text", - "image", - "video", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 10000 + "context": 128000, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2024-10", - "release_date": "2025-04-30", - "last_updated": "2025-04-30", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", "type": "chat" }, { - "id": "us.meta.llama4-scout-17b-instruct-v1:0", - "name": "Llama 4 Scout 17B Instruct (US)", - "display_name": "Llama 4 Scout 17B Instruct (US)", + "id": "qwen3-vl-30b-a3b-instruct", + "name": "Qwen3 VL 30B A3B Instruct", + "display_name": "Qwen3 VL 30B A3B Instruct", "modalities": { "input": [ "text", @@ -15586,7 +15840,7 @@ ] }, "limit": { - "context": 10000000, + "context": 262144, "output": 8192 }, "temperature": true, @@ -15596,29 +15850,25 @@ }, "attachment": true, "open_weights": true, - "knowledge": "2024-08", - "release_date": "2025-04-05", - "last_updated": "2025-04-05", + "release_date": "2025-10-04", + "last_updated": "2025-10-04", "type": "chat" }, { - "id": "jp.amazon.nova-2-lite-v1:0", - "name": "Nova 2 Lite (JP)", - "display_name": "Nova 2 Lite (JP)", + "id": "glm-5.3", + "name": "GLM-5.3", + "display_name": "GLM-5.3", "modalities": { "input": [ - "text", - "image", - "video", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 65535 + "context": 1048576, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -15628,39 +15878,42 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ + "none", + "minimal", "low", "medium", - "high" + "high", + "xhigh", + "max" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-10", - "release_date": "2025-12-02", - "last_updated": "2025-12-01", + "attachment": false, + "open_weights": true, + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "au.anthropic.claude-haiku-5-5", - "name": "Claude Haiku 5.5 (AU)", - "display_name": "Claude Haiku 5.5 (AU)", + "id": "grok-4-6", + "name": "Grok 4.6", + "display_name": "Grok 4.6", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 500000, + "output": 500000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -15669,30 +15922,28 @@ "extra_capabilities": { "reasoning": { "effort_options": [ + "minimal", "low", "medium", "high", - "xhigh", - "max" + "xhigh" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-10-07", - "last_updated": "2026-10-07", + "knowledge": "2026-02-01", + "release_date": "2026-08-12", + "last_updated": "2026-08-12", "type": "chat" }, { - "id": "anthropic.claude-opus-4-1-20250805-v1:0", - "name": "Claude Opus 4.1", - "display_name": "Claude Opus 4.1", + "id": "glm-4.7-flashx", + "name": "GLM-4.7-FlashX", + "display_name": "GLM-4.7-FlashX", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" @@ -15700,60 +15951,97 @@ }, "limit": { "context": 200000, - "output": 32000 + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." - ] - } + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2026-01-19", + "last_updated": "2026-01-19", + "type": "chat" + }, + { + "id": "mistral-large-2512", + "name": "Mistral Large 3", + "display_name": "Mistral Large 3", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 262144, + "output": 262144 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2025-03-31", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "open_weights": true, + "knowledge": "2024-11", + "release_date": "2025-12-02", + "last_updated": "2025-12-02", "type": "chat" }, { - "id": "us.openai.gpt-5.6-terra", - "name": "GPT-5.6 Terra (US)", - "display_name": "GPT-5.6 Terra (US)", + "id": "gpt-live-transcribe", + "name": "GPT-Live-Transcribe", + "display_name": "GPT-Live-Transcribe", "modalities": { "input": [ "text", - "image" + "audio" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 8192, + "output": 8192 }, "temperature": false, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": false, + "release_date": "2026-07-28", + "last_updated": "2026-07-28" + }, + { + "id": "mimo-v2.6-pro", + "name": "MiMo-V2.6-Pro", + "display_name": "MiMo-V2.6-Pro", + "modalities": { + "input": [ + "text", + "image", + "audio", + "video" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1048576, + "output": 131072 + }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -15763,6 +16051,7 @@ "reasoning": { "effort_options": [ "none", + "minimal", "low", "medium", "high", @@ -15772,16 +16061,15 @@ } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "open_weights": true, + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "eu.amazon.nova-micro-v1:0", - "name": "Nova Micro (EU)", - "display_name": "Nova Micro (EU)", + "id": "qwen3-14b", + "name": "Qwen3 14B", + "display_name": "Qwen3 14B", "modalities": { "input": [ "text" @@ -15791,59 +16079,82 @@ ] }, "limit": { - "context": 128000, - "output": 10000 + "context": 32768, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, "open_weights": false, - "knowledge": "2024-10", - "release_date": "2024-12-03", - "last_updated": "2024-12-03", + "release_date": "2025-04-28", + "last_updated": "2025-04-28", "type": "chat" }, { - "id": "google.gemma-3-12b-it", - "name": "Gemma 3 12B IT", - "display_name": "Gemma 3 12B IT", + "id": "gemini-3.1-flash-lite", + "name": "Gemini 3.1 Flash Lite", + "display_name": "Gemini 3.1 Flash Lite", "modalities": { "input": [ "text", - "image" + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 1048576, + "output": 65536 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "minimal", + "low", + "medium", + "high" + ] + } }, "attachment": true, - "open_weights": true, - "knowledge": "2024-08", - "release_date": "2025-03-12", - "last_updated": "2025-03-12", + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2026-05-07", + "last_updated": "2026-05-07", "type": "chat" }, { - "id": "eu.anthropic.claude-opus-5-5", - "name": "Claude Opus 5.5 (EU)", - "display_name": "Claude Opus 5.5 (EU)", + "id": "qwen3.7-max", + "name": "Qwen3.7 Max", + "display_name": "Qwen3.7 Max", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" @@ -15851,9 +16162,9 @@ }, "limit": { "context": 1000000, - "output": 128000 + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -15861,7 +16172,10 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ + "none", + "minimal", "low", "medium", "high", @@ -15870,17 +16184,16 @@ ] } }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "release_date": "2026-05-21", + "last_updated": "2026-05-21", "type": "chat" }, { - "id": "us.xai.grok-4.6", - "name": "Grok 4.6 (US)", - "display_name": "Grok 4.6 (US)", + "id": "grok-4", + "name": "Grok 4", + "display_name": "Grok 4", "modalities": { "input": [ "text", @@ -15891,93 +16204,70 @@ ] }, "limit": { - "context": 500000, - "output": 500000 + "context": 256000, + "output": 256000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": true }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ] + "supported": true } }, "attachment": true, "open_weights": false, - "knowledge": "2026-02-01", - "release_date": "2026-08-12", - "last_updated": "2026-08-18", + "release_date": "2025-07-09", + "last_updated": "2025-07-09", "type": "chat" }, { - "id": "anthropic.claude-opus-4-8", - "name": "Claude Opus 4.8", - "display_name": "Claude Opus 4.8", + "id": "qwen3.5-9b", + "name": "Qwen3.5 9B", + "display_name": "Qwen3.5 9B", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 262144, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], "interleaved": true, "summaries": true, - "visibility": "omitted", + "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-01", - "release_date": "2026-05-28", - "last_updated": "2026-05-28", + "open_weights": true, + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" }, { - "id": "us.anthropic.claude-opus-4-7", - "name": "Claude Opus 4.7 (US)", - "display_name": "Claude Opus 4.7 (US)", + "id": "gpt-5.3-codex", + "name": "GPT-5.3 Codex", + "display_name": "GPT-5.3 Codex", "modalities": { "input": [ "text", @@ -15989,67 +16279,60 @@ ] }, "limit": { - "context": 1000000, + "context": 400000, "output": 128000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, + "default_enabled": true, "mode": "effort", - "effort": "high", + "effort": "medium", "effort_options": [ "low", "medium", "high", - "xhigh", - "max" + "xhigh" ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." - ] + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-04-16", - "last_updated": "2026-04-16", + "knowledge": "2025-08-31", + "release_date": "2026-02-05", + "last_updated": "2026-02-05", "type": "chat" }, { - "id": "anthropic.claude-fable-5", - "name": "Claude Fable 5", - "display_name": "Claude Fable 5", + "id": "glm-5-turbo", + "name": "GLM-5-Turbo", + "display_name": "GLM-5-Turbo", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 200000, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -16058,83 +16341,90 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", "effort_options": [ "low", "medium", "high", "xhigh", "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", - "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", - "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." ] } }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-09", - "last_updated": "2026-06-09", + "release_date": "2026-03-16", + "last_updated": "2026-03-16", "type": "chat" }, { - "id": "qwen.qwen3-coder-30b-a3b-v1:0", - "name": "Qwen3-Coder 30B-A3B Instruct", - "display_name": "Qwen3-Coder 30B-A3B Instruct", + "id": "gpt-5.1", + "name": "GPT-5.1", + "display_name": "GPT-5.1", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 131072 + "context": 400000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-07-31", - "last_updated": "2025-09-18", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2024-09-30", + "release_date": "2025-11-13", + "last_updated": "2025-11-13", "type": "chat" }, { - "id": "openai.gpt-6-sol", - "name": "GPT-6 Sol", - "display_name": "GPT-6 Sol", + "id": "qwen3.7-flash", + "name": "Qwen3.7 Flash", + "display_name": "Qwen3.7 Flash", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 983616, + "output": 1000000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -16142,8 +16432,10 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ "none", + "minimal", "low", "medium", "high", @@ -16154,15 +16446,14 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2026-04-20", - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "release_date": "2026-07-15", + "last_updated": "2026-07-15", "type": "chat" }, { - "id": "apac.amazon.nova-micro-v1:0", - "name": "Nova Micro (APAC)", - "display_name": "Nova Micro (APAC)", + "id": "qwen-plus", + "name": "Qwen Plus", + "display_name": "Qwen Plus", "modalities": { "input": [ "text" @@ -16172,158 +16463,79 @@ ] }, "limit": { - "context": 128000, - "output": 10000 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": false, - "knowledge": "2024-10", - "release_date": "2024-12-03", - "last_updated": "2024-12-03", - "type": "chat" - }, - { - "id": "global.anthropic.claude-sonnet-4-6", - "name": "Claude Sonnet 4.6 (Global)", - "display_name": "Claude Sonnet 4.6 (Global)", - "modalities": { - "input": [ - "text", - "image", - "pdf" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 1000000, - "output": 128000 + "context": 131072, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "max" - ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-17", - "last_updated": "2026-03-13", + "knowledge": "2024-04", + "release_date": "2024-01-25", + "last_updated": "2025-09-11", "type": "chat" }, { - "id": "mistral.devstral-2-123b", - "name": "Devstral 2 123B", - "display_name": "Devstral 2 123B", + "id": "mistral-small-2506", + "name": "Mistral Small 3.2", + "display_name": "Mistral Small 3.2", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 8192 + "context": 128000, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2025-12", - "release_date": "2025-12-09", - "last_updated": "2025-12-09", + "knowledge": "2025-03", + "release_date": "2025-06-20", + "last_updated": "2025-06-20", "type": "chat" }, { - "id": "amazon.nova-pro-v1:0", - "name": "Nova Pro", - "display_name": "Nova Pro", + "id": "ling-3.0-flash", + "name": "InclusionAI Ling 3.0 Flash", + "display_name": "InclusionAI Ling 3.0 Flash", "modalities": { "input": [ - "text", - "image", - "video", - "pdf" - ], - "output": [ "text" - ] - }, - "limit": { - "context": 300000, - "output": 10000 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-10", - "release_date": "2024-12-03", - "last_updated": "2024-12-03", - "type": "chat" - }, - { - "id": "openai.gpt-5.6-luna", - "name": "GPT-5.6 Luna", - "display_name": "GPT-5.6 Luna", - "modalities": { - "input": [ - "text", - "image", - "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 262144, + "output": 262144 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -16332,26 +16544,20 @@ "extra_capabilities": { "reasoning": { "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" + "none" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "attachment": false, + "open_weights": true, + "release_date": "2026-07-23", + "last_updated": "2026-07-23", "type": "chat" }, { - "id": "minimax.minimax-m2.1", - "name": "MiniMax-M2.1", - "display_name": "MiniMax-M2.1", + "id": "nemotron-3-ultra-550b", + "name": "Nemotron 3 Ultra 550B A55B", + "display_name": "Nemotron 3 Ultra 550B A55B", "modalities": { "input": [ "text" @@ -16361,8 +16567,8 @@ ] }, "limit": { - "context": 196608, - "output": 131072 + "context": 1048576, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -16370,170 +16576,140 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true - } - }, "attachment": false, "open_weights": true, - "release_date": "2025-12-23", - "last_updated": "2025-12-23", + "knowledge": "2025-09", + "release_date": "2026-06-04", + "last_updated": "2026-06-04", "type": "chat" }, { - "id": "ca.amazon.nova-lite-v1:0", - "name": "Nova Lite (CA)", - "display_name": "Nova Lite (CA)", + "id": "glm-4.5", + "name": "GLM-4.5", + "display_name": "GLM-4.5", "modalities": { "input": [ - "text", - "image", - "video", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 300000, - "output": 10000 + "context": 131000, + "output": 98304 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-10", - "release_date": "2024-12-03", - "last_updated": "2024-12-03", + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-07-28", + "last_updated": "2025-07-28", "type": "chat" }, { - "id": "jp.anthropic.claude-haiku-4-5-20251001-v1:0", - "name": "Claude Haiku 4.5 (JP)", - "display_name": "Claude Haiku 4.5 (JP)", + "id": "seed-1-6-250915", + "name": "Seed 1.6 (250915)", + "display_name": "Seed 1.6 (250915)", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 256000, + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + "effort_options": [ + "minimal", + "low", + "medium", + "high" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-02-28", - "release_date": "2025-10-15", - "last_updated": "2025-10-15", + "open_weights": true, + "release_date": "2025-09-15", + "last_updated": "2025-09-15", "type": "chat" }, { - "id": "au.anthropic.claude-sonnet-4-5-20250929-v1:0", - "name": "Claude Sonnet 4.5 (AU)", - "display_name": "Claude Sonnet 4.5 (AU)", + "id": "qwen-flash", + "name": "Qwen Flash", + "display_name": "Qwen Flash", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 1000000, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-07-31", - "release_date": "2025-09-29", - "last_updated": "2025-09-29", + "knowledge": "2024-04", + "release_date": "2025-07-28", + "last_updated": "2025-07-28", "type": "chat" }, { - "id": "global.zai.glm-5.3", - "name": "GLM-5.3 (Global)", - "display_name": "GLM-5.3 (Global)", + "id": "kimi-k3.1-pro", + "name": "Kimi K3.1 Pro", + "display_name": "Kimi K3.1 Pro", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 1048576, + "output": 131072 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -16541,107 +16717,62 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, "effort_options": [ "low", - "medium", "high", - "xhigh", "max" ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", - "type": "chat" - }, - { - "id": "nvidia.nemotron-nano-12b-v2", - "name": "NVIDIA Nemotron Nano 12B v2 VL BF16", - "display_name": "NVIDIA Nemotron Nano 12B v2 VL BF16", - "modalities": { - "input": [ - "text", - "image" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 131072, - "output": 8192 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, "attachment": true, - "open_weights": true, - "release_date": "2025-10-28", - "last_updated": "2025-10-28", + "open_weights": false, + "release_date": "2026-10-23", + "last_updated": "2026-10-23", "type": "chat" }, { - "id": "global.anthropic.claude-sonnet-4-5-20250929-v1:0", - "name": "Claude Sonnet 4.5 (Global)", - "display_name": "Claude Sonnet 4.5 (Global)", + "id": "qwen3.8-max", + "name": "Qwen3.8 Max Preview", + "display_name": "Qwen3.8 Max Preview", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 1000000, + "output": 1000000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + "effort_options": [ + "low", + "medium", + "xhigh" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-07-31", - "release_date": "2025-09-29", - "last_updated": "2025-09-29", + "release_date": "2026-07-19", + "last_updated": "2026-07-19", "type": "chat" }, { - "id": "in.openai.gpt-5.6-terra", - "name": "GPT-5.6 Terra (India)", - "display_name": "GPT-5.6 Terra (India)", + "id": "gpt-6-luna", + "name": "GPT-6 Luna", + "display_name": "GPT-6 Luna", "modalities": { "input": [ "text", @@ -16676,15 +16807,43 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "knowledge": "2026-05-18", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "au.anthropic.claude-opus-5-5", - "name": "Claude Opus 5.5 (AU)", - "display_name": "Claude Opus 5.5 (AU)", + "id": "ministral-3b-2512", + "name": "Ministral 3B", + "display_name": "Ministral 3B", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 131072, + "output": 8192 + }, + "temperature": true, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": true, + "release_date": "2025-12-02", + "last_updated": "2025-12-02", + "type": "chat" + }, + { + "id": "claude-opus-5-5", + "name": "Claude Opus 5.5", + "display_name": "Claude Opus 5.5", "modalities": { "input": [ "text", @@ -16724,9 +16883,9 @@ "type": "chat" }, { - "id": "google.gemma-3-4b-it", - "name": "Gemma 3 4B IT", - "display_name": "Gemma 3 4B IT", + "id": "fugu-ultra", + "name": "Fugu Ultra", + "display_name": "Fugu Ultra", "modalities": { "input": [ "text", @@ -16736,41 +16895,11 @@ "text" ] }, - "limit": { - "context": 131072, - "output": 4096 - }, - "temperature": true, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": true, - "knowledge": "2024-08", - "release_date": "2025-03-12", - "last_updated": "2025-03-12", - "type": "chat" - }, - { - "id": "au.anthropic.claude-sonnet-5-5", - "name": "Claude Sonnet 5.5 (AU)", - "display_name": "Claude Sonnet 5.5 (AU)", - "modalities": { - "input": [ - "text", - "image", - "pdf" - ], - "output": [ - "text" - ] - }, "limit": { "context": 1000000, - "output": 128000 + "output": 1000000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -16779,8 +16908,6 @@ "extra_capabilities": { "reasoning": { "effort_options": [ - "low", - "medium", "high", "xhigh", "max" @@ -16789,15 +16916,14 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-09-28", - "last_updated": "2026-09-28", + "release_date": "2026-06-15", + "last_updated": "2026-06-15", "type": "chat" }, { - "id": "openai.gpt-5.6-sol", - "name": "GPT-5.6 Sol", - "display_name": "GPT-5.6 Sol", + "id": "claude-opus-4-6", + "name": "Claude Opus 4.6", + "display_name": "Claude Opus 4.6", "modalities": { "input": [ "text", @@ -16809,67 +16935,82 @@ ] }, "limit": { - "context": 1050000, + "context": 1000000, "output": 128000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", "effort_options": [ - "none", "low", "medium", "high", - "xhigh", "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "knowledge": "2025-05-31", + "release_date": "2026-02-05", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "google.gemma-3-27b-it", - "name": "Gemma 3 27B IT", - "display_name": "Gemma 3 27B IT", + "id": "qwen-max", + "name": "Qwen Max", + "display_name": "Qwen Max", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 131072, + "context": 32768, "output": 8192 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, - "attachment": true, - "open_weights": true, - "knowledge": "2024-08", - "release_date": "2025-03-12", - "last_updated": "2025-03-12", + "attachment": false, + "open_weights": false, + "knowledge": "2024-04", + "release_date": "2024-04-03", + "last_updated": "2025-01-25", "type": "chat" }, { - "id": "anthropic.claude-fable-5-1", - "name": "Claude Fable 5.1", - "display_name": "Claude Fable 5.1", + "id": "claude-opus-4-8", + "name": "Claude Opus 4.8", + "display_name": "Claude Opus 4.8", "modalities": { "input": [ "text", @@ -16888,12 +17029,12 @@ "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, + "default_enabled": false, "mode": "effort", "effort": "high", "effort_options": [ @@ -16910,88 +17051,65 @@ "thinking_blocks" ], "notes": [ - "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", - "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", - "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-09-01", - "last_updated": "2026-09-01", + "knowledge": "2026-01", + "release_date": "2026-05-28", + "last_updated": "2026-05-28", "type": "chat" }, { - "id": "au.anthropic.claude-haiku-4-5-20251001-v1:0", - "name": "Claude Haiku 4.5 (AU)", - "display_name": "Claude Haiku 4.5 (AU)", + "id": "glm-4.6v-flashx", + "name": "GLM-4.6V FlashX", + "display_name": "GLM-4.6V FlashX", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 128000, + "output": 16000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." - ] - } + "default": true }, "attachment": true, "open_weights": false, - "knowledge": "2025-02-28", - "release_date": "2025-10-15", - "last_updated": "2025-10-15", + "release_date": "2025-12-08", + "last_updated": "2025-12-08", "type": "chat" }, { - "id": "eu.anthropic.claude-sonnet-5-5", - "name": "Claude Sonnet 5.5 (EU)", - "display_name": "Claude Sonnet 5.5 (EU)", + "id": "kimi-k2.7-code", + "name": "Kimi K2.7 Code", + "display_name": "Kimi K2.7 Code", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 262144, + "output": 262144 }, "temperature": false, "tool_call": true, @@ -17001,7 +17119,16 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ + "none", + "minimal", "low", "medium", "high", @@ -17011,120 +17138,100 @@ } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-09-28", - "last_updated": "2026-09-28", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-06-12", + "last_updated": "2026-06-12", "type": "chat" }, { - "id": "anthropic.claude-haiku-5-5", - "name": "Claude Haiku 5.5", - "display_name": "Claude Haiku 5.5", + "id": "glm-4.6v", + "name": "GLM-4.6V", + "display_name": "GLM-4.6V", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 131072, + "output": 32768 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ] - } - }, "attachment": true, - "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-10-07", - "last_updated": "2026-10-07", + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-12-08", + "last_updated": "2025-12-08", "type": "chat" }, { - "id": "global.anthropic.claude-opus-4-7", - "name": "Claude Opus 4.7 (Global)", - "display_name": "Claude Opus 4.7 (Global)", + "id": "qwen3.6-flash", + "name": "Qwen3.6 Flash", + "display_name": "Qwen3.6 Flash", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 983616, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "high", + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ + "none", + "minimal", "low", "medium", "high", "xhigh", "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-04-16", - "last_updated": "2026-04-16", + "release_date": "2026-04-27", + "last_updated": "2026-04-27", "type": "chat" }, { - "id": "eu.anthropic.claude-opus-5", - "name": "Claude Opus 5 (EU)", - "display_name": "Claude Opus 5 (EU)", + "id": "hy4-preview", + "name": "Hy4 preview", + "display_name": "Hy4 preview", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" @@ -17132,9 +17239,9 @@ }, "limit": { "context": 1000000, - "output": 128000 + "output": 64000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -17142,7 +17249,10 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ + "none", + "minimal", "low", "medium", "high", @@ -17151,116 +17261,110 @@ ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-05", - "release_date": "2026-07-24", - "last_updated": "2026-07-24", + "attachment": false, + "open_weights": true, + "release_date": "2026-08-28", + "last_updated": "2026-08-28", "type": "chat" }, { - "id": "eu.anthropic.claude-opus-4-7", - "name": "Claude Opus 4.7 (EU)", - "display_name": "Claude Opus 4.7 (EU)", + "id": "gpt-4o-mini-transcribe", + "name": "GPT-4o Mini Transcribe", + "display_name": "GPT-4o Mini Transcribe", "modalities": { "input": [ "text", - "image", - "pdf" + "audio" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 16000, + "output": 16000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." - ] - } + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-04-16", - "last_updated": "2026-04-16", + "release_date": "2025-03-20", + "last_updated": "2025-03-20", "type": "chat" }, { - "id": "nvidia.nemotron-nano-3-30b", - "name": "NVIDIA Nemotron Nano 3 30B", - "display_name": "NVIDIA Nemotron Nano 3 30B", + "id": "gpt-5-mini", + "name": "GPT-5 Mini", + "display_name": "GPT-5 Mini", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 8192 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-06-25", - "release_date": "2025-12-15", - "last_updated": "2025-12-23", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "minimal", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2024-05-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "zai.glm-4.7-flash", - "name": "GLM-4.7-Flash", - "display_name": "GLM-4.7-Flash", + "id": "claude-opus-5", + "name": "Claude Opus 5", + "display_name": "Claude Opus 5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 202752, - "output": 131072 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -17269,20 +17373,27 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2026-01-19", - "last_updated": "2026-01-19", + "attachment": true, + "open_weights": false, + "knowledge": "2026-05", + "release_date": "2026-07-24", + "last_updated": "2026-07-24", "type": "chat" }, { - "id": "jp.anthropic.claude-sonnet-4-5-20250929-v1:0", - "name": "Claude Sonnet 4.5 (JP)", - "display_name": "Claude Sonnet 4.5 (JP)", + "id": "claude-haiku-4-5-20251001", + "name": "Claude Haiku 4.5", + "display_name": "Claude Haiku 4.5", "modalities": { "input": [ "text", @@ -17326,15 +17437,15 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2025-07-31", - "release_date": "2025-09-29", - "last_updated": "2025-09-29", + "knowledge": "2025-02-28", + "release_date": "2025-10-15", + "last_updated": "2025-10-15", "type": "chat" }, { - "id": "google.gemma-4-31b", - "name": "Gemma 4 31B IT", - "display_name": "Gemma 4 31B IT", + "id": "qwen3.6-35b-a3b", + "name": "Qwen3.6 35B-A3B", + "display_name": "Qwen3.6 35B-A3B", "modalities": { "input": [ "text", @@ -17347,7 +17458,7 @@ }, "limit": { "context": 262144, - "output": 32768 + "output": 65536 }, "temperature": true, "tool_call": true, @@ -17357,23 +17468,34 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ "none", - "high" + "minimal", + "low", + "medium", + "high", + "xhigh", + "max" ] } }, "attachment": true, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "release_date": "2026-04-17", + "last_updated": "2026-04-17", "type": "chat" }, { - "id": "openai.gpt-oss-120b", - "name": "gpt-oss-120b", - "display_name": "gpt-oss-120b", + "id": "glm-4.5-x", + "name": "GLM-4.5 X", + "display_name": "GLM-4.5 X", "modalities": { "input": [ "text" @@ -17383,8 +17505,8 @@ ] }, "limit": { - "context": 131072, - "output": 131072 + "context": 128000, + "output": 16384 }, "temperature": true, "tool_call": true, @@ -17392,39 +17514,29 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high" - ] - } - }, "attachment": false, - "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "open_weights": false, + "release_date": "2025-07-28", + "last_updated": "2025-07-28", "type": "chat" }, { - "id": "jp.anthropic.claude-sonnet-5", - "name": "Claude Sonnet 5 (JP)", - "display_name": "Claude Sonnet 5 (JP)", + "id": "kimi-k3-fast", + "name": "Kimi K3", + "display_name": "Kimi K3", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 1040384, + "output": 131072 }, "temperature": false, "tool_call": true, @@ -17435,6 +17547,7 @@ "extra_capabilities": { "reasoning": { "effort_options": [ + "none", "low", "medium", "high", @@ -17444,31 +17557,31 @@ } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-30", - "last_updated": "2026-06-30", + "open_weights": true, + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" }, { - "id": "jp.anthropic.claude-opus-5-5", - "name": "Claude Opus 5.5 (JP)", - "display_name": "Claude Opus 5.5 (JP)", + "id": "qwen3.8-omni-flash", + "name": "Qwen3.8 Omni Flash", + "display_name": "Qwen3.8 Omni Flash", "modalities": { "input": [ "text", "image", - "pdf" + "audio", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 983616, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -17477,6 +17590,8 @@ "extra_capabilities": { "reasoning": { "effort_options": [ + "none", + "minimal", "low", "medium", "high", @@ -17487,18 +17602,18 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "release_date": "2026-09-17", + "last_updated": "2026-09-17", "type": "chat" }, { - "id": "qwen.qwen3-235b-a22b-2507-v1:0", - "name": "Qwen3 235B-A22B Instruct 2507", - "display_name": "Qwen3 235B-A22B Instruct 2507", + "id": "seed-2-0-lite-260428", + "name": "Seed 2.0 Lite (260428)", + "display_name": "Seed 2.0 Lite (260428)", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" @@ -17506,51 +17621,74 @@ }, "limit": { "context": 262144, - "output": 131072 + "output": 262144 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "release_date": "2025-07-21", - "last_updated": "2025-09-18", + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "minimal", + "low", + "medium", + "high" + ] + } + }, + "attachment": true, + "open_weights": false, + "release_date": "2026-04-28", + "last_updated": "2026-04-28", "type": "chat" }, { - "id": "us.meta.llama3-3-70b-instruct-v1:0", - "name": "Llama 3.3 70B Instruct (US)", - "display_name": "Llama 3.3 70B Instruct (US)", + "id": "grok-4-20-reasoning", + "name": "Grok 4.20 (Reasoning)", + "display_name": "Grok 4.20 (Reasoning)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 2000000, + "output": 30000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2023-12", - "release_date": "2024-12-06", - "last_updated": "2024-12-06", + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "low", + "medium", + "high" + ] + } + }, + "attachment": true, + "open_weights": false, + "release_date": "2026-03-09", + "last_updated": "2026-03-09", "type": "chat" }, { - "id": "openai.gpt-5.5", - "name": "GPT-5.5", - "display_name": "GPT-5.5", + "id": "grok-4-20-beta-0309-non-reasoning", + "name": "Grok 4.20 (Non-Reasoning)", + "display_name": "Grok 4.20 (Non-Reasoning)", "modalities": { "input": [ "text", @@ -17562,37 +17700,24 @@ ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 2000000, + "output": 30000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ] - } + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2025-12-01", - "release_date": "2026-04-23", - "last_updated": "2026-06-01", + "release_date": "2026-03-09", + "last_updated": "2026-03-09", "type": "chat" }, { - "id": "mistral.magistral-small-2509", - "name": "Magistral Small 1.2", - "display_name": "Magistral Small 1.2", + "id": "seed-2-0-code-preview-260328", + "name": "Seed 2.0 Code Preview (260328)", + "display_name": "Seed 2.0 Code Preview (260328)", "modalities": { "input": [ "text", @@ -17603,8 +17728,8 @@ ] }, "limit": { - "context": 128000, - "output": 40000 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, @@ -17612,16 +17737,26 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "minimal", + "low", + "medium", + "high" + ] + } + }, "attachment": true, - "open_weights": true, - "release_date": "2025-09-18", - "last_updated": "2025-09-18", + "open_weights": false, + "release_date": "2026-03-28", + "last_updated": "2026-03-28", "type": "chat" }, { - "id": "us.anthropic.claude-fable-5", - "name": "Claude Fable 5 (US)", - "display_name": "Claude Fable 5 (US)", + "id": "gpt-6-sol", + "name": "GPT-6 Sol", + "display_name": "GPT-6 Sol", "modalities": { "input": [ "text", @@ -17633,7 +17768,7 @@ ] }, "limit": { - "context": 1000000, + "context": 1050000, "output": 128000 }, "temperature": false, @@ -17644,41 +17779,27 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", "effort_options": [ + "none", "low", "medium", "high", "xhigh", "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", - "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", - "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-09", - "last_updated": "2026-06-09", + "knowledge": "2026-04-20", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "global.openai.gpt-6-astra", - "name": "GPT-6 Astra (Global)", - "display_name": "GPT-6 Astra (Global)", + "id": "ministral-14b-2512", + "name": "Ministral 14B", + "display_name": "Ministral 14B", "modalities": { "input": [ "text", @@ -17689,130 +17810,67 @@ ] }, "limit": { - "context": 1050000, - "output": 128000 - }, - "temperature": false, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ] - } - }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-04-30", - "release_date": "2026-09-04", - "last_updated": "2026-09-04", - "type": "chat" - }, - { - "id": "deepseek.r1-v1:0", - "name": "DeepSeek-R1", - "display_name": "DeepSeek-R1", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 128000, - "output": 32768 + "context": 262144, + "output": 8192 }, "temperature": true, "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2024-07", - "release_date": "2025-01-20", - "last_updated": "2025-05-29", + "release_date": "2025-12-02", + "last_updated": "2025-12-02", "type": "chat" }, { - "id": "us.anthropic.claude-opus-4-6-v1", - "name": "Claude Opus 4.6 (US)", - "display_name": "Claude Opus 4.6 (US)", + "id": "gpt-oss-120b", + "name": "GPT OSS 120B", + "display_name": "GPT OSS 120B", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 131072, + "output": 32766 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", "effort_options": [ "low", "medium", - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." + "high" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-05-31", - "release_date": "2026-02-05", - "last_updated": "2026-03-13", + "attachment": false, + "open_weights": true, + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "jp.anthropic.claude-opus-5", - "name": "Claude Opus 5 (JP)", - "display_name": "Claude Opus 5 (JP)", + "id": "mistral-large-4", + "name": "Mistral Large 4", + "display_name": "Mistral Large 4", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" @@ -17820,36 +17878,24 @@ }, "limit": { "context": 1000000, - "output": 128000 + "output": 262144 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ] - } - }, "attachment": true, "open_weights": false, - "knowledge": "2026-05", - "release_date": "2026-07-24", - "last_updated": "2026-07-24", + "release_date": "2026-10-06", + "last_updated": "2026-10-06", "type": "chat" }, { - "id": "mistral.pixtral-large-2502-v1:0", - "name": "Pixtral Large (25.02)", - "display_name": "Pixtral Large (25.02)", + "id": "gpt-5.4-pro", + "name": "GPT-5.4 Pro", + "display_name": "GPT-5.4 Pro", "modalities": { "input": [ "text", @@ -17860,64 +17906,7 @@ ] }, "limit": { - "context": 128000, - "output": 8192 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": false, - "release_date": "2025-04-08", - "last_updated": "2025-04-08", - "type": "chat" - }, - { - "id": "meta.llama3-3-70b-instruct-v1:0", - "name": "Llama 3.3 70B Instruct", - "display_name": "Llama 3.3 70B Instruct", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 128000, - "output": 4096 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": true, - "knowledge": "2023-12", - "release_date": "2024-12-06", - "last_updated": "2024-12-06", - "type": "chat" - }, - { - "id": "us.anthropic.claude-sonnet-5", - "name": "Claude Sonnet 5 (US)", - "display_name": "Claude Sonnet 5 (US)", - "modalities": { - "input": [ - "text", - "image", - "pdf" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 1000000, + "context": 1050000, "output": 128000 }, "temperature": false, @@ -17928,26 +17917,35 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", "effort_options": [ - "low", "medium", "high", - "xhigh", - "max" - ] + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-30", - "last_updated": "2026-06-30", + "knowledge": "2025-08-31", + "release_date": "2026-03-05", + "last_updated": "2026-03-05", "type": "chat" }, { - "id": "global.anthropic.claude-fable-5", - "name": "Claude Fable 5 (Global)", - "display_name": "Claude Fable 5 (Global)", + "id": "claude-haiku-5-5", + "name": "Claude Haiku 5.5", + "display_name": "Claude Haiku 5.5", "modalities": { "input": [ "text", @@ -17970,94 +17968,68 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", "effort_options": [ + "none", "low", "medium", "high", "xhigh", "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", - "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", - "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-09", - "last_updated": "2026-06-09", + "knowledge": "2026-06", + "release_date": "2026-10-07", + "last_updated": "2026-10-07", "type": "chat" }, { - "id": "global.anthropic.claude-opus-5", - "name": "Claude Opus 5 (Global)", - "display_name": "Claude Opus 5 (Global)", + "id": "mistral-large-latest", + "name": "Mistral Large (latest)", + "display_name": "Mistral Large (latest)", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 128000, + "output": 262144 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ] - } + "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2026-05", - "release_date": "2026-07-24", - "last_updated": "2026-07-24", + "open_weights": true, + "knowledge": "2024-11", + "release_date": "2024-11-01", + "last_updated": "2025-12-02", "type": "chat" }, { - "id": "qwen.qwen3-32b-v1:0", - "name": "Qwen3 32B", - "display_name": "Qwen3 32B", + "id": "ling-3.0-flash-vl", + "name": "Ling 3.0 Flash VL", + "display_name": "Ling 3.0 Flash VL", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 32768, - "output": 16384 + "context": 131072, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -18067,159 +18039,160 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true + "effort_options": [ + "none", + "low", + "medium", + "high" + ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-04-28", - "last_updated": "2025-09-18", + "release_date": "2026-09-10", + "last_updated": "2026-09-10", "type": "chat" }, { - "id": "eu.anthropic.claude-opus-4-8", - "name": "Claude Opus 4.8 (EU)", - "display_name": "Claude Opus 4.8 (EU)", + "id": "gpt-5", + "name": "GPT-5", + "display_name": "GPT-5", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, + "context": 400000, "output": 128000 }, "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, + "default_enabled": true, "mode": "effort", - "effort": "high", + "effort": "medium", "effort_options": [ + "minimal", "low", "medium", - "high", - "xhigh", - "max" + "high" ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." - ] + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2026-01", - "release_date": "2026-05-28", - "last_updated": "2026-05-28", + "knowledge": "2024-09-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "meta.llama4-scout-17b-instruct-v1:0", - "name": "Llama 4 Scout 17B Instruct", - "display_name": "Llama 4 Scout 17B Instruct", + "id": "glm-4.6", + "name": "GLM-4.6", + "display_name": "GLM-4.6", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 10000000, - "output": 8192 + "context": 204800, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": false, "open_weights": true, - "knowledge": "2024-08", - "release_date": "2025-04-05", - "last_updated": "2025-04-05", + "knowledge": "2025-04", + "release_date": "2025-09-30", + "last_updated": "2025-09-30", "type": "chat" }, { - "id": "eu.anthropic.claude-sonnet-4-5-20250929-v1:0", - "name": "Claude Sonnet 4.5 (EU)", - "display_name": "Claude Sonnet 4.5 (EU)", + "id": "kimi-k2.6", + "name": "Kimi K2.6", + "display_name": "Kimi K2.6", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + "effort_options": [ + "none", + "minimal", + "low", + "medium", + "high", + "xhigh", + "max" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-07-31", - "release_date": "2025-09-29", - "last_updated": "2025-09-29", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-04-20", + "last_updated": "2026-04-20", "type": "chat" }, { - "id": "meta.llama3-1-8b-instruct-v1:0", - "name": "Llama 3.1 8B Instruct", - "display_name": "Llama 3.1 8B Instruct", + "id": "qwen3-coder-flash", + "name": "Qwen3 Coder Flash", + "display_name": "Qwen3 Coder Flash", "modalities": { "input": [ "text" @@ -18229,8 +18202,8 @@ ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 997952, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -18238,14 +18211,14 @@ "supported": false }, "attachment": false, - "open_weights": true, - "knowledge": "2023-12", - "release_date": "2024-07-23", - "last_updated": "2024-07-23", + "open_weights": false, + "knowledge": "2025-04", + "release_date": "2025-07-28", + "last_updated": "2025-07-28", "type": "chat" }, { - "id": "openai.gpt-6.1-sol", + "id": "gpt-6.1-sol", "name": "GPT-6.1 Sol", "display_name": "GPT-6.1 Sol", "modalities": { @@ -18287,24 +18260,24 @@ "type": "chat" }, { - "id": "openai.gpt-6-astra", - "name": "GPT-6 Astra", - "display_name": "GPT-6 Astra", + "id": "minimax-m3", + "name": "MiniMax-M3", + "display_name": "MiniMax-M3", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1048576, + "output": 512000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -18312,7 +18285,10 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ + "none", + "minimal", "low", "medium", "high", @@ -18322,19 +18298,21 @@ } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-04-30", - "release_date": "2026-09-04", - "last_updated": "2026-09-04", + "open_weights": true, + "release_date": "2026-06-01", + "last_updated": "2026-06-01", "type": "chat" }, { - "id": "mistral.voxtral-mini-3b-2507", - "name": "Voxtral Mini 3B 2507", - "display_name": "Voxtral Mini 3B 2507", + "id": "muse-wonder-1.0", + "name": "Muse Wonder", + "display_name": "Muse Wonder", "modalities": { "input": [ "text", + "image", + "video", + "pdf", "audio" ], "output": [ @@ -18342,131 +18320,116 @@ ] }, "limit": { - "context": 32768, - "output": 4096 + "context": 1048576, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] + } }, "attachment": true, - "open_weights": true, - "release_date": "2025-07-15", - "last_updated": "2025-07-15", + "open_weights": false, + "release_date": "2026-10-12", + "last_updated": "2026-10-12", "type": "chat" }, { - "id": "us.anthropic.claude-sonnet-4-5-20250929-v1:0", - "name": "Claude Sonnet 4.5 (US)", - "display_name": "Claude Sonnet 4.5 (US)", + "id": "minimax-m3.1-flash", + "name": "MiniMax-M3.1-Flash", + "display_name": "MiniMax-M3.1-Flash", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 1048576, + "output": 512000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + "effort_options": [ + "none", + "minimal", + "low", + "medium", + "high", + "xhigh", + "max" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-07-31", - "release_date": "2025-09-29", - "last_updated": "2025-09-29", + "release_date": "2026-10-19", + "last_updated": "2026-10-19", "type": "chat" }, { - "id": "au.anthropic.claude-opus-4-7", - "name": "Claude Opus 4.7 (AU)", - "display_name": "Claude Opus 4.7 (AU)", + "id": "minimax-m2.1-lightning", + "name": "MiniMax M2.1 Lightning", + "display_name": "MiniMax M2.1 Lightning", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 196608, + "output": 131072 }, - "temperature": false, - "tool_call": true, + "temperature": true, + "tool_call": false, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "high", "effort_options": [ "low", "medium", "high", "xhigh", "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-04-16", - "last_updated": "2026-04-16", + "attachment": false, + "open_weights": true, + "release_date": "2025-12-23", + "last_updated": "2025-12-23", "type": "chat" }, { - "id": "minimax.minimax-m2.5", + "id": "minimax-m2.5", "name": "MiniMax-M2.5", "display_name": "MiniMax-M2.5", "modalities": { @@ -18478,8 +18441,8 @@ ] }, "limit": { - "context": 196608, - "output": 98304 + "context": 228700, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -18490,19 +18453,25 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] } }, "attachment": false, "open_weights": true, "release_date": "2026-02-12", - "last_updated": "2026-03-18", + "last_updated": "2026-02-12", "type": "chat" }, { - "id": "global.openai.gpt-5.6-terra", - "name": "GPT-5.6 Terra (Global)", - "display_name": "GPT-5.6 Terra (Global)", + "id": "gemma-4-26b-a4b-it", + "name": "Gemma 4 26B A4B IT", + "display_name": "Gemma 4 26B A4B IT", "modalities": { "input": [ "text", @@ -18513,10 +18482,10 @@ ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 262144, + "output": 32768 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -18524,32 +18493,23 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ] + "supported": true } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "open_weights": true, + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "eu.amazon.nova-lite-v1:0", - "name": "Nova Lite (EU)", - "display_name": "Nova Lite (EU)", + "id": "grok-4-20-non-reasoning", + "name": "Grok 4.20 (Non-Reasoning)", + "display_name": "Grok 4.20 (Non-Reasoning)", "modalities": { "input": [ "text", "image", - "video", "pdf" ], "output": [ @@ -18557,71 +18517,82 @@ ] }, "limit": { - "context": 300000, - "output": 10000 + "context": 2000000, + "output": 30000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": true, "open_weights": false, - "knowledge": "2024-10", - "release_date": "2024-12-03", - "last_updated": "2024-12-03", + "release_date": "2026-03-09", + "last_updated": "2026-03-09", "type": "chat" }, { - "id": "us.amazon.nova-lite-v1:0", - "name": "Nova Lite (US)", - "display_name": "Nova Lite (US)", + "id": "seed-2-0-pro-260328", + "name": "Seed 2.0 Pro (260328)", + "display_name": "Seed 2.0 Pro (260328)", "modalities": { "input": [ "text", - "image", - "video", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 300000, - "output": 10000 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "minimal", + "low", + "medium", + "high" + ] + } }, "attachment": true, "open_weights": false, - "knowledge": "2024-10", - "release_date": "2024-12-03", - "last_updated": "2024-12-03", + "release_date": "2026-03-28", + "last_updated": "2026-03-28", "type": "chat" }, { - "id": "eu.anthropic.claude-sonnet-5", - "name": "Claude Sonnet 5 (EU)", - "display_name": "Claude Sonnet 5 (EU)", + "id": "deepseek-v4.1-flash-cyber", + "name": "DeepSeek V4.1 Flash Cyber", + "display_name": "DeepSeek V4.1 Flash Cyber", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 1040000, + "output": 1040000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -18630,8 +18601,8 @@ "extra_capabilities": { "reasoning": { "effort_options": [ + "none", "low", - "medium", "high", "xhigh", "max" @@ -18640,15 +18611,14 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-30", - "last_updated": "2026-06-30", + "release_date": "2026-10-29", + "last_updated": "2026-10-29", "type": "chat" }, { - "id": "eu.anthropic.claude-fable-5", - "name": "Claude Fable 5 (EU)", - "display_name": "Claude Fable 5 (EU)", + "id": "gpt-5.2-codex", + "name": "GPT-5.2 Codex", + "display_name": "GPT-5.2 Codex", "modalities": { "input": [ "text", @@ -18660,7 +18630,7 @@ ] }, "limit": { - "context": 1000000, + "context": 400000, "output": 128000 }, "temperature": false, @@ -18674,66 +18644,33 @@ "supported": true, "default_enabled": true, "mode": "effort", - "effort": "high", + "effort": "medium", "effort_options": [ "low", "medium", "high", - "xhigh", - "max" + "xhigh" ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" ], - "notes": [ - "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", - "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", - "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." - ] + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-09", - "last_updated": "2026-06-09", - "type": "chat" - }, - { - "id": "mistral.voxtral-small-24b-2507", - "name": "Voxtral Small 24B 2507", - "display_name": "Voxtral Small 24B 2507", - "modalities": { - "input": [ - "text", - "audio" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 32768, - "output": 8192 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": true, - "release_date": "2025-07-15", - "last_updated": "2025-07-15", + "knowledge": "2025-08-31", + "release_date": "2025-12-11", + "last_updated": "2025-12-11", "type": "chat" }, { - "id": "mistral.ministral-3-3b-instruct", - "name": "Ministral 3 3B", - "display_name": "Ministral 3 3B", + "id": "kimi-k3.1-pro-highspeed", + "name": "Kimi K3.1 Pro Highspeed", + "display_name": "Kimi K3.1 Pro Highspeed", "modalities": { "input": [ "text", @@ -18744,24 +18681,34 @@ ] }, "limit": { - "context": 256000, - "output": 8192 + "context": 1048576, + "output": 1048576 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "high", + "max" + ] + } }, "attachment": true, - "open_weights": true, - "release_date": "2025-12-02", - "last_updated": "2025-12-02", + "open_weights": false, + "release_date": "2026-10-23", + "last_updated": "2026-10-23", "type": "chat" }, { - "id": "deepseek.v3.2", - "name": "DeepSeek V3.2", - "display_name": "DeepSeek V3.2", + "id": "qwen3-32b", + "name": "Qwen3 32B", + "display_name": "Qwen3 32B", "modalities": { "input": [ "text" @@ -18771,8 +18718,8 @@ ] }, "limit": { - "context": 163840, - "output": 81920 + "context": 40960, + "output": 16384 }, "temperature": true, "tool_call": true, @@ -18783,77 +18730,68 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": false, "open_weights": true, - "knowledge": "2024-07", - "release_date": "2025-12-01", - "last_updated": "2026-02-06", + "knowledge": "2025-04", + "release_date": "2025-04-28", + "last_updated": "2025-04-28", "type": "chat" }, { - "id": "eu.anthropic.claude-haiku-5-5", - "name": "Claude Haiku 5.5 (EU)", - "display_name": "Claude Haiku 5.5 (EU)", + "id": "llama-4-scout-17b-instruct", + "name": "Llama 4 Scout 17B Instruct", + "display_name": "Llama 4 Scout 17B Instruct", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 131072, + "output": 2048 }, - "temperature": false, - "tool_call": true, + "temperature": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ] - } + "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-10-07", - "last_updated": "2026-10-07", + "open_weights": true, + "knowledge": "2024-08", + "release_date": "2025-04-05", + "last_updated": "2025-04-05", "type": "chat" }, { - "id": "au.anthropic.claude-opus-5", - "name": "Claude Opus 5 (AU)", - "display_name": "Claude Opus 5 (AU)", + "id": "gemma-4-31b-it", + "name": "Gemma 4 31B IT", + "display_name": "Gemma 4 31B IT", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 262144, + "output": 32768 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -18861,41 +18799,34 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ] + "supported": true } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-05", - "release_date": "2026-07-24", - "last_updated": "2026-07-24", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "in.anthropic.claude-sonnet-5", - "name": "Claude Sonnet 5 (India)", - "display_name": "Claude Sonnet 5 (India)", + "id": "grok-4-5", + "name": "Grok 4.5", + "display_name": "Grok 4.5", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 500000, + "output": 500000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -18906,23 +18837,20 @@ "effort_options": [ "low", "medium", - "high", - "xhigh", - "max" + "high" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-30", - "last_updated": "2026-06-30", + "release_date": "2026-07-08", + "last_updated": "2026-07-08", "type": "chat" }, { - "id": "eu.mistral.pixtral-large-2502-v1:0", - "name": "Pixtral Large (25.02) (EU)", - "display_name": "Pixtral Large (25.02) (EU)", + "id": "seed-1-6-250615", + "name": "Seed 1.6 (250615)", + "display_name": "Seed 1.6 (250615)", "modalities": { "input": [ "text", @@ -18933,24 +18861,35 @@ ] }, "limit": { - "context": 128000, + "context": 256000, "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "minimal", + "low", + "medium", + "high" + ] + } }, "attachment": true, - "open_weights": false, - "release_date": "2025-04-08", - "last_updated": "2025-04-08", + "open_weights": true, + "release_date": "2025-06-25", + "last_updated": "2025-06-25", "type": "chat" }, { - "id": "qwen.qwen3-next-80b-a3b", - "name": "Qwen3-Next 80B-A3B Instruct", - "display_name": "Qwen3-Next 80B-A3B Instruct", + "id": "Qwen3.8-27B", + "name": "Qwen3.8 27B", + "display_name": "Qwen3.8 27B", "modalities": { "input": [ "text" @@ -18960,39 +18899,50 @@ ] }, "limit": { - "context": 262144, - "output": 262000 + "context": 262000, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "xhigh" + ] + } }, "attachment": false, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-09-11", - "last_updated": "2025-11-25", + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "us.openai.gpt-6-sol", - "name": "GPT-6 Sol (US)", - "display_name": "GPT-6 Sol (US)", + "id": "mimo-v2.6-flash", + "name": "MiMo-V2.6-Flash", + "display_name": "MiMo-V2.6-Flash", "modalities": { "input": [ "text", - "image" + "image", + "audio", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1048576, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -19002,6 +18952,7 @@ "reasoning": { "effort_options": [ "none", + "minimal", "low", "medium", "high", @@ -19011,31 +18962,29 @@ } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-04-20", + "open_weights": true, "release_date": "2026-09-22", "last_updated": "2026-09-22", "type": "chat" }, { - "id": "us.anthropic.claude-fable-5-1", - "name": "Claude Fable 5.1 (US)", - "display_name": "Claude Fable 5.1 (US)", + "id": "muse-spark-1.3-contributor", + "name": "Muse Spark 1.3 Contributor", + "display_name": "Muse Spark 1.3 Contributor", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 1048576, + "output": 1048576 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -19043,56 +18992,39 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", "effort_options": [ + "minimal", "low", "medium", "high", - "xhigh", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", - "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", - "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." + "xhigh" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-09-01", - "last_updated": "2026-09-01", + "release_date": "2026-09-02", + "last_updated": "2026-09-02", "type": "chat" }, { - "id": "au.anthropic.claude-opus-4-8", - "name": "Claude Opus 4.8 (AU)", - "display_name": "Claude Opus 4.8 (AU)", + "id": "gpt-5.2", + "name": "GPT-5.2", + "display_name": "GPT-5.2", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, + "context": 400000, "output": 128000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -19103,38 +19035,34 @@ "supported": true, "default_enabled": false, "mode": "effort", - "effort": "high", + "effort": "none", "effort_options": [ + "none", "low", "medium", "high", - "xhigh", - "max" + "xhigh" ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." - ] + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2026-01", - "release_date": "2026-05-28", - "last_updated": "2026-05-28", + "knowledge": "2025-08-31", + "release_date": "2025-12-11", + "last_updated": "2025-12-11", "type": "chat" }, { - "id": "anthropic.claude-opus-4-6-v1", - "name": "Claude Opus 4.6", - "display_name": "Claude Opus 4.6", + "id": "claude-sonnet-5-5", + "name": "Claude Sonnet 5.5", + "display_name": "Claude Sonnet 5.5", "modalities": { "input": [ "text", @@ -19149,170 +19077,162 @@ "context": 1000000, "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", "effort_options": [ "low", "medium", "high", + "xhigh", "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-05-31", - "release_date": "2026-02-05", - "last_updated": "2026-03-13", + "knowledge": "2026-06", + "release_date": "2026-09-28", + "last_updated": "2026-09-28", "type": "chat" }, { - "id": "in.anthropic.claude-haiku-4-5-20251001-v1:0", - "name": "Claude Haiku 4.5 (India)", - "display_name": "Claude Haiku 4.5 (India)", + "id": "glm-4.5-air", + "name": "GLM-4.5-Air", + "display_name": "GLM-4.5-Air", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 131000, + "output": 98304 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." - ] - } + "default": true }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-02-28", - "release_date": "2025-10-15", - "last_updated": "2025-10-15", + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-07-28", + "last_updated": "2025-07-28", "type": "chat" }, { - "id": "qwen.qwen3-coder-480b-a35b-v1:0", - "name": "Qwen3-Coder 480B-A35B Instruct", - "display_name": "Qwen3-Coder 480B-A35B Instruct", + "id": "seed-1-8-251228", + "name": "Seed 1.8 (251228)", + "display_name": "Seed 1.8 (251228)", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 65536 + "context": 256000, + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "minimal", + "low", + "medium", + "high" + ] + } + }, + "attachment": true, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-07-23", - "last_updated": "2025-09-18", + "release_date": "2025-12-18", + "last_updated": "2025-12-18", "type": "chat" }, { - "id": "us.writer.palmyra-x5-v1:0", - "name": "Palmyra X5 (US)", - "display_name": "Palmyra X5 (US)", + "id": "gpt-5-pro", + "name": "GPT-5 Pro", + "display_name": "GPT-5 Pro", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1040000, - "output": 8192 + "context": 400000, + "output": 272000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "fixed", + "effort": "high", + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, "open_weights": false, - "release_date": "2025-04-28", - "last_updated": "2025-04-28", + "knowledge": "2024-09-30", + "release_date": "2025-10-06", + "last_updated": "2025-10-06", "type": "chat" }, { - "id": "openai.gpt-oss-safeguard-120b", - "name": "GPT OSS Safeguard 120B", - "display_name": "GPT OSS Safeguard 120B", + "id": "muse-spark-1.3", + "name": "Muse Spark 1.3", + "display_name": "Muse Spark 1.3", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "pdf", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 1048576, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -19322,89 +19242,66 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ + "minimal", "low", "medium", - "high" + "high", + "xhigh" ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2025-10-29", - "last_updated": "2025-10-29", + "attachment": true, + "open_weights": false, + "release_date": "2026-09-02", + "last_updated": "2026-09-02", "type": "chat" }, { - "id": "global.anthropic.claude-haiku-4-5-20251001-v1:0", - "name": "Claude Haiku 4.5 (Global)", - "display_name": "Claude Haiku 4.5 (Global)", + "id": "hy-mt2-plus", + "name": "Hy-MT2 Plus", + "display_name": "Hy-MT2 Plus", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 8192, + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." - ] - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-02-28", - "release_date": "2025-10-15", - "last_updated": "2025-10-15", + "release_date": "2026-05-21", + "last_updated": "2026-05-21", "type": "chat" }, { - "id": "us.openai.gpt-6.1-sol", - "name": "GPT-6.1 Sol (US)", - "display_name": "GPT-6.1 Sol (US)", + "id": "minimax-m2.5-highspeed", + "name": "MiniMax-M2.5-highspeed", + "display_name": "MiniMax-M2.5-highspeed", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 204800, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -19412,6 +19309,7 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ "low", "medium", @@ -19421,81 +19319,51 @@ ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-04-30", - "release_date": "2026-09-29", - "last_updated": "2026-09-29", + "attachment": false, + "open_weights": true, + "release_date": "2026-02-13", + "last_updated": "2026-02-13", "type": "chat" }, { - "id": "jp.anthropic.claude-sonnet-4-6", - "name": "Claude Sonnet 4.6 (JP)", - "display_name": "Claude Sonnet 4.6 (JP)", + "id": "glm-4.5v", + "name": "GLM-4.5V", + "display_name": "GLM-4.5V", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 128000, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." - ] - } + "default": true }, "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-17", - "last_updated": "2026-03-13", + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-08-11", + "last_updated": "2025-08-11", "type": "chat" }, { - "id": "global.anthropic.claude-sonnet-5-5", - "name": "Claude Sonnet 5.5 (Global)", - "display_name": "Claude Sonnet 5.5 (Global)", + "id": "claude-sonnet-5", + "name": "Claude Sonnet 5", + "display_name": "Claude Sonnet 5", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" @@ -19503,17 +19371,19 @@ }, "limit": { "context": 1000000, - "output": 128000 + "output": 1000000 }, "temperature": false, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ + "none", "low", "medium", "high", @@ -19524,15 +19394,42 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-09-28", - "last_updated": "2026-09-28", + "knowledge": "2026-01-31", + "release_date": "2026-06-30", + "last_updated": "2026-06-30", "type": "chat" }, { - "id": "openai.gpt-5.6-terra", - "name": "GPT-5.6 Terra", - "display_name": "GPT-5.6 Terra", + "id": "gpt-transcribe", + "name": "GPT-Transcribe", + "display_name": "GPT-Transcribe", + "modalities": { + "input": [ + "text", + "audio" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 8192, + "output": 8192 + }, + "temperature": true, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": false, + "release_date": "2026-07-28", + "last_updated": "2026-07-28" + }, + { + "id": "o3", + "name": "o3", + "display_name": "o3", "modalities": { "input": [ "text", @@ -19544,8 +19441,8 @@ ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 200000, + "output": 100000 }, "temperature": false, "tool_call": true, @@ -19555,60 +19452,55 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ - "none", "low", "medium", - "high", - "xhigh", - "max" - ] + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "knowledge": "2024-05", + "release_date": "2025-04-16", + "last_updated": "2025-04-16", "type": "chat" }, { - "id": "au.anthropic.claude-sonnet-4-6", - "name": "AU Anthropic Claude Sonnet 4.6", - "display_name": "AU Anthropic Claude Sonnet 4.6", + "id": "deepseek-v4-pro", + "name": "DeepSeek V4 Pro", + "display_name": "DeepSeek V4 Pro", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 1050000, + "output": 384000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, + "default_enabled": true, + "mode": "effort", "effort": "high", "effort_options": [ "low", - "medium", "high", "max" ], @@ -19619,37 +19511,35 @@ "thinking_blocks" ], "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-17", - "last_updated": "2026-03-13", + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "us.anthropic.claude-haiku-5-5", - "name": "Claude Haiku 5.5 (US)", - "display_name": "Claude Haiku 5.5 (US)", + "id": "deepseek-v4.1-flash-1017", + "name": "DeepSeek V4.1 Flash 1017", + "display_name": "DeepSeek V4.1 Flash 1017", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 1056784, + "output": 1050000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -19659,78 +19549,61 @@ "reasoning": { "effort_options": [ "low", - "medium", "high", - "xhigh", "max" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-10-07", - "last_updated": "2026-10-07", + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-10-17", + "last_updated": "2026-10-17", "type": "chat" }, { - "id": "anthropic.claude-opus-5-5", - "name": "Claude Opus 5.5", - "display_name": "Claude Opus 5.5", + "id": "llama-3.3-70b-instruct", + "name": "Llama-3.3-70B-Instruct", + "display_name": "Llama-3.3-70B-Instruct", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 131072, + "output": 4096 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ] - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "attachment": false, + "open_weights": true, + "knowledge": "2023-12", + "release_date": "2024-12-06", + "last_updated": "2024-12-06", "type": "chat" }, { - "id": "eu.anthropic.claude-sonnet-4-6", - "name": "Claude Sonnet 4.6 (EU)", - "display_name": "Claude Sonnet 4.6 (EU)", + "id": "gpt-5.4-nano", + "name": "GPT-5.4 nano", + "display_name": "GPT-5.4 nano", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, + "context": 400000, "output": 128000 }, "temperature": true, @@ -19743,84 +19616,48 @@ "reasoning": { "supported": true, "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", + "mode": "effort", + "effort": "none", "effort_options": [ + "none", "low", "medium", "high", - "max" + "xhigh" ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." - ] + "visibility": "hidden" } }, "attachment": true, "open_weights": false, "knowledge": "2025-08-31", - "release_date": "2026-02-17", - "last_updated": "2026-03-13", - "type": "chat" - }, - { - "id": "us.meta.llama4-maverick-17b-instruct-v1:0", - "name": "Llama 4 Maverick 17B Instruct (US)", - "display_name": "Llama 4 Maverick 17B Instruct (US)", - "modalities": { - "input": [ - "text", - "image" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 1000000, - "output": 8192 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": true, - "knowledge": "2024-08", - "release_date": "2025-04-05", - "last_updated": "2025-04-05", + "release_date": "2026-03-17", + "last_updated": "2026-03-17", "type": "chat" }, { - "id": "amazon.nova-2-lite-v1:0", - "name": "Nova 2 Lite", - "display_name": "Nova 2 Lite", + "id": "qwen3.5-27b", + "name": "Qwen3.5 27B", + "display_name": "Qwen3.5 27B", "modalities": { "input": [ "text", "image", - "video", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 65535 + "context": 262144, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -19830,137 +19667,127 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ + "none", + "minimal", "low", "medium", - "high" + "high", + "xhigh", + "max" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-10", - "release_date": "2025-12-02", - "last_updated": "2025-12-01", + "open_weights": true, + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" }, { - "id": "global.anthropic.claude-opus-4-5-20251101-v1:0", - "name": "Claude Opus 4.5 (Global)", - "display_name": "Claude Opus 4.5 (Global)", + "id": "qwen3.5-122b-a10b", + "name": "Qwen3.5 122B-A10B", + "display_name": "Qwen3.5 122B-A10B", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 262144, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high" - ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" ], - "notes": [ - "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." + "effort_options": [ + "none", + "minimal", + "low", + "medium", + "high", + "xhigh", + "max" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-05", - "release_date": "2025-11-24", - "last_updated": "2025-11-24", + "open_weights": true, + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" }, { - "id": "global.openai.gpt-6.1-sol", - "name": "GPT-6.1 Sol (Global)", - "display_name": "GPT-6.1 Sol (Global)", + "id": "minimax-text-01", + "name": "MiniMax Text 01", + "display_name": "MiniMax Text 01", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1000000, + "output": 131072 }, - "temperature": false, - "tool_call": true, + "temperature": true, + "tool_call": false, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ] - } - }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-04-30", - "release_date": "2026-09-29", - "last_updated": "2026-09-29", + "attachment": false, + "open_weights": true, + "release_date": "2025-01-15", + "last_updated": "2025-01-15", "type": "chat" }, { - "id": "global.openai.gpt-6-luna", - "name": "GPT-6 Luna (Global)", - "display_name": "GPT-6 Luna (Global)", + "id": "grok-4-20-beta-0309-reasoning", + "name": "Grok 4.20 (Reasoning)", + "display_name": "Grok 4.20 (Reasoning)", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 2000000, + "output": 30000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -19969,130 +19796,84 @@ "extra_capabilities": { "reasoning": { "effort_options": [ - "none", "low", "medium", - "high", - "xhigh", - "max" + "high" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-05-18", - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "release_date": "2026-03-09", + "last_updated": "2026-03-09", "type": "chat" }, { - "id": "anthropic.claude-haiku-4-5-20251001-v1:0", - "name": "Claude Haiku 4.5", - "display_name": "Claude Haiku 4.5", + "id": "glm-4.5-airx", + "name": "GLM-4.5 AirX", + "display_name": "GLM-4.5 AirX", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 128000, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." - ] - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-02-28", - "release_date": "2025-10-15", - "last_updated": "2025-10-15", + "release_date": "2025-07-28", + "last_updated": "2025-07-28", "type": "chat" }, { - "id": "anthropic.claude-sonnet-4-5-20250929-v1:0", - "name": "Claude Sonnet 4.5", - "display_name": "Claude Sonnet 4.5", + "id": "deepseek-v3.2", + "name": "DeepSeek V3.2", + "display_name": "DeepSeek V3.2", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 163840, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." - ] + "supported": true } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-07-31", - "release_date": "2025-09-29", - "last_updated": "2025-09-29", + "open_weights": true, + "knowledge": "2024-07", + "release_date": "2025-12-01", + "last_updated": "2025-12-01", "type": "chat" }, { - "id": "writer.palmyra-x5-v1:0", - "name": "Palmyra X5", - "display_name": "Palmyra X5", + "id": "devstral-2512", + "name": "Devstral 2", + "display_name": "Devstral 2", "modalities": { "input": [ "text" @@ -20102,95 +19883,76 @@ ] }, "limit": { - "context": 1040000, - "output": 8192 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2025-04-28", - "last_updated": "2025-04-28", + "open_weights": true, + "knowledge": "2025-12", + "release_date": "2025-12-09", + "last_updated": "2025-12-09", "type": "chat" }, { - "id": "anthropic.claude-opus-4-7", - "name": "Claude Opus 4.7", - "display_name": "Claude Opus 4.7", + "id": "granite-4.2-8b", + "name": "Granite 4.2 8B", + "display_name": "Granite 4.2 8B", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 131072, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "high", "effort_options": [ + "none", "low", "medium", - "high", - "xhigh", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." + "high" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-04-16", - "last_updated": "2026-04-16", + "attachment": false, + "open_weights": true, + "release_date": "2026-08-25", + "last_updated": "2026-08-25", "type": "chat" }, { - "id": "in.anthropic.claude-opus-5", - "name": "Claude Opus 5 (India)", - "display_name": "Claude Opus 5 (India)", + "id": "gemini-4-argon", + "name": "Gemini 4 Argon", + "display_name": "Gemini 4 Argon", "modalities": { "input": [ "text", "image", - "pdf" + "audio" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 1048576, + "output": 1048576 }, "temperature": false, "tool_call": true, @@ -20201,29 +19963,27 @@ "extra_capabilities": { "reasoning": { "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" + "high" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-05", - "release_date": "2026-07-24", - "last_updated": "2026-07-24", + "knowledge": "2026-03", + "release_date": "2026-10-13", + "last_updated": "2026-10-13", "type": "chat" }, { - "id": "us.anthropic.claude-sonnet-4-20250514-v1:0", - "name": "Claude Sonnet 4 (US)", - "display_name": "Claude Sonnet 4 (US)", + "id": "gemini-3.7-flash", + "name": "Gemini 3.7 Flash", + "display_name": "Gemini 3.7 Flash", "modalities": { "input": [ "text", "image", + "video", + "audio", "pdf" ], "output": [ @@ -20231,61 +19991,58 @@ ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", + "low", + "medium", + "high" + ], "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + "thought_signatures" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-03-31", - "release_date": "2025-05-22", - "last_updated": "2025-05-22", + "knowledge": "2026-03", + "release_date": "2026-08-13", + "last_updated": "2026-08-13", "type": "chat" }, { - "id": "global.openai.gpt-5.6-sol", - "name": "GPT-5.6 Sol (Global)", - "display_name": "GPT-5.6 Sol (Global)", + "id": "glm-5", + "name": "GLM-5", + "display_name": "GLM-5", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 203000, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -20293,8 +20050,16 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ "none", + "minimal", "low", "medium", "high", @@ -20303,76 +20068,105 @@ ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "attachment": false, + "open_weights": true, + "release_date": "2026-02-12", + "last_updated": "2026-02-12", "type": "chat" }, { - "id": "mistral.ministral-3-14b-instruct", - "name": "Ministral 14B 3.0", - "display_name": "Ministral 14B 3.0", + "id": "qwen3.7-plus", + "name": "Qwen3.7 Plus", + "display_name": "Qwen3.7 Plus", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 983616, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "none", + "minimal", + "low", + "medium", + "high", + "xhigh", + "max" + ] + } }, "attachment": true, - "open_weights": true, - "release_date": "2025-12-02", - "last_updated": "2025-12-02", + "open_weights": false, + "knowledge": "2025-04", + "release_date": "2026-06-02", + "last_updated": "2026-06-02", "type": "chat" }, { - "id": "amazon.nova-lite-v1:0", - "name": "Nova Lite", - "display_name": "Nova Lite", + "id": "kimi-k3", + "name": "Kimi K3", + "display_name": "Kimi K3", "modalities": { "input": [ "text", "image", - "video", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 300000, - "output": 10000 + "context": 1048576, + "output": 131072 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "none", + "minimal", + "low", + "medium", + "high", + "xhigh", + "max" + ] + } }, "attachment": true, - "open_weights": false, - "knowledge": "2024-10", - "release_date": "2024-12-03", - "last_updated": "2024-12-03", + "open_weights": true, + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" }, { - "id": "us.openai.gpt-5.6-luna", - "name": "GPT-5.6 Luna (US)", - "display_name": "GPT-5.6 Luna (US)", + "id": "llama-4-maverick-17b-instruct", + "name": "Llama 4 Maverick 17B Instruct", + "display_name": "Llama 4 Maverick 17B Instruct", "modalities": { "input": [ "text", @@ -20383,51 +20177,38 @@ ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1048576, + "output": 2048 }, - "temperature": false, - "tool_call": true, + "temperature": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ] - } + "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "open_weights": true, + "knowledge": "2024-08", + "release_date": "2025-04-05", + "last_updated": "2025-04-05", "type": "chat" }, { - "id": "openai.gpt-5.4", - "name": "GPT-5.4", - "display_name": "GPT-5.4", + "id": "step-3.7-flash", + "name": "Step 3.7 Flash", + "display_name": "Step 3.7 Flash", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 262144, + "output": 256000 }, "temperature": true, "tool_call": true, @@ -20438,39 +20219,41 @@ "extra_capabilities": { "reasoning": { "effort_options": [ - "none", + "minimal", "low", "medium", "high", - "xhigh" + "xhigh", + "max" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-05", - "last_updated": "2026-06-01", + "open_weights": true, + "knowledge": "2026-03-01", + "release_date": "2026-05-29", + "last_updated": "2026-05-29", "type": "chat" }, { - "id": "us.openai.gpt-6-luna", - "name": "GPT-6 Luna (US)", - "display_name": "GPT-6 Luna (US)", + "id": "qwen35-397b-a17b", + "name": "Qwen3.5 397B-A17B", + "display_name": "Qwen3.5 397B-A17B", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 262144, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -20480,6 +20263,7 @@ "reasoning": { "effort_options": [ "none", + "minimal", "low", "medium", "high", @@ -20489,21 +20273,20 @@ } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-05-18", - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "open_weights": true, + "release_date": "2026-02-15", + "last_updated": "2026-02-15", "type": "chat" }, { - "id": "jp.anthropic.claude-opus-4-7", - "name": "Claude Opus 4.7 (JP)", - "display_name": "Claude Opus 4.7 (JP)", + "id": "qwen3.8-flash", + "name": "Qwen3.8 Flash", + "display_name": "Qwen3.8 Flash", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" @@ -20511,62 +20294,50 @@ }, "limit": { "context": 1000000, - "output": 128000 + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "high", "effort_options": [ + "none", + "minimal", "low", "medium", "high", "xhigh", "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-04-16", - "last_updated": "2026-04-16", + "release_date": "2026-08-26", + "last_updated": "2026-08-26", "type": "chat" }, { - "id": "us.moonshotai.kimi-k3", - "name": "Kimi K3 (US)", - "display_name": "Kimi K3 (US)", + "id": "gpt-5.5-pro", + "name": "GPT-5.5 Pro", + "display_name": "GPT-5.5 Pro", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, + "context": 1050000, "output": 128000 }, "temperature": false, @@ -20578,78 +20349,75 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true + "effort_options": [ + "medium", + "high", + "xhigh" + ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-16", + "open_weights": false, + "knowledge": "2025-12-01", + "release_date": "2026-04-23", + "last_updated": "2026-04-23", "type": "chat" }, { - "id": "au.anthropic.claude-opus-4-6-v1", - "name": "AU Anthropic Claude Opus 4.6", - "display_name": "AU Anthropic Claude Opus 4.6", + "id": "kimi-k2.5", + "name": "Kimi K2.5", + "display_name": "Kimi K2.5", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 262144, + "output": 262144 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "max" - ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." + "effort_options": [ + "none", + "minimal", + "low", + "medium", + "high", + "xhigh", + "max" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-05-31", - "release_date": "2026-02-05", - "last_updated": "2026-03-13", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-01-27", + "last_updated": "2026-01-27", "type": "chat" }, { - "id": "nvidia.nemotron-super-3-120b", - "name": "NVIDIA Nemotron 3 Super 120B A12B", - "display_name": "NVIDIA Nemotron 3 Super 120B A12B", + "id": "minimax-m2.1", + "name": "MiniMax-M2.1", + "display_name": "MiniMax-M2.1", "modalities": { "input": [ "text" @@ -20659,7 +20427,7 @@ ] }, "limit": { - "context": 262144, + "context": 204800, "output": 131072 }, "temperature": true, @@ -20668,32 +20436,42 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + }, "attachment": false, "open_weights": true, - "knowledge": "2025-06", - "release_date": "2026-03-11", - "last_updated": "2026-03-11", + "release_date": "2025-12-23", + "last_updated": "2025-12-23", "type": "chat" }, { - "id": "global.anthropic.claude-opus-5-5", - "name": "Claude Opus 5.5 (Global)", - "display_name": "Claude Opus 5.5 (Global)", + "id": "seed-2-0-mini-260428", + "name": "Seed 2.0 Mini (260428)", + "display_name": "Seed 2.0 Mini (260428)", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 262144, + "output": 262144 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -20702,39 +20480,38 @@ "extra_capabilities": { "reasoning": { "effort_options": [ + "minimal", "low", "medium", - "high", - "xhigh", - "max" + "high" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "release_date": "2026-04-28", + "last_updated": "2026-04-28", "type": "chat" }, { - "id": "xai.grok-4.6", - "name": "Grok 4.6", - "display_name": "Grok 4.6", + "id": "gpt-5.5", + "name": "GPT-5.5", + "display_name": "GPT-5.5", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 500000, - "output": 500000 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -20742,53 +20519,88 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ "low", "medium", "high", "xhigh" - ] + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2026-02-01", - "release_date": "2026-08-12", - "last_updated": "2026-08-18", + "knowledge": "2025-12-01", + "release_date": "2026-04-23", + "last_updated": "2026-04-23", "type": "chat" }, { - "id": "nvidia.nemotron-nano-9b-v2", - "name": "NVIDIA Nemotron Nano 9B v2", - "display_name": "NVIDIA Nemotron Nano 9B v2", + "id": "gemini-3.5-flash", + "name": "Gemini 3.5 Flash", + "display_name": "Gemini 3.5 Flash", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-09", - "release_date": "2025-08-18", - "last_updated": "2025-08-18", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", + "low", + "medium", + "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2026-05-19", + "last_updated": "2026-05-19", "type": "chat" }, { - "id": "us.mistral.pixtral-large-2502-v1:0", - "name": "Pixtral Large (25.02) (US)", - "display_name": "Pixtral Large (25.02) (US)", + "id": "gpt-5.2-pro", + "name": "GPT-5.2 Pro", + "display_name": "GPT-5.2 Pro", "modalities": { "input": [ "text", @@ -20799,24 +20611,46 @@ ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } }, "attachment": true, "open_weights": false, - "release_date": "2025-04-08", - "last_updated": "2025-04-08", + "knowledge": "2025-08-31", + "release_date": "2025-12-11", + "last_updated": "2025-12-11", "type": "chat" }, { - "id": "us.zai.glm-5.3", - "name": "GLM-5.3 (US)", - "display_name": "GLM-5.3 (US)", + "id": "qwen3-30b-a3b", + "name": "Qwen3 30B A3B", + "display_name": "Qwen3 30B A3B", "modalities": { "input": [ "text" @@ -20826,8 +20660,8 @@ ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 32768, + "output": 16384 }, "temperature": true, "tool_call": true, @@ -20839,99 +20673,84 @@ "reasoning": { "supported": true, "interleaved": true, - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, "attachment": false, "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "release_date": "2025-04-28", + "last_updated": "2025-04-28", "type": "chat" }, { - "id": "us.writer.palmyra-x4-v1:0", - "name": "Palmyra X4 (US)", - "display_name": "Palmyra X4 (US)", + "id": "ministral-8b-2512", + "name": "Ministral 8B", + "display_name": "Ministral 8B", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 122880, + "context": 262144, "output": 8192 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": false, - "open_weights": false, - "release_date": "2024-10-09", - "last_updated": "2025-04-28", + "attachment": true, + "open_weights": true, + "release_date": "2025-12-02", + "last_updated": "2025-12-02", "type": "chat" }, { - "id": "global.anthropic.claude-haiku-5-5", - "name": "Claude Haiku 5.5 (Global)", - "display_name": "Claude Haiku 5.5 (Global)", + "id": "mistral-medium-3-5", + "name": "Mistral Medium 3.5", + "display_name": "Mistral Medium 3.5", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 262144, + "output": 262144 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ] - } + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-10-07", - "last_updated": "2026-10-07", + "release_date": "2026-04-30", + "last_updated": "2026-04-30", "type": "chat" }, { - "id": "us.anthropic.claude-sonnet-5-5", - "name": "Claude Sonnet 5.5 (US)", - "display_name": "Claude Sonnet 5.5 (US)", + "id": "glm-5.3-flash", + "name": "GLM-5.3-Flash", + "display_name": "GLM-5.3-Flash", "modalities": { "input": [ "text", "image", + "video", "pdf" ], "output": [ @@ -20939,10 +20758,10 @@ ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 1048576, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -20950,7 +20769,10 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ + "none", + "minimal", "low", "medium", "high", @@ -20960,68 +20782,55 @@ } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-09-28", - "last_updated": "2026-09-28", + "open_weights": true, + "release_date": "2026-08-26", + "last_updated": "2026-08-26", "type": "chat" }, { - "id": "eu.anthropic.claude-haiku-4-5-20251001-v1:0", - "name": "Claude Haiku 4.5 (EU)", - "display_name": "Claude Haiku 4.5 (EU)", + "id": "glm-4.7", + "name": "GLM-4.7", + "display_name": "GLM-4.7", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 204800, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-02-28", - "release_date": "2025-10-15", - "last_updated": "2025-10-15", + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-12-22", + "last_updated": "2025-12-22", "type": "chat" }, { - "id": "global.moonshotai.kimi-k3", - "name": "Kimi K3 (Global)", - "display_name": "Kimi K3 (Global)", + "id": "qwen3-vl-235b-a22b-instruct", + "name": "Qwen3 VL 235B A22B Instruct", + "display_name": "Qwen3 VL 235B A22B Instruct", "modalities": { "input": [ "text", @@ -21032,31 +20841,81 @@ ] }, "limit": { - "context": 1048576, - "output": 128000 + "context": 262144, + "output": 8192 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true - } + "supported": false }, "attachment": true, "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-16", + "knowledge": "2025-03-31", + "release_date": "2025-09-23", + "last_updated": "2025-09-23", "type": "chat" }, { - "id": "eu.anthropic.claude-opus-4-5-20251101-v1:0", - "name": "Claude Opus 4.5 (EU)", - "display_name": "Claude Opus 4.5 (EU)", + "id": "llama-3.1-70b-instruct", + "name": "Llama 3.1 70B Instruct", + "display_name": "Llama 3.1 70B Instruct", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 128000, + "output": 2048 + }, + "temperature": true, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "knowledge": "2023-12", + "release_date": "2024-07-23", + "last_updated": "2024-07-23", + "type": "chat" + }, + { + "id": "custom", + "name": "Custom Model", + "display_name": "Custom Model", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 128000, + "output": 16384 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": false, + "release_date": "2024-01-01", + "last_updated": "2024-01-01", + "type": "chat" + }, + { + "id": "gpt-4.1-mini", + "name": "GPT-4.1 mini", + "display_name": "GPT-4.1 mini", "modalities": { "input": [ "text", @@ -21068,53 +20927,53 @@ ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 1000000, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": false + "supported": false }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." - ] - } + "attachment": true, + "open_weights": false, + "knowledge": "2024-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", + "type": "chat" + }, + { + "id": "reka-edge-2603", + "name": "Reka Edge 2603", + "display_name": "Reka Edge 2603", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 16384, + "output": 16384 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2025-05", - "release_date": "2025-11-24", - "last_updated": "2025-11-24", + "release_date": "2026-10-09", + "last_updated": "2026-10-09", "type": "chat" }, { - "id": "global.anthropic.claude-sonnet-4-20250514-v1:0", - "name": "Claude Sonnet 4 (Global)", - "display_name": "Claude Sonnet 4 (Global)", + "id": "claude-sonnet-4-5-20250929", + "name": "Claude Sonnet 4.5", + "display_name": "Claude Sonnet 4.5", "modalities": { "input": [ "text", @@ -21158,15 +21017,15 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2025-03-31", - "release_date": "2025-05-22", - "last_updated": "2025-05-22", + "knowledge": "2025-07-31", + "release_date": "2025-09-29", + "last_updated": "2025-09-29", "type": "chat" }, { - "id": "xai.grok-4.3", - "name": "Grok 4.3", - "display_name": "Grok 4.3", + "id": "seed-1-6-flash-250715", + "name": "Seed 1.6 Flash (250715)", + "display_name": "Seed 1.6 Flash (250715)", "modalities": { "input": [ "text", @@ -21177,8 +21036,8 @@ ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 256000, + "output": 8192 }, "temperature": true, "tool_call": true, @@ -21189,7 +21048,7 @@ "extra_capabilities": { "reasoning": { "effort_options": [ - "none", + "minimal", "low", "medium", "high" @@ -21197,15 +21056,15 @@ } }, "attachment": true, - "open_weights": false, - "release_date": "2026-04-17", - "last_updated": "2026-06-28", + "open_weights": true, + "release_date": "2025-07-26", + "last_updated": "2025-07-26", "type": "chat" }, { - "id": "meta.llama3-1-70b-instruct-v1:0", - "name": "Llama 3.1 70B Instruct", - "display_name": "Llama 3.1 70B Instruct", + "id": "codestral-2508", + "name": "Codestral", + "display_name": "Codestral", "modalities": { "input": [ "text" @@ -21215,78 +21074,69 @@ ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 256000, + "output": 16384 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, "attachment": false, - "open_weights": true, - "knowledge": "2023-12", - "release_date": "2024-07-23", - "last_updated": "2024-07-23", + "open_weights": false, + "release_date": "2025-07-30", + "last_updated": "2025-07-30", "type": "chat" }, { - "id": "openai.gpt-oss-120b-1:0", - "name": "gpt-oss-120b", - "display_name": "gpt-oss-120b", + "id": "gpt-4o-mini", + "name": "GPT-4o mini", + "display_name": "GPT-4o mini", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 128000 + "context": 128000, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high" - ] - } + "supported": false }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "attachment": true, + "open_weights": false, + "knowledge": "2023-09", + "release_date": "2024-07-18", + "last_updated": "2024-07-18", "type": "chat" }, { - "id": "anthropic.claude-sonnet-5-5", - "name": "Claude Sonnet 5.5", - "display_name": "Claude Sonnet 5.5", + "id": "gemini-3.8-flash", + "name": "Gemini 3.8 Flash", + "display_name": "Gemini 3.8 Flash", "modalities": { "input": [ "text", "image", - "pdf" + "audio" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 1048576, + "output": 1048576 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -21294,39 +21144,45 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", "low", "medium", - "high", - "xhigh", - "max" + "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-09-28", - "last_updated": "2026-09-28", + "release_date": "2026-09-02", + "last_updated": "2026-09-02", "type": "chat" }, { - "id": "anthropic.claude-opus-5", - "name": "Claude Opus 5", - "display_name": "Claude Opus 5", + "id": "gpt-6-astra", + "name": "GPT-6 Astra", + "display_name": "GPT-6 Astra", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 1050000, + "output": 1050000 }, "temperature": false, "tool_call": true, @@ -21336,6 +21192,7 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ "low", "medium", @@ -21347,29 +21204,28 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2026-05", - "release_date": "2026-07-24", - "last_updated": "2026-07-24", + "knowledge": "2026-04-30", + "release_date": "2026-09-04", + "last_updated": "2026-09-04", "type": "chat" }, { - "id": "global.openai.gpt-6-sol", - "name": "GPT-6 Sol (Global)", - "display_name": "GPT-6 Sol (Global)", + "id": "glm-5.1", + "name": "GLM-5.1", + "display_name": "GLM-5.1", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 204800, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -21377,8 +21233,16 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ "none", + "minimal", "low", "medium", "high", @@ -21387,49 +21251,73 @@ ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-04-20", - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "attachment": false, + "open_weights": true, + "release_date": "2026-04-07", + "last_updated": "2026-04-07", "type": "chat" }, { - "id": "writer.palmyra-x4-v1:0", - "name": "Palmyra X4", - "display_name": "Palmyra X4", + "id": "gpt-5-nano", + "name": "GPT-5 Nano", + "display_name": "GPT-5 Nano", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 122880, - "output": 8192 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "minimal", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, "open_weights": false, - "release_date": "2024-10-09", - "last_updated": "2025-04-28", + "knowledge": "2024-05-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "au.anthropic.claude-sonnet-5", - "name": "Claude Sonnet 5 (AU)", - "display_name": "Claude Sonnet 5 (AU)", + "id": "gemini-3.6-flash", + "name": "Gemini 3.6 Flash", + "display_name": "Gemini 3.6 Flash", "modalities": { "input": [ "text", "image", + "video", + "audio", "pdf" ], "output": [ @@ -21437,10 +21325,10 @@ ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 1048576, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -21448,26 +21336,34 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", "low", "medium", - "high", - "xhigh", - "max" + "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-30", - "last_updated": "2026-06-30", + "knowledge": "2026-03", + "release_date": "2026-07-21", + "last_updated": "2026-07-21", "type": "chat" }, { - "id": "anthropic.claude-sonnet-4-6", - "name": "Claude Sonnet 4.6", - "display_name": "Claude Sonnet 4.6", + "id": "claude-opus-4-5-20251101", + "name": "Claude Opus 4.5", + "display_name": "Claude Opus 4.5", "modalities": { "input": [ "text", @@ -21479,8 +21375,8 @@ ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, @@ -21501,8 +21397,7 @@ "effort_options": [ "low", "medium", - "high", - "max" + "high" ], "interleaved": true, "summaries": true, @@ -21511,36 +21406,34 @@ "thinking_blocks" ], "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." + "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-17", - "last_updated": "2026-03-13", + "knowledge": "2025-05", + "release_date": "2025-11-24", + "last_updated": "2025-11-24", "type": "chat" }, { - "id": "global.amazon.nova-2-lite-v1:0", - "name": "Nova 2 Lite (Global)", - "display_name": "Nova 2 Lite (Global)", + "id": "qwen3-vl-plus", + "name": "Qwen3-VL Plus", + "display_name": "Qwen3-VL Plus", "modalities": { "input": [ "text", - "image", - "video", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 65535 + "context": 262144, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -21550,24 +21443,26 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "low", - "medium", - "high" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-10", - "release_date": "2025-12-02", - "last_updated": "2025-12-01", + "knowledge": "2025-04", + "release_date": "2025-09-23", + "last_updated": "2025-09-23", "type": "chat" }, { - "id": "zai.glm-4.7", - "name": "GLM-4.7", - "display_name": "GLM-4.7", + "id": "minimax-m2", + "name": "MiniMax-M2", + "display_name": "MiniMax-M2", "modalities": { "input": [ "text" @@ -21577,7 +21472,7 @@ ] }, "limit": { - "context": 202752, + "context": 196608, "output": 131072 }, "temperature": true, @@ -21588,61 +21483,38 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true - } - }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-12-22", - "last_updated": "2025-12-22", - "type": "chat" - }, - { - "id": "qwen.qwen3-vl-235b-a22b", - "name": "Qwen3 VL 235B A22B Instruct", - "display_name": "Qwen3 VL 235B A22B Instruct", - "modalities": { - "input": [ - "text", - "image" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 262144, - "output": 262000 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2025-03-31", - "release_date": "2025-09-23", - "last_updated": "2025-11-25", + "release_date": "2025-10-27", + "last_updated": "2025-10-27", "type": "chat" }, { - "id": "openai.gpt-oss-20b-1:0", - "name": "gpt-oss-20b", - "display_name": "gpt-oss-20b", + "id": "grok-build-0-1", + "name": "Grok Build 0.1", + "display_name": "Grok Build 0.1", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 128000 + "context": 256000, + "output": 256000 }, "temperature": true, "tool_call": true, @@ -21659,21 +21531,30 @@ ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "attachment": true, + "open_weights": false, + "release_date": "2026-04-16", + "last_updated": "2026-04-16", "type": "chat" - }, + } + ] + }, + "liquid": { + "id": "liquid", + "name": "Liquid Inference", + "display_name": "Liquid Inference", + "api": "https://router.inference.ai.exchange/v1", + "doc": "https://inference.ai.exchange/docs", + "models": [ { - "id": "us.anthropic.claude-opus-4-1-20250805-v1:0", - "name": "Claude Opus 4.1 (US)", - "display_name": "Claude Opus 4.1 (US)", + "id": "liquid.auto", + "name": "Liquid Auto", + "display_name": "Liquid Auto", "modalities": { "input": [ "text", "image", + "audio", "pdf" ], "output": [ @@ -21681,115 +21562,79 @@ ] }, "limit": { - "context": 200000, - "output": 32000 + "context": 10000000, + "output": 1048576 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." - ] - } + "default": true }, "attachment": true, "open_weights": false, - "knowledge": "2025-03-31", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "release_date": "2026-10-20", + "last_updated": "2026-10-20", "type": "chat" - }, + } + ] + }, + "nearai": { + "id": "nearai", + "name": "NEAR AI Cloud", + "display_name": "NEAR AI Cloud", + "api": "https://cloud-api.near.ai/v1", + "doc": "https://docs.near.ai/", + "models": [ { - "id": "us.anthropic.claude-sonnet-4-6", - "name": "Claude Sonnet 4.6 (US)", - "display_name": "Claude Sonnet 4.6 (US)", + "id": "moonshotai/kimi-k3.1-pro", + "name": "Kimi K3.1 Pro", + "display_name": "Kimi K3.1 Pro", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 1048576, + "output": 131072 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "max" - ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." + "effort_options": [ + "low", + "high", + "max" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-17", - "last_updated": "2026-03-13", + "release_date": "2026-10-23", + "last_updated": "2026-10-23", "type": "chat" - } - ] - }, - "dinference": { - "id": "dinference", - "name": "DInference", - "display_name": "DInference", - "api": "https://api.dinference.com/v1", - "doc": "https://dinference.com", - "models": [ + }, { - "id": "glm-5.1", - "name": "GLM-5.1", - "display_name": "GLM-5.1", + "id": "moonshotai/kimi-k2.6", + "name": "Kimi K2.6", + "display_name": "Kimi K2.6", "modalities": { "input": [ "text" @@ -21799,8 +21644,8 @@ ] }, "limit": { - "context": 200000, - "output": 128000 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, @@ -21821,14 +21666,15 @@ }, "attachment": false, "open_weights": true, - "release_date": "2026-04-07", - "last_updated": "2026-04-07", + "knowledge": "2025-01", + "release_date": "2026-04-20", + "last_updated": "2026-04-20", "type": "chat" }, { - "id": "glm-5", - "name": "GLM-5", - "display_name": "GLM-5", + "id": "moonshotai/kimi-k3", + "name": "Kimi K3", + "display_name": "Kimi K3", "modalities": { "input": [ "text" @@ -21838,10 +21684,10 @@ ] }, "limit": { - "context": 200000, - "output": 128000 + "context": 1048576, + "output": 131072 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -21855,30 +21701,36 @@ "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "effort_options": [ + "low", + "high", + "max" ] } }, "attachment": false, "open_weights": true, - "release_date": "2026-02-12", - "last_updated": "2026-02-12", + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" }, { - "id": "minimax-m2.5", - "name": "MiniMax-M2.5", - "display_name": "MiniMax-M2.5", + "id": "deepseek/deepseek-v4.1-flash-1017", + "name": "DeepSeek V4.1 Flash 1017", + "display_name": "DeepSeek V4.1 Flash 1017", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 32000 + "context": 1000000, + "output": 384000 }, "temperature": true, "tool_call": true, @@ -21888,52 +21740,24 @@ }, "extra_capabilities": { "reasoning": { - "supported": true - } - }, - "attachment": false, - "open_weights": true, - "release_date": "2026-02-12", - "last_updated": "2026-02-12", - "type": "chat" - }, - { - "id": "gpt-oss-120b", - "name": "GPT OSS 120B", - "display_name": "GPT OSS 120B", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 131072, - "output": 32768 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true + "effort_options": [ + "low", + "high", + "max" + ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "knowledge": "2025-05", + "release_date": "2026-10-17", + "last_updated": "2026-10-17", "type": "chat" }, { - "id": "glm-5.2", - "name": "GLM-5.2", - "display_name": "GLM-5.2", + "id": "deepseek/deepseek-v3.2", + "name": "DeepSeek V3.2", + "display_name": "DeepSeek V3.2", "modalities": { "input": [ "text" @@ -21943,8 +21767,8 @@ ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 128000, + "output": 64000 }, "temperature": true, "tool_call": true, @@ -21965,115 +21789,109 @@ }, "attachment": false, "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "knowledge": "2024-07", + "release_date": "2025-12-01", + "last_updated": "2025-12-01", "type": "chat" }, { - "id": "glm-4.7", - "name": "GLM-4.7", - "display_name": "GLM-4.7", + "id": "black-forest-labs/FLUX.2-klein-4B", + "name": "FLUX.2 Klein 4B", + "display_name": "FLUX.2 Klein 4B", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ - "text" + "image" ] }, "limit": { - "context": 200000, - "output": 128000 + "context": 8192, + "output": 8192 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-12-22", - "last_updated": "2025-12-22", - "type": "chat" - } - ] - }, - "runinfra": { - "id": "runinfra", - "name": "RunInfra", - "display_name": "RunInfra", - "api": "https://api.runinfra.ai/v1", - "doc": "https://runinfra.ai/docs", - "models": [ + "release_date": "2026-01-15", + "last_updated": "2026-01-15" + }, { - "id": "Qwen/Qwen3.8-27B", - "name": "Qwen3.8 27B", - "display_name": "Qwen3.8 27B", + "id": "openai/gpt-5.4", + "name": "GPT-5.4", + "display_name": "GPT-5.4", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 1050000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", "effort_options": [ "none", "low", "medium", + "high", "xhigh" - ] + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, - "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-03-05", + "last_updated": "2026-03-05", "type": "chat" }, { - "id": "Inferact/Qwen3.8-2.4T-A95B-NVFP4", - "name": "Qwen3.8 2.4T A95B (NVFP4)", - "display_name": "Qwen3.8 2.4T A95B (NVFP4)", + "id": "openai/gpt-5.6-sol", + "name": "GPT-5.6 Sol", + "display_name": "GPT-5.6 Sol", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -22081,96 +21899,90 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ + "none", "low", "medium", - "xhigh" - ] + "high", + "xhigh", + "max" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-08-12", - "last_updated": "2026-08-12", - "type": "chat" - }, - { - "id": "nvidia/NVIDIA-Nemotron-3.5-Lightning-30B-A3B-BF16", - "name": "Nemotron 3.5 Lightning 30B A3B", - "display_name": "Nemotron 3.5 Lightning 30B A3B", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 262144, - "output": 32768 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-09", - "release_date": "2026-08-11", - "last_updated": "2026-08-11", + "attachment": true, + "open_weights": false, + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "zai-org/GLM-5.3", - "name": "GLM-5.3", - "display_name": "GLM-5.3", + "id": "openai/gpt-5.4-mini", + "name": "GPT-5.4 mini", + "display_name": "GPT-5.4 mini", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 32768 + "context": 400000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], + "default_enabled": false, + "mode": "effort", + "effort": "none", "effort_options": [ + "none", "low", + "medium", "high", - "max" - ] + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "attachment": true, + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-03-17", + "last_updated": "2026-03-17", "type": "chat" }, { - "id": "zai-org/GLM-5.3-Flash", - "name": "GLM-5.3-Flash", - "display_name": "GLM-5.3-Flash", + "id": "openai/gpt-5.6-luna", + "name": "GPT-5.6 Luna", + "display_name": "GPT-5.6 Luna", "modalities": { "input": [ "text", @@ -22181,10 +21993,10 @@ ] }, "limit": { - "context": 1048576, - "output": 32768 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -22193,96 +22005,93 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ + "none", "low", + "medium", "high", + "xhigh", "max" - ] + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, - "open_weights": true, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", + "open_weights": false, + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-V4-Pro-0813", - "name": "DeepSeek V4 Pro 0813", - "display_name": "DeepSeek V4 Pro 0813", + "id": "openai/gpt-4.1", + "name": "GPT-4.1", + "display_name": "GPT-4.1", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, + "context": 1047576, "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, - "attachment": false, - "open_weights": true, - "release_date": "2026-08-13", - "last_updated": "2026-08-22", + "attachment": true, + "open_weights": false, + "knowledge": "2024-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-V4-Flash-0731", - "name": "DeepSeek V4 Flash 0731", - "display_name": "DeepSeek V4 Flash 0731", + "id": "openai/whisper-large-v3", + "name": "Whisper Large v3", + "display_name": "Whisper Large v3", "modalities": { "input": [ - "text" + "audio" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 32768 + "context": 448, + "output": 448 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "none", - "low", - "max" - ] - } + "supported": false }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-07-31", - "last_updated": "2026-07-31", - "type": "chat" + "release_date": "2023-11-06", + "last_updated": "2023-11-06" }, { - "id": "ornith-ai/Ornith-1.5-35B-A3B", - "name": "Ornith 1.5 35B A3B", - "display_name": "Ornith 1.5 35B A3B", + "id": "openai/gpt-5.1", + "name": "GPT-5.1", + "display_name": "GPT-5.1", "modalities": { "input": [ "text", @@ -22293,58 +22102,61 @@ ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 400000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, - "open_weights": true, - "release_date": "2026-08-18", - "last_updated": "2026-08-23", + "open_weights": false, + "knowledge": "2024-09-30", + "release_date": "2025-11-13", + "last_updated": "2025-11-13", "type": "chat" - } - ] - }, - "subconscious": { - "id": "subconscious", - "name": "Subconscious", - "display_name": "Subconscious", - "api": "https://api.subconscious.dev/v1", - "doc": "https://docs.subconscious.dev", - "models": [ + }, { - "id": "subconscious/glm-5.3-marathon", - "name": "GLM-5.3 Marathon", - "display_name": "GLM-5.3 Marathon", + "id": "openai/gpt-6-luna", + "name": "GPT-6 Luna", + "display_name": "GPT-6 Luna", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 5000000, - "output": 131072 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -22353,22 +22165,26 @@ "extra_capabilities": { "reasoning": { "effort_options": [ + "none", "low", + "medium", "high", + "xhigh", "max" ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "attachment": true, + "open_weights": false, + "knowledge": "2026-05-18", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "subconscious/deepseek-v4.1-flash-marathon", - "name": "DeepSeek V4.1 Flash Marathon", - "display_name": "DeepSeek V4.1 Flash Marathon", + "id": "openai/gpt-5-mini", + "name": "GPT-5 Mini", + "display_name": "GPT-5 Mini", "modalities": { "input": [ "text", @@ -22379,10 +22195,10 @@ ] }, "limit": { - "context": 5000000, - "output": 384000 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -22390,33 +22206,36 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ + "minimal", "low", - "high", - "max" - ] + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-09-10", - "last_updated": "2026-09-10", + "open_weights": false, + "knowledge": "2024-05-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" - } - ] - }, - "abliteration-ai": { - "id": "abliteration-ai", - "name": "abliteration.ai", - "display_name": "abliteration.ai", - "api": "https://api.abliteration.ai/v1", - "doc": "https://docs.abliteration.ai/models", - "models": [ + }, { - "id": "abliterated-model", - "name": "Abliterated Model", - "display_name": "Abliterated Model", + "id": "openai/gpt-6-sol", + "name": "GPT-6 Sol", + "display_name": "GPT-6 Sol", "modalities": { "input": [ "text", @@ -22427,10 +22246,10 @@ ] }, "limit": { - "context": 150000, - "output": 8192 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -22440,7 +22259,6 @@ "reasoning": { "effort_options": [ "none", - "minimal", "low", "medium", "high", @@ -22450,28 +22268,30 @@ } }, "attachment": true, - "open_weights": true, - "release_date": "2026-01-06", - "last_updated": "2026-07-28", + "open_weights": false, + "knowledge": "2026-04-20", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "abliterated-model-large-v2", - "name": "Abliterated Model Large V2", - "display_name": "Abliterated Model Large V2", + "id": "openai/gpt-5", + "name": "GPT-5", + "display_name": "GPT-5", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 999990 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -22479,36 +22299,50 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ + "minimal", "low", - "high", - "max" - ] + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-08-29", - "last_updated": "2026-08-31", + "knowledge": "2024-09-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "abliterated-model-large", - "name": "Abliterated Model Large", - "display_name": "Abliterated Model Large", + "id": "openai/gpt-6.1-sol", + "name": "GPT-6.1 Sol", + "display_name": "GPT-6.1 Sol", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 999990 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -22517,82 +22351,92 @@ "extra_capabilities": { "reasoning": { "effort_options": [ - "none", + "low", + "medium", "high", + "xhigh", "max" ] } }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-07-25", - "last_updated": "2026-07-28", + "knowledge": "2026-04-30", + "release_date": "2026-09-29", + "last_updated": "2026-09-29", "type": "chat" - } - ] - }, - "aki-io": { - "id": "aki-io", - "name": "AKI.IO", - "display_name": "AKI.IO", - "api": "https://aki.io/v1", - "doc": "https://aki.io/docs/", - "models": [ + }, { - "id": "qwen3.8-27b", - "name": "Qwen3.8 27B", - "display_name": "Qwen3.8 27B", + "id": "openai/gpt-5.2", + "name": "GPT-5.2", + "display_name": "GPT-5.2", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 400000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", "effort_options": [ "none", "low", "medium", + "high", "xhigh" - ] + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "attachment": true, + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2025-12-11", + "last_updated": "2025-12-11", "type": "chat" }, { - "id": "gemma4-26b", - "name": "Gemma 4 26B A4B IT", - "display_name": "Gemma 4 26B A4B IT", + "id": "openai/o3", + "name": "o3", + "display_name": "o3", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 32768 + "context": 200000, + "output": 100000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -22600,72 +22444,96 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ - "none", + "low", + "medium", "high" - ] + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "attachment": true, + "open_weights": false, + "knowledge": "2024-05", + "release_date": "2025-04-16", + "last_updated": "2025-04-16", "type": "chat" }, { - "id": "glm5.3-754b", - "name": "GLM-5.3", - "display_name": "GLM-5.3", + "id": "openai/gpt-5.4-nano", + "name": "GPT-5.4 nano", + "display_name": "GPT-5.4 nano", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 524288, - "output": 81920 + "context": 400000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", "effort_options": [ + "none", "low", + "medium", "high", - "max" - ] + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "attachment": true, + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-03-17", + "last_updated": "2026-03-17", "type": "chat" }, { - "id": "deepseek-v4.1-flash-552b", - "name": "DeepSeek V4.1 Flash", - "display_name": "DeepSeek V4.1 Flash", + "id": "openai/gpt-5.5", + "name": "GPT-5.5", + "display_name": "GPT-5.5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 81920 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -22673,65 +22541,66 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ - "none", "low", "medium", "high", - "max" - ] + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-09-10", - "last_updated": "2026-09-10", + "attachment": true, + "open_weights": false, + "knowledge": "2025-12-01", + "release_date": "2026-04-23", + "last_updated": "2026-04-23", "type": "chat" }, { - "id": "gpt-oss-120b", - "name": "GPT OSS 120B", - "display_name": "GPT OSS 120B", + "id": "openai/gpt-4.1-mini", + "name": "GPT-4.1 mini", + "display_name": "GPT-4.1 mini", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, + "context": 1047576, "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "low", - "medium", - "high" - ] - } + "supported": false }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "attachment": true, + "open_weights": false, + "knowledge": "2024-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", "type": "chat" }, { - "id": "qwen3.6-35b", - "name": "Qwen3.6 35B-A3B", - "display_name": "Qwen3.6 35B-A3B", + "id": "openai/o3-mini", + "name": "o3-mini", + "display_name": "o3-mini", "modalities": { "input": [ "text" @@ -22741,10 +22610,10 @@ ] }, "limit": { - "context": 256000, - "output": 32768 + "context": 200000, + "output": 100000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -22753,41 +22622,42 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ - "none", + "low", + "medium", "high" - ] + ], + "visibility": "hidden" } }, "attachment": false, - "open_weights": true, - "release_date": "2026-04-17", - "last_updated": "2026-04-17", + "open_weights": false, + "knowledge": "2024-05", + "release_date": "2024-12-20", + "last_updated": "2025-01-29", "type": "chat" }, { - "id": "mistral4-119b", - "name": "Mistral Small 4", - "display_name": "Mistral Small 4", + "id": "openai/o4-mini", + "name": "o4-mini", + "display_name": "o4-mini", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 81920 + "context": 200000, + "output": 100000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -22795,47 +22665,43 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ - "none", + "low", + "medium", "high" - ] + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-06", - "release_date": "2026-03-16", - "last_updated": "2026-03-16", + "attachment": true, + "open_weights": false, + "knowledge": "2024-05", + "release_date": "2025-04-16", + "last_updated": "2025-04-16", "type": "chat" - } - ] - }, - "stepfun-step-plan": { - "id": "stepfun-step-plan", - "name": "StepFun Step Plan (China)", - "display_name": "StepFun Step Plan (China)", - "api": "https://api.stepfun.com/step_plan/v1", - "doc": "https://platform.stepfun.com/docs/zh/step-plan/integrations/reasoning-api", - "models": [ + }, { - "id": "step-5-preview", - "name": "Step 5 Preview", - "display_name": "Step 5 Preview", + "id": "openai/gpt-6-astra", + "name": "GPT-6 Astra", + "display_name": "GPT-6 Astra", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -22844,44 +22710,40 @@ "extra_capabilities": { "reasoning": { "supported": true, - "mode": "effort", - "effort": "medium", "effort_options": [ "low", "medium", - "high" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "high", + "xhigh", + "max" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-09-16", - "last_updated": "2026-09-20", + "open_weights": false, + "knowledge": "2026-04-30", + "release_date": "2026-09-04", + "last_updated": "2026-09-04", "type": "chat" }, { - "id": "step-3.5-flash-2603", - "name": "Step 3.5 Flash 2603", - "display_name": "Step 3.5 Flash 2603", + "id": "openai/gpt-5-nano", + "name": "GPT-5 Nano", + "display_name": "GPT-5 Nano", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 256000 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -22890,57 +22752,35 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ + "minimal", "low", + "medium", "high" - ] + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-02", - "last_updated": "2026-04-02", - "type": "chat" - }, - { - "id": "step-router-v1", - "name": "Step Router v1", - "display_name": "Step Router v1", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 256000, - "output": 256000 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-05-29", - "last_updated": "2026-05-29", + "knowledge": "2024-05-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "step-3.5-flash", - "name": "Step 3.5 Flash", - "display_name": "Step 3.5 Flash", + "id": "z-ai/glm-5.3", + "name": "GLM-5.3", + "display_name": "GLM-5.3", "modalities": { "input": [ "text" @@ -22950,8 +22790,8 @@ ] }, "limit": { - "context": 256000, - "output": 256000 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -22970,34 +22810,33 @@ ], "effort_options": [ "low", - "high" + "high", + "max" ] } }, "attachment": false, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-01-29", - "last_updated": "2026-02-13", + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "step-3.7-flash", - "name": "Step 3.7 Flash", - "display_name": "Step 3.7 Flash", + "id": "z-ai/glm-5.3-flash", + "name": "GLM-5.3-Flash", + "display_name": "GLM-5.3-Flash", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 256000 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -23016,31 +22855,48 @@ ], "effort_options": [ "low", - "medium", - "high" + "high", + "max" ] } }, "attachment": true, "open_weights": true, - "knowledge": "2026-03-01", - "release_date": "2026-05-29", - "last_updated": "2026-05-29", + "release_date": "2026-08-26", + "last_updated": "2026-08-26", "type": "chat" - } - ] - }, - "unorouter": { - "id": "unorouter", - "name": "UnoRouter", - "display_name": "UnoRouter", - "api": "https://api.unorouter.com/v1", - "doc": "https://unorouter.com/models", - "models": [ + }, { - "id": "gpt-5.2", - "name": "GPT-5.2", - "display_name": "GPT-5.2", + "id": "Qwen/Qwen3-Reranker-0.6B", + "name": "Qwen3 Reranker 0.6B", + "display_name": "Qwen3 Reranker 0.6B", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 40960, + "output": 1024 + }, + "temperature": false, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "release_date": "2025-06-05", + "last_updated": "2025-06-05", + "type": "rerank" + }, + { + "id": "Qwen/Qwen3-VL-30B-A3B-Instruct", + "name": "Qwen3-VL 30B-A3B Instruct", + "display_name": "Qwen3-VL 30B-A3B Instruct", "modalities": { "input": [ "text", @@ -23051,100 +22907,64 @@ ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 16384, + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2025-12-11", - "last_updated": "2025-12-11", + "open_weights": true, + "release_date": "2025-10-04", + "last_updated": "2025-10-04", "type": "chat" }, { - "id": "claude-haiku-4-5-20251001", - "name": "Claude Haiku 4.5", - "display_name": "Claude Haiku 4.5", + "id": "Qwen/Qwen3.8-27B", + "name": "Qwen3.8 27B", + "display_name": "Qwen3.8 27B", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 262144, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-02-28", - "release_date": "2025-10-15", - "last_updated": "2025-10-15", + "open_weights": true, + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "minimax-m2.7:free", - "name": "MiniMax-M2.7", - "display_name": "MiniMax-M2.7", + "id": "Qwen/Qwen3-Embedding-0.6B", + "name": "Qwen3 Embedding 0.6B", + "display_name": "Qwen3 Embedding 0.6B", "modalities": { "input": [ "text" @@ -23154,25 +22974,24 @@ ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 32768, + "output": 1024 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, "open_weights": true, - "release_date": "2026-03-18", - "last_updated": "2026-03-18", - "type": "chat" + "release_date": "2025-06-05", + "last_updated": "2025-06-05", + "type": "embedding" }, { - "id": "deepseek-v4-flash", - "name": "DeepSeek V4 Flash", - "display_name": "DeepSeek V4 Flash", + "id": "Qwen/Qwen3.6-35B-A3B-FP8", + "name": "Qwen 3.6 35B A3B FP8", + "display_name": "Qwen 3.6 35B A3B FP8", "modalities": { "input": [ "text" @@ -23182,8 +23001,8 @@ ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 262144, + "output": 8192 }, "temperature": true, "tool_call": true, @@ -23194,36 +23013,24 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "high", - "max" - ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, "attachment": false, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "release_date": "2026-04-17", + "last_updated": "2026-04-17", "type": "chat" }, { - "id": "gpt-5.4:free", - "name": "GPT-5.4", - "display_name": "GPT-5.4", + "id": "anthropic/claude-sonnet-4-5", + "name": "Claude Sonnet 4.5 (latest)", + "display_name": "Claude Sonnet 4.5 (latest)", "modalities": { "input": [ "text", @@ -23235,57 +23042,51 @@ ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + ] + } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-05", - "last_updated": "2026-03-05", - "type": "chat" - }, - { - "id": "glm-5.2:free", - "name": "GLM-5.2", - "display_name": "GLM-5.2", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 1000000, - "output": 131072 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "attachment": false, - "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "knowledge": "2025-07-31", + "release_date": "2025-09-29", + "last_updated": "2025-09-29", "type": "chat" }, { - "id": "deepseek-v4-pro", - "name": "DeepSeek V4 Pro", - "display_name": "DeepSeek V4 Pro", + "id": "anthropic/claude-fable-5", + "name": "Claude Fable 5", + "display_name": "Claude Fable 5", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" @@ -23293,9 +23094,9 @@ }, "limit": { "context": 1000000, - "output": 384000 + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -23309,31 +23110,35 @@ "effort": "high", "effort_options": [ "low", + "medium", "high", + "xhigh", "max" ], "interleaved": true, "summaries": true, - "visibility": "summary", + "visibility": "omitted", "continuation": [ "thinking_blocks" ], "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." + "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", + "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", + "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "attachment": true, + "open_weights": false, + "knowledge": "2026-01-31", + "release_date": "2026-06-09", + "last_updated": "2026-06-09", "type": "chat" }, { - "id": "claude-sonnet-5", - "name": "Claude Sonnet 5", - "display_name": "Claude Sonnet 5", + "id": "anthropic/claude-haiku-4-5", + "name": "Claude Haiku 4.5 (latest)", + "display_name": "Claude Haiku 4.5 (latest)", "modalities": { "input": [ "text", @@ -23345,37 +23150,51 @@ ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 200000, + "output": 64000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-30", - "last_updated": "2026-06-30", + "knowledge": "2025-02-28", + "release_date": "2025-10-15", + "last_updated": "2025-10-15", "type": "chat" }, { - "id": "gemini-3.5-flash", - "name": "Gemini 3.5 Flash", - "display_name": "Gemini 3.5 Flash", + "id": "anthropic/claude-sonnet-4-6", + "name": "Claude Sonnet 4.6", + "display_name": "Claude Sonnet 4.6", "modalities": { "input": [ "text", "image", - "video", - "audio", "pdf" ], "output": [ @@ -23383,119 +23202,125 @@ ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 1000000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", + "effort_options": [ "low", "medium", - "high" + "high", + "max" ], + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" + ], + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-05-19", - "last_updated": "2026-05-19", + "knowledge": "2025-08-31", + "release_date": "2026-02-17", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "gemma-4-31b-it:free", - "name": "Gemma 4 31B IT", - "display_name": "Gemma 4 31B IT", + "id": "anthropic/claude-opus-4-7", + "name": "Claude Opus 4.7", + "display_name": "Claude Opus 4.7", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true - }, - "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-02", - "last_updated": "2026-04-02", - "type": "chat" - }, - { - "id": "glm-4.5-flash:free", - "name": "GLM-4.5-Flash", - "display_name": "GLM-4.5-Flash", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 131072, - "output": 98304 + "default": false }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." + ] + } }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2025-04", - "release_date": "2025-07-28", - "last_updated": "2025-07-28", + "knowledge": "2026-01-31", + "release_date": "2026-04-16", + "last_updated": "2026-04-16", "type": "chat" }, { - "id": "qwen3.5-397b-a17b:free", - "name": "Qwen3.5 397B-A17B", - "display_name": "Qwen3.5 397B-A17B", + "id": "anthropic/claude-fable-5-1", + "name": "Claude Fable 5.1", + "display_name": "Claude Fable 5.1", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -23504,24 +23329,40 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], "interleaved": true, "summaries": true, - "visibility": "summary", + "visibility": "omitted", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", + "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", + "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-02-15", - "last_updated": "2026-02-15", + "open_weights": false, + "knowledge": "2026-06", + "release_date": "2026-09-01", + "last_updated": "2026-09-01", "type": "chat" }, { - "id": "gpt-5.5:free", - "name": "GPT-5.5", - "display_name": "GPT-5.5", + "id": "anthropic/claude-opus-5-5", + "name": "Claude Opus 5.5", + "display_name": "Claude Opus 5.5", "modalities": { "input": [ "text", @@ -23533,7 +23374,7 @@ ] }, "limit": { - "context": 1050000, + "context": 1000000, "output": 128000 }, "temperature": false, @@ -23542,63 +23383,101 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + }, "attachment": true, "open_weights": false, - "knowledge": "2025-12-01", - "release_date": "2026-04-23", - "last_updated": "2026-04-23", + "knowledge": "2026-06", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "step-3.7-flash:free", - "name": "Step 3.7 Flash", - "display_name": "Step 3.7 Flash", + "id": "anthropic/claude-opus-4-6", + "name": "Claude Opus 4.6", + "display_name": "Claude Opus 4.6", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 256000 + "context": 200000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." + ] + } }, "attachment": true, - "open_weights": true, - "knowledge": "2026-03-01", - "release_date": "2026-05-29", - "last_updated": "2026-05-29", + "open_weights": false, + "knowledge": "2025-05-31", + "release_date": "2026-02-05", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "gpt-5.4", - "name": "GPT-5.4", - "display_name": "GPT-5.4", + "id": "anthropic/claude-opus-4-8", + "name": "Claude Opus 4.8", + "display_name": "Claude Opus 4.8", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1050000, + "context": 1000000, "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -23609,49 +23488,52 @@ "supported": true, "default_enabled": false, "mode": "effort", - "effort": "none", + "effort": "high", "effort_options": [ - "none", "low", "medium", "high", - "xhigh" + "xhigh", + "max" ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" ], - "visibility": "hidden" + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-05", - "last_updated": "2026-03-05", + "knowledge": "2026-01", + "release_date": "2026-05-28", + "last_updated": "2026-05-28", "type": "chat" }, { - "id": "kimi-k2.6", - "name": "Kimi K2.6", - "display_name": "Kimi K2.6", + "id": "anthropic/claude-opus-5", + "name": "Claude Opus 5", + "display_name": "Claude Opus 5", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -23663,19 +23545,20 @@ } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-20", - "last_updated": "2026-04-20", + "open_weights": false, + "knowledge": "2026-05", + "release_date": "2026-07-24", + "last_updated": "2026-07-24", "type": "chat" }, { - "id": "deepseek-v4-flash:free", - "name": "DeepSeek V4 Flash", - "display_name": "DeepSeek V4 Flash", + "id": "anthropic/claude-haiku-5-5", + "name": "Claude Haiku 5.5", + "display_name": "Claude Haiku 5.5", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" @@ -23683,25 +23566,36 @@ }, "limit": { "context": 1000000, - "output": 384000 + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2026-06", + "release_date": "2026-10-07", + "last_updated": "2026-10-07", "type": "chat" }, { - "id": "gpt-5.5", - "name": "GPT-5.5", - "display_name": "GPT-5.5", + "id": "anthropic/claude-sonnet-5-5", + "name": "Claude Sonnet 5.5", + "display_name": "Claude Sonnet 5.5", "modalities": { "input": [ "text", @@ -23713,7 +23607,7 @@ ] }, "limit": { - "context": 1050000, + "context": 1000000, "output": 128000 }, "temperature": false, @@ -23724,39 +23618,30 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", "effort_options": [ "low", "medium", "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "xhigh", + "max" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-12-01", - "release_date": "2026-04-23", - "last_updated": "2026-04-23", + "knowledge": "2026-06", + "release_date": "2026-09-28", + "last_updated": "2026-09-28", "type": "chat" }, { - "id": "glm-5.2", - "name": "GLM-5.2", - "display_name": "GLM-5.2", + "id": "anthropic/claude-sonnet-5", + "name": "Claude Sonnet 5", + "display_name": "Claude Sonnet 5", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" @@ -23764,9 +23649,9 @@ }, "limit": { "context": 1000000, - "output": 131072 + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -23777,27 +23662,32 @@ "supported": true } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "attachment": true, + "open_weights": false, + "knowledge": "2026-01-31", + "release_date": "2026-06-30", + "last_updated": "2026-06-30", "type": "chat" }, { - "id": "minimax-m2.7", - "name": "MiniMax-M2.7", - "display_name": "MiniMax-M2.7", + "id": "google/gemini-2.5-pro", + "name": "Gemini 2.5 Pro", + "display_name": "Gemini 2.5 Pro", "modalities": { "input": [ - "text" + "text", + "image", + "audio", + "video", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -23808,35 +23698,48 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": true, + "mode": "budget", + "budget": { + "default": -1, + "min": 128, + "max": 32768, + "auto": -1, + "unit": "tokens" + }, "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" + "thought_signatures" ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-03-18", - "last_updated": "2026-03-18", + "attachment": true, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2025-06-17", + "last_updated": "2025-06-17", "type": "chat" }, { - "id": "nemotron-3-ultra-550b-a55b:free", - "name": "Nemotron 3 Ultra 550B A55B", - "display_name": "Nemotron 3 Ultra 550B A55B", + "id": "google/gemini-3.1-flash-lite", + "name": "Gemini 3.1 Flash Lite", + "display_name": "Gemini 3.1 Flash Lite", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -23844,21 +23747,28 @@ "supported": true, "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-09", - "release_date": "2026-06-04", - "last_updated": "2026-06-04", + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2026-05-07", + "last_updated": "2026-05-07", "type": "chat" }, { - "id": "claude-opus-4-8", - "name": "Claude Opus 4.8", - "display_name": "Claude Opus 4.8", + "id": "google/gemini-2.5-flash", + "name": "Gemini 2.5 Flash", + "display_name": "Gemini 2.5 Flash", "modalities": { "input": [ "text", "image", + "audio", + "video", "pdf" ], "output": [ @@ -23866,101 +23776,162 @@ ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 1048576, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], - "interleaved": true, + "default_enabled": true, + "mode": "budget", + "budget": { + "default": -1, + "min": 0, + "max": 24576, + "auto": -1, + "off": 0, + "unit": "tokens" + }, "summaries": true, - "visibility": "omitted", + "visibility": "summary", "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." + "thought_signatures" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-01", - "release_date": "2026-05-28", - "last_updated": "2026-05-28", + "knowledge": "2025-01", + "release_date": "2025-06-17", + "last_updated": "2025-06-17", "type": "chat" }, { - "id": "deepseek-v4-pro:free", - "name": "DeepSeek V4 Pro", - "display_name": "DeepSeek V4 Pro", + "id": "google/gemini-2.5-flash-lite", + "name": "Gemini 2.5 Flash-Lite", + "display_name": "Gemini 2.5 Flash-Lite", "modalities": { "input": [ - "text" + "text", + "image", + "audio", + "video", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 384000 - }, + "context": 1048576, + "output": 65536 + }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "default": -1, + "min": 512, + "max": 24576, + "auto": -1, + "unit": "tokens" + }, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2025-06-17", + "last_updated": "2025-06-17", "type": "chat" - } - ] - }, - "minimax-cn-coding-plan": { - "id": "minimax-cn-coding-plan", - "name": "MiniMax Token Plan (minimax.cn)", - "display_name": "MiniMax Token Plan (minimax.cn)", - "api": "https://api.minimax.cn/anthropic/v1", - "doc": "https://platform.minimaxi.com/docs/token-plan/intro", - "models": [ + }, { - "id": "MiniMax-M2.7-highspeed", - "name": "MiniMax-M2.7-highspeed", - "display_name": "MiniMax-M2.7-highspeed", + "id": "google/gemini-3.5-flash", + "name": "Gemini 3.5 Flash", + "display_name": "Gemini 3.5 Flash", "modalities": { "input": [ + "text", + "image", + "video", + "audio", + "pdf" + ], + "output": [ "text" + ] + }, + "limit": { + "context": 1048576, + "output": 65536 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", + "low", + "medium", + "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2026-05-19", + "last_updated": "2026-05-19", + "type": "chat" + }, + { + "id": "google/gemini-3.8-flash", + "name": "Gemini 3.8 Flash", + "display_name": "Gemini 3.8 Flash", + "modalities": { + "input": [ + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -23971,24 +23942,32 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", + "low", + "medium", + "high" + ], "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" + "thought_signatures" ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-03-18", - "last_updated": "2026-03-18", + "attachment": true, + "open_weights": false, + "release_date": "2026-09-02", + "last_updated": "2026-09-02", "type": "chat" }, { - "id": "MiniMax-M2.1", - "name": "MiniMax-M2.1", - "display_name": "MiniMax-M2.1", + "id": "qwen/qwen3.7-max", + "name": "Qwen3.7 Max", + "display_name": "Qwen3.7 Max", "modalities": { "input": [ "text" @@ -23998,7 +23977,7 @@ ] }, "limit": { - "context": 204800, + "context": 1000000, "output": 131072 }, "temperature": true, @@ -24013,26 +23992,27 @@ } }, "attachment": false, - "open_weights": true, - "release_date": "2025-12-23", - "last_updated": "2025-12-23", + "open_weights": false, + "release_date": "2026-05-21", + "last_updated": "2026-05-21", "type": "chat" }, { - "id": "MiniMax-M2.7", - "name": "MiniMax-M2.7", - "display_name": "MiniMax-M2.7", + "id": "qwen/qwen3.5-397b-a17b", + "name": "Qwen3.5 397B-A17B", + "display_name": "Qwen3.5 397B-A17B", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 262144, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -24051,16 +24031,16 @@ ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-03-18", - "last_updated": "2026-03-18", + "release_date": "2026-02-15", + "last_updated": "2026-02-15", "type": "chat" }, { - "id": "MiniMax-M2", - "name": "MiniMax-M2", - "display_name": "MiniMax-M2", + "id": "x-ai/grok-4.6", + "name": "Grok 4.6", + "display_name": "Grok 4.6", "modalities": { "input": [ "text" @@ -24070,8 +24050,8 @@ ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 500000, + "output": 500000 }, "temperature": true, "tool_call": true, @@ -24079,29 +24059,41 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "low", + "medium", + "high", + "xhigh" + ] + } + }, "attachment": false, - "open_weights": true, - "release_date": "2025-10-27", - "last_updated": "2025-10-27", + "open_weights": false, + "knowledge": "2026-02-01", + "release_date": "2026-08-12", + "last_updated": "2026-08-12", "type": "chat" }, { - "id": "MiniMax-M3.1-Flash", - "name": "MiniMax-M3.1-Flash", - "display_name": "MiniMax-M3.1-Flash", + "id": "x-ai/grok-4.7", + "name": "Grok 4.7", + "display_name": "Grok 4.7", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 524288 + "context": 500000, + "output": 500000 }, "temperature": true, "tool_call": true, @@ -24115,34 +24107,41 @@ "low", "medium", "high", - "xhigh", - "max" + "xhigh" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-10-19", - "last_updated": "2026-10-19", + "knowledge": "2026-05", + "release_date": "2026-09-21", + "last_updated": "2026-09-21", "type": "chat" - }, + } + ] + }, + "friendli": { + "id": "friendli", + "name": "Friendli", + "display_name": "Friendli", + "api": "https://api.friendli.ai/serverless/v1", + "doc": "https://friendli.ai/docs/guides/serverless_endpoints/introduction", + "models": [ { - "id": "MiniMax-M3", - "name": "MiniMax-M3", - "display_name": "MiniMax-M3", + "id": "zai-org/GLM-5.2", + "name": "GLM-5.2", + "display_name": "GLM-5.2", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 524288 + "context": 1048576, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -24152,19 +24151,29 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "high", + "max" + ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-06-01", - "last_updated": "2026-06-25", + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "MiniMax-M2.5", - "name": "MiniMax-M2.5", - "display_name": "MiniMax-M2.5", + "id": "zai-org/GLM-5.1", + "name": "GLM-5.1", + "display_name": "GLM-5.1", "modalities": { "input": [ "text" @@ -24174,7 +24183,7 @@ ] }, "limit": { - "context": 204800, + "context": 202752, "output": 131072 }, "temperature": true, @@ -24185,29 +24194,37 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": false, "open_weights": true, - "release_date": "2026-02-12", - "last_updated": "2026-02-12", + "release_date": "2026-04-07", + "last_updated": "2026-04-07", "type": "chat" }, { - "id": "MiniMax-M2.5-highspeed", - "name": "MiniMax-M2.5-highspeed", - "display_name": "MiniMax-M2.5-highspeed", + "id": "zai-org/GLM-5.3-Flash", + "name": "GLM-5.3-Flash", + "display_name": "GLM-5.3-Flash", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 204800, + "context": 1048576, "output": 131072 }, "temperature": true, @@ -24218,32 +24235,41 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "low", + "high", + "max" + ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-02-13", - "last_updated": "2026-02-13", + "release_date": "2026-08-26", + "last_updated": "2026-08-26", "type": "chat" }, { - "id": "MiniMax-M3.1-Flash-Preview", - "name": "MiniMax-M3.1-Flash-Preview", - "display_name": "MiniMax-M3.1-Flash-Preview", + "id": "zai-org/GLM-5.3", + "name": "GLM-5.3", + "display_name": "GLM-5.3", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 512000 + "context": 1048576, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -24253,33 +24279,80 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ "low", - "medium", "high", - "xhigh", "max" ] } }, + "attachment": false, + "open_weights": true, + "release_date": "2026-08-14", + "last_updated": "2026-08-14", + "type": "chat" + }, + { + "id": "google/gemma-4-31B-it", + "name": "Gemma 4 31B IT", + "display_name": "Gemma 4 31B IT", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 262144, + "output": 32768 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, "attachment": true, - "open_weights": false, - "release_date": "2026-09-27", - "last_updated": "2026-09-27", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" } ] }, - "cerebras": { - "id": "cerebras", - "name": "Cerebras", - "display_name": "Cerebras", - "doc": "https://inference-docs.cerebras.ai/models/overview", + "arcee": { + "id": "arcee", + "name": "Arcee", + "display_name": "Arcee", + "api": "https://api.arcee.ai/api/v1", + "doc": "https://docs.arcee.ai", "models": [ { - "id": "gpt-oss-120b", - "name": "GPT OSS 120B", - "display_name": "GPT OSS 120B", + "id": "trinity-large-thinking", + "name": "Trinity Large Thinking", + "display_name": "Trinity Large Thinking", "modalities": { "input": [ "text" @@ -24289,8 +24362,47 @@ ] }, "limit": { - "context": 131072, - "output": 40960 + "context": 262144, + "output": 80000 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, + "open_weights": true, + "release_date": "2026-04-01", + "last_updated": "2026-05-28", + "type": "chat" + }, + { + "id": "moonshotai/kimi-k3", + "name": "Kimi K3", + "display_name": "Kimi K3", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1048576, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -24301,24 +24413,29 @@ "extra_capabilities": { "reasoning": { "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ "low", - "medium", - "high" + "high", + "max" ] } }, "attachment": false, "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" }, { - "id": "qwen-3.8-27b", - "name": "Qwen3.8 27B", - "display_name": "Qwen3.8 27B", + "id": "deepseek/deepseek-v4.1-flash", + "name": "DeepSeek V4.1 Flash", + "display_name": "DeepSeek V4.1 Flash", "modalities": { "input": [ "text", @@ -24329,8 +24446,8 @@ ] }, "limit": { - "context": 131072, - "output": 40960 + "context": 1000000, + "output": 384000 }, "temperature": true, "tool_call": true, @@ -24340,40 +24457,33 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ - "none", - "low", - "medium", - "high" + "high", + "max" ] } }, "attachment": true, "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "knowledge": "2025-05", + "release_date": "2026-09-10", + "last_updated": "2026-09-10", "type": "chat" - } - ] - }, - "meta": { - "id": "meta", - "name": "Meta", - "display_name": "Meta", - "api": "https://api.meta.ai/v1", - "doc": "https://dev.meta.ai/docs", - "models": [ + }, { - "id": "muse-spark-1.3-contributor", - "name": "Muse Spark 1.3 Contributor", - "display_name": "Muse Spark 1.3 Contributor", + "id": "deepseek/deepseek-v4-flash-latest", + "name": "DeepSeek V4 Flash Latest", + "display_name": "DeepSeek V4 Flash Latest", "modalities": { "input": [ - "text", - "image", - "video", - "pdf", - "audio" + "text" ], "output": [ "text" @@ -24381,7 +24491,7 @@ }, "limit": { "context": 1048576, - "output": 131072 + "output": 384000 }, "temperature": true, "tool_call": true, @@ -24391,40 +24501,41 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ - "minimal", - "low", - "medium", "high", - "xhigh" + "max" ] } }, - "attachment": true, - "open_weights": false, - "release_date": "2026-09-02", - "last_updated": "2026-09-02", + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-07-31", + "last_updated": "2026-07-31", "type": "chat" }, { - "id": "muse-spark-1.2-contributor", - "name": "Muse Spark 1.2 Contributor", - "display_name": "Muse Spark 1.2 Contributor", + "id": "deepseek/deepseek-v4-pro", + "name": "DeepSeek V4 Pro", + "display_name": "DeepSeek V4 Pro", "modalities": { "input": [ - "text", - "image", - "video", - "pdf", - "audio" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 512000, + "output": 384000 }, "temperature": true, "tool_call": true, @@ -24434,40 +24545,49 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", "effort_options": [ - "minimal", "low", - "medium", "high", - "xhigh" + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, - "attachment": true, - "open_weights": false, - "release_date": "2026-08-05", - "last_updated": "2026-08-05", + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "muse-spark-1.3", - "name": "Muse Spark 1.3", - "display_name": "Muse Spark 1.3", + "id": "deepseek/deepseek-v4.1-flash-1017", + "name": "DeepSeek V4.1 Flash 1017", + "display_name": "DeepSeek V4.1 Flash 1017", "modalities": { "input": [ "text", - "image", - "video", - "pdf", - "audio" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 1000000, + "output": 384000 }, "temperature": true, "tool_call": true, @@ -24478,33 +24598,32 @@ "extra_capabilities": { "reasoning": { "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ - "minimal", - "low", - "medium", "high", - "xhigh", "max" ] } }, "attachment": true, - "open_weights": false, - "release_date": "2026-09-02", - "last_updated": "2026-09-02", + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-10-17", + "last_updated": "2026-10-17", "type": "chat" }, { - "id": "muse-wonder-1.0", - "name": "Muse Wonder", - "display_name": "Muse Wonder", + "id": "deepseek/deepseek-v4-pro-0813", + "name": "DeepSeek V4 Pro 0813", + "display_name": "DeepSeek V4 Pro 0813", "modalities": { "input": [ - "text", - "image", - "video", - "pdf", - "audio" + "text" ], "output": [ "text" @@ -24512,7 +24631,7 @@ }, "limit": { "context": 1048576, - "output": 131072 + "output": 384000 }, "temperature": true, "tool_call": true, @@ -24522,40 +24641,78 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ - "minimal", - "low", - "medium", "high", - "xhigh", "max" ] } }, - "attachment": true, - "open_weights": false, - "release_date": "2026-10-12", - "last_updated": "2026-10-12", + "attachment": false, + "open_weights": true, + "release_date": "2026-08-13", + "last_updated": "2026-08-22", "type": "chat" }, { - "id": "muse-spark-1.2", - "name": "Muse Spark 1.2", - "display_name": "Muse Spark 1.2", + "id": "thinkingmachines/inkling-small", + "name": "Inkling Small", + "display_name": "Inkling Small", "modalities": { "input": [ - "text", - "image", - "video", - "pdf", - "audio" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, + "context": 262144, + "output": 262144 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, + "open_weights": true, + "release_date": "2026-07-30", + "last_updated": "2026-07-30", + "type": "chat" + }, + { + "id": "zai-org/glm-5.2", + "name": "GLM-5.2", + "display_name": "GLM-5.2", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 262144, "output": 131072 }, "temperature": true, @@ -24567,38 +24724,38 @@ "extra_capabilities": { "reasoning": { "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ - "minimal", - "low", - "medium", "high", - "xhigh" + "max" ] } }, - "attachment": true, - "open_weights": false, - "release_date": "2026-08-05", - "last_updated": "2026-08-05", + "attachment": false, + "open_weights": true, + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "muse-spark-1.1", - "name": "Muse Spark 1.1", - "display_name": "Muse Spark 1.1", + "id": "zai-org/glm-5.3", + "name": "GLM-5.3", + "display_name": "GLM-5.3", "modalities": { "input": [ - "text", - "image", - "pdf", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, + "context": 1000000, "output": 131072 }, "temperature": true, @@ -24610,38 +24767,33 @@ "extra_capabilities": { "reasoning": { "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ - "minimal", - "low", - "medium", "high", - "xhigh" + "max" ] } }, - "attachment": true, - "open_weights": false, - "release_date": "2026-04-08", - "last_updated": "2026-07-09", + "attachment": false, + "open_weights": true, + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" - } - ] - }, - "daoxe": { - "id": "daoxe", - "name": "DaoXE", - "display_name": "DaoXE", - "api": "https://daoxe.com/v1", - "doc": "https://daoxe.com/pricing", - "models": [ + }, { - "id": "claude-haiku-4-5-20251001", - "name": "Claude Haiku 4.5", - "display_name": "Claude Haiku 4.5", + "id": "zai-org/glm-5.3-flash", + "name": "GLM-5.3-Flash", + "display_name": "GLM-5.3-Flash", "modalities": { "input": [ "text", "image", + "video", "pdf" ], "output": [ @@ -24649,60 +24801,61 @@ ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + "effort_options": [ + "high", + "max" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-02-28", - "release_date": "2025-10-15", - "last_updated": "2025-10-15", + "open_weights": true, + "release_date": "2026-08-26", + "last_updated": "2026-08-26", "type": "chat" - }, + } + ] + }, + "perplexity-agent": { + "id": "perplexity-agent", + "name": "Perplexity Agent", + "display_name": "Perplexity Agent", + "api": "https://api.perplexity.ai/v1", + "doc": "https://docs.perplexity.ai/docs/agent-api/models", + "models": [ { - "id": "grok-4.3", - "name": "Grok 4.3", - "display_name": "Grok 4.3", + "id": "xai/grok-4.6", + "name": "Grok 4.6", + "display_name": "Grok 4.6", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 30000 + "context": 500000, + "output": 500000 }, "temperature": true, "tool_call": true, @@ -24716,18 +24869,20 @@ "effort_options": [ "low", "medium", - "high" + "high", + "xhigh" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-04-17", - "last_updated": "2026-04-17", + "knowledge": "2026-02-01", + "release_date": "2026-08-12", + "last_updated": "2026-08-12", "type": "chat" }, { - "id": "grok-4.5", + "id": "xai/grok-4.5", "name": "Grok 4.5", "display_name": "Grok 4.5", "modalities": { @@ -24755,7 +24910,8 @@ "effort_options": [ "low", "medium", - "high" + "high", + "xhigh" ] } }, @@ -24766,59 +24922,38 @@ "type": "chat" }, { - "id": "gemini-3.1-pro-preview", - "name": "Gemini 3.1 Pro Preview", - "display_name": "Gemini 3.1 Pro Preview", + "id": "xai/grok-4-1-fast-non-reasoning", + "name": "Grok 4.1 Fast (Non-Reasoning)", + "display_name": "Grok 4.1 Fast (Non-Reasoning)", "modalities": { "input": [ "text", - "image", - "video", - "audio", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 2000000, + "output": 30000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "low", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] - } + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-02-19", - "last_updated": "2026-02-19", + "knowledge": "2025-07", + "release_date": "2025-11-19", + "last_updated": "2025-11-19", "type": "chat" }, { - "id": "gpt-5.4", - "name": "GPT-5.4", - "display_name": "GPT-5.4", + "id": "xai/grok-4.7", + "name": "Grok 4.7", + "display_name": "Grok 4.7", "modalities": { "input": [ "text", @@ -24830,53 +24965,39 @@ ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 500000, + "output": 500000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", "effort_options": [ - "none", "low", "medium", "high", "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-05", - "last_updated": "2026-03-05", + "knowledge": "2026-05", + "release_date": "2026-09-21", + "last_updated": "2026-09-21", "type": "chat" }, { - "id": "claude-sonnet-4-6", - "name": "Claude Sonnet 4.6", - "display_name": "Claude Sonnet 4.6", + "id": "deepseek/deepseek-v4-flash-0731", + "name": "DeepSeek V4 Flash 0731", + "display_name": "DeepSeek V4 Flash 0731", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" @@ -24884,66 +25005,48 @@ }, "limit": { "context": 1000000, - "output": 64000 + "output": 384000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", "effort_options": [ "low", - "medium", "high", "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-17", - "last_updated": "2026-03-13", + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-07-31", + "last_updated": "2026-07-31", "type": "chat" }, { - "id": "kimi-k2.5", - "name": "Kimi K2.5", - "display_name": "Kimi K2.5", + "id": "openai/gpt-5.6-terra", + "name": "GPT-5.6 Terra", + "display_name": "GPT-5.6 Terra", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1050000, + "output": 128000 }, "temperature": false, "tool_call": true, @@ -24954,35 +25057,41 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ], + "verbosity": "medium", + "verbosity_options": [ "low", "medium", "high" - ] + ], + "visibility": "hidden" } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-01-27", - "last_updated": "2026-01-27", + "open_weights": false, + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "gpt-5.5", - "name": "GPT-5.5", - "display_name": "GPT-5.5", + "id": "openai/gpt-5.4", + "name": "GPT-5.4", + "display_name": "GPT-5.4", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" @@ -24996,15 +25105,16 @@ "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, + "default_enabled": false, "mode": "effort", - "effort": "medium", + "effort": "none", "effort_options": [ + "none", "low", "medium", "high", @@ -25021,15 +25131,15 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2025-12-01", - "release_date": "2026-04-23", - "last_updated": "2026-04-23", + "knowledge": "2025-08-31", + "release_date": "2026-03-05", + "last_updated": "2026-03-05", "type": "chat" }, { - "id": "claude-opus-4-8", - "name": "Claude Opus 4.8", - "display_name": "Claude Opus 4.8", + "id": "openai/gpt-5.6-sol", + "name": "GPT-5.6 Sol", + "display_name": "GPT-5.6 Sol", "modalities": { "input": [ "text", @@ -25041,204 +25151,169 @@ ] }, "limit": { - "context": 1000000, + "context": 1050000, "output": 128000 }, "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, + "default_enabled": true, "mode": "effort", - "effort": "high", + "effort": "medium", "effort_options": [ + "none", "low", "medium", "high", "xhigh", "max" ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." - ] + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2026-01", - "release_date": "2026-05-28", - "last_updated": "2026-05-28", - "type": "chat" - } - ] - }, - "aimlapi": { - "id": "aimlapi", - "name": "AI/ML API", - "display_name": "AI/ML API", - "api": "https://api.aimlapi.com/v1", - "doc": "https://docs.aimlapi.com", - "models": [ - { - "id": "sao10k/l3-lunaris-8b", - "name": "Llama 3 8B Lunaris", - "display_name": "Llama 3 8B Lunaris", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 8192, - "output": 7372 - }, - "temperature": true, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": true, - "knowledge": "2023-12-31", - "release_date": "2024-08-13", - "last_updated": "2024-08-13", - "type": "chat" - }, - { - "id": "sao10k/l3.3-euryale-70b", - "name": "Llama 3.3 Euryale 70B", - "display_name": "Llama 3.3 Euryale 70B", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 131072, - "output": 16384 - }, - "temperature": true, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": true, - "knowledge": "2023-12-31", - "release_date": "2024-12-18", - "last_updated": "2024-12-18", + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "sao10k/l3.1-euryale-70b", - "name": "Llama 3.1 Euryale 70B v2.2", - "display_name": "Llama 3.1 Euryale 70B v2.2", + "id": "openai/gpt-5.6-luna", + "name": "GPT-5.6 Luna", + "display_name": "GPT-5.6 Luna", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 16384 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2023-12-31", - "release_date": "2024-08-28", - "last_updated": "2024-08-28", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "meta/muse-spark-1.3", - "name": "Muse Spark 1.3", - "display_name": "Muse Spark 1.3", + "id": "openai/gpt-5.1", + "name": "GPT-5.1", + "display_name": "GPT-5.1", "modalities": { "input": [ "text", - "image", - "video", - "pdf", - "audio" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", "effort_options": [ + "none", "low", "medium", "high" - ] + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "release_date": "2026-09-02", - "last_updated": "2026-09-02", + "knowledge": "2024-09-30", + "release_date": "2025-11-13", + "last_updated": "2025-11-13", "type": "chat" }, { - "id": "meta/muse-spark-1.2", - "name": "Muse Spark 1.2", - "display_name": "Muse Spark 1.2", + "id": "openai/gpt-6-luna", + "name": "GPT-6 Luna", + "display_name": "GPT-6 Luna", "modalities": { "input": [ "text", "image", - "video", - "pdf", - "audio" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -25246,46 +25321,40 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ "low", "medium", - "high" + "high", + "xhigh", + "max" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-08-05", - "last_updated": "2026-08-05", + "knowledge": "2026-05-18", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "meta/muse-spark-1.1", - "name": "Muse Spark 1.1", - "display_name": "Muse Spark 1.1", + "id": "openai/gpt-5-mini", + "name": "GPT-5 Mini", + "display_name": "GPT-5 Mini", "modalities": { "input": [ "text", - "image", - "pdf", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -25294,43 +25363,50 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ + "minimal", "low", "medium", "high" - ] + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "release_date": "2026-04-08", - "last_updated": "2026-07-09", + "knowledge": "2024-05-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "meta/muse-glimmer-30b", - "name": "Muse Glimmer 30B", - "display_name": "Muse Glimmer 30B", + "id": "openai/gpt-6-sol", + "name": "GPT-6 Sol", + "display_name": "GPT-6 Sol", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 131072 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -25338,112 +25414,172 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ "low", "medium", - "high" + "high", + "xhigh", + "max" ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2026-01-04", - "release_date": "2026-08-10", - "last_updated": "2026-08-10", + "open_weights": false, + "knowledge": "2026-04-20", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "relace/relace-search", - "name": "Search", - "display_name": "Search", + "id": "openai/gpt-6.1-sol", + "name": "GPT-6.1 Sol", + "display_name": "GPT-6.1 Sol", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 256000, + "context": 1050000, "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + }, + "attachment": true, "open_weights": false, - "release_date": "2025-12-08", - "last_updated": "2025-12-08", + "knowledge": "2026-04-30", + "release_date": "2026-09-29", + "last_updated": "2026-09-29", "type": "chat" }, { - "id": "relace/relace-apply-3", - "name": "Apply 3", - "display_name": "Apply 3", + "id": "openai/gpt-5.2", + "name": "GPT-5.2", + "display_name": "GPT-5.2", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 256000, + "context": 400000, "output": 128000 }, "temperature": false, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, "open_weights": false, - "release_date": "2025-09-26", - "last_updated": "2025-09-26", + "knowledge": "2025-08-31", + "release_date": "2025-12-11", + "last_updated": "2025-12-11", "type": "chat" }, { - "id": "ibm-granite/granite-4.0-h-micro", - "name": "Granite 4.0 Micro", - "display_name": "Granite 4.0 Micro", + "id": "openai/gpt-5.5", + "name": "GPT-5.5", + "display_name": "GPT-5.5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131000, - "output": 131000 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "release_date": "2025-10-02", - "last_updated": "2025-10-02", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-12-01", + "release_date": "2026-04-23", + "last_updated": "2026-04-23", "type": "chat" }, { - "id": "sakana/fugu-max", - "name": "Fugu Max", - "display_name": "Fugu Max", + "id": "openai/gpt-6-astra", + "name": "GPT-6 Astra", + "display_name": "GPT-6 Astra", "modalities": { "input": [ "text", @@ -25455,7 +25591,7 @@ ] }, "limit": { - "context": 1000000, + "context": 1050000, "output": 128000 }, "temperature": false, @@ -25466,25 +25602,30 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ - "high" + "low", + "medium", + "high", + "xhigh", + "max" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-09-11", - "last_updated": "2026-09-11", + "knowledge": "2026-04-30", + "release_date": "2026-09-04", + "last_updated": "2026-09-04", "type": "chat" }, { - "id": "sakana/fugu-ultra", - "name": "Fugu Ultra", - "display_name": "Fugu Ultra", + "id": "nvidia/nemotron-3-super-120b-a12b", + "name": "Nemotron 3 Super 120B", + "display_name": "Nemotron 3 Super 120B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" @@ -25492,9 +25633,9 @@ }, "limit": { "context": 1000000, - "output": 128000 + "output": 32000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -25503,33 +25644,38 @@ "extra_capabilities": { "reasoning": { "effort_options": [ - "high" + "low", + "medium", + "high", + "xhigh", + "max" ] } }, - "attachment": true, - "open_weights": false, - "release_date": "2026-06-15", - "last_updated": "2026-06-15", + "attachment": false, + "open_weights": true, + "knowledge": "2026-02", + "release_date": "2026-03-11", + "last_updated": "2026-03-11", "type": "chat" }, { - "id": "sakana/fugu-ultra-v2", - "name": "Fugu Ultra v2", - "display_name": "Fugu Ultra v2", + "id": "moonshot-ai/kimi-k2.7-code", + "name": "Kimi K2.7 Code", + "display_name": "Kimi K2.7 Code", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 262144, + "output": 262144 }, "temperature": false, "tool_call": true, @@ -25539,20 +25685,18 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "high" - ] + "supported": true } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-08-28", - "release_date": "2026-09-11", - "last_updated": "2026-09-11", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-06-12", + "last_updated": "2026-06-12", "type": "chat" }, { - "id": "moonshot/kimi-k3", + "id": "moonshot-ai/kimi-k3", "name": "Kimi K3", "display_name": "Kimi K3", "modalities": { @@ -25578,15 +25722,12 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ + "minimal", "low", + "medium", "high", + "xhigh", "max" ] } @@ -25598,13 +25739,12 @@ "type": "chat" }, { - "id": "google/gemma-3-27b-it", - "name": "Gemma 3 27B", - "display_name": "Gemma 3 27B", + "id": "perplexity/sonar", + "name": "Sonar", + "display_name": "Sonar", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" @@ -25612,39 +25752,35 @@ }, "limit": { "context": 128000, - "output": 117964 + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": true, - "open_weights": true, - "knowledge": "2024-08", - "release_date": "2025-03-12", - "last_updated": "2025-03-12", + "attachment": false, + "open_weights": false, + "knowledge": "2025-09-01", + "release_date": "2024-01-01", + "last_updated": "2025-09-01", "type": "chat" }, { - "id": "google/gemini-flash-latest", - "name": "Gemini Flash Latest", - "display_name": "Gemini Flash Latest", + "id": "perplexity/glm-5.3", + "name": "GLM-5.3", + "display_name": "GLM-5.3", "modalities": { "input": [ - "text", - "image", - "video", - "audio", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -25655,42 +25791,34 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ "low", - "medium", - "high" + "high", + "max" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-08-13", - "last_updated": "2026-08-13", + "attachment": false, + "open_weights": true, + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "google/gemma-4-31b-it", - "name": "Gemma 4 31B Instruct", - "display_name": "Gemma 4 31B Instruct", + "id": "perplexity/nemotron-3.5-super-120b-a12b", + "name": "Nemotron 3.5 Super 120B A12B", + "display_name": "Nemotron 3.5 Super 120B A12B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 16384 + "context": 1048576, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -25700,37 +25828,39 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "release_date": "2026-10-15", + "last_updated": "2026-10-15", "type": "chat" }, { - "id": "google/gemini-3.1-pro-preview", - "name": "Gemini 3.1 Pro Preview", - "display_name": "Gemini 3.1 Pro Preview", + "id": "perplexity/kimi-k3", + "name": "Kimi K3", + "display_name": "Kimi K3", "modalities": { "input": [ "text", - "image", - "video", - "audio", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 1048576, + "output": 131072 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -25739,75 +25869,77 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ + "effort_options": [ + "minimal", "low", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" + "medium", + "high", + "xhigh", + "max" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-02-19", - "last_updated": "2026-02-19", + "open_weights": true, + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" }, { - "id": "google/gemma-3-12b-it", - "name": "Gemma 3 12B", - "display_name": "Gemma 3 12B", + "id": "perplexity/glm-5.3-flash", + "name": "GLM-5.3-Flash", + "display_name": "GLM-5.3-Flash", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131000, - "output": 96000 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "low", + "high", + "max" + ] + } }, "attachment": true, "open_weights": true, - "knowledge": "2024-08", - "release_date": "2025-03-12", - "last_updated": "2025-03-12", + "release_date": "2026-08-26", + "last_updated": "2026-08-26", "type": "chat" }, { - "id": "google/gemini-3.8-flash", - "name": "Gemini 3.8 Flash", - "display_name": "Gemini 3.8 Flash", + "id": "perplexity/deepseek-v4-pro-0813", + "name": "DeepSeek V4 Pro 0813", + "display_name": "DeepSeek V4 Pro 0813", "modalities": { "input": [ - "text", - "image", - "video", - "audio", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 1000000, + "output": 384000 }, "temperature": true, "tool_call": true, @@ -25818,38 +25950,27 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", + "effort_options": [ "low", - "medium", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" + "high", + "max" ] } }, - "attachment": true, - "open_weights": false, - "release_date": "2026-09-02", - "last_updated": "2026-09-02", + "attachment": false, + "open_weights": true, + "release_date": "2026-08-13", + "last_updated": "2026-08-22", "type": "chat" }, { - "id": "google/gemini-3-8-flash", - "name": "Gemini 3.8 Flash", - "display_name": "Gemini 3.8 Flash", + "id": "anthropic/claude-sonnet-4-5", + "name": "Claude Sonnet 4.5", + "display_name": "Claude Sonnet 4.5", "modalities": { "input": [ "text", "image", - "video", - "audio", "pdf" ], "output": [ @@ -25857,40 +25978,51 @@ ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "low", - "medium", - "high" + "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-09-02", - "last_updated": "2026-09-02", + "knowledge": "2025-07-31", + "release_date": "2025-09-29", + "last_updated": "2025-09-29", "type": "chat" }, { - "id": "google/gemini-3.7-flash", - "name": "Gemini 3.7 Flash", - "display_name": "Gemini 3.7 Flash", + "id": "anthropic/claude-fable-5", + "name": "Claude Fable 5", + "display_name": "Claude Fable 5", "modalities": { "input": [ "text", "image", - "video", - "audio", "pdf" ], "output": [ @@ -25898,10 +26030,10 @@ ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -25911,38 +26043,43 @@ "reasoning": { "supported": true, "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", + "mode": "effort", + "effort": "high", + "effort_options": [ "low", "medium", - "high" + "high", + "xhigh", + "max" ], + "interleaved": true, "summaries": true, - "visibility": "summary", + "visibility": "omitted", "continuation": [ - "thought_signatures" + "thinking_blocks" + ], + "notes": [ + "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", + "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", + "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-08-13", - "last_updated": "2026-08-13", + "knowledge": "2026-01-31", + "release_date": "2026-06-09", + "last_updated": "2026-06-09", "type": "chat" }, { - "id": "google/gemini-3.6-flash", - "name": "Gemini 3.6 Flash", - "display_name": "Gemini 3.6 Flash", + "id": "anthropic/claude-haiku-4-5", + "name": "Claude Haiku 4.5", + "display_name": "Claude Haiku 4.5", "modalities": { "input": [ "text", "image", - "video", - "audio", "pdf" ], "output": [ @@ -25950,51 +26087,51 @@ ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", - "low", - "medium", - "high" - ], + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-07-21", - "last_updated": "2026-07-21", + "knowledge": "2025-02-28", + "release_date": "2025-10-15", + "last_updated": "2025-10-15", "type": "chat" }, { - "id": "google/gemini-3.1-flash-lite-preview", - "name": "Gemini 3.1 Flash Lite Preview", - "display_name": "Gemini 3.1 Flash Lite Preview", + "id": "anthropic/claude-sonnet-4-6", + "name": "Claude Sonnet 4.6", + "display_name": "Claude Sonnet 4.6", "modalities": { "input": [ "text", "image", - "video", - "audio", "pdf" ], "output": [ @@ -26002,76 +26139,115 @@ ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "max" + ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" ], - "effort_options": [ - "low", - "medium", - "high" + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-03-03", - "last_updated": "2026-03-03", + "knowledge": "2025-08-31", + "release_date": "2026-02-17", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "google/gemma-2-27b-it", - "name": "Gemma 2 27B", - "display_name": "Gemma 2 27B", + "id": "anthropic/claude-opus-4-7", + "name": "Claude Opus 4.7", + "display_name": "Claude Opus 4.7", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 8192, - "output": 2048 + "context": 1000000, + "output": 128000 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-06-30", - "release_date": "2024-07-13", - "last_updated": "2024-07-13", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2026-01-31", + "release_date": "2026-04-16", + "last_updated": "2026-04-16", "type": "chat" }, { - "id": "google/gemini-3.1-pro-preview-customtools", - "name": "Gemini 3.1 Pro Preview Custom Tools", - "display_name": "Gemini 3.1 Pro Preview Custom Tools", + "id": "anthropic/claude-fable-5-1", + "name": "Claude Fable 5.1", + "display_name": "Claude Fable 5.1", "modalities": { "input": [ "text", "image", - "video", - "audio", "pdf" ], "output": [ @@ -26079,10 +26255,10 @@ ] }, "limit": { - "context": 1048756, - "output": 65536 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -26092,45 +26268,54 @@ "reasoning": { "supported": true, "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ + "mode": "effort", + "effort": "high", + "effort_options": [ "low", - "high" + "medium", + "high", + "xhigh", + "max" ], "interleaved": true, "summaries": true, - "visibility": "summary", + "visibility": "omitted", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", + "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", + "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-02-19", - "last_updated": "2026-02-19", + "knowledge": "2026-06", + "release_date": "2026-09-01", + "last_updated": "2026-09-01", "type": "chat" }, { - "id": "google/gemma-4-26b-a4b-it", - "name": "Gemma 4 26B A4B IT", - "display_name": "Gemma 4 26B A4B IT", + "id": "anthropic/claude-opus-5-5", + "name": "Claude Opus 5.5", + "display_name": "Claude Opus 5.5", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, + "context": 1000000, "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -26138,64 +26323,100 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "open_weights": false, + "knowledge": "2026-06", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "google/gemma-3-4b-it", - "name": "Gemma 3 4B", - "display_name": "Gemma 3 4B", + "id": "anthropic/claude-opus-4-6", + "name": "Claude Opus 4.6", + "display_name": "Claude Opus 4.6", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131000, - "output": 32768 + "context": 200000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." + ] + } }, "attachment": true, - "open_weights": true, - "knowledge": "2024-08", - "release_date": "2025-03-12", - "last_updated": "2025-03-12", + "open_weights": false, + "knowledge": "2025-05-31", + "release_date": "2026-02-05", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "perceptron/perceptron-mk1.5", - "name": "Mk1.5", - "display_name": "Mk1.5", + "id": "anthropic/claude-opus-5", + "name": "Claude Opus 5", + "display_name": "Claude Opus 5", "modalities": { "input": [ "text", "image", - "video", - "audio" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 36864, - "output": 8192 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -26203,174 +26424,227 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ - "minimal", "low", "medium", - "high" + "high", + "xhigh", + "max" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-09-25", - "last_updated": "2026-09-25", + "knowledge": "2026-05", + "release_date": "2026-07-24", + "last_updated": "2026-07-24", "type": "chat" }, { - "id": "cohere/command-a", - "name": "Command A", - "display_name": "Command A", + "id": "anthropic/claude-opus-4-5", + "name": "Claude Opus 4.5", + "display_name": "Claude Opus 4.5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 256000 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-08-31", - "release_date": "2025-03-13", - "last_updated": "2025-03-13", - "type": "chat" - }, - { - "id": "cohere/command-r-plus-08-2024", - "name": "Command R+ (08-2024)", - "display_name": "Command R+ (08-2024)", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 128000, - "output": 4000 + "supported": true, + "default": false }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", + "effort_options": [ + "low", + "medium", + "high" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." + ] + } }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-06-01", - "release_date": "2024-08-30", - "last_updated": "2024-08-30", + "attachment": true, + "open_weights": false, + "knowledge": "2025-03-31", + "release_date": "2025-11-24", + "last_updated": "2025-11-24", "type": "chat" }, { - "id": "cohere/command-r-08-2024", - "name": "Command R (08-2024)", - "display_name": "Command R (08-2024)", + "id": "anthropic/claude-haiku-5-5", + "name": "Claude Haiku 5.5", + "display_name": "Claude Haiku 5.5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 4000 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-06-01", - "release_date": "2024-08-30", - "last_updated": "2024-08-30", + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2026-06", + "release_date": "2026-10-07", + "last_updated": "2026-10-07", "type": "chat" }, { - "id": "cohere/command-r7b-12-2024", - "name": "Command R7B (12-2024)", - "display_name": "Command R7B (12-2024)", + "id": "anthropic/claude-sonnet-5-5", + "name": "Claude Sonnet 5.5", + "display_name": "Claude Sonnet 5.5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 4000 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-06-01", - "release_date": "2024-12-13", - "last_updated": "2024-12-13", + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2026-06", + "release_date": "2026-09-28", + "last_updated": "2026-09-28", "type": "chat" }, { - "id": "moonshotai/kimi-k2-0905", - "name": "Kimi K2 0905", - "display_name": "Kimi K2 0905", + "id": "anthropic/claude-sonnet-5", + "name": "Claude Sonnet 5", + "display_name": "Claude Sonnet 5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 98304 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "release_date": "2025-09-05", - "last_updated": "2025-09-05", + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2026-01-31", + "release_date": "2026-06-30", + "last_updated": "2026-06-30", "type": "chat" }, { - "id": "moonshotai/kimi-k2-thinking", - "name": "Kimi K2 Thinking", - "display_name": "Kimi K2 Thinking", + "id": "google/gemini-3.1-pro-preview", + "name": "Gemini 3.1 Pro Preview", + "display_name": "Gemini 3.1 Pro Preview", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 98304 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -26381,178 +26655,186 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "low", + "high" + ], "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" + "thought_signatures" ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-08", - "release_date": "2025-11-06", - "last_updated": "2025-11-06", + "attachment": true, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2026-02-19", + "last_updated": "2026-02-19", "type": "chat" }, { - "id": "moonshotai/kimi-k2", - "name": "Kimi K2 0711", - "display_name": "Kimi K2 0711", + "id": "google/gemini-3-flash-preview", + "name": "Gemini 3 Flash Preview", + "display_name": "Gemini 3 Flash Preview", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 98304 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-12-31", - "release_date": "2025-07-11", - "last_updated": "2025-07-11", - "type": "chat" - }, - { - "id": "anthracite-org/magnum-v4-72b", - "name": "Magnum v4 72B", - "display_name": "Magnum v4 72B", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 32000, - "output": 16384 + "supported": true, + "default": true }, - "temperature": true, - "tool_call": false, - "reasoning": { - "supported": false + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", + "low", + "medium", + "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] + } }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-06-30", - "release_date": "2024-10-22", - "last_updated": "2024-10-22", + "attachment": true, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2025-12-17", + "last_updated": "2025-12-17", "type": "chat" }, { - "id": "thedrummer/unslopnemo-12b", - "name": "UnslopNemo 12B", - "display_name": "UnslopNemo 12B", + "id": "google/gemini-4-argon", + "name": "Gemini 4 Argon", + "display_name": "Gemini 4 Argon", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 32768, - "output": 32768 + "context": 1048576, + "output": 65536 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-04-30", - "release_date": "2024-11-08", - "last_updated": "2024-11-08", - "type": "chat" - }, - { - "id": "thedrummer/cydonia-24b-v4.1", - "name": "Cydonia 24B V4.1", - "display_name": "Cydonia 24B V4.1", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 131072, - "output": 131072 + "supported": true, + "default": true }, - "temperature": true, - "tool_call": false, - "reasoning": { - "supported": false + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "high" + ] + } }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-04-30", - "release_date": "2025-09-27", - "last_updated": "2025-09-27", + "attachment": true, + "open_weights": false, + "knowledge": "2026-03", + "release_date": "2026-10-13", + "last_updated": "2026-10-13", "type": "chat" }, { - "id": "thedrummer/skyfall-36b-v2", - "name": "Skyfall 36B V2", - "display_name": "Skyfall 36B V2", + "id": "google/gemini-3.7-flash", + "name": "Gemini 3.7 Flash", + "display_name": "Gemini 3.7 Flash", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 32768, - "output": 32768 + "context": 1048576, + "output": 65536 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-06-30", - "release_date": "2025-03-10", - "last_updated": "2025-03-10", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", + "low", + "medium", + "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2026-03", + "release_date": "2026-08-13", + "last_updated": "2026-08-13", "type": "chat" }, { - "id": "stepfun/step-5-preview", - "name": "Step 5 Preview", - "display_name": "Step 5 Preview", + "id": "google/gemini-3.8-flash", + "name": "Gemini 3.8 Flash", + "display_name": "Gemini 3.8 Flash", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 64000 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -26562,34 +26844,46 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", "low", "medium", "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-09-16", - "last_updated": "2026-09-20", + "open_weights": false, + "release_date": "2026-09-02", + "last_updated": "2026-09-02", "type": "chat" }, { - "id": "zhipu/glm-5.3", - "name": "GLM 5.3", - "display_name": "GLM 5.3", + "id": "google/gemini-3.6-flash", + "name": "Gemini 3.6 Flash", + "display_name": "Gemini 3.6 Flash", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1024000, - "output": 131072 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -26600,22 +26894,42 @@ "extra_capabilities": { "reasoning": { "supported": true, - "effort_options": [ + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", "low", + "medium", "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "attachment": true, + "open_weights": false, + "knowledge": "2026-03", + "release_date": "2026-07-21", + "last_updated": "2026-07-21", "type": "chat" - }, + } + ] + }, + "zai": { + "id": "zai", + "name": "Z.AI", + "display_name": "Z.AI", + "api": "https://api.z.ai/api/paas/v4", + "doc": "https://docs.z.ai/guides/overview/pricing", + "models": [ { - "id": "zhipu/glm-5.2", - "name": "GLM 5.2", - "display_name": "GLM 5.2", + "id": "glm-5.2", + "name": "GLM-5.2", + "display_name": "GLM-5.2", "modalities": { "input": [ "text" @@ -26637,8 +26951,15 @@ "extra_capabilities": { "reasoning": { "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ - "high" + "high", + "max" ] } }, @@ -26649,47 +26970,64 @@ "type": "chat" }, { - "id": "unbiased/pareto", - "name": "Pareto", - "display_name": "Pareto", + "id": "glm-5v-turbo", + "name": "GLM-5V-Turbo", + "display_name": "GLM-5V-Turbo", "modalities": { "input": [ "text", - "image" + "image", + "video", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, + "context": 200000, "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": true, "open_weights": false, - "release_date": "2026-09-17", - "last_updated": "2026-09-17", + "release_date": "2026-04-01", + "last_updated": "2026-04-01", "type": "chat" }, { - "id": "upstage/solar-pro4", - "name": "Solar Pro 4", - "display_name": "Solar Pro 4", + "id": "glm-5.3-flashx", + "name": "GLM-5.3-FlashX", + "display_name": "GLM-5.3-FlashX", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 524288, + "context": 1000000, "output": 131072 }, "temperature": true, @@ -26700,25 +27038,30 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ - "none", "low", - "medium", - "high" + "high", + "max" ] } }, - "attachment": false, - "open_weights": false, - "knowledge": "2026-02", - "release_date": "2026-08-06", - "last_updated": "2026-08-06", + "attachment": true, + "open_weights": true, + "release_date": "2026-09-18", + "last_updated": "2026-09-18", "type": "chat" }, { - "id": "upstage/solar-pro-3", - "name": "Solar Pro 3", - "display_name": "Solar Pro 3", + "id": "glm-5.3", + "name": "GLM-5.3", + "display_name": "GLM-5.3", "modalities": { "input": [ "text" @@ -26728,8 +27071,8 @@ ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -26739,24 +27082,30 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ "low", - "medium", - "high" + "high", + "max" ] } }, "attachment": false, - "open_weights": false, - "knowledge": "2025-07", - "release_date": "2026-01-26", - "last_updated": "2026-03-23", + "open_weights": true, + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "nousresearch/hermes-3-llama-3.1-70b", - "name": "Hermes 3 70B Instruct", - "display_name": "Hermes 3 70B Instruct", + "id": "glm-4.7-flashx", + "name": "GLM-4.7-FlashX", + "display_name": "GLM-4.7-FlashX", "modalities": { "input": [ "text" @@ -26766,25 +27115,37 @@ ] }, "limit": { - "context": 131072, - "output": 16384 + "context": 200000, + "output": 131072 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, "open_weights": true, - "knowledge": "2023-12-31", - "release_date": "2024-08-18", - "last_updated": "2024-08-18", + "knowledge": "2025-04", + "release_date": "2026-01-19", + "last_updated": "2026-01-19", "type": "chat" }, { - "id": "nousresearch/hermes-3-llama-3.1-405b", - "name": "Hermes 3 405B Instruct", - "display_name": "Hermes 3 405B Instruct", + "id": "glm-5-turbo", + "name": "GLM-5-Turbo", + "display_name": "GLM-5-Turbo", "modalities": { "input": [ "text" @@ -26794,59 +27155,80 @@ ] }, "limit": { - "context": 131072, - "output": 16384 + "context": 200000, + "output": 131072 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, - "open_weights": true, - "knowledge": "2023-12-31", - "release_date": "2024-08-16", - "last_updated": "2024-08-16", + "open_weights": false, + "release_date": "2026-03-16", + "last_updated": "2026-03-16", "type": "chat" }, { - "id": "x-ai/grok-4-20-0309-non-reasoning", - "name": "Grok 4.20 Non-Reasoning", - "display_name": "Grok 4.20 Non-Reasoning", + "id": "glm-4.5", + "name": "GLM-4.5", + "display_name": "GLM-4.5", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 2000000, - "output": 1999000 + "context": 131072, + "output": 98304 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, - "open_weights": false, - "release_date": "2026-03-09", - "last_updated": "2026-03-09", + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-07-28", + "last_updated": "2025-07-28", "type": "chat" }, { - "id": "x-ai/grok-4-fast-non-reasoning", - "name": "Grok 4 Fast Non-Reasoning", - "display_name": "Grok 4 Fast Non-Reasoning", + "id": "glm-4.6v", + "name": "GLM-4.6V", + "display_name": "GLM-4.6V", "modalities": { "input": [ "text", "image", - "audio", "video" ], "output": [ @@ -26854,24 +27236,37 @@ ] }, "limit": { - "context": 2000000, - "output": 1999000 + "context": 128000, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": true, - "open_weights": false, - "release_date": "2025-12-18", - "last_updated": "2025-12-18", + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-12-08", + "last_updated": "2025-12-08", "type": "chat" }, { - "id": "morph/morph-v3-large", - "name": "V3 Large", - "display_name": "V3 Large", + "id": "glm-4.7-flash", + "name": "GLM-4.7-Flash", + "display_name": "GLM-4.7-Flash", "modalities": { "input": [ "text" @@ -26881,63 +27276,47 @@ ] }, "limit": { - "context": 262144, + "context": 200000, "output": 131072 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": false, - "release_date": "2025-07-07", - "last_updated": "2025-07-07", - "type": "chat" - }, - { - "id": "morph/morph-v3-fast", - "name": "V3 Fast", - "display_name": "V3 Fast", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 81920, - "output": 38000 + "supported": true, + "default": true }, - "temperature": true, - "tool_call": false, - "reasoning": { - "supported": false + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, - "open_weights": false, - "release_date": "2025-07-07", - "last_updated": "2025-07-07", + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2026-01-19", + "last_updated": "2026-01-19", "type": "chat" }, { - "id": "alibaba/qwen3.8-27b", - "name": "Qwen3.8 27B", - "display_name": "Qwen3.8 27B", + "id": "glm-4.6", + "name": "GLM-4.6", + "display_name": "GLM-4.6", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, + "context": 204800, "output": 131072 }, "temperature": true, @@ -26954,23 +27333,20 @@ "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "effort_options": [ - "low", - "medium" ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "knowledge": "2025-04", + "release_date": "2025-09-30", + "last_updated": "2025-09-30", "type": "chat" }, { - "id": "alibaba/qwen3-next-80b-a3b-instruct", - "name": "Qwen3 Next 80B A3B Instruct", - "display_name": "Qwen3 Next 80B A3B Instruct", + "id": "glm-4.5-flash", + "name": "GLM-4.5-Flash", + "display_name": "GLM-4.5-Flash", "modalities": { "input": [ "text" @@ -26980,25 +27356,37 @@ ] }, "limit": { - "context": 129024, - "output": 16384 + "context": 131072, + "output": 98304 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, - "open_weights": true, + "open_weights": false, "knowledge": "2025-04", - "release_date": "2025-09", - "last_updated": "2025-09", + "release_date": "2025-07-28", + "last_updated": "2025-07-28", "type": "chat" }, { - "id": "alibaba/qwen-max", - "name": "Qwen Max", - "display_name": "Qwen Max", + "id": "glm-4.5-air", + "name": "GLM-4.5-Air", + "display_name": "GLM-4.5-Air", "modalities": { "input": [ "text" @@ -27008,39 +27396,50 @@ ] }, "limit": { - "context": 32000, - "output": 8192 + "context": 131072, + "output": 98304 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, - "open_weights": false, - "knowledge": "2024-04", - "release_date": "2024-04-03", - "last_updated": "2025-01-25", + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-07-28", + "last_updated": "2025-07-28", "type": "chat" }, { - "id": "alibaba/qwen3.8-max", - "name": "Qwen3.8 Max", - "display_name": "Qwen3.8 Max", + "id": "glm-4.5v", + "name": "GLM-4.5V", + "display_name": "GLM-4.5V", "modalities": { "input": [ "text", "image", - "video", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 64000, + "output": 16384 }, "temperature": true, "tool_call": true, @@ -27056,23 +27455,20 @@ "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "effort_options": [ - "low", - "medium" ] } }, "attachment": true, - "open_weights": false, - "release_date": "2026-08-03", - "last_updated": "2026-08-03", + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-08-11", + "last_updated": "2025-08-11", "type": "chat" }, { - "id": "alibaba/qwen3.8-max-prime", - "name": "Qwen3.8 Max Prime", - "display_name": "Qwen3.8 Max Prime", + "id": "glm-4.6v-flash", + "name": "GLM-4.6V-Flash", + "display_name": "GLM-4.6V-Flash", "modalities": { "input": [ "text", @@ -27084,8 +27480,8 @@ ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 128000, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -27095,53 +27491,25 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "minimal", - "low", - "medium", - "high", - "xhigh" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, "attachment": true, - "open_weights": false, - "release_date": "2026-09-23", - "last_updated": "2026-09-23", - "type": "chat" - }, - { - "id": "alibaba/qwen3-coder-480b-a35b-instruct", - "name": "Qwen3 Coder", - "display_name": "Qwen3 Coder", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 262000, - "output": 65536 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": false, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-07-22", - "last_updated": "2025-07-22", + "release_date": "2025-12-08", + "last_updated": "2025-12-08", "type": "chat" }, { - "id": "alibaba/qwen-plus", - "name": "Qwen Plus", - "display_name": "Qwen Plus", + "id": "glm-5", + "name": "GLM-5", + "display_name": "GLM-5", "modalities": { "input": [ "text" @@ -27151,8 +27519,8 @@ ] }, "limit": { - "context": 131000, - "output": 16384 + "context": 204800, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -27172,27 +27540,29 @@ } }, "attachment": false, - "open_weights": false, - "knowledge": "2024-04", - "release_date": "2024-01-25", - "last_updated": "2025-09-11", + "open_weights": true, + "release_date": "2026-02-12", + "last_updated": "2026-02-12", "type": "chat" }, { - "id": "alibaba/qwen3.8-2.4t-a95b", - "name": "Qwen3.8 2.4T A95B", - "display_name": "Qwen3.8 2.4T A95B", + "id": "glm-5.3-flash", + "name": "GLM-5.3-Flash", + "display_name": "GLM-5.3-Flash", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 52429 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -27211,32 +27581,31 @@ ], "effort_options": [ "low", - "medium" + "high", + "max" ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-08-12", - "last_updated": "2026-08-12", + "release_date": "2026-08-26", + "last_updated": "2026-08-26", "type": "chat" }, { - "id": "alibaba/qwen3.8-flash", - "name": "Qwen3.8 Flash", - "display_name": "Qwen3.8 Flash", + "id": "glm-4.7", + "name": "GLM-4.7", + "display_name": "GLM-4.7", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, + "context": 204800, "output": 131072 }, "temperature": true, @@ -27253,38 +27622,33 @@ "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "effort_options": [ - "low", - "medium" ] } }, - "attachment": true, - "open_weights": false, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-12-22", + "last_updated": "2025-12-22", "type": "chat" }, { - "id": "openai/gpt-5.6-luna-pro", - "name": "GPT-5.6 Luna Pro", - "display_name": "GPT-5.6 Luna Pro", + "id": "glm-5.1", + "name": "GLM-5.1", + "display_name": "GLM-5.1", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 200000, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -27298,26 +27662,57 @@ "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "effort_options": [ - "none", - "low", - "medium", - "high" ] } }, - "attachment": true, + "attachment": false, + "open_weights": true, + "release_date": "2026-04-07", + "last_updated": "2026-04-07", + "type": "chat" + } + ] + }, + "lucidquery": { + "id": "lucidquery", + "name": "LucidQuery", + "display_name": "LucidQuery", + "api": "https://api.lucidquery.com/v1", + "doc": "https://lucidquery.com/docs", + "models": [ + { + "id": "lucidnova-rf1-100b", + "name": "LucidNova RF1 100B", + "display_name": "LucidNova RF1 100B", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 120000, + "output": 8000 + }, + "temperature": false, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "attachment": false, "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "knowledge": "2025-09-16", + "release_date": "2024-12-28", + "last_updated": "2025-09-10", "type": "chat" }, { - "id": "openai/gpt-5.4-mini", - "name": "GPT-5.4 Mini", - "display_name": "GPT-5.4 Mini", + "id": "lucidquery-agi-01-frontier", + "name": "AGI-01 Frontier", + "display_name": "AGI-01 Frontier", "modalities": { "input": [ "text", @@ -27328,48 +27723,26 @@ ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 300000, + "output": 120000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "default": true }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-17", - "last_updated": "2026-03-17", + "knowledge": "2026-06-05", + "release_date": "2026-06-16", + "last_updated": "2026-06-16", "type": "chat" }, { - "id": "openai/gpt-5-2", - "name": "GPT-5.2", - "display_name": "GPT-5.2", + "id": "lucidquery-agi-01-swift", + "name": "AGI-01 Swift", + "display_name": "AGI-01 Swift", "modalities": { "input": [ "text", @@ -27380,61 +27753,37 @@ ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 300000, + "output": 120000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "default": true }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2025-12-11", - "last_updated": "2025-12-11", + "knowledge": "2026-06-05", + "release_date": "2026-06-16", + "last_updated": "2026-06-16", "type": "chat" }, { - "id": "openai/gpt-5.6-sol", - "name": "GPT-5.6 Sol", - "display_name": "GPT-5.6 Sol", + "id": "lucidquery-nexus-coder", + "name": "LucidQuery Nexus Coder", + "display_name": "LucidQuery Nexus Coder", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 250000, + "output": 60000 }, "temperature": false, "tool_call": true, @@ -27442,55 +27791,40 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } - }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "knowledge": "2025-08-01", + "release_date": "2025-09-01", + "last_updated": "2025-09-01", "type": "chat" - }, + } + ] + }, + "fireworks-ai": { + "id": "fireworks-ai", + "name": "Fireworks AI", + "display_name": "Fireworks AI", + "api": "https://api.fireworks.ai/inference/v1/", + "doc": "https://fireworks.ai/docs/", + "models": [ { - "id": "openai/gpt-5.5-pro", - "name": "GPT-5.5 Pro", - "display_name": "GPT-5.5 Pro", + "id": "accounts/fireworks/models/deepseek-v4p1-flash", + "name": "DeepSeek V4.1 Flash", + "display_name": "DeepSeek V4.1 Flash", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1000000, + "output": 384000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -27506,22 +27840,23 @@ "thinking_blocks" ], "effort_options": [ - "medium", - "high" + "low", + "high", + "max" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-12-01", - "release_date": "2026-04-23", - "last_updated": "2026-04-23", + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-09-10", + "last_updated": "2026-09-10", "type": "chat" }, { - "id": "openai/gpt-5-nano", - "name": "GPT-5 Nano", - "display_name": "GPT-5 Nano", + "id": "accounts/fireworks/models/ember-1", + "name": "Ember-1", + "display_name": "Ember-1", "modalities": { "input": [ "text", @@ -27532,10 +27867,10 @@ ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 1048576, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -27544,81 +27879,42 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "minimal", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "effort_options": [ + "low", + "medium", + "high", + "max" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2024-05-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "openai/gpt-4o", - "name": "GPT-4o", - "display_name": "GPT-4o", + "id": "accounts/fireworks/models/deepseek-v4p1-flash-1017", + "name": "DeepSeek V4.1 Flash 1017", + "display_name": "DeepSeek V4.1 Flash 1017", "modalities": { "input": [ "text", - "image", - "pdf" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 128000, - "output": 16384 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": false, - "knowledge": "2023-09", - "release_date": "2024-05-13", - "last_updated": "2024-08-06", - "type": "chat" - }, - { - "id": "openai/gpt-oss-safeguard-20b", - "name": "gpt-oss-safeguard-20b", - "display_name": "gpt-oss-safeguard-20b", - "modalities": { - "input": [ - "text" + "image" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 65536 + "context": 1000000, + "output": 384000 }, "temperature": true, "tool_call": true, @@ -27628,23 +27924,31 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ "low", - "medium", - "high" + "high", + "max" ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2025-10-29", - "last_updated": "2025-10-29", + "knowledge": "2025-05", + "release_date": "2026-10-17", + "last_updated": "2026-10-17", "type": "chat" }, { - "id": "openai/gpt-5.2-pro", - "name": "GPT-5.2 Pro", - "display_name": "GPT-5.2 Pro", + "id": "accounts/fireworks/models/glm-5p3-flash", + "name": "GLM 5.3 Flash", + "display_name": "GLM 5.3 Flash", "modalities": { "input": [ "text", @@ -27655,10 +27959,10 @@ ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 1048573, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -27667,39 +27971,29 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "effort_options": [ + "low", + "high", + "max" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2025-12-11", - "last_updated": "2025-12-11", + "open_weights": true, + "release_date": "2026-08-26", + "last_updated": "2026-08-26", "type": "chat" }, { - "id": "openai/gpt-5.4-nano", - "name": "GPT-5.4 Nano", - "display_name": "GPT-5.4 Nano", + "id": "accounts/fireworks/models/qwen3p8-max", + "name": "Qwen3.8 Max", + "display_name": "Qwen3.8 Max", "modalities": { "input": [ "text", @@ -27710,100 +28004,82 @@ ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 262144, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", "effort_options": [ "none", "low", "medium", - "high", "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-17", - "last_updated": "2026-03-17", + "release_date": "2026-08-03", + "last_updated": "2026-08-03", "type": "chat" }, { - "id": "openai/gpt-5.4-image-2", - "name": "GPT-5.4 Image 2", - "display_name": "GPT-5.4 Image 2", + "id": "accounts/fireworks/models/minimax-m3p1-flash", + "name": "MiniMax-M3.1-Flash", + "display_name": "MiniMax-M3.1-Flash", "modalities": { "input": [ - "image", "text", - "pdf" + "image" ], "output": [ - "image", "text" ] }, "limit": { - "context": 272000, - "output": 128000 + "context": 1000000, + "output": 512000 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ - "none", "low", "medium", "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "xhigh", + "max" + ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-04-21", - "last_updated": "2026-04-21" + "release_date": "2026-10-19", + "last_updated": "2026-10-19", + "type": "chat" }, { - "id": "openai/gpt-3.5-turbo", - "name": "GPT-3.5 Turbo", - "display_name": "GPT-3.5 Turbo", + "id": "accounts/fireworks/models/glm-5p3", + "name": "GLM 5.3", + "display_name": "GLM 5.3", "modalities": { "input": [ "text" @@ -27813,40 +28089,10 @@ ] }, "limit": { - "context": 16000, - "output": 4096 + "context": 1048573, + "output": 262144 }, "temperature": true, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": false, - "knowledge": "2021-09-01", - "release_date": "2023-03-01", - "last_updated": "2023-11-06", - "type": "chat" - }, - { - "id": "openai/gpt-5.6-luna", - "name": "GPT-5.6 Luna", - "display_name": "GPT-5.6 Luna", - "modalities": { - "input": [ - "text", - "image", - "pdf" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 1050000, - "output": 128000 - }, - "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -27855,37 +28101,29 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ - "none", "low", - "medium", "high", - "xhigh", "max" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "attachment": false, + "open_weights": true, + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "openai/gpt-5.1-codex-max", - "name": "GPT-5.1-Codex-Max", - "display_name": "GPT-5.1-Codex-Max", + "id": "accounts/fireworks/models/muse-spark-open", + "name": "Muse Spark Open", + "display_name": "Muse Spark Open", "modalities": { "input": [ "text", @@ -27896,67 +28134,49 @@ ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 1048576, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", "effort_options": [ - "none", "low", "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "high", + "xhigh" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-11-13", - "last_updated": "2025-11-13", + "open_weights": true, + "knowledge": "2026-01-04", + "release_date": "2026-10-15", + "last_updated": "2026-10-15", "type": "chat" }, { - "id": "openai/gpt-5-5", - "name": "GPT-5.5", - "display_name": "GPT-5.5", + "id": "accounts/fireworks/models/gpt-oss-120b", + "name": "GPT OSS 120B", + "display_name": "GPT OSS 120B", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 131072, + "output": 32768 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -27965,146 +28185,95 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ "low", "medium", "high" - ], - "visibility": "hidden" + ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-12-01", - "release_date": "2026-04-23", - "last_updated": "2026-04-23", + "attachment": false, + "open_weights": true, + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "openai/o3-mini", - "name": "o3 Mini", - "display_name": "o3 Mini", + "id": "accounts/fireworks/models/inkling", + "name": "Inkling", + "display_name": "Inkling", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 1048576, + "output": 1048576 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } - }, - "attachment": false, - "open_weights": false, - "knowledge": "2024-05", - "release_date": "2024-12-20", - "last_updated": "2025-01-29", + "attachment": true, + "open_weights": true, + "release_date": "2026-07-15", + "last_updated": "2026-07-15", "type": "chat" }, { - "id": "openai/gpt-5.6-terra", - "name": "GPT-5.6 Terra", - "display_name": "GPT-5.6 Terra", + "id": "accounts/fireworks/models/nemotron-3-ultra-nvfp4", + "name": "Nemotron 3 Ultra 550B A55B", + "display_name": "Nemotron 3 Ultra 550B A55B", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, + "context": 262144, "output": 128000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } - }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "attachment": false, + "open_weights": true, + "knowledge": "2025-09", + "release_date": "2026-06-04", + "last_updated": "2026-06-04", "type": "chat" }, { - "id": "openai/o1-pro", - "name": "o1-pro", - "display_name": "o1-pro", + "id": "accounts/fireworks/models/minimax-m3", + "name": "MiniMax-M3", + "display_name": "MiniMax-M3", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 512000, + "output": 512000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -28113,76 +28282,71 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high" - ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "effort_options": [ + "low", + "medium", + "high" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2023-09", - "release_date": "2025-03-19", - "last_updated": "2025-03-19", + "attachment": false, + "open_weights": true, + "release_date": "2026-06-01", + "last_updated": "2026-06-01", "type": "chat" }, { - "id": "openai/gpt-4o-2024-05-13", - "name": "GPT-4o", - "display_name": "GPT-4o", + "id": "accounts/fireworks/models/nemotron-lightning-3p5-30b-a3b", + "name": "Nemotron 3.5 Lightning 30B A3B", + "display_name": "Nemotron 3.5 Lightning 30B A3B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, - "open_weights": false, - "knowledge": "2023-09", - "release_date": "2024-05-13", - "last_updated": "2024-05-13", + "attachment": false, + "open_weights": true, + "knowledge": "2025-09", + "release_date": "2026-08-11", + "last_updated": "2026-08-11", "type": "chat" }, { - "id": "openai/gpt-5-pro", - "name": "GPT-5 Pro", - "display_name": "GPT-5 Pro", + "id": "accounts/fireworks/models/qwen3p8-2p4t-a95b", + "name": "Qwen3.8 2.4T A95B", + "display_name": "Qwen3.8 2.4T A95B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 272000 + "context": 262144, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -28191,47 +28355,42 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "fixed", - "effort": "high", - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "effort_options": [ + "none", + "low", + "medium", + "xhigh" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-10-06", - "last_updated": "2025-10-06", + "attachment": false, + "open_weights": true, + "release_date": "2026-08-12", + "last_updated": "2026-08-12", "type": "chat" }, { - "id": "openai/gpt-6-sol", - "name": "GPT-6 Sol", - "display_name": "GPT-6 Sol", + "id": "accounts/fireworks/models/kimi-k3", + "name": "Kimi K3", + "display_name": "Kimi K3", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1048576, + "output": 131072 }, "temperature": false, "tool_call": true, @@ -28241,40 +28400,44 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ - "none", "low", "medium", - "high" + "high", + "max" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-04-20", - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "open_weights": true, + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" }, { - "id": "openai/gpt-5.6-sol-pro", - "name": "GPT-5.6 Sol Pro", - "display_name": "GPT-5.6 Sol Pro", + "id": "accounts/fireworks/routers/glm-5p3-fast", + "name": "GLM 5.3 Fast", + "display_name": "GLM 5.3 Fast", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1048572, + "output": 262144 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -28290,39 +28453,36 @@ "thinking_blocks" ], "effort_options": [ - "none", "low", - "medium", - "high" + "high", + "max" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "attachment": false, + "open_weights": true, + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "openai/gpt-5.3-codex", - "name": "GPT-5.3 Codex", - "display_name": "GPT-5.3 Codex", + "id": "accounts/fireworks/routers/kimi-fast-latest", + "name": "Kimi Fast Latest", + "display_name": "Kimi Fast Latest", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 1048576, + "output": 131072 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -28331,53 +28491,42 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "effort_options": [ + "low", + "medium", + "high", + "max" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-05", - "last_updated": "2026-02-05", + "open_weights": true, + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" }, { - "id": "openai/gpt-6.1-sol", - "name": "GPT-6.1 Sol", - "display_name": "GPT-6.1 Sol", + "id": "accounts/fireworks/routers/kimi-k3-spot", + "name": "Kimi K3 Spot", + "display_name": "Kimi K3 Spot", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1048576, + "output": 131072 }, "temperature": false, "tool_call": true, @@ -28387,24 +28536,31 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ "low", "medium", - "high" + "high", + "max" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-04-30", - "release_date": "2026-09-29", - "last_updated": "2026-09-29", + "open_weights": true, + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" }, { - "id": "openai/gpt-4o-2024-11-20", - "name": "GPT-4o", - "display_name": "GPT-4o", + "id": "accounts/fireworks/routers/glm-flash-latest", + "name": "GLM Flash Latest (GLM 5.3 Flash)", + "display_name": "GLM Flash Latest (GLM 5.3 Flash)", "modalities": { "input": [ "text", @@ -28415,39 +28571,54 @@ ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 1048573, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "low", + "high", + "max" + ] + } }, "attachment": true, - "open_weights": false, - "knowledge": "2023-09", - "release_date": "2024-11-20", - "last_updated": "2024-11-20", + "open_weights": true, + "release_date": "2026-08-26", + "last_updated": "2026-08-26", "type": "chat" }, { - "id": "openai/o3-pro", - "name": "o3 Pro", - "display_name": "o3 Pro", + "id": "accounts/fireworks/routers/glm-fast-latest", + "name": "GLM 5.3 Fast (Latest)", + "display_name": "GLM 5.3 Fast (Latest)", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 1048572, + "output": 262144 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -28456,46 +28627,41 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high" - ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "effort_options": [ + "low", + "high", + "max" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-05", - "release_date": "2025-06-10", - "last_updated": "2025-06-10", + "attachment": false, + "open_weights": true, + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "openai/gpt-5.6-terra-pro", - "name": "GPT-5.6 Terra Pro", - "display_name": "GPT-5.6 Terra Pro", + "id": "accounts/fireworks/routers/kimi-k3-fast", + "name": "Kimi K3 Fast", + "display_name": "Kimi K3 Fast", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1048576, + "output": 131072 }, "temperature": false, "tool_call": true, @@ -28513,24 +28679,23 @@ "thinking_blocks" ], "effort_options": [ - "none", "low", "medium", - "high" + "high", + "max" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "open_weights": true, + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" }, { - "id": "openai/gpt-4o-2024-08-06", - "name": "GPT-4o", - "display_name": "GPT-4o", + "id": "accounts/fireworks/routers/deepseek-flash-latest", + "name": "DeepSeek Flash Latest", + "display_name": "DeepSeek Flash Latest", "modalities": { "input": [ "text", @@ -28541,30 +28706,46 @@ ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 1000000, + "output": 384000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "low", + "high", + "max" + ] + } }, "attachment": true, - "open_weights": false, - "knowledge": "2023-09", - "release_date": "2024-08-06", - "last_updated": "2024-08-06", + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-10-17", + "last_updated": "2026-10-17", "type": "chat" }, { - "id": "openai/gpt-4.1-mini", - "name": "GPT-4.1 Mini", - "display_name": "GPT-4.1 Mini", + "id": "accounts/fireworks/routers/deepseek-v4p1-flash-1017-spot", + "name": "DeepSeek V4.1 Flash 1017 Spot", + "display_name": "DeepSeek V4.1 Flash 1017 Spot", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" @@ -28572,39 +28753,54 @@ }, "limit": { "context": 1000000, - "output": 32768 + "output": 384000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "low", + "high", + "max" + ] + } }, "attachment": true, - "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-04-14", - "last_updated": "2025-04-14", + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-10-17", + "last_updated": "2026-10-17", "type": "chat" }, { - "id": "openai/gpt-6-astra", - "name": "GPT-6 Astra", - "display_name": "GPT-6 Astra", + "id": "accounts/fireworks/routers/minimax-latest", + "name": "MiniMax Latest", + "display_name": "MiniMax Latest", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 512000, + "output": 512000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -28613,26 +28809,29 @@ "extra_capabilities": { "reasoning": { "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ "low", "medium", - "high", - "xhigh", - "max" + "high" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-04-30", - "release_date": "2026-09-04", - "last_updated": "2026-09-04", + "attachment": false, + "open_weights": true, + "release_date": "2026-06-01", + "last_updated": "2026-06-01", "type": "chat" }, { - "id": "openai/gpt-oss-120b", - "name": "GPT OSS 120B", - "display_name": "GPT OSS 120B", + "id": "accounts/fireworks/routers/glm-5p3-spot", + "name": "GLM 5.3 Spot", + "display_name": "GLM 5.3 Spot", "modalities": { "input": [ "text" @@ -28642,8 +28841,8 @@ ] }, "limit": { - "context": 131000, - "output": 117964 + "context": 1048573, + "output": 262144 }, "temperature": true, "tool_call": true, @@ -28662,52 +28861,60 @@ ], "effort_options": [ "low", - "medium", - "high" + "high", + "max" ] } }, "attachment": false, "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "openai/gpt-4o-mini", - "name": "GPT-4o Mini", - "display_name": "GPT-4o Mini", + "id": "accounts/fireworks/routers/qwen-max-latest", + "name": "Qwen Max Latest (Qwen3.8 Max)", + "display_name": "Qwen Max Latest (Qwen3.8 Max)", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 262144, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "low", + "medium", + "xhigh" + ] + } }, "attachment": true, "open_weights": false, - "knowledge": "2023-09", - "release_date": "2024-07-18", - "last_updated": "2024-07-18", + "release_date": "2026-08-03", + "last_updated": "2026-08-03", "type": "chat" }, { - "id": "openai/gpt-5-mini", - "name": "GPT-5 Mini", - "display_name": "GPT-5 Mini", + "id": "accounts/fireworks/routers/deepseek-v4p1-flash-spot", + "name": "DeepSeek V4.1 Flash Spot", + "display_name": "DeepSeek V4.1 Flash Spot", "modalities": { "input": [ "text", @@ -28718,10 +28925,10 @@ ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 1000000, + "output": 384000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -28730,40 +28937,30 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "minimal", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "effort_options": [ + "low", + "high", + "max" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2024-05-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-09-10", + "last_updated": "2026-09-10", "type": "chat" }, { - "id": "openai/gpt-oss-20b", - "name": "GPT OSS 20B", - "display_name": "GPT OSS 20B", + "id": "accounts/fireworks/routers/glm-latest", + "name": "GLM Latest", + "display_name": "GLM Latest", "modalities": { "input": [ "text" @@ -28773,8 +28970,8 @@ ] }, "limit": { - "context": 131000, - "output": 117964 + "context": 1048573, + "output": 262144 }, "temperature": true, "tool_call": true, @@ -28793,22 +28990,21 @@ ], "effort_options": [ "low", - "medium", - "high" + "high", + "max" ] } }, "attachment": false, "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "openai/gpt-5", - "name": "GPT-5", - "display_name": "GPT-5", + "id": "accounts/fireworks/routers/kimi-latest", + "name": "Kimi Latest", + "display_name": "Kimi Latest", "modalities": { "input": [ "text", @@ -28819,8 +29015,8 @@ ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 1048576, + "output": 131072 }, "temperature": false, "tool_call": true, @@ -28831,209 +29027,164 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "minimal", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "effort_options": [ + "low", + "medium", + "high", + "max" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "open_weights": true, + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" - }, + } + ] + }, + "neosmith": { + "id": "neosmith", + "name": "NeoSmith", + "display_name": "NeoSmith", + "api": "https://router.neosmith.ai/v1", + "doc": "https://neosmith.ai/docs", + "models": [ { - "id": "openai/gpt-6-luna", - "name": "GPT-6 Luna", - "display_name": "GPT-6 Luna", + "id": "neosmith.neolite", + "name": "NeoSmith NeoLite", + "display_name": "NeoSmith NeoLite", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 512000, + "output": 64000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "high" - ] - } - }, "attachment": true, "open_weights": false, - "knowledge": "2026-05-18", - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "release_date": "2026-06-20", + "last_updated": "2026-08-03", "type": "chat" }, { - "id": "openai/gpt-4.1", - "name": "GPT-4.1", - "display_name": "GPT-4.1", + "id": "neosmith.intelligent-pro", + "name": "NeoSmith Pro", + "display_name": "NeoSmith Pro", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1047576, - "output": 32768 + "context": 1000000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": true, "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-04-14", - "last_updated": "2025-04-14", + "release_date": "2026-04-26", + "last_updated": "2026-07-18", "type": "chat" }, { - "id": "openai/o1", - "name": "o1", - "display_name": "o1", + "id": "neosmith.intelligent-basic", + "name": "NeoSmith Basic", + "display_name": "NeoSmith Basic", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 100000 + "context": 1000000, + "output": 128000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } - }, "attachment": true, "open_weights": false, - "knowledge": "2023-09", - "release_date": "2024-12-05", - "last_updated": "2024-12-05", + "release_date": "2026-04-26", + "last_updated": "2026-08-03", "type": "chat" }, { - "id": "openai/gpt-5-4", - "name": "GPT-5.4", - "display_name": "GPT-5.4", + "id": "neosmith.intelligent-maestro", + "name": "NeoSmith Maestro", + "display_name": "NeoSmith Maestro", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1050000, + "context": 1000000, "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "default": true }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-05", - "last_updated": "2026-03-05", + "release_date": "2026-08-03", + "last_updated": "2026-08-08", "type": "chat" - }, + } + ] + }, + "empiriolabs": { + "id": "empiriolabs", + "name": "EmpirioLabs AI", + "display_name": "EmpirioLabs AI", + "api": "https://api.empiriolabs.ai/v1", + "doc": "https://docs.empiriolabs.ai", + "models": [ { - "id": "openai/gpt-5-1", - "name": "GPT-5.1", - "display_name": "GPT-5.1", + "id": "muse-glimmer-30b", + "name": "Muse Glimmer 30B", + "display_name": "Muse Glimmer 30B", "modalities": { "input": [ "text", @@ -29044,76 +29195,79 @@ ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 131072, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", "effort_options": [ "none", "low", "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "high", + "max" + ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-11-13", - "last_updated": "2025-11-13", + "open_weights": true, + "knowledge": "2026-01-04", + "release_date": "2026-08-10", + "last_updated": "2026-08-10", "type": "chat" }, { - "id": "openai/gpt-4.1-nano", - "name": "GPT-4.1 Nano", - "display_name": "GPT-4.1 Nano", + "id": "muse-spark-1-1", + "name": "Muse Spark 1.1", + "display_name": "Muse Spark 1.1", "modalities": { "input": [ "text", - "image" + "image", + "video", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 32768 + "context": 1048576, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] + } }, "attachment": true, "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-04-14", - "last_updated": "2025-04-14", + "release_date": "2026-04-08", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "openai/gpt-4", - "name": "GPT-4", - "display_name": "GPT-4", + "id": "deepseek-v4-flash-0731", + "name": "DeepSeek V4 Flash 0731", + "display_name": "DeepSeek V4 Flash 0731", "modalities": { "input": [ "text" @@ -29123,54 +29277,79 @@ ] }, "limit": { - "context": 8000, - "output": 8192 + "context": 1000000, + "output": 393216 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "none", + "low", + "medium", + "high", + "max" + ] + } }, "attachment": false, - "open_weights": false, - "knowledge": "2023-11", - "release_date": "2023-11-06", - "last_updated": "2024-04-09", + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-07-31", + "last_updated": "2026-07-31", "type": "chat" }, { - "id": "openai/gpt-4-turbo", - "name": "GPT-4 Turbo", - "display_name": "GPT-4 Turbo", + "id": "qwen3-7-flash", + "name": "Qwen3.7 Flash", + "display_name": "Qwen3.7 Flash", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 1000000, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "low", + "medium", + "high", + "max" + ] + } }, "attachment": true, "open_weights": false, - "knowledge": "2023-12", - "release_date": "2023-11-06", - "last_updated": "2024-04-09", + "release_date": "2026-07-15", + "last_updated": "2026-07-15", "type": "chat" }, { - "id": "openai/gpt-5.4-pro", - "name": "GPT-5.4 Pro", - "display_name": "GPT-5.4 Pro", + "id": "fugu-ultra-v1-0", + "name": "Fugu Ultra v1.0", + "display_name": "Fugu Ultra v1.0", "modalities": { "input": [ "text", @@ -29181,8 +29360,8 @@ ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1000000, + "output": 131072 }, "temperature": false, "tool_call": true, @@ -29192,68 +29371,65 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", "effort_options": [ - "medium", "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "xhigh", + "max" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-05", - "last_updated": "2026-03-05", + "release_date": "2026-06-15", + "last_updated": "2026-06-15", "type": "chat" }, { - "id": "aion-labs/aion-rp-llama-3.1-8b", - "name": "Aion-RP 1.0 (8B)", - "display_name": "Aion-RP 1.0 (8B)", + "id": "muse-spark-1-2", + "name": "Muse Spark 1.2", + "display_name": "Muse Spark 1.2", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 32768, - "output": 32768 + "context": 1048576, + "output": 131072 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2023-12-31", - "release_date": "2025-02-04", - "last_updated": "2025-02-04", + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] + } + }, + "attachment": true, + "open_weights": false, + "release_date": "2026-08-05", + "last_updated": "2026-08-05", "type": "chat" }, { - "id": "undi95/remm-slerp-l2-13b", - "name": "ReMM SLERP 13B", - "display_name": "ReMM SLERP 13B", + "id": "glm-4-7-flashx", + "name": "GLM 4.7 FlashX", + "display_name": "GLM 4.7 FlashX", "modalities": { "input": [ "text" @@ -29263,25 +29439,26 @@ ] }, "limit": { - "context": 6144, - "output": 4096 + "context": 200000, + "output": 131072 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": false, "open_weights": true, - "knowledge": "2023-06-30", - "release_date": "2023-07-22", - "last_updated": "2023-07-22", + "knowledge": "2025-04", + "release_date": "2026-01-19", + "last_updated": "2026-01-19", "type": "chat" }, { - "id": "tencent/hy3", - "name": "Hy3", - "display_name": "Hy3", + "id": "glm-4-5-flash", + "name": "GLM 4.5 Flash", + "display_name": "GLM 4.5 Flash", "modalities": { "input": [ "text" @@ -29291,8 +29468,8 @@ ] }, "limit": { - "context": 262144, - "output": 131072 + "context": 200000, + "output": 98304 }, "temperature": true, "tool_call": true, @@ -29300,31 +29477,17 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "low", - "high" - ] - } - }, "attachment": false, - "open_weights": true, - "release_date": "2026-07-06", - "last_updated": "2026-07-06", + "open_weights": false, + "knowledge": "2025-04", + "release_date": "2025-07-28", + "last_updated": "2025-07-28", "type": "chat" }, { - "id": "tencent/hy4-preview", - "name": "Hy4 preview", - "display_name": "Hy4 preview", + "id": "qwen3-7-max", + "name": "Qwen3.7 Max", + "display_name": "Qwen3.7 Max", "modalities": { "input": [ "text" @@ -29334,8 +29497,8 @@ ] }, "limit": { - "context": 1048576, - "output": 64000 + "context": 1000000, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -29345,83 +29508,56 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ + "none", "low", - "high" + "medium", + "high", + "max" ] } }, "attachment": false, - "open_weights": true, - "release_date": "2026-08-28", - "last_updated": "2026-08-28", - "type": "chat" - }, - { - "id": "tencent/hy-mt2-7b", - "name": "Hy-MT2-7B", - "display_name": "Hy-MT2-7B", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 8192, - "output": 4096 - }, - "temperature": true, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": true, + "open_weights": false, "release_date": "2026-05-21", "last_updated": "2026-05-21", "type": "chat" }, { - "id": "tencent/hy-mt2-30b-a3b", - "name": "Hy-MT2-30B-A3B", - "display_name": "Hy-MT2-30B-A3B", + "id": "mimo-v2-6-pro", + "name": "MiMo V2.6 Pro", + "display_name": "MiMo V2.6 Pro", "modalities": { "input": [ - "text" + "text", + "image", + "audio", + "video" ], "output": [ "text" ] }, "limit": { - "context": 8192, - "output": 4096 + "context": 1000000, + "output": 131072 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-05-21", - "last_updated": "2026-05-21", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "tencent/hy-mt2-1.8b", - "name": "Hy-MT2-1.8B", - "display_name": "Hy-MT2-1.8B", + "id": "glm-4-7-flash", + "name": "GLM 4.7 Flash", + "display_name": "GLM 4.7 Flash", "modalities": { "input": [ "text" @@ -29431,91 +29567,117 @@ ] }, "limit": { - "context": 8192, - "output": 4096 + "context": 200000, + "output": 131072 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": false, "open_weights": true, - "release_date": "2026-05-21", - "last_updated": "2026-05-21", + "knowledge": "2025-04", + "release_date": "2026-01-19", + "last_updated": "2026-01-19", "type": "chat" }, { - "id": "inference-net/schematron-v2-small", - "name": "Schematron V2 Small", - "display_name": "Schematron V2 Small", + "id": "fugu-max", + "name": "Fugu Max", + "display_name": "Fugu Max", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 1000000, + "output": 131072 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "high", + "xhigh", + "max" + ] + } + }, + "attachment": true, "open_weights": false, - "release_date": "2026-04-16", - "last_updated": "2026-04-16", + "release_date": "2026-09-11", + "last_updated": "2026-09-11", "type": "chat" }, { - "id": "inference-net/schematron-v2-turbo", - "name": "Schematron V2 Turbo", - "display_name": "Schematron V2 Turbo", + "id": "glm-5-3-flash", + "name": "GLM 5.3 Flash", + "display_name": "GLM 5.3 Flash", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 1000000, + "output": 131072 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": false, - "release_date": "2026-04-16", - "last_updated": "2026-04-16", + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "high", + "max" + ] + } + }, + "attachment": true, + "open_weights": true, + "release_date": "2026-08-26", + "last_updated": "2026-08-26", "type": "chat" }, { - "id": "z-ai/glm-5v-turbo", - "name": "GLM 5V Turbo", - "display_name": "GLM 5V Turbo", + "id": "mimo-v2-6-pro-ultraspeed", + "name": "MiMo V2.6 Pro UltraSpeed", + "display_name": "MiMo V2.6 Pro UltraSpeed", "modalities": { "input": [ "text", "image", - "video", - "pdf" + "audio", + "video" ], "output": [ "text" ] }, "limit": { - "context": 202752, + "context": 1000000, "output": 131072 }, "temperature": true, @@ -29525,15 +29687,15 @@ "default": true }, "attachment": true, - "open_weights": false, - "release_date": "2026-04-01", - "last_updated": "2026-04-01", + "open_weights": true, + "release_date": "2026-09-21", + "last_updated": "2026-09-21", "type": "chat" }, { - "id": "z-ai/glm-4.6v", - "name": "GLM 4.6V", - "display_name": "GLM 4.6V", + "id": "seed-2-0-lite", + "name": "Seed 2.0 Lite", + "display_name": "Seed 2.0 Lite", "modalities": { "input": [ "text", @@ -29545,8 +29707,8 @@ ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 256000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -29556,41 +29718,37 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "low", + "medium", + "high" ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-12-08", - "last_updated": "2025-12-08", + "open_weights": false, + "release_date": "2026-02-14", + "last_updated": "2026-02-14", "type": "chat" }, { - "id": "z-ai/glm-4.5v", - "name": "GLM 4.5V", - "display_name": "GLM 4.5V", + "id": "fugu-ultra-v2-0", + "name": "Fugu Ultra v2.0", + "display_name": "Fugu Ultra v2.0", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 65536, - "output": 16384 + "context": 1000000, + "output": 131072 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -29598,40 +29756,37 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "high", + "xhigh", + "max" ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-08-11", - "last_updated": "2025-08-11", + "open_weights": false, + "knowledge": "2026-08-28", + "release_date": "2026-09-11", + "last_updated": "2026-09-11", "type": "chat" }, { - "id": "z-ai/glm-5.3-flash", - "name": "GLM 5.3 Flash", - "display_name": "GLM 5.3 Flash", + "id": "qwen3-6-flash", + "name": "Qwen3.6 Flash", + "display_name": "Qwen3.6 Flash", "modalities": { "input": [ "text", "image", - "video", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 1000000, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -29641,30 +29796,25 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ + "none", "low", + "medium", "high", "max" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", + "open_weights": false, + "release_date": "2026-04-27", + "last_updated": "2026-04-27", "type": "chat" }, { - "id": "z-ai/glm-5-turbo", - "name": "GLM 5 Turbo", - "display_name": "GLM 5 Turbo", + "id": "step-3-5-flash-2603", + "name": "Step 3.5 Flash 2603", + "display_name": "Step 3.5 Flash 2603", "modalities": { "input": [ "text" @@ -29674,7 +29824,7 @@ ] }, "limit": { - "context": 262144, + "context": 256000, "output": 131072 }, "temperature": true, @@ -29685,30 +29835,36 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "effort_options": [ + "low", + "high" + ] } }, "attachment": false, - "open_weights": false, - "release_date": "2026-03-16", - "last_updated": "2026-03-16", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "z-ai/glm-4.7-flash", - "name": "GLM 4.7 Flash", - "display_name": "GLM 4.7 Flash", + "id": "seed-2-0-mini", + "name": "Seed 2.0 Mini", + "display_name": "Seed 2.0 Mini", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 202752, - "output": 16384 + "context": 256000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -29718,37 +29874,37 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "low", + "medium", + "high" ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2026-01-19", - "last_updated": "2026-01-19", + "attachment": true, + "open_weights": false, + "release_date": "2026-02-14", + "last_updated": "2026-02-14", "type": "chat" }, { - "id": "deepseek/deepseek-chat", - "name": "DeepSeek V4 Flash", - "display_name": "DeepSeek V4 Flash", + "id": "glm-4-6v-flash", + "name": "GLM 4.6V Flash", + "display_name": "GLM 4.6V Flash", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 128000, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -29756,36 +29912,21 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "none", - "low", - "high" - ] - } - }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "release_date": "2025-12-08", + "last_updated": "2025-12-08", "type": "chat" }, { - "id": "deepseek/deepseek-v4-flash", - "name": "DeepSeek V4 Flash", - "display_name": "DeepSeek V4 Flash", + "id": "qwen3-8-max", + "name": "Qwen3.8 Max", + "display_name": "Qwen3.8 Max", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" @@ -29793,7 +29934,7 @@ }, "limit": { "context": 1000000, - "output": 384000 + "output": 131072 }, "temperature": true, "tool_call": true, @@ -29803,37 +29944,25 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", "effort_options": [ + "none", "low", + "medium", "high", "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "attachment": true, + "open_weights": false, + "release_date": "2026-08-03", + "last_updated": "2026-08-03", "type": "chat" }, { - "id": "deepseek/deepseek-v4-pro", - "name": "DeepSeek V4 Pro", - "display_name": "DeepSeek V4 Pro", + "id": "minimax-m2-7", + "name": "MiniMax M2.7", + "display_name": "MiniMax M2.7", "modalities": { "input": [ "text" @@ -29843,8 +29972,8 @@ ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 200000, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -29852,50 +29981,29 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." - ] - } - }, "attachment": false, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "release_date": "2026-03-18", + "last_updated": "2026-03-18", "type": "chat" }, { - "id": "deepseek/deepseek-v4-pro-0813", - "name": "DeepSeek V4 Pro 0813", - "display_name": "DeepSeek V4 Pro 0813", + "id": "qwen3-5-35b-a3b", + "name": "Qwen3.5 35B-A3B", + "display_name": "Qwen3.5 35B-A3B", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 384000 + "context": 256000, + "output": 64000 }, "temperature": true, "tool_call": true, @@ -29905,42 +30013,38 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ "none", "low", - "high" + "medium", + "high", + "max" ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-08-13", - "last_updated": "2026-08-22", + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" }, { - "id": "deepseek/deepseek-v4-flash-vision-exp", - "name": "DeepSeek V4 Flash Vision Exp", - "display_name": "DeepSeek V4 Flash Vision Exp", + "id": "step-3-7-flash", + "name": "Step 3.7 Flash", + "display_name": "Step 3.7 Flash", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 384000 + "context": 256000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -29950,36 +30054,24 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", "effort_options": [ "low", - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." + "medium", + "high" ] } }, "attachment": true, "open_weights": true, - "release_date": "2026-08-21", - "last_updated": "2026-09-01", + "knowledge": "2026-03-01", + "release_date": "2026-05-29", + "last_updated": "2026-05-29", "type": "chat" }, { - "id": "deepseek/deepseek-chat-v3-0324", - "name": "DeepSeek V3", - "display_name": "DeepSeek V3", + "id": "qwen3-6-35b-a3b", + "name": "Qwen3.6 35B A3B", + "display_name": "Qwen3.6 35B A3B", "modalities": { "input": [ "text" @@ -29989,37 +30081,50 @@ ] }, "limit": { - "context": 128000, - "output": 124000 + "context": 131072, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "low", + "medium", + "high", + "max" + ] + } }, "attachment": false, "open_weights": true, - "knowledge": "2024-07-31", - "release_date": "2025-03-24", - "last_updated": "2025-03-24", + "release_date": "2026-04-17", + "last_updated": "2026-04-17", "type": "chat" }, { - "id": "deepseek/deepseek-v4.1-flash", - "name": "DeepSeek V4.1 Flash", - "display_name": "DeepSeek V4.1 Flash", + "id": "mimo-v2-6-flash", + "name": "MiMo V2.6 Flash", + "display_name": "MiMo V2.6 Flash", "modalities": { "input": [ "text", - "image" + "image", + "audio", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 384000 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -30027,39 +30132,29 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "low", - "high" - ] - } - }, "attachment": true, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-09-10", - "last_updated": "2026-09-10", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "anthropic/claude-haiku-5.5", - "name": "Claude Haiku 5.5", - "display_name": "Claude Haiku 5.5", + "id": "kimi-k2-7-code", + "name": "Kimi K2.7 Code", + "display_name": "Kimi K2.7 Code", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 256000, + "output": 131072 }, "temperature": false, "tool_call": true, @@ -30067,100 +30162,71 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ] - } - }, "attachment": true, - "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-10-07", - "last_updated": "2026-10-07", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-06-12", + "last_updated": "2026-06-12", "type": "chat" }, { - "id": "anthropic/claude-opus-4.7", - "name": "Claude 4.7 Opus", - "display_name": "Claude 4.7 Opus", + "id": "qwen3-5-122b-a10b", + "name": "Qwen3.5 122B-A10B", + "display_name": "Qwen3.5 122B-A10B", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 256000, + "output": 64000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "high", "effort_options": [ + "none", "low", "medium", "high", - "xhigh", "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-04-16", - "last_updated": "2026-04-16", + "open_weights": true, + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" }, { - "id": "anthropic/claude-sonnet-5", - "name": "Claude Sonnet 5", - "display_name": "Claude Sonnet 5", + "id": "glm-5-1", + "name": "GLM 5.1", + "display_name": "GLM 5.1", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, + "context": 202000, "output": 128000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -30168,90 +30234,71 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ + "none", "low", "medium", "high", - "xhigh", "max" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-30", - "last_updated": "2026-06-30", + "attachment": false, + "open_weights": true, + "release_date": "2026-04-07", + "last_updated": "2026-04-07", "type": "chat" }, { - "id": "anthropic/claude-haiku-4.5", - "name": "Claude 4.5 Haiku", - "display_name": "Claude 4.5 Haiku", + "id": "qwen3-5-27b", + "name": "Qwen3.5 27B", + "display_name": "Qwen3.5 27B", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 200000, + "context": 256000, "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + "effort_options": [ + "none", + "low", + "medium", + "high", + "max" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-02-28", - "release_date": "2025-10-15", - "last_updated": "2025-10-15", + "open_weights": true, + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" }, { - "id": "anthropic/claude-opus-4.8", - "name": "Claude 4.8 Opus", - "display_name": "Claude 4.8 Opus", + "id": "qwen3-7-plus", + "name": "Qwen3.7 Plus", + "display_name": "Qwen3.7 Plus", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" @@ -30259,98 +30306,69 @@ }, "limit": { "context": 1000000, - "output": 128000 + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "high", "effort_options": [ + "none", "low", "medium", "high", - "xhigh", "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-01", - "release_date": "2026-05-28", - "last_updated": "2026-05-28", + "knowledge": "2025-04", + "release_date": "2026-06-02", + "last_updated": "2026-06-02", "type": "chat" }, { - "id": "anthropic/claude-opus-5.5", - "name": "Claude Opus 5.5", - "display_name": "Claude Opus 5.5", + "id": "minimax-m2-7-highspeed", + "name": "MiniMax M2.7 Highspeed", + "display_name": "MiniMax M2.7 Highspeed", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 200000, + "output": 32768 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ] - } - }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "attachment": false, + "open_weights": true, + "release_date": "2026-03-18", + "last_updated": "2026-03-18", "type": "chat" }, { - "id": "anthropic/claude-fable-5.1", - "name": "Claude Fable 5.1", - "display_name": "Claude Fable 5.1", + "id": "qwen3-8-max-0902", + "name": "Qwen3.8 Max 0902", + "display_name": "Qwen3.8 Max 0902", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" @@ -30358,9 +30376,9 @@ }, "limit": { "context": 1000000, - "output": 128000 + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -30368,268 +30386,210 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", "effort_options": [ + "none", "low", "medium", "high", - "xhigh", "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", - "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", - "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-09-01", - "last_updated": "2026-09-01", + "release_date": "2026-09-02", + "last_updated": "2026-09-02", "type": "chat" }, { - "id": "anthropic/claude-opus-5", - "name": "Claude Opus 5", - "display_name": "Claude Opus 5", + "id": "step-3-5-flash", + "name": "Step 3.5 Flash", + "display_name": "Step 3.5 Flash", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 256000, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ] - } - }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-05", - "release_date": "2026-07-24", - "last_updated": "2026-07-24", + "attachment": false, + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-01-29", + "last_updated": "2026-02-13", "type": "chat" }, { - "id": "anthropic/claude-opus-4.5", - "name": "Claude 4.5 Opus", - "display_name": "Claude 4.5 Opus", + "id": "muse-spark-1-3", + "name": "Muse Spark 1.3", + "display_name": "Muse Spark 1.3", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 1048576, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", "effort_options": [ + "minimal", "low", "medium", - "high" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." + "high", + "xhigh" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-05", - "release_date": "2025-11-24", - "last_updated": "2025-11-24", + "release_date": "2026-09-02", + "last_updated": "2026-09-02", "type": "chat" }, { - "id": "anthropic/claude-sonnet-4.6", - "name": "Claude 4.6 Sonnet", - "display_name": "Claude 4.6 Sonnet", + "id": "qwen3-8-flash", + "name": "Qwen3.8 Flash", + "display_name": "Qwen3.8 Flash", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", "effort_options": [ + "none", "low", "medium", "high", "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-17", - "last_updated": "2026-03-13", + "release_date": "2026-08-26", + "last_updated": "2026-08-26", "type": "chat" }, { - "id": "anthropic/claude-sonnet-4.5", - "name": "Claude 4.5 Sonnet", - "display_name": "Claude 4.5 Sonnet", + "id": "mistral-small-4", + "name": "Mistral Small 4", + "display_name": "Mistral Small 4", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 256000, + "output": 65536 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": true, + "knowledge": "2025-06", + "release_date": "2026-03-16", + "last_updated": "2026-03-16", + "type": "chat" + }, + { + "id": "qwen3-5-flash", + "name": "Qwen3.5 Flash", + "display_name": "Qwen3.5 Flash", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 1000000, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." - ] - } + "default": true }, "attachment": true, "open_weights": false, - "knowledge": "2025-07-31", - "release_date": "2025-09-29", - "last_updated": "2025-09-29", + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" }, { - "id": "anthropic/claude-sonnet-5.5", - "name": "Claude Sonnet 5.5", - "display_name": "Claude Sonnet 5.5", + "id": "kimi-k2-6", + "name": "Kimi K2.6", + "display_name": "Kimi K2.6", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 256000, + "output": 16000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -30638,40 +30598,40 @@ "extra_capabilities": { "reasoning": { "effort_options": [ + "none", "low", "medium", "high", - "xhigh", "max" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-09-28", - "last_updated": "2026-09-28", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-04-20", + "last_updated": "2026-04-20", "type": "chat" }, { - "id": "anthropic/claude-fable-5", - "name": "Claude Fable 5", - "display_name": "Claude Fable 5", + "id": "qwen3-5-9b", + "name": "Qwen3.5 9B", + "display_name": "Qwen3.5 9B", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 262144, + "output": 32768 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -30679,71 +30639,61 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", "effort_options": [ + "none", "low", "medium", "high", - "xhigh", "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", - "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", - "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-09", - "last_updated": "2026-06-09", + "open_weights": true, + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" }, { - "id": "gryphe/mythomax-l2-13b", - "name": "MythoMax 13B", - "display_name": "MythoMax 13B", + "id": "qwen3-5-plus", + "name": "Qwen3.5 Plus", + "display_name": "Qwen3.5 Plus", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 4096, - "output": 4096 + "context": 1000000, + "output": 65536 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "release_date": "2023-08-10", - "last_updated": "2023-08-10", + "attachment": true, + "open_weights": false, + "knowledge": "2025-04", + "release_date": "2026-02-16", + "last_updated": "2026-02-16", "type": "chat" }, { - "id": "mistralai/codestral-2508", - "name": "Codestral 2508", - "display_name": "Codestral 2508", + "id": "seed-2-0-code", + "name": "Seed 2.0 Code", + "display_name": "Seed 2.0 Code", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" @@ -30751,125 +30701,163 @@ }, "limit": { "context": 256000, - "output": 8192 + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "high" + ] + } + }, + "attachment": true, "open_weights": false, - "release_date": "2025-07-30", - "last_updated": "2025-07-30", + "release_date": "2026-02-14", + "last_updated": "2026-02-14", "type": "chat" }, { - "id": "mistralai/voxtral-small-24b-2507", - "name": "Voxtral Small 24B 2507", - "display_name": "Voxtral Small 24B 2507", + "id": "minimax-m3", + "name": "MiniMax M3", + "display_name": "MiniMax M3", "modalities": { "input": [ "text", - "audio" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 32000, - "output": 32768 + "context": 1000000, + "output": 524288 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": true, "open_weights": true, - "release_date": "2025-07-15", - "last_updated": "2025-07-15", + "release_date": "2026-06-01", + "last_updated": "2026-06-01", "type": "chat" }, { - "id": "mistralai/mistral-small-3.1-24b-instruct", - "name": "Small 3.1 24B", - "display_name": "Small 3.1 24B", + "id": "glm-5-2", + "name": "GLM 5.2", + "display_name": "GLM 5.2", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 128000 + "context": 1000000, + "output": 131072 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "minimal", + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + }, + "attachment": false, "open_weights": true, - "knowledge": "2023-10-31", - "release_date": "2025-03-17", - "last_updated": "2025-03-17", + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "mistralai/mistral-medium-3.1", - "name": "Medium 3.1", - "display_name": "Medium 3.1", + "id": "seed-2-1-turbo", + "name": "Seed 2.1 Turbo", + "display_name": "Seed 2.1 Turbo", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 104857 + "context": 256000, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "high" + ] + } }, "attachment": true, "open_weights": false, - "knowledge": "2025-06-30", - "release_date": "2025-08-12", - "last_updated": "2025-08-12", + "release_date": "2026-06-23", + "last_updated": "2026-06-23", "type": "chat" }, { - "id": "mistralai/mistral-medium-3-5", - "name": "Medium 3.5", - "display_name": "Medium 3.5", + "id": "seed-2-0-pro", + "name": "Seed 2.0 Pro", + "display_name": "Seed 2.0 Pro", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 209715 + "context": 256000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -30878,78 +30866,98 @@ "extra_capabilities": { "reasoning": { "effort_options": [ + "low", + "medium", "high" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-04-30", - "last_updated": "2026-04-30", + "release_date": "2026-02-14", + "last_updated": "2026-02-14", "type": "chat" }, { - "id": "mistralai/ministral-3b-2512", - "name": "Ministral 3 3B 2512", - "display_name": "Ministral 3 3B 2512", + "id": "step-5-preview", + "name": "Step 5 Preview", + "display_name": "Step 5 Preview", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 104857 + "context": 1024000, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "high" + ] + } }, "attachment": true, "open_weights": true, - "release_date": "2025-12-02", - "last_updated": "2025-12-02", + "release_date": "2026-09-16", + "last_updated": "2026-09-20", "type": "chat" }, { - "id": "mistralai/mistral-medium-3", - "name": "Medium 3", - "display_name": "Medium 3", + "id": "glm-5-3", + "name": "GLM 5.3", + "display_name": "GLM 5.3", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 104857 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-03-31", - "release_date": "2025-05-07", - "last_updated": "2025-05-07", + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "high", + "max" + ] + } + }, + "attachment": false, + "open_weights": true, + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "mistralai/ministral-14b-2512", - "name": "Ministral 3 14B 2512", - "display_name": "Ministral 3 14B 2512", + "id": "fugu-ultra-v1-1", + "name": "Fugu Ultra v1.1", + "display_name": "Fugu Ultra v1.1", "modalities": { "input": [ "text", @@ -30960,24 +30968,34 @@ ] }, "limit": { - "context": 262144, - "output": 209715 + "context": 1000000, + "output": 131072 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "high", + "xhigh", + "max" + ] + } }, "attachment": true, - "open_weights": true, - "release_date": "2025-12-02", - "last_updated": "2025-12-02", + "open_weights": false, + "release_date": "2026-06-15", + "last_updated": "2026-06-15", "type": "chat" }, { - "id": "mistralai/mistral-nemo", - "name": "Mistral NeMo", - "display_name": "Mistral NeMo", + "id": "deepseek-v4-pro", + "name": "DeepSeek V4 Pro", + "display_name": "DeepSeek V4 Pro", "modalities": { "input": [ "text" @@ -30987,94 +31005,84 @@ ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 1000000, + "output": 393216 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "high", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." + ] + } }, "attachment": false, "open_weights": true, - "knowledge": "2024-07", - "release_date": "2024-07-18", - "last_updated": "2024-07-18", + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "mistralai/mistral-small-2603", - "name": "Small 4", - "display_name": "Small 4", + "id": "kimi-k2-7-code-highspeed", + "name": "Kimi K2.7 Code Highspeed", + "display_name": "Kimi K2.7 Code Highspeed", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 256000 + "context": 256000, + "output": 131072 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "high" - ] - } - }, "attachment": true, "open_weights": true, - "knowledge": "2025-06", - "release_date": "2026-03-16", - "last_updated": "2026-03-16", - "type": "chat" - }, - { - "id": "mistralai/mistral-small-24b-instruct-2501", - "name": "Small 3", - "display_name": "Small 3", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 32768, - "output": 16384 - }, - "temperature": true, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": true, - "knowledge": "2023-10-31", - "release_date": "2025-01-30", - "last_updated": "2025-01-30", + "knowledge": "2025-01", + "release_date": "2026-06-12", + "last_updated": "2026-06-12", "type": "chat" }, { - "id": "mistralai/devstral-2512", - "name": "Devstral 2 2512", - "display_name": "Devstral 2 2512", + "id": "qwen3-8-27b", + "name": "Qwen3.8 27B", + "display_name": "Qwen3.8 27B", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" @@ -31082,228 +31090,274 @@ }, "limit": { "context": 262144, - "output": 262144 + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-12", - "release_date": "2025-12-09", - "last_updated": "2025-12-09", - "type": "chat" - }, - { - "id": "mistralai/mistral-large", - "name": "Large", - "display_name": "Large", - "modalities": { - "input": [ - "text", - "pdf" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 128000, - "output": 102400 + "supported": true, + "default": true }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "low", + "medium", + "xhigh" + ] + } }, "attachment": true, - "open_weights": false, - "knowledge": "2024-11-30", - "release_date": "2024-02-26", - "last_updated": "2024-02-26", + "open_weights": true, + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "mistralai/mistral-small-3.2-24b-instruct", - "name": "Small 3.2 24B", - "display_name": "Small 3.2 24B", + "id": "qwen3-5-4b", + "name": "Qwen3.5 4B", + "display_name": "Qwen3.5 4B", "modalities": { "input": [ + "text", "image", - "text" + "video" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 262144, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "low", + "medium", + "high", + "max" + ] + } }, "attachment": true, "open_weights": true, - "knowledge": "2023-10-31", - "release_date": "2025-06-20", - "last_updated": "2025-06-20", + "release_date": "2026-03-02", + "last_updated": "2026-03-02", "type": "chat" }, { - "id": "mistralai/mistral-large-2407", - "name": "Large 2407", - "display_name": "Large 2407", + "id": "qwen3-8-omni-flash", + "name": "Qwen3.8 Omni Flash", + "display_name": "Qwen3.8 Omni Flash", "modalities": { "input": [ "text", - "pdf" + "image", + "audio", + "video" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 104857 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "low", + "medium", + "high", + "max" + ] + } }, "attachment": true, - "open_weights": true, - "knowledge": "2024-03-31", - "release_date": "2024-07-24", - "last_updated": "2024-07-24", + "open_weights": false, + "release_date": "2026-09-17", + "last_updated": "2026-09-17", "type": "chat" }, { - "id": "mistralai/mixtral-8x22b-instruct", - "name": "Mixtral 8x22B Instruct", - "display_name": "Mixtral 8x22B Instruct", + "id": "kimi-k3", + "name": "Kimi K3", + "display_name": "Kimi K3", "modalities": { "input": [ "text", - "pdf" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 65536, - "output": 52428 + "context": 1000000, + "output": 131072 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "low", + "high", + "max" + ] + } }, "attachment": true, "open_weights": true, - "knowledge": "2024-01-31", - "release_date": "2024-04-17", - "last_updated": "2024-04-17", + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" }, { - "id": "mistralai/ministral-8b-2512", - "name": "Ministral 3 8B 2512", - "display_name": "Ministral 3 8B 2512", + "id": "qwen3-6-27b", + "name": "Qwen3.6 27B", + "display_name": "Qwen3.6 27B", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 209715 + "context": 256000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "low", + "medium", + "high", + "max" + ] + } }, "attachment": true, "open_weights": true, - "release_date": "2025-12-02", - "last_updated": "2025-12-02", + "release_date": "2026-04-22", + "last_updated": "2026-04-22", "type": "chat" }, { - "id": "mistralai/mistral-saba", - "name": "Saba", - "display_name": "Saba", + "id": "minimax-m3-1-flash", + "name": "MiniMax M3.1 Flash", + "display_name": "MiniMax M3.1 Flash", "modalities": { "input": [ "text", - "pdf" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 32768, - "output": 26214 + "context": 1000000, + "output": 524288 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } }, "attachment": true, "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-02-17", - "last_updated": "2025-02-17", + "release_date": "2026-10-19", + "last_updated": "2026-10-19", "type": "chat" }, { - "id": "meta-llama/Llama-3.3-70B-Instruct-Turbo", - "name": "Llama 3.3 70B Instruct Turbo", - "display_name": "Llama 3.3 70B Instruct Turbo", + "id": "qwen3-6-plus", + "name": "Qwen3.6 Plus", + "display_name": "Qwen3.6 Plus", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 127000 + "context": 1000000, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2023-12", - "release_date": "2024-12-06", - "last_updated": "2024-12-06", + "attachment": true, + "open_weights": false, + "knowledge": "2025-04", + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "cognitivecomputations/dolphin-mistral-24b-venice-edition", - "name": "Venice Uncensored", - "display_name": "Venice Uncensored", + "id": "gemma-3-27b", + "name": "Gemma 3 27B", + "display_name": "Gemma 3 27B", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" @@ -31318,17 +31372,17 @@ "reasoning": { "supported": false }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2024-04-30", - "release_date": "2025-07-09", - "last_updated": "2025-07-09", + "knowledge": "2024-08", + "release_date": "2025-03-12", + "last_updated": "2025-03-12", "type": "chat" }, { - "id": "amazon/nova-pro-v1", - "name": "Nova Pro 1.0", - "display_name": "Nova Pro 1.0", + "id": "deepseek-v4-1-flash-1017", + "name": "DeepSeek V4.1 Flash 1017", + "display_name": "DeepSeek V4.1 Flash 1017", "modalities": { "input": [ "text", @@ -31339,54 +31393,37 @@ ] }, "limit": { - "context": 300000, - "output": 5120 + "context": 1000000, + "output": 393216 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-10-31", - "release_date": "2024-12-05", - "last_updated": "2024-12-05", - "type": "chat" - }, - { - "id": "amazon/nova-lite-v1", - "name": "Nova Lite 1.0", - "display_name": "Nova Lite 1.0", - "modalities": { - "input": [ - "text", - "image" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 300000, - "output": 5120 + "supported": true, + "default": true }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "low", + "medium", + "high", + "max" + ] + } }, "attachment": true, - "open_weights": false, - "knowledge": "2024-10-31", - "release_date": "2024-12-05", - "last_updated": "2024-12-05", + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-10-17", + "last_updated": "2026-10-17", "type": "chat" }, { - "id": "amazon/nova-micro-v1", - "name": "Nova Micro 1.0", - "display_name": "Nova Micro 1.0", + "id": "deepseek-v4-pro-0813", + "name": "DeepSeek V4 Pro 0813", + "display_name": "DeepSeek V4 Pro 0813", "modalities": { "input": [ "text" @@ -31396,38 +31433,50 @@ ] }, "limit": { - "context": 128000, - "output": 5120 + "context": 1000000, + "output": 393216 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "none", + "low", + "medium", + "high", + "max" + ] + } }, "attachment": false, - "open_weights": false, - "knowledge": "2024-10-31", - "release_date": "2024-12-05", - "last_updated": "2024-12-05", + "open_weights": true, + "release_date": "2026-08-13", + "last_updated": "2026-08-22", "type": "chat" }, { - "id": "thinkingmachines/inkling-small", - "name": "Inkling Small", - "display_name": "Inkling Small", + "id": "qwen3-5-397b-a17b", + "name": "Qwen3.5 397B-A17B", + "display_name": "Qwen3.5 397B-A17B", "modalities": { "input": [ "text", "image", - "audio" + "video" ], "output": [ "text" ] }, "limit": { - "context": 524288, - "output": 262144 + "context": 256000, + "output": 64000 }, "temperature": true, "tool_call": true, @@ -31437,43 +31486,38 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ + "none", "low", "medium", - "high" + "high", + "max" ] } }, "attachment": true, "open_weights": true, - "release_date": "2026-07-30", - "last_updated": "2026-07-30", + "release_date": "2026-02-15", + "last_updated": "2026-02-15", "type": "chat" }, { - "id": "thinkingmachines/inkling", - "name": "Inkling", - "display_name": "Inkling", + "id": "gemma-4-26b-a4b", + "name": "Gemma 4 26B-A4B", + "display_name": "Gemma 4 26B-A4B", "modalities": { "input": [ "text", "image", - "audio" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 1048576 + "context": 262144, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -31483,30 +31527,34 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ + "none", "low", "medium", - "high" + "high", + "max" ] } }, "attachment": true, "open_weights": true, - "release_date": "2026-07-15", - "last_updated": "2026-07-15", + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" - }, + } + ] + }, + "atomic-chat": { + "id": "atomic-chat", + "name": "Atomic Chat", + "display_name": "Atomic Chat", + "api": "http://127.0.0.1:1337/v1", + "doc": "https://atomic.chat", + "models": [ { - "id": "mancer/weaver", - "name": "Weaver (alpha)", - "display_name": "Weaver (alpha)", + "id": "gemma-4-E4B-it-MLX-4bit", + "name": "Gemma 4 E4B Instruct (MLX 4-bit)", + "display_name": "Gemma 4 E4B Instruct (MLX 4-bit)", "modalities": { "input": [ "text" @@ -31516,8 +31564,8 @@ ] }, "limit": { - "context": 8000, - "output": 2000 + "context": 32768, + "output": 8192 }, "temperature": true, "tool_call": false, @@ -31525,29 +31573,27 @@ "supported": false }, "attachment": false, - "open_weights": false, - "knowledge": "2023-06-30", - "release_date": "2023-08-02", - "last_updated": "2023-08-02", + "open_weights": true, + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "rekaai/reka-edge", - "name": "Reka Edge", - "display_name": "Reka Edge", + "id": "Qwen3_5-9B-Q4_K_M", + "name": "Qwen 3.5 9B (Q4_K_M)", + "display_name": "Qwen 3.5 9B (Q4_K_M)", "modalities": { "input": [ - "image", "text", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 16384, - "output": 16384 + "context": 32768, + "output": 8192 }, "temperature": true, "tool_call": true, @@ -31556,14 +31602,42 @@ }, "attachment": true, "open_weights": true, - "release_date": "2026-03-11", - "last_updated": "2026-03-11", + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" }, { - "id": "perplexity/sonar-pro", - "name": "Sonar Pro", - "display_name": "Sonar Pro", + "id": "Meta-Llama-3_1-8B-Instruct-GGUF", + "name": "Meta Llama 3.1 8B Instruct (GGUF)", + "display_name": "Meta Llama 3.1 8B Instruct (GGUF)", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 131072, + "output": 4096 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "knowledge": "2023-12", + "release_date": "2024-07-23", + "last_updated": "2024-07-23", + "type": "chat" + }, + { + "id": "Qwen3_5-9B-MLX-4bit", + "name": "Qwen 3.5 9B (MLX 4-bit)", + "display_name": "Qwen 3.5 9B (MLX 4-bit)", "modalities": { "input": [ "text", @@ -31574,25 +31648,24 @@ ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 32768, + "output": 8192 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2025-09-01", - "release_date": "2024-01-01", - "last_updated": "2025-09-01", + "open_weights": true, + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" }, { - "id": "perplexity/sonar", - "name": "Sonar", - "display_name": "Sonar", + "id": "gemma-4-E4B-it-IQ4_XS", + "name": "Gemma 4 E4B Instruct (IQ4_XS)", + "display_name": "Gemma 4 E4B Instruct (IQ4_XS)", "modalities": { "input": [ "text" @@ -31602,8 +31675,8 @@ ] }, "limit": { - "context": 128000, - "output": 100000 + "context": 32768, + "output": 8192 }, "temperature": true, "tool_call": false, @@ -31611,75 +31684,85 @@ "supported": false }, "attachment": false, - "open_weights": false, - "knowledge": "2025-09-01", - "release_date": "2024-01-01", - "last_updated": "2025-09-01", + "open_weights": true, + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" - }, + } + ] + }, + "venice": { + "id": "venice", + "name": "Venice AI", + "display_name": "Venice AI", + "doc": "https://docs.venice.ai", + "models": [ { - "id": "bytedance-seed/seed-2.0-code", - "name": "Seed-2.0-Code", - "display_name": "Seed-2.0-Code", + "id": "claude-sonnet-4-5", + "name": "Claude Sonnet 4.5", + "display_name": "Claude Sonnet 4.5", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 131072 + "context": 198000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" ], - "effort_options": [ - "low", - "medium", - "high" + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-02-14", - "last_updated": "2026-02-14", + "knowledge": "2025-07-31", + "release_date": "2025-09-29", + "last_updated": "2025-09-29", "type": "chat" }, { - "id": "bytedance-seed/seed-2.0-mini", - "name": "Seed-2.0-Mini", - "display_name": "Seed-2.0-Mini", + "id": "z-ai-glm-5-turbo", + "name": "GLM 5 Turbo", + "display_name": "GLM 5 Turbo", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 131072 + "context": 200000, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -31689,74 +31772,38 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ + "none", "low", "medium", "high" ] } }, - "attachment": true, - "open_weights": false, - "release_date": "2026-02-14", - "last_updated": "2026-02-14", - "type": "chat" - }, - { - "id": "bytedance-seed/seed-1.6-flash", - "name": "Seed 1.6 Flash", - "display_name": "Seed 1.6 Flash", - "modalities": { - "input": [ - "text", - "image", - "video" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 262144, - "output": 32768 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2025-08-28", - "last_updated": "2025-08-28", + "release_date": "2026-03-16", + "last_updated": "2026-03-16", "type": "chat" }, { - "id": "bytedance-seed/seed-2.0-lite", - "name": "Seed-2.0-Lite", - "display_name": "Seed-2.0-Lite", + "id": "claude-fable-5", + "name": "Claude Fable 5", + "display_name": "Claude Fable 5", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 131072 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -31765,29 +31812,40 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], "interleaved": true, "summaries": true, - "visibility": "summary", + "visibility": "omitted", "continuation": [ "thinking_blocks" ], - "effort_options": [ - "low", - "medium", - "high" + "notes": [ + "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", + "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", + "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-02-14", - "last_updated": "2026-02-14", + "knowledge": "2026-01-31", + "release_date": "2026-06-09", + "last_updated": "2026-06-09", "type": "chat" }, { - "id": "inception/mercury-2", - "name": "Mercury 2", - "display_name": "Mercury 2", + "id": "z-ai-glm-5-3", + "name": "GLM 5.3", + "display_name": "GLM 5.3", "modalities": { "input": [ "text" @@ -31797,8 +31855,8 @@ ] }, "limit": { - "context": 128000, - "output": 50000 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -31806,25 +31864,16 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high" - ] - } - }, "attachment": false, - "open_weights": false, - "release_date": "2026-02-24", - "last_updated": "2026-02-24", + "open_weights": true, + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "inception/mercury-2.5", - "name": "Mercury 2.5", - "display_name": "Mercury 2.5", + "id": "deepseek-v4-flash-0731", + "name": "DeepSeek V4 Flash 0731", + "display_name": "DeepSeek V4 Flash 0731", "modalities": { "input": [ "text" @@ -31834,8 +31883,8 @@ ] }, "limit": { - "context": 260000, - "output": 65536 + "context": 1000000, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -31845,37 +31894,41 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ + "none", "low", - "medium", - "high" + "high", + "max" ] } }, "attachment": false, - "open_weights": false, - "release_date": "2026-09-08", - "last_updated": "2026-09-08", + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-07-31", + "last_updated": "2026-07-31", "type": "chat" }, { - "id": "xiaomi/mimo-v2.5", - "name": "MiMo V2.5", - "display_name": "MiMo V2.5", + "id": "gemini-3-flash-preview", + "name": "Gemini 3 Flash Preview", + "display_name": "Gemini 3 Flash Preview", "modalities": { "input": [ "text", "image", + "video", "audio", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 256000, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -31886,6 +31939,15 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", + "low", + "medium", + "high" + ], "interleaved": true, "summaries": true, "visibility": "summary", @@ -31895,16 +31957,16 @@ } }, "attachment": true, - "open_weights": true, - "knowledge": "2024-12", - "release_date": "2026-04-22", - "last_updated": "2026-04-22", + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2025-12-17", + "last_updated": "2025-12-17", "type": "chat" }, { - "id": "xiaomi/mimo-v2.5-pro", - "name": "MiMo V2.5 Pro", - "display_name": "MiMo V2.5 Pro", + "id": "nvidia-nemotron-3-nano-30b-a3b", + "name": "NVIDIA Nemotron 3 Nano 30B", + "display_name": "NVIDIA Nemotron 3 Nano 30B", "modalities": { "input": [ "text" @@ -31914,58 +31976,38 @@ ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 128000, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": false, "open_weights": true, - "knowledge": "2024-12", - "release_date": "2026-04-22", - "last_updated": "2026-04-22", + "knowledge": "2025-06-25", + "release_date": "2025-12-15", + "last_updated": "2025-12-15", "type": "chat" - } - ] - }, - "llmtech": { - "id": "llmtech", - "name": "LLM Tech", - "display_name": "LLM Tech", - "api": "https://api.llmtech.eu/v1", - "doc": "https://llmtech.eu/models/qwen3.8-27b", - "models": [ + }, { - "id": "nvidia/Qwen3.8-27B-NVFP4", - "name": "Qwen3.8 27B", - "display_name": "Qwen3.8 27B", + "id": "qwen-3-7-plus", + "name": "Qwen 3.7 Plus", + "display_name": "Qwen 3.7 Plus", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 1000000, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -31973,34 +32015,17 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "xhigh" - ] - } - }, "attachment": true, - "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "open_weights": false, + "knowledge": "2025-04", + "release_date": "2026-06-02", + "last_updated": "2026-06-02", "type": "chat" - } - ] - }, - "hetzner": { - "id": "hetzner", - "name": "Hetzner", - "display_name": "Hetzner", - "api": "https://inference.hetzner.com/api/v1", - "doc": "https://experiments.hetzner.com/docs/inference", - "models": [ + }, { - "id": "Qwen3.8-27B", - "name": "Qwen3.8-27B", - "display_name": "Qwen3.8-27B", + "id": "grok-4-3", + "name": "Grok 4.3", + "display_name": "Grok 4.3", "modalities": { "input": [ "text", @@ -32011,8 +32036,8 @@ ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1000000, + "output": 32000 }, "temperature": true, "tool_call": true, @@ -32020,28 +32045,37 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "low", + "medium", + "high" + ] + } + }, "attachment": true, - "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "open_weights": false, + "release_date": "2026-04-17", + "last_updated": "2026-04-17", "type": "chat" }, { - "id": "Qwen/Qwen3.6-35B-A3B-FP8", - "name": "Qwen3.6 35B A3B FP8", - "display_name": "Qwen3.6 35B A3B FP8", + "id": "deepseek-v4-flash", + "name": "DeepSeek V4 Flash 0423", + "display_name": "DeepSeek V4 Flash 0423", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1000000, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -32052,37 +32086,41 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "high", + "max" + ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "notes": [ + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-04-17", - "last_updated": "2026-04-17", + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" - } - ] - }, - "evroc": { - "id": "evroc", - "name": "evroc", - "display_name": "evroc", - "api": "https://models.think.evroc.com/v1", - "doc": "https://docs.evroc.com/products/think/overview.html", - "models": [ + }, { - "id": "Qwen/Qwen3.6-35B-A3B", - "name": "Qwen3.6 35B-A3B", - "display_name": "Qwen3.6 35B-A3B", + "id": "gemini-3-5-flash-lite", + "name": "Gemini 3.5 Flash-Lite", + "display_name": "Gemini 3.5 Flash-Lite", "modalities": { "input": [ "text", "image", + "audio", "video" ], "output": [ @@ -32090,7 +32128,7 @@ ] }, "limit": { - "context": 262144, + "context": 1000000, "output": 65536 }, "temperature": true, @@ -32099,27 +32137,17 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, "attachment": true, - "open_weights": true, - "release_date": "2026-04-17", - "last_updated": "2026-04-17", + "open_weights": false, + "knowledge": "2026-03", + "release_date": "2026-07-21", + "last_updated": "2026-07-21", "type": "chat" }, { - "id": "Qwen/Qwen3.8-27B", - "name": "Qwen3.8-27B", - "display_name": "Qwen3.8-27B", + "id": "qwen-3-6-plus", + "name": "Qwen 3.6 Plus Uncensored", + "display_name": "Qwen 3.6 Plus Uncensored", "modalities": { "input": [ "text", @@ -32131,8 +32159,8 @@ ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1000000, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -32140,52 +32168,47 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "xhigh" - ] - } - }, "attachment": true, - "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "open_weights": false, + "knowledge": "2025-04", + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "Qwen/Qwen3-Embedding-8B", - "name": "Qwen3 Embedding 8B", - "display_name": "Qwen3 Embedding 8B", + "id": "nvidia-nemotron-3-5-super-vl-120b-a12b", + "name": "NVIDIA Nemotron 3.5 Super VL 120B", + "display_name": "NVIDIA Nemotron 3.5 Super VL 120B", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 40960, - "output": 4096 + "context": 262144, + "output": 32768 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2025-06-05", - "last_updated": "2025-06-05", - "type": "embedding" + "release_date": "2026-10-15", + "last_updated": "2026-10-15", + "type": "chat" }, { - "id": "Qwen/Qwen3-Reranker-4B", - "name": "Qwen3 Reranker 4B", - "display_name": "Qwen3 Reranker 4B", + "id": "mercury-2-5", + "name": "Mercury 2.5", + "display_name": "Mercury 2.5", "modalities": { "input": [ "text" @@ -32195,65 +32218,93 @@ ] }, "limit": { - "context": 32000, - "output": 4096 + "context": 260000, + "output": 65536 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false - }, + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "low", + "medium", + "high" + ] + } + }, "attachment": false, - "open_weights": true, - "release_date": "2025-07-30", - "last_updated": "2025-07-30", - "type": "rerank" + "open_weights": false, + "release_date": "2026-09-08", + "last_updated": "2026-09-08", + "type": "chat" }, { - "id": "evroc/roc", - "name": "roc", - "display_name": "roc", + "id": "claude-sonnet-4-6", + "name": "Claude Sonnet 4.6", + "display_name": "Claude Sonnet 4.6", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1000000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "max" + ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-01", - "release_date": "2026-06-06", - "last_updated": "2026-06-06", + "knowledge": "2025-08-31", + "release_date": "2026-02-17", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "nvidia/Llama-3.3-70B-Instruct-FP8", - "name": "Llama-3.3-70B-Instruct", - "display_name": "Llama-3.3-70B-Instruct", + "id": "minimax-m27", + "name": "MiniMax M2.7", + "display_name": "MiniMax M2.7", "modalities": { "input": [ "text" @@ -32263,36 +32314,45 @@ ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 198000, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "low", + "medium", + "high" + ] + } }, "attachment": false, "open_weights": true, - "knowledge": "2023-12", - "release_date": "2024-12-06", - "last_updated": "2024-12-06", + "release_date": "2026-03-18", + "last_updated": "2026-03-18", "type": "chat" }, { - "id": "google/gemma-4-26B-A4B-it", - "name": "Gemma 4 26B A4B IT", - "display_name": "Gemma 4 26B A4B IT", + "id": "deepseek-v4-flash-0731-fast", + "name": "DeepSeek V4 Flash 0731 Fast", + "display_name": "DeepSeek V4 Flash 0731 Fast", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, + "context": 1000000, "output": 32768 }, "temperature": true, @@ -32303,32 +32363,38 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "effort_options": [ + "none", + "low", + "high", + "max" + ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "knowledge": "2025-05", + "release_date": "2026-07-31", + "last_updated": "2026-07-31", "type": "chat" }, { - "id": "moonshotai/Kimi-K2.6", - "name": "Kimi K2.6", - "display_name": "Kimi K2.6", + "id": "deepseek-v4-1-flash", + "name": "DeepSeek V4.1 Flash", + "display_name": "DeepSeek V4.1 Flash", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -32338,83 +32404,92 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "effort_options": [ + "none", + "low", + "high", + "max" + ] } }, "attachment": true, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-20", - "last_updated": "2026-04-20", + "knowledge": "2025-05", + "release_date": "2026-09-10", + "last_updated": "2026-09-10", "type": "chat" }, { - "id": "openai/whisper-large-v3", - "name": "Whisper 3 Large", - "display_name": "Whisper 3 Large", + "id": "llama-3.2-3b", + "name": "Llama 3.2 3B", + "display_name": "Llama 3.2 3B", "modalities": { "input": [ - "audio" + "text" ], "output": [ "text" ] }, "limit": { - "context": 448, + "context": 128000, "output": 4096 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2023-11-06", - "last_updated": "2023-11-06" + "knowledge": "2023-12", + "release_date": "2024-09-25", + "last_updated": "2024-09-25", + "type": "chat" }, { - "id": "openai/whisper-large-v3-turbo", - "name": "Whisper Large v3 Turbo", - "display_name": "Whisper Large v3 Turbo", + "id": "venice-uncensored-1-2", + "name": "Venice Uncensored 1.2", + "display_name": "Venice Uncensored 1.2", "modalities": { "input": [ - "audio" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 448, - "output": 448 + "context": 128000, + "output": 8192 }, - "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, "attachment": true, "open_weights": true, - "release_date": "2024-10-01", - "last_updated": "2024-10-01" + "release_date": "2026-04-01", + "last_updated": "2026-06-11", + "type": "chat" }, { - "id": "openai/gpt-oss-120b", - "name": "GPT OSS 120B", - "display_name": "GPT OSS 120B", + "id": "grok-4-7", + "name": "Grok 4.7", + "display_name": "Grok 4.7", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 65536, - "output": 65536 + "context": 500000, + "output": 200000 }, "temperature": true, "tool_call": true, @@ -32424,63 +32499,80 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ "low", "medium", - "high" + "high", + "xhigh" ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "attachment": true, + "open_weights": false, + "knowledge": "2026-05", + "release_date": "2026-09-21", + "last_updated": "2026-09-21", "type": "chat" }, { - "id": "KBLab/kb-whisper-large", - "name": "KB Whisper", - "display_name": "KB Whisper", + "id": "claude-opus-5-5-fast", + "name": "Claude Opus 5.5 Fast", + "display_name": "Claude Opus 5.5 Fast", "modalities": { "input": [ - "audio" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 448, - "output": 448 + "context": 1000000, + "output": 128000 }, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } }, "attachment": true, - "open_weights": true, - "release_date": "2024-10-01", - "last_updated": "2024-10-01" + "open_weights": false, + "knowledge": "2026-06", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", + "type": "chat" }, { - "id": "zai-org/GLM-5.2", - "name": "GLM-5.2", - "display_name": "GLM-5.2", + "id": "openai-gpt-61-sol-ultrafast", + "name": "GPT-6.1 Sol Ultrafast", + "display_name": "GPT-6.1 Sol Ultrafast", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 524288, - "output": 131072 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -32488,23 +32580,26 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ + "low", + "medium", "high", + "xhigh", "max" ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "attachment": true, + "open_weights": false, + "knowledge": "2026-04-30", + "release_date": "2026-09-29", + "last_updated": "2026-09-29", "type": "chat" }, { - "id": "mistralai/Mistral-Medium-3.5-128B", - "name": "Mistral Medium 3.5", - "display_name": "Mistral Medium 3.5", + "id": "openai-gpt-56-sol", + "name": "GPT-5.6 Sol", + "display_name": "GPT-5.6 Sol", "modalities": { "input": [ "text", @@ -32515,10 +32610,10 @@ ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -32528,86 +32623,99 @@ "reasoning": { "effort_options": [ "none", - "high" + "low", + "medium", + "high", + "xhigh", + "max" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-04-29", - "last_updated": "2026-04-29", + "open_weights": false, + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "mistralai/Voxtral-Small-24B-2507", - "name": "Voxtral Small 24B", - "display_name": "Voxtral Small 24B", + "id": "openai-gpt-54-mini", + "name": "GPT-5.4 Mini", + "display_name": "GPT-5.4 Mini", "modalities": { "input": [ - "audio", - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 32000, - "output": 32000 + "context": 400000, + "output": 128000 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ] + } }, "attachment": true, - "open_weights": true, - "release_date": "2025-03-01", - "last_updated": "2025-03-01" + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-03-17", + "last_updated": "2026-03-17", + "type": "chat" }, { - "id": "intfloat/multilingual-e5-large-instruct", - "name": "E5 Multi-Lingual Large Embeddings 0.6B", - "display_name": "E5 Multi-Lingual Large Embeddings 0.6B", + "id": "openai-gpt-4o-2024-11-20", + "name": "GPT-4o", + "display_name": "GPT-4o", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 512, - "output": 512 + "context": 128000, + "output": 16384 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, - "open_weights": true, - "release_date": "2024-06-01", - "last_updated": "2024-06-01", - "type": "embedding" - } - ] - }, - "github-copilot": { - "id": "github-copilot", - "name": "GitHub Copilot", - "display_name": "GitHub Copilot", - "api": "https://api.githubcopilot.com", - "doc": "https://docs.github.com/en/copilot", - "models": [ + "attachment": true, + "open_weights": false, + "knowledge": "2023-09", + "release_date": "2024-11-20", + "last_updated": "2024-11-20", + "type": "chat" + }, { - "id": "claude-haiku-5.5", - "name": "Claude Haiku 5.5", - "display_name": "Claude Haiku 5.5", + "id": "openai-gpt-56-luna", + "name": "GPT-5.6 Luna", + "display_name": "GPT-5.6 Luna", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" @@ -32626,6 +32734,7 @@ "extra_capabilities": { "reasoning": { "effort_options": [ + "none", "low", "medium", "high", @@ -32636,72 +32745,58 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-10-07", - "last_updated": "2026-10-07", + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "gpt-5.4-mini", - "name": "GPT-5.4 mini", - "display_name": "GPT-5.4 mini", + "id": "nvidia-nemotron-3-ultra-550b-a55b", + "name": "NVIDIA Nemotron 3 Ultra", + "display_name": "NVIDIA Nemotron 3 Ultra", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 256000, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", "effort_options": [ "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ "low", "medium", "high" - ], - "visibility": "hidden" + ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-17", - "last_updated": "2026-03-17", + "attachment": false, + "open_weights": true, + "knowledge": "2025-09", + "release_date": "2026-06-04", + "last_updated": "2026-06-04", "type": "chat" }, { - "id": "gpt-5.6-sol", - "name": "GPT-5.6 Sol", - "display_name": "GPT-5.6 Sol", + "id": "openai-gpt-6-sol", + "name": "GPT-6 Sol", + "display_name": "GPT-6 Sol", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" @@ -32719,10 +32814,6 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", "effort_options": [ "none", "low", @@ -32730,123 +32821,86 @@ "high", "xhigh", "max" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "knowledge": "2026-04-20", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "claude-opus-4.7", - "name": "Claude Opus 4.7", - "display_name": "Claude Opus 4.7", + "id": "deepseek-v4-1-flash-1017-uncensored", + "name": "DeepSeek V4.1 Flash 1017 Uncensored", + "display_name": "DeepSeek V4.1 Flash 1017 Uncensored", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 32000 + "context": 1000000, + "output": 131072 }, - "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "high", "effort_options": [ + "none", "low", - "medium", "high", - "xhigh", "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-04-16", - "last_updated": "2026-04-16", + "open_weights": true, + "release_date": "2026-10-27", + "last_updated": "2026-10-27", "type": "chat" }, { - "id": "grok-4.5", - "name": "Grok 4.5", - "display_name": "Grok 4.5", + "id": "llama-3.3-70b", + "name": "Llama 3.3 70B", + "display_name": "Llama 3.3 70B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 500000, - "output": 128000 + "context": 128000, + "output": 4096 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "low", - "medium", - "high" - ] - } + "supported": false }, - "attachment": true, - "open_weights": false, - "release_date": "2026-07-08", - "last_updated": "2026-07-08", + "attachment": false, + "open_weights": true, + "knowledge": "2023-12", + "release_date": "2024-12-06", + "last_updated": "2024-12-06", "type": "chat" }, { - "id": "gpt-5.4-nano", - "name": "GPT-5.4 nano", - "display_name": "GPT-5.4 nano", + "id": "claude-opus-4-7", + "name": "Claude Opus 4.7", + "display_name": "Claude Opus 4.7", "modalities": { "input": [ "text", @@ -32857,10 +32911,10 @@ ] }, "limit": { - "context": 400000, + "context": 1000000, "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -32871,38 +32925,41 @@ "supported": true, "default_enabled": false, "mode": "effort", - "effort": "none", + "effort": "high", "effort_options": [ - "none", "low", "medium", "high", - "xhigh" + "xhigh", + "max" ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" ], - "visibility": "hidden" + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-17", - "last_updated": "2026-03-17", + "knowledge": "2026-01-31", + "release_date": "2026-04-16", + "last_updated": "2026-04-16", "type": "chat" }, { - "id": "kimi-k2.7-code", - "name": "Kimi K2.7 Code", - "display_name": "Kimi K2.7 Code", + "id": "qwen3-coder-480b-a35b-instruct-turbo", + "name": "Qwen 3 Coder 480B Turbo", + "display_name": "Qwen 3 Coder 480B Turbo", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" @@ -32910,99 +32967,66 @@ }, "limit": { "context": 256000, - "output": 32000 + "output": 65536 }, - "temperature": false, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-06-12", - "last_updated": "2026-06-12", + "release_date": "2026-01-27", + "last_updated": "2026-06-11", "type": "chat" }, { - "id": "gpt-5.6-luna", - "name": "GPT-5.6 Luna", - "display_name": "GPT-5.6 Luna", + "id": "gemini-3-8-flash", + "name": "Gemini 3.8 Flash", + "display_name": "Gemini 3.8 Flash", "modalities": { "input": [ "text", "image", - "pdf" + "audio", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1000000, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } - }, "attachment": true, "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "release_date": "2026-09-02", + "last_updated": "2026-09-02", "type": "chat" }, { - "id": "gemini-4-argon", - "name": "Gemini 4 Argon", - "display_name": "Gemini 4 Argon", + "id": "deepseek-v4-1-flash-uncensored", + "name": "DeepSeek V4.1 Flash Uncensored", + "display_name": "DeepSeek V4.1 Flash Uncensored", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 1000000, + "output": 131072 }, - "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -33011,28 +33035,28 @@ "extra_capabilities": { "reasoning": { "effort_options": [ + "none", "low", - "medium", - "high" + "high", + "max" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-10-13", - "last_updated": "2026-10-13", + "open_weights": true, + "release_date": "2026-10-23", + "last_updated": "2026-10-23", "type": "chat" }, { - "id": "claude-sonnet-5", - "name": "Claude Sonnet 5", - "display_name": "Claude Sonnet 5", + "id": "qwen-3-8-flash", + "name": "Qwen 3.8 Flash", + "display_name": "Qwen 3.8 Flash", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" @@ -33040,54 +33064,37 @@ }, "limit": { "context": 1000000, - "output": 128000 + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ] - } - }, "attachment": true, "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-30", - "last_updated": "2026-06-30", + "release_date": "2026-08-26", + "last_updated": "2026-08-26", "type": "chat" }, { - "id": "gemini-3.5-flash", - "name": "Gemini 3.5 Flash", - "display_name": "Gemini 3.5 Flash", + "id": "kimi-k3-1-pro-highspeed", + "name": "Kimi K3.1 Pro Highspeed", + "display_name": "Kimi K3.1 Pro Highspeed", "modalities": { "input": [ "text", - "image", - "video", - "audio", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 1000000, + "output": 131072 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -33095,46 +33102,35 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", + "effort_options": [ + "none", "low", - "medium", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" + "high", + "max" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-05-19", - "last_updated": "2026-05-19", + "release_date": "2026-10-23", + "last_updated": "2026-10-23", "type": "chat" }, { - "id": "gpt-5.6-terra", - "name": "GPT-5.6 Terra", - "display_name": "GPT-5.6 Terra", + "id": "claude-fable-5-1", + "name": "Claude Fable 5.1", + "display_name": "Claude Fable 5.1", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1050000, + "context": 1000000, "output": 128000 }, "temperature": false, @@ -33148,35 +33144,38 @@ "supported": true, "default_enabled": true, "mode": "effort", - "effort": "medium", + "effort": "high", "effort_options": [ - "none", "low", "medium", "high", "xhigh", "max" ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" ], - "visibility": "hidden" + "notes": [ + "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", + "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", + "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "knowledge": "2026-06", + "release_date": "2026-09-01", + "last_updated": "2026-09-01", "type": "chat" }, { - "id": "grok-4.7", - "name": "Grok 4.7", - "display_name": "Grok 4.7", + "id": "abliteration-abliterated-model-large-flash", + "name": "Abliterated Large Flash", + "display_name": "Abliterated Large Flash", "modalities": { "input": [ "text", @@ -33187,51 +33186,37 @@ ] }, "limit": { - "context": 500000, - "output": 128000 + "context": 1000000, + "output": 131072 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ] - } - }, "attachment": true, "open_weights": false, - "knowledge": "2026-05", - "release_date": "2026-09-21", - "last_updated": "2026-09-21", + "release_date": "2026-10-23", + "last_updated": "2026-10-23", "type": "chat" }, { - "id": "gpt-6-sol", - "name": "GPT-6 Sol", - "display_name": "GPT-6 Sol", + "id": "mercury-2", + "name": "Mercury 2", + "display_name": "Mercury 2", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 128000, + "output": 50000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -33243,88 +33228,59 @@ "none", "low", "medium", - "high", - "xhigh", - "max" + "high" ] } }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2026-04-20", - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "release_date": "2026-02-24", + "last_updated": "2026-02-24", "type": "chat" }, { - "id": "claude-haiku-4.5", - "name": "Claude Haiku 4.5 (latest)", - "display_name": "Claude Haiku 4.5 (latest)", + "id": "qwen-3-8-2-4t-a95b", + "name": "Qwen 3.8 2.4T", + "display_name": "Qwen 3.8 2.4T", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 262144, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." - ] - } + "default": true }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-02-28", - "release_date": "2025-10-15", - "last_updated": "2025-10-15", + "attachment": false, + "open_weights": true, + "release_date": "2026-08-12", + "last_updated": "2026-08-12", "type": "chat" }, { - "id": "gpt-5.3-codex", - "name": "GPT-5.3 Codex", - "display_name": "GPT-5.3 Codex", + "id": "zai-org-glm-4.7", + "name": "GLM 4.7", + "display_name": "GLM 4.7", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 198000, + "output": 16384 }, "temperature": true, "tool_call": true, @@ -33335,107 +33291,88 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high", - "xhigh" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ], - "verbosity": "medium", - "verbosity_options": [ + "effort_options": [ "low", "medium", "high" - ], - "visibility": "hidden" + ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-05", - "last_updated": "2026-02-05", + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-12-22", + "last_updated": "2025-12-22", "type": "chat" }, { - "id": "claude-opus-4.8", - "name": "Claude Opus 4.8", - "display_name": "Claude Opus 4.8", + "id": "minimax-m25", + "name": "MiniMax M2.5", + "display_name": "MiniMax M2.5", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 198000, + "output": 32768 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], "interleaved": true, "summaries": true, - "visibility": "omitted", + "visibility": "summary", "continuation": [ "thinking_blocks" ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." + "effort_options": [ + "low", + "medium", + "high" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-01", - "release_date": "2026-05-28", - "last_updated": "2026-05-28", + "attachment": false, + "open_weights": true, + "release_date": "2026-02-12", + "last_updated": "2026-02-12", "type": "chat" }, { - "id": "gpt-6.1-sol", - "name": "GPT-6.1 Sol", - "display_name": "GPT-6.1 Sol", + "id": "grok-4-6", + "name": "Grok 4.6", + "display_name": "Grok 4.6", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 500000, + "output": 200000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -33447,37 +33384,36 @@ "low", "medium", "high", - "xhigh", - "max" + "xhigh" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-04-30", - "release_date": "2026-09-29", - "last_updated": "2026-09-29", + "knowledge": "2026-02-01", + "release_date": "2026-08-12", + "last_updated": "2026-08-12", "type": "chat" }, { - "id": "claude-opus-5.5", - "name": "Claude Opus 5.5", - "display_name": "Claude Opus 5.5", + "id": "google-gemma-4-26b-a4b-it", + "name": "Google Gemma 4 26B A4B Instruct", + "display_name": "Google Gemma 4 26B A4B Instruct", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 256000, + "output": 8192 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -33486,83 +33422,55 @@ "extra_capabilities": { "reasoning": { "effort_options": [ + "none", "low", "medium", - "high", - "xhigh", - "max" + "high" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "open_weights": true, + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "gpt-5.4", - "name": "GPT-5.4", - "display_name": "GPT-5.4", + "id": "venice-uncensored-role-play", + "name": "Venice Role Play Uncensored", + "display_name": "Venice Role Play Uncensored", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 128000, + "output": 4096 }, - "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-05", - "last_updated": "2026-03-05", + "open_weights": true, + "release_date": "2026-02-20", + "last_updated": "2026-06-11", "type": "chat" }, { - "id": "mai-code-1.1-flash", - "name": "MAI-Code-1.1-Flash", - "display_name": "MAI-Code-1.1-Flash", + "id": "qwen3-5-35b-a3b", + "name": "Qwen 3.5 35B A3B", + "display_name": "Qwen 3.5 35B A3B", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" @@ -33570,46 +33478,7 @@ }, "limit": { "context": 256000, - "output": 128000 - }, - "temperature": false, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high" - ] - } - }, - "attachment": true, - "open_weights": false, - "release_date": "2026-08-11", - "last_updated": "2026-08-11", - "type": "chat" - }, - { - "id": "gemini-3.8-flash", - "name": "Gemini 3.8 Flash", - "display_name": "Gemini 3.8 Flash", - "modalities": { - "input": [ - "text", - "image", - "pdf" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 1000000, - "output": 64000 + "output": 16384 }, "temperature": true, "tool_call": true, @@ -33619,33 +33488,24 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", + "effort_options": [ + "none", "low", "medium", "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" ] } }, "attachment": true, - "open_weights": false, - "release_date": "2026-09-02", - "last_updated": "2026-09-02", + "open_weights": true, + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" }, { - "id": "kimi-k3", - "name": "Kimi K3", - "display_name": "Kimi K3", + "id": "qwen3-6-35b-a3b", + "name": "Qwen 3.6 35B A3B", + "display_name": "Qwen 3.6 35B A3B", "modalities": { "input": [ "text", @@ -33656,50 +33516,38 @@ ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 256000, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "low", - "high", - "max" - ] - } - }, "attachment": true, "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-16", + "release_date": "2026-04-17", + "last_updated": "2026-04-17", "type": "chat" }, { - "id": "claude-fable-5.1", - "name": "Claude Fable 5.1", - "display_name": "Claude Fable 5.1", + "id": "qwen3-235b-a22b-thinking-2507", + "name": "Qwen 3 235B A22B Thinking 2507", + "display_name": "Qwen 3 235B A22B Thinking 2507", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 128000, + "output": 16384 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -33708,88 +33556,33 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], "interleaved": true, "summaries": true, - "visibility": "omitted", + "visibility": "summary", "continuation": [ "thinking_blocks" ], - "notes": [ - "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", - "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", - "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." - ] - } - }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-09-01", - "last_updated": "2026-09-01", - "type": "chat" - }, - { - "id": "claude-opus-5", - "name": "Claude Opus 5", - "display_name": "Claude Opus 5", - "modalities": { - "input": [ - "text", - "image", - "pdf" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 1000000, - "output": 64000 - }, - "temperature": false, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, "effort_options": [ "low", "medium", - "high", - "xhigh", - "max" + "high" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-05", - "release_date": "2026-07-24", - "last_updated": "2026-07-24", + "attachment": false, + "open_weights": true, + "release_date": "2025-07-25", + "last_updated": "2025-07-25", "type": "chat" }, { - "id": "gpt-6-astra", + "id": "openai-gpt-6-astra", "name": "GPT-6 Astra", "display_name": "GPT-6 Astra", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" @@ -33807,7 +33600,6 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ "low", "medium", @@ -33825,9 +33617,9 @@ "type": "chat" }, { - "id": "gemini-3.7-flash", - "name": "Gemini 3.7 Flash", - "display_name": "Gemini 3.7 Flash", + "id": "kimi-k2-7-code", + "name": "Kimi K2.7 Code", + "display_name": "Kimi K2.7 Code", "modalities": { "input": [ "text", @@ -33838,10 +33630,10 @@ ] }, "limit": { - "context": 1000000, - "output": 64000 + "context": 256000, + "output": 65536 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -33849,86 +33641,52 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", + "effort_options": [ "low", "medium", "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-08-13", - "last_updated": "2026-08-13", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-06-12", + "last_updated": "2026-06-12", "type": "chat" }, { - "id": "gpt-5.5", - "name": "GPT-5.5", - "display_name": "GPT-5.5", + "id": "grok-4-20-multi-agent", + "name": "Grok 4.20 Multi-Agent", + "display_name": "Grok 4.20 Multi-Agent", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1050000, + "context": 2000000, "output": 128000 }, - "temperature": false, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } - }, "attachment": true, "open_weights": false, - "knowledge": "2025-12-01", - "release_date": "2026-04-23", - "last_updated": "2026-04-23", + "release_date": "2026-03-12", + "last_updated": "2026-06-11", "type": "chat" }, { - "id": "gpt-5-mini", - "name": "GPT-5 Mini", - "display_name": "GPT-5 Mini", + "id": "openai-gpt-6-luna", + "name": "GPT-6 Luna", + "display_name": "GPT-6 Luna", "modalities": { "input": [ "text", @@ -33939,8 +33697,8 @@ ] }, "limit": { - "context": 264000, - "output": 64000 + "context": 1050000, + "output": 128000 }, "temperature": false, "tool_call": true, @@ -33950,98 +33708,76 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", "effort_options": [ - "minimal", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ + "none", "low", "medium", - "high" - ], - "visibility": "hidden" + "high", + "xhigh", + "max" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2024-05-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "knowledge": "2026-05-18", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "gemini-3.6-flash", - "name": "Gemini 3.6 Flash", - "display_name": "Gemini 3.6 Flash", + "id": "qwen3-vl-235b-a22b", + "name": "Qwen3 VL 235B", + "display_name": "Qwen3 VL 235B", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 64000 + "context": 128000, + "output": 16384 }, - "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", - "low", - "medium", - "high" - ], + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-07-21", - "last_updated": "2026-07-21", + "open_weights": true, + "release_date": "2026-01-16", + "last_updated": "2026-06-11", "type": "chat" }, { - "id": "gpt-6-luna", - "name": "GPT-6 Luna", - "display_name": "GPT-6 Luna", + "id": "claude-opus-5-5", + "name": "Claude Opus 5.5", + "display_name": "Claude Opus 5.5", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1050000, + "context": 1000000, "output": 128000 }, "temperature": false, @@ -34053,7 +33789,6 @@ "extra_capabilities": { "reasoning": { "effort_options": [ - "none", "low", "medium", "high", @@ -34064,28 +33799,27 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2026-05-18", + "knowledge": "2026-06", "release_date": "2026-09-22", "last_updated": "2026-09-22", "type": "chat" }, { - "id": "claude-sonnet-4.6", - "name": "Claude Sonnet 4.6", - "display_name": "Claude Sonnet 4.6", + "id": "claude-opus-4-6", + "name": "Claude Opus 4.6", + "display_name": "Claude Opus 4.6", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 32000 + "context": 1000000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -34123,103 +33857,73 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-17", + "knowledge": "2025-05-31", + "release_date": "2026-02-05", "last_updated": "2026-03-13", "type": "chat" }, { - "id": "grok-4.6", - "name": "Grok 4.6", - "display_name": "Grok 4.6", + "id": "abliteration-abliterated-model-large-v2", + "name": "Abliterated Large V2", + "display_name": "Abliterated Large V2", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 500000, - "output": 128000 + "context": 1000000, + "output": 32768 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ] - } - }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2026-02-01", - "release_date": "2026-08-12", - "last_updated": "2026-08-12", + "release_date": "2026-10-01", + "last_updated": "2026-10-01", "type": "chat" }, { - "id": "claude-sonnet-5.5", - "name": "Claude Sonnet 5.5", - "display_name": "Claude Sonnet 5.5", + "id": "aion-labs-aion-3-5-mini", + "name": "Aion 3.5 Mini", + "display_name": "Aion 3.5 Mini", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 262144, + "output": 32768 }, - "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ] - } - }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-09-28", - "last_updated": "2026-09-28", + "release_date": "2026-09-23", + "last_updated": "2026-09-23", "type": "chat" }, { - "id": "claude-fable-5", - "name": "Claude Fable 5", - "display_name": "Claude Fable 5", + "id": "claude-opus-4-8", + "name": "Claude Opus 4.8", + "display_name": "Claude Opus 4.8", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" @@ -34233,12 +33937,12 @@ "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, + "default_enabled": false, "mode": "effort", "effort": "high", "effort_options": [ @@ -34255,32 +33959,23 @@ "thinking_blocks" ], "notes": [ - "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", - "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", - "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-09", - "last_updated": "2026-06-09", + "knowledge": "2026-01", + "release_date": "2026-05-28", + "last_updated": "2026-05-28", "type": "chat" - } - ] - }, - "io-net": { - "id": "io-net", - "name": "IO.NET", - "display_name": "IO.NET", - "api": "https://api.intelligence.io.solutions/api/v1", - "doc": "https://io.net/docs/guides/intelligence/io-intelligence", - "models": [ + }, { - "id": "Qwen/Qwen3-Next-80B-A3B-Instruct", - "name": "Qwen 3 Next 80B Instruct", - "display_name": "Qwen 3 Next 80B Instruct", + "id": "zai-org-glm-4.6", + "name": "GLM 4.6", + "display_name": "GLM 4.6", "modalities": { "input": [ "text" @@ -34290,65 +33985,84 @@ ] }, "limit": { - "context": 262144, - "output": 4096 + "context": 198000, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "low", + "medium", + "high" + ] + } }, "attachment": false, "open_weights": true, - "knowledge": "2024-12", - "release_date": "2025-09", - "last_updated": "2025-09", + "knowledge": "2025-04", + "release_date": "2025-09-30", + "last_updated": "2025-09-30", "type": "chat" }, { - "id": "Qwen/Qwen2.5-VL-32B-Instruct", - "name": "Qwen 2.5 VL 32B Instruct", - "display_name": "Qwen 2.5 VL 32B Instruct", + "id": "aion-labs-aion-3-0", + "name": "Aion 3.0", + "display_name": "Aion 3.0", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 32000, - "output": 4096 + "context": 128000, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, - "open_weights": true, - "knowledge": "2024-09", - "release_date": "2024-11-01", - "last_updated": "2024-11-01", + "attachment": false, + "open_weights": false, + "release_date": "2026-05-05", + "last_updated": "2026-05-05", "type": "chat" }, { - "id": "Qwen/Qwen3-235B-A22B-Thinking-2507", - "name": "Qwen 3 235B Thinking", - "display_name": "Qwen 3 235B Thinking", + "id": "gemini-3-5-flash", + "name": "Gemini 3.5 Flash", + "display_name": "Gemini 3.5 Flash", "modalities": { "input": [ - "text" + "text", + "image", + "audio", + "video" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 4096 + "context": 1000000, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -34358,54 +34072,53 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "low", + "medium", + "high" ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-12", - "release_date": "2025-07-25", - "last_updated": "2025-07-25", + "attachment": true, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2026-05-19", + "last_updated": "2026-05-19", "type": "chat" }, { - "id": "moonshotai/Kimi-K2-Instruct-0905", - "name": "Kimi K2 Instruct", - "display_name": "Kimi K2 Instruct", + "id": "google-gemma-3-27b-it", + "name": "Google Gemma 3 27B Instruct", + "display_name": "Google Gemma 3 27B Instruct", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 32768, - "output": 4096 + "context": 198000, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, + "attachment": true, "open_weights": true, "knowledge": "2024-08", - "release_date": "2025-09-05", - "last_updated": "2025-09-05", + "release_date": "2025-03-12", + "last_updated": "2025-03-12", "type": "chat" }, { - "id": "moonshotai/Kimi-K2-Thinking", - "name": "Kimi K2 Thinking", - "display_name": "Kimi K2 Thinking", + "id": "hy4-preview", + "name": "Hy4 Preview", + "display_name": "Hy4 Preview", "modalities": { "input": [ "text" @@ -34415,8 +34128,8 @@ ] }, "limit": { - "context": 32768, - "output": 4096 + "context": 1048576, + "output": 64000 }, "temperature": true, "tool_call": true, @@ -34427,38 +34140,37 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "none", + "low", + "high" ] } }, "attachment": false, "open_weights": true, - "knowledge": "2024-08", - "release_date": "2025-11-06", - "last_updated": "2025-11-06", + "release_date": "2026-08-28", + "last_updated": "2026-08-28", "type": "chat" }, { - "id": "openai/gpt-oss-120b", - "name": "GPT-OSS 120B", - "display_name": "GPT-OSS 120B", + "id": "claude-opus-5", + "name": "Claude Opus 5", + "display_name": "Claude Opus 5", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 4096 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -34470,32 +34182,37 @@ "effort_options": [ "low", "medium", - "high" + "high", + "xhigh", + "max" ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-10", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "attachment": true, + "open_weights": false, + "knowledge": "2026-05", + "release_date": "2026-07-24", + "last_updated": "2026-07-24", "type": "chat" }, { - "id": "openai/gpt-oss-20b", - "name": "GPT-OSS 20B", - "display_name": "GPT-OSS 20B", + "id": "gemini-3-6-flash", + "name": "Gemini 3.6 Flash", + "display_name": "Gemini 3.6 Flash", "modalities": { "input": [ - "text" + "text", + "image", + "audio", + "video" ], "output": [ "text" ] }, "limit": { - "context": 64000, - "output": 4096 + "context": 1000000, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -34503,66 +34220,60 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "low", - "medium", - "high" - ] - } - }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-10", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "attachment": true, + "open_weights": false, + "knowledge": "2026-03", + "release_date": "2026-07-21", + "last_updated": "2026-07-21", "type": "chat" }, { - "id": "Intel/Qwen3-Coder-480B-A35B-Instruct-int4-mixed-ar", - "name": "Qwen 3 Coder 480B", - "display_name": "Qwen 3 Coder 480B", + "id": "openai-gpt-4o-mini-2024-07-18", + "name": "GPT-4o Mini", + "display_name": "GPT-4o Mini", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 106000, - "output": 4096 + "context": 128000, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-12", - "release_date": "2025-07-22", - "last_updated": "2025-07-22", + "attachment": true, + "open_weights": false, + "knowledge": "2023-09", + "release_date": "2024-07-18", + "last_updated": "2024-07-18", "type": "chat" }, { - "id": "zai-org/GLM-4.6", - "name": "GLM 4.6", - "display_name": "GLM 4.6", + "id": "gemini-3-1-pro-preview", + "name": "Gemini 3.1 Pro Preview", + "display_name": "Gemini 3.1 Pro Preview", "modalities": { "input": [ - "text" + "text", + "image", + "audio", + "video" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 4096 + "context": 1000000, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -34572,39 +34283,38 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ - "none", "low", "medium", "high" ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-10", - "release_date": "2025-09-30", - "last_updated": "2025-09-30", + "attachment": true, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2026-02-19", + "last_updated": "2026-02-19", "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-R1-0528", - "name": "DeepSeek R1", - "display_name": "DeepSeek R1", + "id": "openai-gpt-56-sol-pro", + "name": "GPT-5.6 Sol Pro", + "display_name": "GPT-5.6 Sol Pro", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -34612,82 +34322,68 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-07", - "release_date": "2025-05-28", - "last_updated": "2025-05-28", + "attachment": true, + "open_weights": false, + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "mistralai/Mistral-Large-Instruct-2411", - "name": "Mistral Large Instruct 2411", - "display_name": "Mistral Large Instruct 2411", + "id": "openai-gpt-56-terra-pro", + "name": "GPT-5.6 Terra Pro", + "display_name": "GPT-5.6 Terra Pro", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-10", - "release_date": "2024-11-18", - "last_updated": "2024-11-18", - "type": "chat" - }, - { - "id": "mistralai/Devstral-Small-2505", - "name": "Devstral Small 2505", - "display_name": "Devstral Small 2505", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 128000, - "output": 4096 + "supported": true, + "default": true }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2024-12", - "release_date": "2025-05-01", - "last_updated": "2025-05-01", + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "mistralai/Magistral-Small-2506", - "name": "Magistral Small 2506", - "display_name": "Magistral Small 2506", + "id": "openai-gpt-52", + "name": "GPT-5.2", + "display_name": "GPT-5.2", "modalities": { "input": [ "text" @@ -34697,53 +34393,37 @@ ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 256000, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2025-06-10", - "last_updated": "2025-06-10", - "type": "chat" - }, - { - "id": "mistralai/Mistral-Nemo-Instruct-2407", - "name": "Mistral Nemo Instruct 2407", - "display_name": "Mistral Nemo Instruct 2407", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 128000, - "output": 4096 + "supported": true, + "default": true }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ] + } }, "attachment": false, - "open_weights": true, - "knowledge": "2024-05", - "release_date": "2024-07-18", - "last_updated": "2024-07-18", + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2025-12-11", + "last_updated": "2025-12-11", "type": "chat" }, { - "id": "meta-llama/Llama-4-Maverick-17B-128E-Instruct-FP8", - "name": "Llama 4 Maverick 17B 128E Instruct", - "display_name": "Llama 4 Maverick 17B 128E Instruct", + "id": "muse-spark-open", + "name": "Muse Spark Open", + "display_name": "Muse Spark Open", "modalities": { "input": [ "text", @@ -34754,25 +34434,36 @@ ] }, "limit": { - "context": 430000, - "output": 4096 + "context": 1048576, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "high", + "xhigh" + ] + } }, "attachment": true, "open_weights": true, - "knowledge": "2024-12", - "release_date": "2025-04-05", - "last_updated": "2025-04-05", + "knowledge": "2026-01-04", + "release_date": "2026-10-15", + "last_updated": "2026-10-15", "type": "chat" }, { - "id": "meta-llama/Llama-3.2-90B-Vision-Instruct", - "name": "Llama 3.2 90B Vision Instruct", - "display_name": "Llama 3.2 90B Vision Instruct", + "id": "kimi-k2-5", + "name": "Kimi K2.5", + "display_name": "Kimi K2.5", "modalities": { "input": [ "text", @@ -34783,25 +34474,43 @@ ] }, "limit": { - "context": 16000, - "output": 4096 + "context": 256000, + "output": 65536 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "none", + "low", + "medium", + "high" + ] + } }, "attachment": true, "open_weights": true, - "knowledge": "2023-12", - "release_date": "2024-09-25", - "last_updated": "2024-09-25", + "knowledge": "2025-01", + "release_date": "2026-01-27", + "last_updated": "2026-01-27", "type": "chat" }, { - "id": "meta-llama/Llama-3.3-70B-Instruct", - "name": "Llama 3.3 70B Instruct", - "display_name": "Llama 3.3 70B Instruct", + "id": "openai-gpt-oss-120b", + "name": "OpenAI GPT OSS 120B", + "display_name": "OpenAI GPT OSS 120B", "modalities": { "input": [ "text" @@ -34812,33 +34521,35 @@ }, "limit": { "context": 128000, - "output": 4096 + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "low", + "medium", + "high" + ] + } }, "attachment": false, "open_weights": true, - "knowledge": "2023-12", - "release_date": "2024-12-06", - "last_updated": "2024-12-06", + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" - } - ] - }, - "requesty": { - "id": "requesty", - "name": "Requesty", - "display_name": "Requesty", - "api": "https://router.requesty.ai/v1", - "doc": "https://requesty.ai/solution/llm-routing/models", - "models": [ + }, { - "id": "glm-5.1", - "name": "GLM-5.1", - "display_name": "GLM-5.1", + "id": "zai-org-glm-5-2", + "name": "GLM 5.2", + "display_name": "GLM 5.2", "modalities": { "input": [ "text" @@ -34848,8 +34559,8 @@ ] }, "limit": { - "context": 200000, - "output": 128000 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -34859,11 +34570,8 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ "none", - "low", - "medium", "high", "max" ] @@ -34871,19 +34579,18 @@ }, "attachment": false, "open_weights": true, - "release_date": "2026-04-07", - "last_updated": "2026-04-07", + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "mimo-v2.5", - "name": "MiMo-V2.5", - "display_name": "MiMo-V2.5", + "id": "qwen-3-8-27b", + "name": "Qwen 3.8 27B", + "display_name": "Qwen 3.8 27B", "modalities": { "input": [ "text", "image", - "audio", "video" ], "output": [ @@ -34891,37 +34598,49 @@ ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 262144, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "low", + "medium", + "xhigh" + ] + } }, "attachment": true, "open_weights": true, - "knowledge": "2024-12", - "release_date": "2026-04-22", - "last_updated": "2026-04-22", + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "glm-5.2-fast", - "name": "glm-5.2-fast", - "display_name": "glm-5.2-fast", + "id": "kimi-k2-6", + "name": "Kimi K2.6", + "display_name": "Kimi K2.6", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 256000, + "output": 65536 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -34929,25 +34648,32 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ "none", "low", "medium", - "high", - "max" + "high" ] } }, - "attachment": false, - "open_weights": false, - "release_date": "2026-07-13", - "last_updated": "2026-07-13", + "attachment": true, + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-04-20", + "last_updated": "2026-04-20", "type": "chat" }, { - "id": "nemotron-3.5-content-safety", - "name": "Nemotron 3.5 Content Safety", - "display_name": "Nemotron 3.5 Content Safety", + "id": "claude-opus-4-5", + "name": "Claude Opus 4.5", + "display_name": "Claude Opus 4.5", "modalities": { "input": [ "text", @@ -34958,31 +34684,47 @@ ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 198000, + "output": 32768 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", "effort_options": [ - "none", "low", "medium", - "high", - "max" + "high" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-06-02", - "last_updated": "2026-06-02", + "open_weights": false, + "knowledge": "2025-05", + "release_date": "2025-11-24", + "last_updated": "2025-11-24", "type": "chat" }, { @@ -34992,8 +34734,7 @@ "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" @@ -35016,6 +34757,7 @@ "low", "medium", "high", + "xhigh", "max" ] } @@ -35028,9 +34770,9 @@ "type": "chat" }, { - "id": "mistral-large-4", - "name": "Mistral Large 4", - "display_name": "Mistral Large 4", + "id": "openai-gpt-6-astra-pro", + "name": "GPT-6 Astra Pro", + "display_name": "GPT-6 Astra Pro", "modalities": { "input": [ "text", @@ -35041,10 +34783,10 @@ ] }, "limit": { - "context": 524288, - "output": 262144 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -35053,40 +34795,39 @@ "extra_capabilities": { "reasoning": { "effort_options": [ - "none", "low", "medium", "high", + "xhigh", "max" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-10-06", - "last_updated": "2026-10-06", + "knowledge": "2026-04-30", + "release_date": "2026-09-04", + "last_updated": "2026-09-04", "type": "chat" }, { - "id": "mimo-v2.6-pro", - "name": "MiMo-V2.6-Pro", - "display_name": "MiMo-V2.6-Pro", + "id": "claude-opus-5-fast", + "name": "Claude Opus 5 Fast", + "display_name": "Claude Opus 5 Fast", "modalities": { "input": [ "text", - "image", - "audio", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -35095,24 +34836,25 @@ "extra_capabilities": { "reasoning": { "effort_options": [ - "none", "low", "medium", "high", + "xhigh", "max" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "open_weights": false, + "knowledge": "2026-05", + "release_date": "2026-07-24", + "last_updated": "2026-07-24", "type": "chat" }, { - "id": "gpt-5.4-mini", - "name": "GPT-5.4 mini", - "display_name": "GPT-5.4 mini", + "id": "openai-gpt-53-codex", + "name": "GPT-5.3 Codex", + "display_name": "GPT-5.3 Codex", "modalities": { "input": [ "text", @@ -35130,163 +34872,118 @@ "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", "effort_options": [ "none", "low", "medium", "high", "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + ] } }, "attachment": true, "open_weights": false, "knowledge": "2025-08-31", - "release_date": "2026-03-17", - "last_updated": "2026-03-17", + "release_date": "2026-02-05", + "last_updated": "2026-02-05", "type": "chat" }, { - "id": "claude-opus-4-7", - "name": "Claude Opus 4.7", - "display_name": "Claude Opus 4.7", + "id": "zai-org-glm-5-1", + "name": "GLM 5.1", + "display_name": "GLM 5.1", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 200000, + "output": 80000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], "interleaved": true, "summaries": true, - "visibility": "omitted", + "visibility": "summary", "continuation": [ "thinking_blocks" ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." + "effort_options": [ + "none", + "low", + "medium", + "high" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-04-16", - "last_updated": "2026-04-16", + "attachment": false, + "open_weights": true, + "release_date": "2026-04-07", + "last_updated": "2026-04-07", "type": "chat" }, { - "id": "claude-sonnet-4-5", - "name": "Claude Sonnet 4.5 (latest)", - "display_name": "Claude Sonnet 4.5 (latest)", + "id": "seed-2-1-turbo", + "name": "Seed 2.1 Turbo", + "display_name": "Seed 2.1 Turbo", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 64000 + "context": 256000, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." - ] - } + "default": true }, "attachment": true, "open_weights": false, - "knowledge": "2025-07-31", - "release_date": "2025-09-29", - "last_updated": "2025-09-29", + "release_date": "2026-06-23", + "last_updated": "2026-06-23", "type": "chat" }, { - "id": "gemini-3-pro-image", - "name": "Nano Banana Pro", - "display_name": "Nano Banana Pro", + "id": "google-gemma-4-31b-it", + "name": "Google Gemma 4 31B Instruct", + "display_name": "Google Gemma 4 31B Instruct", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ - "text", - "image" + "text" ] }, "limit": { - "context": 1048576, - "output": 32768 + "context": 256000, + "output": 8192 }, "temperature": true, "tool_call": true, @@ -35296,126 +34993,95 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ + "effort_options": [ + "none", "low", + "medium", "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" ] } }, "attachment": true, - "open_weights": false, + "open_weights": true, "knowledge": "2025-01", - "release_date": "2026-05-28", - "last_updated": "2026-05-28" + "release_date": "2026-04-02", + "last_updated": "2026-04-02", + "type": "chat" }, { - "id": "gpt-5.6-sol", - "name": "GPT-5.6 Sol", - "display_name": "GPT-5.6 Sol", + "id": "mistral-small-3-2-24b-instruct", + "name": "Mistral Small 3.2 24B Instruct", + "display_name": "Mistral Small 3.2 24B Instruct", "modalities": { "input": [ - "text", "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 256000, + "output": 16384 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "open_weights": true, + "knowledge": "2023-10-31", + "release_date": "2025-06-20", + "last_updated": "2025-06-20", "type": "chat" }, { - "id": "ling-2.6-flash", - "name": "ling-2.6-flash", - "display_name": "ling-2.6-flash", + "id": "gemma-4-uncensored", + "name": "Gemma 4 Uncensored", + "display_name": "Gemma 4 Uncensored", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 256000, + "output": 8192 }, "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, - "open_weights": false, - "release_date": "2026-04-21", - "last_updated": "2026-04-21", + "attachment": true, + "open_weights": true, + "release_date": "2026-04-13", + "last_updated": "2026-06-11", "type": "chat" }, { - "id": "step-5-preview", - "name": "Step 5 Preview", - "display_name": "Step 5 Preview", + "id": "kimi-k3-fast-api", + "name": "Kimi K3 Fast", + "display_name": "Kimi K3 Fast", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 1000000, + "output": 131072 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -35426,7 +35092,6 @@ "effort_options": [ "none", "low", - "medium", "high", "max" ] @@ -35434,27 +35099,28 @@ }, "attachment": true, "open_weights": true, - "release_date": "2026-09-16", - "last_updated": "2026-09-20", + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" }, { - "id": "deepseek-v4-flash", - "name": "DeepSeek V4 Flash", - "display_name": "DeepSeek V4 Flash", + "id": "kimi-k3-1-pro", + "name": "Kimi K3.1 Pro", + "display_name": "Kimi K3.1 Pro", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, + "context": 1000000, "output": 131072 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -35462,42 +35128,28 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", "effort_options": [ + "none", "low", "high", "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "attachment": true, + "open_weights": false, + "release_date": "2026-10-23", + "last_updated": "2026-10-23", "type": "chat" }, { - "id": "grok-4.3", - "name": "Grok 4.3", - "display_name": "Grok 4.3", + "id": "openai-gpt-55", + "name": "GPT-5.5", + "display_name": "GPT-5.5", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" @@ -35505,9 +35157,9 @@ }, "limit": { "context": 1000000, - "output": 30000 + "output": 131072 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -35515,37 +35167,38 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ "none", "low", "medium", "high", - "max" + "xhigh" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-04-17", - "last_updated": "2026-04-17", + "knowledge": "2025-12-01", + "release_date": "2026-04-23", + "last_updated": "2026-04-23", "type": "chat" }, { - "id": "hy3", - "name": "Hy3", - "display_name": "Hy3", + "id": "grok-4-5", + "name": "Grok 4.5", + "display_name": "Grok 4.5", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 500000, + "output": 32000 }, "temperature": true, "tool_call": true, @@ -35555,38 +35208,34 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ - "none", "low", "medium", - "high", - "max" + "high" ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-07-06", - "last_updated": "2026-07-06", + "attachment": true, + "open_weights": false, + "release_date": "2026-07-08", + "last_updated": "2026-07-08", "type": "chat" }, { - "id": "gpt-5.5-pro", - "name": "GPT-5.5 Pro", - "display_name": "GPT-5.5 Pro", + "id": "claude-sonnet-5-5", + "name": "Claude Sonnet 5.5", + "display_name": "Claude Sonnet 5.5", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1050000, + "context": 1000000, "output": 128000 }, "temperature": false, @@ -35597,27 +35246,26 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ - "none", "low", "medium", "high", + "xhigh", "max" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-12-01", - "release_date": "2026-04-23", - "last_updated": "2026-04-23", + "knowledge": "2026-06", + "release_date": "2026-09-28", + "last_updated": "2026-09-28", "type": "chat" }, { - "id": "grok-4.5", - "name": "Grok 4.5", - "display_name": "Grok 4.5", + "id": "grok-4-20", + "name": "Grok 4.20", + "display_name": "Grok 4.20", "modalities": { "input": [ "text", @@ -35628,51 +35276,39 @@ ] }, "limit": { - "context": 500000, - "output": 500000 + "context": 2000000, + "output": 128000 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "none", - "low", - "medium", - "high", - "max" - ] - } - }, "attachment": true, "open_weights": false, - "release_date": "2026-07-08", - "last_updated": "2026-07-08", + "release_date": "2026-03-12", + "last_updated": "2026-06-11", "type": "chat" }, { - "id": "nvidia-nemotron-3-ultra", - "name": "Nemotron 3 Ultra 550B A55B", - "display_name": "Nemotron 3 Ultra 550B A55B", + "id": "openai-gpt-54", + "name": "GPT-5.4", + "display_name": "GPT-5.4", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, + "context": 1000000, "output": 131072 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, "default": true @@ -35684,21 +35320,21 @@ "low", "medium", "high", - "max" + "xhigh" ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-09", - "release_date": "2026-06-04", - "last_updated": "2026-06-04", + "attachment": true, + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-03-05", + "last_updated": "2026-03-05", "type": "chat" }, { - "id": "qwen3.7-plus", - "name": "Qwen3.7 Plus", - "display_name": "Qwen3.7 Plus", + "id": "z-ai-glm-5-3-flash", + "name": "GLM 5.3 Flash", + "display_name": "GLM 5.3 Flash", "modalities": { "input": [ "text", @@ -35719,112 +35355,60 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "none", - "low", - "medium", - "high", - "max" - ] - } - }, "attachment": true, - "open_weights": false, - "knowledge": "2025-04", - "release_date": "2026-06-02", - "last_updated": "2026-06-02", - "type": "chat" - }, - { - "id": "ling-2.6-1t", - "name": "ling-2.6-1t", - "display_name": "ling-2.6-1t", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 262144, - "output": 262144 - }, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": false, - "release_date": "2026-04-23", - "last_updated": "2026-04-23", + "open_weights": true, + "release_date": "2026-08-26", + "last_updated": "2026-08-26", "type": "chat" }, { - "id": "nemotron-3-nano-omni-30b-a3b-reasoning", - "name": "Nemotron 3 Nano Omni 30B A3B Reasoning", - "display_name": "Nemotron 3 Nano Omni 30B A3B Reasoning", + "id": "minimax-m3-preview", + "name": "MiniMax M3 Preview", + "display_name": "MiniMax M3 Preview", "modalities": { "input": [ "text", "image", - "video", - "audio" + "video" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 20480 + "context": 524288, + "output": 65536 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "none", - "low", - "medium", - "high", - "max" - ] - } - }, "attachment": true, "open_weights": true, - "release_date": "2026-04-28", - "last_updated": "2026-04-28", + "release_date": "2026-06-12", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "laguna-m.1", - "name": "Laguna M.1", - "display_name": "Laguna M.1", + "id": "openai-gpt-56-terra", + "name": "GPT-5.6 Terra", + "display_name": "GPT-5.6 Terra", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 32768, - "output": 32768 + "context": 1000000, + "output": 128000 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { "supported": true, "default": true @@ -35836,24 +35420,27 @@ "low", "medium", "high", + "xhigh", "max" ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-04-28", - "last_updated": "2026-06-13", + "attachment": true, + "open_weights": false, + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "qwen3.8-flash-next", - "name": "Qwen3.8 Flash Next", - "display_name": "Qwen3.8 Flash Next", + "id": "muse-wonder", + "name": "Muse Wonder", + "display_name": "Muse Wonder", "modalities": { "input": [ "text", "image", + "audio", "video" ], "output": [ @@ -35861,10 +35448,9 @@ ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1048576, + "output": 131072 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -35882,30 +35468,29 @@ } }, "attachment": true, - "open_weights": true, - "release_date": "2026-08-27", - "last_updated": "2026-08-27", + "open_weights": false, + "release_date": "2026-10-12", + "last_updated": "2026-10-15", "type": "chat" }, { - "id": "qwen3.5-35b-a3b", - "name": "Qwen3.5 35B-A3B", - "display_name": "Qwen3.5 35B-A3B", + "id": "claude-sonnet-5", + "name": "Claude Sonnet 5", + "display_name": "Claude Sonnet 5", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 1000000, + "output": 64000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -35914,101 +35499,83 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ - "none", "low", "medium", "high", + "xhigh", "max" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-02-23", - "last_updated": "2026-02-23", + "open_weights": false, + "knowledge": "2026-01-31", + "release_date": "2026-06-30", + "last_updated": "2026-06-30", "type": "chat" }, { - "id": "mistral-medium-3-5", - "name": "Mistral Medium 3.5", - "display_name": "Mistral Medium 3.5", + "id": "qwen3-next-80b", + "name": "Qwen 3 Next 80b", + "display_name": "Qwen 3 Next 80b", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 209715 + "context": 256000, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "high", - "max" - ] - } + "supported": false }, - "attachment": true, - "open_weights": false, - "release_date": "2026-04-30", - "last_updated": "2026-04-30", + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-09", + "last_updated": "2025-09", "type": "chat" }, { - "id": "claude-haiku-4-5", - "name": "Claude Haiku 4.5 (latest)", - "display_name": "Claude Haiku 4.5 (latest)", + "id": "deepseek-v4-pro", + "name": "DeepSeek V4 Pro", + "display_name": "DeepSeek V4 Pro", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 1000000, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "high", + "max" + ], "interleaved": true, "summaries": true, "visibility": "summary", @@ -36016,22 +35583,21 @@ "thinking_blocks" ], "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-02-28", - "release_date": "2025-10-15", - "last_updated": "2025-10-15", + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "gpt-5.4-nano", - "name": "GPT-5.4 nano", - "display_name": "GPT-5.4 nano", + "id": "openai-gpt-55-pro", + "name": "GPT-5.5 Pro", + "display_name": "GPT-5.5 Pro", "modalities": { "input": [ "text", @@ -36042,63 +35608,48 @@ ] }, "limit": { - "context": 400000, + "context": 1000000, "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", "effort_options": [ - "none", - "low", "medium", "high", "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-17", - "last_updated": "2026-03-17", + "knowledge": "2025-12-01", + "release_date": "2026-04-23", + "last_updated": "2026-04-23", "type": "chat" }, { - "id": "kimi-k2.7-code", - "name": "Kimi K2.7 Code", - "display_name": "Kimi K2.7 Code", + "id": "deepseek-v3.2", + "name": "DeepSeek V3.2", + "display_name": "DeepSeek V3.2", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 160000, + "output": 32768 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -36111,27 +35662,26 @@ "none", "low", "medium", - "high", - "max" + "high" ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-06-12", - "last_updated": "2026-06-12", + "knowledge": "2024-07", + "release_date": "2025-12-01", + "last_updated": "2025-12-01", "type": "chat" }, { - "id": "claude-sonnet-5-5", - "name": "Claude Sonnet 5.5", - "display_name": "Claude Sonnet 5.5", + "id": "qwen-3-7-max", + "name": "Qwen 3.7 Max", + "display_name": "Qwen 3.7 Max", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" @@ -36139,132 +35689,84 @@ }, "limit": { "context": 1000000, - "output": 128000 + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "high", - "max" - ] - } - }, "attachment": true, "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-09-28", - "last_updated": "2026-09-28", + "release_date": "2026-05-21", + "last_updated": "2026-05-21", "type": "chat" }, { - "id": "gemma-4-31b-it", - "name": "Gemma 4 31B IT", - "display_name": "Gemma 4 31B IT", + "id": "gemini-4-argon", + "name": "Gemini 4 Argon", + "display_name": "Gemini 4 Argon", "modalities": { "input": [ "text", - "image" + "image", + "audio", + "video" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 8192 + "context": 1000000, + "output": 65536 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "none", - "low", - "medium", - "high", - "max" - ] - } - }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "open_weights": false, + "knowledge": "2026-03", + "release_date": "2026-10-13", + "last_updated": "2026-10-13", "type": "chat" }, { - "id": "gpt-5.6-luna", - "name": "GPT-5.6 Luna", - "display_name": "GPT-5.6 Luna", + "id": "aion-labs-aion-3-0-mini", + "name": "Aion 3.0 Mini", + "display_name": "Aion 3.0 Mini", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 128000, + "output": 32768 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } - }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "release_date": "2026-05-14", + "last_updated": "2026-05-14", "type": "chat" }, { - "id": "mistral-medium-latest", - "name": "Mistral Medium (latest)", - "display_name": "Mistral Medium (latest)", + "id": "kimi-k3", + "name": "Kimi K3", + "display_name": "Kimi K3", "modalities": { "input": [ "text", @@ -36275,10 +35777,10 @@ ] }, "limit": { - "context": 131072, + "context": 1000000, "output": 131072 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -36286,10 +35788,10 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ "none", "low", - "medium", "high", "max" ] @@ -36297,74 +35799,54 @@ }, "attachment": true, "open_weights": true, - "release_date": "2026-04-29", - "last_updated": "2026-04-29", + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" }, { - "id": "qwen3.8-max", - "name": "Qwen3.8 Max", - "display_name": "Qwen3.8 Max", + "id": "qwen3-235b-a22b-instruct-2507", + "name": "Qwen 3 235B A22B Instruct 2507", + "display_name": "Qwen 3 235B A22B Instruct 2507", "modalities": { "input": [ - "text", - "image", - "video", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 128000, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "none", - "low", - "medium", - "high", - "max" - ] - } + "supported": false }, - "attachment": true, - "open_weights": false, - "release_date": "2026-08-03", - "last_updated": "2026-08-03", + "attachment": false, + "open_weights": true, + "release_date": "2025-07-21", + "last_updated": "2025-07-21", "type": "chat" }, { - "id": "gemini-4-argon", - "name": "Gemini 4 Argon", - "display_name": "Gemini 4 Argon", + "id": "mercury-3", + "name": "Mercury 3", + "display_name": "Mercury 3", "modalities": { "input": [ - "text", - "image", - "video", - "audio", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 1000000, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -36376,22 +35858,20 @@ "none", "low", "medium", - "high", - "max" + "high" ] } }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-10-13", - "last_updated": "2026-10-13", + "release_date": "2026-10-16", + "last_updated": "2026-10-20", "type": "chat" }, { - "id": "deepseek-v4-pro", - "name": "DeepSeek V4 Pro", - "display_name": "DeepSeek V4 Pro", + "id": "aion-labs-aion-3-5", + "name": "Aion 3.5", + "display_name": "Aion 3.5", "modalities": { "input": [ "text" @@ -36401,58 +35881,36 @@ ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 262144, + "output": 32768 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." - ] - } - }, "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "open_weights": false, + "release_date": "2026-09-23", + "last_updated": "2026-09-23", "type": "chat" }, { - "id": "nemotron-3.5-lightning-30b-a3b", - "name": "Nemotron 3.5 Lightning 30B A3B", - "display_name": "Nemotron 3.5 Lightning 30B A3B", + "id": "qwen3-6-27b", + "name": "Qwen 3.6 27B", + "display_name": "Qwen 3.6 27B", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1048576, + "context": 256000, "output": 65536 }, "temperature": true, @@ -36467,22 +35925,20 @@ "none", "low", "medium", - "high", - "max" + "high" ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2025-09", - "release_date": "2026-08-11", - "last_updated": "2026-08-11", + "release_date": "2026-04-22", + "last_updated": "2026-04-22", "type": "chat" }, { - "id": "minimax-m3.1-flash", - "name": "MiniMax-M3.1-Flash", - "display_name": "MiniMax-M3.1-Flash", + "id": "minimax-m3-1-flash", + "name": "MiniMax M3.1 Flash", + "display_name": "MiniMax M3.1 Flash", "modalities": { "input": [ "text", @@ -36495,7 +35951,7 @@ }, "limit": { "context": 1000000, - "output": 128000 + "output": 131072 }, "temperature": true, "tool_call": true, @@ -36506,10 +35962,10 @@ "extra_capabilities": { "reasoning": { "effort_options": [ - "none", "low", "medium", "high", + "xhigh", "max" ] } @@ -36521,14 +35977,45 @@ "type": "chat" }, { - "id": "claude-sonnet-5", - "name": "Claude Sonnet 5", - "display_name": "Claude Sonnet 5", + "id": "gemini-3-7-flash", + "name": "Gemini 3.7 Flash", + "display_name": "Gemini 3.7 Flash", "modalities": { "input": [ "text", "image", - "pdf" + "audio", + "video" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1000000, + "output": 65536 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "attachment": true, + "open_weights": false, + "knowledge": "2026-03", + "release_date": "2026-08-13", + "last_updated": "2026-08-13", + "type": "chat" + }, + { + "id": "claude-opus-4-8-fast", + "name": "Claude Opus 4.8 Fast", + "display_name": "Claude Opus 4.8 Fast", + "modalities": { + "input": [ + "text", + "image" ], "output": [ "text" @@ -36542,34 +36029,50 @@ "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "high", "effort_options": [ - "none", "low", "medium", "high", + "xhigh", "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-30", - "last_updated": "2026-06-30", + "knowledge": "2026-01", + "release_date": "2026-05-28", + "last_updated": "2026-05-28", "type": "chat" }, { - "id": "deepseek-v4-pro-0813", - "name": "DeepSeek V4 Pro 0813", - "display_name": "DeepSeek V4 Pro 0813", + "id": "qwen-3-8-max", + "name": "Qwen 3.8 Max", + "display_name": "Qwen 3.8 Max", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" @@ -36585,43 +36088,56 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "none", - "low", - "medium", - "high", - "max" - ] - } + "attachment": true, + "open_weights": false, + "release_date": "2026-07-19", + "last_updated": "2026-07-19", + "type": "chat" + }, + { + "id": "hermes-3-llama-3.1-405b", + "name": "Hermes 3 Llama 3.1 405b", + "display_name": "Hermes 3 Llama 3.1 405b", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 128000, + "output": 16384 + }, + "temperature": true, + "tool_call": false, + "reasoning": { + "supported": false }, "attachment": false, "open_weights": true, - "release_date": "2026-08-13", - "last_updated": "2026-08-22", + "knowledge": "2023-12-31", + "release_date": "2024-08-16", + "last_updated": "2024-08-16", "type": "chat" }, { - "id": "seed-2.0-code", - "name": "Seed 2.0 Code", - "display_name": "Seed 2.0 Code", + "id": "olafangensan-glm-4.7-flash-heretic", + "name": "GLM 4.7 Flash Heretic", + "display_name": "GLM 4.7 Flash Heretic", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 131072 + "context": 200000, + "output": 24000 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -36633,38 +36149,34 @@ "none", "low", "medium", - "high", - "max" + "high" ] } }, - "attachment": true, - "open_weights": false, - "release_date": "2026-02-14", - "last_updated": "2026-02-14", + "attachment": false, + "open_weights": true, + "release_date": "2026-02-04", + "last_updated": "2026-06-11", "type": "chat" }, { - "id": "gemini-3.5-flash", - "name": "Gemini 3.5 Flash", - "display_name": "Gemini 3.5 Flash", + "id": "openai-gpt-61-sol", + "name": "GPT-6.1 Sol", + "display_name": "GPT-6.1 Sol", "modalities": { "input": [ "text", - "image", - "video", - "audio", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65535 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -36672,46 +36184,37 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", + "effort_options": [ "low", "medium", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" + "high", + "xhigh", + "max" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-05-19", - "last_updated": "2026-05-19", + "knowledge": "2026-04-30", + "release_date": "2026-09-29", + "last_updated": "2026-09-29", "type": "chat" }, { - "id": "gpt-5.6-terra", - "name": "GPT-5.6 Terra", - "display_name": "GPT-5.6 Terra", + "id": "openai-gpt-56-luna-pro", + "name": "GPT-5.6 Luna Pro", + "display_name": "GPT-5.6 Luna Pro", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1050000, + "context": 1000000, "output": 128000 }, "temperature": false, @@ -36722,25 +36225,13 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", "effort_options": [ - "none", "low", "medium", "high", "xhigh", "max" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + ] } }, "attachment": true, @@ -36751,21 +36242,23 @@ "type": "chat" }, { - "id": "devstral-latest", - "name": "devstral-latest", - "display_name": "devstral-latest", + "id": "deepseek-v4-1-flash-1017", + "name": "DeepSeek v4.1 Flash (1017)", + "display_name": "DeepSeek v4.1 Flash (1017)", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 256000 + "context": 1000000, + "output": 131072 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -36776,61 +36269,74 @@ "effort_options": [ "none", "low", - "medium", "high", "max" ] } }, - "attachment": false, - "open_weights": false, - "release_date": "2026-05-27", - "last_updated": "2026-05-27", + "attachment": true, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-10-17", + "last_updated": "2026-10-17", "type": "chat" }, { - "id": "kat-coder-pro", - "name": "kat-coder-pro", - "display_name": "kat-coder-pro", + "id": "openai-gpt-54-pro", + "name": "GPT-5.4 Pro", + "display_name": "GPT-5.4 Pro", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 256000 + "context": 1000000, + "output": 128000 }, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "medium", + "high", + "xhigh" + ] + } + }, + "attachment": true, "open_weights": false, - "release_date": "2026-03-27", - "last_updated": "2026-03-27", + "knowledge": "2025-08-31", + "release_date": "2026-03-05", + "last_updated": "2026-03-05", "type": "chat" }, { - "id": "grok-4.7", - "name": "Grok 4.7", - "display_name": "Grok 4.7", + "id": "z-ai-glm-5v-turbo", + "name": "GLM 5V Turbo", + "display_name": "GLM 5V Turbo", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 500000, - "output": 500000 + "context": 200000, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -36844,35 +36350,31 @@ "none", "low", "medium", - "high", - "max" + "high" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-05", - "release_date": "2026-09-21", - "last_updated": "2026-09-21", + "release_date": "2026-04-01", + "last_updated": "2026-04-01", "type": "chat" }, { - "id": "qwen3.5-27b", - "name": "Qwen3.5 27B", - "display_name": "Qwen3.5 27B", + "id": "zai-org-glm-5", + "name": "GLM 5", + "display_name": "GLM 5", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 198000, + "output": 32000 }, "temperature": true, "tool_call": true, @@ -36893,21 +36395,20 @@ "none", "low", "medium", - "high", - "max" + "high" ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-02-23", - "last_updated": "2026-02-23", + "release_date": "2026-02-12", + "last_updated": "2026-02-12", "type": "chat" }, { - "id": "leanstral-1-5", - "name": "leanstral-1-5", - "display_name": "leanstral-1-5", + "id": "deepseek-v4-pro-0813", + "name": "DeepSeek V4 Pro 0813", + "display_name": "DeepSeek V4 Pro 0813", "modalities": { "input": [ "text" @@ -36917,9 +36418,10 @@ ] }, "limit": { - "context": 262144, + "context": 1000000, "output": 32768 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -36927,37 +36429,36 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ "none", "low", - "medium", "high", "max" ] } }, "attachment": false, - "open_weights": false, - "release_date": "2026-05-27", - "last_updated": "2026-05-27", + "open_weights": true, + "release_date": "2026-08-13", + "last_updated": "2026-08-22", "type": "chat" }, { - "id": "claude-opus-5-5", - "name": "Claude Opus 5.5", - "display_name": "Claude Opus 5.5", + "id": "openai-gpt-61-terra", + "name": "GPT-6.1 Terra", + "display_name": "GPT-6.1 Terra", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, + "context": 1050000, "output": 128000 }, "temperature": false, @@ -36973,36 +36474,38 @@ "low", "medium", "high", + "xhigh", "max" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "knowledge": "2026-06-01", + "release_date": "2026-10-26", + "last_updated": "2026-10-26", "type": "chat" }, { - "id": "gpt-6-sol", - "name": "GPT-6 Sol", - "display_name": "GPT-6 Sol", + "id": "xiaomi-mimo-v2-5", + "name": "MiMo-V2.5", + "display_name": "MiMo-V2.5", "modalities": { "input": [ "text", "image", - "pdf" + "audio", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1000000, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -37014,26 +36517,26 @@ "none", "low", "medium", - "high", - "max" + "high" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-04-20", - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "open_weights": true, + "knowledge": "2024-12", + "release_date": "2026-04-22", + "last_updated": "2026-04-22", "type": "chat" }, { - "id": "seed-2.0-mini", - "name": "Seed 2.0 Mini", - "display_name": "Seed 2.0 Mini", + "id": "xiaomi-mimo-v2-6-flash", + "name": "MiMo-V2.6-Flash", + "display_name": "MiMo-V2.6-Flash", "modalities": { "input": [ "text", "image", + "audio", "video" ], "output": [ @@ -37041,8 +36544,8 @@ ] }, "limit": { - "context": 256000, - "output": 32000 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -37056,34 +36559,33 @@ "none", "low", "medium", - "high", - "max" + "high" ] } }, "attachment": true, - "open_weights": false, - "release_date": "2026-02-14", - "last_updated": "2026-02-14", + "open_weights": true, + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "gpt-5.3-codex", - "name": "GPT-5.3 Codex", - "display_name": "GPT-5.3 Codex", + "id": "qwen3-5-397b-a17b", + "name": "Qwen 3.5 397B", + "display_name": "Qwen 3.5 397B", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 128000, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -37093,39 +36595,68 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ + "none", "low", "medium", "high" - ], - "visibility": "hidden" + ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-05", - "last_updated": "2026-02-05", + "open_weights": true, + "release_date": "2026-02-15", + "last_updated": "2026-02-15", "type": "chat" }, { - "id": "nemotron-3-ultra-550b-a55b", - "name": "Nemotron 3 Ultra 550B A55B", - "display_name": "Nemotron 3 Ultra 550B A55B", + "id": "grok-build-0-1", + "name": "Grok Build 0.1", + "display_name": "Grok Build 0.1", "modalities": { "input": [ + "text", + "image" + ], + "output": [ "text" + ] + }, + "limit": { + "context": 256000, + "output": 65536 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "attachment": true, + "open_weights": false, + "release_date": "2026-04-16", + "last_updated": "2026-04-16", + "type": "chat" + } + ] + }, + "xiaomi-token-plan-sgp": { + "id": "xiaomi-token-plan-sgp", + "name": "Xiaomi Token Plan (Singapore)", + "display_name": "Xiaomi Token Plan (Singapore)", + "api": "https://token-plan-sgp.xiaomimimo.com/v1", + "doc": "https://platform.xiaomimimo.com/#/docs", + "models": [ + { + "id": "mimo-v2.6-pro", + "name": "MiMo-V2.6-Pro", + "display_name": "MiMo-V2.6-Pro", + "modalities": { + "input": [ + "text", + "image", + "audio", + "video" ], "output": [ "text" @@ -37133,7 +36664,7 @@ }, "limit": { "context": 1048576, - "output": 65536 + "output": 131072 }, "temperature": true, "tool_call": true, @@ -37144,30 +36675,29 @@ "extra_capabilities": { "reasoning": { "supported": true, - "effort_options": [ - "none", - "low", - "medium", - "high", - "max" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2025-09", - "release_date": "2026-06-04", - "last_updated": "2026-06-04", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "qwen3.6-plus", - "name": "Qwen3.6 Plus", - "display_name": "Qwen3.6 Plus", + "id": "mimo-v2.6-flash", + "name": "MiMo-V2.6-Flash", + "display_name": "MiMo-V2.6-Flash", "modalities": { "input": [ "text", "image", + "audio", "video" ], "output": [ @@ -37175,8 +36705,8 @@ ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 1048576, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -37192,72 +36722,77 @@ "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "effort_options": [ - "none", - "low", - "medium", - "high", - "max" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-04", - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "open_weights": true, + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "ling-3.0-tiny", - "name": "ling-3.0-tiny", - "display_name": "ling-3.0-tiny", + "id": "mimo-v2.5-tts-voiceclone", + "name": "MiMo-V2.5-TTS-VoiceClone", + "display_name": "MiMo-V2.5-TTS-VoiceClone", "modalities": { "input": [ "text" ], "output": [ - "text" + "audio" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 8192, + "output": 8192 }, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "high", - "max" - ] - } + "attachment": false, + "open_weights": false, + "release_date": "2026-04-22", + "last_updated": "2026-04-22" + }, + { + "id": "mimo-v2.5-tts", + "name": "MiMo-V2.5-TTS", + "display_name": "MiMo-V2.5-TTS", + "modalities": { + "input": [ + "text" + ], + "output": [ + "audio" + ] + }, + "limit": { + "context": 8192, + "output": 8192 + }, + "temperature": false, + "tool_call": false, + "reasoning": { + "supported": false }, "attachment": false, "open_weights": false, - "release_date": "2026-08-05", - "last_updated": "2026-08-05", - "type": "chat" + "release_date": "2026-04-22", + "last_updated": "2026-04-22" }, { - "id": "gemini-3.5-flash-lite", - "name": "Gemini 3.5 Flash Lite", - "display_name": "Gemini 3.5 Flash Lite", + "id": "mimo-v2.5", + "name": "MiMo-V2.5", + "display_name": "MiMo-V2.5", "modalities": { "input": [ "text", "image", - "video", "audio", - "pdf" + "video" ], "output": [ "text" @@ -37265,7 +36800,7 @@ }, "limit": { "context": 1048576, - "output": 65535 + "output": 131072 }, "temperature": true, "tool_call": true, @@ -37276,26 +36811,25 @@ "extra_capabilities": { "reasoning": { "supported": true, - "effort_options": [ - "none", - "low", - "medium", - "high", - "max" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-07-21", - "last_updated": "2026-07-21", + "open_weights": true, + "knowledge": "2024-12", + "release_date": "2026-04-22", + "last_updated": "2026-04-22", "type": "chat" }, { - "id": "glm-5.3", - "name": "GLM-5.3", - "display_name": "GLM-5.3", + "id": "mimo-v2.5-pro", + "name": "MiMo-V2.5-Pro", + "display_name": "MiMo-V2.5-Pro", "modalities": { "input": [ "text" @@ -37306,7 +36840,7 @@ }, "limit": { "context": 1048576, - "output": 1048576 + "output": 131072 }, "temperature": true, "tool_call": true, @@ -37317,25 +36851,60 @@ "extra_capabilities": { "reasoning": { "supported": true, - "effort_options": [ - "none", - "low", - "medium", - "high", - "max" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, "attachment": false, "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "knowledge": "2024-12", + "release_date": "2026-04-22", + "last_updated": "2026-04-22", "type": "chat" }, { - "id": "qwen3.5-2b", - "name": "Qwen3.5 2B", - "display_name": "Qwen3.5 2B", + "id": "mimo-v2.5-tts-voicedesign", + "name": "MiMo-V2.5-TTS-VoiceDesign", + "display_name": "MiMo-V2.5-TTS-VoiceDesign", + "modalities": { + "input": [ + "text" + ], + "output": [ + "audio" + ] + }, + "limit": { + "context": 8192, + "output": 8192 + }, + "temperature": false, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": false, + "release_date": "2026-04-22", + "last_updated": "2026-04-22" + } + ] + }, + "moonshot-ai": { + "id": "moonshot-ai", + "name": "Moonshot AI", + "display_name": "Moonshot AI", + "api": "https://api.moonshot.ai/v1", + "doc": "https://platform.moonshot.ai/docs/api/chat", + "models": [ + { + "id": "kimi-k2.7-code-highspeed", + "name": "Kimi K2.7 Code Highspeed", + "display_name": "Kimi K2.7 Code Highspeed", "modalities": { "input": [ "text", @@ -37348,7 +36917,7 @@ }, "limit": { "context": 262144, - "output": 81920 + "output": 262144 }, "temperature": true, "tool_call": true, @@ -37359,37 +36928,32 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "fixed", "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "effort_options": [ - "none", - "low", - "medium", - "high", - "max" ] } }, "attachment": true, "open_weights": true, - "release_date": "2026-03-02", - "last_updated": "2026-03-02", + "knowledge": "2025-01", + "release_date": "2026-04-21", + "last_updated": "2026-04-21", "type": "chat" }, { - "id": "muse-spark-open", - "name": "Muse Spark Open", - "display_name": "Muse Spark Open", + "id": "kimi-k3.1-pro", + "name": "Kimi K3.1 Pro", + "display_name": "Kimi K3.1 Pro", "modalities": { "input": [ "text", "image", - "video", - "audio" + "video" ], "output": [ "text" @@ -37397,9 +36961,9 @@ }, "limit": { "context": 1048576, - "output": 131072 + "output": 1048576 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -37407,37 +36971,43 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ - "none", "low", - "medium", "high", "max" ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2026-01-04", - "release_date": "2026-10-15", - "last_updated": "2026-10-15", + "open_weights": false, + "release_date": "2026-10-23", + "last_updated": "2026-10-23", "type": "chat" }, { - "id": "deepseek-v4-flash-0731", - "name": "DeepSeek V4 Flash 0731", - "display_name": "DeepSeek V4 Flash 0731", + "id": "kimi-k2.7-code", + "name": "Kimi K2.7 Code", + "display_name": "Kimi K2.7 Code", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, @@ -37448,29 +37018,32 @@ "extra_capabilities": { "reasoning": { "supported": true, - "effort_options": [ - "none", - "low", - "medium", - "high", - "max" + "default_enabled": true, + "mode": "fixed", + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-07-31", - "last_updated": "2026-07-31", + "knowledge": "2025-01", + "release_date": "2026-04-21", + "last_updated": "2026-04-21", "type": "chat" }, { - "id": "nvidia-nemotron-3-super-120b-a12b", - "name": "Nemotron 3 Super 120B A12B", - "display_name": "Nemotron 3 Super 120B A12B", + "id": "kimi-k2.6", + "name": "Kimi K2.6", + "display_name": "Kimi K2.6", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" @@ -37480,7 +37053,7 @@ "context": 262144, "output": 262144 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -37489,30 +37062,30 @@ "extra_capabilities": { "reasoning": { "supported": true, - "effort_options": [ - "none", - "low", - "medium", - "high", - "max" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2025-06", - "release_date": "2026-03-11", - "last_updated": "2026-03-11", + "knowledge": "2025-01", + "release_date": "2026-04-20", + "last_updated": "2026-04-20", "type": "chat" }, { - "id": "fugu-ultra", - "name": "Fugu Ultra", - "display_name": "Fugu Ultra", + "id": "kimi-k3.1-pro-highspeed", + "name": "Kimi K3.1 Pro Highspeed", + "display_name": "Kimi K3.1 Pro Highspeed", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" @@ -37520,7 +37093,7 @@ }, "limit": { "context": 1048576, - "output": 131072 + "output": 1048576 }, "temperature": false, "tool_call": true, @@ -37530,10 +37103,15 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ - "none", "low", - "medium", "high", "max" ] @@ -37541,27 +37119,27 @@ }, "attachment": true, "open_weights": false, - "release_date": "2026-06-15", - "last_updated": "2026-06-15", + "release_date": "2026-10-23", + "last_updated": "2026-10-23", "type": "chat" }, { - "id": "gpt-6.1-sol", - "name": "GPT-6.1 Sol", - "display_name": "GPT-6.1 Sol", + "id": "kimi-k3", + "name": "Kimi K3", + "display_name": "Kimi K3", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1048576, + "output": 1048576 }, "temperature": false, "tool_call": true, @@ -37571,26 +37149,39 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ - "none", "low", - "medium", "high", "max" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-04-30", - "release_date": "2026-09-29", - "last_updated": "2026-09-29", + "open_weights": true, + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" - }, + } + ] + }, + "deepseek": { + "id": "deepseek", + "name": "DeepSeek", + "display_name": "DeepSeek", + "api": "https://api.deepseek.com", + "doc": "https://api-docs.deepseek.com/quick_start/pricing", + "models": [ { - "id": "seed-1.8", - "name": "Seed 1.8", - "display_name": "Seed 1.8", + "id": "deepseek-v4-flash", + "name": "DeepSeek V4 Flash", + "display_name": "DeepSeek V4 Flash", "modalities": { "input": [ "text", @@ -37601,8 +37192,8 @@ ] }, "limit": { - "context": 256000, - "output": 64000 + "context": 1048576, + "output": 393216 }, "temperature": true, "tool_call": true, @@ -37612,94 +37203,95 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", "effort_options": [ - "none", "low", - "medium", "high", "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, "attachment": true, - "open_weights": false, - "release_date": "2025-12-28", - "last_updated": "2025-12-28", + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-10-17", + "last_updated": "2026-10-17", "type": "chat" }, { - "id": "claude-opus-4-5", - "name": "Claude Opus 4.5 (latest)", - "display_name": "Claude Opus 4.5 (latest)", + "id": "deepseek-flash", + "name": "DeepSeek V4.1 Flash", + "display_name": "DeepSeek V4.1 Flash", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 1000000, + "output": 384000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high" - ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" ], - "notes": [ - "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." + "effort_options": [ + "low", + "high", + "max" ] } }, "attachment": true, - "open_weights": false, + "open_weights": true, "knowledge": "2025-05", - "release_date": "2025-11-24", - "last_updated": "2025-11-24", + "release_date": "2026-09-10", + "last_updated": "2026-09-10", "type": "chat" }, { - "id": "qwen3.7-max", - "name": "Qwen3.7 Max", - "display_name": "Qwen3.7 Max", + "id": "deepseek-v4-flash-vision-exp", + "name": "DeepSeek V4 Flash Vision Exp", + "display_name": "DeepSeek V4 Flash Vision Exp", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 1000000, + "output": 384000 }, "temperature": true, "tool_call": true, @@ -37710,25 +37302,95 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", "effort_options": [ - "none", "low", - "medium", "high", "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, - "attachment": false, - "open_weights": false, - "release_date": "2026-05-21", - "last_updated": "2026-05-21", + "attachment": true, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-08-21", + "last_updated": "2026-08-21", "type": "chat" }, { - "id": "mistral-small-2603", - "name": "Mistral Small 4", - "display_name": "Mistral Small 4", + "id": "deepseek-v4-pro", + "name": "DeepSeek V4 Pro", + "display_name": "DeepSeek V4 Pro", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1048576, + "output": 393216 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "high", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." + ] + } + }, + "attachment": false, + "open_weights": true, + "release_date": "2026-08-13", + "last_updated": "2026-08-22", + "type": "chat" + } + ] + }, + "kimi-code-plan-global": { + "id": "kimi-code-plan-global", + "name": "Kimi For Coding (kimi.ai)", + "display_name": "Kimi For Coding (kimi.ai)", + "api": "https://api.kimi.ai/coding/v1", + "doc": "https://www.kimi.ai/code/docs/en/kimi-code/models.html", + "models": [ + { + "id": "k3-256k", + "name": "Kimi K3-256K", + "display_name": "Kimi K3-256K", "modalities": { "input": [ "text", @@ -37739,10 +37401,10 @@ ] }, "limit": { - "context": 256000, - "output": 256000 + "context": 262144, + "output": 131072 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -37750,10 +37412,16 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ "none", "low", - "medium", "high", "max" ] @@ -37761,32 +37429,29 @@ }, "attachment": true, "open_weights": true, - "knowledge": "2025-06", - "release_date": "2026-03-16", - "last_updated": "2026-03-16", + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" }, { - "id": "gemini-3.1-pro-preview", - "name": "Gemini 3.1 Pro Preview", - "display_name": "Gemini 3.1 Pro Preview", + "id": "kimi-for-coding-highspeed", + "name": "Kimi For Coding HighSpeed", + "display_name": "Kimi For Coding HighSpeed", "modalities": { "input": [ "text", "image", - "video", - "audio", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65535 + "context": 262144, + "output": 32768 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -37795,38 +37460,30 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "low", - "high" - ], + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" ] } }, "attachment": true, - "open_weights": false, + "open_weights": true, "knowledge": "2025-01", - "release_date": "2026-02-19", - "last_updated": "2026-02-19", + "release_date": "2026-06-12", + "last_updated": "2026-06-12", "type": "chat" }, { - "id": "muse-spark-1.3", - "name": "Muse Spark 1.3", - "display_name": "Muse Spark 1.3", + "id": "k3.1-pro-highspeed", + "name": "Kimi K3.1 Pro Highspeed", + "display_name": "Kimi K3.1 Pro Highspeed", "modalities": { "input": [ "text", "image", - "video", - "pdf", - "audio" + "video" ], "output": [ "text" @@ -37834,9 +37491,9 @@ }, "limit": { "context": 1048576, - "output": 943718 + "output": 131072 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -37845,10 +37502,14 @@ "extra_capabilities": { "reasoning": { "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ - "none", "low", - "medium", "high", "max" ] @@ -37856,74 +37517,66 @@ }, "attachment": true, "open_weights": false, - "release_date": "2026-09-02", - "last_updated": "2026-09-02", + "release_date": "2026-10-23", + "last_updated": "2026-10-23", "type": "chat" }, { - "id": "gpt-5.4", - "name": "GPT-5.4", - "display_name": "GPT-5.4", + "id": "kimi-for-coding", + "name": "kimi-for-coding", + "display_name": "kimi-for-coding", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1048576, + "output": 32768 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ "none", "low", - "medium", "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "max" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-05", - "last_updated": "2026-03-05", + "release_date": "2026-09-11", + "last_updated": "2026-09-11", "type": "chat" }, { - "id": "muse-wonder-1.0", - "name": "Muse Wonder", - "display_name": "Muse Wonder", + "id": "k3", + "name": "Kimi K3", + "display_name": "Kimi K3", "modalities": { "input": [ "text", "image", - "video", - "pdf", - "audio" + "video" ], "output": [ "text" @@ -37931,9 +37584,9 @@ }, "limit": { "context": 1048576, - "output": 943718 + "output": 131072 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -37941,25 +37594,31 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ "none", "low", - "medium", "high", "max" ] } }, "attachment": true, - "open_weights": false, - "release_date": "2026-10-12", - "last_updated": "2026-10-12", + "open_weights": true, + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" }, { - "id": "kimi-k2.6", - "name": "Kimi K2.6", - "display_name": "Kimi K2.6", + "id": "k3.1-pro", + "name": "Kimi K3.1 Pro", + "display_name": "Kimi K3.1 Pro", "modalities": { "input": [ "text", @@ -37971,10 +37630,10 @@ ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1048576, + "output": 131072 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -37983,33 +37642,42 @@ "extra_capabilities": { "reasoning": { "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ - "none", "low", - "medium", "high", "max" ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-20", - "last_updated": "2026-04-20", + "open_weights": false, + "release_date": "2026-10-23", + "last_updated": "2026-10-23", "type": "chat" - }, + } + ] + }, + "modal": { + "id": "modal", + "name": "Modal", + "display_name": "Modal", + "api": "https://inference.us-west.modal.direct/v1", + "doc": "https://modal.com/docs/guide/endpoints", + "models": [ { - "id": "gemini-3.8-flash", - "name": "Gemini 3.8 Flash", - "display_name": "Gemini 3.8 Flash", + "id": "moonshotai/Kimi-K3", + "name": "Kimi K3", + "display_name": "Kimi K3", "modalities": { "input": [ "text", - "image", - "video", - "audio", - "pdf" + "image" ], "output": [ "text" @@ -38017,9 +37685,9 @@ }, "limit": { "context": 1048576, - "output": 65535 + "output": 131072 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -38028,43 +37696,37 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", - "low", - "medium", - "high" - ], + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" ] } }, "attachment": true, - "open_weights": false, - "release_date": "2026-09-02", - "last_updated": "2026-09-02", + "open_weights": true, + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" }, { - "id": "qwen3.8-2.4T-A95B", - "name": "Qwen3.8 2.4T A95B", - "display_name": "Qwen3.8 2.4T A95B", + "id": "nvidia/GLM-5.3-Flash-NVFP4", + "name": "GLM-5.3-Flash", + "display_name": "GLM-5.3-Flash", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -38075,30 +37737,35 @@ "extra_capabilities": { "reasoning": { "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ - "none", "low", - "medium", "high", "max" ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-08-12", - "last_updated": "2026-08-12", + "release_date": "2026-08-26", + "last_updated": "2026-08-26", "type": "chat" }, { - "id": "kimi-k3", - "name": "Kimi K3", - "display_name": "Kimi K3", + "id": "meta-models/Muse-Spark-Open-816B-A42B", + "name": "Muse Spark Open", + "display_name": "Muse Spark Open", "modalities": { "input": [ "text", "image", - "video" + "video", + "audio" ], "output": [ "text" @@ -38106,9 +37773,9 @@ }, "limit": { "context": 1048576, - "output": 262144 + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -38117,40 +37784,44 @@ "extra_capabilities": { "reasoning": { "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ - "none", "low", "medium", "high", - "max" + "xhigh" ] } }, "attachment": true, "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-16", + "knowledge": "2026-01-04", + "release_date": "2026-10-15", + "last_updated": "2026-10-15", "type": "chat" }, { - "id": "kimi-k3.1-pro-highspeed", - "name": "Kimi K3.1 Pro Highspeed", - "display_name": "Kimi K3.1 Pro Highspeed", + "id": "Qwen/Qwen3.8-2.4T-A95B", + "name": "Qwen3.8-Max", + "display_name": "Qwen3.8-Max", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 1048576 + "context": 1010000, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -38158,40 +37829,45 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ - "none", "low", "medium", - "high", - "max" + "xhigh" ] } }, - "attachment": true, - "open_weights": false, - "release_date": "2026-10-23", - "last_updated": "2026-10-23", + "attachment": false, + "open_weights": true, + "release_date": "2026-08-12", + "last_updated": "2026-08-12", "type": "chat" }, { - "id": "claude-fable-5.1", - "name": "Claude Fable 5.1", - "display_name": "Claude Fable 5.1", + "id": "thinkingmachines/Inkling-NVFP4", + "name": "Inkling", + "display_name": "Inkling", "modalities": { "input": [ "text", "image", - "pdf" + "audio" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 1048576, + "output": 262144 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -38200,69 +37876,70 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], "interleaved": true, "summaries": true, - "visibility": "omitted", + "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", - "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", - "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-09-01", - "last_updated": "2026-09-01", + "open_weights": true, + "release_date": "2026-07-15", + "last_updated": "2026-07-15", "type": "chat" }, { - "id": "grok-4.2-beta", - "name": "Grok 4.20 (Reasoning)", - "display_name": "Grok 4.20 (Reasoning)", + "id": "zai-org/GLM-5.3-Flash", + "name": "GLM 5.3 Flash", + "display_name": "GLM 5.3 Flash", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 2000000, - "output": 30000 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "low", + "high", + "max" + ] + } }, "attachment": true, - "open_weights": false, - "release_date": "2026-03-09", - "last_updated": "2026-03-09", + "open_weights": true, + "release_date": "2026-08-26", + "last_updated": "2026-08-26", "type": "chat" }, { - "id": "nemotron-3-super-120b-a12b", - "name": "Nemotron 3 Super 120B A12B", - "display_name": "Nemotron 3 Super 120B A12B", + "id": "zai-org/GLM-5.3", + "name": "GLM-5.3", + "display_name": "GLM-5.3", "modalities": { "input": [ "text" @@ -38272,8 +37949,8 @@ ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -38283,10 +37960,15 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ - "none", "low", - "medium", "high", "max" ] @@ -38294,15 +37976,69 @@ }, "attachment": false, "open_weights": true, - "knowledge": "2025-06", - "release_date": "2026-03-11", - "last_updated": "2026-03-11", + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "laguna-xs.2", - "name": "Laguna XS.2", - "display_name": "Laguna XS.2", + "id": "deepseek-ai/DeepSeek-V4.1-Flash", + "name": "DeepSeek V4.1 Flash", + "display_name": "DeepSeek V4.1 Flash", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1000000, + "output": 384000 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "low", + "high", + "max" + ] + } + }, + "attachment": true, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-09-10", + "last_updated": "2026-09-10", + "type": "chat" + } + ] + }, + "cline-pass": { + "id": "cline-pass", + "name": "ClinePass", + "display_name": "ClinePass", + "api": "https://api.cline.bot/api/v1", + "doc": "https://docs.cline.bot/getting-started/clinepass", + "models": [ + { + "id": "cline-pass/glm-5.2", + "name": "GLM-5.2", + "display_name": "GLM-5.2", "modalities": { "input": [ "text" @@ -38312,21 +38048,20 @@ ] }, "limit": { - "context": 32768, - "output": 32768 + "context": 1000000, + "output": 131072 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ "none", - "low", - "medium", "high", "max" ] @@ -38334,14 +38069,14 @@ }, "attachment": false, "open_weights": true, - "release_date": "2026-04-28", + "release_date": "2026-06-13", "last_updated": "2026-06-13", "type": "chat" }, { - "id": "nemotron-3-nano-omni", - "name": "nemotron-3-nano-omni", - "display_name": "nemotron-3-nano-omni", + "id": "cline-pass/deepseek-v4-flash", + "name": "DeepSeek V4 Flash", + "display_name": "DeepSeek V4 Flash", "modalities": { "input": [ "text" @@ -38351,9 +38086,10 @@ ] }, "limit": { - "context": 300000, - "output": 300000 + "context": 1000000, + "output": 384000 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -38361,40 +38097,51 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", "effort_options": [ - "none", "low", - "medium", "high", "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, "attachment": false, - "open_weights": false, - "release_date": "2026-05-20", - "last_updated": "2026-05-20", + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "kimi-k3.1-pro", - "name": "Kimi K3.1 Pro", - "display_name": "Kimi K3.1 Pro", + "id": "cline-pass/deepseek-v4.1-flash", + "name": "DeepSeek V4.1 Flash", + "display_name": "DeepSeek V4.1 Flash", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 1048576 + "context": 1000000, + "output": 384000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -38402,74 +38149,86 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ "none", "low", - "medium", "high", "max" ] } }, "attachment": true, - "open_weights": false, - "release_date": "2026-10-23", - "last_updated": "2026-10-23", + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-09-10", + "last_updated": "2026-09-10", "type": "chat" }, { - "id": "grok-build-0.1", - "name": "Grok Build 0.1", - "display_name": "Grok Build 0.1", + "id": "cline-pass/glm-5.3", + "name": "GLM-5.3", + "display_name": "GLM-5.3", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 256000 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "low", + "high", + "max" + ] } }, - "attachment": true, - "open_weights": false, - "release_date": "2026-04-16", - "last_updated": "2026-04-16", + "attachment": false, + "open_weights": true, + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "claude-opus-5", - "name": "Claude Opus 5", - "display_name": "Claude Opus 5", + "id": "cline-pass/mimo-v2.6-pro", + "name": "MiMo-V2.6-Pro", + "display_name": "MiMo-V2.6-Pro", "modalities": { "input": [ "text", "image", - "pdf" + "audio", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 1048576, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -38477,25 +38236,23 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ "none", "low", "medium", "high", - "max" + "xhigh" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-05", - "release_date": "2026-07-24", - "last_updated": "2026-07-24", + "open_weights": true, + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "mimo-v2.5-pro", + "id": "cline-pass/mimo-v2.5-pro", "name": "MiMo-V2.5-Pro", "display_name": "MiMo-V2.5-Pro", "modalities": { @@ -38513,7 +38270,8 @@ "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": false, "open_weights": true, @@ -38523,14 +38281,12 @@ "type": "chat" }, { - "id": "claude-sonnet-4-6", - "name": "Claude Sonnet 4.6", - "display_name": "Claude Sonnet 4.6", + "id": "cline-pass/qwen3.7-max", + "name": "Qwen3.7 Max", + "display_name": "Qwen3.7 Max", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" @@ -38538,57 +38294,34 @@ }, "limit": { "context": 1000000, - "output": 64000 + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." - ] + "supported": true } }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-17", - "last_updated": "2026-03-13", + "release_date": "2026-05-21", + "last_updated": "2026-05-21", "type": "chat" }, { - "id": "gpt-6-astra", - "name": "GPT-6 Astra", - "display_name": "GPT-6 Astra", + "id": "cline-pass/qwen3.8-max", + "name": "Qwen3.8 Max", + "display_name": "Qwen3.8 Max", "modalities": { "input": [ "text", "image", + "video", "pdf" ], "output": [ @@ -38596,10 +38329,10 @@ ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1000000, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -38612,26 +38345,26 @@ "none", "low", "medium", - "high", - "max" + "xhigh" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-04-30", - "release_date": "2026-09-04", - "last_updated": "2026-09-04", + "release_date": "2026-08-03", + "last_updated": "2026-08-03", "type": "chat" }, { - "id": "deepseek-v4.1-flash-1017", - "name": "DeepSeek V4.1 Flash 1017", - "display_name": "DeepSeek V4.1 Flash 1017", + "id": "cline-pass/mimo-v2.5", + "name": "MiMo-V2.5", + "display_name": "MiMo-V2.5", "modalities": { "input": [ "text", - "image" + "image", + "audio", + "video" ], "output": [ "text" @@ -38639,7 +38372,7 @@ }, "limit": { "context": 1048576, - "output": 393216 + "output": 131072 }, "temperature": true, "tool_call": true, @@ -38647,45 +38380,32 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "high", - "max" - ] - } - }, "attachment": true, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-10-17", - "last_updated": "2026-10-17", + "knowledge": "2024-12", + "release_date": "2026-04-22", + "last_updated": "2026-04-22", "type": "chat" }, { - "id": "gemini-3.7-flash", - "name": "Gemini 3.7 Flash", - "display_name": "Gemini 3.7 Flash", + "id": "cline-pass/kimi-k2.7-code", + "name": "Kimi K2.7 Code", + "display_name": "Kimi K2.7 Code", "modalities": { "input": [ "text", "image", - "video", - "audio", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65535 + "context": 262144, + "output": 262144 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -38693,47 +38413,33 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", - "low", - "medium", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] + "supported": true } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-08-13", - "last_updated": "2026-08-13", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-06-12", + "last_updated": "2026-06-12", "type": "chat" }, { - "id": "inkling", - "name": "Inkling", - "display_name": "Inkling", + "id": "cline-pass/kimi-k2.6", + "name": "Kimi K2.6", + "display_name": "Kimi K2.6", "modalities": { "input": [ "text", "image", - "audio" + "video" ], "output": [ "text" ] }, "limit": { - "context": 65536, - "output": 32768 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, @@ -38743,40 +38449,35 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "high", - "max" - ] + "supported": true } }, "attachment": true, "open_weights": true, - "release_date": "2026-07-15", - "last_updated": "2026-07-15", + "knowledge": "2025-01", + "release_date": "2026-04-20", + "last_updated": "2026-04-20", "type": "chat" }, { - "id": "gpt-5.5", - "name": "GPT-5.5", - "display_name": "GPT-5.5", + "id": "cline-pass/minimax-m3", + "name": "MiniMax-M3", + "display_name": "MiniMax-M3", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1048576, + "output": 512000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -38784,39 +38485,25 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "supported": true } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-12-01", - "release_date": "2026-04-23", - "last_updated": "2026-04-23", + "open_weights": true, + "release_date": "2026-06-01", + "last_updated": "2026-06-01", "type": "chat" }, { - "id": "glm-5.2", - "name": "GLM-5.2", - "display_name": "GLM-5.2", + "id": "cline-pass/mimo-v2.6-flash", + "name": "MiMo-V2.6-Flash", + "display_name": "MiMo-V2.6-Flash", "modalities": { "input": [ - "text" + "text", + "image", + "audio", + "video" ], "output": [ "text" @@ -38834,30 +38521,32 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ "none", "low", "medium", "high", - "max" + "xhigh" ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "deepseek-v4.1-flash", - "name": "DeepSeek V4.1 Flash", - "display_name": "DeepSeek V4.1 Flash", + "id": "cline-pass/muse-spark-1.3-contributor", + "name": "Muse Spark 1.3 Contributor", + "display_name": "Muse Spark 1.3 Contributor", "modalities": { "input": [ "text", - "image" + "image", + "video", + "pdf", + "audio" ], "output": [ "text" @@ -38865,7 +38554,7 @@ }, "limit": { "context": 1048576, - "output": 393216 + "output": 131072 }, "temperature": true, "tool_call": true, @@ -38875,32 +38564,28 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ - "none", + "minimal", "low", "medium", "high", - "max" + "xhigh" ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-09-10", - "last_updated": "2026-09-10", + "open_weights": false, + "release_date": "2026-09-02", + "last_updated": "2026-09-02", "type": "chat" }, { - "id": "claude-opus-4-6", - "name": "Claude Opus 4.6", - "display_name": "Claude Opus 4.6", + "id": "cline-pass/deepseek-v4-pro", + "name": "DeepSeek V4 Pro", + "display_name": "DeepSeek V4 Pro", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" @@ -38908,27 +38593,22 @@ }, "limit": { "context": 1000000, - "output": 128000 + "output": 384000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, + "default_enabled": true, + "mode": "effort", "effort": "high", "effort_options": [ "low", - "medium", "high", "max" ], @@ -38939,22 +38619,21 @@ "thinking_blocks" ], "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-05-31", - "release_date": "2026-02-05", - "last_updated": "2026-03-13", + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "minimax-m3", - "name": "MiniMax-M3", - "display_name": "MiniMax-M3", + "id": "cline-pass/qwen3.7-plus", + "name": "Qwen3.7 Plus", + "display_name": "Qwen3.7 Plus", "modalities": { "input": [ "text", @@ -38967,7 +38646,7 @@ }, "limit": { "context": 1000000, - "output": 128000 + "output": 64000 }, "temperature": true, "tool_call": true, @@ -38977,42 +38656,35 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "effort_options": [ - "none", - "low", - "medium", - "high", - "max" - ] + "supported": true } }, "attachment": true, - "open_weights": true, - "release_date": "2026-06-01", - "last_updated": "2026-06-01", + "open_weights": false, + "knowledge": "2025-04", + "release_date": "2026-06-02", + "last_updated": "2026-06-02", "type": "chat" }, { - "id": "glm-5.3-flash", - "name": "GLM-5.3-Flash", - "display_name": "GLM-5.3-Flash", + "id": "cline-pass/kimi-k3", + "name": "Kimi K3", + "display_name": "Kimi K3", "modalities": { "input": [ "text", "image", - "video", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 262144 + "context": 1048576, + "output": 131072 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -39024,7 +38696,6 @@ "effort_options": [ "none", "low", - "medium", "high", "max" ] @@ -39032,25 +38703,28 @@ }, "attachment": true, "open_weights": true, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" }, { - "id": "minimax-m2.7", - "name": "MiniMax-M2.7", - "display_name": "MiniMax-M2.7", + "id": "cline-pass/glm-5.3-flash", + "name": "cline-pass/glm-5.3-flash", + "display_name": "cline-pass/glm-5.3-flash", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 128000 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -39068,41 +38742,45 @@ "thinking_blocks" ], "effort_options": [ - "none", "low", - "medium", "high", "max" ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-03-18", - "last_updated": "2026-03-18", + "release_date": "2026-08-26", + "last_updated": "2026-08-26", "type": "chat" - }, + } + ] + }, + "berget": { + "id": "berget", + "name": "Berget.AI", + "display_name": "Berget.AI", + "api": "https://api.berget.ai/v1", + "doc": "https://api.berget.ai", + "models": [ { - "id": "gemini-3.6-flash", - "name": "Gemini 3.6 Flash", - "display_name": "Gemini 3.6 Flash", + "id": "moonshotai/Kimi-K3", + "name": "Kimi K3", + "display_name": "Kimi K3", "modalities": { "input": [ "text", - "image", - "video", - "audio", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65535 + "context": 327680, + "output": 32768 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -39111,38 +38789,33 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", - "low", - "medium", - "high" - ], + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" + ], + "effort_options": [ + "low", + "high", + "max" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-07-21", - "last_updated": "2026-07-21", + "open_weights": true, + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" }, { - "id": "inkling-256k", - "name": "Inkling 256K", - "display_name": "Inkling 256K", + "id": "Qwen/Qwen3.8-27B-FP8", + "name": "Qwen3.8 27B", + "display_name": "Qwen3.8 27B", "modalities": { "input": [ "text", - "image", - "audio" + "image" ], "output": [ "text" @@ -39150,7 +38823,7 @@ }, "limit": { "context": 262144, - "output": 32768 + "output": 65536 }, "temperature": true, "tool_call": true, @@ -39160,25 +38833,31 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ "none", "low", "medium", - "high", - "max" + "xhigh" ] } }, "attachment": true, "open_weights": true, - "release_date": "2026-07-15", - "last_updated": "2026-07-15", + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "minimax-m2.7-highspeed", - "name": "MiniMax-M2.7-highspeed", - "display_name": "MiniMax-M2.7-highspeed", + "id": "zai-org/GLM-5.2", + "name": "GLM-5.2", + "display_name": "GLM-5.2", "modalities": { "input": [ "text" @@ -39188,8 +38867,8 @@ ] }, "limit": { - "context": 200000, - "output": 128000 + "context": 524288, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -39200,43 +38879,37 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ "none", - "low", - "medium", - "high", - "max" + "high" ] } }, "attachment": false, "open_weights": true, - "release_date": "2026-03-18", - "last_updated": "2026-03-18", + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "ring-2.6-1t", - "name": "ring-2.6-1t", - "display_name": "ring-2.6-1t", + "id": "zai-org/GLM-5.3-Flash", + "name": "GLM-5.3-Flash", + "display_name": "GLM-5.3-Flash", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1048576, + "output": 16384 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -39244,87 +38917,79 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ - "none", "low", - "medium", "high", "max" ] } }, - "attachment": false, - "open_weights": false, - "release_date": "2026-05-08", - "last_updated": "2026-05-08", + "attachment": true, + "open_weights": true, + "release_date": "2026-08-26", + "last_updated": "2026-08-26", "type": "chat" }, { - "id": "gpt-6-luna", - "name": "GPT-6 Luna", - "display_name": "GPT-6 Luna", + "id": "mistralai/Mistral-Small-3.2-24B-Instruct-2506", + "name": "Mistral Small 3.2 24B Instruct 2506", + "display_name": "Mistral Small 3.2 24B Instruct 2506", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 32000, + "output": 8192 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "high", - "max" - ] - } - }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-05-18", - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "attachment": false, + "open_weights": true, + "knowledge": "2025-09", + "release_date": "2025-06-20", + "last_updated": "2025-06-20", "type": "chat" }, { - "id": "gemini-3.1-flash-image", - "name": "Nano Banana 2", - "display_name": "Nano Banana 2", + "id": "google/gemma-4-31B-it", + "name": "Gemma 4 31B Instruct", + "display_name": "Gemma 4 31B Instruct", "modalities": { "input": [ - "text", + "audio", "image", - "video", - "pdf" + "text", + "video" ], "output": [ - "text", - "image" + "text" ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 128000, + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { @@ -39332,27 +38997,36 @@ } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-05-28", - "last_updated": "2026-05-28" - }, + "open_weights": true, + "knowledge": "2025-12", + "release_date": "2026-04-02", + "last_updated": "2026-04-02", + "type": "chat" + } + ] + }, + "tencent-tokenhub": { + "id": "tencent-tokenhub", + "name": "Tencent TokenHub", + "display_name": "Tencent TokenHub", + "api": "https://tokenhub.tencentmaas.com/v1", + "doc": "https://cloud.tencent.com/document/product/1823/130050", + "models": [ { - "id": "grok-4.6", - "name": "Grok 4.6", - "display_name": "Grok 4.6", + "id": "hy3", + "name": "Hy3", + "display_name": "Hy3", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 500000, - "output": 500000 + "context": 256000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -39365,24 +39039,20 @@ "supported": true, "effort_options": [ "none", - "low", - "medium", - "high", - "max" + "high" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-02-01", - "release_date": "2026-08-12", - "last_updated": "2026-08-12", + "attachment": false, + "open_weights": true, + "release_date": "2026-07-06", + "last_updated": "2026-07-06", "type": "chat" }, { - "id": "nemotron-lightning-3.5-30b-a3b", - "name": "nemotron-lightning-3.5-30b-a3b", - "display_name": "nemotron-lightning-3.5-30b-a3b", + "id": "hy4-preview", + "name": "Hy4 preview", + "display_name": "Hy4 preview", "modalities": { "input": [ "text" @@ -39392,9 +39062,10 @@ ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1024000, + "output": 64000 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -39402,25 +39073,23 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ "none", - "low", - "medium", - "high", - "max" + "high" ] } }, "attachment": false, - "open_weights": false, - "release_date": "2026-08-15", - "last_updated": "2026-08-15", + "open_weights": true, + "release_date": "2026-08-28", + "last_updated": "2026-08-28", "type": "chat" }, { - "id": "nemotron-3-ultra-nvfp4", - "name": "nemotron-3-ultra-nvfp4", - "display_name": "nemotron-3-ultra-nvfp4", + "id": "hy3-preview", + "name": "Hy3 preview", + "display_name": "Hy3 preview", "modalities": { "input": [ "text" @@ -39430,9 +39099,10 @@ ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 256000, + "output": 64000 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -39441,91 +39111,83 @@ "extra_capabilities": { "reasoning": { "effort_options": [ - "none", "low", "medium", - "high", - "max" + "high" ] } }, "attachment": false, - "open_weights": false, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "open_weights": true, + "release_date": "2026-04-20", + "last_updated": "2026-04-20", "type": "chat" - }, + } + ] + }, + "lowrouter": { + "id": "lowrouter", + "name": "LowRouter", + "display_name": "LowRouter", + "api": "https://api.lowrouter.ai/v1", + "doc": "https://lowrouter.ai/docs/models/available", + "models": [ { - "id": "claude-opus-4-1", - "name": "Claude Opus 4.1 (latest)", - "display_name": "Claude Opus 4.1 (latest)", + "id": "auto/openai/gpt-6.1-terra", + "name": "GPT-6.1 Terra", + "display_name": "GPT-6.1 Terra", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 32000 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-03-31", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "knowledge": "2026-06-01", + "release_date": "2026-10-26", + "last_updated": "2026-10-26", "type": "chat" }, { - "id": "gemini-3.1-flash-lite", - "name": "Gemini 3.1 Flash Lite", - "display_name": "Gemini 3.1 Flash Lite", + "id": "auto/openai/gpt-oss-20b", + "name": "GPT OSS 20B", + "display_name": "GPT OSS 20B", "modalities": { "input": [ - "text", - "image", - "video", - "audio", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65535 + "context": 131072, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -39537,36 +39199,33 @@ "reasoning": { "supported": true, "effort_options": [ - "none", "low", "medium", - "high", - "max" + "high" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-05-07", - "last_updated": "2026-05-07", + "attachment": false, + "open_weights": true, + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "gemma-4-26b-a4b-it", - "name": "Gemma 4 26B A4B IT", - "display_name": "Gemma 4 26B A4B IT", + "id": "auto/openai/gpt-oss-safeguard-120b", + "name": "GPT OSS Safeguard 120B", + "display_name": "GPT OSS Safeguard 120B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, + "context": 131072, "output": 32768 }, "temperature": true, @@ -39575,44 +39234,31 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "none", - "low", - "medium", - "high", - "max" - ] - } - }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "release_date": "2025-10-29", + "last_updated": "2025-10-29", "type": "chat" }, { - "id": "mimo-v2.6-flash", - "name": "MiMo-V2.6-Flash", - "display_name": "MiMo-V2.6-Flash", + "id": "auto/openai/gpt-5.6-terra", + "name": "GPT-5.6 Terra", + "display_name": "GPT-5.6 Terra", "modalities": { "input": [ "text", "image", - "audio", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -39620,25 +39266,38 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ "none", "low", "medium", "high", + "xhigh", "max" - ] + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, - "open_weights": true, - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "open_weights": false, + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "claude-opus-4-8", - "name": "Claude Opus 4.8", - "display_name": "Claude Opus 4.8", + "id": "auto/openai/gpt-5.4", + "name": "GPT-5.4", + "display_name": "GPT-5.4", "modalities": { "input": [ "text", @@ -39650,10 +39309,10 @@ ] }, "limit": { - "context": 1000000, + "context": 1050000, "output": 128000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -39664,50 +39323,46 @@ "supported": true, "default_enabled": false, "mode": "effort", - "effort": "high", + "effort": "none", "effort_options": [ + "none", "low", "medium", "high", - "xhigh", - "max" + "xhigh" ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." - ] + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2026-01", - "release_date": "2026-05-28", - "last_updated": "2026-05-28", + "knowledge": "2025-08-31", + "release_date": "2026-03-05", + "last_updated": "2026-03-05", "type": "chat" }, { - "id": "seed-2.0-pro", - "name": "Seed 2.0 Pro", - "display_name": "Seed 2.0 Pro", + "id": "auto/openai/gpt-5.6-sol", + "name": "GPT-5.6 Sol", + "display_name": "GPT-5.6 Sol", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 256000, + "context": 1050000, "output": 128000 }, "temperature": false, @@ -39718,109 +39373,120 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ "none", "low", "medium", "high", + "xhigh", "max" - ] + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "release_date": "2026-02-14", - "last_updated": "2026-02-14", + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "qwen3.8-flash", - "name": "Qwen3.8 Flash", - "display_name": "Qwen3.8 Flash", + "id": "auto/openai/gpt-5.4-mini", + "name": "GPT-5.4 mini", + "display_name": "GPT-5.4 mini", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 400000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", "effort_options": [ "none", "low", "medium", "high", - "max" - ] + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", + "knowledge": "2025-08-31", + "release_date": "2026-03-17", + "last_updated": "2026-03-17", "type": "chat" }, { - "id": "step-3.7-flash", - "name": "Step 3.7 Flash", - "display_name": "Step 3.7 Flash", + "id": "auto/openai/gpt-4o", + "name": "GPT-4o", + "display_name": "GPT-4o", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 256000 + "context": 128000, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "high", - "max" - ] - } + "supported": false }, "attachment": true, - "open_weights": true, - "knowledge": "2026-03-01", - "release_date": "2026-05-29", - "last_updated": "2026-05-29", + "open_weights": false, + "knowledge": "2023-09", + "release_date": "2024-05-13", + "last_updated": "2024-08-06", "type": "chat" }, { - "id": "claude-fable-5", - "name": "Claude Fable 5", - "display_name": "Claude Fable 5", + "id": "auto/openai/gpt-5.6-luna", + "name": "GPT-5.6 Luna", + "display_name": "GPT-5.6 Luna", "modalities": { "input": [ "text", @@ -39832,7 +39498,7 @@ ] }, "limit": { - "context": 1000000, + "context": 1050000, "output": 128000 }, "temperature": false, @@ -39846,42 +39512,68 @@ "supported": true, "default_enabled": true, "mode": "effort", - "effort": "high", + "effort": "medium", "effort_options": [ + "none", "low", "medium", "high", "xhigh", "max" ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" ], - "notes": [ - "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", - "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", - "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." - ] + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-09", - "last_updated": "2026-06-09", + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "muse-glimmer-30b", - "name": "Muse Glimmer 30B", - "display_name": "Muse Glimmer 30B", + "id": "auto/openai/gpt-4.1", + "name": "GPT-4.1", + "display_name": "GPT-4.1", "modalities": { "input": [ "text", - "image" + "image", + "pdf" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1047576, + "output": 32768 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": false, + "knowledge": "2024-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", + "type": "chat" + }, + { + "id": "auto/openai/gpt-oss-safeguard-20b", + "name": "GPT OSS Safeguard 20B", + "display_name": "GPT OSS Safeguard 20B", + "modalities": { + "input": [ + "text" ], "output": [ "text" @@ -39889,7 +39581,7 @@ }, "limit": { "context": 131072, - "output": 20480 + "output": 131072 }, "temperature": true, "tool_call": true, @@ -39897,6 +39589,36 @@ "supported": true, "default": true }, + "attachment": false, + "open_weights": true, + "release_date": "2025-10-29", + "last_updated": "2025-10-29", + "type": "chat" + }, + { + "id": "auto/openai/gpt-6-luna", + "name": "GPT-6 Luna", + "display_name": "GPT-6 Luna", + "modalities": { + "input": [ + "text", + "image", + "pdf" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1050000, + "output": 128000 + }, + "temperature": false, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, "extra_capabilities": { "reasoning": { "effort_options": [ @@ -39904,21 +39626,21 @@ "low", "medium", "high", - "max" + "xhigh" ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2026-01-04", - "release_date": "2026-08-10", - "last_updated": "2026-08-10", + "open_weights": false, + "knowledge": "2026-05-18", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "gpt-5.4-pro", - "name": "GPT-5.4 Pro", - "display_name": "GPT-5.4 Pro", + "id": "auto/openai/gpt-5-mini", + "name": "GPT-5 Mini", + "display_name": "GPT-5 Mini", "modalities": { "input": [ "text", @@ -39929,7 +39651,7 @@ ] }, "limit": { - "context": 1050000, + "context": 400000, "output": 128000 }, "temperature": false, @@ -39943,11 +39665,12 @@ "supported": true, "default_enabled": true, "mode": "effort", - "effort": "high", + "effort": "medium", "effort_options": [ + "minimal", + "low", "medium", - "high", - "xhigh" + "high" ], "verbosity": "medium", "verbosity_options": [ @@ -39960,36 +39683,28 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-05", - "last_updated": "2026-03-05", + "knowledge": "2024-05-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" - } - ] - }, - "sakana": { - "id": "sakana", - "name": "Sakana AI", - "display_name": "Sakana AI", - "api": "https://api.sakana.ai/v1", - "doc": "https://console.sakana.ai/models", - "models": [ + }, { - "id": "fugu", - "name": "Fugu", - "display_name": "Fugu", + "id": "auto/openai/gpt-6-sol", + "name": "GPT-6 Sol", + "display_name": "GPT-6 Sol", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 1000000 + "context": 1050000, + "output": 128000 }, "temperature": false, "tool_call": true, @@ -40000,6 +39715,9 @@ "extra_capabilities": { "reasoning": { "effort_options": [ + "none", + "low", + "medium", "high", "xhigh" ] @@ -40007,27 +39725,26 @@ }, "attachment": true, "open_weights": false, - "release_date": "2026-06-15", - "last_updated": "2026-06-15", + "knowledge": "2026-04-20", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "sakana-namazu", - "name": "Sakana Namazu", - "display_name": "Sakana Namazu", + "id": "auto/openai/gpt-oss-120b", + "name": "GPT OSS 120B", + "display_name": "GPT OSS 120B", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 131072, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -40035,16 +39752,27 @@ "supported": true, "default": true }, - "attachment": true, - "open_weights": false, - "release_date": "2026-08-03", - "last_updated": "2026-08-03", + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "low", + "medium", + "high" + ] + } + }, + "attachment": false, + "open_weights": true, + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "fugu-ultra", - "name": "Fugu Ultra", - "display_name": "Fugu Ultra", + "id": "auto/openai/gpt-5", + "name": "GPT-5", + "display_name": "GPT-5", "modalities": { "input": [ "text", @@ -40055,8 +39783,8 @@ ] }, "limit": { - "context": 1000000, - "output": 1000000 + "context": 400000, + "output": 128000 }, "temperature": false, "tool_call": true, @@ -40066,34 +39794,49 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ - "high", - "xhigh" - ] + "minimal", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "release_date": "2026-06-15", - "last_updated": "2026-06-15", + "knowledge": "2024-09-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "fugu-ultra-20260615", - "name": "Fugu Ultra", - "display_name": "Fugu Ultra", + "id": "auto/openai/gpt-6.1-sol", + "name": "GPT-6.1 Sol", + "display_name": "GPT-6.1 Sol", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 1000000 + "context": 1050000, + "output": 128000 }, "temperature": false, "tool_call": true, @@ -40104,6 +39847,8 @@ "extra_capabilities": { "reasoning": { "effort_options": [ + "low", + "medium", "high", "xhigh" ] @@ -40111,80 +39856,72 @@ }, "attachment": true, "open_weights": false, - "release_date": "2026-06-15", - "last_updated": "2026-06-15", - "type": "chat" - } - ] - }, - "klokintegration": { - "id": "klokintegration", - "name": "klokintegration.se", - "display_name": "klokintegration.se", - "api": "https://api-gw.klok.ipaas.se/proxy/kloker-key/v1", - "doc": "https://klokintegration.se/docs/ai-api", - "models": [ - { - "id": "Kloker", - "name": "Kloker", - "display_name": "Kloker", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 200000, - "output": 50000 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": false, - "release_date": "2026-08-29", - "last_updated": "2026-08-29", + "knowledge": "2026-04-30", + "release_date": "2026-09-29", + "last_updated": "2026-09-29", "type": "chat" }, { - "id": "Kloker-Integration-Developer", - "name": "Kloker Integration Developer", - "display_name": "Kloker Integration Developer", + "id": "auto/openai/gpt-5.2", + "name": "GPT-5.2", + "display_name": "GPT-5.2", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 50000 + "context": 400000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, "open_weights": false, - "release_date": "2026-08-29", - "last_updated": "2026-08-29", + "knowledge": "2025-08-31", + "release_date": "2025-12-11", + "last_updated": "2025-12-11", "type": "chat" }, { - "id": "Kloker-Integration-Architect", - "name": "Kloker Integration Architect", - "display_name": "Kloker Integration Architect", + "id": "auto/openai/o3", + "name": "o3", + "display_name": "o3", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" @@ -40192,46 +39929,54 @@ }, "limit": { "context": 200000, - "output": 50000 + "output": 100000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, "open_weights": false, - "release_date": "2026-08-29", - "last_updated": "2026-08-29", + "knowledge": "2024-05", + "release_date": "2025-04-16", + "last_updated": "2025-04-16", "type": "chat" - } - ] - }, - "berget": { - "id": "berget", - "name": "Berget.AI", - "display_name": "Berget.AI", - "api": "https://api.berget.ai/v1", - "doc": "https://api.berget.ai", - "models": [ + }, { - "id": "Qwen/Qwen3.8-27B-FP8", - "name": "Qwen3.8 27B", - "display_name": "Qwen3.8 27B", + "id": "auto/openai/gpt-5.5", + "name": "GPT-5.5", + "display_name": "GPT-5.5", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -40240,125 +39985,110 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ - "none", "low", "medium", + "high", "xhigh" - ] + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, - "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "open_weights": false, + "knowledge": "2025-12-01", + "release_date": "2026-04-23", + "last_updated": "2026-04-23", "type": "chat" }, { - "id": "google/gemma-4-31B-it", - "name": "Gemma 4 31B Instruct", - "display_name": "Gemma 4 31B Instruct", + "id": "auto/openai/gpt-4.1-mini", + "name": "GPT-4.1 mini", + "display_name": "GPT-4.1 mini", "modalities": { "input": [ - "audio", - "image", "text", - "video" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 1047576, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, "attachment": true, - "open_weights": true, - "knowledge": "2025-12", - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "open_weights": false, + "knowledge": "2024-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", "type": "chat" }, { - "id": "moonshotai/Kimi-K3", - "name": "Kimi K3", - "display_name": "Kimi K3", + "id": "auto/openai/gpt-4o-mini", + "name": "GPT-4o mini", + "display_name": "GPT-4o mini", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 327680, - "output": 32768 + "context": 128000, + "output": 16384 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "low", - "high", - "max" - ] - } + "supported": false }, "attachment": true, - "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-16", + "open_weights": false, + "knowledge": "2023-09", + "release_date": "2024-07-18", + "last_updated": "2024-07-18", "type": "chat" }, { - "id": "zai-org/GLM-5.2", - "name": "GLM-5.2", - "display_name": "GLM-5.2", + "id": "auto/openai/gpt-6-astra", + "name": "GPT-6 Astra", + "display_name": "GPT-6 Astra", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 524288, - "output": 32768 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -40368,36 +40098,38 @@ "reasoning": { "supported": true, "effort_options": [ - "none", - "high" + "low", + "medium", + "high", + "xhigh" ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "attachment": true, + "open_weights": false, + "knowledge": "2026-04-30", + "release_date": "2026-09-04", + "last_updated": "2026-09-04", "type": "chat" }, { - "id": "zai-org/GLM-5.3-Flash", - "name": "GLM-5.3-Flash", - "display_name": "GLM-5.3-Flash", + "id": "auto/openai/gpt-5-nano", + "name": "GPT-5 Nano", + "display_name": "GPT-5 Nano", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 16384 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -40406,40 +40138,47 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ + "minimal", "low", - "high", - "max" - ] + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, - "open_weights": true, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", + "open_weights": false, + "knowledge": "2024-05-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "mistralai/Mistral-Small-3.2-24B-Instruct-2506", - "name": "Mistral Small 3.2 24B Instruct 2506", - "display_name": "Mistral Small 3.2 24B Instruct 2506", + "id": "auto/mistralai/mistral-small-2603", + "name": "Mistral Small 4", + "display_name": "Mistral Small 4", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 32000, - "output": 8192 + "context": 256000, + "output": 256000 }, "temperature": true, "tool_call": true, @@ -40447,26 +40186,25 @@ "supported": true, "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "high" + ] + } + }, + "attachment": true, "open_weights": true, - "knowledge": "2025-09", - "release_date": "2025-06-20", - "last_updated": "2025-06-20", + "knowledge": "2025-06", + "release_date": "2026-03-16", + "last_updated": "2026-03-16", "type": "chat" - } - ] - }, - "xpersona": { - "id": "xpersona", - "name": "Xpersona", - "display_name": "Xpersona", - "api": "https://www.xpersona.co/v1", - "doc": "https://www.xpersona.co/docs", - "models": [ + }, { - "id": "gpt-5.4-mini", - "name": "GPT-5.4 mini", - "display_name": "GPT-5.4 mini", + "id": "auto/mistralai/mistral-medium-3.5", + "name": "Mistral Medium 3.5", + "display_name": "Mistral Medium 3.5", "modalities": { "input": [ "text", @@ -40477,53 +40215,33 @@ ] }, "limit": { - "context": 272000, - "output": 128000 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", "effort_options": [ "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", "high" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-17", - "last_updated": "2026-03-17", + "open_weights": true, + "release_date": "2026-04-29", + "last_updated": "2026-04-29", "type": "chat" }, { - "id": "gpt-5.6-sol", - "name": "GPT-5.6 Sol", - "display_name": "GPT-5.6 Sol", + "id": "auto/mistralai/mistral-large-2512", + "name": "Mistral Large 3", + "display_name": "Mistral Large 3", "modalities": { "input": [ "text", @@ -40534,54 +40252,25 @@ ] }, "limit": { - "context": 372000, - "output": 128000 + "context": 262144, + "output": 262144 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "open_weights": true, + "knowledge": "2024-11", + "release_date": "2025-12-02", + "last_updated": "2025-12-02", "type": "chat" }, { - "id": "claude-haiku-4-5", - "name": "Claude Haiku 4.5 (latest)", - "display_name": "Claude Haiku 4.5 (latest)", + "id": "auto/mistralai/ministral-3b-2512", + "name": "Ministral 3 3B", + "display_name": "Ministral 3 3B", "modalities": { "input": [ "text", @@ -40592,47 +40281,24 @@ ] }, "limit": { - "context": 200000, - "output": 128000 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." - ] - } + "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2025-02-28", - "release_date": "2025-10-15", - "last_updated": "2025-10-15", + "open_weights": true, + "release_date": "2025-12-02", + "last_updated": "2025-12-02", "type": "chat" }, { - "id": "gemini-3.5-flash", - "name": "Gemini 3.5 Flash", - "display_name": "Gemini 3.5 Flash", + "id": "auto/mistralai/ministral-14b-2512", + "name": "Ministral 3 14B", + "display_name": "Ministral 3 14B", "modalities": { "input": [ "text", @@ -40643,46 +40309,24 @@ ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", - "low", - "medium", - "high" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-05-19", - "last_updated": "2026-05-19", + "open_weights": true, + "release_date": "2025-12-02", + "last_updated": "2025-12-02", "type": "chat" }, { - "id": "gpt-5.6-terra", - "name": "GPT-5.6 Terra", - "display_name": "GPT-5.6 Terra", + "id": "auto/mistralai/mistral-large-4", + "name": "Mistral Large 4", + "display_name": "Mistral Large 4", "modalities": { "input": [ "text", @@ -40693,10 +40337,10 @@ ] }, "limit": { - "context": 372000, - "output": 128000 + "context": 524288, + "output": 262144 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -40704,43 +40348,22 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", "effort_options": [ "none", - "low", - "medium", - "high", - "xhigh", - "max" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", "high" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "release_date": "2026-10-06", + "last_updated": "2026-10-06", "type": "chat" }, { - "id": "xpersona-gpt-5.5", - "name": "GPT-5.5", - "display_name": "GPT-5.5", + "id": "auto/mistralai/ministral-8b-2512", + "name": "Ministral 3 8B", + "display_name": "Ministral 3 8B", "modalities": { "input": [ "text", @@ -40751,142 +40374,97 @@ ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 262144, + "output": 262144 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ] - } + "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2025-12-30", - "release_date": "2026-04-23", - "last_updated": "2026-04-23", + "open_weights": true, + "release_date": "2025-12-02", + "last_updated": "2025-12-02", "type": "chat" }, { - "id": "xpersona-frieren-coder", - "name": "Xpersona Frieren 1", - "display_name": "Xpersona Frieren 1", + "id": "auto/mistralai/codestral-2508", + "name": "Codestral 25.08", + "display_name": "Codestral 25.08", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 128000, + "output": 8192 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ] - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-12-30", - "release_date": "2026-05-01", - "last_updated": "2026-05-25", + "release_date": "2025-07-30", + "last_updated": "2025-07-30", "type": "chat" - }, + } + ] + }, + "subconscious": { + "id": "subconscious", + "name": "Subconscious", + "display_name": "Subconscious", + "api": "https://api.subconscious.dev/v1", + "doc": "https://docs.subconscious.dev", + "models": [ { - "id": "gpt-5.4", - "name": "GPT-5.4", - "display_name": "GPT-5.4", + "id": "subconscious/glm-5.3-marathon", + "name": "GLM-5.3 Marathon", + "display_name": "GLM-5.3 Marathon", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 5000000, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", "effort_options": [ - "none", "low", - "medium", "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "max" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-05", - "last_updated": "2026-03-05", + "attachment": false, + "open_weights": true, + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "claude-sonnet-4-6", - "name": "Claude Sonnet 4.6", - "display_name": "Claude Sonnet 4.6", + "id": "subconscious/deepseek-v4.1-flash-marathon", + "name": "DeepSeek V4.1 Flash Marathon", + "display_name": "DeepSeek V4.1 Flash Marathon", "modalities": { "input": [ "text", @@ -40897,389 +40475,265 @@ ] }, "limit": { - "context": 200000, - "output": 128000 + "context": 5000000, + "output": 384000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", "effort_options": [ "low", - "medium", "high", "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-17", - "last_updated": "2026-03-13", + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-09-10", + "last_updated": "2026-09-10", "type": "chat" - }, + } + ] + }, + "vercel": { + "id": "vercel", + "name": "Vercel AI Gateway", + "display_name": "Vercel AI Gateway", + "doc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", + "models": [ { - "id": "gpt-5.5", - "name": "GPT-5.5", - "display_name": "GPT-5.5", + "id": "microsoft/mai-image-2.6-flash", + "name": "MAI-Image-2.6-Flash", + "display_name": "MAI-Image-2.6-Flash", "modalities": { "input": [ "text", "image" ], "output": [ - "text" + "image" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 8192, + "output": 8192 }, "temperature": false, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2025-12-01", - "release_date": "2026-04-23", - "last_updated": "2026-04-23", - "type": "chat" + "release_date": "2026-10-13", + "last_updated": "2026-10-13" }, { - "id": "claude-opus-4-8", - "name": "Claude Opus 4.8", - "display_name": "Claude Opus 4.8", + "id": "microsoft/mai-voice-2.1-flash", + "name": "MAI-Voice-2.1-Flash", + "display_name": "MAI-Voice-2.1-Flash", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ - "text" + "audio" ] }, "limit": { - "context": 200000, - "output": 128000 + "context": 8192, + "output": 8192 }, "temperature": false, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." - ] - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2026-01", - "release_date": "2026-05-28", - "last_updated": "2026-05-28", - "type": "chat" + "release_date": "2026-10-01", + "last_updated": "2026-10-01" }, { - "id": "gpt-5.6", - "name": "GPT-5.6", - "display_name": "GPT-5.6", + "id": "microsoft/mai-voice-2", + "name": "MAI-Voice-2", + "display_name": "MAI-Voice-2", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ - "text" + "audio" ] }, "limit": { - "context": 372000, - "output": 128000 + "context": 8192, + "output": 8192 }, "temperature": false, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", - "type": "chat" + "release_date": "2026-06-02", + "last_updated": "2026-06-02" }, { - "id": "claude-fable-5", - "name": "Claude Fable 5", - "display_name": "Claude Fable 5", + "id": "microsoft/mai-transcribe-2", + "name": "MAI-Transcribe 2", + "display_name": "MAI-Transcribe 2", "modalities": { "input": [ - "text", - "image" + "audio" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 8192, + "output": 8192 }, "temperature": false, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", - "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", - "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." - ] - } + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-09", - "last_updated": "2026-06-09", - "type": "chat" - } - ] - }, - "nvidia": { - "id": "nvidia", - "name": "Nvidia", - "display_name": "Nvidia", - "api": "https://integrate.api.nvidia.com/v1", - "doc": "https://docs.api.nvidia.com/nim/", - "models": [ + "release_date": "2026-09-03", + "last_updated": "2026-09-03" + }, { - "id": "meta/llama-guard-4-12b", - "name": "Llama Guard 4 12B", - "display_name": "Llama Guard 4 12B", + "id": "microsoft/mai-voice-2.1", + "name": "MAI-Voice-2.1", + "display_name": "MAI-Voice-2.1", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ + "audio" + ] + }, + "limit": { + "context": 8192, + "output": 8192 + }, + "temperature": false, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": false, + "release_date": "2026-10-01", + "last_updated": "2026-10-01" + }, + { + "id": "microsoft/mai-voice-2-flash", + "name": "MAI-Voice-2-Flash", + "display_name": "MAI-Voice-2-Flash", + "modalities": { + "input": [ "text" + ], + "output": [ + "audio" ] }, "limit": { - "context": 163840, - "output": 16384 + "context": 8192, + "output": 8192 }, - "temperature": true, + "temperature": false, "tool_call": false, "reasoning": { "supported": false }, - "attachment": true, - "open_weights": true, - "release_date": "2025-04-29", - "last_updated": "2025-04-29", - "type": "chat" + "attachment": false, + "open_weights": false, + "release_date": "2026-07-23", + "last_updated": "2026-07-23" }, { - "id": "meta/llama-3.2-90b-vision-instruct", - "name": "Llama-3.2-90B-Vision-Instruct", - "display_name": "Llama-3.2-90B-Vision-Instruct", + "id": "microsoft/mai-transcribe-2-streaming", + "name": "MAI-Transcribe-2-Streaming", + "display_name": "MAI-Transcribe-2-Streaming", "modalities": { "input": [ - "text", - "image" + "audio" ], "output": [ "text" ] }, "limit": { - "context": 128000, + "context": 8192, "output": 8192 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { "supported": false }, "attachment": true, - "open_weights": true, - "knowledge": "2023-12", - "release_date": "2024-09-25", - "last_updated": "2024-09-25", - "type": "chat" + "open_weights": false, + "release_date": "2026-10-01", + "last_updated": "2026-10-01" }, { - "id": "meta/llama-3.2-11b-vision-instruct", - "name": "Llama 3.2 11b Vision Instruct", - "display_name": "Llama 3.2 11b Vision Instruct", + "id": "microsoft/mai-image-2.6", + "name": "MAI-Image-2.6", + "display_name": "MAI-Image-2.6", "modalities": { "input": [ "text", "image" ], "output": [ - "text" + "image" ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 8192, + "output": 8192 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { "supported": false }, "attachment": true, - "open_weights": true, - "knowledge": "2023-12", - "release_date": "2024-09-25", - "last_updated": "2024-09-25", - "type": "chat" + "open_weights": false, + "release_date": "2026-10-13", + "last_updated": "2026-10-13" }, { - "id": "meta/muse-glimmer-30b", - "name": "Muse Glimmer 30B", - "display_name": "Muse Glimmer 30B", + "id": "liquid/lfm2.5-24b-a2b", + "name": "LFM2.5-24B-A2B", + "display_name": "LFM2.5-24B-A2B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 131072 + "context": 128000, + "output": 8200 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -41287,49 +40741,40 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ - "none", "minimal", "low", "medium", "high", + "xhigh", "max" ] } }, - "attachment": true, - "open_weights": true, - "knowledge": "2026-01-04", - "release_date": "2026-08-10", - "last_updated": "2026-08-10", + "attachment": false, + "open_weights": false, + "release_date": "2026-10-13", + "last_updated": "2026-10-13", "type": "chat" }, { - "id": "nvidia/nemotron-3.5-content-safety", - "name": "Nemotron 3.5 Content Safety", - "display_name": "Nemotron 3.5 Content Safety", + "id": "zai/glm-5.2", + "name": "GLM 5.2", + "display_name": "GLM 5.2", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 1000000, + "output": 128000 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, "default": true @@ -41337,37 +40782,34 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "none", + "high", + "max" ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-06-02", - "last_updated": "2026-06-02", + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "nvidia/cosmos-reason2-8b", - "name": "Cosmos Reason2 8B", - "display_name": "Cosmos Reason2 8B", + "id": "zai/glm-5.3-fast", + "name": "GLM 5.3 Fast", + "display_name": "GLM 5.3 Fast", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 16384 + "context": 1048576, + "output": 262144 }, "temperature": true, "tool_call": true, @@ -41375,16 +40817,26 @@ "supported": true, "default": true }, - "attachment": true, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "low", + "medium", + "high" + ] + } + }, + "attachment": false, "open_weights": true, - "release_date": "2025-12-01", - "last_updated": "2025-12-01", + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "nvidia/llama-3.1-nemotron-safety-guard-8b-v3", - "name": "llama-3.1-nemotron-safety-guard-8b-v3", - "display_name": "llama-3.1-nemotron-safety-guard-8b-v3", + "id": "zai/glm-5.2-fast", + "name": "GLM 5.2 Fast", + "display_name": "GLM 5.2 Fast", "modalities": { "input": [ "text" @@ -41394,65 +40846,87 @@ ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 1000000, + "output": 128000 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "low", + "medium", + "high" + ] + } }, "attachment": false, "open_weights": true, - "release_date": "2025-10-28", - "last_updated": "2025-10-28", + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "nvidia/magpie-tts-zeroshot", - "name": "magpie-tts-zeroshot", - "display_name": "magpie-tts-zeroshot", + "id": "zai/glm-5v-turbo", + "name": "GLM 5V Turbo", + "display_name": "GLM 5V Turbo", "modalities": { "input": [ "text", - "audio" + "image", + "pdf" ], "output": [ - "audio" + "text" ] }, "limit": { - "context": 8192, - "output": 4096 + "context": 200000, + "output": 128000 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "low", + "medium", + "high" + ] + } }, "attachment": true, - "open_weights": true, - "release_date": "2025-05-22", - "last_updated": "2025-06-12" + "open_weights": false, + "release_date": "2026-04-01", + "last_updated": "2026-04-01", + "type": "chat" }, { - "id": "nvidia/nemotron-3-nano-omni-30b-a3b-reasoning", - "name": "Nemotron 3 Nano Omni", - "display_name": "Nemotron 3 Nano Omni", + "id": "zai/glm-5.3-flashx", + "name": "GLM 5.3 FlashX", + "display_name": "GLM 5.3 FlashX", "modalities": { "input": [ "text", - "image", - "video", - "audio" + "image" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 65536 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -41462,74 +40936,23 @@ }, "extra_capabilities": { "reasoning": { - "supported": true - } - }, - "attachment": true, - "open_weights": true, - "release_date": "2026-04-28", - "last_updated": "2026-04-28", - "type": "chat" - }, - { - "id": "nvidia/cosmos-transfer2_5-2b", - "name": "cosmos-transfer2.5-2b", - "display_name": "cosmos-transfer2.5-2b", - "modalities": { - "input": [ - "text", - "image", - "video" - ], - "output": [ - "video" - ] - }, - "limit": { - "context": 8192, - "output": 4096 - }, - "temperature": false, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": true, - "release_date": "2026-02-26", - "last_updated": "2026-02-26" - }, - { - "id": "nvidia/sparsedrive", - "name": "sparsedrive", - "display_name": "sparsedrive", - "modalities": { - "input": [ - "video" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 128000, - "output": 8192 - }, - "temperature": false, - "tool_call": false, - "reasoning": { - "supported": false + "effort_options": [ + "low", + "high", + "max" + ] + } }, "attachment": true, "open_weights": true, - "release_date": "2025-03-18", - "last_updated": "2025-07-20", + "release_date": "2026-08-26", + "last_updated": "2026-08-26", "type": "chat" }, { - "id": "nvidia/usdvalidate", - "name": "usdvalidate", - "display_name": "usdvalidate", + "id": "zai/glm-5.3", + "name": "GLM 5.3", + "display_name": "GLM 5.3", "modalities": { "input": [ "text" @@ -41539,51 +40962,35 @@ ] }, "limit": { - "context": 8192, - "output": 4096 + "context": 1000000, + "output": 1000000 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "low", + "high", + "max" + ] + } }, "attachment": false, "open_weights": true, - "release_date": "2024-07-24", - "last_updated": "2025-01-08", + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "nvidia/llama-nemotron-rerank-vl-1b-v2", - "name": "llama-nemotron-rerank-vl-1b-v2", - "display_name": "llama-nemotron-rerank-vl-1b-v2", - "modalities": { - "input": [ - "text", - "image" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 10240, - "output": 4096 - }, - "temperature": false, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": true, - "release_date": "2025-12-18", - "last_updated": "2025-12-18" - }, - { - "id": "nvidia/rerank-qa-mistral-4b", - "name": "rerank-qa-mistral-4b", - "display_name": "rerank-qa-mistral-4b", + "id": "zai/glm-4.7-flashx", + "name": "GLM 4.7 FlashX", + "display_name": "GLM 4.7 FlashX", "modalities": { "input": [ "text" @@ -41593,23 +41000,38 @@ ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 200000, + "output": 128000 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "effort_options": [ + "none", + "low", + "medium", + "high" + ] + } }, "attachment": false, "open_weights": true, - "release_date": "2024-03-17", - "last_updated": "2025-01-17" + "knowledge": "2025-04", + "release_date": "2026-01-19", + "last_updated": "2026-01-19", + "type": "chat" }, { - "id": "nvidia/nemotron-3.5-lightning-30b-a3b", - "name": "Nemotron 3.5 Lightning 30B A3B", - "display_name": "Nemotron 3.5 Lightning 30B A3B", + "id": "zai/glm-5-turbo", + "name": "GLM 5 Turbo", + "display_name": "GLM 5 Turbo", "modalities": { "input": [ "text" @@ -41619,8 +41041,8 @@ ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 202800, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -41628,20 +41050,30 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "none", + "low", + "medium", + "high" + ] + } + }, "attachment": false, - "open_weights": true, - "knowledge": "2025-09", - "release_date": "2026-08-11", - "last_updated": "2026-08-11", + "open_weights": false, + "release_date": "2026-03-16", + "last_updated": "2026-03-16", "type": "chat" }, { - "id": "nvidia/streampetr", - "name": "streampetr", - "display_name": "streampetr", + "id": "zai/glm-4.5", + "name": "GLM 4.5", + "display_name": "GLM 4.5", "modalities": { "input": [ - "video" + "text" ], "output": [ "text" @@ -41649,23 +41081,31 @@ }, "limit": { "context": 128000, - "output": 8192 + "output": 96000 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true + } + }, + "attachment": false, "open_weights": true, - "release_date": "2025-11-13", - "last_updated": "2025-11-13", + "knowledge": "2025-04", + "release_date": "2025-07-28", + "last_updated": "2025-07-28", "type": "chat" }, { - "id": "nvidia/nemotron-3-ultra-550b-a55b", - "name": "Nemotron 3 Ultra 550B A55B", - "display_name": "Nemotron 3 Ultra 550B A55B", + "id": "zai/glm-4.7-flash", + "name": "GLM 4.7 Flash", + "display_name": "GLM 4.7 Flash", "modalities": { "input": [ "text" @@ -41675,8 +41115,8 @@ ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 200000, + "output": 131000 }, "temperature": true, "tool_call": true, @@ -41689,6 +41129,7 @@ "supported": true, "effort_options": [ "none", + "low", "medium", "high" ] @@ -41696,43 +41137,50 @@ }, "attachment": false, "open_weights": true, - "knowledge": "2025-09", - "release_date": "2026-06-04", - "last_updated": "2026-06-04", + "knowledge": "2025-04", + "release_date": "2026-01-19", + "last_updated": "2026-01-19", "type": "chat" }, { - "id": "nvidia/nemotron-voicechat", - "name": "nemotron-voicechat", - "display_name": "nemotron-voicechat", + "id": "zai/glm-4.6", + "name": "GLM 4.6", + "display_name": "GLM 4.6", "modalities": { "input": [ - "text", - "audio" + "text" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 200000, + "output": 96000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true + } + }, + "attachment": false, "open_weights": true, - "release_date": "2026-03-16", - "last_updated": "2026-03-16", + "knowledge": "2025-04", + "release_date": "2025-09-30", + "last_updated": "2025-09-30", "type": "chat" }, { - "id": "nvidia/llama-3.1-nemotron-ultra-253b-v1", - "name": "Llama 3.1 Nemotron Ultra 253B", - "display_name": "Llama 3.1 Nemotron Ultra 253B", + "id": "zai/glm-4.5-air", + "name": "GLM 4.5 Air", + "display_name": "GLM 4.5 Air", "modalities": { "input": [ "text" @@ -41743,7 +41191,7 @@ }, "limit": { "context": 128000, - "output": 16384 + "output": 96000 }, "temperature": true, "tool_call": true, @@ -41753,14 +41201,15 @@ }, "attachment": false, "open_weights": true, - "release_date": "2025-04-07", - "last_updated": "2025-04-07", + "knowledge": "2025-04", + "release_date": "2025-07-28", + "last_updated": "2025-07-28", "type": "chat" }, { - "id": "nvidia/llama-nemotron-embed-vl-1b-v2", - "name": "llama-nemotron-embed-vl-1b-v2", - "display_name": "llama-nemotron-embed-vl-1b-v2", + "id": "zai/glm-4.5v", + "name": "GLM 4.5V", + "display_name": "GLM 4.5V", "modalities": { "input": [ "text", @@ -41771,91 +41220,37 @@ ] }, "limit": { - "context": 8192, - "output": 2048 - }, - "temperature": false, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": true, - "release_date": "2025-12-18", - "last_updated": "2025-12-18", - "type": "embedding" - }, - { - "id": "nvidia/studiovoice", - "name": "studiovoice", - "display_name": "studiovoice", - "modalities": { - "input": [ - "audio" - ], - "output": [ - "audio" - ] - }, - "limit": { - "context": 8192, - "output": 8192 + "context": 66000, + "output": 16000 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": true, "open_weights": true, - "release_date": "2024-10-03", - "last_updated": "2025-06-13", + "knowledge": "2025-04", + "release_date": "2025-08-11", + "last_updated": "2025-08-11", "type": "chat" }, { - "id": "nvidia/bevformer", - "name": "bevformer", - "display_name": "bevformer", + "id": "zai/glm-5", + "name": "GLM-5", + "display_name": "GLM-5", "modalities": { "input": [ - "video" - ], - "output": [ "text" - ] - }, - "limit": { - "context": 128000, - "output": 8192 - }, - "temperature": false, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": true, - "release_date": "2025-03-18", - "last_updated": "2025-07-20", - "type": "chat" - }, - { - "id": "nvidia/nemotron-3.5-super-vl-120b-a12b", - "name": "Nemotron 3.5 Super VL 120B A12B", - "display_name": "Nemotron 3.5 Super VL 120B A12B", - "modalities": { - "input": [ - "text", - "image", - "video" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 8192 + "context": 202800, + "output": 131100 }, "temperature": true, "tool_call": true, @@ -41871,46 +41266,64 @@ "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "effort_options": [ + "none", + "low", + "medium", + "high" ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-10-15", - "last_updated": "2026-10-15", + "release_date": "2026-02-12", + "last_updated": "2026-02-12", "type": "chat" }, { - "id": "nvidia/synthetic-video-detector", - "name": "synthetic-video-detector", - "display_name": "synthetic-video-detector", + "id": "zai/glm-5.3-flash", + "name": "GLM 5.3 Flash", + "display_name": "GLM 5.3 Flash", "modalities": { "input": [ - "video" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 8192, - "output": 4096 + "context": 1000000, + "output": 131000 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "low", + "high", + "max" + ] + } }, "attachment": true, "open_weights": true, - "release_date": "2026-04-16", - "last_updated": "2026-04-16", + "release_date": "2026-08-26", + "last_updated": "2026-08-26", "type": "chat" }, { - "id": "nvidia/usdcode", - "name": "usdcode", - "display_name": "usdcode", + "id": "zai/glm-4.7", + "name": "GLM 4.7", + "display_name": "GLM 4.7", "modalities": { "input": [ "text" @@ -41920,78 +41333,82 @@ ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 200000, + "output": 120000 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": false, - "release_date": "2026-01-01", - "last_updated": "2026-01-01", - "type": "chat" - }, - { - "id": "nvidia/riva-translate-4b-instruct-v1.1", - "name": "riva-translate-4b-instruct-v1_1", - "display_name": "riva-translate-4b-instruct-v1_1", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 128000, - "output": 4096 + "supported": true, + "default": true }, - "temperature": false, - "tool_call": false, - "reasoning": { - "supported": false + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "none", + "low", + "medium", + "high" + ] + } }, "attachment": false, "open_weights": true, - "release_date": "2025-12-12", - "last_updated": "2025-12-12", + "knowledge": "2025-04", + "release_date": "2025-12-22", + "last_updated": "2025-12-22", "type": "chat" }, { - "id": "nvidia/active-speaker-detection", - "name": "Active Speaker Detection", - "display_name": "Active Speaker Detection", + "id": "zai/glm-5.1", + "name": "GLM 5.1", + "display_name": "GLM 5.1", "modalities": { "input": [ - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 8192, - "output": 4096 + "context": 202800, + "output": 64000 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "none", + "low", + "medium", + "high" + ] + } + }, + "attachment": false, "open_weights": true, - "release_date": "2026-04-16", - "last_updated": "2026-04-16", + "release_date": "2026-04-07", + "last_updated": "2026-04-07", "type": "chat" }, { - "id": "nvidia/llama-3.1-nemotron-70b-instruct", - "name": "Llama 3.1 Nemotron 70B Instruct", - "display_name": "Llama 3.1 Nemotron 70B Instruct", + "id": "moonshotai/kimi-k2", + "name": "Kimi K2 Instruct", + "display_name": "Kimi K2 Instruct", "modalities": { "input": [ "text" @@ -42001,8 +41418,8 @@ ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 131072, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -42011,57 +41428,71 @@ }, "attachment": false, "open_weights": true, - "release_date": "2025-04-15", - "last_updated": "2025-04-15", + "knowledge": "2024-12-31", + "release_date": "2025-07-11", + "last_updated": "2025-07-11", "type": "chat" }, { - "id": "google/google-paligemma", - "name": "paligemma", - "display_name": "paligemma", + "id": "moonshotai/kimi-k2.7-code-highspeed", + "name": "Kimi K2.7 Code High Speed", + "display_name": "Kimi K2.7 Code High Speed", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 262144, + "output": 32768 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "none", + "low", + "medium", + "high" + ] + } }, "attachment": true, "open_weights": true, - "release_date": "2024-05-14", - "last_updated": "2024-08-26", + "knowledge": "2025-01", + "release_date": "2026-06-12", + "last_updated": "2026-06-12", "type": "chat" }, { - "id": "google/gemma-4-31b-it", - "name": "Gemma-4-31B-IT", - "display_name": "Gemma-4-31B-IT", + "id": "moonshotai/kimi-k3.1-pro", + "name": "Kimi K3.1 Pro", + "display_name": "Kimi K3.1 Pro", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 16384 + "context": 1048576, + "output": 1048576 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -42069,64 +41500,80 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "effort_options": [ + "low", + "high", + "max" + ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "open_weights": false, + "release_date": "2026-10-23", + "last_updated": "2026-10-23", "type": "chat" }, { - "id": "google/gemma-3-12b-it", - "name": "Gemma 3 12B IT", - "display_name": "Gemma 3 12B IT", + "id": "moonshotai/kimi-k2.7-code", + "name": "Kimi K2.7 Code", + "display_name": "Kimi K2.7 Code", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 16384 + "context": 256000, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "none", + "low", + "medium", + "high" + ] + } }, "attachment": true, "open_weights": true, - "knowledge": "2024-08", - "release_date": "2025-03-12", - "last_updated": "2025-03-12", + "knowledge": "2025-01", + "release_date": "2026-06-12", + "last_updated": "2026-06-12", "type": "chat" }, { - "id": "google/diffusiongemma-26b-a4b-it", - "name": "DiffusionGemma 26B A4B IT", - "display_name": "DiffusionGemma 26B A4B IT", + "id": "moonshotai/kimi-k3-fast", + "name": "Kimi K3 Fast", + "display_name": "Kimi K3 Fast", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 250000, - "output": 32768 + "context": 1000000, + "output": 131072 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -42136,26 +41583,23 @@ "reasoning": { "effort_options": [ "none", - "minimal", "low", "medium", "high", - "xhigh", "max" ] } }, "attachment": true, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-06-09", - "last_updated": "2026-07-15", + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" }, { - "id": "google/gemma-3-4b-it", - "name": "Gemma 3 4B IT", - "display_name": "Gemma 3 4B IT", + "id": "moonshotai/kimi-k2.6", + "name": "Kimi K2.6", + "display_name": "Kimi K2.6", "modalities": { "input": [ "text", @@ -42166,40 +41610,44 @@ ] }, "limit": { - "context": 131072, - "output": 16384 + "context": 262000, + "output": 262000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": true, "open_weights": true, - "knowledge": "2024-08", - "release_date": "2025-03-12", - "last_updated": "2025-03-12", + "knowledge": "2025-01", + "release_date": "2026-04-20", + "last_updated": "2026-04-20", "type": "chat" }, { - "id": "moonshotai/kimi-k2.6", - "name": "Kimi K2.6", - "display_name": "Kimi K2.6", + "id": "moonshotai/kimi-k3.1-pro-highspeed", + "name": "Kimi K3.1 Pro Highspeed", + "display_name": "Kimi K3.1 Pro Highspeed", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1048576, + "output": 1048576 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -42207,29 +41655,17 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ - "none", - "minimal", "low", - "medium", "high", - "xhigh", "max" ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-20", - "last_updated": "2026-04-20", + "open_weights": false, + "release_date": "2026-10-23", + "last_updated": "2026-10-23", "type": "chat" }, { @@ -42240,14 +41676,14 @@ "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, + "context": 1000000, "output": 131072 }, "temperature": false, @@ -42259,12 +41695,6 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ "low", "high", @@ -42279,36 +41709,56 @@ "type": "chat" }, { - "id": "openai/whisper-large-v3", - "name": "Whisper Large v3", - "display_name": "Whisper Large v3", + "id": "moonshotai/kimi-k2.5", + "name": "Kimi K2.5", + "display_name": "Kimi K2.5", "modalities": { "input": [ - "audio" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 448, - "output": 4096 + "context": 256000, + "output": 256000 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "none", + "low", + "medium", + "high" + ] + } }, "attachment": true, "open_weights": true, - "knowledge": "2023-09", - "release_date": "2023-11-06", - "last_updated": "2023-11-06" + "knowledge": "2025-01", + "release_date": "2026-01-27", + "last_updated": "2026-01-27", + "type": "chat" }, { - "id": "openai/gpt-oss-20b", - "name": "GPT OSS 20B", - "display_name": "GPT OSS 20B", + "id": "deepseek/deepseek-v4-flash-0731", + "name": "DeepSeek V4 Flash 0731", + "display_name": "DeepSeek V4 Flash 0731", "modalities": { "input": [ "text" @@ -42318,8 +41768,8 @@ ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 1000000, + "output": 384000 }, "temperature": true, "tool_call": true, @@ -42331,6 +41781,7 @@ "reasoning": { "supported": true, "effort_options": [ + "none", "low", "medium", "high" @@ -42339,136 +41790,79 @@ }, "attachment": false, "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "knowledge": "2025-05", + "release_date": "2026-07-31", + "last_updated": "2026-07-31", "type": "chat" }, { - "id": "black-forest-labs/flux.1-dev", - "name": "FLUX.1-dev", - "display_name": "FLUX.1-dev", + "id": "deepseek/deepseek-v4-flash", + "name": "DeepSeek V4 Flash", + "display_name": "DeepSeek V4 Flash", "modalities": { "input": [ "text" ], "output": [ - "image" - ] - }, - "limit": { - "context": 8192, - "output": 8192 - }, - "temperature": false, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-08", - "release_date": "2024-08-01", - "last_updated": "2024-08-01" - }, - { - "id": "black-forest-labs/flux_2-klein-4b", - "name": "FLUX.2 Klein 4B", - "display_name": "FLUX.2 Klein 4B", - "modalities": { - "input": [ - "text", - "image" - ], - "output": [ - "image" - ] - }, - "limit": { - "context": 8192, - "output": 8192 - }, - "temperature": false, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": true, - "knowledge": "2025-06", - "release_date": "2026-01-15", - "last_updated": "2026-01-15" - }, - { - "id": "black-forest-labs/flux_1-kontext-dev", - "name": "FLUX.1-Kontext-dev", - "display_name": "FLUX.1-Kontext-dev", - "modalities": { - "input": [ - "text", - "image" - ], - "output": [ - "image" - ] - }, - "limit": { - "context": 8192, - "output": 8192 - }, - "temperature": false, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": true, - "release_date": "2025-05-29", - "last_updated": "2025-05-29" - }, - { - "id": "black-forest-labs/flux_1-schnell", - "name": "FLUX.1-schnell", - "display_name": "FLUX.1-schnell", - "modalities": { - "input": [ "text" - ], - "output": [ - "image" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 1000000, + "output": 384000 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "high", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." + ] + } }, "attachment": false, "open_weights": true, - "knowledge": "2024-07", - "release_date": "2024-08-01", - "last_updated": "2024-08-01" + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", + "type": "chat" }, { - "id": "deepseek-ai/deepseek-v4.1-flash", + "id": "deepseek/deepseek-v4.1-flash", "name": "DeepSeek V4.1 Flash", "display_name": "DeepSeek V4.1 Flash", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 1048576, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -42479,12 +41873,6 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ "none", "low", @@ -42501,74 +41889,101 @@ "type": "chat" }, { - "id": "qwen/qwen-image-edit", - "name": "Qwen Image Edit", - "display_name": "Qwen Image Edit", + "id": "deepseek/deepseek-v4.1-flash-fast", + "name": "DeepSeek V4.1 Flash Fast", + "display_name": "DeepSeek V4.1 Flash Fast", "modalities": { "input": [ "text", "image" ], "output": [ - "image" + "text" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 1048576, + "output": 32768 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "low", + "medium", + "high" + ] + } }, "attachment": true, - "open_weights": false, - "release_date": "2025-08-19", - "last_updated": "2025-08-19" + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-09-10", + "last_updated": "2026-09-10", + "type": "chat" }, { - "id": "qwen/qwen-image", - "name": "Qwen Image", - "display_name": "Qwen Image", + "id": "deepseek/deepseek-v3.2-thinking", + "name": "DeepSeek V3.2 Thinking", + "display_name": "DeepSeek V3.2 Thinking", "modalities": { "input": [ "text" ], "output": [ - "image" + "text" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 128000, + "output": 8000 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "effort_options": [ + "none", + "low", + "medium", + "high" + ] + } }, "attachment": false, - "open_weights": false, - "release_date": "2025-08-07", - "last_updated": "2025-08-07" + "open_weights": true, + "knowledge": "2024-07", + "release_date": "2025-12-01", + "last_updated": "2025-12-01", + "type": "chat" }, { - "id": "minimaxai/minimax-m3.1-flash", - "name": "MiniMax-M3.1-Flash", - "display_name": "MiniMax-M3.1-Flash", + "id": "deepseek/deepseek-v4.1-flash-1017-fast", + "name": "DeepSeek V4.1 Flash 1017 Fast", + "display_name": "DeepSeek V4.1 Flash 1017 Fast", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, + "context": 1048576, "output": 262144 }, "temperature": true, @@ -42579,76 +41994,37 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ + "none", "low", "medium", - "high", - "xhigh", - "max" + "high" ] } }, "attachment": true, - "open_weights": false, - "release_date": "2026-10-19", - "last_updated": "2026-10-19", + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-10-17", + "last_updated": "2026-10-17", "type": "chat" }, { - "id": "poolside/laguna-xs-2.1", - "name": "Laguna XS 2.1", - "display_name": "Laguna XS 2.1", + "id": "deepseek/deepseek-v4-flash-vision-exp", + "name": "DeepSeek V4 Flash Vision Exp", + "display_name": "DeepSeek V4 Flash Vision Exp", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 16384 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, - "attachment": false, - "open_weights": true, - "release_date": "2026-07-02", - "last_updated": "2026-07-02", - "type": "chat" - }, - { - "id": "z-ai/glm-5.3", - "name": "GLM-5.3", - "display_name": "GLM-5.3", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 1000000, - "output": 131072 + "context": 1048576, + "output": 1048576 }, "temperature": true, "tool_call": true, @@ -42659,33 +42035,38 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "high", + "max" + ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" ], - "effort_options": [ - "low", - "high", - "max" + "notes": [ + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "release_date": "2026-08-21", + "last_updated": "2026-09-01", "type": "chat" }, { - "id": "z-ai/glm-5.3-flash", - "name": "GLM-5.3-Flash", - "display_name": "GLM-5.3-Flash", + "id": "deepseek/deepseek-v4-pro", + "name": "DeepSeek V4 Pro", + "display_name": "DeepSeek V4 Pro", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" @@ -42693,7 +42074,7 @@ }, "limit": { "context": 1000000, - "output": 131072 + "output": 384000 }, "temperature": true, "tool_call": true, @@ -42704,29 +42085,36 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "high", + "max" + ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" ], - "effort_options": [ - "low", - "high", - "max" + "notes": [ + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "stepfun-ai/step-5-preview", - "name": "Step 5 Preview", - "display_name": "Step 5 Preview", + "id": "deepseek/deepseek-v4.1-flash-1017", + "name": "DeepSeek V4.1 Flash 1017", + "display_name": "DeepSeek V4.1 Flash 1017", "modalities": { "input": [ "text", @@ -42748,61 +42136,25 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ "none", - "minimal", "low", - "medium", "high", - "xhigh", "max" ] } }, "attachment": true, "open_weights": true, - "release_date": "2026-09-16", - "last_updated": "2026-09-20", - "type": "chat" - }, - { - "id": "mistralai/mistral-7b-instruct-v0.3", - "name": "Mistral-7B-Instruct-v0.3", - "display_name": "Mistral-7B-Instruct-v0.3", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 65536, - "output": 65536 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": true, - "release_date": "2024-05-22", - "last_updated": "2024-05-22", + "knowledge": "2025-05", + "release_date": "2026-10-17", + "last_updated": "2026-10-17", "type": "chat" }, { - "id": "mistralai/magistral-small-2506", - "name": "Magistral Small 2506", - "display_name": "Magistral Small 2506", + "id": "deepseek/deepseek-v3.2", + "name": "DeepSeek V3.2", + "display_name": "DeepSeek V3.2", "modalities": { "input": [ "text" @@ -42812,66 +42164,33 @@ ] }, "limit": { - "context": 32768, - "output": 32768 + "context": 128000, + "output": 8000 }, "temperature": true, "tool_call": false, "reasoning": { - "supported": false + "supported": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": false, "open_weights": true, - "release_date": "2025-06-10", - "last_updated": "2025-06-10", + "knowledge": "2024-07", + "release_date": "2025-12-01", + "last_updated": "2025-12-01", "type": "chat" }, { - "id": "mistralai/mistral-medium-3-instruct", - "name": "Mistral Medium 3", - "display_name": "Mistral Medium 3", + "id": "deepseek/deepseek-v4-pro-0813", + "name": "DeepSeek V4 Pro 0813", + "display_name": "DeepSeek V4 Pro 0813", "modalities": { "input": [ - "text", - "image" - ], - "output": [ "text" - ] - }, - "limit": { - "context": 131072, - "output": 32768 - }, - "temperature": true, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-03-31", - "release_date": "2025-05-07", - "last_updated": "2025-05-07", - "type": "chat" - } - ] - }, - "edenai": { - "id": "edenai", - "name": "Eden AI", - "display_name": "Eden AI", - "api": "https://api.edenai.run/v3", - "doc": "https://docs.edenai.co", - "models": [ - { - "id": "deepseek-v4-flash-vision-exp", - "name": "DeepSeek V4 Flash Vision Exp", - "display_name": "DeepSeek V4 Flash Vision Exp", - "modalities": { - "input": [ - "text", - "image" ], "output": [ "text" @@ -42890,48 +42209,35 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", "effort_options": [ + "none", "low", "high", "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-08-21", - "last_updated": "2026-09-01", + "release_date": "2026-08-13", + "last_updated": "2026-08-22", "type": "chat" }, { - "id": "xai/grok-4.3", - "name": "Grok 4.3", - "display_name": "Grok 4.3", + "id": "deepseek/deepseek-v3.1", + "name": "DeepSeek-V3.1", + "display_name": "DeepSeek-V3.1", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 30000 + "context": 163840, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -42941,42 +42247,38 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ "none", "low", "medium", - "high", - "xhigh" + "high" ] } }, - "attachment": true, - "open_weights": false, - "release_date": "2026-04-17", - "last_updated": "2026-04-17", + "attachment": false, + "open_weights": true, + "release_date": "2025-08-21", + "last_updated": "2025-08-21", "type": "chat" }, { - "id": "xai/grok-4.5", - "name": "Grok 4.5", - "display_name": "Grok 4.5", + "id": "deepseek/deepseek-r1", + "name": "DeepSeek-R1", + "display_name": "DeepSeek-R1", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 500000, - "output": 500000 + "context": 128000, + "output": 32768 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true @@ -42984,122 +42286,106 @@ "extra_capabilities": { "reasoning": { "supported": true, - "effort_options": [ - "low", - "medium", - "high", - "xhigh" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, - "attachment": true, - "open_weights": false, - "release_date": "2026-07-08", - "last_updated": "2026-07-08", + "attachment": false, + "open_weights": true, + "knowledge": "2024-07", + "release_date": "2025-01-20", + "last_updated": "2025-05-29", "type": "chat" }, { - "id": "xai/grok-4.20-0309-non-reasoning", - "name": "Grok 4.20 (Non-Reasoning)", - "display_name": "Grok 4.20 (Non-Reasoning)", + "id": "mixedbread/toast-1", + "name": "Toast 1", + "display_name": "Toast 1", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 30000 + "context": 131000, + "output": 4000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2026-03-09", - "last_updated": "2026-03-09", + "release_date": "2026-08-13", + "last_updated": "2026-08-13", "type": "chat" }, { - "id": "xai/grok-4.20-0309-reasoning", - "name": "Grok 4.20 (Reasoning)", - "display_name": "Grok 4.20 (Reasoning)", + "id": "inference-net/schematron-v2-turbo", + "name": "Schematron V2 Turbo", + "display_name": "Schematron V2 Turbo", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 30000 + "context": 128000, + "output": 8192 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2026-03-09", - "last_updated": "2026-03-09", + "release_date": "2026-04-16", + "last_updated": "2026-04-16", "type": "chat" }, { - "id": "xai/grok-4.7", - "name": "Grok 4.7", - "display_name": "Grok 4.7", + "id": "inference-net/schematron-v2-small", + "name": "Schematron V2 Small", + "display_name": "Schematron V2 Small", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 500000, - "output": 500000 + "context": 128000, + "output": 4096 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ] - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2026-05", - "release_date": "2026-09-21", - "last_updated": "2026-09-21", + "release_date": "2026-04-16", + "last_updated": "2026-04-16", "type": "chat" }, { - "id": "xai/grok-latest", - "name": "Grok Latest (Grok 4.7)", - "display_name": "Grok Latest (Grok 4.7)", + "id": "openai/gpt-4.1-nano", + "name": "GPT-4.1 nano", + "display_name": "GPT-4.1 nano", "modalities": { "input": [ "text", @@ -43111,36 +42397,25 @@ ] }, "limit": { - "context": 500000, - "output": 500000 + "context": 1047576, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ] - } + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2026-05", - "release_date": "2026-09-21", - "last_updated": "2026-09-21", + "knowledge": "2024-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", "type": "chat" }, { - "id": "xai/grok-build-0.1", - "name": "Grok Build 0.1", - "display_name": "Grok Build 0.1", + "id": "openai/gpt-6.1-terra", + "name": "GPT-6.1 Terra", + "display_name": "GPT-6.1 Terra", "modalities": { "input": [ "text", @@ -43152,10 +42427,10 @@ ] }, "limit": { - "context": 256000, - "output": 256000 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -43163,46 +42438,54 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-04-16", - "last_updated": "2026-04-16", + "knowledge": "2026-06-01", + "release_date": "2026-10-26", + "last_updated": "2026-10-26", "type": "chat" }, { - "id": "xai/grok-4-fast-non-reasoning", - "name": "X-Ai/Grok-4-Fast-Non-Reasoning", - "display_name": "X-Ai/Grok-4-Fast-Non-Reasoning", + "id": "openai/gpt-image-1-mini", + "name": "GPT Image 1 Mini", + "display_name": "GPT Image 1 Mini", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ - "text" + "image" ] }, "limit": { - "context": 2000000, - "output": 2000000 + "context": 8192, + "output": 8192 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { "supported": false }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2025-12-18", - "last_updated": "2025-12-18", - "type": "chat" + "release_date": "2025-10-06", + "last_updated": "2025-10-06" }, { - "id": "xai/grok-4.6", - "name": "Grok 4.6", - "display_name": "Grok 4.6", + "id": "openai/gpt-5.2-fast", + "name": "GPT 5.2 (Fast)", + "display_name": "GPT 5.2 (Fast)", "modalities": { "input": [ "text", @@ -43214,81 +42497,80 @@ ] }, "limit": { - "context": 500000, - "output": 500000 + "context": 400000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", "effort_options": [ + "none", "low", "medium", "high", "xhigh" - ] + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2026-02-01", - "release_date": "2026-08-12", - "last_updated": "2026-08-12", + "knowledge": "2025-08-31", + "release_date": "2025-12-11", + "last_updated": "2025-12-11", "type": "chat" }, { - "id": "together_ai/reflection/Beam-1.0-501B-A23B", - "name": "Beam 1.0 501B A23B (Together AI)", - "display_name": "Beam 1.0 501B A23B (Together AI)", + "id": "openai/gpt-realtime-1.5", + "name": "GPT-Realtime-1.5", + "display_name": "GPT-Realtime-1.5", "modalities": { "input": [ - "text" + "text", + "audio" ], "output": [ - "text" + "text", + "audio" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 32000, + "output": 4096 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ] - } + "supported": false }, - "attachment": false, - "open_weights": true, - "knowledge": "2026-06-30", - "release_date": "2026-10-05", - "last_updated": "2026-10-16", - "type": "chat" + "attachment": true, + "open_weights": false, + "knowledge": "2024-09-30", + "release_date": "2026-02-23", + "last_updated": "2026-02-23" }, { - "id": "together_ai/meta-models/Muse-Glimmer-30B", - "name": "Muse Glimmer 30B (Together AI)", - "display_name": "Muse Glimmer 30B (Together AI)", + "id": "openai/gpt-oss-20b", + "name": "GPT OSS 20B", + "display_name": "GPT OSS 20B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" @@ -43296,7 +42578,7 @@ }, "limit": { "context": 131072, - "output": 131072 + "output": 8192 }, "temperature": true, "tool_call": true, @@ -43306,25 +42588,25 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ "low", "medium", - "high", - "xhigh" + "high" ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2026-01-04", - "release_date": "2026-08-10", - "last_updated": "2026-08-10", + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "together_ai/openai/gpt-oss-120b", - "name": "GPT OSS 120B (Together AI)", - "display_name": "GPT OSS 120B (Together AI)", + "id": "openai/gpt-oss-safeguard-120b", + "name": "GPT OSS Safeguard 120B", + "display_name": "GPT OSS Safeguard 120B", "modalities": { "input": [ "text" @@ -43334,8 +42616,8 @@ ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 128000, + "output": 16000 }, "temperature": true, "tool_call": true, @@ -43345,7 +42627,6 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ "low", "medium", @@ -43355,26 +42636,27 @@ }, "attachment": false, "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "release_date": "2025-10-29", + "last_updated": "2025-10-29", "type": "chat" }, { - "id": "together_ai/deepseek-ai/DeepSeek-V4-Pro-0813", - "name": "DeepSeek V4 Pro 0813 (Together AI)", - "display_name": "DeepSeek V4 Pro 0813 (Together AI)", + "id": "openai/gpt-5.6-terra", + "name": "GPT 5.6 Terra", + "display_name": "GPT 5.6 Terra", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 384000 + "context": 1050000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -43385,116 +42667,129 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ "none", "low", + "medium", "high", + "xhigh", "max" - ] + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-08-13", - "last_updated": "2026-08-22", + "attachment": true, + "open_weights": false, + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "together_ai/deepseek-ai/DeepSeek-V4-Flash-0731", - "name": "DeepSeek V4 Flash 0731 (Together AI)", - "display_name": "DeepSeek V4 Flash 0731 (Together AI)", + "id": "openai/whisper-1", + "name": "Whisper", + "display_name": "Whisper", "modalities": { "input": [ - "text" + "audio" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 384000 + "context": 8192, + "output": 8192 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "none", - "low", - "high", - "max" - ] - } + "supported": false }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-07-31", - "last_updated": "2026-07-31", - "type": "chat" + "attachment": true, + "open_weights": false, + "release_date": "2023-03-01", + "last_updated": "2023-03-01" }, { - "id": "together_ai/deepseek-ai/DeepSeek-V4.1-Flash-1017", - "name": "DeepSeek V4.1 Flash 1017 (Together AI)", - "display_name": "DeepSeek V4.1 Flash 1017 (Together AI)", + "id": "openai/gpt-5.4", + "name": "GPT 5.4", + "display_name": "GPT 5.4", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 384000 + "context": 1050000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", "effort_options": [ "none", "low", + "medium", "high", - "max" - ] + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-10-17", - "last_updated": "2026-10-17", + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-03-05", + "last_updated": "2026-03-05", "type": "chat" }, { - "id": "together_ai/deepseek-ai/DeepSeek-V4.1-Flash", - "name": "DeepSeek V4.1 Flash (Together AI)", - "display_name": "DeepSeek V4.1 Flash (Together AI)", + "id": "openai/gpt-5.6-sol", + "name": "GPT 5.6 Sol", + "display_name": "GPT 5.6 Sol", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 384000 + "context": 1050000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -43505,157 +42800,185 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ "none", "low", + "medium", "high", + "xhigh", "max" - ] + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-09-10", - "last_updated": "2026-09-10", + "open_weights": false, + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "together_ai/thinkingmachines/Inkling", - "name": "Inkling (Together AI)", - "display_name": "Inkling (Together AI)", + "id": "openai/gpt-5.4-mini", + "name": "GPT 5.4 Mini", + "display_name": "GPT 5.4 Mini", "modalities": { "input": [ "text", "image", - "audio" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 524288, - "output": 1048576 + "context": 400000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", "effort_options": [ "none", - "minimal", "low", "medium", "high", - "max" - ] + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, - "open_weights": true, - "release_date": "2026-07-15", - "last_updated": "2026-07-15", + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-03-17", + "last_updated": "2026-03-17", "type": "chat" }, { - "id": "cerebras/gpt-oss-120b", - "name": "GPT OSS 120B (Cerebras)", - "display_name": "GPT OSS 120B (Cerebras)", + "id": "openai/gpt-4o", + "name": "GPT-4o", + "display_name": "GPT-4o", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 128000, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "low", - "medium", - "high" - ] - } + "supported": false }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "attachment": true, + "open_weights": false, + "knowledge": "2023-09", + "release_date": "2024-05-13", + "last_updated": "2024-08-06", "type": "chat" }, { - "id": "flexai/Step-3.7-Flash", - "name": "Step 3.7 Flash (FlexAI)", - "display_name": "Step 3.7 Flash (FlexAI)", + "id": "openai/gpt-5.1-codex-mini", + "name": "GPT-5.1 Codex mini", + "display_name": "GPT-5.1 Codex mini", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 256000 + "context": 400000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", "effort_options": [ + "none", "low", "medium", "high" - ] + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, - "open_weights": true, - "knowledge": "2026-03-01", - "release_date": "2026-05-29", - "last_updated": "2026-05-29", + "open_weights": false, + "knowledge": "2024-09-30", + "release_date": "2025-11-13", + "last_updated": "2025-11-13", "type": "chat" }, { - "id": "flexai/Muse-Glimmer-30B", - "name": "Muse Glimmer 30B (FlexAI)", - "display_name": "Muse Glimmer 30B (FlexAI)", + "id": "openai/gpt-5.6-luna", + "name": "GPT 5.6 Luna", + "display_name": "GPT 5.6 Luna", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 131072 + "context": 1050000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -43665,79 +42988,83 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ + "none", "low", "medium", "high", - "xhigh" - ] + "xhigh", + "max" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, - "open_weights": true, - "knowledge": "2026-01-04", - "release_date": "2026-08-10", - "last_updated": "2026-08-10", + "open_weights": false, + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "flexai/DeepSeek-V4-Flash-0731", - "name": "DeepSeek V4 Flash 0731 (FlexAI)", - "display_name": "DeepSeek V4 Flash 0731 (FlexAI)", + "id": "openai/gpt-4o-mini-fast", + "name": "GPT-4o mini (Fast)", + "display_name": "GPT-4o mini (Fast)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 384000 + "context": 128000, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "none", - "low", - "high", - "max" - ] - } + "supported": false }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-07-31", - "last_updated": "2026-07-31", + "attachment": true, + "open_weights": false, + "knowledge": "2023-09", + "release_date": "2024-07-18", + "last_updated": "2024-07-18", "type": "chat" }, { - "id": "flexai/DeepSeek-V4.1-Flash-1017", - "name": "DeepSeek V4.1 Flash 1017 (FlexAI)", - "display_name": "DeepSeek V4.1 Flash 1017 (FlexAI)", + "id": "openai/gpt-6.1-terra-fast", + "name": "GPT-6.1 Terra (Fast)", + "display_name": "GPT-6.1 Terra (Fast)", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 384000 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -43748,141 +43075,153 @@ "effort_options": [ "none", "low", + "medium", "high", + "xhigh", "max" ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-10-17", - "last_updated": "2026-10-17", + "open_weights": false, + "knowledge": "2026-06-01", + "release_date": "2026-10-26", + "last_updated": "2026-10-26", "type": "chat" }, { - "id": "flexai/DeepSeek-V4.1-Flash", - "name": "DeepSeek V4.1 Flash (FlexAI)", - "display_name": "DeepSeek V4.1 Flash (FlexAI)", + "id": "openai/gpt-5.1-codex", + "name": "GPT-5.1-Codex", + "display_name": "GPT-5.1-Codex", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 384000 + "context": 400000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", "effort_options": [ "none", "low", - "high", - "max" - ] + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-09-10", - "last_updated": "2026-09-10", + "open_weights": false, + "knowledge": "2024-09-30", + "release_date": "2025-11-13", + "last_updated": "2025-11-13", "type": "chat" }, { - "id": "flexai/gpt-oss-120b", - "name": "GPT OSS 120B (FlexAI)", - "display_name": "GPT OSS 120B (FlexAI)", + "id": "openai/gpt-5.1-thinking-fast", + "name": "GPT 5.1 Thinking (Fast)", + "display_name": "GPT 5.1 Thinking (Fast)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 400000, + "output": 128000 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", "effort_options": [ + "none", "low", "medium", "high" - ] + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "attachment": true, + "open_weights": false, + "release_date": "2025-11-12", + "last_updated": "2025-11-12", "type": "chat" }, { - "id": "flexai/gpt-oss-20b", - "name": "GPT OSS 20B (FlexAI)", - "display_name": "GPT OSS 20B (FlexAI)", + "id": "openai/gpt-4o-transcribe", + "name": "GPT-4o Transcribe", + "display_name": "GPT-4o Transcribe", "modalities": { "input": [ - "text" + "audio" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 16000, + "output": 2000 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "low", - "medium", - "high" - ] - } + "supported": false }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", - "type": "chat" + "attachment": true, + "open_weights": false, + "knowledge": "2024-06-01", + "release_date": "2025-03-20", + "last_updated": "2025-03-20" }, { - "id": "meta/muse-spark-1.3", - "name": "Muse Spark 1.3 (Meta)", - "display_name": "Muse Spark 1.3 (Meta)", + "id": "openai/gpt-4.1", + "name": "GPT-4.1", + "display_name": "GPT-4.1", "modalities": { "input": [ "text", @@ -43894,176 +43233,94 @@ ] }, "limit": { - "context": 1048576, - "output": 131072 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "minimal", - "low", - "medium", - "high", - "xhigh", - "max" - ] - } - }, - "attachment": true, - "open_weights": false, - "release_date": "2026-09-02", - "last_updated": "2026-09-02", - "type": "chat" - }, - { - "id": "meta/muse-wonder-1.0", - "name": "Muse Wonder (Meta)", - "display_name": "Muse Wonder (Meta)", - "modalities": { - "input": [ - "text", - "image", - "pdf" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 1048576, - "output": 131072 + "context": 1047576, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "minimal", - "low", - "medium", - "high", - "xhigh", - "max" - ] - } + "supported": false }, "attachment": true, "open_weights": false, - "release_date": "2026-10-12", - "last_updated": "2026-10-12", + "knowledge": "2024-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", "type": "chat" }, { - "id": "meta/muse-spark-1.2", - "name": "Muse Spark 1.2 (Meta)", - "display_name": "Muse Spark 1.2 (Meta)", + "id": "openai/gpt-image-1.5", + "name": "GPT Image 1.5", + "display_name": "GPT Image 1.5", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ - "text" + "image" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 8192, + "output": 8192 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "minimal", - "low", - "medium", - "high", - "xhigh" - ] - } + "supported": false }, "attachment": true, "open_weights": false, - "release_date": "2026-08-05", - "last_updated": "2026-08-05", - "type": "chat" + "release_date": "2025-11-25", + "last_updated": "2025-11-25" }, { - "id": "meta/muse-spark-1.1", - "name": "Muse Spark 1.1 (Meta)", - "display_name": "Muse Spark 1.1 (Meta)", + "id": "openai/gpt-live-1", + "name": "GPT-Live 1", + "display_name": "GPT-Live 1", "modalities": { "input": [ "text", - "image", - "pdf" + "audio" ], "output": [ - "text" + "text", + "audio" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 8192, + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "minimal", - "low", - "medium", - "high", - "xhigh" - ] - } + "supported": false }, "attachment": true, "open_weights": false, - "release_date": "2026-04-08", - "last_updated": "2026-07-09", - "type": "chat" + "knowledge": "2025-07-31", + "release_date": "2026-09-10", + "last_updated": "2026-09-10" }, { - "id": "arkanecloud/ministral-14b", - "name": "Ministral 14B (Arkanecloud)", - "display_name": "Ministral 14B (Arkanecloud)", + "id": "openai/gpt-realtime-2", + "name": "gpt-realtime-2", + "display_name": "gpt-realtime-2", "modalities": { "input": [ "text", - "image" + "audio" ], "output": [ - "text" + "text", + "audio" ] }, "limit": { - "context": 32768, - "output": 262144 + "context": 128000, + "output": 32000 }, "temperature": true, "tool_call": true, @@ -44071,42 +43328,42 @@ "supported": false }, "attachment": true, - "open_weights": true, - "release_date": "2025-12-02", - "last_updated": "2025-12-02", - "type": "chat" + "open_weights": false, + "knowledge": "2024-09-30", + "release_date": "2026-05-07", + "last_updated": "2026-05-07" }, { - "id": "arkanecloud/Qwen/Qwen3-235B-A22B-Instruct-2507", - "name": "Qwen3 235B-A22B Instruct 2507 (Arkanecloud)", - "display_name": "Qwen3 235B-A22B Instruct 2507 (Arkanecloud)", + "id": "openai/tts-1", + "name": "TTS-1", + "display_name": "TTS-1", "modalities": { "input": [ "text" ], "output": [ - "text" + "audio" ] }, "limit": { - "context": 262000, - "output": 16384 + "context": 8192, + "output": 8192 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { "supported": false }, "attachment": false, - "open_weights": true, - "release_date": "2025-07-21", - "last_updated": "2025-07-21", - "type": "chat" + "open_weights": false, + "release_date": "2023-11-06", + "last_updated": "2023-11-06", + "type": "tts" }, { - "id": "arkanecloud/nvidia/nemotron-3-ultra-550b-a55b", - "name": "Nemotron 3 Ultra 550B A55B (Arkanecloud)", - "display_name": "Nemotron 3 Ultra 550B A55B (Arkanecloud)", + "id": "openai/text-embedding-3-small", + "name": "text-embedding-3-small", + "display_name": "text-embedding-3-small", "modalities": { "input": [ "text" @@ -44116,85 +43373,64 @@ ] }, "limit": { - "context": 512288, - "output": 128000 + "context": 8192, + "output": 8192 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "none", - "medium", - "high" - ] - } + "supported": false }, "attachment": false, - "open_weights": true, - "knowledge": "2025-09", - "release_date": "2026-06-04", - "last_updated": "2026-06-04", - "type": "chat" + "open_weights": false, + "release_date": "2024-01-25", + "last_updated": "2024-01-25", + "type": "embedding" }, { - "id": "arkanecloud/nvidia/nemotron-3-super-120b-a12b", - "name": "Nemotron 3 Super 120B A12B (Arkanecloud)", - "display_name": "Nemotron 3 Super 120B A12B (Arkanecloud)", + "id": "openai/gpt-image-2.5-flare", + "name": "GPT Image 2.5 Flare", + "display_name": "GPT Image 2.5 Flare", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ - "text" + "image" ] }, "limit": { - "context": 256000, - "output": 262144 + "context": 8192, + "output": 8192 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "low", - "medium" - ] - } + "supported": false }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-06", - "release_date": "2026-03-11", - "last_updated": "2026-03-11", - "type": "chat" + "attachment": true, + "open_weights": false, + "release_date": "2026-09-08", + "last_updated": "2026-09-08" }, { - "id": "arkanecloud/openai/gpt-oss-120b", - "name": "GPT OSS 120B (Arkanecloud)", - "display_name": "GPT OSS 120B (Arkanecloud)", + "id": "openai/o3-pro", + "name": "o3 Pro", + "display_name": "o3 Pro", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 200000, + "output": 100000 }, "temperature": true, "tool_call": true, @@ -44205,35 +43441,41 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ "low", "medium", "high" - ] + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "attachment": true, + "open_weights": false, + "knowledge": "2024-05", + "release_date": "2025-06-10", + "last_updated": "2025-06-10", "type": "chat" }, { - "id": "arkanecloud/openai/gpt-oss-20b", - "name": "GPT OSS 20B (Arkanecloud)", - "display_name": "GPT OSS 20B (Arkanecloud)", + "id": "openai/gpt-5.3-codex", + "name": "GPT 5.3 Codex", + "display_name": "GPT 5.3 Codex", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 400000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -44244,36 +43486,46 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ "low", "medium", "high" - ] + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "attachment": true, + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-02-05", + "last_updated": "2026-02-05", "type": "chat" }, { - "id": "arkanecloud/deepseek-ai/DeepSeek-V4.1-Flash", - "name": "DeepSeek V4.1 Flash (Arkanecloud)", - "display_name": "DeepSeek V4.1 Flash (Arkanecloud)", + "id": "openai/gpt-oss-safeguard-20b", + "name": "gpt-oss-safeguard-20b", + "display_name": "gpt-oss-safeguard-20b", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 384000 + "context": 128000, + "output": 16000 }, "temperature": true, "tool_call": true, @@ -44283,123 +43535,66 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ - "none", "low", - "high", - "max" + "medium", + "high" ] } }, - "attachment": true, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-09-10", - "last_updated": "2026-09-10", - "type": "chat" - }, - { - "id": "arkanecloud/meta-llama/Llama-3.3-70B-Instruct", - "name": "Llama-3.3-70B-Instruct (Arkanecloud)", - "display_name": "Llama-3.3-70B-Instruct (Arkanecloud)", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 128000, - "output": 4096 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": true, - "knowledge": "2023-12", - "release_date": "2024-12-06", - "last_updated": "2024-12-06", - "type": "chat" - }, - { - "id": "arkanecloud/meta-llama/Llama-3.1-8B-Instruct", - "name": "Llama-3.1-8B-Instruct (Arkanecloud)", - "display_name": "Llama-3.1-8B-Instruct (Arkanecloud)", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 131072, - "output": 4096 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, "attachment": false, "open_weights": true, - "knowledge": "2023-12", - "release_date": "2024-07-23", - "last_updated": "2024-07-23", + "release_date": "2025-10-29", + "last_updated": "2025-10-29", "type": "chat" }, { - "id": "arkanecloud/meta-llama/Llama-3.1-70B-Instruct", - "name": "Llama-3.1-70B-Instruct (Arkanecloud)", - "display_name": "Llama-3.1-70B-Instruct (Arkanecloud)", + "id": "openai/gpt-4o-fast", + "name": "GPT-4o (Fast)", + "display_name": "GPT-4o (Fast)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 4096 + "context": 128000, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, - "open_weights": true, - "knowledge": "2023-12", - "release_date": "2024-07-23", - "last_updated": "2024-07-23", + "attachment": true, + "open_weights": false, + "knowledge": "2023-09", + "release_date": "2024-05-13", + "last_updated": "2024-08-06", "type": "chat" }, { - "id": "moonshot/kimi-k2.7-code", - "name": "Kimi K2.7 Code", - "display_name": "Kimi K2.7 Code", + "id": "openai/gpt-5.6-sol-fast", + "name": "GPT 5.6 Sol (Fast)", + "display_name": "GPT 5.6 Sol (Fast)", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1050000, + "output": 128000 }, "temperature": false, "tool_call": true, @@ -44409,35 +43604,43 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "effort_options": [ + "none", + "minimal", + "low", + "medium", + "high", + "xhigh", + "max" + ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-06-12", - "last_updated": "2026-06-12", + "open_weights": false, + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "moonshot/kimi-k2.6", - "name": "Kimi K2.6", - "display_name": "Kimi K2.6", + "id": "openai/gpt-6-luna-fast", + "name": "GPT-6 Luna (Fast)", + "display_name": "GPT-6 Luna (Fast)", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -44445,33 +43648,40 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-20", - "last_updated": "2026-04-20", + "open_weights": false, + "knowledge": "2026-05-18", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "moonshot/kimi-k3", - "name": "Kimi K3", - "display_name": "Kimi K3", + "id": "openai/gpt-6-luna", + "name": "GPT-6 Luna", + "display_name": "GPT-6 Luna", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 1050000, + "output": 128000 }, "temperature": false, "tool_call": true, @@ -44481,37 +43691,40 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ + "none", "low", + "medium", "high", + "xhigh", "max" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-16", + "open_weights": false, + "knowledge": "2026-05-18", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "moonshot/kimi-k3.1-pro", - "name": "Kimi K3.1 Pro", - "display_name": "Kimi K3.1 Pro", + "id": "openai/gpt-6-astra-fast", + "name": "GPT-6 Astra (Fast)", + "display_name": "GPT-6 Astra (Fast)", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 1050000, + "output": 128000 }, "temperature": false, "tool_call": true, @@ -44523,73 +43736,80 @@ "reasoning": { "effort_options": [ "low", + "medium", "high", + "xhigh", "max" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-10-23", - "last_updated": "2026-10-23", + "release_date": "2026-09-04", + "last_updated": "2026-09-04", "type": "chat" }, { - "id": "moonshot/kimi-k2.7-code-highspeed", - "name": "Kimi K2.7 Code Highspeed", - "display_name": "Kimi K2.7 Code Highspeed", + "id": "openai/gpt-realtime-2.1", + "name": "gpt-realtime-2.1", + "display_name": "gpt-realtime-2.1", "modalities": { "input": [ "text", - "image", - "video" + "audio" ], "output": [ - "text" + "text", + "audio" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 128000, + "output": 32000 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { - "supported": true + "effort_options": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-06-12", - "last_updated": "2026-06-12", - "type": "chat" + "open_weights": false, + "knowledge": "2024-09-30", + "release_date": "2026-07-06", + "last_updated": "2026-07-06" }, { - "id": "google/gemini-3-pro-image", - "name": "Nano Banana Pro", - "display_name": "Nano Banana Pro", + "id": "openai/gpt-5-codex", + "name": "GPT-5-Codex", + "display_name": "GPT-5-Codex", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ - "text", - "image" + "text" ] }, "limit": { - "context": 65536, - "output": 32768 + "context": 400000, + "output": 128000 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { "supported": true, "default": true @@ -44598,65 +43818,80 @@ "reasoning": { "supported": true, "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ + "mode": "effort", + "effort": "medium", + "effort_options": [ + "minimal", "low", + "medium", "high" ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-05-28", - "last_updated": "2026-05-28" + "knowledge": "2024-09-30", + "release_date": "2025-09-15", + "last_updated": "2025-09-15", + "type": "chat" }, { - "id": "google/deep-research-preview-04-2026", - "name": "Gemini Deep Research Preview", - "display_name": "Gemini Deep Research Preview", + "id": "openai/gpt-6.1-sol-fast", + "name": "GPT-6.1 Sol (Fast)", + "display_name": "GPT-6.1 Sol (Fast)", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 1050000, + "output": 128000 }, "temperature": false, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-04-21", - "last_updated": "2026-04-21", + "knowledge": "2026-04-30", + "release_date": "2026-09-29", + "last_updated": "2026-09-29", "type": "chat" }, { - "id": "google/gemini-flash-latest", - "name": "Gemini Flash Latest (Gemini 3.8 Flash)", - "display_name": "Gemini Flash Latest (Gemini 3.8 Flash)", + "id": "openai/o3-fast", + "name": "o3 (Fast)", + "display_name": "o3 (Fast)", "modalities": { "input": [ "text", "image", - "video", - "audio", "pdf" ], "output": [ @@ -44664,10 +43899,10 @@ ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 200000, + "output": 100000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -44675,121 +43910,114 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ "low", "medium", "high" - ] + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "release_date": "2026-09-02", - "last_updated": "2026-09-02", + "knowledge": "2024-05", + "release_date": "2025-04-16", + "last_updated": "2025-04-16", "type": "chat" }, { - "id": "google/gemini-3.1-flash-lite-image", - "name": "Nano Banana 2 Lite", - "display_name": "Nano Banana 2 Lite", + "id": "openai/gpt-6-sol-fast", + "name": "GPT-6 Sol (Fast)", + "display_name": "GPT-6 Sol (Fast)", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ - "text", - "image" + "text" ] }, "limit": { - "context": 65536, - "output": 4096 + "context": 1050000, + "output": 128000 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ - "minimal", - "high" + "none", + "low", + "medium", + "high", + "xhigh", + "max" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-06-30", - "last_updated": "2026-06-30" + "knowledge": "2026-04-20", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", + "type": "chat" }, { - "id": "google/gemini-4-argon", - "name": "Gemini 4 Argon", - "display_name": "Gemini 4 Argon", + "id": "openai/gpt-4o-mini-transcribe", + "name": "GPT-4o mini Transcribe", + "display_name": "GPT-4o mini Transcribe", "modalities": { "input": [ - "text", - "image", - "video", - "audio", - "pdf" + "audio" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 16000, + "output": 2000 }, "temperature": false, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high" - ] - } + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-10-13", - "last_updated": "2026-10-13", - "type": "chat" + "knowledge": "2024-06-01", + "release_date": "2025-03-20", + "last_updated": "2025-03-20" }, { - "id": "google/gemini-robotics-er-2-preview", - "name": "Gemini Robotics-ER 2 Preview", - "display_name": "Gemini Robotics-ER 2 Preview", + "id": "openai/gpt-5-mini", + "name": "GPT-5 Mini", + "display_name": "GPT-5 Mini", "modalities": { "input": [ "text", "image", - "pdf", - "audio", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 65536 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -44797,30 +44025,40 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ "minimal", "low", "medium", "high" - ] + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "release_date": "2026-07-30", - "last_updated": "2026-07-30", + "knowledge": "2024-05-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "google/gemini-3.5-flash", - "name": "Gemini 3.5 Flash", - "display_name": "Gemini 3.5 Flash", + "id": "openai/gpt-5.1-thinking", + "name": "GPT 5.1 Thinking", + "display_name": "GPT 5.1 Thinking", "modalities": { "input": [ "text", "image", - "video", - "audio", "pdf" ], "output": [ @@ -44828,51 +44066,51 @@ ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 400000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", "low", "medium", "high" ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-05-19", - "last_updated": "2026-05-19", + "knowledge": "2024-10", + "release_date": "2025-11-12", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "google/gemini-pro-latest", - "name": "Gemini Pro Latest (Gemini 4 Argon)", - "display_name": "Gemini Pro Latest (Gemini 4 Argon)", + "id": "openai/gpt-6-sol", + "name": "GPT-6 Sol", + "display_name": "GPT-6 Sol", "modalities": { "input": [ "text", "image", - "video", - "audio", "pdf" ], "output": [ @@ -44880,8 +44118,8 @@ ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 1050000, + "output": 128000 }, "temperature": false, "tool_call": true, @@ -44892,68 +44130,64 @@ "extra_capabilities": { "reasoning": { "effort_options": [ + "none", "low", "medium", - "high" + "high", + "xhigh", + "max" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-10-13", - "last_updated": "2026-10-13", + "knowledge": "2026-04-20", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "google/deep-research-max-preview-04-2026", - "name": "Deep Research Max Preview", - "display_name": "Deep Research Max Preview", + "id": "openai/tts-1-hd", + "name": "TTS-1 HD", + "display_name": "TTS-1 HD", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ - "text" + "audio" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 8192, + "output": 8192 }, "temperature": false, "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-04-21", - "last_updated": "2026-04-21", - "type": "chat" + "release_date": "2023-11-06", + "last_updated": "2023-11-06", + "type": "tts" }, { - "id": "google/gemini-3.5-flash-lite", - "name": "Gemini 3.5 Flash Lite", - "display_name": "Gemini 3.5 Flash Lite", + "id": "openai/gpt-oss-120b", + "name": "GPT OSS 120B", + "display_name": "GPT OSS 120B", "modalities": { "input": [ - "text", - "image", - "video", - "audio", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 131072, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -44965,61 +44199,80 @@ "reasoning": { "supported": true, "effort_options": [ - "minimal", "low", "medium", "high" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-07-21", - "last_updated": "2026-07-21", + "attachment": false, + "open_weights": true, + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "google/gemini-2.5-flash-image", - "name": "Nano Banana", - "display_name": "Nano Banana", + "id": "openai/gpt-5.4-mini-fast", + "name": "GPT 5.4 Mini (Fast)", + "display_name": "GPT 5.4 Mini (Fast)", "modalities": { "input": [ - "audio", - "image", "text", - "video" + "image", + "pdf" ], "output": [ - "text", - "image" + "text" ] }, "limit": { - "context": 32768, - "output": 32768 + "context": 400000, + "output": 128000 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } }, "attachment": true, "open_weights": false, - "knowledge": "2024-06", - "release_date": "2025-08-26", - "last_updated": "2025-08-26" + "knowledge": "2025-08-31", + "release_date": "2026-03-17", + "last_updated": "2026-03-17", + "type": "chat" }, { - "id": "google/gemini-3.1-pro-preview", - "name": "Gemini 3.1 Pro Preview", - "display_name": "Gemini 3.1 Pro Preview", + "id": "openai/gpt-5.4-pro", + "name": "GPT 5.4 Pro", + "display_name": "GPT 5.4 Pro", "modalities": { "input": [ "text", "image", - "video", - "audio", "pdf" ], "output": [ @@ -45027,8 +44280,8 @@ ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 1050000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -45040,36 +44293,37 @@ "reasoning": { "supported": true, "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ + "mode": "effort", + "effort": "high", + "effort_options": [ + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ "low", + "medium", "high" ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-02-19", - "last_updated": "2026-02-19", + "knowledge": "2025-08-31", + "release_date": "2026-03-05", + "last_updated": "2026-03-05", "type": "chat" }, { - "id": "google/gemini-3.8-flash", - "name": "Gemini 3.8 Flash", - "display_name": "Gemini 3.8 Flash", + "id": "openai/gpt-5.1-codex-max", + "name": "GPT 5.1 Codex Max", + "display_name": "GPT 5.1 Codex Max", "modalities": { "input": [ "text", "image", - "video", - "audio", "pdf" ], "output": [ @@ -45077,60 +44331,63 @@ ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 400000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", "low", "medium", "high" ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] - } + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } }, "attachment": true, "open_weights": false, - "release_date": "2026-09-02", - "last_updated": "2026-09-02", + "knowledge": "2024-09-30", + "release_date": "2025-11-13", + "last_updated": "2025-11-13", "type": "chat" }, { - "id": "google/gemini-3-pro-image-preview", - "name": "Nano Banana Pro Preview", - "display_name": "Nano Banana Pro Preview", + "id": "openai/gpt-5", + "name": "GPT-5", + "display_name": "GPT-5", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ - "text", - "image" + "text" ] }, "limit": { - "context": 65536, - "output": 32768 + "context": 400000, + "output": 128000 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { "supported": true, "default": true @@ -45139,45 +44396,50 @@ "reasoning": { "supported": true, "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ + "mode": "effort", + "effort": "medium", + "effort_options": [ + "minimal", "low", + "medium", "high" ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-11-20", - "last_updated": "2025-11-20" + "knowledge": "2024-09-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", + "type": "chat" }, { - "id": "google/gemini-3.1-flash-image-preview", - "name": "Nano Banana 2 Preview", - "display_name": "Nano Banana 2 Preview", + "id": "openai/gpt-5.3-codex-fast", + "name": "GPT 5.3 Codex (Fast)", + "display_name": "GPT 5.3 Codex (Fast)", "modalities": { "input": [ + "text", "image", - "text" + "pdf" ], "output": [ - "text", - "image" + "text" ] }, "limit": { - "context": 65536, - "output": 65536 + "context": 400000, + "output": 128000 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, "default": true @@ -45185,28 +44447,39 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ - "minimal", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", "high" - ] + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-02-26", - "last_updated": "2026-02-26" + "knowledge": "2025-08-31", + "release_date": "2026-02-05", + "last_updated": "2026-02-05", + "type": "chat" }, { - "id": "google/gemini-3.7-flash", - "name": "Gemini 3.7 Flash", - "display_name": "Gemini 3.7 Flash", + "id": "openai/gpt-6.1-sol", + "name": "GPT-6.1 Sol", + "display_name": "GPT-6.1 Sol", "modalities": { "input": [ "text", "image", - "video", - "audio", "pdf" ], "output": [ @@ -45214,10 +44487,10 @@ ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -45225,40 +44498,30 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", + "effort_options": [ "low", "medium", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" + "high", + "xhigh", + "max" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-08-13", - "last_updated": "2026-08-13", + "knowledge": "2026-04-30", + "release_date": "2026-09-29", + "last_updated": "2026-09-29", "type": "chat" }, { - "id": "google/gemini-3-flash-preview", - "name": "Gemini 3 Flash Preview", - "display_name": "Gemini 3 Flash Preview", + "id": "openai/gpt-5-mini-fast", + "name": "GPT-5 mini (Fast)", + "display_name": "GPT-5 mini (Fast)", "modalities": { "input": [ "text", "image", - "video", - "audio", "pdf" ], "output": [ @@ -45266,10 +44529,10 @@ ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -45277,40 +44540,29 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ + "effort_options": [ "minimal", "low", "medium", "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-12-17", - "last_updated": "2025-12-17", + "knowledge": "2024-05-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "google/gemini-3.6-flash", - "name": "Gemini 3.6 Flash", - "display_name": "Gemini 3.6 Flash", + "id": "openai/gpt-4.1-mini-fast", + "name": "GPT-4.1 mini (Fast)", + "display_name": "GPT-4.1 mini (Fast)", "modalities": { "input": [ "text", "image", - "video", - "audio", "pdf" ], "output": [ @@ -45318,51 +44570,29 @@ ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 1047576, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", - "low", - "medium", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] - } + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-07-21", - "last_updated": "2026-07-21", + "knowledge": "2024-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", "type": "chat" }, { - "id": "google/gemini-3.1-flash-lite-preview", - "name": "Gemini 3.1 Flash Lite Preview", - "display_name": "Gemini 3.1 Flash Lite Preview", + "id": "openai/gpt-5.2-codex", + "name": "GPT-5.2-Codex", + "display_name": "GPT-5.2-Codex", "modalities": { "input": [ "text", "image", - "video", - "audio", "pdf" ], "output": [ @@ -45370,8 +44600,8 @@ ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 400000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -45381,70 +44611,93 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ - "minimal", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ "low", "medium", "high" - ] + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-03-03", - "last_updated": "2026-03-03", + "knowledge": "2025-08-31", + "release_date": "2025-12-11", + "last_updated": "2025-12-11", "type": "chat" }, { - "id": "google/gemini-3.1-flash-image", - "name": "Nano Banana 2", - "display_name": "Nano Banana 2", + "id": "openai/gpt-5.2", + "name": "GPT-5.2", + "display_name": "GPT-5.2", "modalities": { "input": [ + "text", "image", - "text" + "pdf" ], "output": [ - "text", - "image" + "text" ] }, "limit": { - "context": 65536, - "output": 32768 + "context": 400000, + "output": 128000 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", "effort_options": [ - "minimal", + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", "high" - ] + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-05-28", - "last_updated": "2026-05-28" + "knowledge": "2025-08-31", + "release_date": "2025-12-11", + "last_updated": "2025-12-11", + "type": "chat" }, { - "id": "google/gemini-3.1-pro-preview-customtools", - "name": "Gemini 3.1 Pro Preview Custom Tools", - "display_name": "Gemini 3.1 Pro Preview Custom Tools", + "id": "openai/gpt-5-pro", + "name": "GPT-5 pro", + "display_name": "GPT-5 pro", "modalities": { "input": [ "text", "image", - "video", - "audio", "pdf" ], "output": [ @@ -45452,8 +44705,8 @@ ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 400000, + "output": 272000 }, "temperature": true, "tool_call": true, @@ -45465,36 +44718,32 @@ "reasoning": { "supported": true, "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ + "mode": "fixed", + "effort": "high", + "verbosity": "medium", + "verbosity_options": [ "low", + "medium", "high" ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-02-19", - "last_updated": "2026-02-19", + "knowledge": "2024-09-30", + "release_date": "2025-10-06", + "last_updated": "2025-10-06", "type": "chat" }, { - "id": "google/gemini-3.1-flash-lite", - "name": "Gemini 3.1 Flash Lite", - "display_name": "Gemini 3.1 Flash Lite", + "id": "openai/o3", + "name": "o3", + "display_name": "o3", "modalities": { "input": [ "text", "image", - "video", - "audio", "pdf" ], "output": [ @@ -45502,10 +44751,10 @@ ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 200000, + "output": 100000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -45514,109 +44763,125 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ - "minimal", "low", "medium", "high" - ] + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-05-07", - "last_updated": "2026-05-07", + "knowledge": "2024-05", + "release_date": "2025-04-16", + "last_updated": "2025-04-16", "type": "chat" }, { - "id": "google/gemini-nano-banana-2.1", - "name": "Nano Banana 2.1", - "display_name": "Nano Banana 2.1", + "id": "openai/gpt-realtime-mini", + "name": "GPT-Realtime mini", + "display_name": "GPT-Realtime mini", "modalities": { "input": [ - "image", - "text" + "text", + "audio" ], "output": [ "text", - "image" + "audio" ] }, "limit": { - "context": 65536, - "output": 32768 + "context": 32000, + "output": 4096 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "minimal", - "medium", - "high" - ] - } + "supported": false }, "attachment": true, "open_weights": false, - "release_date": "2026-10-06", - "last_updated": "2026-10-06" + "knowledge": "2023-10-01", + "release_date": "2025-10-06", + "last_updated": "2025-10-06" }, { - "id": "minimax/MiniMax-M2.1", - "name": "MiniMax-M2.1", - "display_name": "MiniMax-M2.1", + "id": "openai/gpt-5.4-nano", + "name": "GPT 5.4 Nano", + "display_name": "GPT 5.4 Nano", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 400000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "release_date": "2025-12-23", - "last_updated": "2025-12-23", + "attachment": true, + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-03-17", + "last_updated": "2026-03-17", "type": "chat" }, { - "id": "minimax/MiniMax-M2.7", - "name": "MiniMax-M2.7", - "display_name": "MiniMax-M2.7", + "id": "openai/o1", + "name": "o1", + "display_name": "o1", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 200000, + "output": 100000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -45625,67 +44890,43 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-03-18", - "last_updated": "2026-03-18", - "type": "chat" - }, - { - "id": "minimax/MiniMax-M2", - "name": "MiniMax-M2", - "display_name": "MiniMax-M2", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 204800, - "output": 131072 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "attachment": false, - "open_weights": true, - "release_date": "2025-10-27", - "last_updated": "2025-10-27", + "attachment": true, + "open_weights": false, + "knowledge": "2023-09", + "release_date": "2024-12-05", + "last_updated": "2024-12-05", "type": "chat" }, { - "id": "minimax/MiniMax-M3.1-Flash", - "name": "MiniMax-M3.1-Flash", - "display_name": "MiniMax-M3.1-Flash", + "id": "openai/gpt-5.6-luna-fast", + "name": "GPT 5.6 Luna (Fast)", + "display_name": "GPT 5.6 Luna (Fast)", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 512000 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -45694,6 +44935,7 @@ "extra_capabilities": { "reasoning": { "effort_options": [ + "none", "low", "medium", "high", @@ -45704,27 +44946,28 @@ }, "attachment": true, "open_weights": false, - "release_date": "2026-10-19", - "last_updated": "2026-10-19", + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "minimax/MiniMax-M3", - "name": "MiniMax-M3", - "display_name": "MiniMax-M3", + "id": "openai/gpt-5.5-pro", + "name": "GPT 5.5 Pro", + "display_name": "GPT 5.5 Pro", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 524288, - "output": 512000 + "context": 1000000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -45734,52 +44977,55 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "effort_options": [ + "medium", + "high", + "xhigh" + ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-06-01", - "last_updated": "2026-06-01", + "open_weights": false, + "knowledge": "2025-12-01", + "release_date": "2026-04-23", + "last_updated": "2026-04-23", "type": "chat" }, { - "id": "minimax/MiniMax-M2.5", - "name": "MiniMax-M2.5", - "display_name": "MiniMax-M2.5", + "id": "openai/gpt-4.1-fast", + "name": "GPT-4.1 (Fast)", + "display_name": "GPT-4.1 (Fast)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 1047576, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, - "attachment": false, - "open_weights": true, - "release_date": "2026-02-12", - "last_updated": "2026-02-12", + "attachment": true, + "open_weights": false, + "knowledge": "2024-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", "type": "chat" }, { - "id": "deepinfra/nemotron-3-ultra-550b-a55b", - "name": "Nemotron 3 Ultra 550B A55B (Deep Infra)", - "display_name": "Nemotron 3 Ultra 550B A55B (Deep Infra)", + "id": "openai/text-embedding-ada-002", + "name": "text-embedding-ada-002", + "display_name": "text-embedding-ada-002", "modalities": { "input": [ "text" @@ -45789,47 +45035,37 @@ ] }, "limit": { - "context": 262144, - "output": 128000 + "context": 8192, + "output": 8192 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "none", - "medium", - "high" - ] - } + "supported": false }, "attachment": false, - "open_weights": true, - "knowledge": "2025-09", - "release_date": "2026-06-04", - "last_updated": "2026-06-04", - "type": "chat" + "open_weights": false, + "release_date": "2022-12-15", + "last_updated": "2022-12-15", + "type": "embedding" }, { - "id": "deepinfra/nemotron-3-super-120b-a12b", - "name": "Nemotron 3 Super 120B A12B (Deep Infra)", - "display_name": "Nemotron 3 Super 120B A12B (Deep Infra)", + "id": "openai/gpt-5.5", + "name": "GPT 5.5", + "display_name": "GPT 5.5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1000000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -45839,63 +45075,63 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ - "none", "low", - "medium" - ] + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-06", - "release_date": "2026-03-11", - "last_updated": "2026-03-11", + "attachment": true, + "open_weights": false, + "knowledge": "2025-12-01", + "release_date": "2026-04-23", + "last_updated": "2026-04-23", "type": "chat" }, { - "id": "deepinfra/Qwen/Qwen3-Max", - "name": "Qwen3 Max (Deep Infra)", - "display_name": "Qwen3 Max (Deep Infra)", + "id": "openai/gpt-image-2", + "name": "GPT Image 2", + "display_name": "GPT Image 2", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ - "text" + "image" ] }, "limit": { - "context": 256000, - "output": 65536 + "context": 8192, + "output": 8192 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { - "supported": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2025-04", - "release_date": "2025-09-23", - "last_updated": "2025-09-23", - "type": "chat" + "release_date": "2026-04-21", + "last_updated": "2026-04-21" }, { - "id": "deepinfra/Qwen/Qwen3-Next-80B-A3B-Instruct", - "name": "Qwen3-Next 80B-A3B Instruct (Deep Infra)", - "display_name": "Qwen3-Next 80B-A3B Instruct (Deep Infra)", + "id": "openai/text-embedding-3-large", + "name": "text-embedding-3-large", + "display_name": "text-embedding-3-large", "modalities": { "input": [ "text" @@ -45905,36 +45141,37 @@ ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 8192, + "output": 8192 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { "supported": false }, "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-09", - "last_updated": "2025-09", - "type": "chat" + "open_weights": false, + "release_date": "2024-01-25", + "last_updated": "2024-01-25", + "type": "embedding" }, { - "id": "deepinfra/Qwen/Qwen3-235B-A22B-Thinking-2507", - "name": "Qwen3 235B-A22B Thinking 2507 (Deep Infra)", - "display_name": "Qwen3 235B-A22B Thinking 2507 (Deep Infra)", + "id": "openai/gpt-5.2-pro", + "name": "GPT 5.2 ", + "display_name": "GPT 5.2 ", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 81920 + "context": 400000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -45945,232 +45182,265 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "release_date": "2025-07-25", - "last_updated": "2025-07-25", - "type": "chat" - }, - { - "id": "deepinfra/Qwen/Qwen2.5-7B-Instruct", - "name": "Qwen2.5 7B Instruct (Deep Infra)", - "display_name": "Qwen2.5 7B Instruct (Deep Infra)", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 32768, - "output": 8192 - }, - "temperature": true, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": true, - "release_date": "2024-09-19", - "last_updated": "2024-09-19", + "attachment": true, + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2025-12-11", + "last_updated": "2025-12-11", "type": "chat" }, { - "id": "deepinfra/Qwen/Qwen3-Coder-480B-A35B-Instruct", - "name": "Qwen3-Coder 480B-A35B Instruct (Deep Infra)", - "display_name": "Qwen3-Coder 480B-A35B Instruct (Deep Infra)", + "id": "openai/gpt-4.1-mini", + "name": "GPT-4.1 mini", + "display_name": "GPT-4.1 mini", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 1047576, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-07-22", - "last_updated": "2025-07-22", + "attachment": true, + "open_weights": false, + "knowledge": "2024-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", "type": "chat" }, { - "id": "deepinfra/Qwen/Qwen3-VL-30B-A3B-Instruct", - "name": "Qwen3 VL 30B A3B Instruct (Deep Infra)", - "display_name": "Qwen3 VL 30B A3B Instruct (Deep Infra)", + "id": "openai/gpt-image-2.5-sunburst", + "name": "GPT Image 2.5 Sunburst", + "display_name": "GPT Image 2.5 Sunburst", "modalities": { "input": [ "text", "image" ], "output": [ - "text" + "image" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 8192, + "output": 8192 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { "supported": false }, "attachment": true, - "open_weights": true, - "release_date": "2025-10-04", - "last_updated": "2025-10-04", - "type": "chat" + "open_weights": false, + "release_date": "2026-09-08", + "last_updated": "2026-09-08" }, { - "id": "deepinfra/Qwen/Qwen3-VL-235B-A22B-Instruct", - "name": "Qwen3 VL 235B A22B Instruct (Deep Infra)", - "display_name": "Qwen3 VL 235B A22B Instruct (Deep Infra)", + "id": "openai/o3-mini", + "name": "o3-mini", + "display_name": "o3-mini", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 200000, + "output": 100000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, - "open_weights": true, - "knowledge": "2025-03-31", - "release_date": "2025-09-23", - "last_updated": "2025-09-23", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": false, + "open_weights": false, + "knowledge": "2024-05", + "release_date": "2024-12-20", + "last_updated": "2025-01-29", "type": "chat" }, { - "id": "deepinfra/Qwen/Qwen3-235B-A22B-Instruct-2507", - "name": "Qwen3 235B-A22B Instruct 2507 (Deep Infra)", - "display_name": "Qwen3 235B-A22B Instruct 2507 (Deep Infra)", + "id": "openai/o4-mini", + "name": "o4-mini", + "display_name": "o4-mini", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 16384 + "context": 200000, + "output": 100000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "release_date": "2025-07-21", - "last_updated": "2025-07-21", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2024-05", + "release_date": "2025-04-16", + "last_updated": "2025-04-16", "type": "chat" }, { - "id": "deepinfra/NousResearch/Hermes-3-Llama-3.1-70B", - "name": "Hermes 3 70B Instruct (Deep Infra)", - "display_name": "Hermes 3 70B Instruct (Deep Infra)", + "id": "openai/gpt-4o-mini", + "name": "GPT-4o mini", + "display_name": "GPT-4o mini", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, + "context": 128000, "output": 16384 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, - "open_weights": true, - "knowledge": "2023-12-31", - "release_date": "2024-08-18", - "last_updated": "2024-08-18", + "attachment": true, + "open_weights": false, + "knowledge": "2023-09", + "release_date": "2024-07-18", + "last_updated": "2024-07-18", "type": "chat" }, { - "id": "deepinfra/NousResearch/Hermes-3-Llama-3.1-405B", - "name": "Hermes 3 405B Instruct (Deep Infra)", - "display_name": "Hermes 3 405B Instruct (Deep Infra)", + "id": "openai/gpt-5-fast", + "name": "GPT-5 (Fast)", + "display_name": "GPT-5 (Fast)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 16384 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2023-12-31", - "release_date": "2024-08-16", - "last_updated": "2024-08-16", + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "minimal", + "low", + "medium", + "high" + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2024-09-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "deepinfra/ibm-granite/granite-4.2-8b", - "name": "Granite 4.2 8B (Deep Infra)", - "display_name": "Granite 4.2 8B (Deep Infra)", + "id": "openai/gpt-5.5-fast", + "name": "GPT 5.5 (Fast)", + "display_name": "GPT 5.5 (Fast)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 117964 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -46180,164 +45450,243 @@ "reasoning": { "effort_options": [ "none", + "minimal", "low", - "high" + "medium", + "high", + "xhigh" ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-08-25", - "last_updated": "2026-08-25", + "attachment": true, + "open_weights": false, + "knowledge": "2025-12-01", + "release_date": "2026-04-23", + "last_updated": "2026-04-23", "type": "chat" }, { - "id": "deepinfra/nvidia/Llama-3.1-Nemotron-70B-Instruct", - "name": "Llama 3.1 Nemotron 70B Instruct (Deep Infra)", - "display_name": "Llama 3.1 Nemotron 70B Instruct (Deep Infra)", + "id": "openai/gpt-6-astra", + "name": "GPT-6 Astra", + "display_name": "GPT-6 Astra", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "release_date": "2025-04-15", - "last_updated": "2025-04-15", + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2026-04-30", + "release_date": "2026-09-04", + "last_updated": "2026-09-04", "type": "chat" }, { - "id": "deepinfra/nvidia/Nemotron-3-Nano-30B-A3B", - "name": "Nemotron 3 Nano 30B A3B (Deep Infra)", - "display_name": "Nemotron 3 Nano 30B A3B (Deep Infra)", + "id": "openai/gpt-realtime-whisper", + "name": "gpt-realtime-whisper", + "display_name": "gpt-realtime-whisper", "modalities": { "input": [ - "text" + "audio" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 16000, + "output": 2000 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-06-25", - "release_date": "2025-12-15", - "last_updated": "2025-12-15", - "type": "chat" + "attachment": true, + "open_weights": false, + "release_date": "2026-05-07", + "last_updated": "2026-05-07" }, { - "id": "deepinfra/google/gemma-3-27b-it", - "name": "Gemma 3 27B IT (Deep Infra)", - "display_name": "Gemma 3 27B IT (Deep Infra)", + "id": "openai/gpt-5-nano", + "name": "GPT-5 Nano", + "display_name": "GPT-5 Nano", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 131072 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "minimal", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } }, "attachment": true, - "open_weights": true, - "knowledge": "2024-08", - "release_date": "2025-03-12", - "last_updated": "2025-03-12", + "open_weights": false, + "knowledge": "2024-05-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "deepinfra/google/gemma-3-12b-it", - "name": "Gemma 3 12B IT (Deep Infra)", - "display_name": "Gemma 3 12B IT (Deep Infra)", + "id": "openai/gpt-5.6-terra-fast", + "name": "GPT 5.6 Terra (Fast)", + "display_name": "GPT 5.6 Terra (Fast)", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 131072 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "minimal", + "low", + "medium", + "high", + "xhigh", + "max" + ] + } }, "attachment": true, - "open_weights": true, - "knowledge": "2024-08", - "release_date": "2025-03-12", - "last_updated": "2025-03-12", + "open_weights": false, + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "deepinfra/google/gemma-3-4b-it", - "name": "Gemma 3 4B IT (Deep Infra)", - "display_name": "Gemma 3 4B IT (Deep Infra)", + "id": "openai/gpt-5.4-fast", + "name": "GPT 5.4 (Fast)", + "display_name": "GPT 5.4 (Fast)", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 131072 + "context": 1050000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } }, "attachment": true, - "open_weights": true, - "knowledge": "2024-08", - "release_date": "2025-03-12", - "last_updated": "2025-03-12", + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-03-05", + "last_updated": "2026-03-05", "type": "chat" }, { - "id": "deepinfra/Gryphe/MythoMax-L2-13b", - "name": "MythoMax L2 13B (Deep Infra)", - "display_name": "MythoMax L2 13B (Deep Infra)", + "id": "inception/mercury-2", + "name": "Mercury 2", + "display_name": "Mercury 2", "modalities": { "input": [ "text" @@ -46347,38 +45696,47 @@ ] }, "limit": { - "context": 4096, - "output": 3200 + "context": 128000, + "output": 50000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "high" + ] + } }, "attachment": false, - "open_weights": true, - "release_date": "2023-08-10", - "last_updated": "2023-08-10", + "open_weights": false, + "release_date": "2026-02-24", + "last_updated": "2026-02-24", "type": "chat" }, { - "id": "deepinfra/moonshotai/Kimi-K2.5", - "name": "Kimi K2.5 (Deep Infra)", - "display_name": "Kimi K2.5 (Deep Infra)", + "id": "inception/mercury-2.5", + "name": "Mercury 2.5", + "display_name": "Mercury 2.5", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 260000, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -46386,26 +45744,24 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "none", + "low", + "medium", + "high" ] } }, - "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-01-27", - "last_updated": "2026-01-27", + "attachment": false, + "open_weights": false, + "release_date": "2026-09-08", + "last_updated": "2026-09-08", "type": "chat" }, { - "id": "deepinfra/moonshotai/Kimi-K2-Instruct", - "name": "Kimi K2 Instruct (Deep Infra)", - "display_name": "Kimi K2 Instruct (Deep Infra)", + "id": "inception/mercury-coder-small", + "name": "Mercury Coder Small Beta", + "display_name": "Mercury Coder Small Beta", "modalities": { "input": [ "text" @@ -46415,8 +45771,8 @@ ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 32000, + "output": 16384 }, "temperature": true, "tool_call": true, @@ -46424,54 +45780,42 @@ "supported": false }, "attachment": false, - "open_weights": true, - "release_date": "2025-07-11", - "last_updated": "2025-07-11", + "open_weights": false, + "release_date": "2025-02-26", + "last_updated": "2025-02-26", "type": "chat" }, { - "id": "deepinfra/ByteDance/Seed-2.0-code", - "name": "Seed 2.0 Code (Deep Infra)", - "display_name": "Seed 2.0 Code (Deep Infra)", + "id": "inception/mercury-3", + "name": "Mercury 3", + "display_name": "Mercury 3", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 256000, + "context": 1000000, "output": 131072 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "high" - ] - } - }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2026-02-14", - "last_updated": "2026-02-14", + "release_date": "2026-10-19", + "last_updated": "2026-10-19", "type": "chat" }, { - "id": "deepinfra/ByteDance/Seed-2.0-mini", - "name": "Seed 2.0 Mini (Deep Infra)", - "display_name": "Seed 2.0 Mini (Deep Infra)", + "id": "callstack/apex", + "name": "Apex", + "display_name": "Apex", "modalities": { "input": [ "text", @@ -46482,10 +45826,9 @@ ] }, "limit": { - "context": 256000, - "output": 32000 + "context": 262144, + "output": 131072 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -46495,23 +45838,22 @@ "reasoning": { "effort_options": [ "none", - "minimal", "low", "medium", - "high" + "xhigh" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-02-14", - "last_updated": "2026-02-14", + "release_date": "2026-10-08", + "last_updated": "2026-10-08", "type": "chat" }, { - "id": "deepinfra/meta-models/Muse-Glimmer-30B", - "name": "Muse Glimmer 30B (Deep Infra)", - "display_name": "Muse Glimmer 30B (Deep Infra)", + "id": "nvidia/nemotron-3.5-super-vl", + "name": "NVIDIA Nemotron 3.5 Super VL", + "display_name": "NVIDIA Nemotron 3.5 Super VL", "modalities": { "input": [ "text", @@ -46522,8 +45864,8 @@ ] }, "limit": { - "context": 131072, - "output": 131072 + "context": 1048576, + "output": 1048576 }, "temperature": true, "tool_call": true, @@ -46534,24 +45876,23 @@ "extra_capabilities": { "reasoning": { "effort_options": [ + "none", "low", "medium", - "high", - "xhigh" + "high" ] } }, "attachment": true, "open_weights": true, - "knowledge": "2026-01-04", - "release_date": "2026-08-10", - "last_updated": "2026-08-10", + "release_date": "2026-10-15", + "last_updated": "2026-10-15", "type": "chat" }, { - "id": "deepinfra/openai/gpt-oss-120b", - "name": "GPT OSS 120B (Deep Infra)", - "display_name": "GPT OSS 120B (Deep Infra)", + "id": "nvidia/nemotron-3.5-lightning-free", + "name": "Nemotron 3.5 Lightning Free", + "display_name": "Nemotron 3.5 Lightning Free", "modalities": { "input": [ "text" @@ -46561,8 +45902,8 @@ ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 1000000, + "output": 65000 }, "temperature": true, "tool_call": true, @@ -46574,6 +45915,7 @@ "reasoning": { "supported": true, "effort_options": [ + "none", "low", "medium", "high" @@ -46582,15 +45924,15 @@ }, "attachment": false, "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "knowledge": "2025-09", + "release_date": "2026-08-11", + "last_updated": "2026-08-11", "type": "chat" }, { - "id": "deepinfra/openai/gpt-oss-20b", - "name": "GPT OSS 20B (Deep Infra)", - "display_name": "GPT OSS 20B (Deep Infra)", + "id": "nvidia/nemotron-nano-9b-v2", + "name": "Nvidia Nemotron Nano 9B V2", + "display_name": "Nvidia Nemotron Nano 9B V2", "modalities": { "input": [ "text" @@ -46601,7 +45943,7 @@ }, "limit": { "context": 131072, - "output": 32768 + "output": 131072 }, "temperature": true, "tool_call": true, @@ -46611,8 +45953,8 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ + "none", "low", "medium", "high" @@ -46621,15 +45963,15 @@ }, "attachment": false, "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "knowledge": "2024-09", + "release_date": "2025-08-18", + "last_updated": "2025-08-18", "type": "chat" }, { - "id": "deepinfra/zai-org/GLM-4.7-Flash", - "name": "GLM-4.7-Flash (Deep Infra)", - "display_name": "GLM-4.7-Flash (Deep Infra)", + "id": "nvidia/nemotron-3-super-120b-a12b", + "name": "NVIDIA Nemotron 3 Super 120B A12B", + "display_name": "NVIDIA Nemotron 3 Super 120B A12B", "modalities": { "input": [ "text" @@ -46639,31 +45981,36 @@ ] }, "limit": { - "context": 202752, - "output": 131072 + "context": 256000, + "output": 32000 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { - "supported": true + "effort_options": [ + "none", + "low", + "medium", + "high" + ] } }, "attachment": false, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2026-01-19", - "last_updated": "2026-01-19", + "knowledge": "2025-06", + "release_date": "2026-03-11", + "last_updated": "2026-03-11", "type": "chat" }, { - "id": "deepinfra/deepseek-ai/DeepSeek-V4-Pro-0813", - "name": "DeepSeek V4 Pro 0813 (Deep Infra)", - "display_name": "DeepSeek V4 Pro 0813 (Deep Infra)", + "id": "nvidia/nemotron-3.5-lightning", + "name": "Nemotron 3.5 Lightning 30B", + "display_name": "Nemotron 3.5 Lightning 30B", "modalities": { "input": [ "text" @@ -46673,8 +46020,8 @@ ] }, "limit": { - "context": 1048576, - "output": 384000 + "context": 262144, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -46688,21 +46035,22 @@ "effort_options": [ "none", "low", - "high", - "max" + "medium", + "high" ] } }, "attachment": false, "open_weights": true, - "release_date": "2026-08-13", - "last_updated": "2026-08-22", + "knowledge": "2025-09", + "release_date": "2026-08-11", + "last_updated": "2026-08-11", "type": "chat" }, { - "id": "deepinfra/deepseek-ai/DeepSeek-R1-0528", - "name": "DeepSeek R1 0528 (Deep Infra)", - "display_name": "DeepSeek R1 0528 (Deep Infra)", + "id": "nvidia/nemotron-3-nano-30b-a3b", + "name": "Nemotron 3 Nano 30B A3B", + "display_name": "Nemotron 3 Nano 30B A3B", "modalities": { "input": [ "text" @@ -46712,36 +46060,36 @@ ] }, "limit": { - "context": 163840, - "output": 32768 + "context": 262144, + "output": 262144 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "none", + "low", + "medium", + "high" ] } }, "attachment": false, "open_weights": true, - "release_date": "2025-05-28", - "last_updated": "2025-05-28", + "knowledge": "2025-06-25", + "release_date": "2025-12-15", + "last_updated": "2025-12-15", "type": "chat" }, { - "id": "deepinfra/deepseek-ai/DeepSeek-V4-Flash-0731", - "name": "DeepSeek V4 Flash 0731 (Deep Infra)", - "display_name": "DeepSeek V4 Flash 0731 (Deep Infra)", + "id": "nvidia/nemotron-3-ultra-550b-a55b", + "name": "Nemotron 3 Ultra", + "display_name": "Nemotron 3 Ultra", "modalities": { "input": [ "text" @@ -46751,8 +46099,8 @@ ] }, "limit": { - "context": 1048576, - "output": 384000 + "context": 1000000, + "output": 65000 }, "temperature": true, "tool_call": true, @@ -46766,22 +46114,22 @@ "effort_options": [ "none", "low", - "high", - "max" + "medium", + "high" ] } }, "attachment": false, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-07-31", - "last_updated": "2026-07-31", + "knowledge": "2025-09", + "release_date": "2026-06-04", + "last_updated": "2026-06-04", "type": "chat" }, { - "id": "deepinfra/deepseek-ai/DeepSeek-V4.1-Flash-1017", - "name": "DeepSeek V4.1 Flash 1017 (Deep Infra)", - "display_name": "DeepSeek V4.1 Flash 1017 (Deep Infra)", + "id": "nvidia/nemotron-nano-12b-v2-vl", + "name": "Nvidia Nemotron Nano 12B V2 VL", + "display_name": "Nvidia Nemotron Nano 12B V2 VL", "modalities": { "input": [ "text", @@ -46792,8 +46140,8 @@ ] }, "limit": { - "context": 1048576, - "output": 384000 + "context": 131072, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -46806,22 +46154,21 @@ "effort_options": [ "none", "low", - "high", - "max" + "medium", + "high" ] } }, "attachment": true, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-10-17", - "last_updated": "2026-10-17", + "release_date": "2025-10-28", + "last_updated": "2025-10-28", "type": "chat" }, { - "id": "deepinfra/deepseek-ai/DeepSeek-R1", - "name": "DeepSeek-R1 (Deep Infra)", - "display_name": "DeepSeek-R1 (Deep Infra)", + "id": "morph/morph-v3-large", + "name": "Morph V3 Large", + "display_name": "Morph V3 Large", "modalities": { "input": [ "text" @@ -46831,78 +46178,24 @@ ] }, "limit": { - "context": 163840, - "output": 32768 + "context": 262144, + "output": 131072 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": false, - "open_weights": true, - "knowledge": "2024-07", - "release_date": "2025-01-20", - "last_updated": "2025-05-29", - "type": "chat" - }, - { - "id": "deepinfra/deepseek-ai/DeepSeek-V4.1-Flash", - "name": "DeepSeek V4.1 Flash (Deep Infra)", - "display_name": "DeepSeek V4.1 Flash (Deep Infra)", - "modalities": { - "input": [ - "text", - "image" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 1048576, - "output": 384000 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "none", - "low", - "high", - "max" - ] - } - }, - "attachment": true, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-09-10", - "last_updated": "2026-09-10", + "open_weights": false, + "release_date": "2025-07-07", + "last_updated": "2025-07-07", "type": "chat" }, { - "id": "deepinfra/deepseek-ai/DeepSeek-V3-0324", - "name": "DeepSeek V3 0324 (Deep Infra)", - "display_name": "DeepSeek V3 0324 (Deep Infra)", + "id": "morph/morph-v3-fast", + "name": "Morph V3 Fast", + "display_name": "Morph V3 Fast", "modalities": { "input": [ "text" @@ -46912,62 +46205,65 @@ ] }, "limit": { - "context": 163840, - "output": 163840 + "context": 262144, + "output": 131072 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, "attachment": false, - "open_weights": true, - "release_date": "2025-03-24", - "last_updated": "2025-03-24", + "open_weights": false, + "release_date": "2025-07-07", + "last_updated": "2025-07-07", "type": "chat" }, { - "id": "deepinfra/deepseek-ai/DeepSeek-V3", - "name": "DeepSeek-V3 (Deep Infra)", - "display_name": "DeepSeek-V3 (Deep Infra)", + "id": "meituan/longcat-2.5-preview", + "name": "LongCat 2.5 Preview", + "display_name": "LongCat 2.5 Preview", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 163840, - "output": 8192 + "context": 1048576, + "output": 131072 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "release_date": "2024-12-26", - "last_updated": "2024-12-26", + "attachment": true, + "open_weights": false, + "release_date": "2026-09-25", + "last_updated": "2026-09-25", "type": "chat" }, { - "id": "deepinfra/tencent/Hy3", - "name": "Hy3 (Deep Infra)", - "display_name": "Hy3 (Deep Infra)", + "id": "xiaomi/mimo-v2.6-pro", + "name": "MiMo V2.6 Pro", + "display_name": "MiMo V2.6 Pro", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 128000 + "context": 1048576, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -46977,24 +46273,25 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ "none", + "minimal", "low", + "medium", "high" ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-07-06", - "last_updated": "2026-07-06", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "deepinfra/tencent/Hy4-preview", - "name": "Hy4 preview (Deep Infra)", - "display_name": "Hy4 preview (Deep Infra)", + "id": "xiaomi/mimo-v2.5-pro", + "name": "MiMo V2.5 Pro", + "display_name": "MiMo V2.5 Pro", "modalities": { "input": [ "text" @@ -47004,8 +46301,8 @@ ] }, "limit": { - "context": 1048576, - "output": 64000 + "context": 1050000, + "output": 131000 }, "temperature": true, "tool_call": true, @@ -47013,37 +46310,29 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "none", - "low", - "high" - ] - } - }, "attachment": false, "open_weights": true, - "release_date": "2026-08-28", - "last_updated": "2026-08-28", + "knowledge": "2024-12", + "release_date": "2026-04-22", + "last_updated": "2026-04-22", "type": "chat" }, { - "id": "deepinfra/stepfun-ai/Step-3.5-Flash", - "name": "Step 3.5 Flash (Deep Infra)", - "display_name": "Step 3.5 Flash (Deep Infra)", + "id": "xiaomi/mimo-v2.5", + "name": "MiMo M2.5", + "display_name": "MiMo M2.5", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 256000 + "context": 1050000, + "output": 131100 }, "temperature": true, "tool_call": true, @@ -47051,30 +46340,21 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "high" - ] - } - }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-01-29", - "last_updated": "2026-02-13", + "knowledge": "2024-12", + "release_date": "2026-04-22", + "last_updated": "2026-04-22", "type": "chat" }, { - "id": "deepinfra/stepfun-ai/Step-5-Preview", - "name": "Step 5 Preview (Deep Infra)", - "display_name": "Step 5 Preview (Deep Infra)", + "id": "xiaomi/mimo-v2.6-flash", + "name": "MiMo V2.6 Flash", + "display_name": "MiMo V2.6 Flash", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" @@ -47082,7 +46362,7 @@ }, "limit": { "context": 1048576, - "output": 1000000 + "output": 131072 }, "temperature": true, "tool_call": true, @@ -47093,6 +46373,8 @@ "extra_capabilities": { "reasoning": { "effort_options": [ + "none", + "minimal", "low", "medium", "high" @@ -47101,27 +46383,26 @@ }, "attachment": true, "open_weights": true, - "release_date": "2026-09-16", - "last_updated": "2026-09-20", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "deepinfra/stepfun-ai/Step-3.7-Flash", - "name": "Step 3.7 Flash (Deep Infra)", - "display_name": "Step 3.7 Flash (Deep Infra)", + "id": "xiaomi/mimo-v2.6-pro-ultraspeed", + "name": "MiMo V2.6 Pro UltraSpeed", + "display_name": "MiMo V2.6 Pro UltraSpeed", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 256000 + "context": 1048576, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -47132,6 +46413,8 @@ "extra_capabilities": { "reasoning": { "effort_options": [ + "none", + "minimal", "low", "medium", "high" @@ -47140,15 +46423,14 @@ }, "attachment": true, "open_weights": true, - "knowledge": "2026-03-01", - "release_date": "2026-05-29", - "last_updated": "2026-05-29", + "release_date": "2026-09-21", + "last_updated": "2026-09-21", "type": "chat" }, { - "id": "deepinfra/mistralai/Mixtral-8x7B-Instruct-v0.1", - "name": "Mixtral 8x7B Instruct v0.1 (Deep Infra)", - "display_name": "Mixtral 8x7B Instruct v0.1 (Deep Infra)", + "id": "voyage/rerank-2.5", + "name": "Voyage Rerank 2.5", + "display_name": "Voyage Rerank 2.5", "modalities": { "input": [ "text" @@ -47158,24 +46440,23 @@ ] }, "limit": { - "context": 32768, - "output": 32768 + "context": 32000, + "output": 8192 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { "supported": false }, "attachment": false, - "open_weights": true, - "release_date": "2023-12-11", - "last_updated": "2023-12-11", - "type": "chat" + "open_weights": false, + "release_date": "2025-08-11", + "last_updated": "2025-08-11" }, { - "id": "deepinfra/mistralai/Mistral-Small-24B-Instruct-2501", - "name": "Mistral Small 3 (Deep Infra)", - "display_name": "Mistral Small 3 (Deep Infra)", + "id": "voyage/voyage-4-lite", + "name": "voyage-4-lite", + "display_name": "voyage-4-lite", "modalities": { "input": [ "text" @@ -47185,82 +46466,77 @@ ] }, "limit": { - "context": 32768, - "output": 16384 + "context": 32000, + "output": 8192 }, - "temperature": true, + "temperature": false, "tool_call": false, "reasoning": { "supported": false }, "attachment": false, - "open_weights": true, - "knowledge": "2023-10-31", - "release_date": "2025-01-30", - "last_updated": "2025-01-30", - "type": "chat" + "open_weights": false, + "release_date": "2026-01-15", + "last_updated": "2026-01-15", + "type": "embedding" }, { - "id": "deepinfra/meta-llama/Llama-Guard-4-12B", - "name": "Llama Guard 4 12B (Deep Infra)", - "display_name": "Llama Guard 4 12B (Deep Infra)", + "id": "voyage/voyage-3.5", + "name": "voyage-3.5", + "display_name": "voyage-3.5", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 163840, - "output": 163840 + "context": 32000, + "output": 8192 }, - "temperature": true, + "temperature": false, "tool_call": false, "reasoning": { "supported": false }, - "attachment": true, - "open_weights": true, - "release_date": "2025-04-29", - "last_updated": "2025-04-29", - "type": "chat" + "attachment": false, + "open_weights": false, + "release_date": "2025-05-20", + "last_updated": "2025-05-20", + "type": "embedding" }, { - "id": "deepinfra/meta-llama/Llama-3.2-11B-Vision-Instruct", - "name": "Llama-3.2-11B-Vision-Instruct (Deep Infra)", - "display_name": "Llama-3.2-11B-Vision-Instruct (Deep Infra)", + "id": "voyage/rerank-2.5-lite", + "name": "Voyage Rerank 2.5 Lite", + "display_name": "Voyage Rerank 2.5 Lite", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 4096 + "context": 32000, + "output": 8192 }, - "temperature": true, + "temperature": false, "tool_call": false, "reasoning": { "supported": false }, - "attachment": true, - "open_weights": true, - "knowledge": "2023-12", - "release_date": "2024-09-25", - "last_updated": "2024-09-25", - "type": "chat" + "attachment": false, + "open_weights": false, + "release_date": "2025-08-11", + "last_updated": "2025-08-11" }, { - "id": "deepinfra/meta-llama/Llama-3.2-3B-Instruct", - "name": "Llama 3.2 3B Instruct (Deep Infra)", - "display_name": "Llama 3.2 3B Instruct (Deep Infra)", + "id": "voyage/voyage-4", + "name": "voyage-4", + "display_name": "voyage-4", "modalities": { "input": [ "text" @@ -47270,25 +46546,24 @@ ] }, "limit": { - "context": 131072, - "output": 131072 + "context": 32000, + "output": 8192 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { "supported": false }, "attachment": false, - "open_weights": true, - "knowledge": "2023-12", - "release_date": "2024-09-25", - "last_updated": "2024-09-25", - "type": "chat" + "open_weights": false, + "release_date": "2026-01-15", + "last_updated": "2026-01-15", + "type": "embedding" }, { - "id": "deepinfra/meta-llama/Llama-3.3-70B-Instruct", - "name": "Llama-3.3-70B-Instruct (Deep Infra)", - "display_name": "Llama-3.3-70B-Instruct (Deep Infra)", + "id": "voyage/voyage-code-3", + "name": "voyage-code-3", + "display_name": "voyage-code-3", "modalities": { "input": [ "text" @@ -47298,25 +46573,24 @@ ] }, "limit": { - "context": 131072, - "output": 4096 + "context": 32000, + "output": 8192 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { "supported": false }, "attachment": false, - "open_weights": true, - "knowledge": "2023-12", - "release_date": "2024-12-06", - "last_updated": "2024-12-06", - "type": "chat" + "open_weights": false, + "release_date": "2024-12-04", + "last_updated": "2024-09", + "type": "embedding" }, { - "id": "deepinfra/meta-llama/Llama-Guard-3-8B", - "name": "Llama-Guard-3-8B (Deep Infra)", - "display_name": "Llama-Guard-3-8B (Deep Infra)", + "id": "voyage/voyage-code-2", + "name": "voyage-code-2", + "display_name": "voyage-code-2", "modalities": { "input": [ "text" @@ -47326,109 +46600,77 @@ ] }, "limit": { - "context": 131072, - "output": 4096 + "context": 16000, + "output": 8192 }, - "temperature": true, + "temperature": false, "tool_call": false, "reasoning": { "supported": false }, "attachment": false, - "open_weights": true, - "knowledge": "2023-12", - "release_date": "2024-07-23", - "last_updated": "2024-07-23", - "type": "chat" + "open_weights": false, + "release_date": "2024-01-01", + "last_updated": "2024-01", + "type": "embedding" }, { - "id": "deepinfra/thinkingmachines/Inkling", - "name": "Inkling (Deep Infra)", - "display_name": "Inkling (Deep Infra)", + "id": "voyage/rerank-3", + "name": "Voyage Rerank 3", + "display_name": "Voyage Rerank 3", "modalities": { "input": [ - "text", - "image", - "audio" + "text" ], "output": [ "text" ] }, "limit": { - "context": 524288, - "output": 1048576 + "context": 32000, + "output": 8192 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "minimal", - "low", - "medium", - "high", - "max" - ] - } + "supported": false }, - "attachment": true, - "open_weights": true, - "release_date": "2026-07-15", - "last_updated": "2026-07-15", - "type": "chat" + "attachment": false, + "open_weights": false, + "release_date": "2026-09-30", + "last_updated": "2026-09-30" }, { - "id": "deepinfra/thinkingmachines/Inkling-Small", - "name": "Inkling Small (Deep Infra)", - "display_name": "Inkling Small (Deep Infra)", + "id": "voyage/voyage-3.5-lite", + "name": "voyage-3.5-lite", + "display_name": "voyage-3.5-lite", "modalities": { "input": [ - "text", - "image", - "audio" + "text" ], "output": [ "text" ] }, "limit": { - "context": 524288, - "output": 1048576 + "context": 32000, + "output": 8192 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "minimal", - "low", - "medium", - "high", - "max" - ] - } + "supported": false }, - "attachment": true, - "open_weights": true, - "release_date": "2026-07-30", - "last_updated": "2026-07-30", - "type": "chat" + "attachment": false, + "open_weights": false, + "release_date": "2025-05-20", + "last_updated": "2025-05-20", + "type": "embedding" }, { - "id": "deepinfra/microsoft/WizardLM-2-8x22B", - "name": "WizardLM 2 8x22B (Deep Infra)", - "display_name": "WizardLM 2 8x22B (Deep Infra)", + "id": "voyage/voyage-3-large", + "name": "voyage-3-large", + "display_name": "voyage-3-large", "modalities": { "input": [ "text" @@ -47438,24 +46680,24 @@ ] }, "limit": { - "context": 65536, - "output": 8000 + "context": 32000, + "output": 8192 }, - "temperature": true, + "temperature": false, "tool_call": false, "reasoning": { "supported": false }, "attachment": false, - "open_weights": true, - "release_date": "2024-04-15", - "last_updated": "2024-04-15", - "type": "chat" + "open_weights": false, + "release_date": "2025-01-07", + "last_updated": "2024-09", + "type": "embedding" }, { - "id": "cohere/command-r-plus-08-2024", - "name": "Command R+", - "display_name": "Command R+", + "id": "voyage/voyage-finance-2", + "name": "voyage-finance-2", + "display_name": "voyage-finance-2", "modalities": { "input": [ "text" @@ -47465,25 +46707,24 @@ ] }, "limit": { - "context": 128000, - "output": 4000 + "context": 32000, + "output": 8192 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { "supported": false }, "attachment": false, - "open_weights": true, - "knowledge": "2024-06-01", - "release_date": "2024-08-30", - "last_updated": "2024-08-30", - "type": "chat" + "open_weights": false, + "release_date": "2024-06-03", + "last_updated": "2024-03", + "type": "embedding" }, { - "id": "cohere/command-a-03-2025", - "name": "Command A", - "display_name": "Command A", + "id": "voyage/voyage-law-2", + "name": "voyage-law-2", + "display_name": "voyage-law-2", "modalities": { "input": [ "text" @@ -47493,25 +46734,24 @@ ] }, "limit": { - "context": 288000, - "output": 8000 + "context": 16000, + "output": 8192 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { "supported": false }, "attachment": false, - "open_weights": true, - "knowledge": "2024-06-01", - "release_date": "2025-03-13", - "last_updated": "2025-03-13", - "type": "chat" + "open_weights": false, + "release_date": "2024-04-15", + "last_updated": "2024-03", + "type": "embedding" }, { - "id": "cohere/c4ai-aya-expanse-32b", - "name": "Aya Expanse 32B", - "display_name": "Aya Expanse 32B", + "id": "voyage/voyage-4-large", + "name": "voyage-4-large", + "display_name": "voyage-4-large", "modalities": { "input": [ "text" @@ -47521,52 +46761,24 @@ ] }, "limit": { - "context": 128000, - "output": 4000 + "context": 32000, + "output": 8192 }, - "temperature": true, + "temperature": false, "tool_call": false, "reasoning": { "supported": false }, "attachment": false, - "open_weights": true, - "release_date": "2024-10-24", - "last_updated": "2024-10-24", - "type": "chat" - }, - { - "id": "cohere/command-r-08-2024", - "name": "Command R", - "display_name": "Command R", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 128000, - "output": 4000 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-06-01", - "release_date": "2024-08-30", - "last_updated": "2024-08-30", - "type": "chat" + "open_weights": false, + "release_date": "2026-01-15", + "last_updated": "2026-01-15", + "type": "embedding" }, { - "id": "cohere/command-r7b-12-2024", - "name": "Command R7B", - "display_name": "Command R7B", + "id": "voyage/rerank-3-lite", + "name": "Voyage Rerank 3 Lite", + "display_name": "Voyage Rerank 3 Lite", "modalities": { "input": [ "text" @@ -47576,38 +46788,35 @@ ] }, "limit": { - "context": 132000, - "output": 4000 + "context": 32000, + "output": 8192 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { "supported": false }, "attachment": false, - "open_weights": true, - "knowledge": "2024-06-01", - "release_date": "2024-12-13", - "last_updated": "2024-12-13", - "type": "chat" + "open_weights": false, + "release_date": "2026-09-30", + "last_updated": "2026-09-30" }, { - "id": "azure/gpt-5.2-codex", - "name": "GPT-5.2 Codex (Azure)", - "display_name": "GPT-5.2 Codex (Azure)", + "id": "sakana/fugu-max", + "name": "Fugu Max", + "display_name": "Fugu Max", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 272000, - "output": 128000 + "context": 1000000, + "output": 1000000 }, "temperature": false, "tool_call": true, @@ -47617,140 +46826,100 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", "effort_options": [ - "low", - "medium", "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "xhigh", + "max" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2025-12-11", - "last_updated": "2025-12-11", + "release_date": "2026-09-11", + "last_updated": "2026-09-11", "type": "chat" }, { - "id": "azure/gpt-5.1-codex-max", - "name": "GPT-5.1 Codex Max (Azure)", - "display_name": "GPT-5.1 Codex Max (Azure)", + "id": "sakana/fugu-ultra", + "name": "Fugu Ultra", + "display_name": "Fugu Ultra", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 272000, - "output": 128000 + "context": 1000000, + "output": 1000000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", "effort_options": [ - "none", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "high", + "xhigh", + "max" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-11-13", - "last_updated": "2025-11-13", + "release_date": "2026-06-15", + "last_updated": "2026-06-15", "type": "chat" }, { - "id": "azure/gpt-5.1-codex-mini", - "name": "GPT-5.1 Codex mini (Azure)", - "display_name": "GPT-5.1 Codex mini (Azure)", + "id": "sakana/fugu-ultra-v2", + "name": "Fugu Ultra v2", + "display_name": "Fugu Ultra v2", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 272000, - "output": 128000 + "context": 1000000, + "output": 1000000 }, "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", "effort_options": [ - "none", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "high", + "xhigh", + "max" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-11-13", - "last_updated": "2025-11-13", + "knowledge": "2026-08-28", + "release_date": "2026-09-11", + "last_updated": "2026-09-11", "type": "chat" }, { - "id": "azure/gpt-5.1-codex", - "name": "GPT-5.1 Codex (Azure)", - "display_name": "GPT-5.1 Codex (Azure)", + "id": "sakana/namazu", + "name": "Sakana Namazu", + "display_name": "Sakana Namazu", "modalities": { "input": [ "text", @@ -47762,47 +46931,38 @@ ] }, "limit": { - "context": 272000, - "output": 128000 + "context": 256000, + "output": 256000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", "effort_options": [ "none", + "minimal", "low", "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "high", + "xhigh", + "max" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-11-13", - "last_updated": "2025-11-13", + "release_date": "2026-08-03", + "last_updated": "2026-08-03", "type": "chat" }, { - "id": "scaleway/llama-3.3-70b-instruct", - "name": "Llama-3.3-70B-Instruct (Scaleway)", - "display_name": "Llama-3.3-70B-Instruct (Scaleway)", + "id": "poolside/laguna-s-2.1-free", + "name": "Laguna S 2.1 Free", + "display_name": "Laguna S 2.1 Free", "modalities": { "input": [ "text" @@ -47812,54 +46972,63 @@ ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 256000, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": false, "open_weights": true, - "knowledge": "2023-12", - "release_date": "2024-12-06", - "last_updated": "2024-12-06", + "release_date": "2026-07-21", + "last_updated": "2026-07-21", "type": "chat" }, { - "id": "scaleway/gemma-3-27b-it", - "name": "Gemma 3 27B IT (Scaleway)", - "display_name": "Gemma 3 27B IT (Scaleway)", + "id": "poolside/laguna-s-2.1", + "name": "Laguna S 2.1", + "display_name": "Laguna S 2.1", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 40000, + "context": 1000000, "output": 131072 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": false, "open_weights": true, - "knowledge": "2024-08", - "release_date": "2025-03-12", - "last_updated": "2025-03-12", + "release_date": "2026-07-21", + "last_updated": "2026-07-21", "type": "chat" }, { - "id": "scaleway/qwen3-coder-30b-a3b-instruct", - "name": "Qwen3-Coder 30B-A3B Instruct (Scaleway)", - "display_name": "Qwen3-Coder 30B-A3B Instruct (Scaleway)", + "id": "mistral/mistral-embed", + "name": "Mistral Embed", + "display_name": "Mistral Embed", "modalities": { "input": [ "text" @@ -47869,36 +47038,36 @@ ] }, "limit": { - "context": 128000, - "output": 65536 + "context": 8000, + "output": 3072 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { "supported": false }, "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-07-31", - "last_updated": "2025-07-31", - "type": "chat" + "open_weights": false, + "release_date": "2023-12-11", + "last_updated": "2023-12-11", + "type": "embedding" }, { - "id": "scaleway/deepseek-v4-flash-0731", - "name": "DeepSeek V4 Flash 0731 (Scaleway)", - "display_name": "DeepSeek V4 Flash 0731 (Scaleway)", + "id": "mistral/mistral-medium-3.5", + "name": "Mistral Medium Latest", + "display_name": "Mistral Medium Latest", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 384000 + "context": 262144, + "output": 256000 }, "temperature": true, "tool_call": true, @@ -47908,26 +47077,22 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ "none", - "low", - "high", - "max" + "high" ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-07-31", - "last_updated": "2026-07-31", + "attachment": true, + "open_weights": false, + "release_date": "2026-04-30", + "last_updated": "2026-04-30", "type": "chat" }, { - "id": "scaleway/gpt-oss-120b", - "name": "GPT OSS 120B (Scaleway)", - "display_name": "GPT OSS 120B (Scaleway)", + "id": "mistral/codestral", + "name": "Codestral (latest)", + "display_name": "Codestral (latest)", "modalities": { "input": [ "text" @@ -47938,76 +47103,50 @@ }, "limit": { "context": 128000, - "output": 32768 + "output": 4000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "low", - "medium", - "high" - ] - } + "supported": false }, "attachment": false, "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "knowledge": "2024-10", + "release_date": "2024-05-29", + "last_updated": "2025-01-04", "type": "chat" }, { - "id": "scaleway/deepseek-v4.1-flash", - "name": "DeepSeek V4.1 Flash (Scaleway)", - "display_name": "DeepSeek V4.1 Flash (Scaleway)", + "id": "mistral/voxtral-small-transcribe-3", + "name": "Voxtral Small Transcribe 3", + "display_name": "Voxtral Small Transcribe 3", "modalities": { "input": [ - "text", - "image" + "audio" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 384000 + "context": 8192, + "output": 8192 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "none", - "low", - "high", - "max" - ] - } + "supported": false }, "attachment": true, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-09-10", - "last_updated": "2026-09-10", - "type": "chat" + "open_weights": false, + "release_date": "2026-10-20", + "last_updated": "2026-10-20" }, { - "id": "scaleway/qwen3-235b-a22b-instruct-2507", - "name": "Qwen3 235B-A22B Instruct 2507 (Scaleway)", - "display_name": "Qwen3 235B-A22B Instruct 2507 (Scaleway)", + "id": "mistral/mistral-nemo", + "name": "Mistral Nemo", + "display_name": "Mistral Nemo", "modalities": { "input": [ "text" @@ -48017,8 +47156,8 @@ ] }, "limit": { - "context": 250000, - "output": 16384 + "context": 131072, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -48027,146 +47166,111 @@ }, "attachment": false, "open_weights": true, - "release_date": "2025-07-21", - "last_updated": "2025-07-21", + "knowledge": "2024-07", + "release_date": "2024-07-18", + "last_updated": "2024-07-18", "type": "chat" }, { - "id": "fireworks_ai/gpt-oss-120b", - "name": "GPT OSS 120B (Fireworks AI)", - "display_name": "GPT OSS 120B (Fireworks AI)", + "id": "mistral/ministral-14b", + "name": "Ministral 14B", + "display_name": "Ministral 14B", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 262144, + "output": 256000 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "low", - "medium", - "high" - ] - } + "supported": false }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "release_date": "2025-12-02", + "last_updated": "2025-12-02", "type": "chat" }, { - "id": "fireworks_ai/accounts/fireworks/models/ember-1", - "name": "Ember-1 (Fireworks AI)", - "display_name": "Ember-1 (Fireworks AI)", + "id": "mistral/voxtral-mini-transcribe-3", + "name": "Voxtral Mini Transcribe 3", + "display_name": "Voxtral Mini Transcribe 3", "modalities": { "input": [ - "text", - "image" + "audio" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 8192, + "output": 8192 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "low", - "high", - "max" - ] - } + "supported": false }, "attachment": true, "open_weights": false, - "release_date": "2026-09-22", - "last_updated": "2026-09-22", - "type": "chat" + "release_date": "2026-10-20", + "last_updated": "2026-10-20" }, { - "id": "fireworks_ai/accounts/fireworks/models/muse-spark-open", - "name": "Muse Spark Open (Fireworks AI)", - "display_name": "Muse Spark Open (Fireworks AI)", + "id": "mistral/mistral-small", + "name": "Mistral Small (latest)", + "display_name": "Mistral Small (latest)", "modalities": { "input": [ "text", - "image", - "video", - "pdf", - "audio" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 262144, + "output": 4000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ] - } + "supported": false }, "attachment": true, "open_weights": true, - "knowledge": "2026-01-04", - "release_date": "2026-10-15", - "last_updated": "2026-10-15", + "knowledge": "2025-06", + "release_date": "2026-03-16", + "last_updated": "2026-03-16", "type": "chat" }, { - "id": "fireworks_ai/accounts/fireworks/models/gpt-oss-120b", - "name": "GPT OSS 120B (Fireworks AI)", - "display_name": "GPT OSS 120B (Fireworks AI)", + "id": "mistral/mistral-large-4", + "name": "Mistral Large 4", + "display_name": "Mistral Large 4", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 524288, + "output": 262144 }, "temperature": true, "tool_call": true, @@ -48176,25 +47280,22 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ - "low", - "medium", + "none", "high" ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "attachment": true, + "open_weights": false, + "release_date": "2026-10-06", + "last_updated": "2026-10-06", "type": "chat" }, { - "id": "fireworks_ai/accounts/fireworks/models/inkling", - "name": "Inkling (Fireworks AI)", - "display_name": "Inkling (Fireworks AI)", + "id": "mistral/mistral-large-3", + "name": "Mistral Large 3", + "display_name": "Mistral Large 3", "modalities": { "input": [ "text", @@ -48205,290 +47306,266 @@ ] }, "limit": { - "context": 1048576, - "output": 1048576 + "context": 262144, + "output": 256000 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "minimal", - "low", - "medium", - "high", - "max" - ] - } + "supported": false }, "attachment": true, "open_weights": true, - "release_date": "2026-07-15", - "last_updated": "2026-07-15", + "knowledge": "2024-11", + "release_date": "2025-12-02", + "last_updated": "2025-12-02", "type": "chat" }, { - "id": "greenpt/llama-3.3-70b-instruct", - "name": "Llama-3.3-70B-Instruct (Greenpt)", - "display_name": "Llama-3.3-70B-Instruct (Greenpt)", + "id": "mistral/ministral-8b", + "name": "Ministral 8B (latest)", + "display_name": "Ministral 8B (latest)", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 262144, + "output": 4000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2023-12", - "release_date": "2024-12-06", - "last_updated": "2024-12-06", + "knowledge": "2024-10", + "release_date": "2024-10-16", + "last_updated": "2024-10-04", "type": "chat" }, { - "id": "greenpt/deepseek-v4-flash-0731", - "name": "DeepSeek V4 Flash 0731 (Greenpt)", - "display_name": "DeepSeek V4 Flash 0731 (Greenpt)", + "id": "mistral/ministral-3b", + "name": "Ministral 3B (latest)", + "display_name": "Ministral 3B (latest)", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 131072, + "output": 4000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "none", - "low", - "high", - "max" - ] - } + "supported": false }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-07-31", - "last_updated": "2026-07-31", + "knowledge": "2024-10", + "release_date": "2024-10-16", + "last_updated": "2024-10-04", "type": "chat" }, { - "id": "greenpt/gpt-oss-120b", - "name": "GPT OSS 120B (Greenpt)", - "display_name": "GPT OSS 120B (Greenpt)", + "id": "mistral/voxtral-mini-tts-3", + "name": "Voxtral TTS 3", + "display_name": "Voxtral TTS 3", "modalities": { "input": [ "text" ], "output": [ - "text" + "audio" ] }, "limit": { - "context": 128000, - "output": 32768 + "context": 8192, + "output": 8192 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "low", - "medium", - "high" - ] - } + "supported": false }, "attachment": false, - "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", - "type": "chat" + "open_weights": false, + "release_date": "2026-10-20", + "last_updated": "2026-10-20" }, { - "id": "greenpt/deepseek-v4.1-flash", - "name": "DeepSeek V4.1 Flash (Greenpt)", - "display_name": "DeepSeek V4.1 Flash (Greenpt)", + "id": "mistral/codestral-embed", + "name": "Codestral Embed", + "display_name": "Codestral Embed", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 8192, + "output": 3072 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "none", - "low", - "high", - "max" - ] - } + "attachment": false, + "open_weights": false, + "release_date": "2025-05-28", + "last_updated": "2025-05-28", + "type": "embedding" + }, + { + "id": "fish-audio/transcribe-1", + "name": "Transcribe-1", + "display_name": "Transcribe-1", + "modalities": { + "input": [ + "audio" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 8192, + "output": 8192 + }, + "temperature": false, + "tool_call": false, + "reasoning": { + "supported": false }, "attachment": true, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-09-10", - "last_updated": "2026-09-10", - "type": "chat" + "open_weights": false, + "release_date": "2026-03-01", + "last_updated": "2026-03-01" }, { - "id": "greenpt/qwen3-235b-a22b-instruct-2507", - "name": "Qwen3 235B-A22B Instruct 2507 (Greenpt)", - "display_name": "Qwen3 235B-A22B Instruct 2507 (Greenpt)", + "id": "fish-audio/drama-3", + "name": "Drama 3", + "display_name": "Drama 3", "modalities": { "input": [ "text" ], "output": [ - "text" + "audio" ] }, "limit": { - "context": 250000, - "output": 16384 + "context": 8192, + "output": 8192 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { "supported": false }, "attachment": false, - "open_weights": true, - "release_date": "2025-07-21", - "last_updated": "2025-07-21", - "type": "chat" + "open_weights": false, + "release_date": "2026-10-13", + "last_updated": "2026-10-13" }, { - "id": "ovhcloud/gpt-oss-120b", - "name": "GPT OSS 120B (OVHcloud)", - "display_name": "GPT OSS 120B (OVHcloud)", + "id": "fish-audio/s1", + "name": "S1", + "display_name": "S1", "modalities": { "input": [ "text" ], "output": [ - "text" + "audio" ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 8192, + "output": 8192 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "low", - "medium", - "high" - ] - } + "supported": false }, "attachment": false, - "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", - "type": "chat" + "open_weights": false, + "release_date": "2025-10-20", + "last_updated": "2025-10-20" }, { - "id": "ovhcloud/gpt-oss-20b", - "name": "GPT OSS 20B (OVHcloud)", - "display_name": "GPT OSS 20B (OVHcloud)", + "id": "fish-audio/s2.1-pro", + "name": "S2.1 Pro", + "display_name": "S2.1 Pro", "modalities": { "input": [ "text" ], "output": [ - "text" + "audio" ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 8192, + "output": 8192 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "low", - "medium", - "high" - ] - } + "attachment": false, + "open_weights": false, + "release_date": "2026-07-28", + "last_updated": "2026-07-28" + }, + { + "id": "fish-audio/s2-pro", + "name": "S2 Pro", + "display_name": "S2 Pro", + "modalities": { + "input": [ + "text" + ], + "output": [ + "audio" + ] + }, + "limit": { + "context": 8192, + "output": 8192 + }, + "temperature": false, + "tool_call": false, + "reasoning": { + "supported": false }, "attachment": false, - "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", - "type": "chat" + "open_weights": false, + "release_date": "2026-03-09", + "last_updated": "2026-03-09" }, { - "id": "tensorx/moonshotai/kimi-k2.5", - "name": "Kimi K2.5 (TensorX)", - "display_name": "Kimi K2.5 (TensorX)", + "id": "stepfun/step-5-preview", + "name": "Step 5 Preview", + "display_name": "Step 5 Preview", "modalities": { "input": [ "text", @@ -48499,48 +47576,36 @@ ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1048576, + "output": 1048576 }, - "temperature": false, - "tool_call": true, + "temperature": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": true, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-01-27", - "last_updated": "2026-01-27", + "release_date": "2026-09-16", + "last_updated": "2026-09-20", "type": "chat" }, { - "id": "tensorx/deepseek/deepseek-r1-0528", - "name": "DeepSeek R1 0528 (TensorX)", - "display_name": "DeepSeek R1 0528 (TensorX)", + "id": "stepfun/step-3.7-flash", + "name": "Step 3.7 Flash", + "display_name": "Step 3.7 Flash", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 164000, - "output": 32768 + "context": 256000, + "output": 256000 }, "temperature": true, "tool_call": true, @@ -48550,67 +47615,68 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "low", + "medium", + "high" ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2025-05-28", - "last_updated": "2025-05-28", + "knowledge": "2026-03-01", + "release_date": "2026-05-29", + "last_updated": "2026-05-29", "type": "chat" }, { - "id": "tensorx/deepseek/deepseek-v4-pro-0813", - "name": "DeepSeek V4 Pro 0813 (TensorX)", - "display_name": "DeepSeek V4 Pro 0813 (TensorX)", + "id": "interfaze/interfaze-beta", + "name": "Interfaze Beta", + "display_name": "Interfaze Beta", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 384000 + "context": 1000000, + "output": 32000 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ - "none", "low", - "high", - "max" + "medium", + "high" ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-08-13", - "last_updated": "2026-08-22", + "attachment": true, + "open_weights": false, + "release_date": "2025-10-07", + "last_updated": "2026-04-29", "type": "chat" }, { - "id": "tensorx/deepseek/deepseek-v4-flash-0731", - "name": "DeepSeek V4 Flash 0731 (TensorX)", - "display_name": "DeepSeek V4 Flash 0731 (TensorX)", + "id": "meta/muse-spark-1.2", + "name": "Muse Spark 1.2", + "display_name": "Muse Spark 1.2", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" @@ -48618,7 +47684,7 @@ }, "limit": { "context": 1048576, - "output": 384000 + "output": 1048576 }, "temperature": true, "tool_call": true, @@ -48630,24 +47696,24 @@ "reasoning": { "supported": true, "effort_options": [ - "none", + "minimal", "low", + "medium", "high", - "max" + "xhigh" ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-07-31", - "last_updated": "2026-07-31", + "attachment": true, + "open_weights": false, + "release_date": "2026-08-05", + "last_updated": "2026-08-05", "type": "chat" }, { - "id": "tensorx/deepseek/deepseek-v4.1-flash-1017", - "name": "DeepSeek V4.1 Flash 1017 (TensorX)", - "display_name": "DeepSeek V4.1 Flash 1017 (TensorX)", + "id": "meta/muse-glimmer-30b", + "name": "Muse Glimmer 30B", + "display_name": "Muse Glimmer 30B", "modalities": { "input": [ "text", @@ -48658,8 +47724,8 @@ ] }, "limit": { - "context": 1048576, - "output": 384000 + "context": 131072, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -48672,26 +47738,27 @@ "effort_options": [ "none", "low", - "high", - "max" + "medium", + "high" ] } }, "attachment": true, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-10-17", - "last_updated": "2026-10-17", + "knowledge": "2026-01-04", + "release_date": "2026-08-10", + "last_updated": "2026-08-10", "type": "chat" }, { - "id": "tensorx/deepseek/deepseek-v4.1-flash", - "name": "DeepSeek V4.1 Flash (TensorX)", - "display_name": "DeepSeek V4.1 Flash (TensorX)", + "id": "meta/muse-spark-1.2-contributor", + "name": "Muse Spark 1.2 Contributor", + "display_name": "Muse Spark 1.2 Contributor", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" @@ -48699,9 +47766,8 @@ }, "limit": { "context": 1048576, - "output": 384000 + "output": 1048576 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -48709,42 +47775,41 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ - "none", + "minimal", "low", + "medium", "high", - "max" + "xhigh" ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-09-10", - "last_updated": "2026-09-10", + "open_weights": false, + "release_date": "2026-08-05", + "last_updated": "2026-08-05", "type": "chat" }, { - "id": "vertex/gemini-3-pro-image", - "name": "Nano Banana Pro (Vertex AI)", - "display_name": "Nano Banana Pro (Vertex AI)", + "id": "meta/muse-spark-1.1", + "name": "Muse Spark 1.1", + "display_name": "Muse Spark 1.1", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ - "text", - "image" + "text" ] }, "limit": { - "context": 65536, - "output": 32768 + "context": 1048576, + "output": 1048576 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, "default": true @@ -48752,117 +47817,112 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ + "effort_options": [ + "minimal", "low", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" + "medium", + "high", + "xhigh" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-05-28", - "last_updated": "2026-05-28" + "release_date": "2026-04-08", + "last_updated": "2026-07-09", + "type": "chat" }, { - "id": "vertex/gemini-flash-latest", - "name": "Gemini Flash Latest (Gemini 3.8 Flash, Vertex AI)", - "display_name": "Gemini Flash Latest (Gemini 3.8 Flash, Vertex AI)", + "id": "meta/llama-3.3-70b", + "name": "Llama-3.3-70B-Instruct", + "display_name": "Llama-3.3-70B-Instruct", "modalities": { "input": [ - "text", - "image", - "video", - "audio", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 128000, + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high" - ] - } + "attachment": false, + "open_weights": true, + "knowledge": "2023-12", + "release_date": "2024-12-06", + "last_updated": "2024-12-06", + "type": "chat" + }, + { + "id": "meta/llama-3.1-8b", + "name": "Llama 3.1 8B Instruct", + "display_name": "Llama 3.1 8B Instruct", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] }, - "attachment": true, - "open_weights": false, - "release_date": "2026-09-02", - "last_updated": "2026-09-02", + "limit": { + "context": 128000, + "output": 8192 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "knowledge": "2023-12", + "release_date": "2024-07-23", + "last_updated": "2024-07-23", "type": "chat" }, { - "id": "vertex/gemini-3.1-flash-lite-image", - "name": "Nano Banana 2 Lite (Vertex AI)", - "display_name": "Nano Banana 2 Lite (Vertex AI)", + "id": "meta/muse-image-1.0", + "name": "Muse Image 1.0", + "display_name": "Muse Image 1.0", "modalities": { "input": [ "text", "image" ], "output": [ - "text", "image" ] }, "limit": { - "context": 65536, - "output": 4096 + "context": 8192, + "output": 8192 }, - "temperature": true, + "temperature": false, "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "minimal", - "high" - ] - } + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-06-30", - "last_updated": "2026-06-30" + "release_date": "2026-07-07", + "last_updated": "2026-07-07" }, { - "id": "vertex/gemini-4-argon", - "name": "Gemini 4 Argon (Vertex AI)", - "display_name": "Gemini 4 Argon (Vertex AI)", + "id": "meta/muse-spark-open", + "name": "Muse Spark Open", + "display_name": "Muse Spark Open", "modalities": { "input": [ "text", - "image", - "video", - "audio", - "pdf" + "image" ], "output": [ "text" @@ -48870,9 +47930,9 @@ }, "limit": { "context": 1048576, - "output": 65536 + "output": 1048576 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -48883,27 +47943,26 @@ "effort_options": [ "low", "medium", - "high" + "high", + "xhigh" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-10-13", - "last_updated": "2026-10-13", + "open_weights": true, + "knowledge": "2026-01-04", + "release_date": "2026-10-15", + "last_updated": "2026-10-15", "type": "chat" }, { - "id": "vertex/gemini-3.5-flash", - "name": "Gemini 3.5 Flash (Vertex AI)", - "display_name": "Gemini 3.5 Flash (Vertex AI)", + "id": "meta/muse-wonder-1.0", + "name": "Muse Wonder", + "display_name": "Muse Wonder", "modalities": { "input": [ "text", "image", - "video", - "audio", "pdf" ], "output": [ @@ -48912,7 +47971,7 @@ }, "limit": { "context": 1048576, - "output": 65536 + "output": 1048576 }, "temperature": true, "tool_call": true, @@ -48922,82 +47981,59 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ + "effort_options": [ "minimal", "low", "medium", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" + "high", + "xhigh", + "max" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-05-19", - "last_updated": "2026-05-19", + "release_date": "2026-10-12", + "last_updated": "2026-10-12", "type": "chat" }, { - "id": "vertex/gemini-pro-latest", - "name": "Gemini Pro Latest (Gemini 4 Argon, Vertex AI)", - "display_name": "Gemini Pro Latest (Gemini 4 Argon, Vertex AI)", + "id": "meta/llama-4-scout", + "name": "Llama-4-Scout-17B-16E-Instruct-FP8", + "display_name": "Llama-4-Scout-17B-16E-Instruct-FP8", "modalities": { "input": [ "text", - "image", - "video", - "audio", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 128000, + "output": 8192 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high" - ] - } + "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-10-13", - "last_updated": "2026-10-13", + "open_weights": true, + "knowledge": "2024-08", + "release_date": "2025-04-05", + "last_updated": "2025-04-05", "type": "chat" }, { - "id": "vertex/gemini-3.5-flash-lite", - "name": "Gemini 3.5 Flash Lite (Vertex AI)", - "display_name": "Gemini 3.5 Flash Lite (Vertex AI)", + "id": "meta/muse-spark-1.3-contributor", + "name": "Muse Spark 1.3 Contributor", + "display_name": "Muse Spark 1.3 Contributor", "modalities": { "input": [ "text", "image", - "video", - "audio", "pdf" ], "output": [ @@ -49006,9 +48042,8 @@ }, "limit": { "context": 1048576, - "output": 65536 + "output": 1048576 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -49016,61 +48051,30 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ "minimal", "low", "medium", - "high" + "high", + "xhigh", + "max" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-07-21", - "last_updated": "2026-07-21", + "release_date": "2026-09-02", + "last_updated": "2026-09-02", "type": "chat" }, { - "id": "vertex/gemini-2.5-flash-image", - "name": "Nano Banana (Vertex AI)", - "display_name": "Nano Banana (Vertex AI)", - "modalities": { - "input": [ - "text", - "image" - ], - "output": [ - "text", - "image" - ] - }, - "limit": { - "context": 32768, - "output": 32768 - }, - "temperature": true, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-06", - "release_date": "2025-08-26", - "last_updated": "2025-08-26" - }, - { - "id": "vertex/gemini-3.1-pro-preview", - "name": "Gemini 3.1 Pro Preview (Vertex AI)", - "display_name": "Gemini 3.1 Pro Preview (Vertex AI)", + "id": "meta/muse-spark-1.3", + "name": "Muse Spark 1.3", + "display_name": "Muse Spark 1.3", "modalities": { "input": [ "text", "image", - "video", - "audio", "pdf" ], "output": [ @@ -49079,7 +48083,7 @@ }, "limit": { "context": 1048576, - "output": 65536 + "output": 1048576 }, "temperature": true, "tool_call": true, @@ -49090,655 +48094,382 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ + "effort_options": [ + "minimal", "low", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" + "medium", + "high", + "xhigh", + "max" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-02-19", - "last_updated": "2026-02-19", + "release_date": "2026-09-02", + "last_updated": "2026-09-02", "type": "chat" }, { - "id": "vertex/gemini-3.8-flash", - "name": "Gemini 3.8 Flash (Vertex AI)", - "display_name": "Gemini 3.8 Flash (Vertex AI)", + "id": "meta/llama-3.1-70b", + "name": "Llama 3.1 70B Instruct", + "display_name": "Llama 3.1 70B Instruct", "modalities": { "input": [ - "text", - "image", - "video", - "audio", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 128000, + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", - "low", - "medium", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] - } + "supported": false }, - "attachment": true, - "open_weights": false, - "release_date": "2026-09-02", - "last_updated": "2026-09-02", + "attachment": false, + "open_weights": true, + "knowledge": "2023-12", + "release_date": "2024-07-23", + "last_updated": "2024-07-23", "type": "chat" }, { - "id": "vertex/gemini-3.7-flash", - "name": "Gemini 3.7 Flash (Vertex AI)", - "display_name": "Gemini 3.7 Flash (Vertex AI)", + "id": "meta/llama-4-maverick", + "name": "Llama-4-Maverick-17B-128E-Instruct-FP8", + "display_name": "Llama-4-Maverick-17B-128E-Instruct-FP8", "modalities": { "input": [ "text", - "image", - "video", - "audio", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 128000, + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", - "low", - "medium", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] - } + "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-08-13", - "last_updated": "2026-08-13", + "open_weights": true, + "knowledge": "2024-08", + "release_date": "2025-04-05", + "last_updated": "2025-04-05", "type": "chat" }, { - "id": "vertex/gemini-3-flash-preview", - "name": "Gemini 3 Flash Preview (Vertex AI)", - "display_name": "Gemini 3 Flash Preview (Vertex AI)", + "id": "scaledown/scaledown-extract-1", + "name": "Extract-1", + "display_name": "Extract-1", "modalities": { "input": [ - "text", - "image", - "video", - "audio", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 1000000, + "output": 1000000 }, - "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", - "low", - "medium", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-12-17", - "last_updated": "2025-12-17", + "release_date": "2026-10-20", + "last_updated": "2026-10-20", "type": "chat" }, { - "id": "vertex/gemini-3.6-flash", - "name": "Gemini 3.6 Flash (Vertex AI)", - "display_name": "Gemini 3.6 Flash (Vertex AI)", + "id": "scaledown/scaledown-summarize-1", + "name": "Summarize-1", + "display_name": "Summarize-1", "modalities": { "input": [ - "text", - "image", - "video", - "audio", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 1000000, + "output": 1000 }, - "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", - "low", - "medium", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-07-21", - "last_updated": "2026-07-21", + "release_date": "2026-10-20", + "last_updated": "2026-10-20", "type": "chat" }, { - "id": "vertex/gemini-3.1-flash-image", - "name": "Nano Banana 2 (Vertex AI)", - "display_name": "Nano Banana 2 (Vertex AI)", + "id": "recraft/recraft-v4.1-utility", + "name": "Recraft V4.1 Utility", + "display_name": "Recraft V4.1 Utility", "modalities": { "input": [ - "image", "text" ], "output": [ - "text", "image" ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 8192, + "output": 8192 }, - "temperature": true, + "temperature": false, "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "minimal", - "high" - ] - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-05-28", - "last_updated": "2026-05-28" + "release_date": "2026-05-14", + "last_updated": "2026-05-14" }, { - "id": "vertex/gemini-3.1-flash-lite", - "name": "Gemini 3.1 Flash Lite (Vertex AI)", - "display_name": "Gemini 3.1 Flash Lite (Vertex AI)", + "id": "recraft/recraft-v4.1-pro", + "name": "Recraft V4.1 Pro", + "display_name": "Recraft V4.1 Pro", "modalities": { "input": [ - "text", - "image", - "video", - "audio", - "pdf" + "text" ], "output": [ - "text" + "image" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 8192, + "output": 8192 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "minimal", - "low", - "medium", - "high" - ] - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-05-07", - "last_updated": "2026-05-07", - "type": "chat" + "release_date": "2026-05-14", + "last_updated": "2026-05-14" }, { - "id": "vertex/gemini-nano-banana-2.1", - "name": "Nano Banana 2.1 (Vertex AI)", - "display_name": "Nano Banana 2.1 (Vertex AI)", + "id": "recraft/recraft-v2", + "name": "Recraft V2", + "display_name": "Recraft V2", "modalities": { "input": [ "text" ], "output": [ - "text" + "image" ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 512, + "output": 8192 }, "temperature": false, "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "minimal", - "medium", - "high" - ] - } + "supported": false }, "attachment": false, "open_weights": false, - "release_date": "2026-10-06", - "last_updated": "2026-10-06" + "release_date": "2024-03-13", + "last_updated": "2024-03" }, { - "id": "openai/gpt-5.2", - "name": "GPT-5.2", - "display_name": "GPT-5.2", + "id": "recraft/recraft-v4.1-flash", + "name": "Recraft V4.1 Flash", + "display_name": "Recraft V4.1 Flash", "modalities": { "input": [ - "pdf", - "image", "text" ], "output": [ - "text" + "image" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 8192, + "output": 8192 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2025-12-11", - "last_updated": "2025-12-11", - "type": "chat" + "release_date": "2026-09-23", + "last_updated": "2026-09-23" }, { - "id": "openai/gpt-5.4-mini", - "name": "GPT-5.4 mini", - "display_name": "GPT-5.4 mini", + "id": "recraft/recraft-v4-pro", + "name": "Recraft V4 Pro", + "display_name": "Recraft V4 Pro", "modalities": { "input": [ - "pdf", - "image", "text" ], "output": [ - "text" + "image" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 8192, + "output": 8192 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-17", - "last_updated": "2026-03-17", - "type": "chat" + "release_date": "2026-02-17", + "last_updated": "2026-02-17" }, { - "id": "openai/gpt-5.6-sol", - "name": "GPT-5.6 Sol", - "display_name": "GPT-5.6 Sol", + "id": "recraft/recraft-v3", + "name": "Recraft V3", + "display_name": "Recraft V3", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ - "text" + "image" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 512, + "output": 8192 }, "temperature": false, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", - "type": "chat" + "release_date": "2024-10-30", + "last_updated": "2024-10" }, { - "id": "openai/gpt-5.5-pro", - "name": "GPT-5.5 Pro", - "display_name": "GPT-5.5 Pro", + "id": "recraft/recraft-v4.1-utility-pro", + "name": "Recraft V4.1 Utility Pro", + "display_name": "Recraft V4.1 Utility Pro", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ - "text" + "image" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 8192, + "output": 8192 }, "temperature": false, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "medium", - "high", - "xhigh" - ] - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-12-01", - "release_date": "2026-04-23", - "last_updated": "2026-04-23", - "type": "chat" + "release_date": "2026-05-14", + "last_updated": "2026-05-14" }, { - "id": "openai/gpt-5-nano", - "name": "GPT-5 Nano", - "display_name": "GPT-5 Nano", + "id": "recraft/recraft-v4", + "name": "Recraft V4", + "display_name": "Recraft V4", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ - "text" + "image" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 8192, + "output": 8192 }, "temperature": false, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "minimal", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2024-05-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", - "type": "chat" + "release_date": "2026-02-17", + "last_updated": "2026-02-17" }, { - "id": "openai/gpt-4o", - "name": "GPT-4o", - "display_name": "GPT-4o", + "id": "recraft/recraft-v4.1", + "name": "Recraft V4.1", + "display_name": "Recraft V4.1", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ - "text" + "image" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 8192, + "output": 8192 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2023-09", - "release_date": "2024-05-13", - "last_updated": "2024-08-06", - "type": "chat" + "release_date": "2026-05-14", + "last_updated": "2026-05-14" }, { - "id": "openai/gpt-5.2-pro", - "name": "GPT-5.2 Pro", - "display_name": "GPT-5.2 Pro", + "id": "tencent/hy3", + "name": "Hy3", + "display_name": "Hy3", "modalities": { "input": [ - "image", - "text", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 262144, + "output": 262144 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -49747,38 +48478,25 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", "effort_options": [ - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ + "none", "low", - "medium", "high" - ], - "visibility": "hidden" + ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2025-12-11", - "last_updated": "2025-12-11", + "attachment": false, + "open_weights": true, + "release_date": "2026-07-06", + "last_updated": "2026-07-06", "type": "chat" }, { - "id": "openai/gpt-5.4-nano", - "name": "GPT-5.4 nano", - "display_name": "GPT-5.4 nano", + "id": "tencent/hy4-preview", + "name": "Tencent Hy4 Preview", + "display_name": "Tencent Hy4 Preview", "modalities": { "input": [ - "pdf", - "image", "text" ], "output": [ @@ -49786,48 +48504,34 @@ ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 1024000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", "effort_options": [ "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", "high" - ], - "visibility": "hidden" + ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-17", - "last_updated": "2026-03-17", + "attachment": false, + "open_weights": true, + "release_date": "2026-08-28", + "last_updated": "2026-08-28", "type": "chat" }, { - "id": "openai/gpt-3.5-turbo", - "name": "GPT-3.5-turbo", - "display_name": "GPT-3.5-turbo", + "id": "tencent/hy-mt2-lite", + "name": "Tencent Hy-MT2-Lite", + "display_name": "Tencent Hy-MT2-Lite", "modalities": { "input": [ "text" @@ -49837,138 +48541,170 @@ ] }, "limit": { - "context": 16385, - "output": 4096 + "context": 8000, + "output": 4000 }, - "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, "attachment": false, "open_weights": false, - "knowledge": "2021-09-01", - "release_date": "2023-03-01", - "last_updated": "2023-11-06", + "release_date": "2026-06-12", + "last_updated": "2026-06-12", "type": "chat" }, { - "id": "openai/gpt-5.6-luna", - "name": "GPT-5.6 Luna", - "display_name": "GPT-5.6 Luna", + "id": "tencent/hy-mt2-plus", + "name": "Tencent Hy-MT2-Plus", + "display_name": "Tencent Hy-MT2-Plus", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 8000, + "output": 4000 }, - "temperature": false, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "release_date": "2026-06-12", + "last_updated": "2026-06-12", "type": "chat" }, { - "id": "openai/o3-mini", - "name": "o3-mini", - "display_name": "o3-mini", + "id": "tencent/hy-mt2-pro", + "name": "Tencent Hy-MT2-Pro", + "display_name": "Tencent Hy-MT2-Pro", "modalities": { "input": [ - "text", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 8000, + "output": 4000 }, - "temperature": false, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2024-05", - "release_date": "2024-12-20", - "last_updated": "2025-01-29", + "release_date": "2026-05-21", + "last_updated": "2026-05-21", "type": "chat" }, { - "id": "openai/gpt-5.6-terra", - "name": "GPT-5.6 Terra", - "display_name": "GPT-5.6 Terra", + "id": "perplexity/pplx-embed-v1-4b", + "name": "Embed v1 4b", + "display_name": "Embed v1 4b", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 32000, + "output": 8192 + }, + "temperature": false, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": false, + "release_date": "2026-02-26", + "last_updated": "2026-02-26", + "type": "embedding" + }, + { + "id": "perplexity/sonar", + "name": "Sonar", + "display_name": "Sonar", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 127000, + "output": 8000 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-02", + "release_date": "2025-02-19", + "last_updated": "2025-02-19", + "type": "chat" + }, + { + "id": "perplexity/pplx-embed-v1-0.6b", + "name": "Embed v1 0.6b", + "display_name": "Embed v1 0.6b", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 32000, + "output": 8192 }, "temperature": false, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": false, + "release_date": "2026-02-26", + "last_updated": "2026-02-26", + "type": "embedding" + }, + { + "id": "stealth/glyph-cluster", + "name": "Glyph Cluster", + "display_name": "Glyph Cluster", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 256000, + "output": 256000 + }, "tool_call": true, "reasoning": { "supported": true, @@ -49976,38 +48712,24 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", "effort_options": [ - "none", "low", "medium", "high", - "xhigh", - "max" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "xhigh" + ] } }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "release_date": "2026-10-07", + "last_updated": "2026-10-07", "type": "chat" }, { - "id": "openai/o3", - "name": "o3", - "display_name": "o3", + "id": "thinkingmachines/inkling", + "name": "Inkling", + "display_name": "Inkling", "modalities": { "input": [ "text", @@ -50019,10 +48741,10 @@ ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 256000, + "output": 256000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -50030,29 +48752,27 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", "effort_options": [ + "none", + "minimal", "low", "medium", - "high" - ], - "visibility": "hidden" + "high", + "xhigh", + "max" + ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2024-05", - "release_date": "2025-04-16", - "last_updated": "2025-04-16", + "open_weights": true, + "release_date": "2026-07-15", + "last_updated": "2026-07-15", "type": "chat" }, { - "id": "openai/gpt-pro-latest", - "name": "GPT Pro Latest (GPT-5.6 Sol)", - "display_name": "GPT Pro Latest (GPT-5.6 Sol)", + "id": "thinkingmachines/inkling-small", + "name": "Inkling Small", + "display_name": "Inkling Small", "modalities": { "input": [ "text", @@ -50064,10 +48784,10 @@ ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1000000, + "output": 1000000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -50077,6 +48797,7 @@ "reasoning": { "effort_options": [ "none", + "minimal", "low", "medium", "high", @@ -50086,31 +48807,28 @@ } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "open_weights": true, + "release_date": "2026-07-30", + "last_updated": "2026-07-30", "type": "chat" }, { - "id": "openai/o1-pro", - "name": "o1-pro", - "display_name": "o1-pro", + "id": "reflection/beam", + "name": "Beam 1.0", + "display_name": "Beam 1.0", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 1048576, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -50118,44 +48836,39 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", "effort_options": [ "low", "medium", - "high" - ], - "visibility": "hidden" + "high", + "xhigh", + "max" + ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2023-09", - "release_date": "2025-03-19", - "last_updated": "2025-03-19", + "attachment": false, + "open_weights": true, + "knowledge": "2026-06-30", + "release_date": "2026-10-05", + "last_updated": "2026-10-16", "type": "chat" }, { - "id": "openai/gpt-5-pro", - "name": "GPT-5 Pro", - "display_name": "GPT-5 Pro", + "id": "reflection/beam-free", + "name": "Beam 1.0 (Free)", + "display_name": "Beam 1.0 (Free)", "modalities": { "input": [ - "image", - "text", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 272000 + "context": 1048576, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -50163,43 +48876,39 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "fixed", - "effort": "high", - "verbosity": "medium", - "verbosity_options": [ + "effort_options": [ "low", "medium", - "high" - ], - "visibility": "hidden" + "high", + "xhigh", + "max" + ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-10-06", - "last_updated": "2025-10-06", + "attachment": false, + "open_weights": true, + "knowledge": "2026-06-30", + "release_date": "2026-10-05", + "last_updated": "2026-10-16", "type": "chat" }, { - "id": "openai/gpt-6-sol", - "name": "GPT-6 Sol", - "display_name": "GPT-6 Sol", + "id": "quiverai/arrow-2", + "name": "Arrow 2", + "display_name": "Arrow 2", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ - "text" + "text", + "image" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 131072, + "output": 65536 }, "temperature": false, "tool_call": true, @@ -50210,41 +48919,38 @@ "extra_capabilities": { "reasoning": { "effort_options": [ - "none", "low", "medium", "high", - "xhigh", - "max" + "xhigh" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-04-20", - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "release_date": "2026-09-16", + "last_updated": "2026-09-16", "type": "chat" }, { - "id": "openai/gpt-5.3-codex", - "name": "GPT-5.3 Codex", - "display_name": "GPT-5.3 Codex", + "id": "quiverai/arrow-2-telos", + "name": "Arrow 2 Telos", + "display_name": "Arrow 2 Telos", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ - "text" + "text", + "image" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 131072, + "output": 65536 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -50252,447 +48958,473 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", "effort_options": [ "low", "medium", "high", "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-05", - "last_updated": "2026-02-05", + "release_date": "2026-09-16", + "last_updated": "2026-09-16", "type": "chat" }, { - "id": "openai/gpt-5-search-api", - "name": "GPT-5 Search API", - "display_name": "GPT-5 Search API", + "id": "bytedance/seedance-v1.5-pro", + "name": "Seedance v1.5 Pro", + "display_name": "Seedance v1.5 Pro", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ - "text" + "video" ] }, "limit": { - "context": 272000, - "output": 100000 + "context": 8192, + "output": 8192 }, "temperature": false, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, "attachment": true, "open_weights": false, - "release_date": "2025-10-14", - "last_updated": "2025-10-14", - "type": "chat" + "release_date": "2025-12-16", + "last_updated": "2025-12-16" }, { - "id": "openai/gpt-6.1-sol", - "name": "GPT-6.1 Sol", - "display_name": "GPT-6.1 Sol", + "id": "bytedance/seedance-2.0", + "name": "Seedance 2.0", + "display_name": "Seedance 2.0", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ - "text" + "video" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 8192, + "output": 8192 }, "temperature": false, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ] - } + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2026-04-30", - "release_date": "2026-09-29", - "last_updated": "2026-09-29", - "type": "chat" + "release_date": "2026-02-12", + "last_updated": "2026-10-04" }, { - "id": "openai/gpt-latest", - "name": "GPT Latest (GPT-6 Astra)", - "display_name": "GPT Latest (GPT-6 Astra)", + "id": "bytedance/seedream-5.0-pro", + "name": "Seedream 5.0 Pro", + "display_name": "Seedream 5.0 Pro", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ - "text" + "image" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 8192, + "output": 8192 }, "temperature": false, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ] - } + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2026-04-30", - "release_date": "2026-09-04", - "last_updated": "2026-09-04", - "type": "chat" + "release_date": "2026-07-11", + "last_updated": "2026-07-11" }, { - "id": "openai/gpt-5.4", - "name": "GPT-5.4", - "display_name": "GPT-5.4", + "id": "bytedance/seed-1.8", + "name": "Seed 1.8", + "display_name": "Seed 1.8", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 256000, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ + "minimal", "low", "medium", "high" - ], - "visibility": "hidden" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-05", - "last_updated": "2026-03-05", + "release_date": "2025-12-28", + "last_updated": "2025-12-28", "type": "chat" }, { - "id": "openai/gpt-4o-2024-11-20", - "name": "GPT-4o (2024-11-20)", - "display_name": "GPT-4o (2024-11-20)", + "id": "bytedance/seedance-2.5", + "name": "Seedance 2.5", + "display_name": "Seedance 2.5", + "modalities": { + "input": [ + "text" + ], + "output": [ + "video" + ] + }, + "limit": { + "context": 8192, + "output": 8192 + }, + "temperature": false, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": false, + "release_date": "2026-07-31", + "last_updated": "2026-10-04" + }, + { + "id": "bytedance/seedance-v1.0-pro-fast", + "name": "Seedance v1.0 Pro Fast", + "display_name": "Seedance v1.0 Pro Fast", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ - "text" + "video" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 8192, + "output": 8192 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2023-09", - "release_date": "2024-11-20", - "last_updated": "2024-11-20", - "type": "chat" + "release_date": "2025-10-24", + "last_updated": "2025-10-31" }, { - "id": "openai/o3-pro", - "name": "o3-pro", - "display_name": "o3-pro", + "id": "bytedance/seedream-4.0", + "name": "Seedream 4.0", + "display_name": "Seedream 4.0", "modalities": { "input": [ "text", - "pdf", "image" ], "output": [ - "text" + "image" ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 8192, + "output": 8192 }, "temperature": false, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2024-05", - "release_date": "2025-06-10", - "last_updated": "2025-06-10", - "type": "chat" + "release_date": "2025-09-09", + "last_updated": "2025-08-28" }, { - "id": "openai/gpt-5.1", - "name": "GPT-5.1", - "display_name": "GPT-5.1", + "id": "bytedance/seed-2.1-turbo", + "name": "Seed 2.1 Turbo", + "display_name": "Seed 2.1 Turbo", "modalities": { "input": [ - "image", "text", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", "effort_options": [ "none", "low", "medium", "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-11-13", - "last_updated": "2025-11-13", + "release_date": "2026-06-23", + "last_updated": "2026-06-23", "type": "chat" }, { - "id": "openai/gpt-4o-2024-08-06", - "name": "GPT-4o (2024-08-06)", - "display_name": "GPT-4o (2024-08-06)", + "id": "bytedance/seedream-5.0-lite", + "name": "Seedream 5.0 Lite", + "display_name": "Seedream 5.0 Lite", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ - "text" + "image" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 8192, + "output": 8192 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2023-09", - "release_date": "2024-08-06", - "last_updated": "2024-08-06", - "type": "chat" + "release_date": "2026-02-13", + "last_updated": "2026-01-28" }, { - "id": "openai/gpt-4.1-mini", - "name": "GPT-4.1 mini", - "display_name": "GPT-4.1 mini", + "id": "bytedance/seedance-v1.0-pro", + "name": "Seedance v1.0 Pro", + "display_name": "Seedance v1.0 Pro", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "video" + ] + }, + "limit": { + "context": 8192, + "output": 8192 + }, + "temperature": false, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": false, + "release_date": "2025-06-11", + "last_updated": "2025-06-11" + }, + { + "id": "bytedance/seedance-2.0-fast", + "name": "Seedance 2.0 Fast", + "display_name": "Seedance 2.0 Fast", "modalities": { "input": [ "text", "image", - "pdf" + "video", + "audio" ], "output": [ - "text" + "video" ] }, "limit": { - "context": 1047576, - "output": 32768 + "context": 8192, + "output": 8192 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-04-14", - "last_updated": "2025-04-14", - "type": "chat" + "release_date": "2026-04-14", + "last_updated": "2026-04-14" }, { - "id": "openai/gpt-6-astra", - "name": "GPT-6 Astra", - "display_name": "GPT-6 Astra", + "id": "bytedance/seedance-2.0-mini", + "name": "Seedance 2.0 Mini", + "display_name": "Seedance 2.0 Mini", "modalities": { "input": [ "text", "image", - "pdf" + "video", + "audio" ], "output": [ - "text" + "video" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 8192, + "output": 8192 + }, + "temperature": false, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": false, + "release_date": "2026-06-22", + "last_updated": "2026-06-22" + }, + { + "id": "bytedance/seedream-4.5", + "name": "Seedream 4.5", + "display_name": "Seedream 4.5", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "image" + ] + }, + "limit": { + "context": 8192, + "output": 8192 }, "temperature": false, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": false, + "release_date": "2025-12-03", + "last_updated": "2025-11-28" + }, + { + "id": "bytedance/seed-1.6", + "name": "Seed 1.6", + "display_name": "Seed 1.6", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 256000, + "output": 32000 + }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ] - } - }, "attachment": true, "open_weights": false, - "knowledge": "2026-04-30", - "release_date": "2026-09-04", - "last_updated": "2026-09-04", + "release_date": "2025-10-15", + "last_updated": "2025-10-15", "type": "chat" }, { - "id": "openai/gpt-5.5", - "name": "GPT-5.5", - "display_name": "GPT-5.5", + "id": "spacexai/grok-imagine-video", + "name": "Grok Imagine", + "display_name": "Grok Imagine", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ - "text" + "video" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 8192, + "output": 8192 }, "temperature": false, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": false, + "release_date": "2026-01-28", + "last_updated": "2026-01-28" + }, + { + "id": "spacexai/grok-build-0.1", + "name": "Grok Build 0.1", + "display_name": "Grok Build 0.1", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 256000, + "output": 256000 + }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -50701,65 +49433,92 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ + "none", "low", "medium", "high" - ], - "visibility": "hidden" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-12-01", - "release_date": "2026-04-23", - "last_updated": "2026-04-23", + "release_date": "2026-04-16", + "last_updated": "2026-04-16", "type": "chat" }, { - "id": "openai/gpt-4o-mini", - "name": "GPT-4o mini", - "display_name": "GPT-4o mini", + "id": "spacexai/grok-imagine-image", + "name": "Grok Imagine Image", + "display_name": "Grok Imagine Image", "modalities": { "input": [ "text", - "image", - "pdf" + "image" + ], + "output": [ + "image" + ] + }, + "limit": { + "context": 16000, + "output": 8192 + }, + "temperature": false, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": false, + "release_date": "2026-01-28", + "last_updated": "2026-01-28" + }, + { + "id": "spacexai/grok-4.6", + "name": "Grok 4.6", + "display_name": "Grok 4.6", + "modalities": { + "input": [ + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 500000, + "output": 500000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "low", + "medium", + "high", + "xhigh" + ] + } }, "attachment": true, "open_weights": false, - "knowledge": "2023-09", - "release_date": "2024-07-18", - "last_updated": "2024-07-18", + "knowledge": "2026-02-01", + "release_date": "2026-08-12", + "last_updated": "2026-08-12", "type": "chat" }, { - "id": "openai/gpt-5-mini", - "name": "GPT-5 Mini", - "display_name": "GPT-5 Mini", + "id": "spacexai/grok-4.20-reasoning-beta", + "name": "Grok 4.20 Beta Reasoning", + "display_name": "Grok 4.20 Beta Reasoning", "modalities": { "input": [ "text", @@ -50771,10 +49530,9 @@ ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 2000000, + "output": 2000000 }, - "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -50782,36 +49540,24 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", "effort_options": [ - "minimal", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ + "none", "low", "medium", "high" - ], - "visibility": "hidden" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2024-05-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "release_date": "2026-03-11", + "last_updated": "2026-03-11", "type": "chat" }, { - "id": "openai/gpt-5", - "name": "GPT-5", - "display_name": "GPT-5", + "id": "spacexai/grok-4.5", + "name": "Grok 4.5", + "display_name": "Grok 4.5", "modalities": { "input": [ "text", @@ -50823,10 +49569,10 @@ ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 500000, + "output": 500000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -50835,35 +49581,23 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", "effort_options": [ - "minimal", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ "low", "medium", "high" - ], - "visibility": "hidden" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "release_date": "2026-07-08", + "last_updated": "2026-07-08", "type": "chat" }, { - "id": "openai/gpt-6-luna", - "name": "GPT-6 Luna", - "display_name": "GPT-6 Luna", + "id": "spacexai/grok-4.20-reasoning", + "name": "Grok 4.20 Reasoning", + "display_name": "Grok 4.20 Reasoning", "modalities": { "input": [ "text", @@ -50875,10 +49609,10 @@ ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 2000000, + "output": 2000000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -50890,53 +49624,47 @@ "none", "low", "medium", - "high", - "xhigh", - "max" + "high" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-05-18", - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "release_date": "2026-03-09", + "last_updated": "2026-03-09", "type": "chat" }, { - "id": "openai/gpt-4.1", - "name": "GPT-4.1", - "display_name": "GPT-4.1", + "id": "spacexai/grok-imagine-image-2.0", + "name": "Grok Imagine Image 2.0", + "display_name": "Grok Imagine Image 2.0", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ - "text" + "image" ] }, "limit": { - "context": 1047576, - "output": 32768 + "context": 64000, + "output": 8192 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-04-14", - "last_updated": "2025-04-14", - "type": "chat" + "release_date": "2026-08-07", + "last_updated": "2026-08-07" }, { - "id": "openai/o1", - "name": "o1", - "display_name": "o1", + "id": "spacexai/grok-4.20-multi-agent-beta", + "name": "Grok 4.20 Multi Agent Beta", + "display_name": "Grok 4.20 Multi Agent Beta", "modalities": { "input": [ "text", @@ -50948,10 +49676,9 @@ ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 2000000, + "output": 2000000 }, - "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -50959,29 +49686,24 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", "effort_options": [ + "none", "low", "medium", "high" - ], - "visibility": "hidden" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2023-09", - "release_date": "2024-12-05", - "last_updated": "2024-12-05", + "release_date": "2026-03-11", + "last_updated": "2026-03-11", "type": "chat" }, { - "id": "openai/gpt-mini-latest", - "name": "GPT Mini Latest (GPT-5.6 Luna)", - "display_name": "GPT Mini Latest (GPT-5.6 Luna)", + "id": "spacexai/grok-4.20-multi-agent", + "name": "Grok 4.20 Multi-Agent", + "display_name": "Grok 4.20 Multi-Agent", "modalities": { "input": [ "text", @@ -50993,10 +49715,9 @@ ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 2000000, + "output": 2000000 }, - "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -51008,27 +49729,24 @@ "none", "low", "medium", - "high", - "xhigh", - "max" + "high" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "release_date": "2026-03-10", + "last_updated": "2026-03-10", "type": "chat" }, { - "id": "openai/gpt-4.1-nano", - "name": "GPT-4.1 nano", - "display_name": "GPT-4.1 nano", + "id": "spacexai/grok-4.20-non-reasoning", + "name": "Grok 4.20 Non-Reasoning", + "display_name": "Grok 4.20 Non-Reasoning", "modalities": { "input": [ - "image", "text", + "image", "pdf" ], "output": [ @@ -51036,8 +49754,8 @@ ] }, "limit": { - "context": 1047576, - "output": 32768 + "context": 2000000, + "output": 2000000 }, "temperature": true, "tool_call": true, @@ -51046,101 +49764,79 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-04-14", - "last_updated": "2025-04-14", + "release_date": "2026-03-09", + "last_updated": "2026-03-09", "type": "chat" }, { - "id": "openai/gpt-4", - "name": "GPT-4", - "display_name": "GPT-4", - "modalities": { - "input": [ + "id": "spacexai/grok-imagine-video-1.5-lite", + "name": "Grok Imagine Video 1.5 Lite", + "display_name": "Grok Imagine Video 1.5 Lite", + "modalities": { + "input": [ "text" ], "output": [ - "text" + "video" ] }, "limit": { - "context": 8191, + "context": 1024, "output": 8192 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { "supported": false }, "attachment": false, "open_weights": false, - "knowledge": "2023-11", - "release_date": "2023-11-06", - "last_updated": "2024-04-09", - "type": "chat" + "release_date": "2026-10-01", + "last_updated": "2026-10-01" }, { - "id": "openai/o4-mini", - "name": "o4-mini", - "display_name": "o4-mini", + "id": "spacexai/grok-imagine-video-1.5", + "name": "Grok Imagine Video 1.5", + "display_name": "Grok Imagine Video 1.5", "modalities": { "input": [ - "image", - "text", - "pdf" + "text" ], "output": [ - "text" + "video" ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 1024, + "output": 8192 }, "temperature": false, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2024-05", - "release_date": "2025-04-16", - "last_updated": "2025-04-16", - "type": "chat" + "release_date": "2026-05-30", + "last_updated": "2026-05-30" }, { - "id": "openai/gpt-4-turbo", - "name": "GPT-4 Turbo", - "display_name": "GPT-4 Turbo", + "id": "spacexai/grok-voice-think-fast-2.0", + "name": "Grok Voice Think Fast 2.0", + "display_name": "Grok Voice Think Fast 2.0", "modalities": { "input": [ "text", - "image", - "pdf" + "audio" ], "output": [ - "text" + "text", + "audio" ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 8192, + "output": 8192 }, "temperature": true, "tool_call": true, @@ -51149,69 +49845,43 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2023-12", - "release_date": "2023-11-06", - "last_updated": "2024-04-09", - "type": "chat" + "release_date": "2026-07-29", + "last_updated": "2026-07-29" }, { - "id": "openai/gpt-5.4-pro", - "name": "GPT-5.4 Pro", - "display_name": "GPT-5.4 Pro", + "id": "spacexai/grok-tts", + "name": "Grok TTS", + "display_name": "Grok TTS", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ - "text" + "audio" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 15000, + "output": 15000 }, "temperature": false, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-05", - "last_updated": "2026-03-05", - "type": "chat" + "release_date": "2026-03-16", + "last_updated": "2026-03-16" }, { - "id": "mistral/codestral-2508", - "name": "Codestral 25.08", - "display_name": "Codestral 25.08", + "id": "spacexai/grok-4.20-non-reasoning-beta", + "name": "Grok 4.20 Beta Non-Reasoning", + "display_name": "Grok 4.20 Beta Non-Reasoning", "modalities": { "input": [ "text", + "image", "pdf" ], "output": [ @@ -51219,92 +49889,49 @@ ] }, "limit": { - "context": 256000, - "output": 8192 + "context": 2000000, + "output": 2000000 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": false }, "attachment": true, "open_weights": false, - "release_date": "2025-07-30", - "last_updated": "2025-07-30", - "type": "chat" - }, - { - "id": "mistral/mistral-small-latest", - "name": "Mistral Small (latest)", - "display_name": "Mistral Small (latest)", - "modalities": { - "input": [ - "text", - "image" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 262144, - "output": 256000 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "high" - ] - } - }, - "attachment": true, - "open_weights": true, - "knowledge": "2025-06", - "release_date": "2026-03-16", - "last_updated": "2026-03-16", + "release_date": "2026-03-11", + "last_updated": "2026-03-11", "type": "chat" }, { - "id": "mistral/mistral-large-2512", - "name": "Mistral Large 3", - "display_name": "Mistral Large 3", + "id": "spacexai/grok-stt", + "name": "Grok STT", + "display_name": "Grok STT", "modalities": { "input": [ - "text", - "image", - "pdf" + "audio" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 8192, + "output": 8192 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { "supported": false }, "attachment": true, - "open_weights": true, - "knowledge": "2024-11", - "release_date": "2025-12-02", - "last_updated": "2025-12-02", - "type": "chat" + "open_weights": false, + "release_date": "2026-03-16", + "last_updated": "2026-03-16" }, { - "id": "mistral/mistral-medium-3-5", - "name": "Mistral Medium 3.5", - "display_name": "Mistral Medium 3.5", + "id": "spacexai/grok-4.3", + "name": "Grok 4.3", + "display_name": "Grok 4.3", "modalities": { "input": [ "text", @@ -51316,8 +49943,8 @@ ] }, "limit": { - "context": 262144, - "output": 209715 + "context": 1000000, + "output": 1000000 }, "temperature": true, "tool_call": true, @@ -51327,22 +49954,24 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ - "none", + "low", + "medium", "high" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-04-30", - "last_updated": "2026-04-30", + "release_date": "2026-04-17", + "last_updated": "2026-04-17", "type": "chat" }, { - "id": "mistral/ministral-3b-2512", - "name": "Ministral 3 3B 2512", - "display_name": "Ministral 3 3B 2512", + "id": "spacexai/grok-4.7", + "name": "Grok 4.7", + "display_name": "Grok 4.7", "modalities": { "input": [ "text", @@ -51353,66 +49982,49 @@ ] }, "limit": { - "context": 131072, - "output": 104857 + "context": 500000, + "output": 500000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": true, - "release_date": "2025-12-02", - "last_updated": "2025-12-02", - "type": "chat" - }, - { - "id": "mistral/mistral-medium-3", - "name": "Mistral Medium 3", - "display_name": "Mistral Medium 3", - "modalities": { - "input": [ - "text", - "image", - "pdf" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 262144, - "output": 104857 + "supported": true, + "default": true }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "high", + "xhigh" + ] + } }, "attachment": true, "open_weights": false, - "knowledge": "2025-03-31", - "release_date": "2025-05-07", - "last_updated": "2025-05-07", + "knowledge": "2026-05", + "release_date": "2026-09-21", + "last_updated": "2026-09-21", "type": "chat" }, { - "id": "mistral/mistral-medium-latest", - "name": "Mistral Medium (latest)", - "display_name": "Mistral Medium (latest)", + "id": "alibaba/qwen3.6-plus", + "name": "Qwen 3.6 Plus", + "display_name": "Qwen 3.6 Plus", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1000000, + "output": 64000 }, "temperature": true, "tool_call": true, @@ -51422,107 +50034,133 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ "none", - "high" + "minimal", + "low", + "medium", + "high", + "xhigh", + "max" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-04-29", - "last_updated": "2026-04-29", + "open_weights": false, + "knowledge": "2025-04", + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "mistral/ministral-14b-2512", - "name": "Ministral 3 14B 2512", - "display_name": "Ministral 3 14B 2512", + "id": "alibaba/qwen3-coder-next", + "name": "Qwen3 Coder Next", + "display_name": "Qwen3 Coder Next", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 209715 + "context": 256000, + "output": 256000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2025-12-02", - "last_updated": "2025-12-02", + "knowledge": "2025-09", + "release_date": "2026-02-03", + "last_updated": "2026-02-03", "type": "chat" }, { - "id": "mistral/voxtral-small-latest", - "name": "Voxtral Small (latest)", - "display_name": "Voxtral Small (latest)", + "id": "alibaba/qwen3-max-thinking", + "name": "Qwen 3 Max Thinking", + "display_name": "Qwen 3 Max Thinking", "modalities": { "input": [ - "text", - "audio" + "text" ], "output": [ "text" ] }, "limit": { - "context": 32768, - "output": 32000 + "context": 256000, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, "open_weights": true, - "release_date": "2025-07-15", - "last_updated": "2025-07-15", + "knowledge": "2025-01", + "release_date": "2026-01-23", + "last_updated": "2025-01", "type": "chat" }, { - "id": "mistral/mistral-medium-2505", - "name": "Mistral Medium 3", - "display_name": "Mistral Medium 3", + "id": "alibaba/qwen-3-14b", + "name": "Qwen3-14B", + "display_name": "Qwen3-14B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 131072 + "context": 40960, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-05", - "release_date": "2025-05-07", - "last_updated": "2025-05-07", + "knowledge": "2025-04", + "release_date": "2025-04-28", + "last_updated": "2025-04", "type": "chat" }, { - "id": "mistral/mistral-medium-2604", - "name": "Mistral Medium 3.5", - "display_name": "Mistral Medium 3.5", + "id": "alibaba/qwen3.8-max-prime", + "name": "Qwen 3.8 Max Prime", + "display_name": "Qwen 3.8 Max Prime", "modalities": { "input": [ "text", @@ -51533,8 +50171,8 @@ ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -51545,21 +50183,22 @@ "extra_capabilities": { "reasoning": { "effort_options": [ - "none", - "high" + "low", + "medium", + "xhigh" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-04-29", - "last_updated": "2026-04-29", + "open_weights": false, + "release_date": "2026-09-23", + "last_updated": "2026-09-23", "type": "chat" }, { - "id": "mistral/codestral-latest", - "name": "Codestral (latest)", - "display_name": "Codestral (latest)", + "id": "alibaba/qwen-3-32b", + "name": "Qwen 3.32B", + "display_name": "Qwen 3.32B", "modalities": { "input": [ "text" @@ -51569,37 +50208,8 @@ ] }, "limit": { - "context": 256000, - "output": 4096 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-10", - "release_date": "2024-05-29", - "last_updated": "2025-01-04", - "type": "chat" - }, - { - "id": "mistral/mistral-small-2603", - "name": "Mistral Small 4", - "display_name": "Mistral Small 4", - "modalities": { - "input": [ - "text", - "image" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 262144, - "output": 256000 + "context": 128000, + "output": 8192 }, "temperature": true, "tool_call": true, @@ -51611,53 +50221,56 @@ "reasoning": { "effort_options": [ "none", + "low", + "medium", "high" ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2025-06", - "release_date": "2026-03-16", - "last_updated": "2026-03-16", + "knowledge": "2025-04", + "release_date": "2025-04-28", + "last_updated": "2025-04-28", "type": "chat" }, { - "id": "mistral/devstral-2512", - "name": "Devstral 2", - "display_name": "Devstral 2", + "id": "alibaba/wan-v3.0-video-prime", + "name": "Wan v3.0 Video Prime", + "display_name": "Wan v3.0 Video Prime", "modalities": { "input": [ "text", - "pdf" + "image", + "video", + "audio" ], "output": [ - "text" + "video" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 8192, + "output": 8192 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { "supported": false }, "attachment": true, - "open_weights": true, - "knowledge": "2025-12", - "release_date": "2025-12-09", - "last_updated": "2025-12-09", - "type": "chat" + "open_weights": false, + "release_date": "2026-08-28", + "last_updated": "2026-08-28" }, { - "id": "mistral/mistral-large-2407", - "name": "Mistral Large 2407", - "display_name": "Mistral Large 2407", + "id": "alibaba/qwen3.6-27b", + "name": "Qwen 3.6 27B", + "display_name": "Qwen 3.6 27B", "modalities": { "input": [ "text", + "image", "pdf" ], "output": [ @@ -51665,25 +50278,36 @@ ] }, "limit": { - "context": 131072, - "output": 104857 + "context": 256000, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": true, "open_weights": true, - "knowledge": "2024-03-31", - "release_date": "2024-07-24", - "last_updated": "2024-07-24", + "release_date": "2026-04-22", + "last_updated": "2026-04-22", "type": "chat" }, { - "id": "mistral/magistral-medium-latest", - "name": "Magistral Medium (latest)", - "display_name": "Magistral Medium (latest)", + "id": "alibaba/qwen3.8-2.4t-a95b", + "name": "Qwen3.8 2.4T A95B", + "display_name": "Qwen3.8 2.4T A95B", "modalities": { "input": [ "text", @@ -51695,7 +50319,7 @@ }, "limit": { "context": 262144, - "output": 16384 + "output": 128000 }, "temperature": true, "tool_call": true, @@ -51705,84 +50329,55 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ - "none", - "high" + "low", + "medium", + "xhigh" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-06", - "release_date": "2025-03-17", - "last_updated": "2025-03-20", - "type": "chat" - }, - { - "id": "mistral/devstral-medium-latest", - "name": "Devstral 2 (latest)", - "display_name": "Devstral 2 (latest)", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 262144, - "output": 262144 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": false, "open_weights": true, - "knowledge": "2025-12", - "release_date": "2025-12-02", - "last_updated": "2025-12-02", + "release_date": "2026-08-12", + "last_updated": "2026-08-12", "type": "chat" }, { - "id": "mistral/ministral-8b-2512", - "name": "Ministral 3 8B 2512", - "display_name": "Ministral 3 8B 2512", + "id": "alibaba/wan-v2.6-r2v", + "name": "Wan v2.6 Reference-to-Video", + "display_name": "Wan v2.6 Reference-to-Video", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ - "text" + "video" ] }, "limit": { - "context": 262144, - "output": 209715 + "context": 8192, + "output": 8192 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { "supported": false }, "attachment": true, - "open_weights": true, - "release_date": "2025-12-02", - "last_updated": "2025-12-02", - "type": "chat" + "open_weights": false, + "release_date": "2025-12-16", + "last_updated": "2025-12-16" }, { - "id": "mistral/mistral-large-latest", - "name": "Mistral Large (latest)", - "display_name": "Mistral Large (latest)", + "id": "alibaba/qwen3-coder-30b-a3b", + "name": "Qwen 3 Coder 30B A3B Instruct", + "display_name": "Qwen 3 Coder 30B A3B Instruct", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" @@ -51790,24 +50385,25 @@ }, "limit": { "context": 262144, - "output": 262144 + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2024-11", - "release_date": "2024-11-01", - "last_updated": "2025-12-02", + "knowledge": "2025-04", + "release_date": "2025-07-31", + "last_updated": "2025-07-31", "type": "chat" }, { - "id": "sference/deepseek-ai/DeepSeek-V4-Flash-0731", - "name": "DeepSeek V4 Flash 0731 (Sference)", - "display_name": "DeepSeek V4 Flash 0731 (Sference)", + "id": "alibaba/qwen3.7-max", + "name": "Qwen 3.7 Max", + "display_name": "Qwen 3.7 Max", "modalities": { "input": [ "text" @@ -51817,8 +50413,8 @@ ] }, "limit": { - "context": 1048576, - "output": 384000 + "context": 991000, + "output": 64000 }, "temperature": true, "tool_call": true, @@ -51831,35 +50427,38 @@ "supported": true, "effort_options": [ "none", + "minimal", "low", + "medium", "high", + "xhigh", "max" ] } }, "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-07-31", - "last_updated": "2026-07-31", + "open_weights": false, + "release_date": "2026-05-21", + "last_updated": "2026-05-21", "type": "chat" }, { - "id": "sference/deepseek-ai/DeepSeek-V4.1-Flash-1017", - "name": "DeepSeek V4.1 Flash 1017 (Sference)", - "display_name": "DeepSeek V4.1 Flash 1017 (Sference)", + "id": "alibaba/qwen3.5-plus", + "name": "Qwen 3.5 Plus", + "display_name": "Qwen 3.5 Plus", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 384000 + "context": 1000000, + "output": 64000 }, "temperature": true, "tool_call": true, @@ -51869,38 +50468,48 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ "none", + "minimal", "low", + "medium", "high", + "xhigh", "max" ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-10-17", - "last_updated": "2026-10-17", + "open_weights": false, + "knowledge": "2025-04", + "release_date": "2026-02-16", + "last_updated": "2026-02-16", "type": "chat" }, { - "id": "qwen/qwen3.8-27b", - "name": "Qwen3.8 27B", - "display_name": "Qwen3.8 27B", + "id": "alibaba/qwen3.7-flash", + "name": "Qwen 3.7 Flash", + "display_name": "Qwen 3.7 Flash", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 32768 + "context": 991000, + "output": 64000 }, "temperature": true, "tool_call": true, @@ -51910,104 +50519,96 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ "none", + "minimal", "low", "medium", - "xhigh" + "high", + "xhigh", + "max" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "open_weights": false, + "release_date": "2026-07-15", + "last_updated": "2026-07-15", "type": "chat" }, { - "id": "qwen/qwen-max", - "name": "Qwen Max", - "display_name": "Qwen Max", + "id": "alibaba/qwen3-vl-instruct", + "name": "Qwen3 VL Instruct", + "display_name": "Qwen3 VL Instruct", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 32768, - "output": 8192 + "context": 262144, + "output": 262144 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, - "open_weights": false, - "knowledge": "2024-04", - "release_date": "2024-04-03", - "last_updated": "2025-01-25", + "attachment": true, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-09-23", + "last_updated": "2025-09-24", "type": "chat" }, { - "id": "qwen/qwen3.8-max", - "name": "Qwen3.8 Max", - "display_name": "Qwen3.8 Max", + "id": "alibaba/wan-v2.6-t2v", + "name": "Wan v2.6 Text-to-Video", + "display_name": "Wan v2.6 Text-to-Video", "modalities": { "input": [ "text", - "image", - "video" + "audio" ], "output": [ - "text" + "video" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 8192, + "output": 8192 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "none", - "low", - "medium", - "xhigh" - ] - } + "supported": false }, "attachment": true, "open_weights": false, - "release_date": "2026-08-03", - "last_updated": "2026-08-03", - "type": "chat" + "release_date": "2025-12-16", + "last_updated": "2025-12-16" }, { - "id": "qwen/deepseek-v4-pro-0813", - "name": "DeepSeek V4 Pro 0813 (Alibaba)", - "display_name": "DeepSeek V4 Pro 0813 (Alibaba)", + "id": "alibaba/qwen3.8-max", + "name": "Qwen 3.8 Max", + "display_name": "Qwen 3.8 Max", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 262144, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -52019,23 +50620,22 @@ "reasoning": { "supported": true, "effort_options": [ - "none", "low", - "high", - "max" + "medium", + "xhigh" ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-08-13", - "last_updated": "2026-08-22", + "attachment": true, + "open_weights": false, + "release_date": "2026-07-19", + "last_updated": "2026-07-19", "type": "chat" }, { - "id": "qwen/qwen3-coder-flash", - "name": "Qwen3 Coder Flash", - "display_name": "Qwen3 Coder Flash", + "id": "alibaba/qwen3-next-80b-a3b-instruct", + "name": "Qwen3 Next 80B A3B Instruct", + "display_name": "Qwen3 Next 80B A3B Instruct", "modalities": { "input": [ "text" @@ -52045,25 +50645,25 @@ ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 262114, + "output": 262114 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, "attachment": false, - "open_weights": false, + "open_weights": true, "knowledge": "2025-04", - "release_date": "2025-07-28", - "last_updated": "2025-07-28", + "release_date": "2025-09", + "last_updated": "2025-09", "type": "chat" }, { - "id": "qwen/deepseek-v4-flash-0731", - "name": "DeepSeek V4 Flash 0731 (Alibaba)", - "display_name": "DeepSeek V4 Flash 0731 (Alibaba)", + "id": "alibaba/qwen-3-30b", + "name": "Qwen3-30B-A3B", + "display_name": "Qwen3-30B-A3B", "modalities": { "input": [ "text" @@ -52073,8 +50673,8 @@ ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 40960, + "output": 16384 }, "temperature": true, "tool_call": true, @@ -52082,28 +50682,16 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "none", - "low", - "high", - "max" - ] - } - }, "attachment": false, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-07-31", - "last_updated": "2026-07-31", + "release_date": "2025-04-28", + "last_updated": "2025-04-28", "type": "chat" }, { - "id": "qwen/qwen-mt-plus", - "name": "Qwen MT Plus", - "display_name": "Qwen MT Plus", + "id": "alibaba/qwen3-embedding-0.6b", + "name": "Qwen3 Embedding 0.6B", + "display_name": "Qwen3 Embedding 0.6B", "modalities": { "input": [ "text" @@ -52113,36 +50701,35 @@ ] }, "limit": { - "context": 4096, + "context": 32768, "output": 8192 }, - "temperature": true, + "temperature": false, "tool_call": false, "reasoning": { "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2025-07-24", - "last_updated": "2025-07-24", - "type": "chat" + "open_weights": true, + "release_date": "2025-06-05", + "last_updated": "2025-06-05", + "type": "embedding" }, { - "id": "qwen/deepseek-v4.1-flash-1017", - "name": "DeepSeek V4.1 Flash 1017 (Alibaba)", - "display_name": "DeepSeek V4.1 Flash 1017 (Alibaba)", + "id": "alibaba/qwen-3-235b", + "name": "Qwen3 235B A22B Instruct 2507", + "display_name": "Qwen3 235B A22B Instruct 2507", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 262144, + "output": 16384 }, "temperature": true, "tool_call": true, @@ -52155,22 +50742,21 @@ "effort_options": [ "none", "low", - "high", - "max" + "medium", + "high" ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-10-17", - "last_updated": "2026-10-17", + "release_date": "2025-07-21", + "last_updated": "2025-07-21", "type": "chat" }, { - "id": "qwen/deepseek-v4.1-flash", - "name": "DeepSeek V4.1 Flash (Alibaba)", - "display_name": "DeepSeek V4.1 Flash (Alibaba)", + "id": "alibaba/qwen3.8-omni-flash", + "name": "Qwen 3.8 Omni Flash", + "display_name": "Qwen 3.8 Omni Flash", "modalities": { "input": [ "text", @@ -52182,7 +50768,7 @@ }, "limit": { "context": 1000000, - "output": 384000 + "output": 131072 }, "temperature": true, "tool_call": true, @@ -52192,39 +50778,35 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ "none", "low", - "high", - "max" + "medium", + "xhigh" ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-09-10", - "last_updated": "2026-09-10", + "open_weights": false, + "release_date": "2026-09-17", + "last_updated": "2026-09-17", "type": "chat" }, { - "id": "qwen/qwen3.8-max-0902", - "name": "Qwen3.8 Max 0902", - "display_name": "Qwen3.8 Max 0902", + "id": "alibaba/qwen3-next-80b-a3b-thinking", + "name": "Qwen3 Next 80B A3B Thinking", + "display_name": "Qwen3 Next 80B A3B Thinking", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, @@ -52234,24 +50816,53 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "xhigh" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-09", + "last_updated": "2025-09", + "type": "chat" + }, + { + "id": "alibaba/wan-v2.5-t2v-preview", + "name": "Wan v2.5 Text-to-Video Preview", + "display_name": "Wan v2.5 Text-to-Video Preview", + "modalities": { + "input": [ + "text", + "audio" + ], + "output": [ + "video" + ] + }, + "limit": { + "context": 8192, + "output": 8192 + }, + "temperature": false, + "tool_call": false, + "reasoning": { + "supported": false + }, "attachment": true, "open_weights": false, - "release_date": "2026-09-02", - "last_updated": "2026-09-02", - "type": "chat" + "release_date": "2025-09-24", + "last_updated": "2025-09-24" }, { - "id": "qwen/qwen3.8-2.4t-a95b", - "name": "Qwen3.8 2.4T A95B", - "display_name": "Qwen3.8 2.4T A95B", + "id": "alibaba/qwen3-coder", + "name": "Qwen3 Coder 480B A35B Instruct", + "display_name": "Qwen3 Coder 480B A35B Instruct", "modalities": { "input": [ "text" @@ -52261,8 +50872,8 @@ ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 262144, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -52270,73 +50881,79 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "low", - "medium", - "xhigh" - ] - } - }, "attachment": false, "open_weights": true, - "release_date": "2026-08-12", - "last_updated": "2026-08-12", + "knowledge": "2025-04", + "release_date": "2025-07-22", + "last_updated": "2025-07-22", "type": "chat" }, { - "id": "qwen/qwen3.8-flash", - "name": "Qwen3.8 Flash", - "display_name": "Qwen3.8 Flash", + "id": "alibaba/wan-v2.6-i2v", + "name": "Wan v2.6 Image-to-Video", + "display_name": "Wan v2.6 Image-to-Video", "modalities": { "input": [ "text", "image", - "video" + "audio" ], "output": [ - "text" + "video" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 8192, + "output": 8192 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "none", - "low", - "medium", - "xhigh" - ] - } + "supported": false }, "attachment": true, "open_weights": false, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", - "type": "chat" + "release_date": "2025-12-16", + "last_updated": "2025-12-16" }, { - "id": "qwen/qwen3.8-omni-flash", - "name": "Qwen3.8 Omni Flash", - "display_name": "Qwen3.8 Omni Flash", + "id": "alibaba/wan-v3.0-video", + "name": "Wan v3.0 Video", + "display_name": "Wan v3.0 Video", "modalities": { "input": [ "text", "image", - "audio", + "video", + "audio" + ], + "output": [ "video" + ] + }, + "limit": { + "context": 8192, + "output": 8192 + }, + "temperature": false, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": false, + "release_date": "2026-08-23", + "last_updated": "2026-08-23" + }, + { + "id": "alibaba/qwen3.5-flash", + "name": "Qwen 3.5 Flash", + "display_name": "Qwen 3.5 Flash", + "modalities": { + "input": [ + "text", + "image", + "pdf" ], "output": [ "text" @@ -52344,7 +50961,7 @@ }, "limit": { "context": 1000000, - "output": 131072 + "output": 64000 }, "temperature": true, "tool_call": true, @@ -52354,75 +50971,129 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ "none", + "minimal", "low", "medium", - "xhigh" + "high", + "xhigh", + "max" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-09-17", - "last_updated": "2026-09-17", + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" }, { - "id": "tencent/step-5-preview", - "name": "Step 5 Preview (Tencent)", - "display_name": "Step 5 Preview (Tencent)", + "id": "alibaba/wan-v2.6-i2v-flash", + "name": "Wan v2.6 Image-to-Video Flash", + "display_name": "Wan v2.6 Image-to-Video Flash", "modalities": { "input": [ "text", "image", - "video", "audio" ], + "output": [ + "video" + ] + }, + "limit": { + "context": 8192, + "output": 8192 + }, + "temperature": false, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": false, + "release_date": "2025-12-16", + "last_updated": "2025-12-16" + }, + { + "id": "alibaba/qwen3-embedding-8b", + "name": "Qwen3 Embedding 8B", + "display_name": "Qwen3 Embedding 8B", + "modalities": { + "input": [ + "text" + ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 1000000 + "context": 32768, + "output": 8192 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high" - ] - } + "attachment": false, + "open_weights": true, + "release_date": "2025-06-05", + "last_updated": "2025-06-05", + "type": "embedding" + }, + { + "id": "alibaba/wan-v2.7-t2v", + "name": "Wan v2.7 Text-to-Video", + "display_name": "Wan v2.7 Text-to-Video", + "modalities": { + "input": [ + "text", + "audio" + ], + "output": [ + "video" + ] + }, + "limit": { + "context": 8192, + "output": 8192 + }, + "temperature": false, + "tool_call": false, + "reasoning": { + "supported": false }, "attachment": true, - "open_weights": true, - "release_date": "2026-09-16", - "last_updated": "2026-09-20", - "type": "chat" + "open_weights": false, + "release_date": "2026-04-07", + "last_updated": "2026-04-07" }, { - "id": "tencent/hy3", - "name": "Hy3 (Tencent)", - "display_name": "Hy3 (Tencent)", + "id": "alibaba/qwen3.7-plus", + "name": "Qwen 3.7 Plus", + "display_name": "Qwen 3.7 Plus", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 128000 + "context": 1000000, + "output": 64000 }, "temperature": true, "tool_call": true, @@ -52435,32 +51106,39 @@ "supported": true, "effort_options": [ "none", + "minimal", "low", - "high" + "medium", + "high", + "xhigh", + "max" ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-07-06", - "last_updated": "2026-07-06", + "attachment": true, + "open_weights": false, + "knowledge": "2025-04", + "release_date": "2026-06-02", + "last_updated": "2026-06-02", "type": "chat" }, { - "id": "tencent/hy4-preview", - "name": "Hy4 preview (Tencent)", - "display_name": "Hy4 preview (Tencent)", + "id": "alibaba/qwen3.8-flash", + "name": "Qwen 3.8 Flash", + "display_name": "Qwen 3.8 Flash", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 64000 + "context": 991000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -52472,33 +51150,64 @@ "reasoning": { "supported": true, "effort_options": [ - "none", "low", - "high" + "medium", + "xhigh" ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-08-28", - "last_updated": "2026-08-28", + "attachment": true, + "open_weights": false, + "release_date": "2026-08-26", + "last_updated": "2026-08-26", "type": "chat" }, { - "id": "tencent/deepseek-v4-pro-0813", - "name": "DeepSeek V4 Pro 0813 (Tencent)", - "display_name": "DeepSeek V4 Pro 0813 (Tencent)", + "id": "alibaba/wan-v2.7-r2v", + "name": "Wan v2.7 Reference-to-Video", + "display_name": "Wan v2.7 Reference-to-Video", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio" + ], + "output": [ + "video" + ] + }, + "limit": { + "context": 8192, + "output": 8192 + }, + "temperature": false, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": false, + "release_date": "2026-04-07", + "last_updated": "2026-04-07" + }, + { + "id": "alibaba/qwen3.8-max-0902", + "name": "Qwen3.8 Max 0902", + "display_name": "Qwen3.8 Max 0902", + "modalities": { + "input": [ + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 991000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -52508,29 +51217,28 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ - "none", "low", - "high", - "max" + "medium", + "xhigh" ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-08-13", - "last_updated": "2026-08-22", + "attachment": true, + "open_weights": false, + "release_date": "2026-09-02", + "last_updated": "2026-09-02", "type": "chat" }, { - "id": "tencent/deepseek-v4.1-flash", - "name": "DeepSeek V4.1 Flash (Tencent)", - "display_name": "DeepSeek V4.1 Flash (Tencent)", + "id": "alibaba/qwen3.8-27b", + "name": "Qwen3.8 27B", + "display_name": "Qwen3.8 27B", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" @@ -52538,7 +51246,7 @@ }, "limit": { "context": 1000000, - "output": 384000 + "output": 131072 }, "temperature": true, "tool_call": true, @@ -52548,54 +51256,52 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ "none", "low", - "high", - "max" + "medium", + "xhigh" ] } }, "attachment": true, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-09-10", - "last_updated": "2026-09-10", + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "infomaniak/mistralai/Ministral-3-14B-Instruct-2512", - "name": "Ministral 3 14B (Infomaniak)", - "display_name": "Ministral 3 14B (Infomaniak)", + "id": "alibaba/wan-v2.6-r2v-flash", + "name": "Wan v2.6 Reference-to-Video Flash", + "display_name": "Wan v2.6 Reference-to-Video Flash", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ - "text" + "video" ] }, "limit": { - "context": 100000, - "output": 262144 + "context": 8192, + "output": 8192 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { "supported": false }, "attachment": true, - "open_weights": true, - "release_date": "2025-12-02", - "last_updated": "2025-12-02", - "type": "chat" + "open_weights": false, + "release_date": "2025-12-16", + "last_updated": "2025-12-16" }, { - "id": "deepseek/deepseek-chat", - "name": "DeepSeek Chat", - "display_name": "DeepSeek Chat", + "id": "alibaba/qwen3-embedding-4b", + "name": "Qwen3 Embedding 4B", + "display_name": "Qwen3 Embedding 4B", "modalities": { "input": [ "text" @@ -52605,29 +51311,29 @@ ] }, "limit": { - "context": 131072, - "output": 384000 + "context": 32768, + "output": 8192 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { "supported": false }, "attachment": false, "open_weights": true, - "knowledge": "2025-09", - "release_date": "2025-12-01", - "last_updated": "2026-02-28", - "type": "chat" + "release_date": "2025-06-05", + "last_updated": "2025-06-05", + "type": "embedding" }, { - "id": "deepseek/deepseek-v4-flash", - "name": "DeepSeek V4 Flash", - "display_name": "DeepSeek V4 Flash", + "id": "amazon/nova-2-lite", + "name": "Nova 2 Lite", + "display_name": "Nova 2 Lite", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" @@ -52635,47 +51341,35 @@ }, "limit": { "context": 1000000, - "output": 384000 + "output": 65535 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", "effort_options": [ + "none", "low", - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." + "medium", + "high" ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "open_weights": false, + "knowledge": "2025-10", + "release_date": "2025-12-02", + "last_updated": "2025-12-01", "type": "chat" }, { - "id": "deepseek/deepseek-v4-pro", - "name": "DeepSeek V4 Pro", - "display_name": "DeepSeek V4 Pro", + "id": "amazon/titan-embed-text-v2", + "name": "Titan Text Embeddings V2", + "display_name": "Titan Text Embeddings V2", "modalities": { "input": [ "text" @@ -52685,103 +51379,88 @@ ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 8192, + "output": 8192 + }, + "temperature": false, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": false, + "release_date": "2024-04-30", + "last_updated": "2024-04", + "type": "embedding" + }, + { + "id": "amazon/nova-micro", + "name": "Nova Micro", + "display_name": "Nova Micro", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 128000, + "output": 10000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." - ] - } + "supported": false }, "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "open_weights": false, + "knowledge": "2024-10", + "release_date": "2024-12-03", + "last_updated": "2024-12-03", "type": "chat" }, { - "id": "deepseek/deepseek-v4-flash-vision-exp", - "name": "DeepSeek V4 Flash Vision Exp", - "display_name": "DeepSeek V4 Flash Vision Exp", + "id": "amazon/nova-lite", + "name": "Nova Lite", + "display_name": "Nova Lite", "modalities": { "input": [ "text", - "image" + "image", + "video", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 300000, + "output": 10000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." - ] - } + "supported": false }, "attachment": true, - "open_weights": true, - "release_date": "2026-08-21", - "last_updated": "2026-09-01", + "open_weights": false, + "knowledge": "2024-10", + "release_date": "2024-12-03", + "last_updated": "2024-12-03", "type": "chat" }, { - "id": "anthropic/claude-haiku-5-5", - "name": "Claude Haiku 5.5", - "display_name": "Claude Haiku 5.5", + "id": "amazon/nova-pro", + "name": "Nova Pro", + "display_name": "Nova Pro", "modalities": { "input": [ "text", "image", + "video", "pdf" ], "output": [ @@ -52789,11 +51468,39 @@ ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 300000, + "output": 10000 }, - "temperature": false, + "temperature": true, "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": false, + "knowledge": "2024-10", + "release_date": "2024-12-03", + "last_updated": "2024-12-03", + "type": "chat" + }, + { + "id": "elorian/glimpse", + "name": "Glimpse", + "display_name": "Glimpse", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 220000, + "output": 4096 + }, + "tool_call": false, "reasoning": { "supported": true, "default": true @@ -52801,26 +51508,22 @@ "extra_capabilities": { "reasoning": { "effort_options": [ - "none", "low", "medium", - "high", - "xhigh", - "max" + "xhigh" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-10-07", - "last_updated": "2026-10-07", + "release_date": "2026-10-16", + "last_updated": "2026-10-16", "type": "chat" }, { - "id": "anthropic/claude-haiku-latest", - "name": "Claude Haiku Latest (Claude Haiku 5.5)", - "display_name": "Claude Haiku Latest (Claude Haiku 5.5)", + "id": "anthropic/claude-opus-5.5", + "name": "Claude Opus 5.5", + "display_name": "Claude Opus 5.5", "modalities": { "input": [ "text", @@ -52844,7 +51547,6 @@ "extra_capabilities": { "reasoning": { "effort_options": [ - "none", "low", "medium", "high", @@ -52856,14 +51558,14 @@ "attachment": true, "open_weights": false, "knowledge": "2026-06", - "release_date": "2026-10-07", - "last_updated": "2026-10-07", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "anthropic/claude-opus-4-7", - "name": "Claude Opus 4.7", - "display_name": "Claude Opus 4.7", + "id": "anthropic/claude-fable-5", + "name": "Claude Fable 5", + "display_name": "Claude Fable 5", "modalities": { "input": [ "text", @@ -52882,12 +51584,12 @@ "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, + "default_enabled": true, "mode": "effort", "effort": "high", "effort_options": [ @@ -52904,23 +51606,23 @@ "thinking_blocks" ], "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." + "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", + "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", + "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." ] } }, "attachment": true, "open_weights": false, "knowledge": "2026-01-31", - "release_date": "2026-04-16", - "last_updated": "2026-04-16", + "release_date": "2026-06-09", + "last_updated": "2026-06-09", "type": "chat" }, { - "id": "anthropic/claude-sonnet-5-5", - "name": "Claude Sonnet 5.5", - "display_name": "Claude Sonnet 5.5", + "id": "anthropic/claude-opus-4.6", + "name": "Claude Opus 4.6", + "display_name": "Claude Opus 4.6", "modalities": { "input": [ "text", @@ -52935,34 +51637,51 @@ "context": 1000000, "output": 128000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", "effort_options": [ "low", "medium", "high", - "xhigh", "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-09-28", - "last_updated": "2026-09-28", + "knowledge": "2025-05-31", + "release_date": "2026-02-05", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "anthropic/claude-fable-5-1", - "name": "Claude Fable 5.1", - "display_name": "Claude Fable 5.1", + "id": "anthropic/claude-haiku-4.5", + "name": "Claude Haiku 4.5", + "display_name": "Claude Haiku 4.5", "modalities": { "input": [ "text", @@ -52974,52 +51693,47 @@ ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 200000, + "output": 64000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, "interleaved": true, "summaries": true, - "visibility": "omitted", + "visibility": "summary", "continuation": [ "thinking_blocks" ], "notes": [ - "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", - "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", - "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-09-01", - "last_updated": "2026-09-01", + "knowledge": "2025-02-28", + "release_date": "2025-10-15", + "last_updated": "2025-10-15", "type": "chat" }, { - "id": "anthropic/claude-sonnet-5", - "name": "Claude Sonnet 5", - "display_name": "Claude Sonnet 5", + "id": "anthropic/claude-opus-4.8", + "name": "Claude Opus 4.8", + "display_name": "Claude Opus 4.8", "modalities": { "input": [ "text", @@ -53034,36 +51748,49 @@ "context": 1000000, "output": 128000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "high", "effort_options": [ - "none", "low", "medium", "high", "xhigh", "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-30", - "last_updated": "2026-06-30", + "knowledge": "2026-01", + "release_date": "2026-05-28", + "last_updated": "2026-05-28", "type": "chat" }, { - "id": "anthropic/claude-opus-5-5", - "name": "Claude Opus 5.5", - "display_name": "Claude Opus 5.5", + "id": "anthropic/claude-haiku-5.5", + "name": "Claude Haiku 5.5", + "display_name": "Claude Haiku 5.5", "modalities": { "input": [ "text", @@ -53087,6 +51814,7 @@ "extra_capabilities": { "reasoning": { "effort_options": [ + "none", "low", "medium", "high", @@ -53098,14 +51826,14 @@ "attachment": true, "open_weights": false, "knowledge": "2026-06", - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "release_date": "2026-10-07", + "last_updated": "2026-10-07", "type": "chat" }, { - "id": "anthropic/claude-opus-4-5", - "name": "Claude Opus 4.5 (latest)", - "display_name": "Claude Opus 4.5 (latest)", + "id": "anthropic/claude-opus-4.7", + "name": "Claude Opus 4.7", + "display_name": "Claude Opus 4.7", "modalities": { "input": [ "text", @@ -53117,8 +51845,8 @@ ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 1000000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -53130,40 +51858,39 @@ "reasoning": { "supported": true, "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, + "mode": "effort", "effort": "high", "effort_options": [ "low", "medium", - "high" + "high", + "xhigh", + "max" ], "interleaved": true, "summaries": true, - "visibility": "summary", + "visibility": "omitted", "continuation": [ "thinking_blocks" ], "notes": [ - "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-05", - "release_date": "2025-11-24", - "last_updated": "2025-11-24", + "knowledge": "2026-01-31", + "release_date": "2026-04-16", + "last_updated": "2026-04-16", "type": "chat" }, { - "id": "anthropic/claude-fable-latest", - "name": "Claude Fable Latest (Claude Fable 5.1)", - "display_name": "Claude Fable Latest (Claude Fable 5.1)", + "id": "anthropic/claude-sonnet-4.6", + "name": "Claude Sonnet 4.6", + "display_name": "Claude Sonnet 4.6", "modalities": { "input": [ "text", @@ -53178,49 +51905,51 @@ "context": 1000000, "output": 128000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, "effort": "high", "effort_options": [ "low", "medium", "high", - "xhigh", "max" ], "interleaved": true, "summaries": true, - "visibility": "omitted", + "visibility": "summary", "continuation": [ "thinking_blocks" ], "notes": [ - "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", - "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", - "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-09-01", - "last_updated": "2026-09-01", + "knowledge": "2025-08-31", + "release_date": "2026-02-17", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "anthropic/claude-opus-latest", - "name": "Claude Opus Latest (Claude Opus 5.5)", - "display_name": "Claude Opus Latest (Claude Opus 5.5)", + "id": "anthropic/claude-opus-5", + "name": "Claude Opus 5", + "display_name": "Claude Opus 5", "modalities": { "input": [ "text", @@ -53243,7 +51972,9 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ + "none", "low", "medium", "high", @@ -53254,15 +51985,15 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "knowledge": "2026-05", + "release_date": "2026-07-24", + "last_updated": "2026-07-24", "type": "chat" }, { - "id": "anthropic/claude-opus-5", - "name": "Claude Opus 5", - "display_name": "Claude Opus 5", + "id": "anthropic/claude-opus-5-fast", + "name": "Claude Opus 5 (Fast)", + "display_name": "Claude Opus 5 (Fast)", "modalities": { "input": [ "text", @@ -53285,8 +52016,8 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ + "none", "low", "medium", "high", @@ -53303,9 +52034,9 @@ "type": "chat" }, { - "id": "anthropic/claude-sonnet-4-6", - "name": "Claude Sonnet 4.6", - "display_name": "Claude Sonnet 4.6", + "id": "anthropic/claude-sonnet-5", + "name": "Claude Sonnet 5", + "display_name": "Claude Sonnet 5", "modalities": { "input": [ "text", @@ -53318,53 +52049,38 @@ }, "limit": { "context": 1000000, - "output": 64000 + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", "effort_options": [ + "none", "low", "medium", "high", + "xhigh", "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-17", - "last_updated": "2026-03-13", + "knowledge": "2026-01-31", + "release_date": "2026-06-30", + "last_updated": "2026-06-30", "type": "chat" }, { - "id": "anthropic/claude-opus-4-5-20251101", - "name": "Claude Opus 4.5", - "display_name": "Claude Opus 4.5", + "id": "anthropic/claude-opus-4.8-fast", + "name": "Claude Opus 4.8 (Fast)", + "display_name": "Claude Opus 4.8 (Fast)", "modalities": { "input": [ "text", @@ -53376,8 +52092,8 @@ ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 1000000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -53389,40 +52105,39 @@ "reasoning": { "supported": true, "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, + "mode": "effort", "effort": "high", "effort_options": [ "low", "medium", - "high" + "high", + "xhigh", + "max" ], "interleaved": true, "summaries": true, - "visibility": "summary", + "visibility": "omitted", "continuation": [ "thinking_blocks" ], "notes": [ - "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-05", - "release_date": "2025-11-24", - "last_updated": "2025-11-24", + "knowledge": "2026-01", + "release_date": "2026-05-28", + "last_updated": "2026-05-28", "type": "chat" }, { - "id": "anthropic/claude-opus-4-6", - "name": "Claude Opus 4.6", - "display_name": "Claude Opus 4.6", + "id": "anthropic/claude-sonnet-5.5", + "name": "Claude Sonnet 5.5", + "display_name": "Claude Sonnet 5.5", "modalities": { "input": [ "text", @@ -53437,51 +52152,34 @@ "context": 1000000, "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", "effort_options": [ "low", "medium", "high", + "xhigh", "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-05-31", - "release_date": "2026-02-05", - "last_updated": "2026-03-13", + "knowledge": "2026-06", + "release_date": "2026-09-28", + "last_updated": "2026-09-28", "type": "chat" }, { - "id": "anthropic/claude-opus-4-8", - "name": "Claude Opus 4.8", - "display_name": "Claude Opus 4.8", + "id": "anthropic/claude-fable-5.1", + "name": "Claude Fable 5.1", + "display_name": "Claude Fable 5.1", "modalities": { "input": [ "text", @@ -53500,12 +52198,12 @@ "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, + "default_enabled": true, "mode": "effort", "effort": "high", "effort_options": [ @@ -53522,23 +52220,23 @@ "thinking_blocks" ], "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." + "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", + "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", + "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-01", - "release_date": "2026-05-28", - "last_updated": "2026-05-28", + "knowledge": "2026-06", + "release_date": "2026-09-01", + "last_updated": "2026-09-01", "type": "chat" }, { - "id": "anthropic/claude-sonnet-latest", - "name": "Claude Sonnet Latest (Claude Sonnet 5.5)", - "display_name": "Claude Sonnet Latest (Claude Sonnet 5.5)", + "id": "anthropic/claude-opus-5.5-fast", + "name": "Claude Opus 5.5 (Fast)", + "display_name": "Claude Opus 5.5 (Fast)", "modalities": { "input": [ "text", @@ -53573,14 +52271,14 @@ "attachment": true, "open_weights": false, "knowledge": "2026-06", - "release_date": "2026-09-28", - "last_updated": "2026-09-28", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "anthropic/claude-fable-5", - "name": "Claude Fable 5", - "display_name": "Claude Fable 5", + "id": "anthropic/claude-opus-4.5", + "name": "Claude Opus 4.5", + "display_name": "Claude Opus 4.5", "modalities": { "input": [ "text", @@ -53592,115 +52290,132 @@ ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 200000, + "output": 64000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, "effort": "high", "effort_options": [ "low", "medium", - "high", - "xhigh", - "max" + "high" ], "interleaved": true, "summaries": true, - "visibility": "omitted", + "visibility": "summary", "continuation": [ "thinking_blocks" ], "notes": [ - "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", - "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", - "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." + "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-09", - "last_updated": "2026-06-09", + "knowledge": "2025-05", + "release_date": "2025-11-24", + "last_updated": "2025-11-24", "type": "chat" }, { - "id": "zai/glm-5.1", - "name": "GLM-5.1", - "display_name": "GLM-5.1", + "id": "anthropic/claude-sonnet-4.5", + "name": "Claude Sonnet 4.5", + "display_name": "Claude Sonnet 4.5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 202752, - "output": 131072 + "context": 1000000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-04-07", - "last_updated": "2026-04-07", + "attachment": true, + "open_weights": false, + "knowledge": "2025-07-31", + "release_date": "2025-09-29", + "last_updated": "2025-09-29", "type": "chat" }, { - "id": "zai/glm-5v-turbo", - "name": "GLM-5V-Turbo", - "display_name": "GLM-5V-Turbo", + "id": "minimax/minimax-h3", + "name": "MiniMax H3", + "display_name": "MiniMax H3", "modalities": { "input": [ - "image", "text", - "video" + "image" ], "output": [ - "text" + "video" ] }, "limit": { - "context": 202752, - "output": 131072 + "context": 8192, + "output": 8192 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": true, - "open_weights": false, - "release_date": "2026-04-01", - "last_updated": "2026-04-01", - "type": "chat" + "open_weights": true, + "release_date": "2026-07-31", + "last_updated": "2026-10-04" }, { - "id": "zai/glm-5", - "name": "GLM-5", - "display_name": "GLM-5", + "id": "minimax/minimax-m2.7", + "name": "Minimax M2.7", + "display_name": "Minimax M2.7", "modalities": { "input": [ "text" @@ -53710,8 +52425,8 @@ ] }, "limit": { - "context": 202752, - "output": 131072 + "context": 204800, + "output": 131000 }, "temperature": true, "tool_call": true, @@ -53732,48 +52447,14 @@ }, "attachment": false, "open_weights": true, - "release_date": "2026-02-12", - "last_updated": "2026-02-12", + "release_date": "2026-03-18", + "last_updated": "2026-03-18", "type": "chat" }, { - "id": "zai/glm-4.6", - "name": "GLM-4.6", - "display_name": "GLM-4.6", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 202752, - "output": 131072 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-09-30", - "last_updated": "2025-09-30", - "type": "chat" - }, - { - "id": "zai/glm-5.3", - "name": "GLM-5.3", - "display_name": "GLM-5.3", + "id": "minimax/minimax-m2.7-highspeed", + "name": "MiniMax M2.7 High Speed", + "display_name": "MiniMax M2.7 High Speed", "modalities": { "input": [ "text" @@ -53783,8 +52464,8 @@ ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 204800, + "output": 131100 }, "temperature": true, "tool_call": true, @@ -53795,65 +52476,37 @@ "extra_capabilities": { "reasoning": { "supported": true, - "effort_options": [ - "low", - "high", - "max" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, "attachment": false, "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "release_date": "2026-03-18", + "last_updated": "2026-03-18", "type": "chat" }, { - "id": "zai/glm-4.6v", - "name": "GLM-4.6V", - "display_name": "GLM-4.6V", + "id": "minimax/minimax-m3", + "name": "MiniMax M3", + "display_name": "MiniMax M3", "modalities": { "input": [ "text", "image", - "video" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 131072, - "output": 32768 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "attachment": true, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-12-08", - "last_updated": "2025-12-08", - "type": "chat" - }, - { - "id": "zai/glm-5.2", - "name": "GLM-5.2", - "display_name": "GLM-5.2", - "modalities": { - "input": [ - "text" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 512000, + "output": 512000 }, "temperature": true, "tool_call": true, @@ -53863,29 +52516,23 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "effort_options": [ - "none", - "high", - "max" - ] + "supported": true } }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "release_date": "2026-06-01", + "last_updated": "2026-06-01", "type": "chat" }, { - "id": "zai/glm-5.3-flash", - "name": "GLM-5.3-Flash", - "display_name": "GLM-5.3-Flash", + "id": "minimax/minimax-m3.1-flash", + "name": "MiniMax-M3.1-Flash", + "display_name": "MiniMax-M3.1-Flash", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" @@ -53893,7 +52540,7 @@ }, "limit": { "context": 1048576, - "output": 131072 + "output": 1048576 }, "temperature": true, "tool_call": true, @@ -53903,24 +52550,25 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ "low", + "medium", "high", + "xhigh", "max" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", + "open_weights": false, + "release_date": "2026-10-19", + "last_updated": "2026-10-19", "type": "chat" }, { - "id": "zai/glm-5-turbo", - "name": "GLM-5-Turbo", - "display_name": "GLM-5-Turbo", + "id": "minimax/minimax-m2.1-lightning", + "name": "MiniMax M2.1 Lightning", + "display_name": "MiniMax M2.1 Lightning", "modalities": { "input": [ "text" @@ -53930,7 +52578,7 @@ ] }, "limit": { - "context": 202752, + "context": 204800, "output": 131072 }, "temperature": true, @@ -53939,21 +52587,17 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, "attachment": false, "open_weights": false, - "release_date": "2026-03-16", - "last_updated": "2026-03-16", + "knowledge": "2024-10", + "release_date": "2025-12-23", + "last_updated": "2025-10-27", "type": "chat" }, { - "id": "zai/glm-4.7", - "name": "GLM-4.7", - "display_name": "GLM-4.7", + "id": "minimax/minimax-m2.5", + "name": "MiniMax M2.5", + "display_name": "MiniMax M2.5", "modalities": { "input": [ "text" @@ -53963,8 +52607,8 @@ ] }, "limit": { - "context": 202752, - "output": 131072 + "context": 204800, + "output": 131000 }, "temperature": true, "tool_call": true, @@ -53974,53 +52618,46 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, "attachment": false, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-12-22", - "last_updated": "2025-12-22", + "release_date": "2026-02-12", + "last_updated": "2026-02-12", "type": "chat" }, { - "id": "nebius/Qwen/Qwen3-30B-A3B-Instruct-2507", - "name": "Qwen3 30B-A3B Instruct 2507 (Nebius)", - "display_name": "Qwen3 30B-A3B Instruct 2507 (Nebius)", + "id": "minimax/minimax-h3-max", + "name": "MiniMax H3 Max", + "display_name": "MiniMax H3 Max", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ - "text" + "video" ] }, "limit": { - "context": 262144, - "output": 16384 + "context": 8192, + "output": 8192 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { "supported": false }, - "attachment": false, - "open_weights": true, - "release_date": "2025-07-28", - "last_updated": "2025-07-28", - "type": "chat" + "attachment": true, + "open_weights": false, + "release_date": "2026-08-26", + "last_updated": "2026-08-26" }, { - "id": "nebius/Qwen/Qwen3-235B-A22B-Instruct-2507", - "name": "Qwen3 235B-A22B Instruct 2507 (Nebius)", - "display_name": "Qwen3 235B-A22B Instruct 2507 (Nebius)", + "id": "minimax/minimax-m2.5-highspeed", + "name": "MiniMax M2.5 High Speed", + "display_name": "MiniMax M2.5 High Speed", "modalities": { "input": [ "text" @@ -54030,24 +52667,30 @@ ] }, "limit": { - "context": 262144, - "output": 16384 + "context": 204800, + "output": 131000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": false, "open_weights": true, - "release_date": "2025-07-21", - "last_updated": "2025-07-21", + "release_date": "2026-02-13", + "last_updated": "2026-02-13", "type": "chat" }, { - "id": "nebius/nvidia/Nemotron-3-Ultra-550b-a55b", - "name": "Nemotron 3 Ultra 550B A55B (Nebius)", - "display_name": "Nemotron 3 Ultra 550B A55B (Nebius)", + "id": "minimax/minimax-m2.1", + "name": "MiniMax M2.1", + "display_name": "MiniMax M2.1", "modalities": { "input": [ "text" @@ -54057,8 +52700,8 @@ ] }, "limit": { - "context": 1048576, - "output": 128000 + "context": 204800, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -54069,24 +52712,19 @@ "extra_capabilities": { "reasoning": { "supported": true, - "effort_options": [ - "none", - "medium", - "high" - ] + "interleaved": true } }, "attachment": false, "open_weights": true, - "knowledge": "2025-09", - "release_date": "2026-06-04", - "last_updated": "2026-06-04", + "release_date": "2025-12-23", + "last_updated": "2025-12-23", "type": "chat" }, { - "id": "nebius/nvidia/nemotron-3-super-120b-a12b", - "name": "Nemotron 3 Super 120B A12B (Nebius)", - "display_name": "Nemotron 3 Super 120B A12B (Nebius)", + "id": "minimax/minimax-m2", + "name": "MiniMax M2", + "display_name": "MiniMax M2", "modalities": { "input": [ "text" @@ -54096,8 +52734,8 @@ ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 205000, + "output": 196608 }, "temperature": true, "tool_call": true, @@ -54107,497 +52745,370 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "none", - "low", - "medium" - ] + "supported": true, + "interleaved": true } }, "attachment": false, "open_weights": true, - "knowledge": "2025-06", - "release_date": "2026-03-11", - "last_updated": "2026-03-11", + "release_date": "2025-10-27", + "last_updated": "2025-10-27", "type": "chat" }, { - "id": "nebius/google/gemma-3-27b-it", - "name": "Gemma 3 27B IT (Nebius)", - "display_name": "Gemma 3 27B IT (Nebius)", + "id": "bfl/flux-2-klein-9b", + "name": "FLUX.2 [klein] 9B", + "display_name": "FLUX.2 [klein] 9B", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ - "text" + "image" ] }, "limit": { - "context": 110000, - "output": 131072 + "context": 8192, + "output": 8192 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { "supported": false }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-08", - "release_date": "2025-03-12", - "last_updated": "2025-03-12", - "type": "chat" + "attachment": true, + "open_weights": false, + "release_date": "2026-01-15", + "last_updated": "2026-06-08" }, { - "id": "nebius/meta-models/muse-spark-open", - "name": "Muse Spark Open (Nebius)", - "display_name": "Muse Spark Open (Nebius)", + "id": "bfl/flux-2-pro", + "name": "FLUX.2 [pro]", + "display_name": "FLUX.2 [pro]", "modalities": { "input": [ "text", "image" ], "output": [ - "text" + "image" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 67300, + "output": 67300 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ] - } + "supported": false }, "attachment": true, - "open_weights": true, - "knowledge": "2026-01-04", - "release_date": "2026-10-15", - "last_updated": "2026-10-15", - "type": "chat" + "open_weights": false, + "release_date": "2025-11-25", + "last_updated": "2026-06-08" }, { - "id": "nebius/openai/gpt-oss-120b", - "name": "GPT OSS 120B (Nebius)", - "display_name": "GPT OSS 120B (Nebius)", + "id": "bfl/flux-3-image-klein", + "name": "FLUX 3 Image Klein", + "display_name": "FLUX 3 Image Klein", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ - "text" + "image" ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 8192, + "output": 8192 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "low", - "medium", - "high" - ] - } + "supported": false }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", - "type": "chat" + "attachment": true, + "open_weights": false, + "release_date": "2026-10-15", + "last_updated": "2026-10-15" }, { - "id": "nebius/deepseek-ai/DeepSeek-V4-Pro-0813", - "name": "DeepSeek V4 Pro 0813 (Nebius)", - "display_name": "DeepSeek V4 Pro 0813 (Nebius)", + "id": "bfl/flux-kontext-max", + "name": "FLUX.1 Kontext Max", + "display_name": "FLUX.1 Kontext Max", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ - "text" + "image" ] }, "limit": { - "context": 979000, - "output": 384000 + "context": 512, + "output": 8192 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "none", - "low", - "high", - "max" - ] - } + "supported": false }, - "attachment": false, - "open_weights": true, - "release_date": "2026-08-13", - "last_updated": "2026-08-22", - "type": "chat" + "attachment": true, + "open_weights": false, + "release_date": "2025-05-29", + "last_updated": "2025-06" }, { - "id": "nebius/deepseek-ai/DeepSeek-V4-Flash-0731", - "name": "DeepSeek V4 Flash 0731 (Nebius)", - "display_name": "DeepSeek V4 Flash 0731 (Nebius)", + "id": "bfl/flux-2-max", + "name": "FLUX.2 [max]", + "display_name": "FLUX.2 [max]", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ - "text" + "image" ] }, "limit": { - "context": 1024000, - "output": 384000 + "context": 67300, + "output": 67300 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "none", - "low", - "high", - "max" - ] - } + "supported": false }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-07-31", - "last_updated": "2026-07-31", - "type": "chat" + "attachment": true, + "open_weights": false, + "release_date": "2025-12-16", + "last_updated": "2026-06-08" }, { - "id": "nebius/deepseek-ai/DeepSeek-V4.1-Flash-1017", - "name": "DeepSeek V4.1 Flash 1017 (Nebius)", - "display_name": "DeepSeek V4.1 Flash 1017 (Nebius)", + "id": "bfl/flux-2-klein-4b", + "name": "FLUX.2 [klein] 4B", + "display_name": "FLUX.2 [klein] 4B", "modalities": { "input": [ "text", "image" ], "output": [ - "text" + "image" ] }, "limit": { - "context": 1048576, - "output": 384000 + "context": 8192, + "output": 8192 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "low", - "high", - "max" - ] - } + "supported": false }, "attachment": true, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-10-17", - "last_updated": "2026-10-17", - "type": "chat" + "open_weights": false, + "release_date": "2026-01-15", + "last_updated": "2026-06-08" }, { - "id": "nebius/deepseek-ai/DeepSeek-V4.1-Flash", - "name": "DeepSeek V4.1 Flash (Nebius)", - "display_name": "DeepSeek V4.1 Flash (Nebius)", + "id": "bfl/flux-3-video", + "name": "Flux 3", + "display_name": "Flux 3", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ - "text" + "video" ] }, "limit": { - "context": 1048000, - "output": 384000 + "context": 8192, + "output": 8192 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "none", - "low", - "high", - "max" - ] - } + "supported": false }, "attachment": true, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-09-10", - "last_updated": "2026-09-10", - "type": "chat" + "open_weights": false, + "release_date": "2026-08-04", + "last_updated": "2026-08-04" }, { - "id": "perplexityai/sonar-reasoning-pro", - "name": "Sonar Reasoning Pro", - "display_name": "Sonar Reasoning Pro", + "id": "bfl/flux-pro-1.1-ultra", + "name": "FLUX1.1 [pro] Ultra", + "display_name": "FLUX1.1 [pro] Ultra", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ - "text" + "image" ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 512, + "output": 8192 }, - "temperature": true, + "temperature": false, "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "minimal", - "low", - "medium", - "high" - ] - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-09-01", - "release_date": "2024-01-01", - "last_updated": "2025-09-01", - "type": "chat" + "release_date": "2024-11-01", + "last_updated": "2024-11" }, { - "id": "perplexityai/sonar-deep-research", - "name": "Sonar Deep Research", - "display_name": "Sonar Deep Research", + "id": "bfl/flux-2-flex", + "name": "FLUX.2 [flex]", + "display_name": "FLUX.2 [flex]", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ - "text" + "image" ] }, "limit": { - "context": 128000, - "output": 32768 + "context": 8192, + "output": 8192 }, "temperature": false, "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "minimal", - "low", - "medium", - "high" - ] - } + "supported": false }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-02-01", - "last_updated": "2025-09-01", - "type": "chat" + "release_date": "2025-11-25", + "last_updated": "2026-06-08" }, { - "id": "perplexityai/sonar-pro", - "name": "Sonar Pro", - "display_name": "Sonar Pro", + "id": "bfl/flux-pro-1.0-fill", + "name": "FLUX.1 Fill [pro]", + "display_name": "FLUX.1 Fill [pro]", "modalities": { "input": [ "text", "image" ], "output": [ - "text" + "image" ] }, "limit": { - "context": 200000, + "context": 512, "output": 8192 }, - "temperature": true, + "temperature": false, "tool_call": false, "reasoning": { "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2025-09-01", - "release_date": "2024-01-01", - "last_updated": "2025-09-01", - "type": "chat" + "release_date": "2024-10-01", + "last_updated": "2024-10" }, { - "id": "perplexityai/sonar", - "name": "Sonar", - "display_name": "Sonar", + "id": "bfl/flux-3-image", + "name": "FLUX 3 Image", + "display_name": "FLUX 3 Image", "modalities": { "input": [ "text", "image" ], "output": [ - "text" + "image" ] }, "limit": { - "context": 127072, - "output": 4096 + "context": 8192, + "output": 8192 }, - "temperature": true, + "temperature": false, "tool_call": false, "reasoning": { "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2025-09-01", - "release_date": "2024-01-01", - "last_updated": "2025-09-01", - "type": "chat" + "release_date": "2026-10-05", + "last_updated": "2026-10-05" }, { - "id": "databricks/databricks-inkling", - "name": "Inkling (Databricks)", - "display_name": "Inkling (Databricks)", + "id": "bfl/flux-kontext-pro", + "name": "FLUX.1 Kontext Pro", + "display_name": "FLUX.1 Kontext Pro", "modalities": { "input": [ "text", "image" ], "output": [ - "text" + "image" ] }, "limit": { - "context": 1000000, - "output": 1048576 + "context": 512, + "output": 8192 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "minimal", - "low", - "medium", - "high", - "max" - ] - } + "supported": false }, "attachment": true, - "open_weights": true, - "release_date": "2026-07-15", - "last_updated": "2026-07-15", - "type": "chat" + "open_weights": false, + "release_date": "2025-05-29", + "last_updated": "2025-06" }, { - "id": "databricks/databricks-qwen3-next-80b-a3b-instruct", - "name": "Qwen3-Next 80B-A3B Instruct (Databricks)", - "display_name": "Qwen3-Next 80B-A3B Instruct (Databricks)", + "id": "bfl/flux-pro-1.1", + "name": "FLUX1.1 [pro]", + "display_name": "FLUX1.1 [pro]", "modalities": { "input": [ "text" ], "output": [ - "text" + "image" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 512, + "output": 8192 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { "supported": false }, "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-09", - "last_updated": "2025-09", - "type": "chat" + "open_weights": false, + "release_date": "2024-10-02", + "last_updated": "2024-10" }, { - "id": "databricks/databricks-gpt-oss-20b", - "name": "GPT OSS 20B (Databricks)", - "display_name": "GPT OSS 20B (Databricks)", + "id": "cohere/rerank-v5-fast", + "name": "Cohere Rerank 5 Fast", + "display_name": "Cohere Rerank 5 Fast", "modalities": { "input": [ "text" @@ -54607,35 +53118,23 @@ ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 32768, + "output": 8192 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high" - ] - } + "supported": false }, "attachment": false, - "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", - "type": "chat" + "open_weights": false, + "release_date": "2026-10-21", + "last_updated": "2026-10-21" }, { - "id": "databricks/databricks-deepseek-v4-pro-0813", - "name": "DeepSeek V4 Pro 0813 (Databricks)", - "display_name": "DeepSeek V4 Pro 0813 (Databricks)", + "id": "cohere/embed-v5.0-fast", + "name": "Embed 5 Fast", + "display_name": "Embed 5 Fast", "modalities": { "input": [ "text" @@ -54645,35 +53144,24 @@ ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 128000, + "output": 2048 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "low", - "high", - "max" - ] - } + "supported": false }, "attachment": false, - "open_weights": true, - "release_date": "2026-08-13", - "last_updated": "2026-08-22", - "type": "chat" + "open_weights": false, + "release_date": "2026-09-30", + "last_updated": "2026-09-30", + "type": "embedding" }, { - "id": "databricks/databricks-deepseek-v4-flash-0731", - "name": "DeepSeek V4 Flash 0731 (Databricks)", - "display_name": "DeepSeek V4 Flash 0731 (Databricks)", + "id": "cohere/rerank-v4-pro", + "name": "Cohere Rerank 4 Pro", + "display_name": "Cohere Rerank 4 Pro", "modalities": { "input": [ "text" @@ -54683,36 +53171,23 @@ ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 32000, + "output": 8192 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "low", - "high", - "max" - ] - } + "supported": false }, "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-07-31", - "last_updated": "2026-07-31", - "type": "chat" + "open_weights": false, + "release_date": "2025-12-11", + "last_updated": "2025-12-11" }, { - "id": "databricks/databricks-gpt-oss-120b", - "name": "GPT OSS 120B (Databricks)", - "display_name": "GPT OSS 120B (Databricks)", + "id": "cohere/rerank-v5-pro", + "name": "Cohere Rerank 5 Pro", + "display_name": "Cohere Rerank 5 Pro", "modalities": { "input": [ "text" @@ -54722,35 +53197,23 @@ ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 32768, + "output": 8192 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high" - ] - } + "supported": false }, "attachment": false, - "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", - "type": "chat" + "open_weights": false, + "release_date": "2026-10-21", + "last_updated": "2026-10-21" }, { - "id": "amazon/amazon.nova-micro-v1:0", - "name": "Nova Micro", - "display_name": "Nova Micro", + "id": "cohere/rerank-v3.5", + "name": "Cohere Rerank 3.5", + "display_name": "Cohere Rerank 3.5", "modalities": { "input": [ "text" @@ -54760,25 +53223,23 @@ ] }, "limit": { - "context": 128000, - "output": 10000 + "context": 4096, + "output": 8192 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { "supported": false }, "attachment": false, "open_weights": false, - "knowledge": "2024-10", - "release_date": "2024-12-03", - "last_updated": "2024-12-03", - "type": "chat" + "release_date": "2024-12-02", + "last_updated": "2024-12-02" }, { - "id": "amazon/qwen.qwen3-coder-next", - "name": "Qwen3 Coder Next (Amazon Bedrock)", - "display_name": "Qwen3 Coder Next (Amazon Bedrock)", + "id": "cohere/embed-v5.0-pro", + "name": "Embed 5 Pro", + "display_name": "Embed 5 Pro", "modalities": { "input": [ "text" @@ -54788,25 +53249,24 @@ ] }, "limit": { - "context": 256000, - "output": 65536 + "context": 128000, + "output": 2048 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { "supported": false }, "attachment": false, - "open_weights": true, - "knowledge": "2025-09", - "release_date": "2026-02-03", - "last_updated": "2026-02-03", - "type": "chat" + "open_weights": false, + "release_date": "2026-09-30", + "last_updated": "2026-09-30", + "type": "embedding" }, { - "id": "amazon/moonshot.kimi-k2-thinking", - "name": "Kimi K2 Thinking (Amazon Bedrock)", - "display_name": "Kimi K2 Thinking (Amazon Bedrock)", + "id": "cohere/embed-v4.0", + "name": "Embed v4.0", + "display_name": "Embed v4.0", "modalities": { "input": [ "text" @@ -54816,26 +53276,24 @@ ] }, "limit": { - "context": 256000, - "output": 262144 + "context": 128000, + "output": 1536 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, - "open_weights": true, - "knowledge": "2024-08", - "release_date": "2025-11-06", - "last_updated": "2025-11-06", - "type": "chat" + "open_weights": false, + "release_date": "2025-04-15", + "last_updated": "2025-04-15", + "type": "embedding" }, { - "id": "amazon/openai.gpt-oss-safeguard-20b", - "name": "GPT OSS Safeguard 20B (Amazon Bedrock)", - "display_name": "GPT OSS Safeguard 20B (Amazon Bedrock)", + "id": "cohere/command-a", + "name": "Command A", + "display_name": "Command A", "modalities": { "input": [ "text" @@ -54845,98 +53303,103 @@ ] }, "limit": { - "context": 128000, - "output": 131072 + "context": 256000, + "output": 8000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high" - ] - } + "supported": false }, "attachment": false, "open_weights": true, - "release_date": "2025-10-29", - "last_updated": "2025-10-29", + "knowledge": "2024-08-31", + "release_date": "2025-03-13", + "last_updated": "2025-03-13", "type": "chat" }, { - "id": "amazon/moonshotai.kimi-k2.5", - "name": "Kimi K2.5 (Amazon Bedrock)", - "display_name": "Kimi K2.5 (Amazon Bedrock)", + "id": "cohere/rerank-v4-fast", + "name": "Cohere Rerank 4 Fast", + "display_name": "Cohere Rerank 4 Fast", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 32000, + "output": 8192 }, "temperature": false, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-01-27", - "last_updated": "2026-01-27", - "type": "chat" + "attachment": false, + "open_weights": false, + "release_date": "2025-12-11", + "last_updated": "2025-12-11" }, { - "id": "amazon/google.gemma-3-12b-it", - "name": "Gemma 3 12B IT (Amazon Bedrock)", - "display_name": "Gemma 3 12B IT (Amazon Bedrock)", + "id": "google/gemini-3.1-pro-preview", + "name": "Gemini 3.1 Pro Preview", + "display_name": "Gemini 3.1 Pro Preview", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 131072 + "context": 1000000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "low", + "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] + } }, "attachment": true, - "open_weights": true, - "knowledge": "2024-08", - "release_date": "2025-03-12", - "last_updated": "2025-03-12", + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2026-02-19", + "last_updated": "2026-02-19", "type": "chat" }, { - "id": "amazon/amazon.nova-pro-v1:0", - "name": "Nova Pro", - "display_name": "Nova Pro", + "id": "google/gemini-3-flash", + "name": "Gemini 3 Flash", + "display_name": "Gemini 3 Flash", "modalities": { "input": [ "text", "image", - "video", "pdf" ], "output": [ @@ -54944,94 +53407,86 @@ ] }, "limit": { - "context": 300000, - "output": 10000 + "context": 1000000, + "output": 65000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-10", - "release_date": "2024-12-03", - "last_updated": "2024-12-03", - "type": "chat" - }, - { - "id": "amazon/google.gemma-3-4b-it", - "name": "Gemma 3 4B IT (Amazon Bedrock)", - "display_name": "Gemma 3 4B IT (Amazon Bedrock)", - "modalities": { - "input": [ - "text", - "image" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 128000, - "output": 131072 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", + "low", + "medium", + "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] + } }, "attachment": true, - "open_weights": true, - "knowledge": "2024-08", - "release_date": "2025-03-12", - "last_updated": "2025-03-12", + "open_weights": false, + "knowledge": "2025-03", + "release_date": "2025-12-17", + "last_updated": "2025-12-17", "type": "chat" }, { - "id": "amazon/google.gemma-3-27b-it", - "name": "Gemma 3 27B IT (Amazon Bedrock)", - "display_name": "Gemma 3 27B IT (Amazon Bedrock)", + "id": "google/veo-3.1-fast-generate-001", + "name": "Veo 3.1 Fast Generate", + "display_name": "Veo 3.1 Fast Generate", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ - "text" + "video" ] }, "limit": { - "context": 128000, - "output": 131072 + "context": 8192, + "output": 8192 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { "supported": false }, "attachment": true, - "open_weights": true, - "knowledge": "2024-08", - "release_date": "2025-03-12", - "last_updated": "2025-03-12", - "type": "chat" + "open_weights": false, + "release_date": "2025-10-15", + "last_updated": "2026-06-08" }, { - "id": "amazon/zai.glm-4.7-flash", - "name": "GLM-4.7-Flash (Amazon Bedrock)", - "display_name": "GLM-4.7-Flash (Amazon Bedrock)", + "id": "google/gemini-2.5-pro", + "name": "Gemini 2.5 Pro", + "display_name": "Gemini 2.5 Pro", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 203000, - "output": 131072 + "context": 1048576, + "output": 65535 }, "temperature": true, "tool_call": true, @@ -55039,132 +53494,158 @@ "supported": true, "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2026-01-19", - "last_updated": "2026-01-19", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "budget", + "budget": { + "default": -1, + "min": 128, + "max": 32768, + "auto": -1, + "unit": "tokens" + }, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2025-06-17", + "last_updated": "2025-06-17", "type": "chat" }, { - "id": "amazon/mistral.pixtral-large-2502-v1:0", - "name": "Pixtral Large (25.02) (Amazon Bedrock)", - "display_name": "Pixtral Large (25.02) (Amazon Bedrock)", + "id": "google/gemini-3.5-flash-lite", + "name": "Gemini 3.5 Flash Lite", + "display_name": "Gemini 3.5 Flash Lite", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 1000000, + "output": 65000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "low", + "high" + ] + } }, "attachment": true, "open_weights": false, - "release_date": "2025-04-08", - "last_updated": "2025-04-08", + "knowledge": "2026-03", + "release_date": "2026-07-21", + "last_updated": "2026-07-21", "type": "chat" }, { - "id": "amazon/mistral.voxtral-mini-3b-2507", - "name": "Voxtral Mini 3B 2507 (Amazon Bedrock)", - "display_name": "Voxtral Mini 3B 2507 (Amazon Bedrock)", + "id": "google/gemini-3.8-live-extended-thinking", + "name": "Gemini 3.8 Live Extended Thinking", + "display_name": "Gemini 3.8 Live Extended Thinking", "modalities": { "input": [ "text", "audio" ], "output": [ - "text" + "text", + "audio" ] }, "limit": { - "context": 32768, - "output": 32768 + "context": 131072, + "output": 65536 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, "attachment": true, - "open_weights": true, - "release_date": "2025-07-15", - "last_updated": "2025-07-15", - "type": "chat" + "open_weights": false, + "release_date": "2026-09-15", + "last_updated": "2026-09-15" }, { - "id": "amazon/mistral.voxtral-small-24b-2507", - "name": "Voxtral Small 24B 2507 (Amazon Bedrock)", - "display_name": "Voxtral Small 24B 2507 (Amazon Bedrock)", + "id": "google/gemini-embedding-001", + "name": "Gemini Embedding 001", + "display_name": "Gemini Embedding 001", "modalities": { "input": [ - "text", - "audio" + "text" ], "output": [ "text" ] }, "limit": { - "context": 32768, - "output": 32768 + "context": 2048, + "output": 1 }, - "temperature": true, + "temperature": false, "tool_call": false, "reasoning": { "supported": false }, - "attachment": true, - "open_weights": true, - "release_date": "2025-07-15", - "last_updated": "2025-07-15", - "type": "chat" + "attachment": false, + "open_weights": false, + "knowledge": "2025-05", + "release_date": "2025-05-20", + "last_updated": "2025-05-20", + "type": "embedding" }, { - "id": "amazon/amazon.nova-lite-v1:0", - "name": "Nova Lite", - "display_name": "Nova Lite", + "id": "google/gemini-3.8-flash-lite-tts", + "name": "Gemini 3.8 Flash-Lite TTS", + "display_name": "Gemini 3.8 Flash-Lite TTS", "modalities": { "input": [ - "text", - "image", - "video", - "pdf" + "text" ], "output": [ - "text" + "audio" ] }, "limit": { - "context": 300000, - "output": 10000 + "context": 8192, + "output": 16384 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2024-10", - "release_date": "2024-12-03", - "last_updated": "2024-12-03", - "type": "chat" + "release_date": "2026-09-22", + "last_updated": "2026-09-22" }, { - "id": "ionos/Qwen/Qwen3-Coder-Next", - "name": "Qwen3 Coder Next (IONOS)", - "display_name": "Qwen3 Coder Next (IONOS)", + "id": "google/text-embedding-005", + "name": "Text Embedding 005", + "display_name": "Text Embedding 005", "modalities": { "input": [ "text" @@ -55174,36 +53655,37 @@ ] }, "limit": { - "context": 128000, - "output": 65536 + "context": 8192, + "output": 8192 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { "supported": false }, "attachment": false, - "open_weights": true, - "knowledge": "2025-09", - "release_date": "2026-02-03", - "last_updated": "2026-02-03", - "type": "chat" + "open_weights": false, + "release_date": "2024-08-01", + "last_updated": "2024-08", + "type": "embedding" }, { - "id": "ionos/openai/gpt-oss-120b", - "name": "GPT OSS 120B (IONOS)", - "display_name": "GPT OSS 120B (IONOS)", + "id": "google/gemini-3.1-flash-lite", + "name": "Gemini 3.1 Flash Lite", + "display_name": "Gemini 3.1 Flash Lite", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 32768 + "context": 1000000, + "output": 65000 }, "temperature": true, "tool_call": true, @@ -55216,22 +53698,21 @@ "supported": true, "effort_options": [ "low", - "medium", "high" ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "attachment": true, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2026-05-07", + "last_updated": "2026-05-07", "type": "chat" }, { - "id": "ionos/meta-llama/Llama-3.3-70B-Instruct", - "name": "Llama-3.3-70B-Instruct (IONOS)", - "display_name": "Llama-3.3-70B-Instruct (IONOS)", + "id": "google/gemini-embedding-2", + "name": "Gemini Embedding 2", + "display_name": "Gemini Embedding 2", "modalities": { "input": [ "text" @@ -55241,68 +53722,59 @@ ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 8192, + "output": 3072 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { "supported": false }, "attachment": false, - "open_weights": true, - "knowledge": "2023-12", - "release_date": "2024-12-06", - "last_updated": "2024-12-06", - "type": "chat" + "open_weights": false, + "knowledge": "2025-11", + "release_date": "2026-04-22", + "last_updated": "2026-04-22", + "type": "embedding" }, { - "id": "groq/openai/gpt-oss-safeguard-20b", - "name": "GPT OSS Safeguard 20B (Groq)", - "display_name": "GPT OSS Safeguard 20B (Groq)", + "id": "google/gemini-3.8-flash-tts", + "name": "Gemini 3.8 Flash TTS", + "display_name": "Gemini 3.8 Flash TTS", "modalities": { "input": [ "text" ], "output": [ - "text" + "audio" ] }, "limit": { - "context": 131072, - "output": 131072 + "context": 8192, + "output": 16384 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high" - ] - } + "supported": false }, "attachment": false, - "open_weights": true, - "release_date": "2025-10-29", - "last_updated": "2025-10-29", - "type": "chat" + "open_weights": false, + "release_date": "2026-09-22", + "last_updated": "2026-09-22" }, { - "id": "groq/openai/gpt-oss-120b", - "name": "GPT OSS 120B (Groq)", - "display_name": "GPT OSS 120B (Groq)", + "id": "google/gemini-3.1-flash-image", + "name": "Nano Banana 2", + "display_name": "Nano Banana 2", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ - "text" + "text", + "image" ] }, "limit": { @@ -55310,7 +53782,7 @@ "output": 32768 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true @@ -55320,126 +53792,155 @@ "supported": true, "effort_options": [ "low", - "medium", "high" ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", - "type": "chat" + "attachment": true, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2026-05-28", + "last_updated": "2026-05-28" }, { - "id": "groq/openai/gpt-oss-20b", - "name": "GPT OSS 20B (Groq)", - "display_name": "GPT OSS 20B (Groq)", + "id": "google/veo-3.1-generate-001", + "name": "Veo 3.1", + "display_name": "Veo 3.1", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ - "text" + "video" ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 8192, + "output": 8192 + }, + "temperature": false, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": false, + "release_date": "2025-10-15", + "last_updated": "2026-06-08" + }, + { + "id": "google/gemini-omni-flash-preview", + "name": "Gemini Omni Flash Preview", + "display_name": "Gemini Omni Flash Preview", + "modalities": { + "input": [ + "text", + "image", + "pdf" + ], + "output": [ + "video" + ] + }, + "limit": { + "context": 1000000, + "output": 57920 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ + "none", "low", "medium", "high" ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", - "type": "chat" + "attachment": true, + "open_weights": false, + "release_date": "2026-06-30", + "last_updated": "2026-06-30" }, { - "id": "groq/meta-llama/llama-prompt-guard-2-86m", - "name": "Llama Prompt Guard 2 86M (Groq)", - "display_name": "Llama Prompt Guard 2 86M (Groq)", + "id": "google/veo-3.1-lite-generate-001", + "name": "Veo 3.1 Lite Generate", + "display_name": "Veo 3.1 Lite Generate", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ - "text" + "video" ] }, "limit": { - "context": 512, - "output": 512 + "context": 8192, + "output": 8192 }, "temperature": false, "tool_call": false, "reasoning": { "supported": false }, - "attachment": false, - "open_weights": true, - "release_date": "2025-04-29", - "last_updated": "2025-04-29", - "type": "chat" + "attachment": true, + "open_weights": false, + "release_date": "2026-04-02", + "last_updated": "2026-04-02" }, { - "id": "groq/meta-llama/llama-prompt-guard-2-22m", - "name": "Llama Prompt Guard 2 22M (Groq)", - "display_name": "Llama Prompt Guard 2 22M (Groq)", + "id": "google/veo-3.0-generate-001", + "name": "Veo 3.0", + "display_name": "Veo 3.0", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ - "text" + "video" ] }, "limit": { - "context": 512, - "output": 512 + "context": 8192, + "output": 8192 }, "temperature": false, "tool_call": false, "reasoning": { "supported": false }, - "attachment": false, - "open_weights": true, - "release_date": "2025-04-29", - "last_updated": "2025-04-29", - "type": "chat" + "attachment": true, + "open_weights": false, + "release_date": "2025-05-20", + "last_updated": "2026-06-08" }, { - "id": "greenference/deepseek-v4.1-flash", - "name": "DeepSeek V4.1 Flash (Greenference)", - "display_name": "DeepSeek V4.1 Flash (Greenference)", + "id": "google/gemini-2.5-flash", + "name": "Gemini 2.5 Flash", + "display_name": "Gemini 2.5 Flash", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 384000 + "context": 1000000, + "output": 65535 }, "temperature": true, "tool_call": true, @@ -55450,31 +53951,42 @@ "extra_capabilities": { "reasoning": { "supported": true, - "effort_options": [ - "none", - "low", - "high", - "max" + "default_enabled": true, + "mode": "budget", + "budget": { + "default": -1, + "min": 0, + "max": 24576, + "auto": -1, + "off": 0, + "unit": "tokens" + }, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-09-10", - "last_updated": "2026-09-10", + "attachment": true, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2025-06-17", + "last_updated": "2025-06-17", "type": "chat" }, { - "id": "greenference/gpt-oss-20b", - "name": "GPT OSS 20B (Greenference)", - "display_name": "GPT OSS 20B (Greenference)", + "id": "google/gemini-3.1-flash-image-preview", + "name": "Gemini 3.1 Flash Image Preview (Nano Banana 2)", + "display_name": "Gemini 3.1 Flash Image Preview (Nano Banana 2)", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ - "text" + "text", + "image" ] }, "limit": { @@ -55492,45 +54004,36 @@ "supported": true, "effort_options": [ "low", - "medium", "high" ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", - "type": "chat" - } - ] - }, - "jalapeno": { - "id": "jalapeno", - "name": "Jalapeno Cloud", - "display_name": "Jalapeno Cloud", - "api": "https://api.jalapeno-cloud.ai/v1", - "doc": "https://www.jalapeno-cloud.ai/docs/", - "models": [ + "attachment": true, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2026-02-26", + "last_updated": "2026-02-26" + }, { - "id": "Hy3", - "name": "Hy3", - "display_name": "Hy3", + "id": "google/gemini-3-pro-image", + "name": "Nano Banana Pro", + "display_name": "Nano Banana Pro", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ - "text" + "text", + "image" ] }, "limit": { - "context": 202752, - "output": 128000 + "context": 65536, + "output": 32768 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true @@ -55538,35 +54041,43 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "low", + "high" + ], "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" + "thought_signatures" ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-07-06", - "last_updated": "2026-07-06", - "type": "chat" + "attachment": true, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2026-05-28", + "last_updated": "2026-05-28" }, { - "id": "DeepSeek-V4-Flash", - "name": "DeepSeek V4 Flash", - "display_name": "DeepSeek V4 Flash", + "id": "google/gemma-4-26b-a4b-it", + "name": "Gemma 4 26B A4B IT", + "display_name": "Gemma 4 26B A4B IT", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 384000 + "context": 262144, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -55576,173 +54087,108 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." - ] + "supported": true } }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "Kimi-K3", - "name": "Kimi K3", - "display_name": "Kimi K3", + "id": "google/gemma-4-31b-it", + "name": "Gemma 4 31B IT", + "display_name": "Gemma 4 31B IT", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, + "context": 262144, "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, "attachment": true, "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-16", + "knowledge": "2025-01", + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "Qwen3-Next-80B-A3B-Instruct", - "name": "Qwen3-Next 80B-A3B Instruct", - "display_name": "Qwen3-Next 80B-A3B Instruct", + "id": "google/gemini-nano-banana-2.1", + "name": "Gemini Nano Banana 2.1", + "display_name": "Gemini Nano Banana 2.1", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ - "text" + "text", + "image" ] }, "limit": { - "context": 129024, + "context": 131072, "output": 32768 }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-09", - "last_updated": "2025-09", - "type": "chat" - }, - { - "id": "DeepSeek-V4-Pro", - "name": "DeepSeek V4 Pro", - "display_name": "DeepSeek V4 Pro", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 1048576, - "output": 384000 - }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", "effort_options": [ - "low", - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." + "minimal", + "medium", + "high" ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", - "type": "chat" + "attachment": true, + "open_weights": false, + "release_date": "2026-10-06", + "last_updated": "2026-10-06" }, { - "id": "Kimi-K2.7-Code", - "name": "Kimi K2.7 Code", - "display_name": "Kimi K2.7 Code", + "id": "google/gemini-3.1-flash-lite-image", + "name": "Gemini 3.1 Flash Lite Image (Nano Banana 2 Lite)", + "display_name": "Gemini 3.1 Flash Lite Image (Nano Banana 2 Lite)", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ - "text" + "text", + "image" ] }, "limit": { - "context": 271360, - "output": 262144 + "context": 65536, + "output": 4096 }, - "temperature": false, - "tool_call": true, + "temperature": true, + "tool_call": false, "reasoning": { "supported": true, "default": true @@ -55750,120 +54196,92 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "low", + "high" ] } }, "attachment": true, - "open_weights": true, + "open_weights": false, "knowledge": "2025-01", - "release_date": "2026-06-12", - "last_updated": "2026-06-12", - "type": "chat" + "release_date": "2026-06-30", + "last_updated": "2026-06-30" }, { - "id": "Kimi-K2.5", - "name": "Kimi K2.5", - "display_name": "Kimi K2.5", + "id": "google/gemini-2.5-flash-image", + "name": "Nano Banana (Gemini 2.5 Flash Image)", + "display_name": "Nano Banana (Gemini 2.5 Flash Image)", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ - "text" + "text", + "image" ] }, "limit": { - "context": 262144, - "output": 180224 + "context": 32768, + "output": 65535 }, - "temperature": false, - "tool_call": true, + "temperature": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-01-27", - "last_updated": "2026-01-27", - "type": "chat" + "open_weights": false, + "knowledge": "2024-06", + "release_date": "2025-08-26", + "last_updated": "2025-08-26" }, { - "id": "GLM-5.1", - "name": "GLM-5.1", - "display_name": "GLM-5.1", + "id": "google/gemini-3.5-transcribe", + "name": "Gemini 3.5 Transcribe", + "display_name": "Gemini 3.5 Transcribe", "modalities": { "input": [ - "text" + "audio" ], "output": [ "text" ] }, "limit": { - "context": 202752, - "output": 131072 + "context": 98304, + "output": 32768 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, - "attachment": false, - "open_weights": true, - "release_date": "2026-04-07", - "last_updated": "2026-04-07", - "type": "chat" + "attachment": true, + "open_weights": false, + "release_date": "2026-08-26", + "last_updated": "2026-08-26" }, { - "id": "Qwen3-VL-235B-A22B-Thinking", - "name": "Qwen3 VL 235B A22B Thinking", - "display_name": "Qwen3 VL 235B A22B Thinking", + "id": "google/gemini-4-argon", + "name": "Gemini 4 Argon", + "display_name": "Gemini 4 Argon", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 1000000, + "output": 1000000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -55871,39 +54289,37 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "low", + "medium", + "high" ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-03-31", - "release_date": "2025-09-23", - "last_updated": "2025-09-23", + "open_weights": false, + "knowledge": "2026-03", + "release_date": "2026-10-13", + "last_updated": "2026-10-13", "type": "chat" }, { - "id": "Qwen3.5-27B", - "name": "Qwen3.5 27B", - "display_name": "Qwen3.5 27B", + "id": "google/gemini-3.7-flash", + "name": "Gemini 3.7 Flash", + "display_name": "Gemini 3.7 Flash", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 1000000, + "output": 65535 }, "temperature": true, "tool_call": true, @@ -55914,27 +54330,38 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", + "low", + "medium", + "high" + ], "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" + "thought_signatures" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-02-23", - "last_updated": "2026-02-23", + "open_weights": false, + "knowledge": "2026-03", + "release_date": "2026-08-13", + "last_updated": "2026-08-13", "type": "chat" }, { - "id": "GLM-5.2", - "name": "GLM-5.2", - "display_name": "GLM-5.2", + "id": "google/gemini-2.5-flash-lite", + "name": "Gemini 2.5 Flash Lite", + "display_name": "Gemini 2.5 Flash Lite", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" @@ -55942,48 +54369,57 @@ }, "limit": { "context": 1048576, - "output": 131072 + "output": 65535 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "default": -1, + "min": 512, + "max": 24576, + "auto": -1, + "unit": "tokens" + }, "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" + "thought_signatures" ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "attachment": true, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2025-06-17", + "last_updated": "2025-06-17", "type": "chat" }, { - "id": "Qwen3.5-397B-A17B", - "name": "Qwen3.5 397B-A17B", - "display_name": "Qwen3.5 397B-A17B", + "id": "google/gemini-3.5-flash", + "name": "Gemini 3.5 Flash", + "display_name": "Gemini 3.5 Flash", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 1000000, + "output": 64000 }, "temperature": true, "tool_call": true, @@ -55994,106 +54430,154 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", + "low", + "medium", + "high" + ], "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" + "thought_signatures" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-02-15", - "last_updated": "2026-02-15", + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2026-05-19", + "last_updated": "2026-05-19", "type": "chat" }, { - "id": "Qwen3-Next-80B-A3B-Thinking", - "name": "Qwen3-Next 80B-A3B (Thinking)", - "display_name": "Qwen3-Next 80B-A3B (Thinking)", + "id": "google/gemini-3.8-live", + "name": "Gemini 3.8 Live", + "display_name": "Gemini 3.8 Live", "modalities": { "input": [ - "text" + "text", + "audio" ], "output": [ - "text" + "text", + "audio" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 131072, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-09", - "last_updated": "2025-09", - "type": "chat" + "attachment": true, + "open_weights": false, + "release_date": "2026-09-15", + "last_updated": "2026-09-15" }, { - "id": "Qwen3-VL-235B-A22B-Instruct", - "name": "Qwen3 VL 235B A22B Instruct", - "display_name": "Qwen3 VL 235B A22B Instruct", + "id": "google/veo-3.0-fast-generate-001", + "name": "Veo 3.0 Fast Generate", + "display_name": "Veo 3.0 Fast Generate", "modalities": { "input": [ "text", "image" ], "output": [ - "text" + "video" ] }, "limit": { - "context": 129024, - "output": 32768 + "context": 8192, + "output": 8192 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { "supported": false }, "attachment": true, - "open_weights": true, - "knowledge": "2025-03-31", - "release_date": "2025-09-23", - "last_updated": "2025-09-23", - "type": "chat" + "open_weights": false, + "release_date": "2025-07-31", + "last_updated": "2026-06-08" }, { - "id": "MiniMax-M3", - "name": "MiniMax-M3", - "display_name": "MiniMax-M3", + "id": "google/text-multilingual-embedding-002", + "name": "Text Multilingual Embedding 002", + "display_name": "Text Multilingual Embedding 002", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 8192, + "output": 8192 + }, + "temperature": false, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": false, + "release_date": "2024-03-01", + "last_updated": "2024-03", + "type": "embedding" + }, + { + "id": "google/gemini-3.5-transcribe-live", + "name": "Gemini 3.5 Transcribe Live", + "display_name": "Gemini 3.5 Transcribe Live", + "modalities": { + "input": [ + "audio" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 8192, + "output": 8192 + }, + "temperature": false, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": false, + "release_date": "2026-08-26", + "last_updated": "2026-08-26" + }, + { + "id": "google/gemini-3.8-flash", + "name": "Gemini 3.8 Flash", + "display_name": "Gemini 3.8 Flash", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 524288, - "output": 512000 + "context": 1000000, + "output": 65535 }, "temperature": true, "tool_call": true, @@ -56104,37 +54588,45 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", + "low", + "medium", + "high" + ], "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" + "thought_signatures" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-06-01", - "last_updated": "2026-06-01", + "open_weights": false, + "release_date": "2026-09-02", + "last_updated": "2026-09-02", "type": "chat" }, { - "id": "Qwen3.5-122B-A10B", - "name": "Qwen3.5 122B-A10B", - "display_name": "Qwen3.5 122B-A10B", + "id": "google/gemini-3.6-flash", + "name": "Gemini 3.6 Flash", + "display_name": "Gemini 3.6 Flash", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 1000000, + "output": 64000 }, "temperature": true, "tool_call": true, @@ -56145,29 +54637,65 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", + "low", + "medium", + "high" + ], "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" + "thought_signatures" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-02-23", - "last_updated": "2026-02-23", + "open_weights": false, + "knowledge": "2026-03", + "release_date": "2026-07-21", + "last_updated": "2026-07-21", "type": "chat" }, { - "id": "Qwen3.5-35B-A3B", - "name": "Qwen3.5 35B-A3B", - "display_name": "Qwen3.5 35B-A3B", + "id": "heygen/heygen-video-1", + "name": "HeyGen Video", + "display_name": "HeyGen Video", "modalities": { "input": [ "text", "image", + "video", + "audio" + ], + "output": [ "video" + ] + }, + "limit": { + "context": 8192, + "output": 8192 + }, + "temperature": false, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": false, + "release_date": "2026-10-09", + "last_updated": "2026-10-09" + }, + { + "id": "inclusionai/ling-3.1-flash", + "name": "Ling 3.1 Flash", + "display_name": "Ling 3.1 Flash", + "modalities": { + "input": [ + "text" ], "output": [ "text" @@ -56175,7 +54703,7 @@ }, "limit": { "context": 262144, - "output": 65536 + "output": 32768 }, "temperature": true, "tool_call": true, @@ -56185,34 +54713,24 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "none", + "low", + "medium", + "high" ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-02-23", - "last_updated": "2026-02-23", + "release_date": "2026-09-29", + "last_updated": "2026-09-29", "type": "chat" - } - ] - }, - "lynkr": { - "id": "lynkr", - "name": "Lynkr", - "display_name": "Lynkr", - "api": "http://127.0.0.1:8081/v1", - "doc": "https://github.com/Fast-Editor/Lynkr", - "models": [ + }, { - "id": "lynkr-auto", - "name": "Lynkr Auto (complexity routing)", - "display_name": "Lynkr Auto (complexity routing)", + "id": "inclusionai/ling-3.0-flash", + "name": "Ling 3.0 Flash", + "display_name": "Ling 3.0 Flash", "modalities": { "input": [ "text" @@ -56222,48 +54740,36 @@ ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 256000, + "output": 32000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": false, - "open_weights": false, - "release_date": "2025-12-03", - "last_updated": "2026-07-11", + "open_weights": true, + "release_date": "2026-07-23", + "last_updated": "2026-07-23", "type": "chat" - } - ] - }, - "vispark": { - "id": "vispark", - "name": "Vispark", - "display_name": "Vispark", - "api": "https://api.lab.vispark.in/v1", - "doc": "https://lab.vispark.in/#vision", - "models": [ + }, { - "id": "vispark/vision-small", - "name": "Vision Small", - "display_name": "Vision Small", + "id": "inclusionai/ling-3.0-flash-sante", + "name": "Ling 3.0 Flash Sante", + "display_name": "Ling 3.0 Flash Sante", "modalities": { "input": [ - "text", - "image", - "audio", - "video", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 256000, + "output": 32000 }, "temperature": true, "tool_call": true, @@ -56271,31 +54777,38 @@ "supported": true, "default": true }, - "attachment": true, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "low", + "medium", + "high" + ] + } + }, + "attachment": false, "open_weights": false, - "release_date": "2024-05-15", - "last_updated": "2026-09", + "release_date": "2026-09-04", + "last_updated": "2026-09-04", "type": "chat" }, { - "id": "vispark/vision-medium", - "name": "Vision Medium", - "display_name": "Vision Medium", + "id": "inclusionai/ling-3.0-flash-vl", + "name": "Ling 3.0 Flash VL", + "display_name": "Ling 3.0 Flash VL", "modalities": { "input": [ "text", - "image", - "audio", - "video", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 256000, + "output": 32000 }, "temperature": true, "tool_call": true, @@ -56304,30 +54817,26 @@ "default": true }, "attachment": true, - "open_weights": false, - "release_date": "2024-05-15", - "last_updated": "2026-09", + "open_weights": true, + "release_date": "2026-09-10", + "last_updated": "2026-09-10", "type": "chat" }, { - "id": "vispark/vision-large", - "name": "Vision Large", - "display_name": "Vision Large", + "id": "inclusionai/ling-3.0-flash-fin", + "name": "Ling 3.0 Flash Fin", + "display_name": "Ling 3.0 Flash Fin", "modalities": { "input": [ - "text", - "image", - "audio", - "video", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 256000, + "output": 32000 }, "temperature": true, "tool_call": true, @@ -56335,140 +54844,235 @@ "supported": true, "default": true }, - "attachment": true, - "open_weights": false, - "release_date": "2024-05-15", - "last_updated": "2026-09", + "attachment": false, + "open_weights": true, + "release_date": "2026-08-27", + "last_updated": "2026-09-03", "type": "chat" - } - ] - }, - "google": { - "id": "google", - "name": "google", - "display_name": "google", - "doc": "https://ai.google.dev/gemini-api/docs/models", - "models": [ + }, { - "id": "gemini-3.5-live-translate-preview", - "name": "Gemini 3.5 Live Translate Preview", - "display_name": "Gemini 3.5 Live Translate Preview", + "id": "klingai/kling-v2.6-t2v", + "name": "Kling v2.6 Text-to-Video", + "display_name": "Kling v2.6 Text-to-Video", "modalities": { "input": [ - "audio" + "text" ], "output": [ - "audio", - "text" + "video" ] }, "limit": { - "context": 16384, - "output": 32768 + "context": 8192, + "output": 8192 }, - "temperature": true, + "temperature": false, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": false, + "release_date": "2025-12-03", + "last_updated": "2025-12-21" + }, + { + "id": "klingai/kling-v2.6-motion-control", + "name": "Kling v2.6 Motion Control", + "display_name": "Kling v2.6 Motion Control", + "modalities": { + "input": [ + "text", + "image", + "video" + ], + "output": [ + "video" + ] + }, + "limit": { + "context": 8192, + "output": 8192 + }, + "temperature": false, "tool_call": false, "reasoning": { "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-06-09", - "last_updated": "2026-06-09" + "release_date": "2025-12-18", + "last_updated": "2025-12-21" }, { - "id": "gemini-3-pro-image", - "name": "Nano Banana Pro", - "display_name": "Nano Banana Pro", + "id": "klingai/kling-v2.5-turbo-t2v", + "name": "Kling v2.5 Turbo Text-to-Video", + "display_name": "Kling v2.5 Turbo Text-to-Video", + "modalities": { + "input": [ + "text" + ], + "output": [ + "video" + ] + }, + "limit": { + "context": 8192, + "output": 8192 + }, + "temperature": false, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": false, + "release_date": "2025-09-23", + "last_updated": "2025-09-23" + }, + { + "id": "klingai/kling-v3.0-motion-control", + "name": "Kling v3.0 Motion Control", + "display_name": "Kling v3.0 Motion Control", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ + "video" + ] + }, + "limit": { + "context": 8192, + "output": 8192 + }, + "temperature": false, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": false, + "release_date": "2026-03-04", + "last_updated": "2026-03-04" + }, + { + "id": "klingai/kling-v3.0-i2v", + "name": "Kling v3.0 Image-to-Video", + "display_name": "Kling v3.0 Image-to-Video", + "modalities": { + "input": [ "text", "image" + ], + "output": [ + "video" ] }, "limit": { - "context": 65536, - "output": 32768 + "context": 8192, + "output": 8192 }, - "temperature": true, + "temperature": false, "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "low", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] - } + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-05-28", - "last_updated": "2026-05-28" + "release_date": "2026-02-05", + "last_updated": "2026-02-05" }, { - "id": "deep-research-preview-04-2026", - "name": "Deep Research Preview (Apr-21-2026)", - "display_name": "Deep Research Preview (Apr-21-2026)", + "id": "klingai/kling-v3.0-t2v", + "name": "Kling v3.0 Text-to-Video", + "display_name": "Kling v3.0 Text-to-Video", + "modalities": { + "input": [ + "text" + ], + "output": [ + "video" + ] + }, + "limit": { + "context": 8192, + "output": 8192 + }, + "temperature": false, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": false, + "release_date": "2026-02-05", + "last_updated": "2026-02-05" + }, + { + "id": "klingai/kling-v2.5-turbo-i2v", + "name": "Kling v2.5 Turbo Image-to-Video", + "display_name": "Kling v2.5 Turbo Image-to-Video", "modalities": { "input": [ "text", - "image", - "video", - "audio", - "pdf" + "image" ], "output": [ + "video" + ] + }, + "limit": { + "context": 8192, + "output": 8192 + }, + "temperature": false, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": false, + "release_date": "2025-09-23", + "last_updated": "2025-09-23" + }, + { + "id": "klingai/kling-v2.6-i2v", + "name": "Kling v2.6 Image-to-Video", + "display_name": "Kling v2.6 Image-to-Video", + "modalities": { + "input": [ "text", "image" + ], + "output": [ + "video" ] }, "limit": { - "context": 131072, - "output": 65536 + "context": 8192, + "output": 8192 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-04-21", - "last_updated": "2026-04-21", - "type": "chat" + "release_date": "2025-12-03", + "last_updated": "2025-12-21" }, { - "id": "gemini-flash-latest", - "name": "Gemini Flash Latest", - "display_name": "Gemini Flash Latest", + "id": "particle/particle-1", + "name": "Particle-1", + "display_name": "Particle-1", "modalities": { "input": [ "text", - "image", - "video", - "audio", - "pdf" + "image" ], "output": [ "text" @@ -56476,9 +55080,8 @@ }, "limit": { "context": 1048576, - "output": 65536 + "output": 131072 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -56487,6 +55090,7 @@ "extra_capabilities": { "reasoning": { "effort_options": [ + "none", "low", "medium", "high" @@ -56495,56 +55099,105 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-08-13", - "last_updated": "2026-08-13", + "release_date": "2026-10-28", + "last_updated": "2026-10-28", "type": "chat" }, { - "id": "gemini-3.1-flash-tts-preview", - "name": "Gemini 3.1 Flash TTS Preview", - "display_name": "Gemini 3.1 Flash TTS Preview", + "id": "topaz/proteus", + "name": "Proteus", + "display_name": "Proteus", "modalities": { "input": [ "text" ], "output": [ - "audio" + "video" ] }, "limit": { "context": 8192, - "output": 16384 + "output": 8192 }, - "temperature": true, + "temperature": false, "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-04-15", - "last_updated": "2026-04-15" + "release_date": "2026-10-06", + "last_updated": "2026-10-06" }, { - "id": "gemini-3.1-flash-lite-image", - "name": "Nano Banana 2 Lite", - "display_name": "Nano Banana 2 Lite", + "id": "topaz/wonder-3.5", + "name": "Wonder 3.5", + "display_name": "Wonder 3.5", "modalities": { "input": [ "text", "image" ], "output": [ + "image" + ] + }, + "limit": { + "context": 8192, + "output": 8192 + }, + "temperature": false, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": false, + "release_date": "2026-10-06", + "last_updated": "2026-10-06" + }, + { + "id": "topaz/starlight-precise-2.6", + "name": "Starlight Precise 2.6", + "display_name": "Starlight Precise 2.6", + "modalities": { + "input": [ + "text" + ], + "output": [ + "video" + ] + }, + "limit": { + "context": 8192, + "output": 8192 + }, + "temperature": false, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": false, + "release_date": "2026-10-06", + "last_updated": "2026-10-06" + }, + { + "id": "fireworks/ember-1", + "name": "Ember-1", + "display_name": "Ember-1", + "modalities": { + "input": [ "text", "image" + ], + "output": [ + "text" ] }, "limit": { - "context": 65536, - "output": 4096 + "context": 1048576, + "output": 1048576 }, "temperature": true, "tool_call": true, @@ -56554,35 +55207,34 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ - "minimal", + "low", + "medium", "high" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-06-30", - "last_updated": "2026-06-30" + "release_date": "2026-09-22", + "last_updated": "2026-09-22", + "type": "chat" }, { - "id": "gemma-4-31b-it", - "name": "Gemma 4 31B IT", - "display_name": "Gemma 4 31B IT", + "id": "arcee-ai/trinity-large-thinking", + "name": "Trinity Large Thinking", + "display_name": "Trinity Large Thinking", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 262100, + "output": 80000 }, "temperature": true, "tool_call": true, @@ -56592,26 +55244,36 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "effort_options": [ + "none", + "low", + "medium", + "high" + ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "release_date": "2026-04-01", + "last_updated": "2026-05-28", "type": "chat" - }, + } + ] + }, + "munito-eu": { + "id": "munito-eu", + "name": "Munito AI (EU)", + "display_name": "Munito AI (EU)", + "api": "https://api.eu.munito.ai/inference/v1", + "doc": "https://docs.munito.ai/regions", + "models": [ { - "id": "gemini-4-argon", - "name": "Gemini 4 Argon", - "display_name": "Gemini 4 Argon", + "id": "aleph-alpha/kolibri-1", + "name": "Kolibri 1", + "display_name": "Kolibri 1", "modalities": { "input": [ - "text", - "image", - "video", - "audio", - "pdf" + "text" ], "output": [ "text" @@ -56619,9 +55281,9 @@ }, "limit": { "context": 1048576, - "output": 32768 + "output": 943718 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -56629,31 +55291,37 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ + "none", "low", "medium", "high" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-10-13", - "last_updated": "2026-10-13", + "attachment": false, + "open_weights": true, + "knowledge": "2026-06-18", + "release_date": "2026-10-03", + "last_updated": "2026-10-03", "type": "chat" }, { - "id": "gemini-2.5-pro", - "name": "Gemini 2.5 Pro", - "display_name": "Gemini 2.5 Pro", + "id": "zai-org/glm-5.3-flash", + "name": "GLM-5.3-Flash", + "display_name": "GLM-5.3-Flash", "modalities": { "input": [ "text", "image", - "audio", - "video", - "pdf" + "video" ], "output": [ "text" @@ -56661,60 +55329,43 @@ }, "limit": { "context": 1048576, - "output": 65536 + "output": 943718 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true, - "budget": { - "default": -1, - "min": 128, - "max": 32768 - } + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "budget", - "budget": { - "default": -1, - "min": 128, - "max": 32768, - "auto": -1, - "unit": "tokens" - }, + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" + ], + "effort_options": [ + "low", + "high", + "max" ] } }, - "search": { - "supported": true, - "default": false - }, "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-06-17", - "last_updated": "2025-06-17", + "open_weights": true, + "release_date": "2026-08-26", + "last_updated": "2026-08-26", "type": "chat" }, { - "id": "gemini-3.5-flash", - "name": "Gemini 3.5 Flash", - "display_name": "Gemini 3.5 Flash", + "id": "deepseek-ai/deepseek-v4-flash", + "name": "DeepSeek V4 Flash 0731", + "display_name": "DeepSeek V4 Flash 0731", "modalities": { "input": [ - "text", - "image", - "video", - "audio", - "pdf" + "text" ], "output": [ "text" @@ -56722,7 +55373,7 @@ }, "limit": { "context": 1048576, - "output": 65536 + "output": 943718 }, "temperature": true, "tool_call": true, @@ -56734,47 +55385,48 @@ "reasoning": { "supported": true, "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", + "mode": "effort", + "effort": "high", + "effort_options": [ "low", - "medium", - "high" + "high", + "max" ], + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" + ], + "notes": [ + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-05-19", - "last_updated": "2026-05-19", + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-07-31", + "last_updated": "2026-07-31", "type": "chat" }, { - "id": "gemini-pro-latest", - "name": "Gemini Pro Latest", - "display_name": "Gemini Pro Latest", + "id": "qwen/qwen3.8-27b", + "name": "Qwen3.8 27B", + "display_name": "Qwen3.8 27B", "modalities": { "input": [ "text", "image", - "video", - "audio", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 262144, + "output": 235929 }, "temperature": true, "tool_call": true, @@ -56784,69 +55436,83 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ + "none", "low", "medium", - "high" + "xhigh" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-02-19", - "last_updated": "2026-02-19", + "open_weights": true, + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" - }, + } + ] + }, + "openai": { + "id": "openai", + "name": "OpenAI", + "display_name": "OpenAI", + "doc": "https://platform.openai.com/docs/models", + "models": [ { - "id": "gemini-embedding-001", - "name": "Gemini Embedding 001", - "display_name": "Gemini Embedding 001", + "id": "gpt-4.1-nano", + "name": "GPT-4.1 nano", + "display_name": "GPT-4.1 nano", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 2048, - "output": 1 + "context": 1047576, + "output": 32768 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2025-05", - "release_date": "2025-05-20", - "last_updated": "2025-05-20", - "type": "embedding" + "knowledge": "2024-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", + "type": "chat" }, { - "id": "gemini-3.1-flash-live-preview", - "name": "Gemini 3.1 Flash Live Preview", - "display_name": "Gemini 3.1 Flash Live Preview", + "id": "gpt-6.1-terra", + "name": "GPT-6.1 Terra", + "display_name": "GPT-6.1 Terra", "modalities": { "input": [ "text", "image", - "video", - "audio" + "pdf" ], "output": [ - "text", - "audio" + "text" ] }, "limit": { - "context": 131072, - "output": 65536 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -56854,73 +55520,88 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", + "effort_options": [ + "none", "low", "medium", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" + "high", + "xhigh", + "max" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-03-26", - "last_updated": "2026-03-26" + "knowledge": "2026-06-01", + "release_date": "2026-10-26", + "last_updated": "2026-10-26", + "type": "chat" }, { - "id": "deep-research-max-preview-04-2026", - "name": "Deep Research Max Preview (Apr-21-2026)", - "display_name": "Deep Research Max Preview (Apr-21-2026)", + "id": "gpt-4-turbo", + "name": "GPT-4 Turbo", + "display_name": "GPT-4 Turbo", "modalities": { "input": [ "text", - "image", - "video", - "audio", - "pdf" + "image" ], "output": [ - "text", - "image" + "text" ] }, "limit": { - "context": 131072, - "output": 65536 + "context": 128000, + "output": 4096 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-04-21", - "last_updated": "2026-04-21", + "knowledge": "2023-12", + "release_date": "2023-11-06", + "last_updated": "2024-04-09", "type": "chat" }, { - "id": "gemini-3.5-flash-lite", - "name": "Gemini 3.5 Flash Lite", - "display_name": "Gemini 3.5 Flash Lite", + "id": "gpt-image-1-mini", + "name": "gpt-image-1-mini", + "display_name": "gpt-image-1-mini", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text", + "image" + ] + }, + "limit": { + "context": 8192, + "output": 8192 + }, + "temperature": false, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": false, + "release_date": "2025-09-26", + "last_updated": "2025-09-26" + }, + { + "id": "gpt-5.6-terra", + "name": "GPT-5.6 Terra", + "display_name": "GPT-5.6 Terra", "modalities": { "input": [ "text", "image", - "video", - "audio", "pdf" ], "output": [ @@ -56928,10 +55609,10 @@ ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -56940,71 +55621,80 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ - "minimal", + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ], + "verbosity": "medium", + "verbosity_options": [ "low", "medium", "high" - ] + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-07-21", - "last_updated": "2026-07-21", + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "gemini-2.5-flash-image", - "name": "Gemini 2.5 Flash Image", - "display_name": "Gemini 2.5 Flash Image", + "id": "gpt-4o-2024-05-13", + "name": "GPT-4o (2024-05-13)", + "display_name": "GPT-4o (2024-05-13)", "modalities": { "input": [ "text", "image" ], "output": [ - "text", - "image" + "text" ] }, "limit": { - "context": 32768, - "output": 32768 + "context": 128000, + "output": 4096 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2024-06", - "release_date": "2025-08-26", - "last_updated": "2025-08-26" + "knowledge": "2023-09", + "release_date": "2024-05-13", + "last_updated": "2024-05-13", + "type": "chat" }, { - "id": "gemini-3.1-pro-preview", - "name": "Gemini 3.1 Pro Preview", - "display_name": "Gemini 3.1 Pro Preview", + "id": "o1-pro", + "name": "o1-pro", + "display_name": "o1-pro", "modalities": { "input": [ "text", - "image", - "video", - "audio", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 200000, + "output": 100000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -57014,36 +55704,31 @@ "reasoning": { "supported": true, "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ + "mode": "effort", + "effort": "medium", + "effort_options": [ "low", + "medium", "high" ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-02-19", - "last_updated": "2026-02-19", + "knowledge": "2023-09", + "release_date": "2025-03-19", + "last_updated": "2025-03-19", "type": "chat" }, { - "id": "gemini-2.5-flash", - "name": "Gemini 2.5 Flash", - "display_name": "Gemini 2.5 Flash", + "id": "gpt-5.4", + "name": "GPT-5.4", + "display_name": "GPT-5.4", "modalities": { "input": [ "text", "image", - "audio", - "video", "pdf" ], "output": [ @@ -57051,90 +55736,188 @@ ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 1050000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true, - "budget": { - "default": -1, - "min": 0, - "max": 24576 + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-03-05", + "last_updated": "2026-03-05", + "type": "chat" + }, + { + "id": "gpt-5.6-sol", + "name": "GPT-5.6 Sol", + "display_name": "GPT-5.6 Sol", + "modalities": { + "input": [ + "text", + "image", + "pdf" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1050000, + "output": 128000 + }, + "temperature": false, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, "extra_capabilities": { "reasoning": { "supported": true, "default_enabled": true, - "mode": "budget", - "budget": { - "default": -1, - "min": 0, - "max": 24576, - "auto": -1, - "off": 0, - "unit": "tokens" - }, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] + "mode": "effort", + "effort": "medium", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "search": { + "attachment": true, + "open_weights": false, + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", + "type": "chat" + }, + { + "id": "gpt-5.4-mini", + "name": "GPT-5.4 mini", + "display_name": "GPT-5.4 mini", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 400000, + "output": 128000 + }, + "temperature": true, + "tool_call": true, + "reasoning": { "supported": true, "default": false }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-06-17", - "last_updated": "2025-06-17", + "knowledge": "2025-08-31", + "release_date": "2026-03-17", + "last_updated": "2026-03-17", "type": "chat" }, { - "id": "lyria-3-pro-preview", - "name": "Lyria 3 Pro Preview", - "display_name": "Lyria 3 Pro Preview", + "id": "gpt-4o", + "name": "GPT-4o", + "display_name": "GPT-4o", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ - "text", - "audio" + "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 128000, + "output": 16384 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, "attachment": true, "open_weights": false, - "release_date": "2026-03-25", - "last_updated": "2026-03-25", + "knowledge": "2023-09", + "release_date": "2024-05-13", + "last_updated": "2024-08-06", "type": "chat" }, { - "id": "gemini-3.8-flash", - "name": "Gemini 3.8 Flash", - "display_name": "Gemini 3.8 Flash", + "id": "gpt-5.6-luna", + "name": "GPT-5.6 Luna", + "display_name": "GPT-5.6 Luna", "modalities": { "input": [ "text", "image", - "video", - "audio", "pdf" ], "output": [ @@ -57142,10 +55925,10 @@ ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -57155,164 +55938,235 @@ "reasoning": { "supported": true, "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", + "mode": "effort", + "effort": "medium", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ], + "verbosity": "medium", + "verbosity_options": [ "low", "medium", "high" ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "release_date": "2026-09-02", - "last_updated": "2026-09-02", + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "gemini-3-pro-image-preview", - "name": "Nano Banana Pro", - "display_name": "Nano Banana Pro", + "id": "gpt-daybreak-red-latest", + "name": "Daybreak Red", + "display_name": "Daybreak Red", "modalities": { "input": [ "text", "image" ], "output": [ - "text", - "image" + "text" ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 400000, + "output": 128000 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ + "effort_options": [ + "none", "low", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" + "medium", + "high", + "xhigh", + "max" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-11-20", - "last_updated": "2025-11-20" + "knowledge": "2026-02-16", + "release_date": "2026-08-07", + "last_updated": "2026-08-07", + "type": "chat" }, { - "id": "gemini-3.1-flash-image-preview", - "name": "Nano Banana 2", - "display_name": "Nano Banana 2", + "id": "gpt-4.1", + "name": "GPT-4.1", + "display_name": "GPT-4.1", "modalities": { "input": [ "text", "image", "pdf" ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1047576, + "output": 32768 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": false, + "knowledge": "2024-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", + "type": "chat" + }, + { + "id": "gpt-image-1.5", + "name": "gpt-image-1.5", + "display_name": "gpt-image-1.5", + "modalities": { + "input": [ + "text", + "image" + ], "output": [ "text", "image" ] }, "limit": { - "context": 65536, - "output": 65536 + "context": 8192, + "output": 8192 }, - "temperature": true, + "temperature": false, "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "minimal", - "high" - ] - } + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-02-26", - "last_updated": "2026-02-26" + "release_date": "2025-11-25", + "last_updated": "2025-11-25" }, { - "id": "lyria-3-clip-preview", - "name": "Lyria 3 Clip Preview", - "display_name": "Lyria 3 Clip Preview", + "id": "gpt-4o-2024-08-06", + "name": "GPT-4o (2024-08-06)", + "display_name": "GPT-4o (2024-08-06)", "modalities": { "input": [ "text", "image" ], "output": [ - "text", - "audio" + "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 128000, + "output": 16384 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, "attachment": true, "open_weights": false, - "release_date": "2026-03-25", - "last_updated": "2026-03-25", + "knowledge": "2023-09", + "release_date": "2024-08-06", + "last_updated": "2024-08-06", "type": "chat" }, { - "id": "gemini-3.7-flash", - "name": "Gemini 3.7 Flash", - "display_name": "Gemini 3.7 Flash", + "id": "gpt-3.5-turbo", + "name": "GPT-3.5-turbo", + "display_name": "GPT-3.5-turbo", "modalities": { "input": [ - "text", - "image", - "video", - "audio", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 16385, + "output": 4096 }, "temperature": true, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": false, + "knowledge": "2021-09-01", + "release_date": "2023-03-01", + "last_updated": "2023-11-06", + "type": "chat" + }, + { + "id": "text-embedding-3-small", + "name": "text-embedding-3-small", + "display_name": "text-embedding-3-small", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 8191, + "output": 1536 + }, + "temperature": false, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": false, + "knowledge": "2024-01", + "release_date": "2024-01-25", + "last_updated": "2024-01-25", + "type": "embedding" + }, + { + "id": "o3-pro", + "name": "o3-pro", + "display_name": "o3-pro", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 200000, + "output": 100000 + }, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -57322,38 +56176,31 @@ "reasoning": { "supported": true, "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", + "mode": "effort", + "effort": "medium", + "effort_options": [ "low", "medium", "high" ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-08-13", - "last_updated": "2026-08-13", + "knowledge": "2024-05", + "release_date": "2025-06-10", + "last_updated": "2025-06-10", "type": "chat" }, { - "id": "gemini-flash-lite-latest", - "name": "Gemini Flash-Lite Latest", - "display_name": "Gemini Flash-Lite Latest", + "id": "gpt-5.3-codex", + "name": "GPT-5.3 Codex", + "display_name": "GPT-5.3 Codex", "modalities": { "input": [ "text", "image", - "video", - "audio", "pdf" ], "output": [ @@ -57361,8 +56208,8 @@ ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 400000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -57372,92 +56219,120 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ - "minimal", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ "low", "medium", "high" - ] + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-07-21", - "last_updated": "2026-07-21", + "knowledge": "2025-08-31", + "release_date": "2026-02-05", + "last_updated": "2026-02-05", "type": "chat" }, { - "id": "gemini-2.5-flash-lite", - "name": "Gemini 2.5 Flash Lite", - "display_name": "Gemini 2.5 Flash Lite", + "id": "gpt-5.1", + "name": "GPT-5.1", + "display_name": "GPT-5.1", "modalities": { "input": [ "text", - "image", - "audio", - "video", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 400000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false, - "budget": { - "default": -1, - "min": 512, - "max": 24576 - } + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, "default_enabled": false, - "mode": "budget", - "budget": { - "default": -1, - "min": 512, - "max": 24576, - "auto": -1, - "unit": "tokens" - }, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "search": { - "supported": true, - "default": false + "attachment": true, + "open_weights": false, + "knowledge": "2024-09-30", + "release_date": "2025-11-13", + "last_updated": "2025-11-13", + "type": "chat" + }, + { + "id": "gpt-4o-2024-11-20", + "name": "GPT-4o (2024-11-20)", + "display_name": "GPT-4o (2024-11-20)", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 128000, + "output": 16384 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-06-17", - "last_updated": "2025-06-17", + "knowledge": "2023-09", + "release_date": "2024-11-20", + "last_updated": "2024-11-20", "type": "chat" }, { - "id": "gemini-3-flash-preview", - "name": "Gemini 3 Flash Preview", - "display_name": "Gemini 3 Flash Preview", + "id": "gpt-6-luna", + "name": "GPT-6 Luna", + "display_name": "GPT-6 Luna", "modalities": { "input": [ "text", "image", - "video", - "audio", "pdf" ], "output": [ @@ -57465,10 +56340,10 @@ ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -57476,110 +56351,126 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", + "effort_options": [ + "none", "low", "medium", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" + "high", + "xhigh", + "max" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-12-17", - "last_updated": "2025-12-17", + "knowledge": "2026-05-18", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "gemini-omni-flash-preview", - "name": "Gemini Omni Flash Preview", - "display_name": "Gemini Omni Flash Preview", + "id": "gpt-realtime-2.1", + "name": "GPT-Realtime-2.1", + "display_name": "GPT-Realtime-2.1", "modalities": { "input": [ "text", - "image", - "video" + "audio", + "image" ], "output": [ - "video" + "text", + "audio" ] }, "limit": { - "context": 131072, - "output": 65536 + "context": 128000, + "output": 32000 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] + } + }, "attachment": true, "open_weights": false, - "release_date": "2026-06-30", - "last_updated": "2026-06-30" + "knowledge": "2024-09-30", + "release_date": "2026-07-06", + "last_updated": "2026-07-06" }, { - "id": "gemini-2.5-computer-use-preview-10-2025", - "name": "Gemini 2.5 Computer Use Preview 10-2025", - "display_name": "Gemini 2.5 Computer Use Preview 10-2025", + "id": "gpt-daybreak-blue-latest", + "name": "Daybreak Blue", + "display_name": "Daybreak Blue", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 64000 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-10-07", - "last_updated": "2025-10-07", + "knowledge": "2026-02-16", + "release_date": "2026-08-07", + "last_updated": "2026-08-07", "type": "chat" }, { - "id": "gemini-3.6-flash", - "name": "Gemini 3.6 Flash", - "display_name": "Gemini 3.6 Flash", + "id": "gpt-5-mini", + "name": "GPT-5 Mini", + "display_name": "GPT-5 Mini", "modalities": { "input": [ "text", - "image", - "video", - "audio", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -57589,38 +56480,38 @@ "reasoning": { "supported": true, "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ + "mode": "effort", + "effort": "medium", + "effort_options": [ "minimal", "low", "medium", "high" ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-07-21", - "last_updated": "2026-07-21", + "knowledge": "2024-05-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "gemini-3.1-flash-lite-preview", - "name": "Gemini 3.1 Flash Lite Preview", - "display_name": "Gemini 3.1 Flash Lite Preview", + "id": "gpt-6-sol", + "name": "GPT-6 Sol", + "display_name": "GPT-6 Sol", "modalities": { "input": [ "text", "image", - "video", - "audio", "pdf" ], "output": [ @@ -57628,10 +56519,10 @@ ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -57640,42 +56531,41 @@ "extra_capabilities": { "reasoning": { "effort_options": [ - "minimal", + "none", "low", "medium", - "high" + "high", + "xhigh", + "max" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-03-03", - "last_updated": "2026-03-03", + "knowledge": "2026-04-20", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "gemini-3.1-flash-image", - "name": "Nano Banana 2", - "display_name": "Nano Banana 2", + "id": "gpt-5.4-pro", + "name": "GPT-5.4 Pro", + "display_name": "GPT-5.4 Pro", "modalities": { "input": [ "text", - "image", - "video", - "pdf" + "image" ], "output": [ - "text", - "image" + "text" ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 1050000, + "output": 128000 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { "supported": true, "default": true @@ -57683,39 +56573,48 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", "effort_options": [ - "minimal", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", "high" - ] + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-05-28", - "last_updated": "2026-05-28" + "knowledge": "2025-08-31", + "release_date": "2026-03-05", + "last_updated": "2026-03-05", + "type": "chat" }, { - "id": "gemini-3.1-pro-preview-customtools", - "name": "Gemini 3.1 Pro Preview Custom Tools", - "display_name": "Gemini 3.1 Pro Preview Custom Tools", + "id": "gpt-5", + "name": "GPT-5", + "display_name": "GPT-5", "modalities": { "input": [ "text", - "image", - "video", - "audio", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -57725,36 +56624,38 @@ "reasoning": { "supported": true, "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ + "mode": "effort", + "effort": "medium", + "effort_options": [ + "minimal", "low", + "medium", "high" ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-02-19", - "last_updated": "2026-02-19", + "knowledge": "2024-09-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "gemini-3.1-flash-lite", - "name": "Gemini 3.1 Flash Lite", - "display_name": "Gemini 3.1 Flash Lite", + "id": "gpt-6.1-sol", + "name": "GPT-6.1 Sol", + "display_name": "GPT-6.1 Sol", "modalities": { "input": [ "text", "image", - "video", - "audio", "pdf" ], "output": [ @@ -57762,10 +56663,10 @@ ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -57773,26 +56674,26 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ - "minimal", "low", "medium", - "high" + "high", + "xhigh", + "max" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-05-07", - "last_updated": "2026-05-07", + "knowledge": "2026-04-30", + "release_date": "2026-09-29", + "last_updated": "2026-09-29", "type": "chat" }, { - "id": "gemma-4-26b-a4b-it", - "name": "Gemma 4 26B A4B IT", - "display_name": "Gemma 4 26B A4B IT", + "id": "gpt-5.2", + "name": "GPT-5.2", + "display_name": "GPT-5.2", "modalities": { "input": [ "text", @@ -57803,103 +56704,137 @@ ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 400000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, - "open_weights": true, - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2025-12-11", + "last_updated": "2025-12-11", "type": "chat" }, { - "id": "gemini-embedding-2", - "name": "Gemini Embedding 2", - "display_name": "Gemini Embedding 2", + "id": "gpt-5-pro", + "name": "GPT-5 Pro", + "display_name": "GPT-5 Pro", "modalities": { "input": [ "text", - "image", - "audio", - "video", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 8192, - "output": 1 + "context": 400000, + "output": 272000 }, "temperature": false, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "fixed", + "effort": "high", + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } }, "attachment": true, "open_weights": false, - "knowledge": "2025-11", - "release_date": "2026-04-22", - "last_updated": "2026-04-22", - "type": "embedding" + "knowledge": "2024-09-30", + "release_date": "2025-10-06", + "last_updated": "2025-10-06", + "type": "chat" }, { - "id": "gemini-2.5-flash-preview-tts", - "name": "Gemini 2.5 Flash Preview TTS", - "display_name": "Gemini 2.5 Flash Preview TTS", + "id": "gpt-4", + "name": "GPT-4", + "display_name": "GPT-4", "modalities": { "input": [ "text" ], "output": [ - "audio" + "text" ] }, "limit": { "context": 8192, - "output": 16384 + "output": 8192 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, "attachment": false, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-05-01", - "last_updated": "2025-05-01" + "knowledge": "2023-11", + "release_date": "2023-11-06", + "last_updated": "2024-04-09", + "type": "chat" }, { - "id": "gemini-2.5-pro-preview-tts", - "name": "Gemini 2.5 Pro Preview TTS", - "display_name": "Gemini 2.5 Pro Preview TTS", + "id": "o3", + "name": "o3", + "display_name": "o3", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ - "audio" + "text" ] }, "limit": { - "context": 8192, - "output": 16384 + "context": 200000, + "output": 100000 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { "supported": true, "default": true @@ -57908,31 +56843,27 @@ "reasoning": { "supported": true, "default_enabled": true, - "mode": "budget", - "budget": { - "default": -1, - "min": 128, - "max": 32768, - "auto": -1, - "unit": "tokens" - }, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-05-01", - "last_updated": "2025-05-01" + "knowledge": "2024-05", + "release_date": "2025-04-16", + "last_updated": "2025-04-16", + "type": "chat" }, { - "id": "gemini-2.5-flash-preview-09-2025", - "name": "Gemini 2.5 Flash Preview 09 2025", - "display_name": "Gemini 2.5 Flash Preview 09 2025", + "id": "gpt-5.4-nano", + "name": "GPT-5.4 nano", + "display_name": "GPT-5.4 nano", "modalities": { "input": [ "text", @@ -57943,161 +56874,145 @@ ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 400000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true, - "budget": { - "default": -1, - "min": 0, - "max": 24576 - } + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "budget", - "budget": { - "default": -1, - "min": 0, - "max": 24576, - "auto": -1, - "off": 0, - "unit": "tokens" - }, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "search": { - "supported": true, - "default": false - }, "attachment": true, + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-03-17", + "last_updated": "2026-03-17", "type": "chat" }, { - "id": "gemini-2.5-flash-image-preview", - "name": "Gemini 2.5 Flash Image Preview", - "display_name": "Gemini 2.5 Flash Image Preview", - "modalities": { - "input": [ - "text", - "image" - ], - "output": [ - "text", - "image" - ] - }, - "limit": { - "context": 32768, - "output": 32768 - }, - "temperature": true, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "type": "imageGeneration" - }, - { - "id": "gemini-2.5-flash-lite-preview-09-2025", - "name": "Gemini 2.5 Flash Lite Preview 09 2025", - "display_name": "Gemini 2.5 Flash Lite Preview 09 2025", + "id": "gpt-5.3-codex-spark", + "name": "GPT-5.3 Codex Spark", + "display_name": "GPT-5.3 Codex Spark", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 128000, + "output": 32000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false, - "budget": { - "default": -1, - "min": 512, - "max": 24576 - } + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "default": -1, - "min": 512, - "max": 24576, - "auto": -1, - "unit": "tokens" - }, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "search": { - "supported": true, - "default": false - }, "attachment": true, + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-02-05", + "last_updated": "2026-02-05", "type": "chat" }, { - "id": "gemini-2.0-flash", - "name": "Gemini 2.0 Flash", - "display_name": "Gemini 2.0 Flash", + "id": "o1", + "name": "o1", + "display_name": "o1", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 8192 + "context": 200000, + "output": 100000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, - "search": { - "supported": true, - "default": false + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } }, "attachment": true, + "open_weights": false, + "knowledge": "2023-09", + "release_date": "2024-12-05", + "last_updated": "2024-12-05", "type": "chat" }, { - "id": "gemini-2.0-flash-preview-image-generation", - "name": "Gemini 2.0 Flash Preview Image Generation", - "display_name": "Gemini 2.0 Flash Preview Image Generation", + "id": "chatgpt-image-latest", + "name": "chatgpt-image-latest", + "display_name": "chatgpt-image-latest", "modalities": { "input": [ "text", @@ -58109,74 +57024,79 @@ ] }, "limit": { - "context": 32000, + "context": 8192, "output": 8192 }, - "temperature": true, + "temperature": false, "tool_call": false, "reasoning": { "supported": false }, - "search": { - "supported": false - }, "attachment": true, - "type": "chat" + "open_weights": false, + "release_date": "2025-12-16", + "last_updated": "2025-12-16" }, { - "id": "gemini-2.0-flash-lite", - "name": "Gemini 2.0 Flash Lite", - "display_name": "Gemini 2.0 Flash Lite", + "id": "gpt-5.5-pro", + "name": "GPT-5.5 Pro", + "display_name": "GPT-5.5 Pro", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 8192 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "search": { - "supported": false + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "medium", + "high", + "xhigh" + ] + } }, "attachment": true, + "open_weights": false, + "knowledge": "2025-12-01", + "release_date": "2026-04-23", + "last_updated": "2026-04-23", "type": "chat" - } - ] - }, - "minimax": { - "id": "minimax", - "name": "MiniMax (minimax.io)", - "display_name": "MiniMax (minimax.io)", - "api": "https://api.minimax.io/anthropic/v1", - "doc": "https://platform.minimax.io/docs/guides/quickstart", - "models": [ + }, { - "id": "MiniMax-M2.7-highspeed", - "name": "MiniMax-M2.7-highspeed", - "display_name": "MiniMax-M2.7-highspeed", + "id": "gpt-5.6", + "name": "GPT-5.6", + "display_name": "GPT-5.6", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -58185,24 +57105,37 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-03-18", - "last_updated": "2026-03-18", + "attachment": true, + "open_weights": false, + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "MiniMax-M2.1", - "name": "MiniMax-M2.1", - "display_name": "MiniMax-M2.1", + "id": "text-embedding-ada-002", + "name": "text-embedding-ada-002", + "display_name": "text-embedding-ada-002", "modalities": { "input": [ "text" @@ -58212,43 +57145,40 @@ ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 8192, + "output": 1536 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, "attachment": false, - "open_weights": true, - "release_date": "2025-12-23", - "last_updated": "2025-12-23", - "type": "chat" + "open_weights": false, + "knowledge": "2022-12", + "release_date": "2022-12-15", + "last_updated": "2022-12-15", + "type": "embedding" }, { - "id": "MiniMax-M2.7", - "name": "MiniMax-M2.7", - "display_name": "MiniMax-M2.7", + "id": "gpt-5.5", + "name": "GPT-5.5", + "display_name": "GPT-5.5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -58257,108 +57187,105 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-03-18", - "last_updated": "2026-03-18", + "attachment": true, + "open_weights": false, + "knowledge": "2025-12-01", + "release_date": "2026-04-23", + "last_updated": "2026-04-23", "type": "chat" }, { - "id": "MiniMax-M2", - "name": "MiniMax-M2", - "display_name": "MiniMax-M2", + "id": "gpt-image-2", + "name": "gpt-image-2", + "display_name": "gpt-image-2", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ - "text" + "image" ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 8192, + "output": 8192 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": false, - "open_weights": true, - "release_date": "2025-10-27", - "last_updated": "2025-10-27", - "type": "chat" + "attachment": true, + "open_weights": false, + "release_date": "2026-04-21", + "last_updated": "2026-04-21", + "type": "imageGeneration" }, { - "id": "MiniMax-M3.1-Flash", - "name": "MiniMax-M3.1-Flash", - "display_name": "MiniMax-M3.1-Flash", + "id": "text-embedding-3-large", + "name": "text-embedding-3-large", + "display_name": "text-embedding-3-large", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 524288 + "context": 8191, + "output": 3072 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ] - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2026-10-19", - "last_updated": "2026-10-19", - "type": "chat" + "knowledge": "2024-01", + "release_date": "2024-01-25", + "last_updated": "2024-01-25", + "type": "embedding" }, { - "id": "MiniMax-M3", - "name": "MiniMax-M3", - "display_name": "MiniMax-M3", + "id": "gpt-5.2-pro", + "name": "GPT-5.2 Pro", + "display_name": "GPT-5.2 Pro", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 524288 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -58366,52 +57293,65 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, - "open_weights": true, - "release_date": "2026-06-01", - "last_updated": "2026-06-25", + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2025-12-11", + "last_updated": "2025-12-11", "type": "chat" }, { - "id": "MiniMax-M2.5", - "name": "MiniMax-M2.5", - "display_name": "MiniMax-M2.5", + "id": "gpt-4.1-mini", + "name": "GPT-4.1 mini", + "display_name": "GPT-4.1 mini", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 1047576, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, - "attachment": false, - "open_weights": true, - "release_date": "2026-02-12", - "last_updated": "2026-02-12", + "attachment": true, + "open_weights": false, + "knowledge": "2024-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", "type": "chat" }, { - "id": "MiniMax-M2.5-highspeed", - "name": "MiniMax-M2.5-highspeed", - "display_name": "MiniMax-M2.5-highspeed", + "id": "o3-mini", + "name": "o3-mini", + "display_name": "o3-mini", "modalities": { "input": [ "text" @@ -58421,10 +57361,10 @@ ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 200000, + "output": 100000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -58432,41 +57372,41 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": false, - "open_weights": true, - "release_date": "2026-02-13", - "last_updated": "2026-02-13", + "open_weights": false, + "knowledge": "2024-05", + "release_date": "2024-12-20", + "last_updated": "2025-01-29", "type": "chat" - } - ] - }, - "crossmodel": { - "id": "crossmodel", - "name": "CrossModel", - "display_name": "CrossModel", - "api": "https://api.crossmodel.ai/v1", - "doc": "https://www.crossmodel.ai/docs", - "models": [ + }, { - "id": "moonshot/kimi-k2.7-code", - "name": "Kimi K2.7 Code", - "display_name": "Kimi K2.7 Code", + "id": "o4-mini", + "name": "o4-mini", + "display_name": "o4-mini", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 262000, - "output": 262000 + "context": 200000, + "output": 100000 }, "temperature": false, "tool_call": true, @@ -58476,69 +57416,72 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-06-12", - "last_updated": "2026-06-12", + "open_weights": false, + "knowledge": "2024-05", + "release_date": "2025-04-16", + "last_updated": "2025-04-16", "type": "chat" }, { - "id": "moonshot/kimi-k2.6", - "name": "Kimi K2.6", - "display_name": "Kimi K2.6", + "id": "gpt-4o-mini", + "name": "GPT-4o mini", + "display_name": "GPT-4o mini", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262000, - "output": 262000 + "context": 128000, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-20", - "last_updated": "2026-04-20", + "open_weights": false, + "knowledge": "2023-09", + "release_date": "2024-07-18", + "last_updated": "2024-07-18", "type": "chat" }, { - "id": "moonshot/kimi-k3", - "name": "Kimi K3", - "display_name": "Kimi K3", + "id": "gpt-6-astra", + "name": "GPT-6 Astra", + "display_name": "GPT-6 Astra", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 1048576 + "context": 1050000, + "output": 128000 }, "temperature": false, "tool_call": true, @@ -58551,35 +57494,36 @@ "supported": true, "effort_options": [ "low", + "medium", "high", + "xhigh", "max" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-16", + "open_weights": false, + "knowledge": "2026-04-30", + "release_date": "2026-09-04", + "last_updated": "2026-09-04", "type": "chat" }, { - "id": "gemini/gemini-4-argon", - "name": "Gemini 4 Argon", - "display_name": "Gemini 4 Argon", + "id": "gpt-5-nano", + "name": "GPT-5 Nano", + "display_name": "GPT-5 Nano", "modalities": { "input": [ "text", - "image", - "audio", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 400000, + "output": 128000 }, "temperature": false, "tool_call": true, @@ -58589,91 +57533,85 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ - "none", "minimal", "low", "medium", "high" - ] + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-10-13", - "last_updated": "2026-10-13", + "knowledge": "2024-05-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" - }, + } + ] + }, + "llmtr": { + "id": "llmtr", + "name": "LLMTR", + "display_name": "LLMTR", + "api": "https://llmtr.com/v1", + "doc": "https://llmtr.com/docs", + "models": [ { - "id": "gemini/gemini-2.5-pro", - "name": "Gemini 2.5 Pro", - "display_name": "Gemini 2.5 Pro", + "id": "trendyol-asure-12b", + "name": "Trendyol Asure 12B", + "display_name": "Trendyol Asure 12B", "modalities": { "input": [ "text", - "image", - "audio", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 40960, + "output": 40960 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "budget", - "budget": { - "default": -1, - "min": 128, - "max": 32768, - "auto": -1, - "unit": "tokens" - }, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] - } + "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-06-17", - "last_updated": "2025-06-17", + "open_weights": true, + "release_date": "2026-02-19", + "last_updated": "2026-02-20", "type": "chat" }, { - "id": "gemini/gemini-3.5-flash", - "name": "Gemini 3.5 Flash", - "display_name": "Gemini 3.5 Flash", + "id": "muse-glimmer-30b-tr", + "name": "Muse Glimmer 30B (TR)", + "display_name": "Muse Glimmer 30B (TR)", "modalities": { "input": [ "text", - "image", - "audio", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 131072, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -58681,41 +57619,21 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", - "low", - "medium", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] - } - }, "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-05-19", - "last_updated": "2026-05-19", + "open_weights": true, + "knowledge": "2026-01-04", + "release_date": "2026-08-10", + "last_updated": "2026-08-10", "type": "chat" }, { - "id": "gemini/gemini-3.5-flash-lite", - "name": "Gemini 3.5 Flash Lite", - "display_name": "Gemini 3.5 Flash Lite", + "id": "qwen3-6-35b", + "name": "Qwen3.6 35B-A3B", + "display_name": "Qwen3.6 35B-A3B", "modalities": { "input": [ "text", "image", - "audio", "video" ], "output": [ @@ -58723,100 +57641,64 @@ ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 16384, + "output": 16384 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "minimal", - "low", - "medium", - "high" - ] - } - }, "attachment": true, - "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-07-21", - "last_updated": "2026-07-21", + "open_weights": true, + "release_date": "2026-04-17", + "last_updated": "2026-04-17", "type": "chat" }, { - "id": "gemini/gemini-3.1-pro-preview", - "name": "Gemini 3.1 Pro Preview", - "display_name": "Gemini 3.1 Pro Preview", + "id": "magibu-11b-v8", + "name": "Magibu 11B v8", + "display_name": "Magibu 11B v8", "modalities": { "input": [ - "text", - "image", - "audio", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 8192, + "output": 8192 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "low", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-02-19", - "last_updated": "2026-02-19", + "release_date": "2026-06-05", + "last_updated": "2026-08-16", "type": "chat" }, { - "id": "gemini/gemini-2.5-flash", - "name": "Gemini 2.5 Flash", - "display_name": "Gemini 2.5 Flash", + "id": "gemma-4", + "name": "Gemma 4", + "display_name": "Gemma 4", "modalities": { "input": [ "text", - "image", - "video", - "audio" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 131072, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -58824,205 +57706,115 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "budget", - "budget": { - "default": -1, - "min": 0, - "max": 24576, - "auto": -1, - "off": 0, - "unit": "tokens" - }, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] - } - }, "attachment": true, - "open_weights": false, + "open_weights": true, "knowledge": "2025-01", - "release_date": "2025-06-17", - "last_updated": "2025-06-17", + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "gemini/gemini-3.8-flash", - "name": "Gemini 3.8 Flash", - "display_name": "Gemini 3.8 Flash", + "id": "medgemma-4b", + "name": "MedGemma 4B", + "display_name": "MedGemma 4B", "modalities": { "input": [ "text", - "image", - "audio", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 8192, + "output": 8192 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", - "low", - "medium", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] - } + "supported": false }, "attachment": true, - "open_weights": false, - "release_date": "2026-09-02", - "last_updated": "2026-09-02", + "open_weights": true, + "release_date": "2026-04-26", + "last_updated": "2026-08-16", "type": "chat" }, { - "id": "gemini/gemini-3.7-flash", - "name": "Gemini 3.7 Flash", - "display_name": "Gemini 3.7 Flash", + "id": "publicai/apertus-8b-instruct", + "name": "Apertus 8B Instruct", + "display_name": "Apertus 8B Instruct", "modalities": { "input": [ - "text", - "image", - "audio", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 65536, + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", - "low", - "medium", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-08-13", - "last_updated": "2026-08-13", + "attachment": false, + "open_weights": true, + "knowledge": "2025-09", + "release_date": "2025-09-02", + "last_updated": "2025-09-02", "type": "chat" }, { - "id": "gemini/gemini-2.5-flash-lite", - "name": "Gemini 2.5 Flash-Lite", - "display_name": "Gemini 2.5 Flash-Lite", + "id": "publicai/apertus-70b-instruct", + "name": "Apertus 70B Instruct", + "display_name": "Apertus 70B Instruct", "modalities": { "input": [ - "text", - "image", - "audio", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 65536, + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "default": -1, - "min": 512, - "max": 24576, - "auto": -1, - "unit": "tokens" - }, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-06-17", - "last_updated": "2025-06-17", + "attachment": false, + "open_weights": true, + "knowledge": "2025-09", + "release_date": "2025-09-02", + "last_updated": "2025-09-02", "type": "chat" }, { - "id": "gemini/gemini-3-flash-preview", - "name": "Gemini 3 Flash Preview", - "display_name": "Gemini 3 Flash Preview", + "id": "sakana/fugu-ultra", + "name": "Fugu Ultra", + "display_name": "Fugu Ultra", "modalities": { "input": [ "text", - "image", - "video", - "audio" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 1000000, + "output": 1000000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -59030,48 +57822,33 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", - "low", - "medium", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" + "effort_options": [ + "high", + "xhigh" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-12-17", - "last_updated": "2025-12-17", + "release_date": "2026-06-15", + "last_updated": "2026-06-15", "type": "chat" }, { - "id": "gemini/gemini-3.6-flash", - "name": "Gemini 3.6 Flash", - "display_name": "Gemini 3.6 Flash", + "id": "poolside/laguna-xs-2.1", + "name": "Laguna XS 2.1", + "display_name": "Laguna XS 2.1", "modalities": { "input": [ - "text", - "image", - "audio", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 262144, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -59081,47 +57858,30 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", - "low", - "medium", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] + "supported": true } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-07-21", - "last_updated": "2026-07-21", + "attachment": false, + "open_weights": true, + "release_date": "2026-07-02", + "last_updated": "2026-07-02", "type": "chat" }, { - "id": "minimax/minimax-m3", - "name": "MiniMax-M3", - "display_name": "MiniMax-M3", + "id": "mimo/mimo-v2.5-pro", + "name": "MiMo-V2.5-Pro", + "display_name": "MiMo-V2.5-Pro", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1024000, - "output": 512000 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -59129,31 +57889,30 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-06-01", - "last_updated": "2026-06-01", + "knowledge": "2024-12", + "release_date": "2026-04-22", + "last_updated": "2026-04-22", "type": "chat" }, { - "id": "minimax/minimax-m2.7", - "name": "MiniMax-M2.7", - "display_name": "MiniMax-M2.7", + "id": "mimo/mimo-v2.5", + "name": "MiMo-V2.5", + "display_name": "MiMo-V2.5", "modalities": { "input": [ - "text" + "text", + "image", + "audio", + "video" ], "output": [ "text" ] }, "limit": { - "context": 204800, + "context": 1000000, "output": 131072 }, "temperature": true, @@ -59162,79 +57921,60 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-03-18", - "last_updated": "2026-03-18", + "knowledge": "2024-12", + "release_date": "2026-04-22", + "last_updated": "2026-04-22", "type": "chat" }, { - "id": "x-ai/grok-4.3", - "name": "Grok 4.3", - "display_name": "Grok 4.3", + "id": "mistral/voxtral-small-latest", + "name": "Voxtral Small (latest)", + "display_name": "Voxtral Small (latest)", "modalities": { "input": [ "text", - "image" + "audio" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 1000000 + "context": 32000, + "output": 32000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "none", - "low", - "medium", - "high" - ] - } + "supported": false }, "attachment": true, - "open_weights": false, - "release_date": "2026-04-17", - "last_updated": "2026-04-17", + "open_weights": true, + "release_date": "2025-07-15", + "last_updated": "2025-07-15", "type": "chat" }, { - "id": "x-ai/grok-4.5", - "name": "Grok 4.5", - "display_name": "Grok 4.5", + "id": "meta/muse-spark-1.2-contributor", + "name": "Muse Spark 1.2 Contributor", + "display_name": "Muse Spark 1.2 Contributor", "modalities": { "input": [ "text", - "image" + "image", + "video", + "pdf", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 500000, - "output": 500000 + "context": 1048576, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -59244,76 +57984,67 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ + "minimal", "low", "medium", - "high" + "high", + "xhigh" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-07-08", - "last_updated": "2026-07-08", + "release_date": "2026-08-05", + "last_updated": "2026-08-05", "type": "chat" }, { - "id": "x-ai/grok-4.7", - "name": "Grok 4.7", - "display_name": "Grok 4.7", + "id": "perplexity/sonar-deep-research", + "name": "Sonar Deep Research", + "display_name": "Sonar Deep Research", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 500000, - "output": 500000 + "context": 128000, + "output": 32768 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ] - } - }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2026-05", - "release_date": "2026-09-21", - "last_updated": "2026-09-21", + "knowledge": "2025-01", + "release_date": "2025-02-01", + "last_updated": "2025-09-01", "type": "chat" }, { - "id": "x-ai/grok-build-0.1", - "name": "Grok Build 0.1", - "display_name": "Grok Build 0.1", + "id": "thinkingmachines/inkling", + "name": "Inkling", + "display_name": "Inkling", "modalities": { "input": [ "text", - "image" + "image", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 256000 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, @@ -59323,31 +58054,39 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "effort_options": [ + "none", + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "attachment": true, - "open_weights": false, - "release_date": "2026-04-16", - "last_updated": "2026-04-16", + "open_weights": true, + "release_date": "2026-07-15", + "last_updated": "2026-07-15", "type": "chat" }, { - "id": "x-ai/grok-4.6", - "name": "Grok 4.6", - "display_name": "Grok 4.6", + "id": "thinkingmachines/inkling-small", + "name": "Inkling Small", + "display_name": "Inkling Small", "modalities": { "input": [ "text", - "image" + "image", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 500000, - "output": 500000 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, @@ -59357,8 +58096,9 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ + "none", + "minimal", "low", "medium", "high", @@ -59367,82 +58107,66 @@ } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-02-01", - "release_date": "2026-08-12", - "last_updated": "2026-08-12", + "open_weights": true, + "release_date": "2026-07-30", + "last_updated": "2026-07-30", "type": "chat" }, { - "id": "openai/gpt-5.4-mini", - "name": "GPT-5.4 mini", - "display_name": "GPT-5.4 mini", + "id": "upstage/solar-pro3", + "name": "Solar Pro 3", + "display_name": "Solar Pro 3", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 131072, + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ "low", "medium", "high" - ], - "visibility": "hidden" + ] } }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-17", - "last_updated": "2026-03-17", + "knowledge": "2025-07", + "release_date": "2026-01-26", + "last_updated": "2026-03-23", "type": "chat" }, { - "id": "openai/gpt-5.6-sol", - "name": "GPT-5.6 Sol", - "display_name": "GPT-5.6 Sol", + "id": "upstage/solar-pro4", + "name": "Solar Pro 4", + "display_name": "Solar Pro 4", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 524288, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -59450,52 +58174,41 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", "effort_options": [ "none", + "minimal", "low", "medium", "high", "xhigh", "max" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + ] } }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "knowledge": "2026-02", + "release_date": "2026-08-06", + "last_updated": "2026-08-06", "type": "chat" }, { - "id": "openai/gpt-5.5-pro", - "name": "GPT-5.5 Pro", - "display_name": "GPT-5.5 Pro", + "id": "upstage/solar-pro2", + "name": "Solar Pro 2", + "display_name": "Solar Pro 2", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 65536, + "output": 8192 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -59503,37 +58216,38 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ - "medium", - "high", - "xhigh" + "minimal", + "high" ] } }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-12-01", - "release_date": "2026-04-23", - "last_updated": "2026-04-23", + "knowledge": "2025-03", + "release_date": "2025-05-20", + "last_updated": "2025-05-20", "type": "chat" }, { - "id": "openai/gpt-5.4-nano", - "name": "GPT-5.4 nano", - "display_name": "GPT-5.4 nano", + "id": "google/gemini-2.5-flash-lite", + "name": "Gemini 2.5 Flash-Lite", + "display_name": "Gemini 2.5 Flash-Lite", "modalities": { "input": [ "text", - "image" + "image", + "audio", + "video", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -59545,49 +58259,47 @@ "reasoning": { "supported": true, "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "mode": "budget", + "budget": { + "default": -1, + "min": 512, + "max": 24576, + "auto": -1, + "unit": "tokens" + }, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-17", - "last_updated": "2026-03-17", + "knowledge": "2025-01", + "release_date": "2025-06-17", + "last_updated": "2025-06-17", "type": "chat" }, { - "id": "openai/gpt-5.6-luna", - "name": "GPT-5.6 Luna", - "display_name": "GPT-5.6 Luna", + "id": "qwen/qwen3.6-plus", + "name": "Qwen3.6 Plus", + "display_name": "Qwen3.6 Plus", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1000000, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -59596,51 +58308,38 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "knowledge": "2025-04", + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "openai/gpt-5.6-terra", - "name": "GPT-5.6 Terra", - "display_name": "GPT-5.6 Terra", + "id": "qwen/qwen3-max", + "name": "Qwen3 Max", + "display_name": "Qwen3 Max", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 256000, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -59649,51 +58348,40 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "knowledge": "2025-04", + "release_date": "2025-09-23", + "last_updated": "2025-09-23", "type": "chat" }, { - "id": "openai/gpt-6-sol", - "name": "GPT-6 Sol", - "display_name": "GPT-6 Sol", + "id": "qwen/qwen3.5-plus", + "name": "Qwen3.5 Plus", + "display_name": "Qwen3.5 Plus", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1000000, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -59701,41 +58389,39 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-04-20", - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "knowledge": "2025-04", + "release_date": "2026-02-16", + "last_updated": "2026-02-16", "type": "chat" }, { - "id": "openai/gpt-6.1-sol", - "name": "GPT-6.1 Sol", - "display_name": "GPT-6.1 Sol", + "id": "qwen/qwen-plus", + "name": "Qwen Plus", + "display_name": "Qwen Plus", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1000000, + "output": 32768 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -59743,92 +58429,81 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2026-04-30", - "release_date": "2026-09-29", - "last_updated": "2026-09-29", + "knowledge": "2024-04", + "release_date": "2024-01-25", + "last_updated": "2025-09-11", "type": "chat" }, { - "id": "openai/gpt-5.4", - "name": "GPT-5.4", - "display_name": "GPT-5.4", + "id": "qwen/qwen-flash", + "name": "Qwen Flash", + "display_name": "Qwen Flash", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1000000, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-05", - "last_updated": "2026-03-05", + "knowledge": "2024-04", + "release_date": "2025-07-28", + "last_updated": "2025-07-28", "type": "chat" }, { - "id": "openai/gpt-6-astra", - "name": "GPT-6 Astra", - "display_name": "GPT-6 Astra", + "id": "qwen/qwen3.6-flash", + "name": "Qwen3.6 Flash", + "display_name": "Qwen3.6 Flash", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1000000, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -59837,120 +58512,95 @@ "extra_capabilities": { "reasoning": { "supported": true, - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-04-30", - "release_date": "2026-09-04", - "last_updated": "2026-09-04", + "release_date": "2026-04-27", + "last_updated": "2026-04-27", "type": "chat" }, { - "id": "openai/gpt-5.5", - "name": "GPT-5.5", - "display_name": "GPT-5.5", + "id": "qwen/qwen3-coder-plus", + "name": "Qwen3 Coder Plus", + "display_name": "Qwen3 Coder Plus", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1000000, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-12-01", - "release_date": "2026-04-23", - "last_updated": "2026-04-23", + "knowledge": "2025-04", + "release_date": "2025-07-23", + "last_updated": "2025-07-23", "type": "chat" }, { - "id": "openai/gpt-4o-mini", - "name": "GPT-4o mini", - "display_name": "GPT-4o mini", + "id": "qwen/qwen3-coder-flash", + "name": "Qwen3 Coder Flash", + "display_name": "Qwen3 Coder Flash", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 1000000, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2023-09", - "release_date": "2024-07-18", - "last_updated": "2024-07-18", + "knowledge": "2025-04", + "release_date": "2025-07-28", + "last_updated": "2025-07-28", "type": "chat" }, { - "id": "openai/gpt-6-luna", - "name": "GPT-6 Luna", - "display_name": "GPT-6 Luna", + "id": "qwen/qwen3.5-397b-a17b", + "name": "Qwen3.5 397B-A17B", + "display_name": "Qwen3.5 397B-A17B", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 256000, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -59958,21 +58608,19 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-05-18", - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "open_weights": true, + "release_date": "2026-02-15", + "last_updated": "2026-02-15", "type": "chat" }, { @@ -60012,22 +58660,21 @@ "type": "chat" }, { - "id": "qwen/qwen3.8-max", - "name": "Qwen3.8 Max", - "display_name": "Qwen3.8 Max", + "id": "qwen/qwen3-vl-plus", + "name": "Qwen3-VL Plus", + "display_name": "Qwen3-VL Plus", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 256000, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -60038,28 +58685,37 @@ "extra_capabilities": { "reasoning": { "supported": true, - "effort_options": [ - "low", - "medium", - "xhigh" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-08-03", - "last_updated": "2026-08-03", + "knowledge": "2025-04", + "release_date": "2025-09-23", + "last_updated": "2025-09-23", "type": "chat" - }, + } + ] + }, + "melious": { + "id": "melious", + "name": "Melious", + "display_name": "Melious", + "api": "https://api.melious.ai/v1", + "doc": "https://melious.ai/docs/reference/models", + "models": [ { - "id": "qwen/qwen3.7-flash", - "name": "Qwen3.7 Flash", - "display_name": "Qwen3.7 Flash", + "id": "deepseek-v4-flash-0731", + "name": "DeepSeek V4 Flash 0731", + "display_name": "DeepSeek V4 Flash 0731", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" @@ -60067,7 +58723,7 @@ }, "limit": { "context": 1000000, - "output": 65536 + "output": 384000 }, "temperature": true, "tool_call": true, @@ -60077,24 +58733,36 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "none", + "low", + "high", + "max" + ] } }, - "attachment": true, - "open_weights": false, - "release_date": "2026-07-15", - "last_updated": "2026-07-15", + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-07-31", + "last_updated": "2026-07-31", "type": "chat" }, { - "id": "qwen/qwen3.6-plus", - "name": "Qwen3.6 Plus", - "display_name": "Qwen3.6 Plus", + "id": "deepseek-v4.1-flash", + "name": "DeepSeek V4.1 Flash", + "display_name": "DeepSeek V4.1 Flash", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" @@ -60102,7 +58770,7 @@ }, "limit": { "context": 1000000, - "output": 65536 + "output": 384000 }, "temperature": true, "tool_call": true, @@ -60118,25 +58786,29 @@ "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "effort_options": [ + "none", + "low", + "high", + "max" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-04", - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-09-10", + "last_updated": "2026-09-10", "type": "chat" }, { - "id": "qwen/qwen3.6-flash", - "name": "Qwen3.6 Flash", - "display_name": "Qwen3.6 Flash", + "id": "glm-5.3", + "name": "GLM-5.3", + "display_name": "GLM-5.3", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" @@ -60144,7 +58816,7 @@ }, "limit": { "context": 1000000, - "output": 65536 + "output": 131072 }, "temperature": true, "tool_call": true, @@ -60160,32 +58832,39 @@ "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "effort_options": [ + "low", + "high", + "max" ] } }, - "attachment": true, - "open_weights": false, - "release_date": "2026-04-27", - "last_updated": "2026-04-27", + "attachment": false, + "open_weights": true, + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "qwen/qwen3.7-max", - "name": "Qwen3.7 Max", - "display_name": "Qwen3.7 Max", + "id": "kimi-k2.7-code", + "name": "Kimi K2.7 Code", + "display_name": "Kimi K2.7 Code", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 262144, + "output": 262144 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -60193,19 +58872,26 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, - "attachment": false, - "open_weights": false, - "release_date": "2026-05-21", - "last_updated": "2026-05-21", + "attachment": true, + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-06-12", + "last_updated": "2026-06-12", "type": "chat" }, { - "id": "qwen/qwen3.8-flash", - "name": "Qwen3.8 Flash", - "display_name": "Qwen3.8 Flash", + "id": "kimi-k2.6", + "name": "Kimi K2.6", + "display_name": "Kimi K2.6", "modalities": { "input": [ "text", @@ -60217,8 +58903,8 @@ ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 256000, + "output": 256000 }, "temperature": true, "tool_call": true, @@ -60229,29 +58915,29 @@ "extra_capabilities": { "reasoning": { "supported": true, - "effort_options": [ - "low", - "medium", - "xhigh" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, "attachment": true, - "open_weights": false, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-04-20", + "last_updated": "2026-04-20", "type": "chat" }, { - "id": "qwen/qwen3.8-omni-flash", - "name": "Qwen3.8 Omni Flash", - "display_name": "Qwen3.8 Omni Flash", + "id": "deepseek-v4.1-flash-1017", + "name": "DeepSeek V4.1 Flash 1017", + "display_name": "DeepSeek V4.1 Flash 1017", "modalities": { "input": [ "text", - "image", - "audio", - "video" + "image" ], "output": [ "text" @@ -60259,7 +58945,7 @@ }, "limit": { "context": 1000000, - "output": 131072 + "output": 384000 }, "temperature": true, "tool_call": true, @@ -60269,36 +58955,47 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ + "none", "low", - "medium", - "xhigh" + "high", + "max" ] } }, "attachment": true, - "open_weights": false, - "release_date": "2026-09-17", - "last_updated": "2026-09-17", + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-10-17", + "last_updated": "2026-10-17", "type": "chat" }, { - "id": "tencent/hy3", - "name": "Hy3", - "display_name": "Hy3", + "id": "kimi-k3", + "name": "Kimi K3", + "display_name": "Kimi K3", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 262144, + "context": 1000000, "output": 131072 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -60307,34 +59004,43 @@ "extra_capabilities": { "reasoning": { "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ "none", "low", - "high" + "high", + "max" ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-07-06", - "last_updated": "2026-07-06", + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" }, { - "id": "tencent/hy4-preview", - "name": "Hy4 preview", - "display_name": "Hy4 preview", + "id": "glm-5.3-flash", + "name": "GLM-5.3-Flash", + "display_name": "GLM-5.3-Flash", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -60345,22 +59051,38 @@ "extra_capabilities": { "reasoning": { "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ - "none", - "high" + "low", + "high", + "max" ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-08-28", - "last_updated": "2026-08-28", + "release_date": "2026-08-26", + "last_updated": "2026-08-26", "type": "chat" - }, + } + ] + }, + "aimlapi": { + "id": "aimlapi", + "name": "AI/ML API", + "display_name": "AI/ML API", + "api": "https://api.aimlapi.com/v1", + "doc": "https://docs.aimlapi.com", + "models": [ { - "id": "z-ai/glm-5.1", - "name": "GLM-5.1", - "display_name": "GLM-5.1", + "id": "relace/relace-search", + "name": "Search", + "display_name": "Search", "modalities": { "input": [ "text" @@ -60370,30 +59092,24 @@ ] }, "limit": { - "context": 200000, + "context": 256000, "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, "attachment": false, - "open_weights": true, - "release_date": "2026-04-07", - "last_updated": "2026-04-07", + "open_weights": false, + "release_date": "2025-12-08", + "last_updated": "2025-12-08", "type": "chat" }, { - "id": "z-ai/glm-5", - "name": "GLM-5", - "display_name": "GLM-5", + "id": "relace/relace-apply-3", + "name": "Apply 3", + "display_name": "Apply 3", "modalities": { "input": [ "text" @@ -60403,36 +59119,24 @@ ] }, "limit": { - "context": 200000, + "context": 256000, "output": 128000 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": false, - "open_weights": true, - "release_date": "2026-02-12", - "last_updated": "2026-02-12", + "open_weights": false, + "release_date": "2025-09-26", + "last_updated": "2025-09-26", "type": "chat" }, { - "id": "z-ai/glm-5.3", - "name": "GLM-5.3", - "display_name": "GLM-5.3", + "id": "meta-llama/Llama-3.3-70B-Instruct-Turbo", + "name": "Llama 3.3 70B Instruct Turbo", + "display_name": "Llama 3.3 70B Instruct Turbo", "modalities": { "input": [ "text" @@ -60442,35 +59146,25 @@ ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 128000, + "output": 127000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "low", - "high", - "max" - ] - } + "supported": false }, "attachment": false, "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "knowledge": "2023-12", + "release_date": "2024-12-06", + "last_updated": "2024-12-06", "type": "chat" }, { - "id": "z-ai/glm-5.2", - "name": "GLM-5.2", - "display_name": "GLM-5.2", + "id": "cognitivecomputations/dolphin-mistral-24b-venice-edition", + "name": "Venice Uncensored", + "display_name": "Venice Uncensored", "modalities": { "input": [ "text" @@ -60480,70 +59174,53 @@ ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 128000, + "output": 8192 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, "attachment": false, "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "knowledge": "2024-04-30", + "release_date": "2025-07-09", + "last_updated": "2025-07-09", "type": "chat" }, { - "id": "z-ai/glm-5.3-flash", - "name": "GLM-5.3-Flash", - "display_name": "GLM-5.3-Flash", + "id": "anthracite-org/magnum-v4-72b", + "name": "Magnum v4 72B", + "display_name": "Magnum v4 72B", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 32000, + "output": 16384 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "low", - "high", - "max" - ] - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", + "knowledge": "2024-06-30", + "release_date": "2024-10-22", + "last_updated": "2024-10-22", "type": "chat" }, { - "id": "z-ai/glm-5-turbo", - "name": "GLM-5-Turbo", - "display_name": "GLM-5-Turbo", + "id": "moonshotai/kimi-k2", + "name": "Kimi K2 0711", + "display_name": "Kimi K2 0711", "modalities": { "input": [ "text" @@ -60553,30 +59230,25 @@ ] }, "limit": { - "context": 200000, - "output": 128000 + "context": 131072, + "output": 98304 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2026-03-16", - "last_updated": "2026-03-16", + "open_weights": true, + "knowledge": "2024-12-31", + "release_date": "2025-07-11", + "last_updated": "2025-07-11", "type": "chat" }, { - "id": "z-ai/glm-4.7", - "name": "GLM-4.7", - "display_name": "GLM-4.7", + "id": "moonshotai/kimi-k2-thinking", + "name": "Kimi K2 Thinking", + "display_name": "Kimi K2 Thinking", "modalities": { "input": [ "text" @@ -60586,8 +59258,8 @@ ] }, "limit": { - "context": 200000, - "output": 128000 + "context": 262144, + "output": 98304 }, "temperature": true, "tool_call": true, @@ -60608,15 +59280,15 @@ }, "attachment": false, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-12-22", - "last_updated": "2025-12-22", + "knowledge": "2024-08", + "release_date": "2025-11-06", + "last_updated": "2025-11-06", "type": "chat" }, { - "id": "deepseek/deepseek-v4-flash", - "name": "DeepSeek V4 Flash", - "display_name": "DeepSeek V4 Flash", + "id": "moonshotai/kimi-k2-0905", + "name": "Kimi K2 0905", + "display_name": "Kimi K2 0905", "modalities": { "input": [ "text" @@ -60626,48 +59298,24 @@ ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 262144, + "output": 98304 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." - ] - } + "supported": false }, "attachment": false, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "release_date": "2025-09-05", + "last_updated": "2025-09-05", "type": "chat" }, { - "id": "deepseek/deepseek-v4-pro", - "name": "DeepSeek V4 Pro", - "display_name": "DeepSeek V4 Pro", + "id": "deepseek/deepseek-v4-flash", + "name": "DeepSeek V4 Flash", + "display_name": "DeepSeek V4 Flash", "modalities": { "input": [ "text" @@ -60716,13 +59364,12 @@ "type": "chat" }, { - "id": "deepseek/deepseek-v4-flash-vision-exp", - "name": "DeepSeek V4 Flash Vision Exp", - "display_name": "DeepSeek V4 Flash Vision Exp", + "id": "deepseek/deepseek-chat", + "name": "DeepSeek V4 Flash", + "display_name": "DeepSeek V4 Flash", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" @@ -60741,29 +59388,24 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "high", - "max" - ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" ], - "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." + "effort_options": [ + "none", + "low", + "high" ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-08-21", - "last_updated": "2026-09-01", + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { @@ -60780,7 +59422,7 @@ ] }, "limit": { - "context": 1000000, + "context": 1048576, "output": 384000 }, "temperature": true, @@ -60794,10 +59436,7 @@ "supported": true, "effort_options": [ "low", - "medium", - "high", - "xhigh", - "max" + "high" ] } }, @@ -60809,9 +59448,9 @@ "type": "chat" }, { - "id": "anthropic/claude-haiku-5-5", - "name": "Claude Haiku 5.5", - "display_name": "Claude Haiku 5.5", + "id": "deepseek/deepseek-v4-flash-vision-exp", + "name": "DeepSeek V4 Flash Vision Exp", + "display_name": "DeepSeek V4 Flash Vision Exp", "modalities": { "input": [ "text", @@ -60822,10 +59461,10 @@ ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 1048576, + "output": 384000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -60833,30 +59472,39 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", "effort_options": [ "low", - "medium", "high", - "xhigh", "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-10-07", - "last_updated": "2026-10-07", + "open_weights": true, + "release_date": "2026-08-21", + "last_updated": "2026-09-01", "type": "chat" }, { - "id": "anthropic/claude-opus-4-7", - "name": "Claude Opus 4.7", - "display_name": "Claude Opus 4.7", + "id": "deepseek/deepseek-v4-pro", + "name": "DeepSeek V4 Pro", + "display_name": "DeepSeek V4 Pro", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" @@ -60864,113 +59512,185 @@ }, "limit": { "context": 1000000, - "output": 128000 + "output": 384000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, + "default_enabled": true, "mode": "effort", "effort": "high", "effort_options": [ "low", - "medium", "high", - "xhigh", "max" ], "interleaved": true, "summaries": true, - "visibility": "omitted", + "visibility": "summary", "continuation": [ "thinking_blocks" ], "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-04-16", - "last_updated": "2026-04-16", + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "anthropic/claude-haiku-4-5", - "name": "Claude Haiku 4.5 (latest)", - "display_name": "Claude Haiku 4.5 (latest)", + "id": "deepseek/deepseek-chat-v3-0324", + "name": "DeepSeek V3", + "display_name": "DeepSeek V3", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 128000, + "output": 124000 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "knowledge": "2024-07-31", + "release_date": "2025-03-24", + "last_updated": "2025-03-24", + "type": "chat" + }, + { + "id": "deepseek/deepseek-v4-pro-0813", + "name": "DeepSeek V4 Pro 0813", + "display_name": "DeepSeek V4 Pro 0813", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1048576, + "output": 384000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + "effort_options": [ + "none", + "low", + "high" ] } }, - "attachment": true, + "attachment": false, + "open_weights": true, + "release_date": "2026-08-13", + "last_updated": "2026-08-22", + "type": "chat" + }, + { + "id": "inference-net/schematron-v2-turbo", + "name": "Schematron V2 Turbo", + "display_name": "Schematron V2 Turbo", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 128000, + "output": 8192 + }, + "temperature": true, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, "open_weights": false, - "knowledge": "2025-02-28", - "release_date": "2025-10-15", - "last_updated": "2025-10-15", + "release_date": "2026-04-16", + "last_updated": "2026-04-16", "type": "chat" }, { - "id": "anthropic/claude-sonnet-5-5", - "name": "Claude Sonnet 5.5", - "display_name": "Claude Sonnet 5.5", + "id": "inference-net/schematron-v2-small", + "name": "Schematron V2 Small", + "display_name": "Schematron V2 Small", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 128000, + "output": 4096 + }, + "temperature": true, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": false, + "release_date": "2026-04-16", + "last_updated": "2026-04-16", + "type": "chat" + }, + { + "id": "openai/gpt-6.1-terra", + "name": "GPT-6.1 Terra", + "display_name": "GPT-6.1 Terra", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, + "context": 1050000, "output": 128000 }, "temperature": false, @@ -60984,37 +59704,34 @@ "effort_options": [ "low", "medium", - "high", - "xhigh", - "max" + "high" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-09-28", - "last_updated": "2026-09-28", + "knowledge": "2026-06-01", + "release_date": "2026-10-26", + "last_updated": "2026-10-26", "type": "chat" }, { - "id": "anthropic/claude-fable-5-1", - "name": "Claude Fable 5.1", - "display_name": "Claude Fable 5.1", + "id": "openai/gpt-oss-20b", + "name": "GPT OSS 20B", + "display_name": "GPT OSS 20B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 131000, + "output": 117964 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -61023,51 +59740,42 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], "interleaved": true, "summaries": true, - "visibility": "omitted", + "visibility": "summary", "continuation": [ "thinking_blocks" ], - "notes": [ - "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", - "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", - "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." + "effort_options": [ + "low", + "medium", + "high" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-09-01", - "last_updated": "2026-09-01", + "attachment": false, + "open_weights": true, + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "anthropic/claude-sonnet-5", - "name": "Claude Sonnet 5", - "display_name": "Claude Sonnet 5", + "id": "openai/gpt-5.6-terra", + "name": "GPT-5.6 Terra", + "display_name": "GPT-5.6 Terra", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, + "context": 1050000, "output": 128000 }, "temperature": false, @@ -61079,26 +59787,37 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ + "none", "low", "medium", "high", "xhigh", "max" - ] + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-30", - "last_updated": "2026-06-30", + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "anthropic/claude-opus-5-5", - "name": "Claude Opus 5.5", - "display_name": "Claude Opus 5.5", + "id": "openai/gpt-4o-2024-05-13", + "name": "GPT-4o (2024-05-13)", + "display_name": "GPT-4o (2024-05-13)", "modalities": { "input": [ "text", @@ -61109,48 +59828,37 @@ ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 128000, + "output": 16384 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ] - } + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "knowledge": "2023-09", + "release_date": "2024-05-13", + "last_updated": "2024-05-13", "type": "chat" }, { - "id": "anthropic/claude-opus-5", - "name": "Claude Opus 5", - "display_name": "Claude Opus 5", + "id": "openai/gpt-5.6-sol", + "name": "GPT-5.6 Sol", + "display_name": "GPT-5.6 Sol", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, + "context": 1050000, "output": 128000 }, "temperature": false, @@ -61162,26 +59870,37 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ + "none", "low", "medium", "high", "xhigh", "max" - ] + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2026-05", - "release_date": "2026-07-24", - "last_updated": "2026-07-24", + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "anthropic/claude-sonnet-4-6", - "name": "Claude Sonnet 4.6", - "display_name": "Claude Sonnet 4.6", + "id": "openai/gpt-5.4-mini", + "name": "GPT-5.4 Mini", + "display_name": "GPT-5.4 Mini", "modalities": { "input": [ "text", @@ -61192,7 +59911,7 @@ ] }, "limit": { - "context": 1000000, + "context": 400000, "output": 128000 }, "temperature": true, @@ -61205,108 +59924,77 @@ "reasoning": { "supported": true, "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", + "mode": "effort", + "effort": "none", "effort_options": [ + "none", "low", "medium", "high", - "max" + "xhigh" ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." - ] + "visibility": "hidden" } }, "attachment": true, "open_weights": false, "knowledge": "2025-08-31", - "release_date": "2026-02-17", - "last_updated": "2026-03-13", + "release_date": "2026-03-17", + "last_updated": "2026-03-17", "type": "chat" }, { - "id": "anthropic/claude-opus-4-8", - "name": "Claude Opus 4.8", - "display_name": "Claude Opus 4.8", + "id": "openai/gpt-4o", + "name": "GPT-4o", + "display_name": "GPT-4o", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 128000, + "output": 16384 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." - ] - } + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2026-01", - "release_date": "2026-05-28", - "last_updated": "2026-05-28", + "knowledge": "2023-09", + "release_date": "2024-05-13", + "last_updated": "2024-08-06", "type": "chat" }, { - "id": "anthropic/claude-fable-5", - "name": "Claude Fable 5", - "display_name": "Claude Fable 5", + "id": "openai/gpt-5.6-luna", + "name": "GPT-5.6 Luna", + "display_name": "GPT-5.6 Luna", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, + "context": 1050000, "output": 128000 }, "temperature": false, @@ -61320,95 +60008,102 @@ "supported": true, "default_enabled": true, "mode": "effort", - "effort": "high", + "effort": "medium", "effort_options": [ + "none", "low", "medium", "high", "xhigh", "max" ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" ], - "notes": [ - "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", - "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", - "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." - ] + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-09", - "last_updated": "2026-06-09", + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "xiaomi/mimo-v2.6-pro", - "name": "MiMo-V2.6-Pro", - "display_name": "MiMo-V2.6-Pro", + "id": "openai/gpt-5-2", + "name": "GPT-5.2", + "display_name": "GPT-5.2", "modalities": { "input": [ "text", - "image", - "audio", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 400000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", "effort_options": [ "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ "low", "medium", "high" - ] + ], + "visibility": "hidden" } }, "attachment": true, - "open_weights": true, - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2025-12-11", + "last_updated": "2025-12-11", "type": "chat" }, { - "id": "xiaomi/mimo-v2.6-flash", - "name": "MiMo-V2.6-Flash", - "display_name": "MiMo-V2.6-Flash", + "id": "openai/gpt-5.6-luna-pro", + "name": "GPT-5.6 Luna Pro", + "display_name": "GPT-5.6 Luna Pro", "modalities": { "input": [ "text", "image", - "audio", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -61416,6 +60111,13 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ "none", "low", @@ -61425,168 +60127,141 @@ } }, "attachment": true, - "open_weights": true, - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "open_weights": false, + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" - } - ] - }, - "the-grid-ai": { - "id": "the-grid-ai", - "name": "The Grid AI", - "display_name": "The Grid AI", - "api": "https://api.thegrid.ai/v1", - "doc": "https://thegrid.ai/docs", - "models": [ + }, { - "id": "minimax-latest", - "name": "MiniMax Latest", - "display_name": "MiniMax Latest", + "id": "openai/gpt-4.1", + "name": "GPT-4.1", + "display_name": "GPT-4.1", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 512000 + "context": 1047576, + "output": 32768 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "low", - "medium", - "high" - ] - } + "supported": false }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-07-06", - "last_updated": "2026-07-06", + "knowledge": "2024-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", "type": "chat" }, { - "id": "agent-prime", - "name": "Agent Prime", - "display_name": "Agent Prime", + "id": "openai/gpt-4o-2024-08-06", + "name": "GPT-4o", + "display_name": "GPT-4o", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 196608, - "output": 131072 + "context": 128000, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "low", - "medium", - "high" - ] - } + "supported": false }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-05-04", - "last_updated": "2026-07-15", + "knowledge": "2023-09", + "release_date": "2024-08-06", + "last_updated": "2024-08-06", "type": "chat" }, { - "id": "code-prime", - "name": "Code Prime", - "display_name": "Code Prime", + "id": "openai/gpt-5-4", + "name": "GPT-5.4", + "display_name": "GPT-5.4", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 196608, - "output": 131072 + "context": 1050000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], + "default_enabled": false, + "mode": "effort", + "effort": "none", "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ "low", "medium", "high" - ] + ], + "visibility": "hidden" } }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-05-04", - "last_updated": "2026-07-15", + "knowledge": "2025-08-31", + "release_date": "2026-03-05", + "last_updated": "2026-03-05", "type": "chat" }, { - "id": "kimi-latest", - "name": "Kimi Latest", - "display_name": "Kimi Latest", + "id": "openai/gpt-5.6-sol-pro", + "name": "GPT-5.6 Sol Pro", + "display_name": "GPT-5.6 Sol Pro", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 943718 + "context": 1050000, + "output": 128000 }, "temperature": false, "tool_call": true, @@ -61604,67 +60279,76 @@ "thinking_blocks" ], "effort_options": [ + "none", "low", - "high", - "max" + "medium", + "high" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-07-06", - "last_updated": "2026-07-06", + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "gemini-pro-latest", - "name": "Gemini Pro Latest", - "display_name": "Gemini Pro Latest", + "id": "openai/gpt-5.4-image-2", + "name": "GPT-5.4 Image 2", + "display_name": "GPT-5.4 Image 2", "modalities": { "input": [ + "image", "text", - "image" + "pdf" ], "output": [ + "image", "text" ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 272000, + "output": 128000 }, "temperature": false, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], + "default_enabled": false, + "mode": "effort", + "effort": "none", "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ "low", "medium", "high" - ] + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "release_date": "2026-07-06", - "last_updated": "2026-07-06", - "type": "chat" + "release_date": "2026-04-21", + "last_updated": "2026-04-21" }, { - "id": "agent-max", - "name": "Agent Max", - "display_name": "Agent Max", + "id": "openai/o3-pro", + "name": "o3 Pro", + "display_name": "o3 Pro", "modalities": { "input": [ "text", @@ -61675,8 +60359,8 @@ ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 200000, + "output": 100000 }, "temperature": false, "tool_call": true, @@ -61687,45 +60371,48 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ "low", "medium", - "high", - "xhigh", - "max" + "high" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-05-04", - "last_updated": "2026-07-30", + "knowledge": "2024-05", + "release_date": "2025-06-10", + "last_updated": "2025-06-10", "type": "chat" }, { - "id": "gpt-sol-latest", - "name": "GPT Sol Latest", - "display_name": "GPT Sol Latest", + "id": "openai/gpt-5.3-codex", + "name": "GPT-5.3 Codex", + "display_name": "GPT-5.3 Codex", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, + "context": 400000, "output": 128000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -61734,29 +60421,40 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "effort_options": [ - "low", - "medium", - "high" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-07-06", - "last_updated": "2026-07-06", + "knowledge": "2025-08-31", + "release_date": "2026-02-05", + "last_updated": "2026-02-05", "type": "chat" }, { - "id": "code-standard", - "name": "Code Standard", - "display_name": "Code Standard", + "id": "openai/gpt-oss-safeguard-20b", + "name": "gpt-oss-safeguard-20b", + "display_name": "gpt-oss-safeguard-20b", "modalities": { "input": [ "text" @@ -61766,7 +60464,7 @@ ] }, "limit": { - "context": 128000, + "context": 131072, "output": 65536 }, "temperature": true, @@ -61777,13 +60475,6 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ "low", "medium", @@ -61792,26 +60483,57 @@ } }, "attachment": false, - "open_weights": false, - "release_date": "2026-05-04", - "last_updated": "2026-10-06", + "open_weights": true, + "release_date": "2025-10-29", + "last_updated": "2025-10-29", "type": "chat" }, { - "id": "glm-latest", - "name": "GLM Latest", - "display_name": "GLM Latest", + "id": "openai/gpt-4o-2024-11-20", + "name": "GPT-4o", + "display_name": "GPT-4o", "modalities": { "input": [ + "text", + "image" + ], + "output": [ "text" + ] + }, + "limit": { + "context": 128000, + "output": 16384 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": false, + "knowledge": "2023-09", + "release_date": "2024-11-20", + "last_updated": "2024-11-20", + "type": "chat" + }, + { + "id": "openai/gpt-6-luna", + "name": "GPT-6 Luna", + "display_name": "GPT-6 Luna", + "modalities": { + "input": [ + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 1050000, + "output": 128000 }, "temperature": false, "tool_call": true, @@ -61821,30 +60543,25 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ + "none", "low", - "high", - "max" + "medium", + "high" ] } }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-07-06", - "last_updated": "2026-08-18", + "knowledge": "2026-05-18", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "claude-opus-latest", - "name": "Claude Opus Latest", - "display_name": "Claude Opus Latest", + "id": "openai/gpt-5-mini", + "name": "GPT-5 Mini", + "display_name": "GPT-5 Mini", "modalities": { "input": [ "text", @@ -61855,7 +60572,7 @@ ] }, "limit": { - "context": 1000000, + "context": 400000, "output": 128000 }, "temperature": false, @@ -61867,42 +60584,53 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "minimal", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-07-06", - "last_updated": "2026-07-30", + "knowledge": "2024-05-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "deepseek-pro-latest", - "name": "DeepSeek Pro Latest", - "display_name": "DeepSeek Pro Latest", + "id": "openai/gpt-5-5", + "name": "GPT-5.5", + "display_name": "GPT-5.5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 1050000, + "output": 128000 }, "temperature": false, "tool_call": true, @@ -61913,40 +60641,48 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ "low", "medium", "high" - ] + ], + "visibility": "hidden" } }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-07-06", - "last_updated": "2026-07-06", + "knowledge": "2025-12-01", + "release_date": "2026-04-23", + "last_updated": "2026-04-23", "type": "chat" }, { - "id": "bytedance-pro-latest", - "name": "ByteDance Pro Latest", - "display_name": "ByteDance Pro Latest", + "id": "openai/gpt-6-sol", + "name": "GPT-6 Sol", + "display_name": "GPT-6 Sol", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 131072 + "context": 1050000, + "output": 128000 }, "temperature": false, "tool_call": true, @@ -61956,30 +60692,25 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ + "none", "low", "medium", "high" ] } }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-07-06", - "last_updated": "2026-07-06", + "knowledge": "2026-04-20", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "text-standard", - "name": "Text Standard", - "display_name": "Text Standard", + "id": "openai/gpt-oss-120b", + "name": "GPT OSS 120B", + "display_name": "GPT OSS 120B", "modalities": { "input": [ "text" @@ -61989,8 +60720,8 @@ ] }, "limit": { - "context": 128000, - "output": 65536 + "context": 131000, + "output": 117964 }, "temperature": true, "tool_call": true, @@ -62015,15 +60746,16 @@ } }, "attachment": false, - "open_weights": false, - "release_date": "2026-02-26", - "last_updated": "2026-10-06", + "open_weights": true, + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "code-max", - "name": "Code Max", - "display_name": "Code Max", + "id": "openai/gpt-5.4-pro", + "name": "GPT-5.4 Pro", + "display_name": "GPT-5.4 Pro", "modalities": { "input": [ "text", @@ -62034,7 +60766,7 @@ ] }, "limit": { - "context": 1000000, + "context": 1050000, "output": 128000 }, "temperature": false, @@ -62046,31 +60778,39 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-05-04", - "last_updated": "2026-07-30", + "knowledge": "2025-08-31", + "release_date": "2026-03-05", + "last_updated": "2026-03-05", "type": "chat" }, { - "id": "text-max", - "name": "Text Max", - "display_name": "Text Max", + "id": "openai/gpt-5.1-codex-max", + "name": "GPT-5.1-Codex-Max", + "display_name": "GPT-5.1-Codex-Max", "modalities": { "input": [ "text", @@ -62081,56 +60821,66 @@ ] }, "limit": { - "context": 1000000, + "context": 400000, "output": 128000 }, "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-02-26", - "last_updated": "2026-07-30", + "knowledge": "2024-09-30", + "release_date": "2025-11-13", + "last_updated": "2025-11-13", "type": "chat" }, { - "id": "agent-standard", - "name": "Agent Standard", - "display_name": "Agent Standard", + "id": "openai/gpt-5", + "name": "GPT-5", + "display_name": "GPT-5", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 65536 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -62139,12 +60889,62 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "minimal", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" - ], + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2024-09-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", + "type": "chat" + }, + { + "id": "openai/gpt-6.1-sol", + "name": "GPT-6.1 Sol", + "display_name": "GPT-6.1 Sol", + "modalities": { + "input": [ + "text", + "image", + "pdf" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1050000, + "output": 128000 + }, + "temperature": false, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { "effort_options": [ "low", "medium", @@ -62152,69 +60952,68 @@ ] } }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-05-04", - "last_updated": "2026-10-06", + "knowledge": "2026-04-30", + "release_date": "2026-09-29", + "last_updated": "2026-09-29", "type": "chat" }, { - "id": "text-prime", - "name": "Text Prime", - "display_name": "Text Prime", + "id": "openai/gpt-5-1", + "name": "GPT-5.1", + "display_name": "GPT-5.1", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 196608, - "output": 131072 + "context": 400000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], + "default_enabled": false, + "mode": "effort", + "effort": "none", "effort_options": [ + "none", "low", "medium", "high" - ] + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-02-26", - "last_updated": "2026-07-15", + "knowledge": "2024-09-30", + "release_date": "2025-11-13", + "last_updated": "2025-11-13", "type": "chat" - } - ] - }, - "openreason": { - "id": "openreason", - "name": "OpenReason", - "display_name": "OpenReason", - "api": "https://api.openreason.app/v1", - "doc": "https://openreason.app/docs", - "models": [ + }, { - "id": "moonshotai/kimi-k2.7-code", - "name": "Kimi K2.7 Code", - "display_name": "Kimi K2.7 Code", + "id": "openai/gpt-5-pro", + "name": "GPT-5 Pro", + "display_name": "GPT-5 Pro", "modalities": { "input": [ "text", @@ -62225,10 +61024,10 @@ ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 400000, + "output": 272000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -62237,6 +61036,15 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "fixed", + "effort": "high", + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], "interleaved": true, "summaries": true, "visibility": "summary", @@ -62246,30 +61054,84 @@ } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-06-12", - "last_updated": "2026-06-12", + "open_weights": false, + "knowledge": "2024-09-30", + "release_date": "2025-10-06", + "last_updated": "2025-10-06", "type": "chat" }, { - "id": "openai/gpt-oss-120b", - "name": "GPT OSS 120B", - "display_name": "GPT OSS 120B", + "id": "openai/gpt-5.4-nano", + "name": "GPT-5.4 Nano", + "display_name": "GPT-5.4 Nano", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 400000, + "output": 128000 }, "temperature": true, "tool_call": true, + "reasoning": { + "supported": true, + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-03-17", + "last_updated": "2026-03-17", + "type": "chat" + }, + { + "id": "openai/gpt-5.5-pro", + "name": "GPT-5.5 Pro", + "display_name": "GPT-5.5 Pro", + "modalities": { + "input": [ + "text", + "image", + "pdf" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1050000, + "output": 128000 + }, + "temperature": false, + "tool_call": true, "reasoning": { "supported": true, "default": true @@ -62284,36 +61146,36 @@ "thinking_blocks" ], "effort_options": [ - "low", "medium", "high" ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "attachment": true, + "open_weights": false, + "knowledge": "2025-12-01", + "release_date": "2026-04-23", + "last_updated": "2026-04-23", "type": "chat" }, { - "id": "deepseek-ai/deepseek-v4-flash-0731", - "name": "DeepSeek V4 Flash 0731", - "display_name": "DeepSeek V4 Flash 0731", + "id": "openai/gpt-5.2-pro", + "name": "GPT-5.2 Pro", + "display_name": "GPT-5.2 Pro", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -62322,48 +61184,43 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "effort_options": [ - "none", - "minimal", - "low", - "medium", - "high", - "xhigh", - "max" ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-07-31", - "last_updated": "2026-07-31", + "attachment": true, + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2025-12-11", + "last_updated": "2025-12-11", "type": "chat" - } - ] - }, - "nova": { - "id": "nova", - "name": "Nova", - "display_name": "Nova", - "api": "https://api.nova.amazon.com/v1", - "doc": "https://nova.amazon.com/dev/documentation", - "models": [ + }, { - "id": "nova-2-pro-v1", - "name": "Nova 2 Pro", - "display_name": "Nova 2 Pro", + "id": "openai/gpt-4.1-mini", + "name": "GPT-4.1 Mini", + "display_name": "GPT-4.1 Mini", "modalities": { "input": [ "text", "image", - "video", "pdf" ], "output": [ @@ -62372,29 +61229,28 @@ }, "limit": { "context": 1000000, - "output": 64000 + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": true, "open_weights": false, - "release_date": "2025-12-03", - "last_updated": "2026-01-03", + "knowledge": "2024-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", "type": "chat" }, { - "id": "nova-2-lite-v1", - "name": "Nova 2 Lite", - "display_name": "Nova 2 Lite", + "id": "openai/gpt-4o-mini", + "name": "GPT-4o Mini", + "display_name": "GPT-4o Mini", "modalities": { "input": [ "text", "image", - "video", "pdf" ], "output": [ @@ -62402,57 +61258,40 @@ ] }, "limit": { - "context": 1000000, - "output": 64000 + "context": 128000, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high" - ] - } + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2025-10", - "release_date": "2025-12-02", - "last_updated": "2025-12-02", + "knowledge": "2023-09", + "release_date": "2024-07-18", + "last_updated": "2024-07-18", "type": "chat" - } - ] - }, - "alibaba-cn": { - "id": "alibaba-cn", - "name": "alibaba-cn", - "display_name": "alibaba-cn", - "api": "https://dashscope.aliyuncs.com/compatible-mode/v1", - "doc": "https://www.alibabacloud.com/help/en/model-studio/models", - "models": [ + }, { - "id": "glm-5.1", - "name": "GLM-5.1", - "display_name": "GLM-5.1", + "id": "openai/gpt-6-astra", + "name": "GPT-6 Astra", + "display_name": "GPT-6 Astra", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 202752, + "context": 1050000, "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -62461,37 +61300,41 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-04-14", - "last_updated": "2026-04-14", + "attachment": true, + "open_weights": false, + "knowledge": "2026-04-30", + "release_date": "2026-09-04", + "last_updated": "2026-09-04", "type": "chat" }, { - "id": "glm-5", - "name": "GLM-5", - "display_name": "GLM-5", + "id": "openai/gpt-5.6-terra-pro", + "name": "GPT-5.6 Terra Pro", + "display_name": "GPT-5.6 Terra Pro", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 202752, - "output": 16384 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -62505,32 +61348,40 @@ "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "effort_options": [ + "none", + "low", + "medium", + "high" ] } }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-02-11", - "last_updated": "2026-02-11", + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "deepseek-v4-flash", - "name": "DeepSeek V4 Flash", - "display_name": "DeepSeek V4 Flash", + "id": "openai/gpt-5-nano", + "name": "GPT-5 Nano", + "display_name": "GPT-5 Nano", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -62541,34 +61392,38 @@ "supported": true, "default_enabled": true, "mode": "effort", - "effort": "high", + "effort": "medium", "effort_options": [ + "minimal", "low", - "high", - "max" + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "attachment": true, + "open_weights": false, + "knowledge": "2024-05-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "qwen3-next-80b-a3b-instruct", - "name": "Qwen3 Next 80B A3B Instruct", - "display_name": "Qwen3 Next 80B A3B Instruct", + "id": "ibm-granite/granite-4.0-h-micro", + "name": "Granite 4.0 Micro", + "display_name": "Granite 4.0 Micro", "modalities": { "input": [ "text" @@ -62578,8 +61433,8 @@ ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 131000, + "output": 131000 }, "temperature": true, "tool_call": true, @@ -62588,15 +61443,14 @@ }, "attachment": false, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-09", - "last_updated": "2025-09", + "release_date": "2025-10-02", + "last_updated": "2025-10-02", "type": "chat" }, { - "id": "deepseek-v3-1", - "name": "DeepSeek V3.1", - "display_name": "DeepSeek V3.1", + "id": "inception/mercury-2", + "name": "Mercury 2", + "display_name": "Mercury 2", "modalities": { "input": [ "text" @@ -62606,24 +61460,34 @@ ] }, "limit": { - "context": 131072, - "output": 65536 + "context": 128000, + "output": 50000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "high" + ] + } }, "attachment": false, "open_weights": false, - "release_date": "2025-01-01", - "last_updated": "2025-01-01", + "release_date": "2026-02-24", + "last_updated": "2026-02-24", "type": "chat" }, { - "id": "qwen3-coder-30b-a3b-instruct", - "name": "Qwen3-Coder 30B-A3B Instruct", - "display_name": "Qwen3-Coder 30B-A3B Instruct", + "id": "inception/mercury-2.5", + "name": "Mercury 2.5", + "display_name": "Mercury 2.5", "modalities": { "input": [ "text" @@ -62633,25 +61497,34 @@ ] }, "limit": { - "context": 262144, + "context": 260000, "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "high" + ] + } }, "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-04", - "last_updated": "2025-04", + "open_weights": false, + "release_date": "2026-09-08", + "last_updated": "2026-09-08", "type": "chat" }, { - "id": "deepseek-r1-0528", - "name": "DeepSeek R1 0528", - "display_name": "DeepSeek R1 0528", + "id": "gryphe/mythomax-l2-13b", + "name": "MythoMax 13B", + "display_name": "MythoMax 13B", "modalities": { "input": [ "text" @@ -62661,36 +61534,24 @@ ] }, "limit": { - "context": 131072, - "output": 16384 + "context": 4096, + "output": 4096 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2025-05-28", - "last_updated": "2025-05-28", + "open_weights": true, + "release_date": "2023-08-10", + "last_updated": "2023-08-10", "type": "chat" }, { - "id": "qwen3.5-397b-a17b", - "name": "Qwen3.5 397B-A17B", - "display_name": "Qwen3.5 397B-A17B", + "id": "moonshot/kimi-k3", + "name": "Kimi K3", + "display_name": "Kimi K3", "modalities": { "input": [ "text", @@ -62702,10 +61563,10 @@ ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 1048576, + "output": 131072 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -62719,33 +61580,38 @@ "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "effort_options": [ + "low", + "high", + "max" ] } }, "attachment": true, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2026-02-16", - "last_updated": "2026-02-16", + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" }, { - "id": "qwen3.7-plus", - "name": "Qwen3.7 Plus", - "display_name": "Qwen3.7 Plus", + "id": "perceptron/perceptron-mk1.5", + "name": "Mk1.5", + "display_name": "Mk1.5", "modalities": { "input": [ "text", "image", - "video" + "video", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 64000 + "context": 36864, + "output": 8192 }, "temperature": true, "tool_call": true, @@ -62755,48 +61621,55 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "effort_options": [ + "minimal", + "low", + "medium", + "high" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-04", - "release_date": "2026-06-02", - "last_updated": "2026-06-02", + "release_date": "2026-09-25", + "last_updated": "2026-09-25", "type": "chat" }, { - "id": "qwen-doc-turbo", - "name": "Qwen Doc Turbo", - "display_name": "Qwen Doc Turbo", + "id": "z-ai/glm-5v-turbo", + "name": "GLM 5V Turbo", + "display_name": "GLM 5V Turbo", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 202752, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2024-04", - "release_date": "2024-01", - "last_updated": "2024-01", + "release_date": "2026-04-01", + "last_updated": "2026-04-01", "type": "chat" }, { - "id": "tongyi-intent-detect-v3", - "name": "Tongyi Intent Detect V3", - "display_name": "Tongyi Intent Detect V3", + "id": "z-ai/glm-5-turbo", + "name": "GLM 5 Turbo", + "display_name": "GLM 5 Turbo", "modalities": { "input": [ "text" @@ -62806,59 +61679,72 @@ ] }, "limit": { - "context": 8192, - "output": 1024 + "context": 262144, + "output": 131072 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": false, "open_weights": false, - "knowledge": "2024-04", - "release_date": "2024-01", - "last_updated": "2024-01", + "release_date": "2026-03-16", + "last_updated": "2026-03-16", "type": "chat" }, { - "id": "qwen-max", - "name": "Qwen Max", - "display_name": "Qwen Max", + "id": "z-ai/glm-4.6v", + "name": "GLM 4.6V", + "display_name": "GLM 4.6V", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 32768, - "output": 8192 + "context": 131072, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false - }, - "search": { "supported": true, - "default": false, - "forced_search": false, - "search_strategy": "turbo" + "default": true }, - "attachment": false, - "open_weights": false, - "knowledge": "2024-04", - "release_date": "2024-04-03", - "last_updated": "2025-01-25", + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": true, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-12-08", + "last_updated": "2025-12-08", "type": "chat" }, { - "id": "qwen-mt-turbo", - "name": "Qwen Mt Turbo", - "display_name": "Qwen Mt Turbo", + "id": "z-ai/glm-4.7-flash", + "name": "GLM 4.7 Flash", + "display_name": "GLM 4.7 Flash", "modalities": { "input": [ "text" @@ -62868,63 +61754,93 @@ ] }, "limit": { - "context": 16384, - "output": 8192 + "context": 202752, + "output": 16384 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, - "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-01", - "last_updated": "2025-01", + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2026-01-19", + "last_updated": "2026-01-19", "type": "chat" }, { - "id": "moonshot-kimi-k2-instruct", - "name": "Moonshot Kimi K2 Instruct", - "display_name": "Moonshot Kimi K2 Instruct", + "id": "z-ai/glm-4.5v", + "name": "GLM 4.5V", + "display_name": "GLM 4.5V", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 65536, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": true, "open_weights": true, - "release_date": "2025-01-01", - "last_updated": "2025-01-01", + "knowledge": "2025-04", + "release_date": "2025-08-11", + "last_updated": "2025-08-11", "type": "chat" }, { - "id": "deepseek-r1-distill-qwen-32b", - "name": "DeepSeek R1 Distill Qwen 32B", - "display_name": "DeepSeek R1 Distill Qwen 32B", + "id": "z-ai/glm-5.3-flash", + "name": "GLM 5.3 Flash", + "display_name": "GLM 5.3 Flash", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 32768, - "output": 16384 + "context": 1048576, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -62932,83 +61848,120 @@ "supported": true, "default": true }, - "attachment": false, - "open_weights": false, - "release_date": "2025-01-01", - "last_updated": "2025-01-01", + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "low", + "high", + "max" + ] + } + }, + "attachment": true, + "open_weights": true, + "release_date": "2026-08-26", + "last_updated": "2026-08-26", "type": "chat" }, { - "id": "deepseek-v3-2-exp", - "name": "DeepSeek V3.2 Exp", - "display_name": "DeepSeek V3.2 Exp", + "id": "bytedance-seed/seed-2.0-lite", + "name": "Seed-2.0-Lite", + "display_name": "Seed-2.0-Lite", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 65536 + "context": 262144, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "low", + "medium", + "high" + ] + } + }, + "attachment": true, "open_weights": false, - "release_date": "2025-01-01", - "last_updated": "2025-01-01", + "release_date": "2026-02-14", + "last_updated": "2026-02-14", "type": "chat" }, { - "id": "qwen-vl-ocr", - "name": "Qwen Vl Ocr", - "display_name": "Qwen Vl Ocr", + "id": "bytedance-seed/seed-1.6-flash", + "name": "Seed 1.6 Flash", + "display_name": "Seed 1.6 Flash", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 34096, - "output": 4096 + "context": 262144, + "output": 32768 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2024-04", - "release_date": "2024-10-28", - "last_updated": "2026-09-11", + "release_date": "2025-08-28", + "last_updated": "2025-08-28", "type": "chat" }, { - "id": "qwen3.6-max-preview", - "name": "Qwen3.6 Max Preview", - "display_name": "Qwen3.6 Max Preview", + "id": "bytedance-seed/seed-2.0-mini", + "name": "Seed-2.0-Mini", + "display_name": "Seed-2.0-Mini", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 245800, - "output": 65536 + "context": 262144, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -63024,32 +61977,36 @@ "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "effort_options": [ + "low", + "medium", + "high" ] } }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-04-20", - "last_updated": "2026-04-21", + "release_date": "2026-02-14", + "last_updated": "2026-02-14", "type": "chat" }, { - "id": "qwen3.8-max", - "name": "Qwen3.8 Max", - "display_name": "Qwen3.8 Max", + "id": "bytedance-seed/seed-2.0-code", + "name": "Seed-2.0-Code", + "display_name": "Seed-2.0-Code", "modalities": { "input": [ "text", "image", - "video", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, + "context": 262144, "output": 131072 }, "temperature": true, @@ -63061,43 +62018,29 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "budget": { - "min": 0, - "max": 262144, - "unit": "tokens" - }, - "effort": "xhigh", - "effort_options": [ - "none", - "low", - "medium", - "xhigh" - ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" ], - "notes": [ - "Prefer reasoning_effort; thinking_budget is an alternative, not an additional control.", - "Omitting both controls differs from explicitly selecting xhigh, which maps to 262144 budget tokens." - ], - "budget_exclusive_with_effort": true + "effort_options": [ + "low", + "medium", + "high" + ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-08-03", - "last_updated": "2026-08-03", + "release_date": "2026-02-14", + "last_updated": "2026-02-14", "type": "chat" }, { - "id": "deepseek-v4-pro", - "name": "DeepSeek V4 Pro", - "display_name": "DeepSeek V4 Pro", + "id": "morph/morph-v3-fast", + "name": "V3 Fast", + "display_name": "V3 Fast", "modalities": { "input": [ "text" @@ -63107,78 +62050,51 @@ ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 81920, + "output": 38000 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." - ] - } + "supported": false }, "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "open_weights": false, + "release_date": "2025-07-07", + "last_updated": "2025-07-07", "type": "chat" }, { - "id": "qvq-max", - "name": "QVQ Max", - "display_name": "QVQ Max", + "id": "morph/morph-v3-large", + "name": "V3 Large", + "display_name": "V3 Large", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 262144, + "output": 131072 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-03-25", - "last_updated": "2025-03-25", + "release_date": "2025-07-07", + "last_updated": "2025-07-07", "type": "chat" }, { - "id": "qwen3-235b-a22b", - "name": "Qwen3 235B A22B", - "display_name": "Qwen3 235B A22B", + "id": "aion-labs/aion-rp-llama-3.1-8b", + "name": "Aion-RP 1.0 (8B)", + "display_name": "Aion-RP 1.0 (8B)", "modalities": { "input": [ "text" @@ -63188,19 +62104,42 @@ ] }, "limit": { - "context": 131072, + "context": 32768, "output": 32768 }, "temperature": true, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "knowledge": "2023-12-31", + "release_date": "2025-02-04", + "last_updated": "2025-02-04", + "type": "chat" + }, + { + "id": "xiaomi/mimo-v2.5-pro", + "name": "MiMo V2.5 Pro", + "display_name": "MiMo V2.5 Pro", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1000000, + "output": 128000 + }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false, - "budget": { - "default": 81920, - "min": 0, - "max": 81920 - } + "default": true }, "extra_capabilities": { "reasoning": { @@ -63215,26 +62154,29 @@ }, "attachment": false, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-04", - "last_updated": "2025-04", + "knowledge": "2024-12", + "release_date": "2026-04-22", + "last_updated": "2026-04-22", "type": "chat" }, { - "id": "kimi-k2-thinking", - "name": "Moonshot Kimi K2 Thinking", - "display_name": "Moonshot Kimi K2 Thinking", + "id": "xiaomi/mimo-v2.5", + "name": "MiMo V2.5", + "display_name": "MiMo V2.5", "modalities": { "input": [ - "text" + "text", + "image", + "audio", + "video" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 16384 + "context": 1000000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -63253,74 +62195,95 @@ ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2025-11-06", - "last_updated": "2025-11-06", + "knowledge": "2024-12", + "release_date": "2026-04-22", + "last_updated": "2026-04-22", "type": "chat" }, { - "id": "qwen-plus-character", - "name": "Qwen Plus Character", - "display_name": "Qwen Plus Character", + "id": "sakana/fugu-max", + "name": "Fugu Max", + "display_name": "Fugu Max", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 32768, - "output": 4096 + "context": 1000000, + "output": 128000 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "high" + ] + } + }, + "attachment": true, "open_weights": false, - "knowledge": "2024-04", - "release_date": "2024-01", - "last_updated": "2024-01", + "release_date": "2026-09-11", + "last_updated": "2026-09-11", "type": "chat" }, { - "id": "qwen3-asr-flash", - "name": "Qwen3-ASR Flash", - "display_name": "Qwen3-ASR Flash", + "id": "sakana/fugu-ultra", + "name": "Fugu Ultra", + "display_name": "Fugu Ultra", "modalities": { "input": [ - "audio" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 53248, - "output": 4096 + "context": 1000000, + "output": 128000 }, "temperature": false, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "high" + ] + } }, "attachment": true, "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-09-08", - "last_updated": "2025-09-08" + "release_date": "2026-06-15", + "last_updated": "2026-06-15", + "type": "chat" }, { - "id": "qwen-deep-research", - "name": "Qwen Deep Research", - "display_name": "Qwen Deep Research", + "id": "sakana/fugu-ultra-v2", + "name": "Fugu Ultra v2", + "display_name": "Fugu Ultra v2", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" @@ -63328,53 +62291,71 @@ }, "limit": { "context": 1000000, - "output": 32768 + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "high" + ] + } + }, + "attachment": true, "open_weights": false, - "knowledge": "2024-04", - "release_date": "2024-01", - "last_updated": "2024-01", + "knowledge": "2026-08-28", + "release_date": "2026-09-11", + "last_updated": "2026-09-11", "type": "chat" }, { - "id": "qwen-vl-plus", - "name": "Qwen-VL Plus", - "display_name": "Qwen-VL Plus", + "id": "stepfun/step-5-preview", + "name": "Step 5 Preview", + "display_name": "Step 5 Preview", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 1000000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "high" + ] + } }, "attachment": true, - "open_weights": false, - "knowledge": "2024-04", - "release_date": "2024-01-25", - "last_updated": "2025-08-15", + "open_weights": true, + "release_date": "2026-09-16", + "last_updated": "2026-09-20", "type": "chat" }, { - "id": "qwen3-coder-480b-a35b-instruct", - "name": "Qwen3-Coder 480B-A35B Instruct", - "display_name": "Qwen3-Coder 480B-A35B Instruct", + "id": "sao10k/l3.1-euryale-70b", + "name": "Llama 3.1 Euryale 70B v2.2", + "display_name": "Llama 3.1 Euryale 70B v2.2", "modalities": { "input": [ "text" @@ -63384,8 +62365,8 @@ ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 131072, + "output": 16384 }, "temperature": true, "tool_call": true, @@ -63394,15 +62375,15 @@ }, "attachment": false, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-04", - "last_updated": "2025-04", + "knowledge": "2023-12-31", + "release_date": "2024-08-28", + "last_updated": "2024-08-28", "type": "chat" }, { - "id": "qwen-math-turbo", - "name": "Qwen Math Turbo", - "display_name": "Qwen Math Turbo", + "id": "sao10k/l3.3-euryale-70b", + "name": "Llama 3.3 Euryale 70B", + "display_name": "Llama 3.3 Euryale 70B", "modalities": { "input": [ "text" @@ -63412,162 +62393,151 @@ ] }, "limit": { - "context": 4096, - "output": 3072 + "context": 131072, + "output": 16384 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, "attachment": false, - "open_weights": false, - "knowledge": "2024-04", - "release_date": "2024-09-19", - "last_updated": "2024-09-19", + "open_weights": true, + "knowledge": "2023-12-31", + "release_date": "2024-12-18", + "last_updated": "2024-12-18", "type": "chat" }, { - "id": "qwen3-vl-30b-a3b", - "name": "Qwen3-VL 30B-A3B", - "display_name": "Qwen3-VL 30B-A3B", + "id": "sao10k/l3-lunaris-8b", + "name": "Llama 3 8B Lunaris", + "display_name": "Llama 3 8B Lunaris", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 8192, + "output": 7372 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-04", - "last_updated": "2025-04", + "knowledge": "2023-12-31", + "release_date": "2024-08-13", + "last_updated": "2024-08-13", "type": "chat" }, { - "id": "qwen3.5-plus", - "name": "Qwen3.5 Plus", - "display_name": "Qwen3.5 Plus", + "id": "thedrummer/unslopnemo-12b", + "name": "UnslopNemo 12B", + "display_name": "UnslopNemo 12B", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 32768, + "output": 32768 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-04", - "release_date": "2026-02-16", - "last_updated": "2026-09-22", + "attachment": false, + "open_weights": true, + "knowledge": "2024-04-30", + "release_date": "2024-11-08", + "last_updated": "2024-11-08", "type": "chat" }, { - "id": "qwen3.5-flash", - "name": "Qwen3.5 Flash", - "display_name": "Qwen3.5 Flash", + "id": "thedrummer/skyfall-36b-v2", + "name": "Skyfall 36B V2", + "display_name": "Skyfall 36B V2", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 32768, + "output": 32768 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "attachment": false, + "open_weights": true, + "knowledge": "2024-06-30", + "release_date": "2025-03-10", + "last_updated": "2025-03-10", + "type": "chat" + }, + { + "id": "thedrummer/cydonia-24b-v4.1", + "name": "Cydonia 24B V4.1", + "display_name": "Cydonia 24B V4.1", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-04", - "release_date": "2026-02-23", - "last_updated": "2026-09-22", + "limit": { + "context": 131072, + "output": 131072 + }, + "temperature": true, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "knowledge": "2024-04-30", + "release_date": "2025-09-27", + "last_updated": "2025-09-27", "type": "chat" }, { - "id": "qwen3.7-flash", - "name": "Qwen3.7 Flash", - "display_name": "Qwen3.7 Flash", + "id": "meta/muse-spark-1.2", + "name": "Muse Spark 1.2", + "display_name": "Muse Spark 1.2", "modalities": { "input": [ "text", "image", - "video" + "video", + "pdf", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 1000000, + "context": 1048576, "output": 131072 }, "temperature": true, @@ -63578,22 +62548,34 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "low", + "medium", + "high" + ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-07-15", - "last_updated": "2026-07-15", + "release_date": "2026-08-05", + "last_updated": "2026-08-05", "type": "chat" }, { - "id": "qwen3-14b", - "name": "Qwen3 14B", - "display_name": "Qwen3 14B", + "id": "meta/muse-glimmer-30b", + "name": "Muse Glimmer 30B", + "display_name": "Muse Glimmer 30B", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" @@ -63601,18 +62583,13 @@ }, "limit": { "context": 131072, - "output": 8192 + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true, - "budget": { - "default": 38912, - "min": 0, - "max": 38912 - } + "default": true }, "extra_capabilities": { "reasoning": { @@ -63622,24 +62599,30 @@ "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "effort_options": [ + "low", + "medium", + "high" ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-04", - "last_updated": "2025-04", + "knowledge": "2026-01-04", + "release_date": "2026-08-10", + "last_updated": "2026-08-10", "type": "chat" }, { - "id": "qwen3.6-plus", - "name": "Qwen3.6 Plus", - "display_name": "Qwen3.6 Plus", + "id": "meta/muse-spark-1.1", + "name": "Muse Spark 1.1", + "display_name": "Muse Spark 1.1", "modalities": { "input": [ "text", "image", + "pdf", "video" ], "output": [ @@ -63647,8 +62630,8 @@ ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 1048576, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -63664,33 +62647,39 @@ "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "effort_options": [ + "low", + "medium", + "high" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-04", - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "release_date": "2026-04-08", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "qwen3.6-flash", - "name": "Qwen3.6 Flash", - "display_name": "Qwen3.6 Flash", + "id": "meta/muse-spark-1.3", + "name": "Muse Spark 1.3", + "display_name": "Muse Spark 1.3", "modalities": { "input": [ "text", "image", - "video" + "video", + "pdf", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 1048576, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -63701,39 +62690,34 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "low", + "medium", + "high" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-04-27", - "last_updated": "2026-04-27", + "release_date": "2026-09-02", + "last_updated": "2026-09-02", "type": "chat" }, { - "id": "qwen3-omni-flash", - "name": "Qwen3-Omni Flash", - "display_name": "Qwen3-Omni Flash", + "id": "tencent/hy3", + "name": "Hy3", + "display_name": "Hy3", "modalities": { "input": [ - "text", - "image", - "audio", - "video" + "text" ], "output": [ - "text", - "audio" + "text" ] }, "limit": { - "context": 65536, - "output": 16384 + "context": 262144, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -63749,20 +62733,23 @@ "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "effort_options": [ + "low", + "high" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-09-15", - "last_updated": "2025-09-15", + "attachment": false, + "open_weights": true, + "release_date": "2026-07-06", + "last_updated": "2026-07-06", "type": "chat" }, { - "id": "qwen3-coder-flash", - "name": "Qwen3 Coder Flash", - "display_name": "Qwen3 Coder Flash", + "id": "tencent/hy-mt2-1.8b", + "name": "Hy-MT2-1.8B", + "display_name": "Hy-MT2-1.8B", "modalities": { "input": [ "text" @@ -63772,25 +62759,24 @@ ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 8192, + "output": 4096 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, "attachment": false, - "open_weights": false, - "knowledge": "2025-04", - "release_date": "2025-07-28", - "last_updated": "2025-07-28", + "open_weights": true, + "release_date": "2026-05-21", + "last_updated": "2026-05-21", "type": "chat" }, { - "id": "glm-5.3", - "name": "GLM-5.3", - "display_name": "GLM-5.3", + "id": "tencent/hy-mt2-30b-a3b", + "name": "Hy-MT2-30B-A3B", + "display_name": "Hy-MT2-30B-A3B", "modalities": { "input": [ "text" @@ -63800,41 +62786,24 @@ ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 8192, + "output": 4096 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "low", - "high", - "max" - ] - } + "supported": false }, "attachment": false, "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "release_date": "2026-05-21", + "last_updated": "2026-05-21", "type": "chat" }, { - "id": "qwen-turbo", - "name": "Qwen Turbo", - "display_name": "Qwen Turbo", + "id": "tencent/hy4-preview", + "name": "Hy4 preview", + "display_name": "Hy4 preview", "modalities": { "input": [ "text" @@ -63844,19 +62813,14 @@ ] }, "limit": { - "context": 131072, - "output": 16384 + "context": 1048576, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false, - "budget": { - "default": 38912, - "min": 0, - "max": 38912 - } + "default": true }, "extra_capabilities": { "reasoning": { @@ -63866,26 +62830,23 @@ "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "effort_options": [ + "low", + "high" ] } }, - "search": { - "supported": true, - "default": false, - "forced_search": false, - "search_strategy": "turbo" - }, "attachment": false, - "open_weights": false, - "knowledge": "2024-04", - "release_date": "2024-11-01", - "last_updated": "2025-07-15", + "open_weights": true, + "release_date": "2026-08-28", + "last_updated": "2026-08-28", "type": "chat" }, { - "id": "qwen3-max", - "name": "Qwen3 Max", - "display_name": "Qwen3 Max", + "id": "tencent/hy-mt2-7b", + "name": "Hy-MT2-7B", + "display_name": "Hy-MT2-7B", "modalities": { "input": [ "text" @@ -63895,37 +62856,24 @@ ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 8192, + "output": 4096 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": false, - "open_weights": false, - "knowledge": "2025-04", - "release_date": "2026-01-23", - "last_updated": "2026-09-22", + "open_weights": true, + "release_date": "2026-05-21", + "last_updated": "2026-05-21", "type": "chat" }, { - "id": "deepseek-r1-distill-llama-8b", - "name": "DeepSeek R1 Distill Llama 8B", - "display_name": "DeepSeek R1 Distill Llama 8B", + "id": "nousresearch/hermes-3-llama-3.1-70b", + "name": "Hermes 3 70B Instruct", + "display_name": "Hermes 3 70B Instruct", "modalities": { "input": [ "text" @@ -63935,25 +62883,25 @@ ] }, "limit": { - "context": 32768, + "context": 131072, "output": 16384 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2025-01-01", - "last_updated": "2025-01-01", + "open_weights": true, + "knowledge": "2023-12-31", + "release_date": "2024-08-18", + "last_updated": "2024-08-18", "type": "chat" }, { - "id": "qwen3.7-max", - "name": "Qwen3.7 Max", - "display_name": "Qwen3.7 Max", + "id": "nousresearch/hermes-3-llama-3.1-405b", + "name": "Hermes 3 405B Instruct", + "display_name": "Hermes 3 405B Instruct", "modalities": { "input": [ "text" @@ -63963,30 +62911,25 @@ ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 131072, + "output": 16384 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2026-05-21", - "last_updated": "2026-05-21", + "open_weights": true, + "knowledge": "2023-12-31", + "release_date": "2024-08-16", + "last_updated": "2024-08-16", "type": "chat" }, { - "id": "deepseek-v3", - "name": "DeepSeek V3", - "display_name": "DeepSeek V3", + "id": "perplexity/sonar", + "name": "Sonar", + "display_name": "Sonar", "modalities": { "input": [ "text" @@ -63996,133 +62939,95 @@ ] }, "limit": { - "context": 65536, - "output": 8192 + "context": 128000, + "output": 100000 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, "attachment": false, "open_weights": false, - "release_date": "2024-12-01", - "last_updated": "2024-12-01", + "knowledge": "2025-09-01", + "release_date": "2024-01-01", + "last_updated": "2025-09-01", "type": "chat" }, { - "id": "qwen3-32b", - "name": "Qwen3 32B", - "display_name": "Qwen3 32B", + "id": "perplexity/sonar-pro", + "name": "Sonar Pro", + "display_name": "Sonar Pro", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 16384 + "context": 200000, + "output": 100000 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true, - "budget": { - "default": 38912, - "min": 0, - "max": 38912 - } - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-04", - "last_updated": "2025-04", + "attachment": true, + "open_weights": false, + "knowledge": "2025-09-01", + "release_date": "2024-01-01", + "last_updated": "2025-09-01", "type": "chat" }, { - "id": "qwq-plus", - "name": "QwQ Plus", - "display_name": "QwQ Plus", + "id": "unbiased/pareto", + "name": "Pareto", + "display_name": "Pareto", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 262144, + "output": 131072 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": true, - "default": true, - "budget": { - "default": 32768, - "min": 0, - "max": 32768 - } - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, - "search": { - "supported": true, - "default": false, - "forced_search": false, - "search_strategy": "turbo" + "supported": false }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-03-05", - "last_updated": "2025-03-05", + "release_date": "2026-09-17", + "last_updated": "2026-09-17", "type": "chat" }, { - "id": "kimi-k2.6", - "name": "Moonshot Kimi K2.6", - "display_name": "Moonshot Kimi K2.6", + "id": "thinkingmachines/inkling", + "name": "Inkling", + "display_name": "Inkling", "modalities": { "input": [ "text", "image", - "video" + "audio" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 16384 + "context": 1048576, + "output": 1048576 }, "temperature": true, "tool_call": true, @@ -64138,34 +63043,39 @@ "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "effort_options": [ + "low", + "medium", + "high" ] } }, "attachment": true, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-21", - "last_updated": "2026-04-21", + "release_date": "2026-07-15", + "last_updated": "2026-07-15", "type": "chat" }, { - "id": "kimi-k3", - "name": "Kimi K3", - "display_name": "Kimi K3", + "id": "thinkingmachines/inkling-small", + "name": "Inkling Small", + "display_name": "Inkling Small", "modalities": { "input": [ "text", - "image" + "image", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 1048576 + "context": 524288, + "output": 262144 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -64182,21 +63092,21 @@ ], "effort_options": [ "low", - "high", - "max" + "medium", + "high" ] } }, "attachment": true, "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-16", + "release_date": "2026-07-30", + "last_updated": "2026-07-30", "type": "chat" }, { - "id": "qwen-math-plus", - "name": "Qwen Math Plus", - "display_name": "Qwen Math Plus", + "id": "mancer/weaver", + "name": "Weaver (alpha)", + "display_name": "Weaver (alpha)", "modalities": { "input": [ "text" @@ -64206,71 +63116,54 @@ ] }, "limit": { - "context": 4096, - "output": 3072 + "context": 8000, + "output": 2000 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, "attachment": false, "open_weights": false, - "knowledge": "2024-04", - "release_date": "2024-08-16", - "last_updated": "2024-09-19", + "knowledge": "2023-06-30", + "release_date": "2023-08-02", + "last_updated": "2023-08-02", "type": "chat" }, { - "id": "qwen3-vl-plus", - "name": "Qwen3 VL Plus", - "display_name": "Qwen3 VL Plus", + "id": "rekaai/reka-edge", + "name": "Reka Edge", + "display_name": "Reka Edge", "modalities": { "input": [ + "image", "text", - "image" + "video" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 16384, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": false, - "budget": { - "default": 81920, - "min": 0, - "max": 81920 - } - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, - "attachment": false, - "open_weights": false, - "knowledge": "2025-04", - "release_date": "2025-09-23", - "last_updated": "2025-09-23", + "attachment": true, + "open_weights": true, + "release_date": "2026-03-11", + "last_updated": "2026-03-11", "type": "chat" }, { - "id": "kimi-k2.5", - "name": "Moonshot Kimi K2.5", - "display_name": "Moonshot Kimi K2.5", + "id": "alibaba/qwen3.8-max-prime", + "name": "Qwen3.8 Max Prime", + "display_name": "Qwen3.8 Max Prime", "modalities": { "input": [ "text", @@ -64282,8 +63175,8 @@ ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -64293,38 +63186,36 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "minimal", + "low", + "medium", + "high", + "xhigh" ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-01-27", - "last_updated": "2026-01-27", + "open_weights": false, + "release_date": "2026-09-23", + "last_updated": "2026-09-23", "type": "chat" }, { - "id": "qwen3-vl-235b-a22b", - "name": "Qwen3-VL 235B-A22B", - "display_name": "Qwen3-VL 235B-A22B", + "id": "alibaba/qwen3.8-2.4t-a95b", + "name": "Qwen3.8 2.4T A95B", + "display_name": "Qwen3.8 2.4T A95B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 262144, + "output": 52429 }, "temperature": true, "tool_call": true, @@ -64340,53 +63231,69 @@ "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "effort_options": [ + "low", + "medium" ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-04", - "last_updated": "2025-04", + "release_date": "2026-08-12", + "last_updated": "2026-08-12", "type": "chat" }, { - "id": "qwen-omni-turbo-realtime", - "name": "Qwen-Omni Turbo Realtime", - "display_name": "Qwen-Omni Turbo Realtime", + "id": "alibaba/qwen-plus", + "name": "Qwen Plus", + "display_name": "Qwen Plus", "modalities": { "input": [ - "text", - "image", - "audio" + "text" ], "output": [ - "text", - "audio" + "text" ] }, "limit": { - "context": 32768, - "output": 2048 + "context": 131000, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, "open_weights": false, "knowledge": "2024-04", - "release_date": "2025-05-08", - "last_updated": "2025-05-08" + "release_date": "2024-01-25", + "last_updated": "2025-09-11", + "type": "chat" }, { - "id": "qwen-flash", - "name": "Qwen Flash", - "display_name": "Qwen Flash", + "id": "alibaba/qwen3.8-max", + "name": "Qwen3.8 Max", + "display_name": "Qwen3.8 Max", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "pdf" ], "output": [ "text" @@ -64394,18 +63301,13 @@ }, "limit": { "context": 1000000, - "output": 32768 + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false, - "budget": { - "default": 81920, - "min": 0, - "max": 81920 - } + "default": true }, "extra_capabilities": { "reasoning": { @@ -64415,26 +63317,23 @@ "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "effort_options": [ + "low", + "medium" ] } }, - "search": { - "supported": true, - "default": false, - "forced_search": false, - "search_strategy": "turbo" - }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-07-28", - "last_updated": "2025-07-28", + "release_date": "2026-08-03", + "last_updated": "2026-08-03", "type": "chat" }, { - "id": "qwen-mt-plus", - "name": "Qwen Mt Plus", - "display_name": "Qwen Mt Plus", + "id": "alibaba/qwen-max", + "name": "Qwen Max", + "display_name": "Qwen Max", "modalities": { "input": [ "text" @@ -64444,25 +63343,25 @@ ] }, "limit": { - "context": 16384, + "context": 32000, "output": 8192 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, "attachment": false, "open_weights": false, "knowledge": "2024-04", - "release_date": "2025-01", - "last_updated": "2025-01", + "release_date": "2024-04-03", + "last_updated": "2025-01-25", "type": "chat" }, { - "id": "qwen3-next-80b-a3b-thinking", - "name": "Qwen3 Next 80B A3B Thinking", - "display_name": "Qwen3 Next 80B A3B Thinking", + "id": "alibaba/qwen3-next-80b-a3b-instruct", + "name": "Qwen3 Next 80B A3B Instruct", + "display_name": "Qwen3 Next 80B A3B Instruct", "modalities": { "input": [ "text" @@ -64472,30 +63371,13 @@ ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 129024, + "output": 16384 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": true, - "default": true, - "budget": { - "default": 81920, - "min": 0, - "max": 81920 - } - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": false, "open_weights": true, @@ -64505,9 +63387,9 @@ "type": "chat" }, { - "id": "qwen-plus", - "name": "Qwen Plus", - "display_name": "Qwen Plus", + "id": "alibaba/qwen3-coder-480b-a35b-instruct", + "name": "Qwen3 Coder", + "display_name": "Qwen3 Coder", "modalities": { "input": [ "text" @@ -64517,51 +63399,30 @@ ] }, "limit": { - "context": 1000000, - "output": 32768 + "context": 262000, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": false, - "budget": { - "default": 81920, - "min": 0, - "max": 81920 - } - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, - "search": { - "supported": true, - "default": false, - "forced_search": false, - "search_strategy": "turbo" + "supported": false }, "attachment": false, - "open_weights": false, - "knowledge": "2024-04", - "release_date": "2024-01-25", - "last_updated": "2025-09-11", + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-07-22", + "last_updated": "2025-07-22", "type": "chat" }, { - "id": "glm-5.2", - "name": "GLM-5.2", - "display_name": "GLM-5.2", + "id": "alibaba/qwen3.8-flash", + "name": "Qwen3.8 Flash", + "display_name": "Qwen3.8 Flash", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" @@ -64569,7 +63430,7 @@ }, "limit": { "context": 1000000, - "output": 128000 + "output": 131072 }, "temperature": true, "tool_call": true, @@ -64587,33 +63448,34 @@ "thinking_blocks" ], "effort_options": [ - "high", - "max" + "low", + "medium" ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "attachment": true, + "open_weights": false, + "release_date": "2026-08-26", + "last_updated": "2026-08-26", "type": "chat" }, { - "id": "deepseek-v4.1-flash", - "name": "DeepSeek V4.1 Flash", - "display_name": "DeepSeek V4.1 Flash", + "id": "alibaba/qwen3.8-27b", + "name": "Qwen3.8 27B", + "display_name": "Qwen3.8 27B", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 262144, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -64632,61 +63494,49 @@ ], "effort_options": [ "low", - "high", - "max" + "medium" ] } }, "attachment": true, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-09-10", - "last_updated": "2026-09-10", + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "deepseek-r1", - "name": "DeepSeek R1", - "display_name": "DeepSeek R1", + "id": "amazon/nova-lite-v1", + "name": "Nova Lite 1.0", + "display_name": "Nova Lite 1.0", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 16384 + "context": 300000, + "output": 5120 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2025-01-01", - "last_updated": "2025-01-01", + "knowledge": "2024-10-31", + "release_date": "2024-12-05", + "last_updated": "2024-12-05", "type": "chat" }, { - "id": "deepseek-r1-distill-qwen-14b", - "name": "DeepSeek R1 Distill Qwen 14B", - "display_name": "DeepSeek R1 Distill Qwen 14B", + "id": "amazon/nova-micro-v1", + "name": "Nova Micro 1.0", + "display_name": "Nova Micro 1.0", "modalities": { "input": [ "text" @@ -64696,40 +63546,37 @@ ] }, "limit": { - "context": 32768, - "output": 16384 + "context": 128000, + "output": 5120 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, "open_weights": false, - "release_date": "2025-01-01", - "last_updated": "2025-01-01", + "knowledge": "2024-10-31", + "release_date": "2024-12-05", + "last_updated": "2024-12-05", "type": "chat" }, { - "id": "qwen-omni-turbo", - "name": "Qwen-Omni Turbo", - "display_name": "Qwen-Omni Turbo", + "id": "amazon/nova-pro-v1", + "name": "Nova Pro 1.0", + "display_name": "Nova Pro 1.0", "modalities": { "input": [ "text", - "image", - "audio", - "video" + "image" ], "output": [ - "text", - "audio" + "text" ] }, "limit": { - "context": 32768, - "output": 2048 + "context": 300000, + "output": 5120 }, "temperature": true, "tool_call": true, @@ -64738,193 +63585,171 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-01-19", - "last_updated": "2025-03-26", + "knowledge": "2024-10-31", + "release_date": "2024-12-05", + "last_updated": "2024-12-05", "type": "chat" }, { - "id": "qwen2-5-omni-7b", - "name": "Qwen2.5-Omni 7B", - "display_name": "Qwen2.5-Omni 7B", + "id": "anthropic/claude-opus-5.5", + "name": "Claude Opus 5.5", + "display_name": "Claude Opus 5.5", "modalities": { "input": [ "text", "image", - "audio", - "video" + "pdf" ], "output": [ - "text", - "audio" + "text" ] }, "limit": { - "context": 32768, - "output": 2048 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } }, "attachment": true, - "open_weights": true, - "knowledge": "2024-04", - "release_date": "2024-12", - "last_updated": "2024-12", + "open_weights": false, + "knowledge": "2026-06", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "qwen3-8b", - "name": "Qwen3 8B", - "display_name": "Qwen3 8B", + "id": "anthropic/claude-fable-5", + "name": "Claude Fable 5", + "display_name": "Claude Fable 5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true, - "budget": { - "default": 38912, - "min": 0, - "max": 38912 - } + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", + "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", + "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-04", - "last_updated": "2025-04", - "type": "chat" - }, - { - "id": "qwen3-coder-plus", - "name": "Qwen3 Coder Plus", - "display_name": "Qwen3 Coder Plus", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 1000000, - "output": 65536 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-07-23", - "last_updated": "2026-09-11", - "type": "chat" - }, - { - "id": "qwen-vl-max", - "name": "Qwen-VL Max", - "display_name": "Qwen-VL Max", - "modalities": { - "input": [ - "text", - "image" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 131072, - "output": 8192 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, "attachment": true, "open_weights": false, - "knowledge": "2024-04", - "release_date": "2024-04-08", - "last_updated": "2025-08-13", + "knowledge": "2026-01-31", + "release_date": "2026-06-09", + "last_updated": "2026-06-09", "type": "chat" }, { - "id": "MiniMax-M2.5", - "name": "MiniMax-M2.5", - "display_name": "MiniMax-M2.5", + "id": "anthropic/claude-haiku-4.5", + "name": "Claude 4.5 Haiku", + "display_name": "Claude 4.5 Haiku", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-02-12", - "last_updated": "2026-02-12", + "attachment": true, + "open_weights": false, + "knowledge": "2025-02-28", + "release_date": "2025-10-15", + "last_updated": "2025-10-15", "type": "chat" }, { - "id": "qwen3.8-flash", - "name": "Qwen3.8 Flash", - "display_name": "Qwen3.8 Flash", + "id": "anthropic/claude-opus-4.8", + "name": "Claude 4.8 Opus", + "display_name": "Claude 4.8 Opus", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" @@ -64932,90 +63757,98 @@ }, "limit": { "context": 1000000, - "output": 131072 + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, + "default_enabled": false, "mode": "effort", - "budget": { - "min": 0, - "max": 262144, - "unit": "tokens" - }, - "effort": "xhigh", + "effort": "high", "effort_options": [ - "none", "low", "medium", - "xhigh" + "high", + "xhigh", + "max" ], "interleaved": true, "summaries": true, - "visibility": "summary", + "visibility": "omitted", "continuation": [ "thinking_blocks" ], "notes": [ - "Prefer reasoning_effort; thinking_budget is an alternative, not an additional control.", - "Omitting both controls differs from explicitly selecting xhigh, which maps to 262144 budget tokens." - ], - "budget_exclusive_with_effort": true + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." + ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", + "knowledge": "2026-01", + "release_date": "2026-05-28", + "last_updated": "2026-05-28", "type": "chat" }, { - "id": "qwen3-omni-flash-realtime", - "name": "Qwen3-Omni Flash Realtime", - "display_name": "Qwen3-Omni Flash Realtime", + "id": "anthropic/claude-haiku-5.5", + "name": "Claude Haiku 5.5", + "display_name": "Claude Haiku 5.5", "modalities": { "input": [ "text", "image", - "audio" + "pdf" ], "output": [ - "text", - "audio" + "text" ] }, "limit": { - "context": 65536, - "output": 16384 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } }, "attachment": true, "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-09-15", - "last_updated": "2025-09-15" + "knowledge": "2026-06", + "release_date": "2026-10-07", + "last_updated": "2026-10-07", + "type": "chat" }, { - "id": "qwen3.8-omni-flash", - "name": "Qwen3.8 Omni Flash", - "display_name": "Qwen3.8 Omni Flash", + "id": "anthropic/claude-opus-4.7", + "name": "Claude 4.7 Opus", + "display_name": "Claude 4.7 Opus", "modalities": { "input": [ "text", "image", - "audio", - "video" + "pdf" ], "output": [ "text" @@ -65023,103 +63856,158 @@ }, "limit": { "context": 1000000, - "output": 131072 + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, + "default_enabled": false, "mode": "effort", - "effort": "xhigh", + "effort": "high", "effort_options": [ - "none", "low", "medium", - "xhigh" + "high", + "xhigh", + "max" ], "interleaved": true, "summaries": true, - "visibility": "summary", + "visibility": "omitted", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-09-17", - "last_updated": "2026-09-17", + "knowledge": "2026-01-31", + "release_date": "2026-04-16", + "last_updated": "2026-04-16", "type": "chat" }, { - "id": "deepseek-r1-distill-qwen-1-5b", - "name": "DeepSeek R1 Distill Qwen 1.5B", - "display_name": "DeepSeek R1 Distill Qwen 1.5B", + "id": "anthropic/claude-sonnet-4.6", + "name": "Claude 4.6 Sonnet", + "display_name": "Claude 4.6 Sonnet", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 32768, - "output": 16384 + "context": 200000, + "output": 64000 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." + ] + } + }, + "attachment": true, "open_weights": false, - "release_date": "2025-01-01", - "last_updated": "2025-01-01", + "knowledge": "2025-08-31", + "release_date": "2026-02-17", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "deepseek-r1-distill-qwen-7b", - "name": "DeepSeek R1 Distill Qwen 7B", - "display_name": "DeepSeek R1 Distill Qwen 7B", + "id": "anthropic/claude-opus-5", + "name": "Claude Opus 5", + "display_name": "Claude Opus 5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 32768, - "output": 16384 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + }, + "attachment": true, "open_weights": false, - "release_date": "2025-01-01", - "last_updated": "2025-01-01", + "knowledge": "2026-05", + "release_date": "2026-07-24", + "last_updated": "2026-07-24", "type": "chat" }, { - "id": "qwen-long", - "name": "Qwen Long", - "display_name": "Qwen Long", + "id": "anthropic/claude-sonnet-5", + "name": "Claude Sonnet 5", + "display_name": "Claude Sonnet 5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" @@ -65127,70 +64015,100 @@ }, "limit": { "context": 1000000, - "output": 8192 + "output": 128000 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + }, + "attachment": true, "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-01-25", - "last_updated": "2025-01-25", + "knowledge": "2026-01-31", + "release_date": "2026-06-30", + "last_updated": "2026-06-30", "type": "chat" }, { - "id": "deepseek-r1-distill-llama-70b", - "name": "DeepSeek R1 Distill Llama 70B", - "display_name": "DeepSeek R1 Distill Llama 70B", + "id": "anthropic/claude-sonnet-5.5", + "name": "Claude Sonnet 5.5", + "display_name": "Claude Sonnet 5.5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 32768, - "output": 16384 + "context": 1000000, + "output": 128000 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { - "supported": true + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] } }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2025-01-01", - "last_updated": "2025-01-01", + "knowledge": "2026-06", + "release_date": "2026-09-28", + "last_updated": "2026-09-28", "type": "chat" }, { - "id": "MiniMax/MiniMax-M2.7", - "name": "MiniMax-M2.7", - "display_name": "MiniMax-M2.7", + "id": "anthropic/claude-fable-5.1", + "name": "Claude Fable 5.1", + "display_name": "Claude Fable 5.1", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -65199,91 +64117,150 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], "interleaved": true, "summaries": true, - "visibility": "summary", + "visibility": "omitted", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", + "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", + "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-03-18", - "last_updated": "2026-03-18", + "attachment": true, + "open_weights": false, + "knowledge": "2026-06", + "release_date": "2026-09-01", + "last_updated": "2026-09-01", "type": "chat" }, { - "id": "siliconflow/deepseek-v3.1-terminus", - "name": "siliconflow/deepseek-v3.1-terminus", - "display_name": "siliconflow/deepseek-v3.1-terminus", + "id": "anthropic/claude-opus-4.5", + "name": "Claude 4.5 Opus", + "display_name": "Claude 4.5 Opus", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 163840, - "output": 65536 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", + "effort_options": [ + "low", + "medium", + "high" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." + ] + } + }, + "attachment": true, "open_weights": false, - "release_date": "2025-09-29", - "last_updated": "2025-11-25", + "knowledge": "2025-05", + "release_date": "2025-11-24", + "last_updated": "2025-11-24", "type": "chat" }, { - "id": "siliconflow/deepseek-r1-0528", - "name": "siliconflow/deepseek-r1-0528", - "display_name": "siliconflow/deepseek-r1-0528", + "id": "anthropic/claude-sonnet-4.5", + "name": "Claude 4.5 Sonnet", + "display_name": "Claude 4.5 Sonnet", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 163840, - "output": 32768 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2025-05-28", - "last_updated": "2025-11-25", + "knowledge": "2025-07-31", + "release_date": "2025-09-29", + "last_updated": "2025-09-29", "type": "chat" }, { - "id": "siliconflow/deepseek-v3-0324", - "name": "siliconflow/deepseek-v3-0324", - "display_name": "siliconflow/deepseek-v3-0324", + "id": "undi95/remm-slerp-l2-13b", + "name": "ReMM SLERP 13B", + "display_name": "ReMM SLERP 13B", "modalities": { "input": [ "text" @@ -65293,24 +64270,25 @@ ] }, "limit": { - "context": 163840, - "output": 163840 + "context": 6144, + "output": 4096 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2024-12-26", - "last_updated": "2025-11-25", + "open_weights": true, + "knowledge": "2023-06-30", + "release_date": "2023-07-22", + "last_updated": "2023-07-22", "type": "chat" }, { - "id": "siliconflow/deepseek-v3.2", - "name": "siliconflow/deepseek-v3.2", - "display_name": "siliconflow/deepseek-v3.2", + "id": "upstage/solar-pro4", + "name": "Solar Pro 4", + "display_name": "Solar Pro 4", "modalities": { "input": [ "text" @@ -65320,8 +64298,8 @@ ] }, "limit": { - "context": 163840, - "output": 65536 + "context": 524288, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -65331,34 +64309,38 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "effort_options": [ + "none", + "low", + "medium", + "high" + ] } }, "attachment": false, "open_weights": false, - "release_date": "2025-12-03", - "last_updated": "2025-12-03", + "knowledge": "2026-02", + "release_date": "2026-08-06", + "last_updated": "2026-08-06", "type": "chat" }, { - "id": "kimi/kimi-k2.5", - "name": "kimi/kimi-k2.5", - "display_name": "kimi/kimi-k2.5", + "id": "upstage/solar-pro-3", + "name": "Solar Pro 3", + "display_name": "Solar Pro 3", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 128000, + "output": 8192 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -65366,26 +64348,24 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "low", + "medium", + "high" ] } }, - "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-01-27", - "last_updated": "2026-01-27", + "attachment": false, + "open_weights": false, + "knowledge": "2025-07", + "release_date": "2026-01-26", + "last_updated": "2026-03-23", "type": "chat" }, { - "id": "qwen3-coder-plus-2025-09-23", - "name": "Qwen3 Coder Plus 2025 09 23", - "display_name": "Qwen3 Coder Plus 2025 09 23", + "id": "cohere/command-r-08-2024", + "name": "Command R (08-2024)", + "display_name": "Command R (08-2024)", "modalities": { "input": [ "text" @@ -65395,8 +64375,8 @@ ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 128000, + "output": 4000 }, "temperature": true, "tool_call": true, @@ -65404,12 +64384,16 @@ "supported": false }, "attachment": false, + "open_weights": true, + "knowledge": "2024-06-01", + "release_date": "2024-08-30", + "last_updated": "2024-08-30", "type": "chat" }, { - "id": "qwen3-coder-plus-2025-07-22", - "name": "Qwen3 Coder Plus 2025 07 22", - "display_name": "Qwen3 Coder Plus 2025 07 22", + "id": "cohere/command-r7b-12-2024", + "name": "Command R7B (12-2024)", + "display_name": "Command R7B (12-2024)", "modalities": { "input": [ "text" @@ -65419,8 +64403,8 @@ ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 128000, + "output": 4000 }, "temperature": true, "tool_call": true, @@ -65428,186 +64412,167 @@ "supported": false }, "attachment": false, + "open_weights": true, + "knowledge": "2024-06-01", + "release_date": "2024-12-13", + "last_updated": "2024-12-13", "type": "chat" }, { - "id": "qwen-vl-ocr-latest", - "name": "Qwen Vl Ocr Latest", - "display_name": "Qwen Vl Ocr Latest", + "id": "cohere/command-r-plus-08-2024", + "name": "Command R+ (08-2024)", + "display_name": "Command R+ (08-2024)", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 34096, - "output": 4096 + "context": 128000, + "output": 4000 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, "attachment": false, + "open_weights": true, + "knowledge": "2024-06-01", + "release_date": "2024-08-30", + "last_updated": "2024-08-30", "type": "chat" }, { - "id": "qvq-max-2025-05-15", - "name": "Qvq Max 2025 05 15", - "display_name": "Qvq Max 2025 05 15", + "id": "cohere/command-a", + "name": "Command A", + "display_name": "Command A", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 256000, + "output": 256000 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": true, - "default": false, - "budget": { - "default": 16384, - "min": 0, - "max": 16384 - } + "supported": false }, "attachment": false, + "open_weights": true, + "knowledge": "2024-08-31", + "release_date": "2025-03-13", + "last_updated": "2025-03-13", "type": "chat" }, { - "id": "qwen-turbo-latest", - "name": "Qwen Turbo Latest", - "display_name": "Qwen Turbo Latest", + "id": "mistralai/voxtral-small-24b-2507", + "name": "Voxtral Small 24B 2507", + "display_name": "Voxtral Small 24B 2507", "modalities": { "input": [ - "text" + "text", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 16384 + "context": 32000, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": false, - "budget": { - "default": 38912, - "min": 0, - "max": 38912 - } - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, - "search": { - "supported": true, - "default": false, - "forced_search": false, - "search_strategy": "turbo" + "supported": false }, - "attachment": false, + "attachment": true, + "open_weights": true, + "release_date": "2025-07-15", + "last_updated": "2025-07-15", "type": "chat" }, { - "id": "qwen-turbo-2024-09-19", - "name": "Qwen Turbo 2024 09 19", - "display_name": "Qwen Turbo 2024 09 19", + "id": "mistralai/mixtral-8x22b-instruct", + "name": "Mixtral 8x22B Instruct", + "display_name": "Mixtral 8x22B Instruct", "modalities": { "input": [ - "text" + "text", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 65536, + "output": 52428 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, + "attachment": true, + "open_weights": true, + "knowledge": "2024-01-31", + "release_date": "2024-04-17", + "last_updated": "2024-04-17", "type": "chat" }, { - "id": "qwen-flash-2025-07-28", - "name": "Qwen Flash 2025 07 28", - "display_name": "Qwen Flash 2025 07 28", + "id": "mistralai/mistral-small-2603", + "name": "Small 4", + "display_name": "Small 4", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 32768 + "context": 262144, + "output": 256000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false, - "budget": { - "default": 81920, - "min": 0, - "max": 81920 - } + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "none", + "high" ] } }, - "search": { - "supported": true, - "default": false, - "forced_search": false, - "search_strategy": "turbo" - }, - "attachment": false, + "attachment": true, + "open_weights": true, + "knowledge": "2025-06", + "release_date": "2026-03-16", + "last_updated": "2026-03-16", "type": "chat" }, { - "id": "qwen-plus-latest", - "name": "Qwen Plus Latest", - "display_name": "Qwen Plus Latest", + "id": "mistralai/mistral-small-24b-instruct-2501", + "name": "Small 3", + "display_name": "Small 3", "modalities": { "input": [ "text" @@ -65617,47 +64582,29 @@ ] }, "limit": { - "context": 1000000, - "output": 32768 + "context": 32768, + "output": 16384 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": false, - "budget": { - "default": 81920, - "min": 0, - "max": 81920 - } - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, - "search": { - "supported": true, - "default": false, - "forced_search": false, - "search_strategy": "turbo" + "supported": false }, "attachment": false, + "open_weights": true, + "knowledge": "2023-10-31", + "release_date": "2025-01-30", + "last_updated": "2025-01-30", "type": "chat" }, { - "id": "qwen-plus-2024-09-19", - "name": "Qwen Plus 2024 09 19", - "display_name": "Qwen Plus 2024 09 19", + "id": "mistralai/mistral-large-2407", + "name": "Large 2407", + "display_name": "Large 2407", "modalities": { "input": [ - "text" + "text", + "pdf" ], "output": [ "text" @@ -65665,23 +64612,28 @@ }, "limit": { "context": 131072, - "output": 8192 + "output": 104857 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, + "attachment": true, + "open_weights": true, + "knowledge": "2024-03-31", + "release_date": "2024-07-24", + "last_updated": "2024-07-24", "type": "chat" }, { - "id": "qwen-plus-2025-07-14", - "name": "Qwen Plus 2025 07 14", - "display_name": "Qwen Plus 2025 07 14", + "id": "mistralai/ministral-3b-2512", + "name": "Ministral 3 3B 2512", + "display_name": "Ministral 3 3B 2512", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" @@ -65689,43 +64641,23 @@ }, "limit": { "context": 131072, - "output": 16384 + "output": 104857 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": false, - "budget": { - "default": 38912, - "min": 0, - "max": 38912 - } - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, - "search": { - "supported": true, - "default": false, - "forced_search": false, - "search_strategy": "turbo" + "supported": false }, - "attachment": false, + "attachment": true, + "open_weights": true, + "release_date": "2025-12-02", + "last_updated": "2025-12-02", "type": "chat" }, { - "id": "qwen-plus-2025-09-11", - "name": "Qwen Plus 2025 09 11", - "display_name": "Qwen Plus 2025 09 11", + "id": "mistralai/mistral-nemo", + "name": "Mistral NeMo", + "display_name": "Mistral NeMo", "modalities": { "input": [ "text" @@ -65735,47 +64667,30 @@ ] }, "limit": { - "context": 1000000, - "output": 32768 + "context": 128000, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": false, - "budget": { - "default": 81920, - "min": 0, - "max": 81920 - } - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, - "search": { - "supported": true, - "default": false, - "forced_search": false, - "search_strategy": "turbo" + "supported": false }, "attachment": false, + "open_weights": true, + "knowledge": "2024-07", + "release_date": "2024-07-18", + "last_updated": "2024-07-18", "type": "chat" }, { - "id": "qwen-max-latest", - "name": "Qwen Max Latest", - "display_name": "Qwen Max Latest", + "id": "mistralai/mistral-medium-3", + "name": "Medium 3", + "display_name": "Medium 3", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" @@ -65783,82 +64698,85 @@ }, "limit": { "context": 131072, - "output": 8192 + "output": 104857 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "search": { - "supported": true, - "default": false, - "forced_search": false, - "search_strategy": "turbo" - }, - "attachment": false, + "attachment": true, + "open_weights": false, + "knowledge": "2025-03-31", + "release_date": "2025-05-07", + "last_updated": "2025-05-07", "type": "chat" }, { - "id": "qwen-max-2024-09-19", - "name": "Qwen Max 2024 09 19", - "display_name": "Qwen Max 2024 09 19", + "id": "mistralai/ministral-14b-2512", + "name": "Ministral 3 14B 2512", + "display_name": "Ministral 3 14B 2512", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 32768, - "output": 8192 + "context": 262144, + "output": 209715 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "search": { - "supported": true, - "default": false, - "forced_search": false, - "search_strategy": "turbo" - }, - "attachment": false, + "attachment": true, + "open_weights": true, + "release_date": "2025-12-02", + "last_updated": "2025-12-02", "type": "chat" }, { - "id": "qwen-max-2024-04-28", - "name": "Qwen Max 2024 04 28", - "display_name": "Qwen Max 2024 04 28", + "id": "mistralai/mistral-medium-3.1", + "name": "Medium 3.1", + "display_name": "Medium 3.1", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 8000, - "output": 2000 + "context": 131072, + "output": 104857 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, + "attachment": true, + "open_weights": false, + "knowledge": "2025-06-30", + "release_date": "2025-08-12", + "last_updated": "2025-08-12", "type": "chat" }, { - "id": "qwen-max-2024-04-03", - "name": "Qwen Max 2024 04 03", - "display_name": "Qwen Max 2024 04 03", + "id": "mistralai/mistral-small-3.2-24b-instruct", + "name": "Small 3.2 24B", + "display_name": "Small 3.2 24B", "modalities": { "input": [ + "image", "text" ], "output": [ @@ -65866,51 +64784,54 @@ ] }, "limit": { - "context": 8000, - "output": 2000 + "context": 128000, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, + "attachment": true, + "open_weights": true, + "knowledge": "2023-10-31", + "release_date": "2025-06-20", + "last_updated": "2025-06-20", "type": "chat" }, { - "id": "qwen-max-2025-01-25", - "name": "Qwen Max 2025 01 25", - "display_name": "Qwen Max 2025 01 25", + "id": "mistralai/mistral-small-3.1-24b-instruct", + "name": "Small 3.1 24B", + "display_name": "Small 3.1 24B", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 128000, + "output": 128000 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, - "search": { - "supported": true, - "default": false, - "forced_search": false, - "search_strategy": "turbo" - }, - "attachment": false, + "attachment": true, + "open_weights": true, + "knowledge": "2023-10-31", + "release_date": "2025-03-17", + "last_updated": "2025-03-17", "type": "chat" }, { - "id": "qwen3-max-2025-09-23", - "name": "Qwen3 Max 20250923", - "display_name": "Qwen3 Max 20250923", + "id": "mistralai/devstral-2512", + "name": "Devstral 2 2512", + "display_name": "Devstral 2 2512", "modalities": { "input": [ "text" @@ -65921,197 +64842,147 @@ }, "limit": { "context": 262144, - "output": 65536 + "output": 262144 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "search": { - "supported": true, - "default": false, - "forced_search": false, - "search_strategy": "turbo" - }, "attachment": false, + "open_weights": true, + "knowledge": "2025-12", + "release_date": "2025-12-09", + "last_updated": "2025-12-09", "type": "chat" }, { - "id": "qwen3-max-preview", - "name": "Qwen3 Max Preview", - "display_name": "Qwen3 Max Preview", + "id": "mistralai/mistral-saba", + "name": "Saba", + "display_name": "Saba", "modalities": { "input": [ - "text" + "text", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 32768, + "output": 26214 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, - "search": { - "supported": true, - "default": false, - "forced_search": false, - "search_strategy": "turbo" - }, - "attachment": false, - "type": "chat" - }, - { - "id": "qwen3-235b-a22b-thinking-2507", - "name": "Qwen3 235B A22B Thinking 2507", - "display_name": "Qwen3 235B A22B Thinking 2507", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 131072, - "output": 32768 - }, - "temperature": true, - "tool_call": false, - "reasoning": { - "supported": true, - "default": true, - "budget": { - "default": 81920, - "min": 0, - "max": 81920 - } - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, - "attachment": false, + "attachment": true, + "open_weights": false, + "knowledge": "2024-09-30", + "release_date": "2025-02-17", + "last_updated": "2025-02-17", "type": "chat" }, { - "id": "qwen3-235b-a22b-instruct-2507", - "name": "Qwen3 235B A22B Instruct 2507", - "display_name": "Qwen3 235B A22B Instruct 2507", + "id": "mistralai/mistral-large", + "name": "Large", + "display_name": "Large", "modalities": { "input": [ - "text" + "text", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 128000, + "output": 102400 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, + "attachment": true, + "open_weights": false, + "knowledge": "2024-11-30", + "release_date": "2024-02-26", + "last_updated": "2024-02-26", "type": "chat" }, { - "id": "qwen3-30b-a3b-instruct-2507", - "name": "Qwen3 30B A3B Instruct 2507", - "display_name": "Qwen3 30B A3B Instruct 2507", + "id": "mistralai/ministral-8b-2512", + "name": "Ministral 3 8B 2512", + "display_name": "Ministral 3 8B 2512", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 262144, + "output": 209715 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, + "attachment": true, + "open_weights": true, + "release_date": "2025-12-02", + "last_updated": "2025-12-02", "type": "chat" }, { - "id": "qwen3-30b-a3b-thinking-2507", - "name": "Qwen3 30B A3B Thinking 2507", - "display_name": "Qwen3 30B A3B Thinking 2507", + "id": "mistralai/mistral-medium-3-5", + "name": "Medium 3.5", + "display_name": "Medium 3.5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 262144, + "output": 209715 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, - "default": true, - "budget": { - "default": 81920, - "min": 0, - "max": 81920 - } + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "high" ] } }, - "attachment": false, + "attachment": true, + "open_weights": false, + "release_date": "2026-04-30", + "last_updated": "2026-04-30", "type": "chat" }, { - "id": "qwen3-30b-a3b", - "name": "Qwen3 30B A3B", - "display_name": "Qwen3 30B A3B", + "id": "mistralai/codestral-2508", + "name": "Codestral 2508", + "display_name": "Codestral 2508", "modalities": { "input": [ "text" @@ -66121,105 +64992,106 @@ ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 256000, + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": false, - "budget": { - "default": 81920, - "min": 0, - "max": 81920 - } - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": false, + "open_weights": false, + "release_date": "2025-07-30", + "last_updated": "2025-07-30", "type": "chat" }, { - "id": "qwen3-4b", - "name": "Qwen3 4B", - "display_name": "Qwen3 4B", + "id": "google/gemini-3.1-pro-preview", + "name": "Gemini 3.1 Pro Preview", + "display_name": "Gemini 3.1 Pro Preview", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 1000000, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true, - "budget": { - "default": 38912, - "min": 0, - "max": 38912 - } + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "low", + "high" + ], "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" + "thought_signatures" ] } }, - "attachment": false, + "attachment": true, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2026-02-19", + "last_updated": "2026-02-19", "type": "chat" }, { - "id": "qwen3-1.7b", - "name": "Qwen3 1.7B", - "display_name": "Qwen3 1.7B", + "id": "google/gemini-3.1-pro-preview-customtools", + "name": "Gemini 3.1 Pro Preview Custom Tools", + "display_name": "Gemini 3.1 Pro Preview Custom Tools", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 32768, - "output": 8192 + "context": 1048756, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true, - "budget": { - "default": 30720, - "min": 0, - "max": 30720 - } + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "low", + "high" + ], "interleaved": true, "summaries": true, "visibility": "summary", @@ -66228,13 +65100,17 @@ ] } }, - "attachment": false, + "attachment": true, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2026-02-19", + "last_updated": "2026-02-19", "type": "chat" }, { - "id": "qwen3-0.6b", - "name": "Qwen3 0.6B", - "display_name": "Qwen3 0.6B", + "id": "google/gemma-2-27b-it", + "name": "Gemma 2 27B", + "display_name": "Gemma 2 27B", "modalities": { "input": [ "text" @@ -66244,38 +65120,25 @@ ] }, "limit": { - "context": 32768, - "output": 8192 + "context": 8192, + "output": 2048 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true, - "budget": { - "default": 30720, - "min": 0, - "max": 30720 - } - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": false, + "open_weights": true, + "knowledge": "2024-06-30", + "release_date": "2024-07-13", + "last_updated": "2024-07-13", "type": "chat" }, { - "id": "qwen3-vl-plus-2025-09-23", - "name": "Qwen3 VL Plus 2025 09 23", - "display_name": "Qwen3 VL Plus 2025 09 23", + "id": "google/gemma-3-12b-it", + "name": "Gemma 3 12B", + "display_name": "Gemma 3 12B", "modalities": { "input": [ "text", @@ -66286,60 +65149,46 @@ ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 131000, + "output": 96000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": false, - "budget": { - "default": 81920, - "min": 0, - "max": 81920 - } - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, - "attachment": false, + "attachment": true, + "open_weights": true, + "knowledge": "2024-08", + "release_date": "2025-03-12", + "last_updated": "2025-03-12", "type": "chat" }, { - "id": "qwq-plus-latest", - "name": "QwQ Plus Latest", - "display_name": "QwQ Plus Latest", + "id": "google/gemini-flash-latest", + "name": "Gemini Flash Latest", + "display_name": "Gemini Flash Latest", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 1048576, + "output": 65536 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, - "default": true, - "budget": { - "default": 32768, - "min": 0, - "max": 32768 - } + "default": true }, "extra_capabilities": { "reasoning": { @@ -66349,32 +65198,31 @@ "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "effort_options": [ + "low", + "medium", + "high" ] } }, - "search": { - "supported": false - }, - "attachment": false, + "attachment": true, + "open_weights": false, + "knowledge": "2026-03", + "release_date": "2026-08-13", + "last_updated": "2026-08-13", "type": "chat" - } - ] - }, - "deepinfra": { - "id": "deepinfra", - "name": "Deep Infra", - "display_name": "Deep Infra", - "doc": "https://deepinfra.com/models", - "models": [ + }, { - "id": "Qwen/Qwen3.8-Max", - "name": "Qwen3.8 Max", - "display_name": "Qwen3.8 Max", + "id": "google/gemini-3-8-flash", + "name": "Gemini 3.8 Flash", + "display_name": "Gemini 3.8 Flash", "modalities": { "input": [ "text", "image", "video", + "audio", "pdf" ], "output": [ @@ -66382,85 +65230,84 @@ ] }, "limit": { - "context": 256000, - "output": 131072 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true + "effort_options": [ + "low", + "medium", + "high" + ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-08-03", - "last_updated": "2026-08-03", + "release_date": "2026-09-02", + "last_updated": "2026-09-02", "type": "chat" }, { - "id": "Qwen/Qwen3-32B", - "name": "Qwen3 32B", - "display_name": "Qwen3 32B", + "id": "google/gemma-3-4b-it", + "name": "Gemma 3 4B", + "display_name": "Gemma 3 4B", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 40960, - "output": 16384 + "context": 131000, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-04-28", - "last_updated": "2025-04-28", + "knowledge": "2024-08", + "release_date": "2025-03-12", + "last_updated": "2025-03-12", "type": "chat" }, { - "id": "Qwen/Qwen3-Max", - "name": "Qwen3 Max", - "display_name": "Qwen3 Max", + "id": "google/gemini-3.1-flash-lite-preview", + "name": "Gemini 3.1 Flash Lite Preview", + "display_name": "Gemini 3.1 Flash Lite Preview", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 256000, + "context": 1000000, "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { @@ -66470,23 +65317,29 @@ "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "effort_options": [ + "low", + "medium", + "high" ] } }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2025-04", - "release_date": "2025-09-23", - "last_updated": "2025-09-23", + "knowledge": "2025-01", + "release_date": "2026-03-03", + "last_updated": "2026-03-03", "type": "chat" }, { - "id": "Qwen/Qwen3.8-2.4T-A95B", - "name": "Qwen3.8 2.4T A95B", - "display_name": "Qwen3.8 2.4T A95B", + "id": "google/gemma-4-26b-a4b-it", + "name": "Gemma 4 26B A4B IT", + "display_name": "Gemma 4 26B A4B IT", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" @@ -66494,7 +65347,79 @@ }, "limit": { "context": 262144, - "output": 131072 + "output": 128000 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": true, + "open_weights": true, + "release_date": "2026-04-02", + "last_updated": "2026-04-02", + "type": "chat" + }, + { + "id": "google/gemma-4-31b-it", + "name": "Gemma 4 31B Instruct", + "display_name": "Gemma 4 31B Instruct", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 256000, + "output": 16384 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": true, + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-04-02", + "last_updated": "2026-04-02", + "type": "chat" + }, + { + "id": "google/gemini-3.7-flash", + "name": "Gemini 3.7 Flash", + "display_name": "Gemini 3.7 Flash", + "modalities": { + "input": [ + "text", + "image", + "video", + "audio", + "pdf" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -66505,92 +65430,128 @@ "extra_capabilities": { "reasoning": { "supported": true, - "effort_options": [ + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", "low", "medium", - "xhigh" + "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-08-12", - "last_updated": "2026-08-12", + "attachment": true, + "open_weights": false, + "knowledge": "2026-03", + "release_date": "2026-08-13", + "last_updated": "2026-08-13", "type": "chat" }, { - "id": "Qwen/Qwen3-Next-80B-A3B-Instruct", - "name": "Qwen3-Next 80B-A3B Instruct", - "display_name": "Qwen3-Next 80B-A3B Instruct", + "id": "google/gemini-3.8-flash", + "name": "Gemini 3.8 Flash", + "display_name": "Gemini 3.8 Flash", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-09", - "last_updated": "2025-09", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", + "low", + "medium", + "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] + } + }, + "attachment": true, + "open_weights": false, + "release_date": "2026-09-02", + "last_updated": "2026-09-02", "type": "chat" }, { - "id": "Qwen/Qwen3-Coder-480B-A35B-Instruct-Turbo", - "name": "Qwen3 Coder 480B A35B Instruct Turbo", - "display_name": "Qwen3 Coder 480B A35B Instruct Turbo", + "id": "google/gemma-3-27b-it", + "name": "Gemma 3 27B", + "display_name": "Gemma 3 27B", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 66536 + "context": 128000, + "output": 117964 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-07-22", - "last_updated": "2025-07-22", + "knowledge": "2024-08", + "release_date": "2025-03-12", + "last_updated": "2025-03-12", "type": "chat" }, { - "id": "Qwen/Qwen3.6-35B-A3B", - "name": "Qwen3.6 35B A3B", - "display_name": "Qwen3.6 35B A3B", + "id": "google/gemini-3.6-flash", + "name": "Gemini 3.6 Flash", + "display_name": "Gemini 3.6 Flash", "modalities": { "input": [ "text", "image", - "video" + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 81920 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -66601,24 +65562,33 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", + "low", + "medium", + "high" + ], "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" + "thought_signatures" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-04-17", - "last_updated": "2026-04-17", + "open_weights": false, + "knowledge": "2026-03", + "release_date": "2026-07-21", + "last_updated": "2026-07-21", "type": "chat" }, { - "id": "Qwen/Qwen3-30B-A3B", - "name": "Qwen3 30B A3B", - "display_name": "Qwen3 30B A3B", + "id": "zhipu/glm-5.2", + "name": "GLM 5.2", + "display_name": "GLM 5.2", "modalities": { "input": [ "text" @@ -66628,8 +65598,8 @@ ] }, "limit": { - "context": 40960, - "output": 16384 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -66640,70 +65610,72 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "high" ] } }, "attachment": false, "open_weights": true, - "release_date": "2025-04-28", - "last_updated": "2025-04-28", + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "Qwen/Qwen3.8-Flash", - "name": "Qwen3.8 Flash", - "display_name": "Qwen3.8 Flash", + "id": "zhipu/glm-5.3", + "name": "GLM 5.3", + "display_name": "GLM 5.3", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, + "context": 1024000, "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "effort_options": [ + "low", + "high" + ] } }, - "attachment": true, - "open_weights": false, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", + "attachment": false, + "open_weights": true, + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "Qwen/Qwen3-VL-30B-A3B-Instruct", - "name": "Qwen3 VL 30B A3B Instruct", - "display_name": "Qwen3 VL 30B A3B Instruct", + "id": "x-ai/grok-4-fast-non-reasoning", + "name": "Grok 4 Fast Non-Reasoning", + "display_name": "Grok 4 Fast Non-Reasoning", "modalities": { "input": [ "text", - "image" + "image", + "audio", + "video" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 2000000, + "output": 1999000 }, "temperature": true, "tool_call": true, @@ -66711,56 +65683,52 @@ "supported": false }, "attachment": true, - "open_weights": true, - "release_date": "2025-10-04", - "last_updated": "2025-10-04", + "open_weights": false, + "release_date": "2025-12-18", + "last_updated": "2025-12-18", "type": "chat" }, { - "id": "Qwen/Qwen3.6-27B", - "name": "Qwen3.6 27B", - "display_name": "Qwen3.6 27B", + "id": "x-ai/grok-4-20-0309-non-reasoning", + "name": "Grok 4.20 Non-Reasoning", + "display_name": "Grok 4.20 Non-Reasoning", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 2000000, + "output": 1999000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": true, - "open_weights": true, - "release_date": "2026-04-22", - "last_updated": "2026-04-22", + "open_weights": false, + "release_date": "2026-03-09", + "last_updated": "2026-03-09", "type": "chat" - }, + } + ] + }, + "deepinfra": { + "id": "deepinfra", + "name": "Deep Infra", + "display_name": "Deep Infra", + "doc": "https://deepinfra.com/models", + "models": [ { - "id": "Qwen/Qwen3.5-27B", - "name": "Qwen3.5 27B", - "display_name": "Qwen3.5 27B", + "id": "stepfun-ai/Step-3.7-Flash", + "name": "Step 3.7 Flash", + "display_name": "Step 3.7 Flash", "modalities": { "input": [ "text", @@ -66773,7 +65741,7 @@ }, "limit": { "context": 262144, - "output": 65536 + "output": 256000 }, "temperature": true, "tool_call": true, @@ -66781,27 +65749,17 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, "attachment": true, "open_weights": true, - "release_date": "2026-02-23", - "last_updated": "2026-02-23", + "knowledge": "2026-03-01", + "release_date": "2026-05-29", + "last_updated": "2026-05-29", "type": "chat" }, { - "id": "Qwen/Qwen3.8-27B", - "name": "Qwen3.8 27B", - "display_name": "Qwen3.8 27B", + "id": "stepfun-ai/Step-5-Preview", + "name": "Step 5 Preview", + "display_name": "Step 5 Preview", "modalities": { "input": [ "text", @@ -66813,8 +65771,8 @@ ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 1048576, + "output": 1000000 }, "temperature": true, "tool_call": true, @@ -66827,164 +65785,134 @@ "effort_options": [ "low", "medium", - "xhigh" + "high" ] } }, "attachment": true, "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "release_date": "2026-09-16", + "last_updated": "2026-09-20", "type": "chat" }, { - "id": "Qwen/Qwen3.5-397B-A17B", - "name": "Qwen 3.5 397B A17B", - "display_name": "Qwen 3.5 397B A17B", + "id": "meta-llama/Llama-Guard-4-12B", + "name": "Llama Guard 4 12B", + "display_name": "Llama Guard 4 12B", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 81920 + "context": 163840, + "output": 163840 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": true, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-02-15", - "last_updated": "2026-02-15", + "release_date": "2025-04-29", + "last_updated": "2025-04-29", "type": "chat" }, { - "id": "Qwen/Qwen3.7-Max", - "name": "Qwen3.7 Max", - "display_name": "Qwen3.7 Max", + "id": "meta-llama/Llama-4-Scout-17B-16E-Instruct", + "name": "Llama 4 Scout 17B", + "display_name": "Llama 4 Scout 17B", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 131072 + "context": 327680, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, - "attachment": false, - "open_weights": false, - "release_date": "2026-05-21", - "last_updated": "2026-05-21", + "attachment": true, + "open_weights": true, + "knowledge": "2024-08", + "release_date": "2025-04-05", + "last_updated": "2025-04-05", "type": "chat" }, { - "id": "Qwen/Qwen3.5-9B", - "name": "Qwen3.5 9B", - "display_name": "Qwen3.5 9B", + "id": "meta-llama/Llama-4-Maverick-17B-128E-Instruct-FP8", + "name": "Llama 4 Maverick 17B FP8", + "display_name": "Llama 4 Maverick 17B FP8", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 1048576, + "output": 16384 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": true, "open_weights": true, - "release_date": "2026-02-23", - "last_updated": "2026-02-23", + "knowledge": "2024-08", + "release_date": "2025-04-05", + "last_updated": "2025-04-05", "type": "chat" }, { - "id": "Qwen/Qwen3-VL-235B-A22B-Instruct", - "name": "Qwen3 VL 235B A22B Instruct", - "display_name": "Qwen3 VL 235B A22B Instruct", + "id": "meta-llama/Llama-3.3-70B-Instruct-Turbo", + "name": "Llama 3.3 70B Turbo", + "display_name": "Llama 3.3 70B Turbo", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 131072, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2025-03-31", - "release_date": "2025-09-23", - "last_updated": "2025-09-23", + "knowledge": "2023-12", + "release_date": "2024-12-06", + "last_updated": "2024-12-06", "type": "chat" }, { - "id": "Qwen/Qwen3.5-122B-A10B", - "name": "Qwen3.5 122B-A10B", - "display_name": "Qwen3.5 122B-A10B", + "id": "moonshotai/Kimi-K2.6", + "name": "Kimi K2.6", + "display_name": "Kimi K2.6", "modalities": { "input": [ "text", @@ -66997,7 +65925,7 @@ }, "limit": { "context": 262144, - "output": 65536 + "output": 16384 }, "temperature": true, "tool_call": true, @@ -67018,14 +65946,15 @@ }, "attachment": true, "open_weights": true, - "release_date": "2026-02-23", - "last_updated": "2026-02-23", + "knowledge": "2025-01", + "release_date": "2026-04-20", + "last_updated": "2026-04-20", "type": "chat" }, { - "id": "Qwen/Qwen3.5-35B-A3B", - "name": "Qwen 3.5 35B A3B", - "display_name": "Qwen 3.5 35B A3B", + "id": "moonshotai/Kimi-K2.7-Code", + "name": "Kimi K2.7 Code", + "display_name": "Kimi K2.7 Code", "modalities": { "input": [ "text", @@ -67038,9 +65967,9 @@ }, "limit": { "context": 262144, - "output": 81920 + "output": 262144 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -67060,52 +65989,66 @@ "attachment": true, "open_weights": true, "knowledge": "2025-01", - "release_date": "2026-02-23", - "last_updated": "2026-02-23", + "release_date": "2026-06-12", + "last_updated": "2026-06-12", "type": "chat" }, { - "id": "Qwen/Qwen3-235B-A22B-Instruct-2507", - "name": "Qwen3 235B-A22B Instruct 2507", - "display_name": "Qwen3 235B-A22B Instruct 2507", + "id": "moonshotai/Kimi-K3", + "name": "Kimi K3", + "display_name": "Kimi K3", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 16384 + "context": 1048576, + "output": 131072 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "low", + "high", + "max" + ] + } + }, + "attachment": true, "open_weights": true, - "release_date": "2025-07-21", - "last_updated": "2025-07-21", + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" }, { - "id": "MiniMaxAI/MiniMax-M2.7", - "name": "MiniMax-M2.7", - "display_name": "MiniMax-M2.7", + "id": "moonshotai/Kimi-K2.5", + "name": "Kimi K2.5", + "display_name": "Kimi K2.5", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 196608, - "output": 131072 + "context": 262144, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -67124,29 +66067,28 @@ ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-03-18", - "last_updated": "2026-03-18", + "knowledge": "2025-01", + "release_date": "2026-01-27", + "last_updated": "2026-01-27", "type": "chat" }, { - "id": "MiniMaxAI/MiniMax-M3", - "name": "MiniMax-M3", - "display_name": "MiniMax-M3", + "id": "openai/gpt-oss-20b", + "name": "GPT OSS 20B", + "display_name": "GPT OSS 20B", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 524288, - "output": 512000 + "context": 131072, + "output": 16384 }, "temperature": true, "tool_call": true, @@ -67156,19 +66098,25 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "effort_options": [ + "low", + "medium", + "high" + ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-06-01", - "last_updated": "2026-06-01", + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "MiniMaxAI/MiniMax-M2.5", - "name": "MiniMax M2.5", - "display_name": "MiniMax M2.5", + "id": "openai/gpt-oss-120b", + "name": "GPT OSS 120B", + "display_name": "GPT OSS 120B", "modalities": { "input": [ "text" @@ -67178,8 +66126,8 @@ ] }, "limit": { - "context": 196608, - "output": 131072 + "context": 131072, + "output": 16384 }, "temperature": true, "tool_call": true, @@ -67190,19 +66138,18 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "low", + "medium", + "high" ] } }, "attachment": false, "open_weights": true, - "knowledge": "2025-06", - "release_date": "2026-02-12", - "last_updated": "2026-02-12", + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { @@ -67233,35 +66180,6 @@ "last_updated": "2025-07-25", "type": "chat" }, - { - "id": "nvidia/Nemotron-3-Nano-30B-A3B", - "name": "Nemotron 3 Nano 30B A3B", - "display_name": "Nemotron 3 Nano 30B A3B", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 262144, - "output": 262144 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-06-25", - "release_date": "2025-12-15", - "last_updated": "2025-12-15", - "type": "chat" - }, { "id": "nvidia/Nemotron-3-Nano-Omni-30B-A3B-Reasoning", "name": "Nemotron 3 Nano Omni 30B A3B Reasoning", @@ -67299,51 +66217,20 @@ "type": "chat" }, { - "id": "google/gemma-3-27b-it", - "name": "Gemma 3 27B IT", - "display_name": "Gemma 3 27B IT", + "id": "nvidia/Nemotron-3-Nano-30B-A3B", + "name": "Nemotron 3 Nano 30B A3B", + "display_name": "Nemotron 3 Nano 30B A3B", "modalities": { "input": [ - "text", - "image" - ], - "output": [ "text" - ] - }, - "limit": { - "context": 131072, - "output": 131072 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": true, - "knowledge": "2024-08", - "release_date": "2025-03-12", - "last_updated": "2025-03-12", - "type": "chat" - }, - { - "id": "google/gemma-4-E4B-it", - "name": "Gemma 4 E4B IT", - "display_name": "Gemma 4 E4B IT", - "modalities": { - "input": [ - "text", - "image", - "audio" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, @@ -67351,28 +66238,28 @@ "supported": true, "default": true }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "knowledge": "2025-06-25", + "release_date": "2025-12-15", + "last_updated": "2025-12-15", "type": "chat" }, { - "id": "google/gemma-4-26B-A4B-it", - "name": "Gemma 4 26B A4B IT", - "display_name": "Gemma 4 26B A4B IT", + "id": "MiniMaxAI/MiniMax-M2.7", + "name": "MiniMax-M2.7", + "display_name": "MiniMax-M2.7", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 196608, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -67382,48 +66269,65 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "release_date": "2026-03-18", + "last_updated": "2026-03-18", "type": "chat" }, { - "id": "google/gemma-3-12b-it", - "name": "Gemma 3 12B IT", - "display_name": "Gemma 3 12B IT", + "id": "MiniMaxAI/MiniMax-M2.5", + "name": "MiniMax M2.5", + "display_name": "MiniMax M2.5", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 131072, + "context": 196608, "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, "open_weights": true, - "knowledge": "2024-08", - "release_date": "2025-03-12", - "last_updated": "2025-03-12", + "knowledge": "2025-06", + "release_date": "2026-02-12", + "last_updated": "2026-02-12", "type": "chat" }, { - "id": "google/gemma-4-31B-it", - "name": "Gemma 4 31B IT", - "display_name": "Gemma 4 31B IT", + "id": "MiniMaxAI/MiniMax-M3", + "name": "MiniMax-M3", + "display_name": "MiniMax-M3", "modalities": { "input": [ "text", @@ -67435,8 +66339,8 @@ ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 524288, + "output": 512000 }, "temperature": true, "tool_call": true, @@ -67451,44 +66355,55 @@ }, "attachment": true, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "release_date": "2026-06-01", + "last_updated": "2026-06-01", "type": "chat" }, { - "id": "google/gemma-3-4b-it", - "name": "Gemma 3 4B IT", - "display_name": "Gemma 3 4B IT", + "id": "Qwen/Qwen3.5-122B-A10B", + "name": "Qwen3.5 122B-A10B", + "display_name": "Qwen3.5 122B-A10B", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 131072 + "context": 262144, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": true, "open_weights": true, - "knowledge": "2024-08", - "release_date": "2025-03-12", - "last_updated": "2025-03-12", + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" }, { - "id": "moonshotai/Kimi-K2.6", - "name": "Kimi K2.6", - "display_name": "Kimi K2.6", + "id": "Qwen/Qwen3.6-35B-A3B", + "name": "Qwen3.6 35B A3B", + "display_name": "Qwen3.6 35B A3B", "modalities": { "input": [ "text", @@ -67501,7 +66416,7 @@ }, "limit": { "context": 262144, - "output": 16384 + "output": 81920 }, "temperature": true, "tool_call": true, @@ -67522,29 +66437,29 @@ }, "attachment": true, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-20", - "last_updated": "2026-04-20", + "release_date": "2026-04-17", + "last_updated": "2026-04-17", "type": "chat" }, { - "id": "moonshotai/Kimi-K3", - "name": "Kimi K3", - "display_name": "Kimi K3", + "id": "Qwen/Qwen3.5-9B", + "name": "Qwen3.5 9B", + "display_name": "Qwen3.5 9B", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 262144, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -67553,23 +66468,24 @@ "extra_capabilities": { "reasoning": { "supported": true, - "effort_options": [ - "low", - "high", - "max" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, "attachment": true, "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-16", + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" }, { - "id": "moonshotai/Kimi-K2.7-Code", - "name": "Kimi K2.7 Code", - "display_name": "Kimi K2.7 Code", + "id": "Qwen/Qwen3.5-397B-A17B", + "name": "Qwen 3.5 397B A17B", + "display_name": "Qwen 3.5 397B A17B", "modalities": { "input": [ "text", @@ -67582,9 +66498,9 @@ }, "limit": { "context": 262144, - "output": 262144 + "output": 81920 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -67604,27 +66520,25 @@ "attachment": true, "open_weights": true, "knowledge": "2025-01", - "release_date": "2026-06-12", - "last_updated": "2026-06-12", + "release_date": "2026-02-15", + "last_updated": "2026-02-15", "type": "chat" }, { - "id": "moonshotai/Kimi-K2.5", - "name": "Kimi K2.5", - "display_name": "Kimi K2.5", + "id": "Qwen/Qwen3-32B", + "name": "Qwen3 32B", + "display_name": "Qwen3 32B", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 40960, + "output": 16384 }, "temperature": true, "tool_call": true, @@ -67643,85 +66557,80 @@ ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-01-27", - "last_updated": "2026-01-27", + "knowledge": "2025-04", + "release_date": "2025-04-28", + "last_updated": "2025-04-28", "type": "chat" }, { - "id": "XiaomiMiMo/MiMo-V2.6-Flash", - "name": "MiMo-V2.6-Flash", - "display_name": "MiMo-V2.6-Flash", + "id": "Qwen/Qwen3.7-Max", + "name": "Qwen3.7 Max", + "display_name": "Qwen3.7 Max", "modalities": { "input": [ - "text", - "image", - "audio", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, + "context": 256000, "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": true }, - "attachment": true, - "open_weights": true, - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": false, + "open_weights": false, + "release_date": "2026-05-21", + "last_updated": "2026-05-21", "type": "chat" }, { - "id": "XiaomiMiMo/MiMo-V2.6-Pro", - "name": "MiMo-V2.6-Pro", - "display_name": "MiMo-V2.6-Pro", + "id": "Qwen/Qwen3-235B-A22B-Instruct-2507", + "name": "Qwen3 235B-A22B Instruct 2507", + "display_name": "Qwen3 235B-A22B Instruct 2507", "modalities": { "input": [ - "text", - "image", - "audio", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 262144, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "release_date": "2025-07-21", + "last_updated": "2025-07-21", "type": "chat" }, { - "id": "XiaomiMiMo/MiMo-V2.5", - "name": "MiMo-V2.5", - "display_name": "MiMo-V2.5", + "id": "Qwen/Qwen3-VL-30B-A3B-Instruct", + "name": "Qwen3 VL 30B A3B Instruct", + "display_name": "Qwen3 VL 30B A3B Instruct", "modalities": { "input": [ "text", - "image", - "audio", - "video" + "image" ], "output": [ "text" @@ -67729,47 +66638,33 @@ }, "limit": { "context": 262144, - "output": 16384 + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": true, "open_weights": true, - "knowledge": "2024-12", - "release_date": "2026-04-22", - "last_updated": "2026-04-22", + "release_date": "2025-10-04", + "last_updated": "2025-10-04", "type": "chat" }, { - "id": "XiaomiMiMo/MiMo-V2.5-Pro", - "name": "MiMo-V2.5-Pro", - "display_name": "MiMo-V2.5-Pro", + "id": "Qwen/Qwen3-30B-A3B", + "name": "Qwen3 30B A3B", + "display_name": "Qwen3 30B A3B", "modalities": { "input": [ - "text", - "audio" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, + "context": 40960, "output": 16384 }, "temperature": true, @@ -67789,58 +66684,85 @@ ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2024-12", - "release_date": "2026-04-22", - "last_updated": "2026-04-22", + "release_date": "2025-04-28", + "last_updated": "2025-04-28", "type": "chat" }, { - "id": "ByteDance/Seed-2.0-pro", - "name": "Seed 2.0 Pro", - "display_name": "Seed 2.0 Pro", + "id": "Qwen/Qwen3-Next-80B-A3B-Instruct", + "name": "Qwen3-Next 80B-A3B Instruct", + "display_name": "Qwen3-Next 80B-A3B Instruct", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 128000 + "context": 262144, + "output": 32768 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": true, - "open_weights": false, - "release_date": "2026-02-14", - "last_updated": "2026-02-14", + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-09", + "last_updated": "2025-09", "type": "chat" }, { - "id": "ByteDance/Seed-2.0-code", - "name": "Seed 2.0 Code", - "display_name": "Seed 2.0 Code", + "id": "Qwen/Qwen3-Coder-480B-A35B-Instruct-Turbo", + "name": "Qwen3 Coder 480B A35B Instruct Turbo", + "display_name": "Qwen3 Coder 480B A35B Instruct Turbo", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 262144, + "output": 66536 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-07-22", + "last_updated": "2025-07-22", + "type": "chat" + }, + { + "id": "Qwen/Qwen3.8-27B", + "name": "Qwen3.8 27B", + "display_name": "Qwen3.8 27B", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 131072 + "context": 262144, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -67851,23 +66773,22 @@ "extra_capabilities": { "reasoning": { "effort_options": [ - "none", "low", "medium", - "high" + "xhigh" ] } }, "attachment": true, - "open_weights": false, - "release_date": "2026-02-14", - "last_updated": "2026-02-14", + "open_weights": true, + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "ByteDance/Seed-2.0-mini", - "name": "Seed 2.0 Mini", - "display_name": "Seed 2.0 Mini", + "id": "Qwen/Qwen3-VL-235B-A22B-Instruct", + "name": "Qwen3 VL 235B A22B Instruct", + "display_name": "Qwen3 VL 235B A22B Instruct", "modalities": { "input": [ "text", @@ -67878,8 +66799,38 @@ ] }, "limit": { - "context": 256000, - "output": 32000 + "context": 262144, + "output": 32768 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": true, + "knowledge": "2025-03-31", + "release_date": "2025-09-23", + "last_updated": "2025-09-23", + "type": "chat" + }, + { + "id": "Qwen/Qwen3.5-27B", + "name": "Qwen3.5 27B", + "display_name": "Qwen3.5 27B", + "modalities": { + "input": [ + "text", + "image", + "video" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 262144, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -67887,16 +66838,27 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, "attachment": true, - "open_weights": false, - "release_date": "2026-02-14", - "last_updated": "2026-02-14", + "open_weights": true, + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" }, { - "id": "openai/gpt-oss-120b", - "name": "GPT OSS 120B", - "display_name": "GPT OSS 120B", + "id": "Qwen/Qwen3-Max", + "name": "Qwen3 Max", + "display_name": "Qwen3 Max", "modalities": { "input": [ "text" @@ -67906,8 +66868,49 @@ ] }, "limit": { - "context": 131072, - "output": 16384 + "context": 256000, + "output": 65536 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, + "open_weights": false, + "knowledge": "2025-04", + "release_date": "2025-09-23", + "last_updated": "2025-09-23", + "type": "chat" + }, + { + "id": "Qwen/Qwen3.5-35B-A3B", + "name": "Qwen 3.5 35B A3B", + "display_name": "Qwen 3.5 35B A3B", + "modalities": { + "input": [ + "text", + "image", + "video" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 262144, + "output": 81920 }, "temperature": true, "tool_call": true, @@ -67918,24 +66921,25 @@ "extra_capabilities": { "reasoning": { "supported": true, - "effort_options": [ - "low", - "medium", - "high" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "knowledge": "2025-01", + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" }, { - "id": "openai/gpt-oss-20b", - "name": "GPT OSS 20B", - "display_name": "GPT OSS 20B", + "id": "Qwen/Qwen3.8-2.4T-A95B", + "name": "Qwen3.8 2.4T A95B", + "display_name": "Qwen3.8 2.4T A95B", "modalities": { "input": [ "text" @@ -67945,8 +66949,8 @@ ] }, "limit": { - "context": 131072, - "output": 16384 + "context": 262144, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -67960,32 +66964,33 @@ "effort_options": [ "low", "medium", - "high" + "xhigh" ] } }, "attachment": false, "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "release_date": "2026-08-12", + "last_updated": "2026-08-12", "type": "chat" }, { - "id": "zai-org/GLM-5", - "name": "GLM-5", - "display_name": "GLM-5", + "id": "Qwen/Qwen3.6-27B", + "name": "Qwen3.6 27B", + "display_name": "Qwen3.6 27B", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 202752, - "output": 16384 + "context": 262144, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -68004,17 +67009,85 @@ ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2025-12", - "release_date": "2026-02-12", - "last_updated": "2026-02-12", + "release_date": "2026-04-22", + "last_updated": "2026-04-22", "type": "chat" }, { - "id": "zai-org/GLM-4.7-Flash", - "name": "GLM-4.7-Flash", - "display_name": "GLM-4.7-Flash", + "id": "Qwen/Qwen3.8-Flash", + "name": "Qwen3.8 Flash", + "display_name": "Qwen3.8 Flash", + "modalities": { + "input": [ + "text", + "image", + "video" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1000000, + "output": 131072 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": true, + "open_weights": false, + "release_date": "2026-08-26", + "last_updated": "2026-08-26", + "type": "chat" + }, + { + "id": "Qwen/Qwen3.8-Max", + "name": "Qwen3.8 Max", + "display_name": "Qwen3.8 Max", + "modalities": { + "input": [ + "text", + "image", + "video", + "pdf" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 256000, + "output": 131072 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": true, + "open_weights": false, + "release_date": "2026-08-03", + "last_updated": "2026-08-03", + "type": "chat" + }, + { + "id": "tencent/Hy4-preview", + "name": "Hy4 preview", + "display_name": "Hy4 preview", "modalities": { "input": [ "text" @@ -68024,8 +67097,8 @@ ] }, "limit": { - "context": 202752, - "output": 16384 + "context": 1048576, + "output": 64000 }, "temperature": true, "tool_call": true, @@ -68036,25 +67109,22 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "none", + "high" ] } }, "attachment": false, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2026-01-19", - "last_updated": "2026-01-19", + "release_date": "2026-08-28", + "last_updated": "2026-08-28", "type": "chat" }, { - "id": "zai-org/GLM-5.1", - "name": "GLM-5.1", - "display_name": "GLM-5.1", + "id": "tencent/Hy3", + "name": "Hy3", + "display_name": "Hy3", "modalities": { "input": [ "text" @@ -68064,8 +67134,8 @@ ] }, "limit": { - "context": 202752, - "output": 16384 + "context": 262144, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -68075,26 +67145,79 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, "attachment": false, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2026-04-07", - "last_updated": "2026-04-07", + "release_date": "2026-07-06", + "last_updated": "2026-07-06", "type": "chat" }, { - "id": "zai-org/GLM-4.6", - "name": "GLM-4.6", - "display_name": "GLM-4.6", + "id": "thinkingmachines/Inkling", + "name": "Inkling", + "display_name": "Inkling", + "modalities": { + "input": [ + "text", + "image", + "audio" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 524288, + "output": 1048576 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "attachment": true, + "open_weights": true, + "release_date": "2026-07-15", + "last_updated": "2026-07-15", + "type": "chat" + }, + { + "id": "thinkingmachines/Inkling-Small", + "name": "Inkling Small", + "display_name": "Inkling Small", + "modalities": { + "input": [ + "text", + "image", + "audio" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 524288, + "output": 1048576 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "attachment": true, + "open_weights": true, + "release_date": "2026-07-30", + "last_updated": "2026-07-30", + "type": "chat" + }, + { + "id": "zai-org/GLM-5", + "name": "GLM-5", + "display_name": "GLM-5", "modalities": { "input": [ "text" @@ -68105,7 +67228,7 @@ }, "limit": { "context": 202752, - "output": 131072 + "output": 16384 }, "temperature": true, "tool_call": true, @@ -68126,15 +67249,15 @@ }, "attachment": false, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-09-30", - "last_updated": "2025-09-30", + "knowledge": "2025-12", + "release_date": "2026-02-12", + "last_updated": "2026-02-12", "type": "chat" }, { - "id": "zai-org/GLM-5.3", - "name": "GLM-5.3", - "display_name": "GLM-5.3", + "id": "zai-org/GLM-4.7", + "name": "GLM-4.7", + "display_name": "GLM-4.7", "modalities": { "input": [ "text" @@ -68144,8 +67267,8 @@ ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 202752, + "output": 16384 }, "temperature": true, "tool_call": true, @@ -68156,17 +67279,19 @@ "extra_capabilities": { "reasoning": { "supported": true, - "effort_options": [ - "low", - "high", - "max" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, "attachment": false, "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "knowledge": "2025-04", + "release_date": "2025-12-22", + "last_updated": "2025-12-22", "type": "chat" }, { @@ -68213,9 +67338,9 @@ "type": "chat" }, { - "id": "zai-org/GLM-4.7", - "name": "GLM-4.7", - "display_name": "GLM-4.7", + "id": "zai-org/GLM-5.1", + "name": "GLM-5.1", + "display_name": "GLM-5.1", "modalities": { "input": [ "text" @@ -68248,8 +67373,8 @@ "attachment": false, "open_weights": true, "knowledge": "2025-04", - "release_date": "2025-12-22", - "last_updated": "2025-12-22", + "release_date": "2026-04-07", + "last_updated": "2026-04-07", "type": "chat" }, { @@ -68294,9 +67419,9 @@ "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-V3.1", - "name": "DeepSeek-V3.1", - "display_name": "DeepSeek-V3.1", + "id": "zai-org/GLM-4.7-Flash", + "name": "GLM-4.7-Flash", + "display_name": "GLM-4.7-Flash", "modalities": { "input": [ "text" @@ -68306,8 +67431,8 @@ ] }, "limit": { - "context": 163840, - "output": 8192 + "context": 202752, + "output": 16384 }, "temperature": true, "tool_call": true, @@ -68315,16 +67440,68 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, "attachment": false, "open_weights": true, - "release_date": "2025-08-21", - "last_updated": "2025-08-21", + "knowledge": "2025-04", + "release_date": "2026-01-19", + "last_updated": "2026-01-19", "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-V4-Pro-0813", - "name": "DeepSeek V4 Pro 0813", - "display_name": "DeepSeek V4 Pro 0813", + "id": "zai-org/GLM-4.6", + "name": "GLM-4.6", + "display_name": "GLM-4.6", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 202752, + "output": 131072 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-09-30", + "last_updated": "2025-09-30", + "type": "chat" + }, + { + "id": "zai-org/GLM-5.3", + "name": "GLM-5.3", + "display_name": "GLM-5.3", "modalities": { "input": [ "text" @@ -68335,7 +67512,7 @@ }, "limit": { "context": 1048576, - "output": 384000 + "output": 131072 }, "temperature": true, "tool_call": true, @@ -68355,27 +67532,29 @@ }, "attachment": false, "open_weights": true, - "release_date": "2026-08-13", - "last_updated": "2026-08-22", + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-V4-Flash", - "name": "DeepSeek V4 Flash", - "display_name": "DeepSeek V4 Flash", + "id": "anthropic/claude-fable-5", + "name": "Claude Fable 5", + "display_name": "Claude Fable 5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 16384 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -68389,25 +67568,56 @@ "effort": "high", "effort_options": [ "low", + "medium", "high", + "xhigh", "max" ], "interleaved": true, "summaries": true, - "visibility": "summary", + "visibility": "omitted", "continuation": [ "thinking_blocks" ], "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." + "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", + "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", + "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." ] } }, + "attachment": true, + "open_weights": false, + "knowledge": "2026-01-31", + "release_date": "2026-06-09", + "last_updated": "2026-06-09", + "type": "chat" + }, + { + "id": "deepseek-ai/DeepSeek-V3-0324", + "name": "DeepSeek V3 0324", + "display_name": "DeepSeek V3 0324", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 163840, + "output": 163840 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, "attachment": false, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "release_date": "2025-03-24", + "last_updated": "2025-03-24", "type": "chat" }, { @@ -68451,13 +67661,52 @@ "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-V4-Flash-Vision-Exp", - "name": "DeepSeek V4 Flash Vision Exp", - "display_name": "DeepSeek V4 Flash Vision Exp", + "id": "deepseek-ai/DeepSeek-V3.2", + "name": "DeepSeek-V3.2", + "display_name": "DeepSeek-V3.2", "modalities": { "input": [ - "text", - "image" + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 163840, + "output": 64000 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, + "open_weights": true, + "knowledge": "2024-07", + "release_date": "2025-12-01", + "last_updated": "2025-12-01", + "type": "chat" + }, + { + "id": "deepseek-ai/DeepSeek-V4-Flash-0731", + "name": "DeepSeek V4 Flash 0731", + "display_name": "DeepSeek V4 Flash 0731", + "modalities": { + "input": [ + "text" ], "output": [ "text" @@ -68476,29 +67725,46 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", "effort_options": [ "low", "high", "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-08-21", - "last_updated": "2026-09-01", + "knowledge": "2025-05", + "release_date": "2026-07-31", + "last_updated": "2026-07-31", + "type": "chat" + }, + { + "id": "deepseek-ai/DeepSeek-V3.1", + "name": "DeepSeek-V3.1", + "display_name": "DeepSeek-V3.1", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 163840, + "output": 8192 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "attachment": false, + "open_weights": true, + "release_date": "2025-08-21", + "last_updated": "2025-08-21", "type": "chat" }, { @@ -68553,9 +67819,9 @@ "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-V3.2", - "name": "DeepSeek-V3.2", - "display_name": "DeepSeek-V3.2", + "id": "deepseek-ai/DeepSeek-V3", + "name": "DeepSeek-V3", + "display_name": "DeepSeek-V3", "modalities": { "input": [ "text" @@ -68566,36 +67832,23 @@ }, "limit": { "context": 163840, - "output": 64000 + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": false, "open_weights": true, - "knowledge": "2024-07", - "release_date": "2025-12-01", - "last_updated": "2025-12-01", + "release_date": "2024-12-26", + "last_updated": "2024-12-26", "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-V4-Flash-0731", - "name": "DeepSeek V4 Flash 0731", - "display_name": "DeepSeek V4 Flash 0731", + "id": "deepseek-ai/DeepSeek-V4-Flash", + "name": "DeepSeek V4 Flash", + "display_name": "DeepSeek V4 Flash", "modalities": { "input": [ "text" @@ -68606,7 +67859,7 @@ }, "limit": { "context": 1048576, - "output": 384000 + "output": 16384 }, "temperature": true, "tool_call": true, @@ -68617,24 +67870,36 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", "effort_options": [ "low", "high", "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, "attachment": false, "open_weights": true, "knowledge": "2025-05", - "release_date": "2026-07-31", - "last_updated": "2026-07-31", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-V4.1-Flash-1017", - "name": "DeepSeek V4.1 Flash 1017", - "display_name": "DeepSeek V4.1 Flash 1017", + "id": "deepseek-ai/DeepSeek-V4-Flash-Vision-Exp", + "name": "DeepSeek V4 Flash Vision Exp", + "display_name": "DeepSeek V4 Flash Vision Exp", "modalities": { "input": [ "text", @@ -68656,25 +67921,36 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", "effort_options": [ - "none", "low", "high", "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, "attachment": true, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-10-17", - "last_updated": "2026-10-17", + "release_date": "2026-08-21", + "last_updated": "2026-09-01", "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-V4.1-Flash", - "name": "DeepSeek V4.1 Flash", - "display_name": "DeepSeek V4.1 Flash", + "id": "deepseek-ai/DeepSeek-V4.1-Flash-1017", + "name": "DeepSeek V4.1 Flash 1017", + "display_name": "DeepSeek V4.1 Flash 1017", "modalities": { "input": [ "text", @@ -68696,12 +67972,10 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ "none", "low", "high", - "xhigh", "max" ] } @@ -68709,14 +67983,14 @@ "attachment": true, "open_weights": true, "knowledge": "2025-05", - "release_date": "2026-09-10", - "last_updated": "2026-09-10", + "release_date": "2026-10-17", + "last_updated": "2026-10-17", "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-V3-0324", - "name": "DeepSeek V3 0324", - "display_name": "DeepSeek V3 0324", + "id": "deepseek-ai/DeepSeek-V4-Pro-0813", + "name": "DeepSeek V4 Pro 0813", + "display_name": "DeepSeek V4 Pro 0813", "modalities": { "input": [ "text" @@ -68726,62 +68000,47 @@ ] }, "limit": { - "context": 163840, - "output": 163840 + "context": 1048576, + "output": 384000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": true, - "release_date": "2025-03-24", - "last_updated": "2025-03-24", - "type": "chat" - }, - { - "id": "deepseek-ai/DeepSeek-V3", - "name": "DeepSeek-V3", - "display_name": "DeepSeek-V3", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 163840, - "output": 8192 + "supported": true, + "default": true }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "low", + "high", + "max" + ] + } }, "attachment": false, "open_weights": true, - "release_date": "2024-12-26", - "last_updated": "2024-12-26", + "release_date": "2026-08-13", + "last_updated": "2026-08-22", "type": "chat" }, { - "id": "tencent/Hy3", - "name": "Hy3", - "display_name": "Hy3", + "id": "deepseek-ai/DeepSeek-V4.1-Flash", + "name": "DeepSeek V4.1 Flash", + "display_name": "DeepSeek V4.1 Flash", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 128000 + "context": 1048576, + "output": 384000 }, "temperature": true, "tool_call": true, @@ -68791,22 +68050,31 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "effort_options": [ + "none", + "low", + "high", + "xhigh", + "max" + ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-07-06", - "last_updated": "2026-07-06", + "knowledge": "2025-05", + "release_date": "2026-09-10", + "last_updated": "2026-09-10", "type": "chat" }, { - "id": "tencent/Hy4-preview", - "name": "Hy4 preview", - "display_name": "Hy4 preview", + "id": "XiaomiMiMo/MiMo-V2.5-Pro", + "name": "MiMo-V2.5-Pro", + "display_name": "MiMo-V2.5-Pro", "modalities": { "input": [ - "text" + "text", + "audio" ], "output": [ "text" @@ -68814,7 +68082,7 @@ }, "limit": { "context": 1048576, - "output": 64000 + "output": 16384 }, "temperature": true, "tool_call": true, @@ -68825,83 +68093,61 @@ "extra_capabilities": { "reasoning": { "supported": true, - "effort_options": [ - "none", - "high" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-08-28", - "last_updated": "2026-08-28", + "knowledge": "2024-12", + "release_date": "2026-04-22", + "last_updated": "2026-04-22", "type": "chat" }, { - "id": "anthropic/claude-fable-5", - "name": "Claude Fable 5", - "display_name": "Claude Fable 5", + "id": "XiaomiMiMo/MiMo-V2.6-Flash", + "name": "MiMo-V2.6-Flash", + "display_name": "MiMo-V2.6-Flash", "modalities": { "input": [ "text", "image", - "pdf" + "audio", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 1048576, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", - "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", - "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." - ] - } - }, "attachment": true, - "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-09", - "last_updated": "2026-06-09", + "open_weights": true, + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "stepfun-ai/Step-5-Preview", - "name": "Step 5 Preview", - "display_name": "Step 5 Preview", + "id": "XiaomiMiMo/MiMo-V2.5", + "name": "MiMo-V2.5", + "display_name": "MiMo-V2.5", "modalities": { "input": [ "text", "image", + "audio", "video" ], "output": [ @@ -68909,8 +68155,8 @@ ] }, "limit": { - "context": 1048576, - "output": 1000000 + "context": 262144, + "output": 16384 }, "temperature": true, "tool_call": true, @@ -68920,27 +68166,31 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "low", - "medium", - "high" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, "attachment": true, "open_weights": true, - "release_date": "2026-09-16", - "last_updated": "2026-09-20", + "knowledge": "2024-12", + "release_date": "2026-04-22", + "last_updated": "2026-04-22", "type": "chat" }, { - "id": "stepfun-ai/Step-3.7-Flash", - "name": "Step 3.7 Flash", - "display_name": "Step 3.7 Flash", + "id": "XiaomiMiMo/MiMo-V2.6-Pro", + "name": "MiMo-V2.6-Pro", + "display_name": "MiMo-V2.6-Pro", "modalities": { "input": [ "text", "image", + "audio", "video" ], "output": [ @@ -68948,8 +68198,8 @@ ] }, "limit": { - "context": 262144, - "output": 256000 + "context": 1048576, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -68959,9 +68209,8 @@ }, "attachment": true, "open_weights": true, - "knowledge": "2026-03-01", - "release_date": "2026-05-29", - "last_updated": "2026-05-29", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { @@ -68993,37 +68242,39 @@ "type": "chat" }, { - "id": "meta-llama/Llama-Guard-4-12B", - "name": "Llama Guard 4 12B", - "display_name": "Llama Guard 4 12B", + "id": "google/gemma-4-E4B-it", + "name": "Gemma 4 E4B IT", + "display_name": "Gemma 4 E4B IT", "modalities": { "input": [ "text", - "image" + "image", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 163840, - "output": 163840 + "context": 131072, + "output": 8192 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": true, "open_weights": true, - "release_date": "2025-04-29", - "last_updated": "2025-04-29", + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "meta-llama/Llama-4-Maverick-17B-128E-Instruct-FP8", - "name": "Llama 4 Maverick 17B FP8", - "display_name": "Llama 4 Maverick 17B FP8", + "id": "google/gemma-3-12b-it", + "name": "Gemma 3 12B IT", + "display_name": "Gemma 3 12B IT", "modalities": { "input": [ "text", @@ -69034,53 +68285,61 @@ ] }, "limit": { - "context": 1048576, - "output": 16384 + "context": 131072, + "output": 131072 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, "attachment": true, "open_weights": true, "knowledge": "2024-08", - "release_date": "2025-04-05", - "last_updated": "2025-04-05", + "release_date": "2025-03-12", + "last_updated": "2025-03-12", "type": "chat" }, { - "id": "meta-llama/Llama-3.3-70B-Instruct-Turbo", - "name": "Llama 3.3 70B Turbo", - "display_name": "Llama 3.3 70B Turbo", + "id": "google/gemma-4-31B-it", + "name": "Gemma 4 31B IT", + "display_name": "Gemma 4 31B IT", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 16384 + "context": 262144, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2023-12", - "release_date": "2024-12-06", - "last_updated": "2024-12-06", + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": true, + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "meta-llama/Llama-4-Scout-17B-16E-Instruct", - "name": "Llama 4 Scout 17B", - "display_name": "Llama 4 Scout 17B", + "id": "google/gemma-3-4b-it", + "name": "Gemma 3 4B IT", + "display_name": "Gemma 3 4B IT", "modalities": { "input": [ "text", @@ -69091,8 +68350,8 @@ ] }, "limit": { - "context": 327680, - "output": 16384 + "context": 131072, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -69102,27 +68361,26 @@ "attachment": true, "open_weights": true, "knowledge": "2024-08", - "release_date": "2025-04-05", - "last_updated": "2025-04-05", + "release_date": "2025-03-12", + "last_updated": "2025-03-12", "type": "chat" }, { - "id": "thinkingmachines/Inkling", - "name": "Inkling", - "display_name": "Inkling", + "id": "google/gemma-4-26B-A4B-it", + "name": "Gemma 4 26B A4B IT", + "display_name": "Gemma 4 26B A4B IT", "modalities": { "input": [ "text", - "image", - "audio" + "image" ], "output": [ "text" ] }, "limit": { - "context": 524288, - "output": 1048576 + "context": 262144, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -69130,85 +68388,54 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, "attachment": true, "open_weights": true, - "release_date": "2026-07-15", - "last_updated": "2026-07-15", + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "thinkingmachines/Inkling-Small", - "name": "Inkling Small", - "display_name": "Inkling Small", + "id": "google/gemma-3-27b-it", + "name": "Gemma 3 27B IT", + "display_name": "Gemma 3 27B IT", "modalities": { "input": [ "text", - "image", - "audio" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 524288, - "output": 1048576 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "attachment": true, - "open_weights": true, - "release_date": "2026-07-30", - "last_updated": "2026-07-30", - "type": "chat" - } - ] - }, - "cohere": { - "id": "cohere", - "name": "Cohere", - "display_name": "Cohere", - "doc": "https://docs.cohere.com/docs/models", - "models": [ - { - "id": "command-r-plus-08-2024", - "name": "Command R+", - "display_name": "Command R+", - "modalities": { - "input": [ - "text" + "image" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 4000 + "context": 131072, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2024-06-01", - "release_date": "2024-08-30", - "last_updated": "2024-08-30", + "knowledge": "2024-08", + "release_date": "2025-03-12", + "last_updated": "2025-03-12", "type": "chat" }, { - "id": "command-a-03-2025", - "name": "Command A", - "display_name": "Command A", + "id": "ByteDance/Seed-2.0-mini", + "name": "Seed 2.0 Mini", + "display_name": "Seed 2.0 Mini", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" @@ -69216,24 +68443,24 @@ }, "limit": { "context": 256000, - "output": 8000 + "output": 32000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-06-01", - "release_date": "2025-03-13", - "last_updated": "2025-03-13", + "attachment": true, + "open_weights": false, + "release_date": "2026-02-14", + "last_updated": "2026-02-14", "type": "chat" }, { - "id": "c4ai-aya-vision-32b", - "name": "Aya Vision 32B", - "display_name": "Aya Vision 32B", + "id": "ByteDance/Seed-2.0-code", + "name": "Seed 2.0 Code", + "display_name": "Seed 2.0 Code", "modalities": { "input": [ "text", @@ -69244,27 +68471,39 @@ ] }, "limit": { - "context": 16000, - "output": 4000 + "context": 256000, + "output": 131072 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "low", + "medium", + "high" + ] + } }, "attachment": true, - "open_weights": true, - "release_date": "2025-03-04", - "last_updated": "2025-05-14", + "open_weights": false, + "release_date": "2026-02-14", + "last_updated": "2026-02-14", "type": "chat" }, { - "id": "command-a-reasoning-08-2025", - "name": "Command A Reasoning", - "display_name": "Command A Reasoning", + "id": "ByteDance/Seed-2.0-pro", + "name": "Seed 2.0 Pro", + "display_name": "Seed 2.0 Pro", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" @@ -69272,25 +68511,33 @@ }, "limit": { "context": 256000, - "output": 32000 + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-06-01", - "release_date": "2025-08-21", - "last_updated": "2025-08-21", + "attachment": true, + "open_weights": false, + "release_date": "2026-02-14", + "last_updated": "2026-02-14", "type": "chat" - }, + } + ] + }, + "inception": { + "id": "inception", + "name": "Inception", + "display_name": "Inception", + "api": "https://api.inceptionlabs.ai/v1/", + "doc": "https://docs.inceptionlabs.ai/get-started/models", + "models": [ { - "id": "tiny-aya-water", - "name": "Tiny Aya Water", - "display_name": "Tiny Aya Water", + "id": "mercury-edit-2", + "name": "Mercury Edit 2", + "display_name": "Mercury Edit 2", "modalities": { "input": [ "text" @@ -69300,28 +68547,27 @@ ] }, "limit": { - "context": 8000, - "output": 8000 + "context": 32000, + "output": 8192 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, "attachment": false, - "open_weights": true, - "release_date": "2026-02-17", - "last_updated": "2026-02-17", + "open_weights": false, + "release_date": "2026-03-30", + "last_updated": "2026-03-30", "type": "chat" }, { - "id": "command-a-plus-05-2026", - "name": "Command A Plus", - "display_name": "Command A Plus", + "id": "mercury-2", + "name": "Mercury 2", + "display_name": "Mercury 2", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" @@ -69329,7 +68575,7 @@ }, "limit": { "context": 128000, - "output": 64000 + "output": 50000 }, "temperature": true, "tool_call": true, @@ -69339,20 +68585,24 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "effort_options": [ + "low", + "medium", + "high" + ] } }, - "attachment": true, - "open_weights": true, - "knowledge": "2025-04-01", - "release_date": "2026-05-20", - "last_updated": "2026-06-09", + "attachment": false, + "open_weights": false, + "knowledge": "2025-01-01", + "release_date": "2026-02-24", + "last_updated": "2026-02-24", "type": "chat" }, { - "id": "c4ai-aya-expanse-32b", - "name": "Aya Expanse 32B", - "display_name": "Aya Expanse 32B", + "id": "mercury-2.5", + "name": "Mercury 2.5", + "display_name": "Mercury 2.5", "modalities": { "input": [ "text" @@ -69362,24 +68612,35 @@ ] }, "limit": { - "context": 128000, - "output": 4000 + "context": 260000, + "output": 65536 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "high" + ] + } }, "attachment": false, - "open_weights": true, - "release_date": "2024-10-24", - "last_updated": "2024-10-24", + "open_weights": false, + "knowledge": "2025-11-01", + "release_date": "2026-09-08", + "last_updated": "2026-09-08", "type": "chat" }, { - "id": "tiny-aya-fire", - "name": "Tiny Aya Fire", - "display_name": "Tiny Aya Fire", + "id": "mercury-3", + "name": "Mercury 3", + "display_name": "Mercury 3", "modalities": { "input": [ "text" @@ -69389,27 +68650,47 @@ ] }, "limit": { - "context": 8000, - "output": 8000 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "high" + ] + } }, "attachment": false, - "open_weights": true, - "release_date": "2026-02-17", - "last_updated": "2026-02-17", + "open_weights": false, + "release_date": "2026-10-16", + "last_updated": "2026-10-20", "type": "chat" - }, + } + ] + }, + "volcengine": { + "id": "volcengine", + "name": "Volcengine Ark", + "display_name": "Volcengine Ark", + "api": "https://ark.cn-beijing.volces.com/api/v3", + "doc": "https://www.volcengine.com/docs/82379/1330310", + "models": [ { - "id": "north-mini-code-1-0", - "name": "North Mini Code", - "display_name": "North Mini Code", + "id": "doubao-seed-1-6-vision-250815", + "name": "Seed 1.6 Vision", + "display_name": "Seed 1.6 Vision", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" @@ -69417,7 +68698,7 @@ }, "limit": { "context": 256000, - "output": 64000 + "output": 32000 }, "temperature": true, "tool_call": true, @@ -69433,255 +68714,210 @@ "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "effort_options": [ - "none", - "high" ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-09-23", - "release_date": "2026-06-09", - "last_updated": "2026-06-09", + "attachment": true, + "open_weights": false, + "release_date": "2025-08-15", + "last_updated": "2025-08-15", "type": "chat" }, { - "id": "command-a-translate-08-2025", - "name": "Command A Translate", - "display_name": "Command A Translate", + "id": "doubao-seed-1-6-flash-250828", + "name": "Seed 1.6 Flash", + "display_name": "Seed 1.6 Flash", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 8000, - "output": 8000 + "context": 256000, + "output": 32000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-06-01", + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": true, + "open_weights": false, "release_date": "2025-08-28", "last_updated": "2025-08-28", "type": "chat" }, { - "id": "tiny-aya-global", - "name": "Tiny Aya Global", - "display_name": "Tiny Aya Global", + "id": "doubao-seed-2-0-code-preview-260215", + "name": "Seed 2.0 Code", + "display_name": "Seed 2.0 Code", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 8000, - "output": 8000 + "context": 262144, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": true, - "release_date": "2026-02-17", - "last_updated": "2026-02-17", - "type": "chat" - }, - { - "id": "north-small-translate-09-2026", - "name": "North Small Translate", - "display_name": "North Small Translate", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 32768, - "output": 16000 - }, - "temperature": true, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": true, - "release_date": "2026-09-09", - "last_updated": "2026-09-09", - "type": "chat" - }, - { - "id": "command-r-08-2024", - "name": "Command R", - "display_name": "Command R", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 128000, - "output": 4000 + "supported": true, + "default": true }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "none", + "minimal", + "low", + "medium", + "high", + "xhigh", + "max" + ] + } }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-06-01", - "release_date": "2024-08-30", - "last_updated": "2024-08-30", + "attachment": true, + "open_weights": false, + "release_date": "2026-02-14", + "last_updated": "2026-02-14", "type": "chat" }, { - "id": "command-r7b-arabic-02-2025", - "name": "Command R7B Arabic", - "display_name": "Command R7B Arabic", + "id": "doubao-seed-2-0-pro-260215", + "name": "Seed 2.0 Pro", + "display_name": "Seed 2.0 Pro", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 4000 + "context": 256000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-06-01", - "release_date": "2025-02-27", - "last_updated": "2025-02-27", - "type": "chat" - }, - { - "id": "command-a-vision-07-2025", - "name": "Command A Vision", - "display_name": "Command A Vision", - "modalities": { - "input": [ - "text", - "image" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 128000, - "output": 8000 + "supported": true, + "default": true }, - "temperature": true, - "tool_call": false, - "reasoning": { - "supported": false + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "none", + "minimal", + "low", + "medium", + "high", + "xhigh", + "max" + ] + } }, "attachment": true, - "open_weights": true, - "knowledge": "2024-06-01", - "release_date": "2025-07-31", - "last_updated": "2025-07-31", + "open_weights": false, + "release_date": "2026-02-14", + "last_updated": "2026-02-14", "type": "chat" }, { - "id": "command-r7b-12-2024", - "name": "Command R7B", - "display_name": "Command R7B", + "id": "doubao-seed-2-0-lite-260428", + "name": "Seed 2.0 Lite", + "display_name": "Seed 2.0 Lite", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 4000 + "context": 256000, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-06-01", - "release_date": "2024-12-13", - "last_updated": "2024-12-13", - "type": "chat" - }, - { - "id": "tiny-aya-earth", - "name": "Tiny Aya Earth", - "display_name": "Tiny Aya Earth", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 8000, - "output": 8000 + "supported": true, + "default": true }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "none", + "minimal", + "low", + "medium", + "high", + "xhigh", + "max" + ] + } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-02-17", - "last_updated": "2026-02-17", + "attachment": true, + "open_weights": false, + "release_date": "2026-02-14", + "last_updated": "2026-02-14", "type": "chat" - } - ] - }, - "arcee": { - "id": "arcee", - "name": "Arcee", - "display_name": "Arcee", - "api": "https://api.arcee.ai/api/v1", - "doc": "https://docs.arcee.ai", - "models": [ + }, { - "id": "trinity-large-thinking", - "name": "Trinity Large Thinking", - "display_name": "Trinity Large Thinking", + "id": "deepseek-v4-pro-ga-260813", + "name": "DeepSeek V4 Pro 0813", + "display_name": "DeepSeek V4 Pro 0813", "modalities": { "input": [ "text" @@ -69691,8 +68927,8 @@ ] }, "limit": { - "context": 262144, - "output": 80000 + "context": 1000000, + "output": 384000 }, "temperature": true, "tool_call": true, @@ -69708,19 +68944,25 @@ "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "effort_options": [ + "minimal", + "low", + "medium", + "high" ] } }, "attachment": false, "open_weights": true, - "release_date": "2026-04-01", - "last_updated": "2026-05-28", + "release_date": "2026-08-13", + "last_updated": "2026-08-22", "type": "chat" }, { - "id": "moonshotai/kimi-k3", - "name": "Kimi K3", - "display_name": "Kimi K3", + "id": "deepseek-v4-flash-ga-260731", + "name": "DeepSeek V4 Flash 0731", + "display_name": "DeepSeek V4 Flash 0731", "modalities": { "input": [ "text" @@ -69730,8 +68972,8 @@ ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 1000000, + "output": 384000 }, "temperature": true, "tool_call": true, @@ -69749,33 +68991,37 @@ "thinking_blocks" ], "effort_options": [ + "minimal", "low", - "high", - "max" + "medium", + "high" ] } }, "attachment": false, "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-16", + "knowledge": "2025-05", + "release_date": "2026-07-31", + "last_updated": "2026-07-31", "type": "chat" }, { - "id": "zai-org/glm-5.3", - "name": "GLM-5.3", - "display_name": "GLM-5.3", + "id": "doubao-seed-1-6-251015", + "name": "Seed 1.6", + "display_name": "Seed 1.6", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 256000, + "output": 64000 }, "temperature": true, "tool_call": true, @@ -69793,19 +69039,21 @@ "thinking_blocks" ], "effort_options": [ - "high", - "max" + "minimal", + "low", + "medium", + "high" ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "attachment": true, + "open_weights": false, + "release_date": "2025-10-15", + "last_updated": "2025-10-15", "type": "chat" }, { - "id": "zai-org/glm-5.2", + "id": "glm-5-2-260617", "name": "GLM-5.2", "display_name": "GLM-5.2", "modalities": { @@ -69817,7 +69065,7 @@ ] }, "limit": { - "context": 262144, + "context": 1000000, "output": 131072 }, "temperature": true, @@ -69836,8 +69084,10 @@ "thinking_blocks" ], "effort_options": [ - "high", - "max" + "minimal", + "low", + "medium", + "high" ] } }, @@ -69848,23 +69098,22 @@ "type": "chat" }, { - "id": "zai-org/glm-5.3-flash", - "name": "GLM-5.3-Flash", - "display_name": "GLM-5.3-Flash", + "id": "doubao-seed-2-1-turbo-260628", + "name": "Seed 2.1 Turbo", + "display_name": "Seed 2.1 Turbo", "modalities": { "input": [ "text", "image", - "video", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 256000, + "output": 256000 }, "temperature": true, "tool_call": true, @@ -69882,32 +69131,39 @@ "thinking_blocks" ], "effort_options": [ + "none", + "minimal", + "low", + "medium", "high", + "xhigh", "max" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", + "open_weights": false, + "release_date": "2026-06-23", + "last_updated": "2026-06-23", "type": "chat" }, { - "id": "deepseek/deepseek-v4-pro", - "name": "DeepSeek V4 Pro", - "display_name": "DeepSeek V4 Pro", + "id": "doubao-seed-2-0-mini-260428", + "name": "Seed 2.0 Mini", + "display_name": "Seed 2.0 Mini", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 512000, - "output": 384000 + "context": 256000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -69918,47 +69174,47 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "high", - "max" - ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" ], - "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." + "effort_options": [ + "none", + "minimal", + "low", + "medium", + "high", + "xhigh", + "max" ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "attachment": true, + "open_weights": false, + "release_date": "2026-02-14", + "last_updated": "2026-02-14", "type": "chat" }, { - "id": "deepseek/deepseek-v4-pro-0813", - "name": "DeepSeek V4 Pro 0813", - "display_name": "DeepSeek V4 Pro 0813", + "id": "glm-5-3-flash-260828", + "name": "GLM-5.3-Flash", + "display_name": "GLM-5.3-Flash", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 384000 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -69976,32 +69232,35 @@ "thinking_blocks" ], "effort_options": [ + "low", "high", "max" ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-08-13", - "last_updated": "2026-08-22", + "release_date": "2026-08-26", + "last_updated": "2026-08-26", "type": "chat" }, { - "id": "deepseek/deepseek-v4-flash-latest", - "name": "DeepSeek V4 Flash Latest", - "display_name": "DeepSeek V4 Flash Latest", + "id": "doubao-seed-evolving", + "name": "Seed Evolving", + "display_name": "Seed Evolving", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 384000 + "context": 256000, + "output": 256000 }, "temperature": true, "tool_call": true, @@ -70019,22 +69278,26 @@ "thinking_blocks" ], "effort_options": [ + "none", + "minimal", + "low", + "medium", "high", + "xhigh", "max" ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-07-31", - "last_updated": "2026-07-31", + "attachment": true, + "open_weights": false, + "release_date": "2026-06-23", + "last_updated": "2026-06-23", "type": "chat" }, { - "id": "deepseek/deepseek-v4.1-flash-1017", - "name": "DeepSeek V4.1 Flash 1017", - "display_name": "DeepSeek V4.1 Flash 1017", + "id": "doubao-seed-1-8-251228", + "name": "Seed 1.8", + "display_name": "Seed 1.8", "modalities": { "input": [ "text", @@ -70045,8 +69308,8 @@ ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 256000, + "output": 64000 }, "temperature": true, "tool_call": true, @@ -70064,34 +69327,39 @@ "thinking_blocks" ], "effort_options": [ + "none", + "minimal", + "low", + "medium", "high", + "xhigh", "max" ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-10-17", - "last_updated": "2026-10-17", + "open_weights": false, + "release_date": "2025-12-28", + "last_updated": "2025-12-28", "type": "chat" }, { - "id": "deepseek/deepseek-v4.1-flash", - "name": "DeepSeek V4.1 Flash", - "display_name": "DeepSeek V4.1 Flash", + "id": "doubao-seed-2-1-pro-260628", + "name": "Seed 2.1 Pro", + "display_name": "Seed 2.1 Pro", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 256000, + "output": 256000 }, "temperature": true, "tool_call": true, @@ -70109,33 +69377,39 @@ "thinking_blocks" ], "effort_options": [ + "none", + "minimal", + "low", + "medium", "high", + "xhigh", "max" ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-09-10", - "last_updated": "2026-09-10", + "open_weights": false, + "release_date": "2026-06-23", + "last_updated": "2026-06-23", "type": "chat" }, { - "id": "thinkingmachines/inkling-small", - "name": "Inkling Small", - "display_name": "Inkling Small", + "id": "doubao-seed-character-260628", + "name": "Seed Character", + "display_name": "Seed Character", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 256000, + "output": 256000 }, "temperature": true, "tool_call": true, @@ -70151,109 +69425,87 @@ "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "effort_options": [ + "minimal", + "low", + "high" ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-07-30", - "last_updated": "2026-07-30", + "attachment": true, + "open_weights": false, + "release_date": "2026-06-23", + "last_updated": "2026-06-23", "type": "chat" } ] }, - "perplexity-agent": { - "id": "perplexity-agent", - "name": "Perplexity Agent", - "display_name": "Perplexity Agent", - "api": "https://api.perplexity.ai/v1", - "doc": "https://docs.perplexity.ai/docs/agent-api/models", + "merge-gateway": { + "id": "merge-gateway", + "name": "Merge Gateway", + "display_name": "Merge Gateway", + "api": "https://api-gateway.merge.dev/v1/ai-sdk", + "doc": "https://docs.merge.dev/merge-gateway", "models": [ { - "id": "xai/grok-4.5", - "name": "Grok 4.5", - "display_name": "Grok 4.5", + "id": "writer/palmyra-x4", + "name": "Palmyra X4", + "display_name": "Palmyra X4", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 500000, - "output": 500000 + "context": 128000, + "output": 32000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ] - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2026-07-08", - "last_updated": "2026-07-08", + "release_date": "2024-10-09", + "last_updated": "2025-04-28", "type": "chat" }, { - "id": "xai/grok-4.7", - "name": "Grok 4.7", - "display_name": "Grok 4.7", + "id": "writer/palmyra-x5", + "name": "Palmyra X5", + "display_name": "Palmyra X5", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 500000, - "output": 500000 + "context": 1000000, + "output": 250000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ] - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2026-05", - "release_date": "2026-09-21", - "last_updated": "2026-09-21", + "release_date": "2025-04-28", + "last_updated": "2025-04-28", "type": "chat" }, { - "id": "xai/grok-4-1-fast-non-reasoning", - "name": "Grok 4.1 Fast (Non-Reasoning)", - "display_name": "Grok 4.1 Fast (Non-Reasoning)", + "id": "xai/grok-build-0.1", + "name": "Grok Build 0.1", + "display_name": "Grok Build 0.1", "modalities": { "input": [ "text", @@ -70264,19 +69516,24 @@ ] }, "limit": { - "context": 2000000, - "output": 30000 + "context": 256000, + "output": 256000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": true, "open_weights": false, - "knowledge": "2025-07", - "release_date": "2025-11-19", - "last_updated": "2025-11-19", + "release_date": "2026-04-16", + "last_updated": "2026-04-16", "type": "chat" }, { @@ -70321,12 +69578,13 @@ "type": "chat" }, { - "id": "nvidia/nemotron-3-super-120b-a12b", - "name": "Nemotron 3 Super 120B", - "display_name": "Nemotron 3 Super 120B", + "id": "xai/grok-4.20-0309-reasoning", + "name": "Grok 4.20", + "display_name": "Grok 4.20", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" @@ -70334,7 +69592,7 @@ }, "limit": { "context": 1000000, - "output": 32000 + "output": 1000000 }, "temperature": true, "tool_call": true, @@ -70342,83 +69600,56 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ] - } - }, - "attachment": false, - "open_weights": true, - "knowledge": "2026-02", - "release_date": "2026-03-11", - "last_updated": "2026-03-11", + "attachment": true, + "open_weights": false, + "release_date": "2026-03-09", + "last_updated": "2026-03-09", "type": "chat" }, { - "id": "google/gemini-4-argon", - "name": "Gemini 4 Argon", - "display_name": "Gemini 4 Argon", + "id": "xai/grok-4.20-0309-non-reasoning", + "name": "Grok 4.20 Non-Reasoning", + "display_name": "Grok 4.20 Non-Reasoning", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 1000000, + "output": 1000000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high" - ] - } + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-10-13", - "last_updated": "2026-10-13", + "release_date": "2026-03-09", + "last_updated": "2026-03-09", "type": "chat" }, { - "id": "google/gemini-3.1-pro-preview", - "name": "Gemini 3.1 Pro Preview", - "display_name": "Gemini 3.1 Pro Preview", + "id": "xai/grok-4.5", + "name": "Grok 4.5", + "display_name": "Grok 4.5", "modalities": { "input": [ "text", - "image", - "video", - "audio", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 500000, + "output": 500000 }, "temperature": true, "tool_call": true, @@ -70429,44 +69660,35 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ + "effort_options": [ "low", + "medium", "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-02-19", - "last_updated": "2026-02-19", + "release_date": "2026-07-08", + "last_updated": "2026-07-08", "type": "chat" }, { - "id": "google/gemini-3.8-flash", - "name": "Gemini 3.8 Flash", - "display_name": "Gemini 3.8 Flash", + "id": "xai/grok-4.3", + "name": "Grok 4.3", + "display_name": "Grok 4.3", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 1000000, + "output": 1000000 }, "temperature": true, "tool_call": true, @@ -70476,46 +69698,31 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", - "low", - "medium", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] + "supported": true } }, "attachment": true, "open_weights": false, - "release_date": "2026-09-02", - "last_updated": "2026-09-02", + "release_date": "2026-04-17", + "last_updated": "2026-04-17", "type": "chat" }, { - "id": "google/gemini-3.7-flash", - "name": "Gemini 3.7 Flash", - "display_name": "Gemini 3.7 Flash", + "id": "xai/grok-4.7", + "name": "Grok 4.7", + "display_name": "Grok 4.7", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 500000, + "output": 500000 }, "temperature": true, "tool_call": true, @@ -70525,49 +69732,37 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ + "effort_options": [ "minimal", "low", "medium", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" + "high", + "xhigh" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-08-13", - "last_updated": "2026-08-13", + "knowledge": "2026-05", + "release_date": "2026-09-21", + "last_updated": "2026-09-21", "type": "chat" }, { - "id": "google/gemini-3-flash-preview", - "name": "Gemini 3 Flash Preview", - "display_name": "Gemini 3 Flash Preview", + "id": "zai/glm-5.2", + "name": "GLM-5.2", + "display_name": "GLM-5.2", "modalities": { "input": [ - "text", - "image", - "video", - "audio", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -70578,46 +69773,35 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", - "low", - "medium", - "high" - ], + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-12-17", - "last_updated": "2025-12-17", + "attachment": false, + "open_weights": true, + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "google/gemini-3.6-flash", - "name": "Gemini 3.6 Flash", - "display_name": "Gemini 3.6 Flash", + "id": "zai/glm-5.3", + "name": "GLM-5.3", + "display_name": "GLM-5.3", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -70628,100 +69812,65 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", + "effort_options": [ "low", - "medium", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" + "high", + "max" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-07-21", - "last_updated": "2026-07-21", + "attachment": false, + "open_weights": true, + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "openai/gpt-5.2", - "name": "GPT-5.2", - "display_name": "GPT-5.2", + "id": "zai/glm-4.7-flashx", + "name": "GLM-4.7 FlashX", + "display_name": "GLM-4.7 FlashX", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 200000, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "default": true }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2025-12-11", - "last_updated": "2025-12-11", + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2026-01-19", + "last_updated": "2026-01-19", "type": "chat" }, { - "id": "openai/gpt-5.6-sol", - "name": "GPT-5.6 Sol", - "display_name": "GPT-5.6 Sol", + "id": "zai/glm-5-turbo", + "name": "GLM-5 Turbo", + "display_name": "GLM-5 Turbo", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 200000, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -70730,106 +69879,66 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "release_date": "2026-03-16", + "last_updated": "2026-03-16", "type": "chat" }, { - "id": "openai/gpt-5.6-luna", - "name": "GPT-5.6 Luna", - "display_name": "GPT-5.6 Luna", + "id": "zai/glm-4.5", + "name": "GLM-4.5", + "display_name": "GLM-4.5", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 128000, + "output": 98304 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } - }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-07-28", + "last_updated": "2025-07-28", "type": "chat" }, { - "id": "openai/gpt-5.6-terra", - "name": "GPT-5.6 Terra", - "display_name": "GPT-5.6 Terra", + "id": "zai/glm-4.7-flash", + "name": "GLM 4.7 Flash", + "display_name": "GLM 4.7 Flash", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, + "context": 200000, "output": 128000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -70837,53 +69946,33 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "supported": true } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2026-01-19", + "last_updated": "2026-01-19", "type": "chat" }, { - "id": "openai/gpt-6-sol", - "name": "GPT-6 Sol", - "display_name": "GPT-6 Sol", + "id": "zai/glm-4.6", + "name": "GLM-4.6", + "display_name": "GLM-4.6", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 200000, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -70891,68 +69980,49 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ] + "supported": true } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-04-20", - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-09-30", + "last_updated": "2025-09-30", "type": "chat" }, { - "id": "openai/gpt-6.1-sol", - "name": "GPT-6.1 Sol", - "display_name": "GPT-6.1 Sol", + "id": "zai/glm-4.5-air", + "name": "GLM-4.5 Air", + "display_name": "GLM-4.5 Air", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 128000, + "output": 98304 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ] - } - }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-04-30", - "release_date": "2026-09-29", - "last_updated": "2026-09-29", + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-07-28", + "last_updated": "2025-07-28", "type": "chat" }, { - "id": "openai/gpt-5.4", - "name": "GPT-5.4", - "display_name": "GPT-5.4", + "id": "zai/glm-4.5v", + "name": "Glm 4.5V", + "display_name": "Glm 4.5V", "modalities": { "input": [ "text", @@ -70963,103 +70033,70 @@ ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 128000, + "output": 32000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "default": true }, "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-05", - "last_updated": "2026-03-05", + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-08-11", + "last_updated": "2025-08-11", "type": "chat" }, { - "id": "openai/gpt-5.1", - "name": "GPT-5.1", - "display_name": "GPT-5.1", + "id": "zai/glm-5", + "name": "GLM-5", + "display_name": "GLM-5", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 200000, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-11-13", - "last_updated": "2025-11-13", + "attachment": false, + "open_weights": true, + "release_date": "2026-02-12", + "last_updated": "2026-02-12", "type": "chat" }, { - "id": "openai/gpt-6-astra", - "name": "GPT-6 Astra", - "display_name": "GPT-6 Astra", + "id": "zai/glm-5.3-flash", + "name": "GLM-5.3 Flash", + "display_name": "GLM-5.3 Flash", "modalities": { "input": [ "text", "image", + "video", "pdf" ], "output": [ @@ -71067,10 +70104,10 @@ ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1000000, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -71081,39 +70118,34 @@ "supported": true, "effort_options": [ "low", - "medium", "high", - "xhigh", "max" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-04-30", - "release_date": "2026-09-04", - "last_updated": "2026-09-04", + "open_weights": true, + "release_date": "2026-08-26", + "last_updated": "2026-08-26", "type": "chat" }, { - "id": "openai/gpt-5.5", - "name": "GPT-5.5", - "display_name": "GPT-5.5", + "id": "zai/glm-4.7", + "name": "GLM-4.7", + "display_name": "GLM-4.7", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 200000, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -71122,49 +70154,38 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-12-01", - "release_date": "2026-04-23", - "last_updated": "2026-04-23", + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-12-22", + "last_updated": "2025-12-22", "type": "chat" }, { - "id": "openai/gpt-5-mini", - "name": "GPT-5 Mini", - "display_name": "GPT-5 Mini", + "id": "zai/glm-5.1", + "name": "GLM-5.1", + "display_name": "GLM-5.1", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 200000, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -71173,50 +70194,37 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "minimal", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-05-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "attachment": false, + "open_weights": true, + "release_date": "2026-04-07", + "last_updated": "2026-04-07", "type": "chat" }, { - "id": "openai/gpt-6-luna", - "name": "GPT-6 Luna", - "display_name": "GPT-6 Luna", + "id": "deepseek/deepseek-v4-flash-0731", + "name": "DeepSeek V4 Flash 0731", + "display_name": "DeepSeek V4 Flash 0731", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1048576, + "output": 384000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -71224,77 +70232,40 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ + "none", "low", "medium", "high", - "xhigh", "max" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-05-18", - "release_date": "2026-09-22", - "last_updated": "2026-09-22", - "type": "chat" - }, - { - "id": "moonshot-ai/kimi-k2.7-code", - "name": "Kimi K2.7 Code", - "display_name": "Kimi K2.7 Code", - "modalities": { - "input": [ - "text", - "image", - "video" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 262144, - "output": 262144 - }, - "temperature": false, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-06-12", - "last_updated": "2026-06-12", + "knowledge": "2025-05", + "release_date": "2026-07-31", + "last_updated": "2026-07-31", "type": "chat" }, { - "id": "moonshot-ai/kimi-k3", - "name": "Kimi K3", - "display_name": "Kimi K3", + "id": "deepseek/deepseek-v4-flash", + "name": "DeepSeek V4 Flash", + "display_name": "DeepSeek V4 Flash", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 1000000, + "output": 384000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -71303,24 +70274,34 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", "effort_options": [ - "minimal", "low", - "medium", "high", - "xhigh", "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-16", + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "deepseek/deepseek-v4-flash-0731", + "id": "deepseek/deepseek-v4-flash-0731-fast", "name": "DeepSeek V4 Flash 0731", "display_name": "DeepSeek V4 Flash 0731", "modalities": { @@ -71336,19 +70317,14 @@ "output": 384000 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "effort_options": [ - "low", - "high", - "max" - ] + "supported": true } }, "attachment": false, @@ -71359,14 +70335,13 @@ "type": "chat" }, { - "id": "anthropic/claude-haiku-5-5", - "name": "Claude Haiku 5.5", - "display_name": "Claude Haiku 5.5", + "id": "deepseek/deepseek-v4.1-flash", + "name": "DeepSeek V4.1 Flash", + "display_name": "DeepSeek V4.1 Flash", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" @@ -71374,9 +70349,9 @@ }, "limit": { "context": 1000000, - "output": 128000 + "output": 384000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -71384,7 +70359,10 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ + "none", + "minimal", "low", "medium", "high", @@ -71394,21 +70372,19 @@ } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-10-07", - "last_updated": "2026-10-07", + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-09-10", + "last_updated": "2026-09-10", "type": "chat" }, { - "id": "anthropic/claude-opus-4-7", - "name": "Claude Opus 4.7", - "display_name": "Claude Opus 4.7", + "id": "deepseek/deepseek-v4-pro-0423", + "name": "DeepSeek V4 Pro 0423", + "display_name": "DeepSeek V4 Pro 0423", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" @@ -71416,202 +70392,121 @@ }, "limit": { "context": 1000000, - "output": 128000 + "output": 393216 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "high", "effort_options": [ + "none", "low", "medium", "high", - "xhigh", "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-04-16", - "last_updated": "2026-04-16", + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-04-23", + "last_updated": "2026-04-23", "type": "chat" }, { - "id": "anthropic/claude-sonnet-4-5", - "name": "Claude Sonnet 4.5", - "display_name": "Claude Sonnet 4.5", + "id": "deepseek/deepseek-v4-flash-0423", + "name": "DeepSeek V4 Flash 0423", + "display_name": "DeepSeek V4 Flash 0423", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 131072, + "output": 32768 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + "effort_options": [ + "none", + "minimal", + "low", + "medium", + "high", + "xhigh", + "max" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-07-31", - "release_date": "2025-09-29", - "last_updated": "2025-09-29", + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-04-23", + "last_updated": "2026-04-23", "type": "chat" }, { - "id": "anthropic/claude-haiku-4-5", - "name": "Claude Haiku 4.5", - "display_name": "Claude Haiku 4.5", + "id": "deepseek/deepseek-r1", + "name": "DeepSeek R1", + "display_name": "DeepSeek R1", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 163840, + "output": 40960 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-02-28", - "release_date": "2025-10-15", - "last_updated": "2025-10-15", + "attachment": false, + "open_weights": true, + "knowledge": "2024-07", + "release_date": "2025-01-20", + "last_updated": "2025-05-29", "type": "chat" }, { - "id": "anthropic/claude-sonnet-5-5", - "name": "Claude Sonnet 5.5", - "display_name": "Claude Sonnet 5.5", + "id": "deepseek/deepseek-v4-pro", + "name": "DeepSeek V4 Pro", + "display_name": "DeepSeek V4 Pro", "modalities": { "input": [ - "text", - "image", - "pdf" - ], - "output": [ "text" - ] - }, - "limit": { - "context": 1000000, - "output": 128000 - }, - "temperature": false, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ] - } - }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-09-28", - "last_updated": "2026-09-28", - "type": "chat" - }, - { - "id": "anthropic/claude-fable-5-1", - "name": "Claude Fable 5.1", - "display_name": "Claude Fable 5.1", - "modalities": { - "input": [ - "text", - "image", - "pdf" ], "output": [ "text" @@ -71619,9 +70514,9 @@ }, "limit": { "context": 1000000, - "output": 128000 + "output": 384000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -71635,40 +70530,35 @@ "effort": "high", "effort_options": [ "low", - "medium", "high", - "xhigh", "max" ], "interleaved": true, "summaries": true, - "visibility": "omitted", + "visibility": "summary", "continuation": [ "thinking_blocks" ], "notes": [ - "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", - "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", - "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-09-01", - "last_updated": "2026-09-01", + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "anthropic/claude-sonnet-5", - "name": "Claude Sonnet 5", - "display_name": "Claude Sonnet 5", + "id": "deepseek/deepseek-v4.1-flash-1017", + "name": "DeepSeek V4.1 Flash 1017", + "display_name": "DeepSeek V4.1 Flash 1017", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" @@ -71676,9 +70566,9 @@ }, "limit": { "context": 1000000, - "output": 128000 + "output": 384000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -71686,8 +70576,9 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ + "none", + "minimal", "low", "medium", "high", @@ -71697,131 +70588,56 @@ } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-30", - "last_updated": "2026-06-30", + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-10-17", + "last_updated": "2026-10-17", "type": "chat" }, { - "id": "anthropic/claude-opus-5-5", - "name": "Claude Opus 5.5", - "display_name": "Claude Opus 5.5", + "id": "deepseek/deepseek-v3", + "name": "DeepSeek V3", + "display_name": "DeepSeek V3", "modalities": { "input": [ - "text", - "image", - "pdf" - ], - "output": [ "text" - ] - }, - "limit": { - "context": 1000000, - "output": 128000 - }, - "temperature": false, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ] - } - }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-09-22", - "last_updated": "2026-09-22", - "type": "chat" - }, - { - "id": "anthropic/claude-opus-4-5", - "name": "Claude Opus 4.5", - "display_name": "Claude Opus 4.5", - "modalities": { - "input": [ - "text", - "image", - "pdf" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 163840, + "output": 81920 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." - ] - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-03-31", - "release_date": "2025-11-24", - "last_updated": "2025-11-24", + "attachment": false, + "open_weights": true, + "release_date": "2024-12-26", + "last_updated": "2024-12-26", "type": "chat" }, { - "id": "anthropic/claude-opus-5", - "name": "Claude Opus 5", - "display_name": "Claude Opus 5", + "id": "deepseek/deepseek-v3.2", + "name": "DeepSeek V3.2", + "display_name": "DeepSeek V3.2", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 128000, + "output": 32768 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -71829,253 +70645,173 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ] + "supported": true } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-05", - "release_date": "2026-07-24", - "last_updated": "2026-07-24", + "attachment": false, + "open_weights": true, + "knowledge": "2024-07", + "release_date": "2025-12-01", + "last_updated": "2025-12-01", "type": "chat" }, { - "id": "anthropic/claude-sonnet-4-6", - "name": "Claude Sonnet 4.6", - "display_name": "Claude Sonnet 4.6", + "id": "deepseek/deepseek-r1-0528", + "name": "DeepSeek R1 (0528)", + "display_name": "DeepSeek R1 (0528)", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 65536, + "output": 32768 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "max" - ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-17", - "last_updated": "2026-03-13", + "attachment": false, + "open_weights": true, + "release_date": "2025-05-28", + "last_updated": "2025-05-28", "type": "chat" }, { - "id": "anthropic/claude-opus-4-6", - "name": "Claude Opus 4.6", - "display_name": "Claude Opus 4.6", + "id": "deepseek/deepseek-v4-pro-0813", + "name": "DeepSeek V4 Pro 0813", + "display_name": "DeepSeek V4 Pro 0813", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 128000 + "context": 1000000, + "output": 384000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", "effort_options": [ + "none", + "minimal", "low", "medium", "high", + "xhigh", "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-05-31", - "release_date": "2026-02-05", - "last_updated": "2026-03-13", + "attachment": false, + "open_weights": true, + "release_date": "2026-08-13", + "last_updated": "2026-08-22", "type": "chat" }, { - "id": "anthropic/claude-fable-5", - "name": "Claude Fable 5", - "display_name": "Claude Fable 5", + "id": "deepseek/deepseek-v3.1", + "name": "DeepSeek V3.1", + "display_name": "DeepSeek V3.1", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 131072, + "output": 32768 }, - "temperature": false, - "tool_call": true, + "temperature": true, + "tool_call": false, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", - "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", - "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." - ] - } - }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-09", - "last_updated": "2026-06-09", + "attachment": false, + "open_weights": true, + "release_date": "2025-08-21", + "last_updated": "2025-08-21", "type": "chat" }, { - "id": "perplexity/deepseek-v4-pro-0813", - "name": "DeepSeek V4 Pro 0813", - "display_name": "DeepSeek V4 Pro 0813", + "id": "openai/gpt-4.1-nano", + "name": "GPT-4.1 Nano", + "display_name": "GPT-4.1 Nano", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 1047576, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "low", - "high", - "max" - ] - } + "supported": false }, - "attachment": false, - "open_weights": true, - "release_date": "2026-08-13", - "last_updated": "2026-08-22", + "attachment": true, + "open_weights": false, + "knowledge": "2024-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", "type": "chat" }, { - "id": "perplexity/glm-5.3", - "name": "GLM-5.3", - "display_name": "GLM-5.3", + "id": "openai/gpt-6.1-terra", + "name": "GPT-6.1 Terra", + "display_name": "GPT-6.1 Terra", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -72083,66 +70819,57 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ + "none", "low", + "medium", "high", + "xhigh", "max" ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "attachment": true, + "open_weights": false, + "knowledge": "2026-06-01", + "release_date": "2026-10-26", + "last_updated": "2026-10-26", "type": "chat" }, { - "id": "perplexity/kimi-k3", - "name": "Kimi K3", - "display_name": "Kimi K3", + "id": "openai/gpt-4-turbo", + "name": "GPT-4 Turbo", + "display_name": "GPT-4 Turbo", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 128000, + "output": 4096 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "minimal", - "low", - "medium", - "high", - "xhigh", - "max" - ] - } + "supported": false }, "attachment": true, - "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-16", + "open_weights": false, + "knowledge": "2023-12", + "release_date": "2023-11-06", + "last_updated": "2024-04-09", "type": "chat" }, { - "id": "perplexity/nemotron-3.5-super-120b-a12b", - "name": "Nemotron 3.5 Super 120B A12B", - "display_name": "Nemotron 3.5 Super 120B A12B", + "id": "openai/gpt-oss-20b", + "name": "GPT-OSS 20B", + "display_name": "GPT-OSS 20B", "modalities": { "input": [ "text" @@ -72152,36 +70879,31 @@ ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 128000, + "output": 32000 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ] + "supported": true } }, "attachment": false, "open_weights": true, - "release_date": "2026-10-15", - "last_updated": "2026-10-15", + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "perplexity/sonar", - "name": "Sonar", - "display_name": "Sonar", + "id": "openai/gpt-oss-safeguard-120b", + "name": "GPT OSS Safeguard 120B", + "display_name": "GPT OSS Safeguard 120B", "modalities": { "input": [ "text" @@ -72191,25 +70913,25 @@ ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 4096, + "output": 4096 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": false, - "open_weights": false, - "knowledge": "2025-09-01", - "release_date": "2024-01-01", - "last_updated": "2025-09-01", + "open_weights": true, + "release_date": "2025-10-29", + "last_updated": "2025-10-29", "type": "chat" }, { - "id": "perplexity/glm-5.3-flash", - "name": "GLM-5.3-Flash", - "display_name": "GLM-5.3-Flash", + "id": "openai/gpt-5.6-terra", + "name": "GPT-5.6 Terra", + "display_name": "GPT-5.6 Terra", "modalities": { "input": [ "text", @@ -72221,10 +70943,10 @@ ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -72233,34 +70955,42 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ + "none", "low", + "medium", "high", + "xhigh", "max" - ] + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, - "open_weights": true, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", + "open_weights": false, + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" - } - ] - }, - "azure": { - "id": "azure", - "name": "Azure", - "display_name": "Azure", - "doc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", - "models": [ + }, { - "id": "llama-3.3-70b-instruct", - "name": "Llama-3.3-70B-Instruct", - "display_name": "Llama-3.3-70B-Instruct", + "id": "openai/gpt-4o-2024-05-13", + "name": "GPT-4o (2024-05-13)", + "display_name": "GPT-4o (2024-05-13)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" @@ -72268,51 +70998,50 @@ }, "limit": { "context": 128000, - "output": 32768 + "output": 4096 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, - "open_weights": true, - "knowledge": "2023-12", - "release_date": "2024-12-06", - "last_updated": "2024-12-06", + "attachment": true, + "open_weights": false, + "knowledge": "2023-09", + "release_date": "2024-05-13", + "last_updated": "2024-05-13", "type": "chat" }, { - "id": "gpt-image-2.5-flare", - "name": "GPT Image 2.5 Flare", - "display_name": "GPT Image 2.5 Flare", + "id": "openai/whisper-1", + "name": "Whisper", + "display_name": "Whisper", "modalities": { "input": [ - "text", - "image" + "audio" ], "output": [ - "image" + "text" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 448000, + "output": 4096 }, - "temperature": false, + "temperature": true, "tool_call": false, "reasoning": { "supported": false }, "attachment": true, "open_weights": false, - "release_date": "2026-09-08", - "last_updated": "2026-09-08" + "release_date": "2023-03-01", + "last_updated": "2023-03-01" }, { - "id": "gpt-5.2", - "name": "GPT-5.2", - "display_name": "GPT-5.2", + "id": "openai/gpt-5.4", + "name": "GPT-5.4", + "display_name": "GPT-5.4", "modalities": { "input": [ "text", @@ -72324,10 +71053,10 @@ ] }, "limit": { - "context": 400000, + "context": 1050000, "output": 128000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -72358,14 +71087,14 @@ "attachment": true, "open_weights": false, "knowledge": "2025-08-31", - "release_date": "2025-12-11", - "last_updated": "2025-12-11", + "release_date": "2026-03-05", + "last_updated": "2026-03-05", "type": "chat" }, { - "id": "claude-haiku-5-5", - "name": "Claude Haiku 5.5", - "display_name": "Claude Haiku 5.5", + "id": "openai/gpt-5.6-sol", + "name": "GPT-5.6 Sol", + "display_name": "GPT-5.6 Sol", "modalities": { "input": [ "text", @@ -72377,7 +71106,7 @@ ] }, "limit": { - "context": 1000000, + "context": 1050000, "output": 128000 }, "temperature": false, @@ -72388,24 +71117,36 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ + "none", "low", "medium", "high", "xhigh", "max" - ] + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-10-07", - "last_updated": "2026-10-07", + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "gpt-5.4-mini", + "id": "openai/gpt-5.4-mini", "name": "GPT-5.4 Mini", "display_name": "GPT-5.4 Mini", "modalities": { @@ -72458,66 +71199,38 @@ "type": "chat" }, { - "id": "claude-opus-4-7", - "name": "Claude Opus 4.7", - "display_name": "Claude Opus 4.7", + "id": "openai/gpt-audio-mini", + "name": "GPT Audio Mini", + "display_name": "GPT Audio Mini", "modalities": { "input": [ "text", - "image", - "pdf" + "audio" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 128000, + "output": 16384 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." - ] - } + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-04-16", - "last_updated": "2026-04-16", + "knowledge": "2023-10-01", + "release_date": "2025-10-06", + "last_updated": "2025-10-06", "type": "chat" }, { - "id": "claude-sonnet-4-5", - "name": "Claude Sonnet 4.5", - "display_name": "Claude Sonnet 4.5", + "id": "openai/gpt-4o", + "name": "GPT-4o", + "display_name": "GPT-4o", "modalities": { "input": [ "text", @@ -72529,47 +71242,25 @@ ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 128000, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." - ] - } + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2025-07-31", - "release_date": "2025-11-18", - "last_updated": "2025-11-18", + "knowledge": "2023-09", + "release_date": "2024-05-13", + "last_updated": "2024-08-06", "type": "chat" }, { - "id": "gpt-5.6-sol", - "name": "GPT-5.6 Sol", - "display_name": "GPT-5.6 Sol", + "id": "openai/gpt-5.6-luna", + "name": "GPT-5.6 Luna", + "display_name": "GPT-5.6 Luna", "modalities": { "input": [ "text", @@ -72621,12 +71312,14 @@ "type": "chat" }, { - "id": "phi-4-mini-reasoning", - "name": "Phi-4-mini-reasoning", - "display_name": "Phi-4-mini-reasoning", + "id": "openai/gpt-5.2-chat-latest", + "name": "GPT-5.2 Chat Latest", + "display_name": "GPT-5.2 Chat Latest", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" @@ -72634,105 +71327,83 @@ }, "limit": { "context": 128000, - "output": 4096 + "output": 16384 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": false, - "open_weights": true, - "knowledge": "2023-10", - "release_date": "2024-12-11", - "last_updated": "2024-12-11", + "attachment": true, + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2025-12-11", + "last_updated": "2025-12-11", "type": "chat" }, { - "id": "phi-4-reasoning", - "name": "Phi-4-reasoning", - "display_name": "Phi-4-reasoning", + "id": "openai/gpt-audio", + "name": "GPT Audio", + "display_name": "GPT Audio", "modalities": { "input": [ - "text" + "text", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 32000, - "output": 4096 + "context": 128000, + "output": 16384 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": false, - "open_weights": true, - "knowledge": "2023-10", - "release_date": "2024-12-11", - "last_updated": "2024-12-11", + "attachment": true, + "open_weights": false, + "knowledge": "2023-10-01", + "release_date": "2025-08-28", + "last_updated": "2025-08-28", "type": "chat" }, { - "id": "deepseek-v4-flash", - "name": "DeepSeek-V4-Flash", - "display_name": "DeepSeek-V4-Flash", + "id": "openai/gpt-4.1", + "name": "GPT-4.1", + "display_name": "GPT-4.1", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 1047576, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." - ] - } + "supported": false }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "attachment": true, + "open_weights": false, + "knowledge": "2024-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", "type": "chat" }, { - "id": "gpt-5.2-codex", - "name": "GPT-5.2 Codex", - "display_name": "GPT-5.2 Codex", + "id": "openai/gpt-4o-2024-08-06", + "name": "GPT-4o (2024-08-06)", + "display_name": "GPT-4o (2024-08-06)", "modalities": { "input": [ "text", @@ -72744,47 +71415,25 @@ ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 128000, + "output": 16384 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-01-14", - "last_updated": "2026-01-14", + "knowledge": "2023-09", + "release_date": "2024-08-06", + "last_updated": "2024-08-06", "type": "chat" }, { - "id": "text-embedding-3-large", - "name": "text-embedding-3-large", - "display_name": "text-embedding-3-large", + "id": "openai/gpt-3.5-turbo", + "name": "GPT-3.5 Turbo", + "display_name": "GPT-3.5 Turbo", "modalities": { "input": [ "text" @@ -72794,56 +71443,25 @@ ] }, "limit": { - "context": 8192, - "output": 3072 + "context": 16385, + "output": 4096 }, + "temperature": true, "tool_call": false, "reasoning": { "supported": false }, "attachment": false, "open_weights": false, - "release_date": "2024-01-25", - "last_updated": "2024-01-25", - "type": "embedding" - }, - { - "id": "grok-4-20-non-reasoning", - "name": "Grok 4.20 (Non-Reasoning)", - "display_name": "Grok 4.20 (Non-Reasoning)", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 262000, - "output": 8192 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, - "attachment": false, - "open_weights": false, - "knowledge": "2025-09", - "release_date": "2026-04-08", - "last_updated": "2026-04-08", + "knowledge": "2021-09-01", + "release_date": "2023-03-01", + "last_updated": "2023-11-06", "type": "chat" }, { - "id": "gpt-5-nano", - "name": "GPT-5 Nano", - "display_name": "GPT-5 Nano", + "id": "openai/gpt-5.1", + "name": "GPT-5.1", + "display_name": "GPT-5.1", "modalities": { "input": [ "text", @@ -72858,20 +71476,20 @@ "context": 400000, "output": 128000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, + "default_enabled": false, "mode": "effort", - "effort": "medium", + "effort": "none", "effort_options": [ - "minimal", + "none", "low", "medium", "high" @@ -72887,15 +71505,15 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2024-05-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "knowledge": "2024-09-30", + "release_date": "2025-11-13", + "last_updated": "2025-11-13", "type": "chat" }, { - "id": "deepseek-v3.2-speciale", - "name": "DeepSeek-V3.2-Speciale", - "display_name": "DeepSeek-V3.2-Speciale", + "id": "openai/gpt-oss-safeguard-20b", + "name": "GPT OSS Safeguard 20B", + "display_name": "GPT OSS Safeguard 20B", "modalities": { "input": [ "text" @@ -72905,8 +71523,8 @@ ] }, "limit": { - "context": 128000, - "output": 128000 + "context": 4096, + "output": 4096 }, "temperature": true, "tool_call": false, @@ -72916,44 +71534,14 @@ }, "attachment": false, "open_weights": true, - "knowledge": "2024-07", - "release_date": "2025-12-01", - "last_updated": "2025-12-01", - "type": "chat" - }, - { - "id": "llama-4-scout-17b-16e-instruct", - "name": "Llama 4 Scout 17B 16E Instruct", - "display_name": "Llama 4 Scout 17B 16E Instruct", - "modalities": { - "input": [ - "text", - "image" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 128000, - "output": 8192 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": true, - "knowledge": "2024-08", - "release_date": "2025-04-05", - "last_updated": "2025-04-05", + "release_date": "2025-10-29", + "last_updated": "2025-10-29", "type": "chat" }, { - "id": "gpt-4o", - "name": "GPT-4o", - "display_name": "GPT-4o", + "id": "openai/gpt-4o-2024-11-20", + "name": "GPT-4o (2024-11-20)", + "display_name": "GPT-4o (2024-11-20)", "modalities": { "input": [ "text", @@ -72976,66 +71564,56 @@ "attachment": true, "open_weights": false, "knowledge": "2023-09", - "release_date": "2024-05-13", - "last_updated": "2024-08-06", + "release_date": "2024-11-20", + "last_updated": "2024-11-20", "type": "chat" }, { - "id": "claude-haiku-4-5", - "name": "Claude Haiku 4.5", - "display_name": "Claude Haiku 4.5", + "id": "openai/gpt-6-luna", + "name": "GPT-6 Luna", + "display_name": "GPT-6 Luna", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-02-28", - "release_date": "2025-11-18", - "last_updated": "2025-11-18", + "knowledge": "2026-05-18", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "gpt-5.4-nano", - "name": "GPT-5.4 Nano", - "display_name": "GPT-5.4 Nano", + "id": "openai/gpt-5-mini", + "name": "GPT-5 Mini", + "display_name": "GPT-5 Mini", "modalities": { "input": [ "text", @@ -73050,24 +71628,23 @@ "context": 400000, "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, + "default_enabled": true, "mode": "effort", - "effort": "none", + "effort": "medium", "effort_options": [ - "none", + "minimal", "low", "medium", - "high", - "xhigh" + "high" ], "verbosity": "medium", "verbosity_options": [ @@ -73080,15 +71657,15 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-17", - "last_updated": "2026-03-17", + "knowledge": "2024-05-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "kimi-k2.7-code", - "name": "Kimi K2.7 Code", - "display_name": "Kimi K2.7 Code", + "id": "openai/gpt-6-sol", + "name": "GPT-6 Sol", + "display_name": "GPT-6 Sol", "modalities": { "input": [ "text", @@ -73099,8 +71676,8 @@ ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1050000, + "output": 128000 }, "temperature": false, "tool_call": true, @@ -73110,68 +71687,61 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-06-12", - "last_updated": "2026-06-12", + "open_weights": false, + "knowledge": "2026-04-20", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "claude-sonnet-5-5", - "name": "Claude Sonnet 5.5", - "display_name": "Claude Sonnet 5.5", + "id": "openai/gpt-oss-120b", + "name": "GPT-OSS 120B", + "display_name": "GPT-OSS 120B", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 128000, + "output": 32000 }, - "temperature": false, - "tool_call": true, + "temperature": true, + "tool_call": false, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ] + "supported": true } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-09-28", - "last_updated": "2026-09-28", + "attachment": false, + "open_weights": true, + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "gpt-5.6-luna", - "name": "GPT-5.6 Luna", - "display_name": "GPT-5.6 Luna", + "id": "openai/gpt-5", + "name": "GPT-5", + "display_name": "GPT-5", "modalities": { "input": [ "text", @@ -73183,7 +71753,7 @@ ] }, "limit": { - "context": 1050000, + "context": 400000, "output": 128000 }, "temperature": false, @@ -73199,12 +71769,10 @@ "mode": "effort", "effort": "medium", "effort_options": [ - "none", + "minimal", "low", "medium", - "high", - "xhigh", - "max" + "high" ], "verbosity": "medium", "verbosity_options": [ @@ -73217,28 +71785,29 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "knowledge": "2024-09-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "deepseek-v4-pro", - "name": "DeepSeek-V4-Pro", - "display_name": "DeepSeek-V4-Pro", + "id": "openai/gpt-6.1-sol", + "name": "GPT-6.1 Sol", + "display_name": "GPT-6.1 Sol", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -73246,37 +71815,56 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", "effort_options": [ "low", + "medium", "high", + "xhigh", "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "attachment": true, + "open_weights": false, + "knowledge": "2026-04-30", + "release_date": "2026-09-29", + "last_updated": "2026-09-29", "type": "chat" }, { - "id": "gpt-5.1-codex-max", - "name": "GPT-5.1 Codex Max", - "display_name": "GPT-5.1 Codex Max", + "id": "openai/gpt-5.1-chat-latest", + "name": "GPT-5.1 Chat Latest", + "display_name": "GPT-5.1 Chat Latest", + "modalities": { + "input": [ + "text", + "image", + "pdf" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 128000, + "output": 16384 + }, + "temperature": false, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": false, + "knowledge": "2024-09-30", + "release_date": "2025-11-13", + "last_updated": "2025-11-13", + "type": "chat" + }, + { + "id": "openai/gpt-5.2", + "name": "GPT-5.2", + "display_name": "GPT-5.2", "modalities": { "input": [ "text", @@ -73291,7 +71879,7 @@ "context": 400000, "output": 128000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -73307,7 +71895,8 @@ "none", "low", "medium", - "high" + "high", + "xhigh" ], "verbosity": "medium", "verbosity_options": [ @@ -73320,15 +71909,15 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-11-13", - "last_updated": "2025-11-13", + "knowledge": "2025-08-31", + "release_date": "2025-12-11", + "last_updated": "2025-12-11", "type": "chat" }, { - "id": "phi-4", - "name": "Phi-4", - "display_name": "Phi-4", + "id": "openai/gpt-4", + "name": "GPT-4", + "display_name": "GPT-4", "modalities": { "input": [ "text" @@ -73338,8 +71927,8 @@ ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 8192, + "output": 8192 }, "temperature": true, "tool_call": false, @@ -73347,16 +71936,16 @@ "supported": false }, "attachment": false, - "open_weights": true, - "knowledge": "2023-10", - "release_date": "2024-12-11", - "last_updated": "2024-12-11", + "open_weights": false, + "knowledge": "2023-11", + "release_date": "2023-11-06", + "last_updated": "2024-04-09", "type": "chat" }, { - "id": "claude-fable-5-1", - "name": "Claude Fable 5.1", - "display_name": "Claude Fable 5.1", + "id": "openai/gpt-5-search-api", + "name": "GPT-5 Search API", + "display_name": "GPT-5 Search API", "modalities": { "input": [ "text", @@ -73368,11 +71957,40 @@ ] }, "limit": { - "context": 1000000, + "context": 272000, "output": 128000 }, "temperature": false, "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": false, + "release_date": "2025-10-14", + "last_updated": "2025-10-14", + "type": "chat" + }, + { + "id": "openai/o3", + "name": "o3", + "display_name": "o3", + "modalities": { + "input": [ + "text", + "image", + "pdf" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 200000, + "output": 100000 + }, + "temperature": false, + "tool_call": true, "reasoning": { "supported": true, "default": true @@ -73382,38 +72000,26 @@ "supported": true, "default_enabled": true, "mode": "effort", - "effort": "high", + "effort": "medium", "effort_options": [ "low", "medium", - "high", - "xhigh", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" + "high" ], - "notes": [ - "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", - "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", - "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." - ] + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-09-01", - "last_updated": "2026-09-01", + "knowledge": "2024-05", + "release_date": "2025-04-16", + "last_updated": "2025-04-16", "type": "chat" }, { - "id": "claude-sonnet-5", - "name": "Claude Sonnet 5", - "display_name": "Claude Sonnet 5", + "id": "openai/gpt-5.4-nano", + "name": "GPT-5.4 Nano", + "display_name": "GPT-5.4 Nano", "modalities": { "input": [ "text", @@ -73425,41 +72031,53 @@ ] }, "limit": { - "context": 1000000, + "context": 400000, "output": 128000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", "effort_options": [ + "none", "low", "medium", "high", - "xhigh", - "max" - ] + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-30", - "last_updated": "2026-06-30", + "knowledge": "2025-08-31", + "release_date": "2026-03-17", + "last_updated": "2026-03-17", "type": "chat" }, { - "id": "o3-mini", - "name": "o3-mini", - "display_name": "o3-mini", + "id": "openai/o1", + "name": "o1", + "display_name": "o1", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" @@ -73489,20 +72107,22 @@ "visibility": "hidden" } }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2024-05", - "release_date": "2024-12-20", - "last_updated": "2025-01-29", + "knowledge": "2023-09", + "release_date": "2024-12-05", + "last_updated": "2024-12-05", "type": "chat" }, { - "id": "ministral-3b", - "name": "Ministral 3B", - "display_name": "Ministral 3B", + "id": "openai/gpt-5.3-chat-latest", + "name": "GPT-5.3 Chat Latest", + "display_name": "GPT-5.3 Chat Latest", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" @@ -73510,24 +72130,24 @@ }, "limit": { "context": 128000, - "output": 8192 + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-03", - "release_date": "2024-10-22", - "last_updated": "2024-10-22", + "attachment": true, + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-03-03", + "last_updated": "2026-03-03", "type": "chat" }, { - "id": "gpt-5.6-terra", - "name": "GPT-5.6 Terra", - "display_name": "GPT-5.6 Terra", + "id": "openai/gpt-5.5", + "name": "GPT-5.5", + "display_name": "GPT-5.5", "modalities": { "input": [ "text", @@ -73555,12 +72175,10 @@ "mode": "effort", "effort": "medium", "effort_options": [ - "none", "low", "medium", "high", - "xhigh", - "max" + "xhigh" ], "verbosity": "medium", "verbosity_options": [ @@ -73573,26 +72191,27 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "knowledge": "2025-12-01", + "release_date": "2026-04-23", + "last_updated": "2026-04-23", "type": "chat" }, { - "id": "mistral-small-2503", - "name": "Mistral Small 3.1", - "display_name": "Mistral Small 3.1", + "id": "openai/gpt-4.1-mini", + "name": "GPT-4.1 Mini", + "display_name": "GPT-4.1 Mini", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, + "context": 1047576, "output": 32768 }, "temperature": true, @@ -73602,54 +72221,48 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2024-09", - "release_date": "2025-03-01", - "last_updated": "2025-03-01", + "knowledge": "2024-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", "type": "chat" }, { - "id": "grok-4-20-reasoning", - "name": "Grok 4.20 (Reasoning)", - "display_name": "Grok 4.20 (Reasoning)", + "id": "openai/gpt-5-chat-latest", + "name": "GPT-5 Chat Latest", + "display_name": "GPT-5 Chat Latest", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262000, - "output": 8192 + "context": 128000, + "output": 16384 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2025-09", - "release_date": "2026-04-08", - "last_updated": "2026-04-08", + "knowledge": "2024-09-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "o3", - "name": "o3", - "display_name": "o3", + "id": "openai/o3-mini", + "name": "o3 Mini", + "display_name": "o3 Mini", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" @@ -73679,44 +72292,17 @@ "visibility": "hidden" } }, - "attachment": true, + "attachment": false, "open_weights": false, "knowledge": "2024-05", - "release_date": "2025-04-16", - "last_updated": "2025-04-16", + "release_date": "2024-12-20", + "last_updated": "2025-01-29", "type": "chat" }, { - "id": "gpt-image-1", - "name": "GPT-Image-1", - "display_name": "GPT-Image-1", - "modalities": { - "input": [ - "text", - "image" - ], - "output": [ - "image" - ] - }, - "limit": { - "context": 8192, - "output": 8192 - }, - "temperature": false, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": false, - "release_date": "2025-04-24", - "last_updated": "2025-04-24" - }, - { - "id": "grok-4.7", - "name": "Grok 4.7", - "display_name": "Grok 4.7", + "id": "openai/o4-mini", + "name": "o4 Mini", + "display_name": "o4 Mini", "modalities": { "input": [ "text", @@ -73728,10 +72314,10 @@ ] }, "limit": { - "context": 500000, - "output": 500000 + "context": 200000, + "output": 100000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -73739,90 +72325,70 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ "low", "medium", - "high", - "xhigh" - ] + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2026-05", - "release_date": "2026-09-21", - "last_updated": "2026-09-21", + "knowledge": "2024-05", + "release_date": "2025-04-16", + "last_updated": "2025-04-16", "type": "chat" }, { - "id": "text-embedding-ada-002", - "name": "text-embedding-ada-002", - "display_name": "text-embedding-ada-002", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 8192, - "output": 1536 - }, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": false, - "release_date": "2022-12-15", - "last_updated": "2022-12-15", - "type": "embedding" - }, - { - "id": "gpt-image-2.5-sunburst", - "name": "GPT Image 2.5 Sunburst", - "display_name": "GPT Image 2.5 Sunburst", + "id": "openai/gpt-4o-mini", + "name": "GPT-4o Mini", + "display_name": "GPT-4o Mini", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ - "image" + "text" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 128000, + "output": 16384 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": false }, "attachment": true, "open_weights": false, - "release_date": "2026-09-08", - "last_updated": "2026-09-08" + "knowledge": "2023-09", + "release_date": "2024-07-18", + "last_updated": "2024-07-18", + "type": "chat" }, { - "id": "claude-opus-5-5", - "name": "Claude Opus 5.5", - "display_name": "Claude Opus 5.5", + "id": "openai/gpt-6-astra", + "name": "GPT-6 Astra", + "display_name": "GPT-6 Astra", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, + "context": 1050000, "output": 128000 }, "temperature": false, @@ -73833,6 +72399,7 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ "low", "medium", @@ -73844,15 +72411,15 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "knowledge": "2026-04-30", + "release_date": "2026-09-04", + "last_updated": "2026-09-04", "type": "chat" }, { - "id": "gpt-5-pro", - "name": "GPT-5 Pro", - "display_name": "GPT-5 Pro", + "id": "openai/gpt-5-nano", + "name": "GPT-5 Nano", + "display_name": "GPT-5 Nano", "modalities": { "input": [ "text", @@ -73877,8 +72444,14 @@ "reasoning": { "supported": true, "default_enabled": true, - "mode": "fixed", - "effort": "high", + "mode": "effort", + "effort": "medium", + "effort_options": [ + "minimal", + "low", + "medium", + "high" + ], "verbosity": "medium", "verbosity_options": [ "low", @@ -73890,28 +72463,27 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-10-06", - "last_updated": "2025-10-06", + "knowledge": "2024-05-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "gpt-6-sol", - "name": "GPT-6 Sol", - "display_name": "GPT-6 Sol", + "id": "moonshot/kimi-k2.7-code-highspeed", + "name": "Kimi K2.7 Code Highspeed", + "display_name": "Kimi K2.7 Code Highspeed", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 262144, + "output": 32768 }, "temperature": false, "tool_call": true, @@ -73921,27 +72493,26 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-04-20", - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-06-12", + "last_updated": "2026-06-12", "type": "chat" }, { - "id": "mistral-medium-2505", - "name": "Mistral Medium 3", - "display_name": "Mistral Medium 3", + "id": "moonshot/kimi-k3.1-pro", + "name": "Kimi K3.1 Pro", + "display_name": "Kimi K3.1 Pro", "modalities": { "input": [ "text", @@ -73952,38 +72523,46 @@ ] }, "limit": { - "context": 128000, - "output": 128000 + "context": 1048576, + "output": 1048576 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "high", + "max" + ] + } }, "attachment": true, "open_weights": false, - "knowledge": "2025-05", - "release_date": "2025-05-07", - "last_updated": "2025-05-07", + "release_date": "2026-10-23", + "last_updated": "2026-10-23", "type": "chat" }, { - "id": "gpt-5.3-codex", - "name": "GPT-5.3 Codex", - "display_name": "GPT-5.3 Codex", + "id": "moonshot/kimi-k2.7-code", + "name": "Kimi K2.7 Code", + "display_name": "Kimi K2.7 Code", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 262144, + "output": 32768 }, "temperature": false, "tool_call": true, @@ -73994,50 +72573,39 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-24", - "last_updated": "2026-02-24", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-06-12", + "last_updated": "2026-06-12", "type": "chat" }, { - "id": "gpt-6.1-sol", - "name": "GPT-6.1 Sol", - "display_name": "GPT-6.1 Sol", + "id": "moonshot/kimi-k2.6", + "name": "Kimi K2.6", + "display_name": "Kimi K2.6", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 262144, + "output": 262144 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -74045,114 +72613,110 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-04-30", - "release_date": "2026-09-29", - "last_updated": "2026-09-29", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-04-20", + "last_updated": "2026-04-20", "type": "chat" }, { - "id": "phi-4-multimodal", - "name": "Phi-4-multimodal", - "display_name": "Phi-4-multimodal", + "id": "moonshot/kimi-k3", + "name": "Kimi K3", + "display_name": "Kimi K3", "modalities": { "input": [ "text", - "image", - "audio" + "image" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 1048576, + "output": 1048576 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "none", + "minimal", + "low", + "medium", + "high", + "xhigh", + "max" + ] + } }, "attachment": true, "open_weights": true, - "knowledge": "2023-10", - "release_date": "2024-12-11", - "last_updated": "2024-12-11", + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" }, { - "id": "claude-opus-4-5", - "name": "Claude Opus 4.5", - "display_name": "Claude Opus 4.5", + "id": "moonshot/kimi-k2.5", + "name": "Kimi K2.5", + "display_name": "Kimi K2.5", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 262144, + "output": 262144 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high" - ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-03-31", - "release_date": "2025-11-24", - "last_updated": "2025-08-01", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-01-27", + "last_updated": "2026-01-27", "type": "chat" }, { - "id": "gpt-3.5-turbo-1106", - "name": "GPT-3.5 Turbo 1106", - "display_name": "GPT-3.5 Turbo 1106", + "id": "nvidia/nemotron-nano-9b-v2", + "name": "Nemotron Nano 9B", + "display_name": "Nemotron Nano 9B", "modalities": { "input": [ "text" @@ -74162,25 +72726,26 @@ ] }, "limit": { - "context": 16384, - "output": 4096 + "context": 128000, + "output": 8192 }, "temperature": true, "tool_call": false, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": false, - "open_weights": false, - "knowledge": "2021-08", - "release_date": "2023-11-06", - "last_updated": "2023-11-06", + "open_weights": true, + "knowledge": "2024-09", + "release_date": "2025-08-18", + "last_updated": "2025-08-18", "type": "chat" }, { - "id": "phi-4-reasoning-plus", - "name": "Phi-4-reasoning-plus", - "display_name": "Phi-4-reasoning-plus", + "id": "nvidia/nemotron-3.5-lightning-30b-a3b", + "name": "Nemotron 3.5 Lightning 30B A3B", + "display_name": "Nemotron 3.5 Lightning 30B A3B", "modalities": { "input": [ "text" @@ -74190,53 +72755,36 @@ ] }, "limit": { - "context": 32000, - "output": 4096 + "context": 1000000, + "output": 262144 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "low", + "medium", + "high" + ] + } + }, "attachment": false, "open_weights": true, - "knowledge": "2023-10", - "release_date": "2024-12-11", - "last_updated": "2024-12-11", + "knowledge": "2025-09", + "release_date": "2026-08-11", + "last_updated": "2026-08-11", "type": "chat" }, { - "id": "gpt-image-2", - "name": "GPT-Image-2", - "display_name": "GPT-Image-2", - "modalities": { - "input": [ - "text", - "image" - ], - "output": [ - "image" - ] - }, - "limit": { - "context": 8192, - "output": 8192 - }, - "temperature": false, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": false, - "release_date": "2026-04-21", - "last_updated": "2026-04-21" - }, - { - "id": "gpt-3.5-turbo-0125", - "name": "GPT-3.5 Turbo 0125", - "display_name": "GPT-3.5 Turbo 0125", + "id": "nvidia/nemotron-3-nano-30b-a3b", + "name": "Nemotron 3 Nano 30B A3B", + "display_name": "Nemotron 3 Nano 30B A3B", "modalities": { "input": [ "text" @@ -74246,90 +72794,75 @@ ] }, "limit": { - "context": 16384, - "output": 4096 + "context": 256000, + "output": 32000 }, "temperature": true, "tool_call": false, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": false, - "open_weights": false, - "knowledge": "2021-08", - "release_date": "2024-01-25", - "last_updated": "2024-01-25", + "open_weights": true, + "knowledge": "2025-06-25", + "release_date": "2025-12-15", + "last_updated": "2025-12-15", "type": "chat" }, { - "id": "gpt-5.4", - "name": "GPT-5.4", - "display_name": "GPT-5.4", + "id": "sakana/fugu-max", + "name": "Fugu Max", + "display_name": "Fugu Max", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1050000, + "context": 1000000, "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", "effort_options": [ - "none", - "low", - "medium", "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "xhigh", + "max" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-05", - "last_updated": "2026-03-05", + "release_date": "2026-09-11", + "last_updated": "2026-09-11", "type": "chat" }, { - "id": "gpt-5-codex", - "name": "GPT-5-Codex", - "display_name": "GPT-5-Codex", + "id": "sakana/fugu-ultra", + "name": "Fugu Ultra", + "display_name": "Fugu Ultra", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 400000, + "context": 1000000, "output": 128000 }, "temperature": false, @@ -74340,36 +72873,23 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", "effort_options": [ - "minimal", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "high", + "xhigh", + "max" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-09-15", - "last_updated": "2025-09-15", + "release_date": "2026-06-15", + "last_updated": "2026-06-15", "type": "chat" }, { - "id": "kimi-k2.6", - "name": "Kimi K2.6", - "display_name": "Kimi K2.6", + "id": "sakana/sakana-namazu", + "name": "Sakana Namazu", + "display_name": "Sakana Namazu", "modalities": { "input": [ "text", @@ -74381,7 +72901,7 @@ }, "limit": { "context": 262144, - "output": 262144 + "output": 65536 }, "temperature": true, "tool_call": true, @@ -74389,23 +72909,16 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true - } - }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-20", - "last_updated": "2026-04-20", + "open_weights": false, + "release_date": "2026-08-03", + "last_updated": "2026-08-03", "type": "chat" }, { - "id": "grok-4-1-fast-reasoning", - "name": "Grok 4.1 Fast (Reasoning)", - "display_name": "Grok 4.1 Fast (Reasoning)", + "id": "mistral/mistral-medium-2505", + "name": "Mistral Medium 3", + "display_name": "Mistral Medium 3", "modalities": { "input": [ "text", @@ -74417,262 +72930,167 @@ }, "limit": { "context": 128000, - "output": 8192 + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, "attachment": true, "open_weights": false, - "release_date": "2025-06-27", - "last_updated": "2025-06-27", + "knowledge": "2025-05", + "release_date": "2025-05-07", + "last_updated": "2025-05-07", "type": "chat" }, { - "id": "gpt-5.1", - "name": "GPT-5.1", - "display_name": "GPT-5.1", + "id": "mistral/devstral-medium-latest", + "name": "Devstral 2 (latest)", + "display_name": "Devstral 2 (latest)", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 262144, + "output": 262144 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-11-14", - "last_updated": "2025-11-14", + "attachment": false, + "open_weights": true, + "knowledge": "2025-12", + "release_date": "2025-12-02", + "last_updated": "2025-12-02", "type": "chat" }, { - "id": "gpt-chat-latest", - "name": "GPT Chat Latest", - "display_name": "GPT Chat Latest", + "id": "mistral/mistral-large-2512", + "name": "Mistral Large 3", + "display_name": "Mistral Large 3", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 256000, + "output": 256000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "medium" - ] - } + "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2025-12-01", - "release_date": "2026-05-05", - "last_updated": "2026-05-28", + "open_weights": true, + "knowledge": "2024-11", + "release_date": "2025-12-02", + "last_updated": "2025-12-02", "type": "chat" }, { - "id": "codex-mini", - "name": "Codex Mini", - "display_name": "Codex Mini", + "id": "mistral/magistral-medium-latest", + "name": "Magistral Medium (latest)", + "display_name": "Magistral Medium (latest)", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 128000, + "output": 16384 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high" - ] - } - }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-05-16", - "last_updated": "2025-05-16", + "knowledge": "2025-06", + "release_date": "2025-03-17", + "last_updated": "2025-03-20", "type": "chat" }, { - "id": "claude-opus-5", - "name": "Claude Opus 5", - "display_name": "Claude Opus 5", + "id": "mistral/codestral-latest", + "name": "Codestral (latest)", + "display_name": "Codestral (latest)", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 256000, + "output": 4096 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ] - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-05", - "release_date": "2026-07-24", - "last_updated": "2026-07-24", + "attachment": false, + "open_weights": true, + "knowledge": "2024-10", + "release_date": "2024-05-29", + "last_updated": "2025-01-04", "type": "chat" }, { - "id": "claude-sonnet-4-6", - "name": "Claude Sonnet 4.6", - "display_name": "Claude Sonnet 4.6", + "id": "mistral/mistral-large-latest", + "name": "Mistral Large (latest)", + "display_name": "Mistral Large (latest)", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 64000 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." - ] - } + "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-17", - "last_updated": "2026-03-13", + "open_weights": true, + "knowledge": "2024-11", + "release_date": "2024-11-01", + "last_updated": "2025-12-02", "type": "chat" }, { - "id": "kimi-k2.5", - "name": "Kimi K2.5", - "display_name": "Kimi K2.5", + "id": "mistral/mistral-medium-latest", + "name": "Mistral Medium (latest)", + "display_name": "Mistral Medium (latest)", "modalities": { "input": [ "text", @@ -74692,41 +73110,28 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, "attachment": true, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-01-27", - "last_updated": "2026-01-27", + "release_date": "2026-04-29", + "last_updated": "2026-04-29", "type": "chat" }, { - "id": "gpt-4.1-mini", - "name": "GPT-4.1 mini", - "display_name": "GPT-4.1 mini", + "id": "mistral/pixtral-large-latest", + "name": "Pixtral Large (latest)", + "display_name": "Pixtral Large (latest)", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1047576, - "output": 32768 + "context": 128000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -74734,132 +73139,116 @@ "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-04-14", - "last_updated": "2025-04-14", + "open_weights": true, + "knowledge": "2024-11", + "release_date": "2024-11-01", + "last_updated": "2024-11-04", "type": "chat" }, { - "id": "gpt-6-astra", - "name": "GPT-6 Astra", - "display_name": "GPT-6 Astra", + "id": "mistral/mistral-small-latest", + "name": "Mistral Small (latest)", + "display_name": "Mistral Small (latest)", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 256000, + "output": 256000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ] - } - }, "attachment": true, - "open_weights": false, - "knowledge": "2026-04-30", - "release_date": "2026-09-04", - "last_updated": "2026-09-04", + "open_weights": true, + "knowledge": "2025-06", + "release_date": "2026-03-16", + "last_updated": "2026-03-16", "type": "chat" }, { - "id": "grok-4-1-fast-non-reasoning", - "name": "Grok 4.1 Fast (Non-Reasoning)", - "display_name": "Grok 4.1 Fast (Non-Reasoning)", + "id": "mistral/devstral-2512", + "name": "Devstral 2", + "display_name": "Devstral 2", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 256000, + "output": 256000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": true, - "open_weights": false, - "release_date": "2025-06-27", - "last_updated": "2025-06-27", + "attachment": false, + "open_weights": true, + "knowledge": "2025-12", + "release_date": "2025-12-09", + "last_updated": "2025-12-09", "type": "chat" }, { - "id": "llama-4-maverick-17b-128e-instruct-fp8", - "name": "Llama 4 Maverick 17B 128E Instruct FP8", - "display_name": "Llama 4 Maverick 17B 128E Instruct FP8", + "id": "meta/llama-3.1-8b-instruct", + "name": "Llama 3.1 8B", + "display_name": "Llama 3.1 8B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 16384 + "context": 128000, + "output": 2048 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2024-08", - "release_date": "2025-04-05", - "last_updated": "2025-04-05", + "knowledge": "2023-12", + "release_date": "2024-07-23", + "last_updated": "2024-07-23", "type": "chat" }, { - "id": "gpt-5.5", - "name": "GPT-5.5", - "display_name": "GPT-5.5", + "id": "meta/muse-spark-open", + "name": "Muse Spark Open", + "display_name": "Muse Spark Open", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1048576, + "output": 262144 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -74867,227 +73256,142 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", "effort_options": [ "low", "medium", "high", "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-12-01", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "open_weights": true, + "knowledge": "2026-01-04", + "release_date": "2026-10-15", + "last_updated": "2026-10-15", "type": "chat" }, { - "id": "gpt-4o-mini", - "name": "GPT-4o mini", - "display_name": "GPT-4o mini", + "id": "meta/llama-3.3-70b-instruct", + "name": "Llama 3.3 70B Instruct", + "display_name": "Llama 3.3 70B Instruct", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 131072, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2023-09", - "release_date": "2024-07-18", - "last_updated": "2024-07-18", + "attachment": false, + "open_weights": true, + "knowledge": "2023-12", + "release_date": "2024-12-06", + "last_updated": "2024-12-06", "type": "chat" }, { - "id": "deepseek-v4.1-flash", - "name": "DeepSeek-V4.1-Flash", - "display_name": "DeepSeek-V4.1-Flash", + "id": "meta/llama-3.1-70b-instruct", + "name": "Llama 3.1 70B", + "display_name": "Llama 3.1 70B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 128000, + "output": 2048 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "none", - "low", - "high", - "max" - ] - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-09-10", - "last_updated": "2026-09-10", + "knowledge": "2023-12", + "release_date": "2024-07-23", + "last_updated": "2024-07-23", "type": "chat" }, { - "id": "claude-opus-4-6", - "name": "Claude Opus 4.6", - "display_name": "Claude Opus 4.6", + "id": "thinkingmachines/inkling", + "name": "Inkling", + "display_name": "Inkling", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 1048000, + "output": 32000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." - ] - } + "default": true }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-05-31", - "release_date": "2026-02-05", - "last_updated": "2026-07-17", + "attachment": false, + "open_weights": true, + "release_date": "2026-07-15", + "last_updated": "2026-07-15", "type": "chat" }, { - "id": "gpt-5-mini", - "name": "GPT-5 Mini", - "display_name": "GPT-5 Mini", + "id": "bytedance/dola-seed-2.0-pro", + "name": "Seed 2.0 Pro", + "display_name": "Seed 2.0 Pro", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 400000, + "context": 256000, "output": 128000 }, "temperature": false, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "minimal", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } - }, "attachment": true, "open_weights": false, - "knowledge": "2024-05-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "release_date": "2026-02-14", + "last_updated": "2026-02-14", "type": "chat" }, { - "id": "codestral-2501", - "name": "Codestral 25.01", - "display_name": "Codestral 25.01", + "id": "bytedance/dola-seed-2.0-code", + "name": "Seed 2.0 Code", + "display_name": "Seed 2.0 Code", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" @@ -75095,131 +73399,106 @@ }, "limit": { "context": 256000, - "output": 256000 + "output": 128000 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2024-03", - "release_date": "2025-01-01", - "last_updated": "2025-01-01", + "release_date": "2026-02-14", + "last_updated": "2026-02-14", "type": "chat" }, { - "id": "gpt-3.5-turbo-instruct", - "name": "GPT-3.5 Turbo Instruct", - "display_name": "GPT-3.5 Turbo Instruct", + "id": "bytedance/dola-seed-2.0-lite", + "name": "Seed 2.0 Lite", + "display_name": "Seed 2.0 Lite", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 4096, - "output": 4096 + "context": 256000, + "output": 128000 }, "temperature": true, "tool_call": false, "reasoning": { "supported": false }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2021-08", - "release_date": "2023-09-21", - "last_updated": "2023-09-21", + "release_date": "2026-02-14", + "last_updated": "2026-02-14", "type": "chat" }, { - "id": "gpt-5", - "name": "GPT-5", - "display_name": "GPT-5", + "id": "bytedance/dola-seed-2.0-mini", + "name": "Seed 2.0 Mini", + "display_name": "Seed 2.0 Mini", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 400000, + "context": 256000, "output": 128000 }, - "temperature": false, - "tool_call": true, + "temperature": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "minimal", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "release_date": "2026-02-14", + "last_updated": "2026-02-14", "type": "chat" }, { - "id": "model-router", - "name": "Model Router", - "display_name": "Model Router", + "id": "bytedance/dola-seed-2.0-code-preview", + "name": "Dola Seed 2.0 Code (preview)", + "display_name": "Dola Seed 2.0 Code (preview)", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 16384 + "context": 131072, + "output": 32768 }, - "tool_call": true, + "temperature": true, + "tool_call": false, "reasoning": { "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2025-05-19", - "last_updated": "2025-11-18", + "release_date": "2026-03-28", + "last_updated": "2026-03-28", "type": "chat" }, { - "id": "gpt-6-luna", - "name": "GPT-6 Luna", - "display_name": "GPT-6 Luna", + "id": "anthropic/claude-fable-5", + "name": "Claude Fable 5", + "display_name": "Claude Fable 5", "modalities": { "input": [ "text", @@ -75231,7 +73510,7 @@ ] }, "limit": { - "context": 1050000, + "context": 1000000, "output": 128000 }, "temperature": false, @@ -75242,27 +73521,41 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", "effort_options": [ - "none", "low", "medium", "high", "xhigh", "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", + "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", + "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-05-18", - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "knowledge": "2026-01-31", + "release_date": "2026-06-09", + "last_updated": "2026-06-09", "type": "chat" }, { - "id": "gpt-4.1", - "name": "GPT-4.1", - "display_name": "GPT-4.1", + "id": "anthropic/claude-sonnet-4-6", + "name": "Claude Sonnet 4.6", + "display_name": "Claude Sonnet 4.6", "modalities": { "input": [ "text", @@ -75274,100 +73567,126 @@ ] }, "limit": { - "context": 1047576, - "output": 32768 + "context": 1000000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." + ] + } }, "attachment": true, "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-04-14", - "last_updated": "2025-04-14", + "knowledge": "2025-08-31", + "release_date": "2026-02-17", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "cohere-embed-v3-english", - "name": "Embed v3 English", - "display_name": "Embed v3 English", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 512, - "output": 1024 - }, - "temperature": false, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": true, - "release_date": "2023-11-07", - "last_updated": "2023-11-07", - "type": "embedding" - }, - { - "id": "deepseek-v3.2", - "name": "DeepSeek-V3.2", - "display_name": "DeepSeek-V3.2", + "id": "anthropic/claude-opus-4-7", + "name": "Claude Opus 4.7", + "display_name": "Claude Opus 4.7", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, + "context": 1000000, "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." + ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-07", - "release_date": "2025-12-01", - "last_updated": "2025-12-01", + "attachment": true, + "open_weights": false, + "knowledge": "2026-01-31", + "release_date": "2026-04-16", + "last_updated": "2026-04-16", "type": "chat" }, { - "id": "grok-4.6", - "name": "Grok 4.6", - "display_name": "Grok 4.6", + "id": "anthropic/claude-fable-5-1", + "name": "Claude Fable 5.1", + "display_name": "Claude Fable 5.1", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 200000, + "context": 1000000, "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -75376,82 +73695,123 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", "effort_options": [ "low", "medium", "high", - "xhigh" + "xhigh", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", + "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", + "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-02-01", - "release_date": "2026-08-12", - "last_updated": "2026-08-12", + "knowledge": "2026-06", + "release_date": "2026-09-01", + "last_updated": "2026-09-01", "type": "chat" }, { - "id": "gpt-4-turbo-vision", - "name": "GPT-4 Turbo Vision", - "display_name": "GPT-4 Turbo Vision", + "id": "anthropic/claude-opus-4-1-20250805", + "name": "Claude Opus 4.1 (20250805)", + "display_name": "Claude Opus 4.1 (20250805)", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 200000, + "output": 32000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + ] + } }, "attachment": true, "open_weights": false, - "knowledge": "2023-11", - "release_date": "2023-11-06", - "last_updated": "2024-04-09", + "knowledge": "2025-03-31", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "cohere-embed-v-4-0", - "name": "Embed v4", - "display_name": "Embed v4", + "id": "anthropic/claude-opus-5-5", + "name": "Claude Opus 5.5", + "display_name": "Claude Opus 5.5", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 1536 + "context": 1000000, + "output": 128000 }, "temperature": false, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": true, - "open_weights": true, - "release_date": "2025-04-15", - "last_updated": "2025-04-15", - "type": "embedding" + "open_weights": false, + "knowledge": "2026-06", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", + "type": "chat" }, { - "id": "gpt-5.1-codex-mini", - "name": "GPT-5.1 Codex Mini", - "display_name": "GPT-5.1 Codex Mini", + "id": "anthropic/claude-opus-4-6", + "name": "Claude Opus 4.6", + "display_name": "Claude Opus 4.6", "modalities": { "input": [ "text", @@ -75463,10 +73823,10 @@ ] }, "limit": { - "context": 400000, + "context": 1000000, "output": 128000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -75476,34 +73836,41 @@ "reasoning": { "supported": true, "default_enabled": false, - "mode": "effort", - "effort": "none", + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", "effort_options": [ - "none", "low", "medium", - "high" + "high", + "max" ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ], - "visibility": "hidden" + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-11-14", - "last_updated": "2025-11-14", + "knowledge": "2025-05-31", + "release_date": "2026-02-05", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "claude-mythos-5", - "name": "Claude Mythos 5", - "display_name": "Claude Mythos 5", + "id": "anthropic/claude-opus-4-8", + "name": "Claude Opus 4.8", + "display_name": "Claude Opus 4.8", "modalities": { "input": [ "text", @@ -75522,12 +73889,12 @@ "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, + "default_enabled": false, "mode": "effort", "effort": "high", "effort_options": [ @@ -75544,23 +73911,23 @@ "thinking_blocks" ], "notes": [ - "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", - "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", - "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-09", - "last_updated": "2026-06-09", + "knowledge": "2026-01", + "release_date": "2026-05-28", + "last_updated": "2026-05-28", "type": "chat" }, { - "id": "claude-opus-4-8", - "name": "Claude Opus 4.8", - "display_name": "Claude Opus 4.8", + "id": "anthropic/claude-opus-5", + "name": "Claude Opus 5", + "display_name": "Claude Opus 5", "modalities": { "input": [ "text", @@ -75579,45 +73946,31 @@ "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "high", "effort_options": [ "low", "medium", "high", "xhigh", "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-12-31", - "release_date": "2026-05-28", - "last_updated": "2026-05-28", + "knowledge": "2026-05", + "release_date": "2026-07-24", + "last_updated": "2026-07-24", "type": "chat" }, { - "id": "o1", - "name": "o1", - "display_name": "o1", + "id": "anthropic/claude-haiku-4-5-20251001", + "name": "Claude Haiku 4.5 (20251001)", + "display_name": "Claude Haiku 4.5 (20251001)", "modalities": { "input": [ "text", @@ -75630,66 +73983,77 @@ }, "limit": { "context": 200000, - "output": 100000 + "output": 64000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high" + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ], - "visibility": "hidden" + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2023-09", - "release_date": "2024-12-05", - "last_updated": "2024-12-05", + "knowledge": "2025-02-28", + "release_date": "2025-10-15", + "last_updated": "2025-10-15", "type": "chat" }, { - "id": "cohere-embed-v3-multilingual", - "name": "Embed v3 Multilingual", - "display_name": "Embed v3 Multilingual", + "id": "anthropic/claude-haiku-5-5", + "name": "Claude Haiku 5.5", + "display_name": "Claude Haiku 5.5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 512, - "output": 1024 + "context": 1000000, + "output": 128000 }, "temperature": false, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "release_date": "2023-11-07", - "last_updated": "2023-11-07", - "type": "embedding" + "attachment": true, + "open_weights": false, + "knowledge": "2026-06", + "release_date": "2026-10-07", + "last_updated": "2026-10-07", + "type": "chat" }, { - "id": "gpt-4.1-nano", - "name": "GPT-4.1 nano", - "display_name": "GPT-4.1 nano", + "id": "anthropic/claude-sonnet-5-5", + "name": "Claude Sonnet 5.5", + "display_name": "Claude Sonnet 5.5", "modalities": { "input": [ "text", @@ -75701,25 +74065,26 @@ ] }, "limit": { - "context": 1047576, - "output": 32768 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": true, "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-04-14", - "last_updated": "2025-04-14", + "knowledge": "2026-06", + "release_date": "2026-09-28", + "last_updated": "2026-09-28", "type": "chat" }, { - "id": "o4-mini", - "name": "o4-mini", - "display_name": "o4-mini", + "id": "anthropic/claude-sonnet-5", + "name": "Claude Sonnet 5", + "display_name": "Claude Sonnet 5", "modalities": { "input": [ "text", @@ -75731,8 +74096,8 @@ ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 1000000, + "output": 128000 }, "temperature": false, "tool_call": true, @@ -75743,54 +74108,78 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", "effort_options": [ "low", "medium", - "high" - ], - "visibility": "hidden" - } - }, - "attachment": true, + "high", + "xhigh", + "max" + ] + } + }, + "attachment": true, "open_weights": false, - "knowledge": "2024-05", - "release_date": "2025-04-16", - "last_updated": "2025-04-16", + "knowledge": "2026-01-31", + "release_date": "2026-06-30", + "last_updated": "2026-06-30", "type": "chat" }, { - "id": "text-embedding-3-small", - "name": "text-embedding-3-small", - "display_name": "text-embedding-3-small", + "id": "anthropic/claude-sonnet-4-5-20250929", + "name": "Claude Sonnet 4.5 (20250929)", + "display_name": "Claude Sonnet 4.5 (20250929)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 8192, - "output": 1536 + "context": 200000, + "output": 64000 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + ] + } + }, + "attachment": true, "open_weights": false, - "release_date": "2024-01-25", - "last_updated": "2024-01-25", - "type": "embedding" + "knowledge": "2025-07-31", + "release_date": "2025-09-29", + "last_updated": "2025-09-29", + "type": "chat" }, { - "id": "gpt-5.1-codex", - "name": "GPT-5.1 Codex", - "display_name": "GPT-5.1 Codex", + "id": "anthropic/claude-opus-4-5-20251101", + "name": "Claude Opus 4.5 (20251101)", + "display_name": "Claude Opus 4.5 (20251101)", "modalities": { "input": [ "text", @@ -75802,10 +74191,10 @@ ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 200000, + "output": 64000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -75815,78 +74204,92 @@ "reasoning": { "supported": true, "default_enabled": false, - "mode": "effort", - "effort": "none", + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", "effort_options": [ - "none", "low", "medium", "high" ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ], - "visibility": "hidden" + "notes": [ + "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-11-14", - "last_updated": "2025-11-14", + "knowledge": "2025-05", + "release_date": "2025-11-24", + "last_updated": "2025-11-24", "type": "chat" }, { - "id": "gpt-4-turbo", - "name": "GPT-4 Turbo", - "display_name": "GPT-4 Turbo", + "id": "minimax/minimax-m2.7", + "name": "MiniMax M2.7", + "display_name": "MiniMax M2.7", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 204800, + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, - "open_weights": false, - "knowledge": "2023-12", - "release_date": "2023-11-06", - "last_updated": "2024-04-09", + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, + "open_weights": true, + "release_date": "2026-03-18", + "last_updated": "2026-03-18", "type": "chat" }, { - "id": "claude-fable-5", - "name": "Claude Fable 5", - "display_name": "Claude Fable 5", + "id": "minimax/minimax-m2.7-highspeed", + "name": "MiniMax M2.7 Highspeed", + "display_name": "MiniMax M2.7 Highspeed", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 204800, + "output": 8192 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -75895,83 +74298,72 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], "interleaved": true, "summaries": true, - "visibility": "omitted", + "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", - "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", - "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-09", - "last_updated": "2026-06-09", + "attachment": false, + "open_weights": true, + "release_date": "2026-03-18", + "last_updated": "2026-03-18", "type": "chat" }, { - "id": "phi-4-mini", - "name": "Phi-4-mini", - "display_name": "Phi-4-mini", + "id": "minimax/minimax-m3", + "name": "MiniMax M3", + "display_name": "MiniMax M3", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 1000000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": true, "open_weights": true, - "knowledge": "2023-10", - "release_date": "2024-12-11", - "last_updated": "2024-12-11", + "release_date": "2026-06-01", + "last_updated": "2026-06-01", "type": "chat" }, { - "id": "gpt-5.4-pro", - "name": "GPT-5.4 Pro", - "display_name": "GPT-5.4 Pro", + "id": "minimax/minimax-m3.1-flash", + "name": "MiniMax M3.1 Flash", + "display_name": "MiniMax M3.1 Flash", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1050000, + "context": 1000000, "output": 128000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -75979,35 +74371,25 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", "effort_options": [ - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ "low", "medium", - "high" - ], - "visibility": "hidden" + "high", + "xhigh", + "max" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-05", - "last_updated": "2026-03-05", + "release_date": "2026-10-19", + "last_updated": "2026-10-19", "type": "chat" }, { - "id": "cohere-command-a", - "name": "Command A", - "display_name": "Command A", + "id": "minimax/minimax-m2.5", + "name": "MiniMax M2.5", + "display_name": "MiniMax M2.5", "modalities": { "input": [ "text" @@ -76017,7 +74399,7 @@ ] }, "limit": { - "context": 131072, + "context": 204800, "output": 8192 }, "temperature": true, @@ -76026,67 +74408,65 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, "attachment": false, "open_weights": true, - "knowledge": "2024-06-01", - "release_date": "2025-03-13", - "last_updated": "2025-03-13", + "release_date": "2026-02-12", + "last_updated": "2026-02-12", "type": "chat" }, { - "id": "gpt-image-1.5", - "name": "GPT-Image-1.5", - "display_name": "GPT-Image-1.5", + "id": "minimax/minimax-m2.5-highspeed", + "name": "MiniMax M2.5 Highspeed", + "display_name": "MiniMax M2.5 Highspeed", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ - "text", - "image" + "text" ] }, "limit": { - "context": 8192, + "context": 204800, "output": 8192 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, - "open_weights": false, - "release_date": "2025-11-25", - "last_updated": "2025-11-25" - } - ] - }, - "moonshot-ai": { - "id": "moonshot-ai", - "name": "Moonshot AI", - "display_name": "Moonshot AI", - "api": "https://api.moonshot.ai/v1", - "doc": "https://platform.moonshot.ai/docs/api/chat", - "models": [ + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": false, + "open_weights": true, + "release_date": "2026-02-13", + "last_updated": "2026-02-13", + "type": "chat" + }, { - "id": "kimi-k2.7-code", - "name": "Kimi K2.7 Code", - "display_name": "Kimi K2.7 Code", + "id": "minimax/minimax-m2.1", + "name": "MiniMax M2.1", + "display_name": "MiniMax M2.1", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 204800, + "output": 8192 }, "temperature": true, "tool_call": true, @@ -76096,75 +74476,166 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "fixed", - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-21", - "last_updated": "2026-04-21", + "release_date": "2025-12-23", + "last_updated": "2025-12-23", "type": "chat" }, { - "id": "kimi-k2.6", - "name": "Kimi K2.6", - "display_name": "Kimi K2.6", + "id": "minimax/minimax-m2", + "name": "MiniMax M2", + "display_name": "MiniMax M2", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 204800, + "output": 8192 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "attachment": false, + "open_weights": true, + "release_date": "2025-10-27", + "last_updated": "2025-10-27", + "type": "chat" + }, + { + "id": "cohere/command-a-03-2025", + "name": "Command A 03-2025", + "display_name": "Command A 03-2025", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] }, - "attachment": true, + "limit": { + "context": 256000, + "output": 8000 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": false, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-20", - "last_updated": "2026-04-20", + "knowledge": "2024-06-01", + "release_date": "2025-03-13", + "last_updated": "2025-03-13", "type": "chat" }, { - "id": "kimi-k3", - "name": "Kimi K3", - "display_name": "Kimi K3", + "id": "cohere/command-r-08-2024", + "name": "Command R 08-2024", + "display_name": "Command R 08-2024", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 128000, + "output": 4000 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "knowledge": "2024-06-01", + "release_date": "2024-08-30", + "last_updated": "2024-08-30", + "type": "chat" + }, + { + "id": "cohere/command-r7b-12-2024", + "name": "Command R7B 12-2024", + "display_name": "Command R7B 12-2024", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 128000, + "output": 4000 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "knowledge": "2024-06-01", + "release_date": "2024-12-13", + "last_updated": "2024-12-13", + "type": "chat" + }, + { + "id": "cohere/command-r-plus-08-2024", + "name": "Command R+ 08-2024", + "display_name": "Command R+ 08-2024", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 128000, + "output": 4000 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "knowledge": "2024-06-01", + "release_date": "2024-08-30", + "last_updated": "2024-08-30", + "type": "chat" + }, + { + "id": "google/gemini-3.1-pro-preview", + "name": "Gemini 3.1 Pro Preview", + "display_name": "Gemini 3.1 Pro Preview", "modalities": { "input": [ "text", "image", - "video" + "video", + "audio", + "pdf" ], "output": [ "text" @@ -76172,9 +74643,9 @@ }, "limit": { "context": 1048576, - "output": 1048576 + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -76183,34 +74654,35 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "low", + "high" + ], "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "low", - "high", - "max" + "thought_signatures" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-16", + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2026-02-19", + "last_updated": "2026-02-19", "type": "chat" }, { - "id": "kimi-k3.1-pro-highspeed", - "name": "Kimi K3.1 Pro Highspeed", - "display_name": "Kimi K3.1 Pro Highspeed", + "id": "google/gemini-3-flash-preview", + "name": "Gemini 3 Flash Preview", + "display_name": "Gemini 3 Flash Preview", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" @@ -76218,9 +74690,9 @@ }, "limit": { "context": 1048576, - "output": 1048576 + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -76229,34 +74701,39 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", + "low", + "medium", + "high" + ], "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "low", - "high", - "max" + "thought_signatures" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-10-23", - "last_updated": "2026-10-23", + "knowledge": "2025-01", + "release_date": "2025-12-17", + "last_updated": "2025-12-17", "type": "chat" }, { - "id": "kimi-k3.1-pro", - "name": "Kimi K3.1 Pro", - "display_name": "Kimi K3.1 Pro", + "id": "google/gemini-3.1-pro-preview-customtools", + "name": "Gemini 3.1 Pro Preview Custom Tools", + "display_name": "Gemini 3.1 Pro Preview Custom Tools", "modalities": { "input": [ "text", "image", - "video" + "audio", + "pdf" ], "output": [ "text" @@ -76264,9 +74741,9 @@ }, "limit": { "context": 1048576, - "output": 1048576 + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -76275,42 +74752,45 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "low", + "high" + ], "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "low", - "high", - "max" + "thought_signatures" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-10-23", - "last_updated": "2026-10-23", + "knowledge": "2025-01", + "release_date": "2026-02-19", + "last_updated": "2026-02-19", "type": "chat" }, { - "id": "kimi-k2.7-code-highspeed", - "name": "Kimi K2.7 Code Highspeed", - "display_name": "Kimi K2.7 Code Highspeed", + "id": "google/gemini-2.5-pro", + "name": "Gemini 2.5 Pro", + "display_name": "Gemini 2.5 Pro", "modalities": { "input": [ "text", "image", - "video" + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -76322,39 +74802,39 @@ "reasoning": { "supported": true, "default_enabled": true, - "mode": "fixed", - "interleaved": true, + "mode": "budget", + "budget": { + "default": -1, + "min": 128, + "max": 32768, + "auto": -1, + "unit": "tokens" + }, "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" + "thought_signatures" ] } }, "attachment": true, - "open_weights": true, + "open_weights": false, "knowledge": "2025-01", - "release_date": "2026-04-21", - "last_updated": "2026-04-21", + "release_date": "2025-06-17", + "last_updated": "2025-06-17", "type": "chat" - } - ] - }, - "iteracompute": { - "id": "iteracompute", - "name": "IteraCompute", - "display_name": "IteraCompute", - "api": "https://api.iteracompute.com/v1", - "doc": "https://iteracompute.com/docs.html", - "models": [ + }, { - "id": "minimax/minimax-m3", - "name": "MiniMax-M3", - "display_name": "MiniMax-M3", + "id": "google/gemini-3.5-flash-lite", + "name": "Gemini 3.5 Flash-Lite", + "display_name": "Gemini 3.5 Flash-Lite", "modalities": { "input": [ "text", - "image" + "image", + "video", + "audio", + "pdf" ], "output": [ "text" @@ -76362,7 +74842,7 @@ }, "limit": { "context": 1048576, - "output": 524288 + "output": 65536 }, "temperature": true, "tool_call": true, @@ -76376,100 +74856,88 @@ } }, "attachment": true, - "open_weights": true, - "release_date": "2026-06-01", - "last_updated": "2026-06-01", + "open_weights": false, + "knowledge": "2026-03", + "release_date": "2026-07-21", + "last_updated": "2026-07-21", "type": "chat" }, { - "id": "moonshotai/kimi-k2.7-code", - "name": "Kimi K2.7 Code", - "display_name": "Kimi K2.7 Code", + "id": "google/gemma-3-12b-it", + "name": "Gemma 3 12B", + "display_name": "Gemma 3 12B", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 235929 + "context": 128000, + "output": 8192 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-06-12", - "last_updated": "2026-06-12", + "knowledge": "2024-08", + "release_date": "2025-03-12", + "last_updated": "2025-03-12", "type": "chat" }, { - "id": "moonshotai/kimi-k3", - "name": "Kimi K3", - "display_name": "Kimi K3", + "id": "google/gemini-embedding-001", + "name": "Gemini Embedding 001", + "display_name": "Gemini Embedding 001", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 999999 + "context": 2048, + "output": 4096 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "low", - "high", - "max" - ] - } + "supported": false }, - "attachment": true, - "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-16", - "type": "chat" + "attachment": false, + "open_weights": false, + "knowledge": "2025-05", + "release_date": "2025-05-20", + "last_updated": "2025-05-20", + "type": "embedding" }, { - "id": "qwen/qwen3.8-27b", - "name": "Qwen3.8 27B", - "display_name": "Qwen3.8 27B", + "id": "google/gemini-flash-latest", + "name": "Gemini Flash Latest", + "display_name": "Gemini Flash Latest", "modalities": { "input": [ "text", - "image" + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -76480,22 +74948,24 @@ "extra_capabilities": { "reasoning": { "effort_options": [ + "minimal", "low", "medium", - "xhigh" + "high" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "open_weights": false, + "knowledge": "2026-03", + "release_date": "2026-08-13", + "last_updated": "2026-08-13", "type": "chat" }, { - "id": "qwen/qwen3.8-2.4t-a95b", - "name": "Qwen3.8 2.4T A95B", - "display_name": "Qwen3.8 2.4T A95B", + "id": "google/gemma-3-4b-it", + "name": "Gemma 3 4B", + "display_name": "Gemma 3 4B", "modalities": { "input": [ "text", @@ -76506,38 +74976,31 @@ ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 128000, + "output": 8192 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "low", - "medium", - "xhigh" - ] - } + "supported": false }, "attachment": true, "open_weights": true, - "release_date": "2026-08-12", - "last_updated": "2026-08-12", + "knowledge": "2024-08", + "release_date": "2025-03-12", + "last_updated": "2025-03-12", "type": "chat" }, { - "id": "z-ai/glm-5.3", - "name": "GLM-5.3", - "display_name": "GLM-5.3", + "id": "google/gemini-3.1-flash-lite", + "name": "Gemini 3.1 Flash-Lite", + "display_name": "Gemini 3.1 Flash-Lite", "modalities": { "input": [ - "text" + "text", + "image", + "audio", + "pdf" ], "output": [ "text" @@ -76545,7 +75008,7 @@ }, "limit": { "context": 1048576, - "output": 131072 + "output": 65536 }, "temperature": true, "tool_call": true, @@ -76557,26 +75020,31 @@ "reasoning": { "supported": true, "effort_options": [ + "minimal", "low", - "high", - "max" + "medium", + "high" ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "attachment": true, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2026-05-07", + "last_updated": "2026-05-07", "type": "chat" }, { - "id": "z-ai/glm-5.3-flash", - "name": "GLM-5.3-Flash", - "display_name": "GLM-5.3-Flash", + "id": "google/gemini-flash-lite-latest", + "name": "Gemini Flash-Lite Latest", + "display_name": "Gemini Flash-Lite Latest", "modalities": { "input": [ "text", - "image" + "image", + "video", + "audio", + "pdf" ], "output": [ "text" @@ -76584,7 +75052,7 @@ }, "limit": { "context": 1048576, - "output": 131072 + "output": 65536 }, "temperature": true, "tool_call": true, @@ -76594,24 +75062,25 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ + "minimal", "low", - "high", - "max" + "medium", + "high" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", + "open_weights": false, + "knowledge": "2026-03", + "release_date": "2026-07-21", + "last_updated": "2026-07-21", "type": "chat" }, { - "id": "deepseek/deepseek-v4-pro-0813", - "name": "DeepSeek V4 Pro 0813", - "display_name": "DeepSeek V4 Pro 0813", + "id": "google/gemini-embedding-2", + "name": "Gemini Embedding 2", + "display_name": "Gemini Embedding 2", "modalities": { "input": [ "text" @@ -76621,46 +75090,37 @@ ] }, "limit": { - "context": 1048576, - "output": 393216 + "context": 8192, + "output": 8192 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "low", - "high", - "max" - ] - } + "supported": false }, "attachment": false, - "open_weights": true, - "release_date": "2026-08-13", - "last_updated": "2026-08-22", - "type": "chat" + "open_weights": false, + "knowledge": "2025-11", + "release_date": "2026-04-22", + "last_updated": "2026-04-22", + "type": "embedding" }, { - "id": "deepseek/deepseek-v4-flash-0731", - "name": "DeepSeek V4 Flash 0731 (legacy alias)", - "display_name": "DeepSeek V4 Flash 0731 (legacy alias)", + "id": "google/gemini-2.5-computer-use-preview-10-2025", + "name": "Gemini 2.5 Computer Use Preview (10-2025)", + "display_name": "Gemini 2.5 Computer Use Preview (10-2025)", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 393216 + "context": 128000, + "output": 64000 }, "temperature": true, "tool_call": true, @@ -76668,86 +75128,66 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "low", - "high", - "max" - ] - } - }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-09-10", - "last_updated": "2026-09-10", + "attachment": true, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2025-10-07", + "last_updated": "2025-10-07", "type": "chat" }, { - "id": "deepseek/deepseek-v4.1-flash", - "name": "DeepSeek V4.1 Flash", - "display_name": "DeepSeek V4.1 Flash", + "id": "google/gemini-3.1-flash-image", + "name": "Gemini 3.1 Flash Image", + "display_name": "Gemini 3.1 Flash Image", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ - "text" + "text", + "image" ] }, "limit": { - "context": 1048576, - "output": 393216 + "context": 32768, + "output": 32768 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "effort_options": [ - "low", - "high", - "max" - ] + "supported": true } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-09-10", - "last_updated": "2026-09-10", - "type": "chat" - } - ] - }, - "tencent-coding-plan": { - "id": "tencent-coding-plan", - "name": "Tencent Coding Plan (China)", - "display_name": "Tencent Coding Plan (China)", - "api": "https://api.lkeap.cloud.tencent.com/coding/v3", - "doc": "https://cloud.tencent.com/document/product/1772/128947", - "models": [ + "attachment": true, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2026-05-28", + "last_updated": "2026-05-28" + }, { - "id": "glm-5", - "name": "GLM-5", - "display_name": "GLM-5", + "id": "google/gemini-2.5-flash", + "name": "Gemini 2.5 Flash", + "display_name": "Gemini 2.5 Flash", "modalities": { "input": [ - "text" + "text", + "image", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 202752, - "output": 16384 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -76758,38 +75198,50 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": true, + "mode": "budget", + "budget": { + "default": -1, + "min": 0, + "max": 24576, + "auto": -1, + "off": 0, + "unit": "tokens" + }, "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" + "thought_signatures" ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-02-12", - "last_updated": "2026-02-12", + "attachment": true, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2025-06-17", + "last_updated": "2025-06-17", "type": "chat" }, { - "id": "minimax-m2.5", - "name": "MiniMax-M2.5", - "display_name": "MiniMax-M2.5", + "id": "google/gemini-3-pro-image", + "name": "Gemini 3 Pro Image", + "display_name": "Gemini 3 Pro Image", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ - "text" + "text", + "image" ] }, "limit": { - "context": 204800, - "output": 32768 + "context": 65536, + "output": 65536 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true @@ -76797,24 +75249,30 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "low", + "high" + ], "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" + "thought_signatures" ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-02-12", - "last_updated": "2026-02-12", - "type": "chat" + "attachment": true, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2026-05-28", + "last_updated": "2026-05-28" }, { - "id": "hunyuan-2.0-instruct", - "name": "Tencent HY 2.0 Instruct", - "display_name": "Tencent HY 2.0 Instruct", + "id": "google/gemma-4-26b-a4b-it", + "name": "Gemma 4 26B A4B", + "display_name": "Gemma 4 26B A4B", "modalities": { "input": [ "text" @@ -76824,24 +75282,30 @@ ] }, "limit": { - "context": 131072, - "output": 16384 + "context": 262144, + "output": 65536 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": false, - "open_weights": false, - "release_date": "2026-03-08", - "last_updated": "2026-03-08", + "open_weights": true, + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "hunyuan-2.0-thinking", - "name": "Tencent HY 2.0 Think", - "display_name": "Tencent HY 2.0 Think", + "id": "google/gemma-4-31b-it", + "name": "Gemma 4 31B It", + "display_name": "Gemma 4 31B It", "modalities": { "input": [ "text" @@ -76851,142 +75315,108 @@ ] }, "limit": { - "context": 131072, - "output": 16384 + "context": 262144, + "output": 65536 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, "attachment": false, - "open_weights": false, - "release_date": "2026-03-08", - "last_updated": "2026-03-08", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "tc-code-latest", - "name": "Auto", - "display_name": "Auto", + "id": "google/gemini-2.5-flash-image", + "name": "Gemini 2.5 Flash Image", + "display_name": "Gemini 2.5 Flash Image", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ - "text" + "text", + "image" ] }, "limit": { - "context": 131072, - "output": 16384 + "context": 32768, + "output": 32768 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-03-08", - "last_updated": "2026-03-08", - "type": "chat" + "knowledge": "2024-06", + "release_date": "2025-08-26", + "last_updated": "2025-08-26" }, { - "id": "hunyuan-t1", - "name": "Hunyuan-T1", - "display_name": "Hunyuan-T1", + "id": "google/gemini-4-argon", + "name": "Gemini 4 Argon", + "display_name": "Gemini 4 Argon", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 16384 + "context": 1048576, + "output": 65536 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, - "attachment": false, - "open_weights": false, - "release_date": "2026-03-08", - "last_updated": "2026-03-08", - "type": "chat" - }, - { - "id": "hunyuan-turbos", - "name": "Hunyuan-TurboS", - "display_name": "Hunyuan-TurboS", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 131072, - "output": 16384 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-03-08", - "last_updated": "2026-03-08", + "knowledge": "2026-03", + "release_date": "2026-10-13", + "last_updated": "2026-10-13", "type": "chat" }, { - "id": "kimi-k2.5", - "name": "Kimi-K2.5", - "display_name": "Kimi-K2.5", + "id": "google/gemini-3.7-flash", + "name": "Gemini 3.7 Flash", + "display_name": "Gemini 3.7 Flash", "modalities": { "input": [ "text", "image", - "video" + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -76997,38 +75427,38 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", + "low", + "medium", + "high" + ], "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" + "thought_signatures" ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-01-27", - "last_updated": "2026-01-27", + "open_weights": false, + "knowledge": "2026-03", + "release_date": "2026-08-13", + "last_updated": "2026-08-13", "type": "chat" - } - ] - }, - "freemodel": { - "id": "freemodel", - "name": "FreeModel", - "display_name": "FreeModel", - "api": "https://cc.freemodel.dev/v1", - "doc": "https://freemodel.dev", - "models": [ + }, { - "id": "claude-haiku-4-5-20251001", - "name": "Claude Haiku 4.5", - "display_name": "Claude Haiku 4.5", + "id": "google/gemini-2.5-flash-lite", + "name": "Gemini 2.5 Flash-Lite", + "display_name": "Gemini 2.5 Flash-Lite", "modalities": { "input": [ "text", "image", + "audio", "pdf" ], "output": [ @@ -77036,8 +75466,8 @@ ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 1000000, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -77051,88 +75481,87 @@ "default_enabled": false, "mode": "budget", "budget": { - "min": 1024, + "default": -1, + "min": 512, + "max": 24576, + "auto": -1, "unit": "tokens" }, - "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + "thought_signatures" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-02-28", - "release_date": "2025-10-15", - "last_updated": "2025-10-15", + "knowledge": "2025-01", + "release_date": "2025-06-17", + "last_updated": "2025-06-17", "type": "chat" }, { - "id": "gpt-5.4-mini", - "name": "GPT-5.4 mini", - "display_name": "GPT-5.4 mini", + "id": "google/gemini-3.5-flash", + "name": "Gemini 3.5 Flash", + "display_name": "Gemini 3.5 Flash", "modalities": { "input": [ "text", - "image" + "image", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", "low", "medium", "high" ], - "visibility": "hidden" + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-17", - "last_updated": "2026-03-17", + "knowledge": "2025-01", + "release_date": "2026-05-19", + "last_updated": "2026-05-19", "type": "chat" }, { - "id": "claude-opus-4-7", - "name": "Claude Opus 4.7", - "display_name": "Claude Opus 4.7", + "id": "google/gemini-3.8-flash", + "name": "Gemini 3.8 Flash", + "display_name": "Gemini 3.8 Flash", "modalities": { "input": [ "text", "image", + "video", + "audio", "pdf" ], "output": [ @@ -77140,108 +75569,78 @@ ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 1048576, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "high", - "effort_options": [ + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", "low", "medium", - "high", - "xhigh", - "max" + "high" ], - "interleaved": true, "summaries": true, - "visibility": "omitted", + "visibility": "summary", "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." + "thought_signatures" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-04-16", - "last_updated": "2026-04-16", + "release_date": "2026-09-02", + "last_updated": "2026-09-02", "type": "chat" }, { - "id": "gpt-5.3-codex", - "name": "GPT-5.3 Codex", - "display_name": "GPT-5.3 Codex", + "id": "google/gemma-3-27b-it", + "name": "Gemma 3 27B IT", + "display_name": "Gemma 3 27B IT", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 131072, + "output": 32768 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-05", - "last_updated": "2026-02-05", + "attachment": false, + "open_weights": true, + "knowledge": "2024-08", + "release_date": "2025-03-12", + "last_updated": "2025-03-12", "type": "chat" }, { - "id": "gpt-5.4", - "name": "GPT-5.4", - "display_name": "GPT-5.4", + "id": "google/gemini-3.6-flash", + "name": "Gemini 3.6 Flash", + "display_name": "Gemini 3.6 Flash", "modalities": { "input": [ "text", "image", + "video", + "audio", "pdf" ], "output": [ @@ -77249,53 +75648,48 @@ ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", "low", "medium", "high" ], - "visibility": "hidden" + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-05", - "last_updated": "2026-03-05", + "knowledge": "2026-03", + "release_date": "2026-07-21", + "last_updated": "2026-07-21", "type": "chat" }, { - "id": "claude-sonnet-4-6", - "name": "Claude Sonnet 4.6", - "display_name": "Claude Sonnet 4.6", + "id": "qwen/qwen3.6-plus", + "name": "Qwen3.6 Plus", + "display_name": "Qwen3.6 Plus", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" @@ -77303,236 +75697,156 @@ }, "limit": { "context": 1000000, - "output": 64000 + "output": 250000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "max" - ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-17", - "last_updated": "2026-03-13", + "knowledge": "2025-04", + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "gpt-5.5", - "name": "GPT-5.5", - "display_name": "GPT-5.5", + "id": "qwen/qwen3-coder-next", + "name": "Qwen3 Coder Next", + "display_name": "Qwen3 Coder Next", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 262144, + "output": 65536 }, - "temperature": false, - "tool_call": true, + "temperature": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-12-01", - "release_date": "2026-04-23", - "last_updated": "2026-04-23", + "attachment": false, + "open_weights": true, + "knowledge": "2025-09", + "release_date": "2026-02-03", + "last_updated": "2026-02-03", "type": "chat" }, { - "id": "claude-opus-4-6", - "name": "Claude Opus 4.6", - "display_name": "Claude Opus 4.6", + "id": "qwen/qwen3-max", + "name": "Qwen3 Max", + "display_name": "Qwen3 Max", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 262144, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": false + "supported": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "max" - ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-05-31", - "release_date": "2026-02-05", - "last_updated": "2026-03-13", + "knowledge": "2025-04", + "release_date": "2025-09-23", + "last_updated": "2025-09-23", "type": "chat" }, { - "id": "claude-opus-4-8", - "name": "Claude Opus 4.8", - "display_name": "Claude Opus 4.8", + "id": "qwen/qwen3.5-35b-a3b", + "name": "Qwen3.5 35B A3B", + "display_name": "Qwen3.5 35B A3B", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 131072, + "output": 32768 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], "interleaved": true, "summaries": true, - "visibility": "omitted", + "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-01", - "release_date": "2026-05-28", - "last_updated": "2026-05-28", + "attachment": false, + "open_weights": true, + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" }, { - "id": "claude-fable-5", - "name": "Claude Fable 5", - "display_name": "Claude Fable 5", + "id": "qwen/qwen3.6-27b", + "name": "Qwen3.6 27B", + "display_name": "Qwen3.6 27B", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 256000, + "output": 64000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -77541,49 +75855,24 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], "interleaved": true, "summaries": true, - "visibility": "omitted", + "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", - "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", - "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-09", - "last_updated": "2026-06-09", + "open_weights": true, + "release_date": "2026-04-22", + "last_updated": "2026-04-22", "type": "chat" - } - ] - }, - "melious": { - "id": "melious", - "name": "Melious", - "display_name": "Melious", - "api": "https://api.melious.ai/v1", - "doc": "https://melious.ai/docs/reference/models", - "models": [ + }, { - "id": "glm-5.1", - "name": "GLM-5.1", - "display_name": "GLM-5.1", + "id": "qwen/qwen3.8-2.4t-a95b", + "name": "Qwen3.8 2.4T A95B", + "display_name": "Qwen3.8 2.4T A95B", "modalities": { "input": [ "text" @@ -77593,79 +75882,58 @@ ] }, "limit": { - "context": 203000, - "output": 131072 + "context": 262144, + "output": 1010000 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "none", - "high" - ] + "supported": true } }, "attachment": false, "open_weights": true, - "release_date": "2026-04-07", - "last_updated": "2026-04-07", + "release_date": "2026-08-12", + "last_updated": "2026-08-12", "type": "chat" }, { - "id": "glm-5", - "name": "GLM-5", - "display_name": "GLM-5", + "id": "qwen/qwen3-vl-30b-a3b-instruct", + "name": "Qwen3-VL 30B-A3B Instruct", + "display_name": "Qwen3-VL 30B-A3B Instruct", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 203000, - "output": 131072 + "context": 131072, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-02-12", - "last_updated": "2026-02-12", + "release_date": "2025-10-04", + "last_updated": "2025-10-04", "type": "chat" }, { - "id": "deepseek-r1-0528", - "name": "DeepSeek-R1", - "display_name": "DeepSeek-R1", + "id": "qwen/qwen3-235b-a22b", + "name": "Qwen3 235B A22B", + "display_name": "Qwen3 235B A22B", "modalities": { "input": [ "text" @@ -77675,7 +75943,7 @@ ] }, "limit": { - "context": 164000, + "context": 131072, "output": 32768 }, "temperature": true, @@ -77697,30 +75965,28 @@ }, "attachment": false, "open_weights": true, - "knowledge": "2024-07", - "release_date": "2025-01-20", - "last_updated": "2025-05-29", + "knowledge": "2025-04", + "release_date": "2025-04-28", + "last_updated": "2025-04-28", "type": "chat" }, { - "id": "kimi-k2.7-code", - "name": "Kimi K2.7 Code", - "display_name": "Kimi K2.7 Code", + "id": "qwen/qwen3.7-max", + "name": "Qwen3.7 Max", + "display_name": "Qwen3.7 Max", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1000000, + "output": 250000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -77728,30 +75994,19 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "none", - "high" - ] + "supported": true } }, - "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-06-12", - "last_updated": "2026-06-12", + "attachment": false, + "open_weights": false, + "release_date": "2026-05-21", + "last_updated": "2026-05-21", "type": "chat" }, { - "id": "glm-5.3", - "name": "GLM-5.3", - "display_name": "GLM-5.3", + "id": "qwen/qwen3-max-preview", + "name": "Qwen3 Max Preview", + "display_name": "Qwen3 Max Preview", "modalities": { "input": [ "text" @@ -77761,14 +76016,13 @@ ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 256000, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": true }, "extra_capabilities": { "reasoning": { @@ -77778,23 +76032,20 @@ "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "effort_options": [ - "none", - "high" ] } }, "attachment": false, - "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "open_weights": false, + "knowledge": "2025-04", + "release_date": "2025-09-05", + "last_updated": "2025-09-23", "type": "chat" }, { - "id": "deepseek-v4-flash-0731", - "name": "DeepSeek V4 Flash 0731", - "display_name": "DeepSeek V4 Flash 0731", + "id": "qwen/qwen3.5-plus", + "name": "Qwen3.5 Plus", + "display_name": "Qwen3.5 Plus", "modalities": { "input": [ "text" @@ -77805,7 +76056,7 @@ }, "limit": { "context": 1000000, - "output": 384000 + "output": 250000 }, "temperature": true, "tool_call": true, @@ -77821,37 +76072,32 @@ "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "effort_options": [ - "none", - "high" ] } }, "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-07-31", - "last_updated": "2026-07-31", + "open_weights": false, + "knowledge": "2025-04", + "release_date": "2026-02-16", + "last_updated": "2026-02-16", "type": "chat" }, { - "id": "kimi-k2.6", - "name": "Kimi K2.6", - "display_name": "Kimi K2.6", + "id": "qwen/qwen3.5-9b", + "name": "Qwen3.5 9B", + "display_name": "Qwen3.5 9B", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 256000 + "context": 262144, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -77867,29 +76113,22 @@ "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "effort_options": [ - "none", - "high" ] } }, "attachment": true, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-20", - "last_updated": "2026-04-20", + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" }, { - "id": "kimi-k3", - "name": "Kimi K3", - "display_name": "Kimi K3", + "id": "qwen/qwen-plus", + "name": "Qwen Plus", + "display_name": "Qwen Plus", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" @@ -77897,9 +76136,9 @@ }, "limit": { "context": 1000000, - "output": 131072 + "output": 250000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -77913,37 +76152,33 @@ "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "effort_options": [ - "none", - "high" ] } }, - "attachment": true, - "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-16", + "attachment": false, + "open_weights": false, + "knowledge": "2024-04", + "release_date": "2024-01-25", + "last_updated": "2025-09-11", "type": "chat" }, { - "id": "kimi-k2.5", - "name": "Kimi K2.5", - "display_name": "Kimi K2.5", + "id": "qwen/qwen-flash", + "name": "Qwen Flash", + "display_name": "Qwen Flash", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262000, - "output": 262000 + "context": 1000000, + "output": 250000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -77960,17 +76195,17 @@ ] } }, - "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-01-27", - "last_updated": "2026-01-27", + "attachment": false, + "open_weights": false, + "knowledge": "2024-04", + "release_date": "2025-07-28", + "last_updated": "2025-07-28", "type": "chat" }, { - "id": "deepseek-v4.1-flash-1017", - "name": "DeepSeek V4.1 Flash 1017", - "display_name": "DeepSeek V4.1 Flash 1017", + "id": "qwen/qwen3.8-max", + "name": "Qwen3.8 Max", + "display_name": "Qwen3.8 Max", "modalities": { "input": [ "text", @@ -77982,7 +76217,7 @@ }, "limit": { "context": 1000000, - "output": 384000 + "output": 131072 }, "temperature": true, "tool_call": true, @@ -77992,80 +76227,50 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "none", - "high" - ] + "supported": true } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-10-17", - "last_updated": "2026-10-17", + "open_weights": false, + "release_date": "2026-08-03", + "last_updated": "2026-08-03", "type": "chat" }, { - "id": "deepseek-v4.1-flash", - "name": "DeepSeek V4.1 Flash", - "display_name": "DeepSeek V4.1 Flash", + "id": "qwen/qwen3-next-80b-a3b-instruct", + "name": "Qwen3-Next 80B-A3B Instruct", + "display_name": "Qwen3-Next 80B-A3B Instruct", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 131072, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "none", - "high" - ] - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-09-10", - "last_updated": "2026-09-10", + "knowledge": "2025-04", + "release_date": "2025-09", + "last_updated": "2025-09", "type": "chat" }, { - "id": "glm-5.3-flash", - "name": "GLM-5.3-Flash", - "display_name": "GLM-5.3-Flash", + "id": "qwen/qwen3.6-flash", + "name": "Qwen3.6 Flash", + "display_name": "Qwen3.6 Flash", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" @@ -78073,7 +76278,7 @@ }, "limit": { "context": 1000000, - "output": 131072 + "output": 250000 }, "temperature": true, "tool_call": true, @@ -78089,23 +76294,19 @@ "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "effort_options": [ - "none", - "high" ] } }, - "attachment": true, - "open_weights": true, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", + "attachment": false, + "open_weights": false, + "release_date": "2026-04-27", + "last_updated": "2026-04-27", "type": "chat" }, { - "id": "deepseek-v3.2", - "name": "DeepSeek V3.2", - "display_name": "DeepSeek V3.2", + "id": "qwen/qwen3-coder-plus", + "name": "Qwen3 Coder Plus", + "display_name": "Qwen3 Coder Plus", "modalities": { "input": [ "text" @@ -78115,50 +76316,25 @@ ] }, "limit": { - "context": 164000, - "output": 64000 + "context": 1000000, + "output": 250000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "none", - "high" - ] - } + "supported": false }, "attachment": false, - "open_weights": true, - "knowledge": "2024-07", - "release_date": "2025-12-01", - "last_updated": "2025-12-01", + "open_weights": false, + "knowledge": "2025-04", + "release_date": "2025-07-23", + "last_updated": "2025-07-23", "type": "chat" - } - ] - }, - "ebcloud": { - "id": "ebcloud", - "name": "EBCloud", - "display_name": "EBCloud", - "api": "https://maas-api.ebcloud.com/v1", - "doc": "https://docs.ebtech.com/ai/model-api.html", - "models": [ + }, { - "id": "Kimi-K2.6", - "name": "Kimi K2.6", - "display_name": "Kimi K2.6", + "id": "qwen/qwen3.6-35b-a3b", + "name": "Qwen3.6 35B A3B", + "display_name": "Qwen3.6 35B A3B", "modalities": { "input": [ "text" @@ -78169,7 +76345,7 @@ }, "limit": { "context": 262144, - "output": 262144 + "output": 65536 }, "temperature": true, "tool_call": true, @@ -78190,15 +76366,14 @@ }, "attachment": false, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-20", - "last_updated": "2026-04-20", + "release_date": "2026-04-17", + "last_updated": "2026-04-17", "type": "chat" }, { - "id": "DeepSeek-V4-Flash", - "name": "DeepSeek V4 Flash", - "display_name": "DeepSeek V4 Flash", + "id": "qwen/qwen3-next-80b-a3b-thinking", + "name": "Qwen3-Next 80B-A3B (Thinking)", + "display_name": "Qwen3-Next 80B-A3B (Thinking)", "modalities": { "input": [ "text" @@ -78208,11 +76383,11 @@ ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 131072, + "output": 32768 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true @@ -78220,36 +76395,25 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "high", - "max" - ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, "attachment": false, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "knowledge": "2025-04", + "release_date": "2025-09", + "last_updated": "2025-09", "type": "chat" }, { - "id": "DeepSeek-V4-Pro", - "name": "DeepSeek V4 Pro", - "display_name": "DeepSeek V4 Pro", + "id": "qwen/qwen3-coder-flash", + "name": "Qwen3 Coder Flash", + "display_name": "Qwen3 Coder Flash", "modalities": { "input": [ "text" @@ -78260,47 +76424,24 @@ }, "limit": { "context": 1000000, - "output": 384000 + "output": 250000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." - ] - } + "supported": false }, "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "open_weights": false, + "knowledge": "2025-04", + "release_date": "2025-07-28", + "last_updated": "2025-07-28", "type": "chat" }, { - "id": "GLM-5.1", - "name": "GLM-5.1", - "display_name": "GLM-5.1", + "id": "qwen/qwen3-32b", + "name": "Qwen3 32B", + "display_name": "Qwen3 32B", "modalities": { "input": [ "text" @@ -78310,8 +76451,8 @@ ] }, "limit": { - "context": 200000, - "output": 131072 + "context": 131072, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -78332,63 +76473,43 @@ }, "attachment": false, "open_weights": true, - "release_date": "2026-04-07", - "last_updated": "2026-04-07", + "knowledge": "2025-04", + "release_date": "2025-04-28", + "last_updated": "2025-04-28", "type": "chat" - } - ] - }, - "liquid": { - "id": "liquid", - "name": "Liquid Inference", - "display_name": "Liquid Inference", - "api": "https://router.inference.ai.exchange/v1", - "doc": "https://inference.ai.exchange/docs", - "models": [ + }, { - "id": "liquid.auto", - "name": "Liquid Auto", - "display_name": "Liquid Auto", + "id": "qwen/qwen3-coder-480b-a35b-instruct", + "name": "Qwen3 Coder 480B A35B Instruct", + "display_name": "Qwen3 Coder 480B A35B Instruct", "modalities": { "input": [ - "text", - "image", - "audio", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 10000000, - "output": 1048576 + "context": 131072, + "output": 32768 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": true, - "open_weights": false, - "release_date": "2026-10-20", - "last_updated": "2026-10-20", + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-07-22", + "last_updated": "2025-07-22", "type": "chat" - } - ] - }, - "munito": { - "id": "munito", - "name": "Munito AI", - "display_name": "Munito AI", - "api": "https://api.munito.ai/inference/v1", - "doc": "https://docs.munito.ai/models", - "models": [ + }, { - "id": "aleph-alpha/kolibri-1", - "name": "Kolibri 1", - "display_name": "Kolibri 1", + "id": "qwen/qwen3.5-flash", + "name": "Qwen3.5 Flash", + "display_name": "Qwen3.5 Flash", "modalities": { "input": [ "text" @@ -78398,8 +76519,8 @@ ] }, "limit": { - "context": 1048576, - "output": 943718 + "context": 1000000, + "output": 250000 }, "temperature": true, "tool_call": true, @@ -78415,39 +76536,31 @@ "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "effort_options": [ - "none", - "low", - "medium", - "high" ] } }, "attachment": false, - "open_weights": true, - "knowledge": "2026-06-18", - "release_date": "2026-10-03", - "last_updated": "2026-10-03", + "open_weights": false, + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" }, { - "id": "zai-org/glm-5.3-flash", - "name": "GLM-5.3-Flash", - "display_name": "GLM-5.3-Flash", + "id": "qwen/qwen3-vl-235b-a22b-thinking", + "name": "Qwen3-VL 235B A22B Thinking", + "display_name": "Qwen3-VL 235B A22B Thinking", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 943718 + "context": 131072, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -78463,87 +76576,70 @@ "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "effort_options": [ - "low", - "high", - "max" ] } }, "attachment": true, "open_weights": true, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", + "knowledge": "2025-03-31", + "release_date": "2025-09-23", + "last_updated": "2025-09-23", "type": "chat" }, { - "id": "deepseek-ai/deepseek-v4-flash", - "name": "DeepSeek V4 Flash 0731", - "display_name": "DeepSeek V4 Flash 0731", + "id": "qwen/qwen3-vl-flash", + "name": "Qwen3-VL Flash", + "display_name": "Qwen3-VL Flash", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 943718 + "context": 262144, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "high", - "max" - ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-07-31", - "last_updated": "2026-07-31", + "attachment": true, + "open_weights": false, + "release_date": "2025-10-15", + "last_updated": "2025-10-15", "type": "chat" }, { - "id": "deepseek-ai/deepseek-v4.1-flash-1017", - "name": "DeepSeek V4.1 Flash 1017", - "display_name": "DeepSeek V4.1 Flash 1017", + "id": "qwen/qwen3.5-397b-a17b", + "name": "Qwen3.5 397B A17B", + "display_name": "Qwen3.5 397B A17B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 943718 + "context": 131072, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -78559,39 +76655,30 @@ "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "effort_options": [ - "none", - "low", - "high", - "max" ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-10-17", - "last_updated": "2026-10-17", + "release_date": "2026-02-15", + "last_updated": "2026-02-15", "type": "chat" }, { - "id": "qwen/qwen3.8-27b", - "name": "Qwen3.8 27B", - "display_name": "Qwen3.8 27B", + "id": "qwen/qwen3.5-27b", + "name": "Qwen3.5 27B", + "display_name": "Qwen3.5 27B", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 235929 + "context": 131072, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -78607,45 +76694,31 @@ "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "effort_options": [ - "none", - "low", - "medium", - "xhigh" ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" - } - ] - }, - "reflection": { - "id": "reflection", - "name": "Reflection", - "display_name": "Reflection", - "api": "https://api.reflection.ai/openai/v1", - "doc": "https://developers.reflection.ai/models", - "models": [ + }, { - "id": "Beam-1.0-501B-A23B", - "name": "Beam 1.0 501B A23B", - "display_name": "Beam 1.0 501B A23B", + "id": "qwen/qwen3.5-4b", + "name": "Qwen3.5 4B", + "display_name": "Qwen3.5 4B", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 262144, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -78661,36 +76734,19 @@ "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2026-06-30", - "release_date": "2026-10-05", - "last_updated": "2026-10-16", + "release_date": "2026-03-02", + "last_updated": "2026-03-02", "type": "chat" - } - ] - }, - "sambanova": { - "id": "sambanova", - "name": "SambaNova", - "display_name": "SambaNova", - "api": "https://api.sambanova.ai/v1", - "doc": "https://docs.sambanova.ai/cloud/docs/get-started/supported-models", - "models": [ + }, { - "id": "DeepSeek-V3.1", - "name": "DeepSeek-V3.1", - "display_name": "DeepSeek-V3.1", + "id": "qwen/qwen3.5-122b-a10b", + "name": "Qwen3.5 122B A10B", + "display_name": "Qwen3.5 122B A10B", "modalities": { "input": [ "text" @@ -78701,7 +76757,7 @@ }, "limit": { "context": 131072, - "output": 7168 + "output": 32768 }, "temperature": true, "tool_call": true, @@ -78709,27 +76765,39 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, "attachment": false, "open_weights": true, - "release_date": "2025-08-21", - "last_updated": "2025-08-21", + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" }, { - "id": "DeepSeek-V3.2", - "name": "DeepSeek V3.2", - "display_name": "DeepSeek V3.2", + "id": "qwen/qwen3.7-plus", + "name": "Qwen3.7 Plus", + "display_name": "Qwen3.7 Plus", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 32768, - "output": 7168 + "context": 1000000, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -78742,30 +76810,55 @@ "supported": true } }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-04", + "release_date": "2026-06-02", + "last_updated": "2026-06-02", + "type": "chat" + }, + { + "id": "qwen/qwen3-235b-a22b-instruct-2507", + "name": "Qwen3 235B A22B Instruct 2507", + "display_name": "Qwen3 235B A22B Instruct 2507", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 131072, + "output": 32768 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, "attachment": false, "open_weights": true, - "knowledge": "2024-07", - "release_date": "2025-12-01", - "last_updated": "2025-12-01", + "release_date": "2025-07-21", + "last_updated": "2025-07-21", "type": "chat" }, { - "id": "gemma-4-31B-it", - "name": "Gemma 4 31B IT", - "display_name": "Gemma 4 31B IT", + "id": "qwen/qwen3.8-flash", + "name": "Qwen3.8 Flash", + "display_name": "Qwen3.8 Flash", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 131072 + "context": 977000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -78778,17 +76871,16 @@ "supported": true } }, - "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "attachment": false, + "open_weights": false, + "release_date": "2026-08-26", + "last_updated": "2026-08-26", "type": "chat" }, { - "id": "gpt-oss-120b", - "name": "GPT OSS 120B", - "display_name": "GPT OSS 120B", + "id": "qwen/qwen3-30b-a3b", + "name": "Qwen3 30B A3B", + "display_name": "Qwen3 30B A3B", "modalities": { "input": [ "text" @@ -78799,7 +76891,7 @@ }, "limit": { "context": 131072, - "output": 131072 + "output": 32768 }, "temperature": true, "tool_call": true, @@ -78810,24 +76902,24 @@ "extra_capabilities": { "reasoning": { "supported": true, - "effort_options": [ - "low", - "medium", - "high" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, "attachment": false, "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "release_date": "2025-04-28", + "last_updated": "2025-04-28", "type": "chat" }, { - "id": "MiniMax-M3", - "name": "MiniMax-M3", - "display_name": "MiniMax-M3", + "id": "qwen/qwen3.6-max-preview", + "name": "Qwen3.6 Max Preview", + "display_name": "Qwen3.6 Max Preview", "modalities": { "input": [ "text" @@ -78837,8 +76929,8 @@ ] }, "limit": { - "context": 1048576, - "output": 1048576 + "context": 256000, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -78848,22 +76940,30 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": false, - "open_weights": true, - "release_date": "2026-06-01", - "last_updated": "2026-06-01", + "open_weights": false, + "knowledge": "2025-04", + "release_date": "2026-04-20", + "last_updated": "2026-04-20", "type": "chat" }, { - "id": "Meta-Llama-3.3-70B-Instruct", - "name": "Llama-3.3-70B-Instruct", - "display_name": "Llama-3.3-70B-Instruct", + "id": "qwen/qwen3-vl-235b-a22b-instruct", + "name": "Qwen3-VL 235B A22B Instruct", + "display_name": "Qwen3-VL 235B A22B Instruct", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" @@ -78871,33 +76971,24 @@ }, "limit": { "context": 131072, - "output": 3072 + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2023-12", - "release_date": "2024-12-06", - "last_updated": "2024-12-06", + "knowledge": "2025-03-31", + "release_date": "2025-09-23", + "last_updated": "2025-09-23", "type": "chat" - } - ] - }, - "friendli": { - "id": "friendli", - "name": "Friendli", - "display_name": "Friendli", - "api": "https://api.friendli.ai/serverless/v1", - "doc": "https://friendli.ai/docs/guides/serverless_endpoints/introduction", - "models": [ + }, { - "id": "google/gemma-4-31B-it", - "name": "Gemma 4 31B IT", - "display_name": "Gemma 4 31B IT", + "id": "qwen/qwen3-vl-plus", + "name": "Qwen3-VL Plus", + "display_name": "Qwen3-VL Plus", "modalities": { "input": [ "text", @@ -78909,7 +77000,7 @@ }, "limit": { "context": 262144, - "output": 32768 + "output": 65536 }, "temperature": true, "tool_call": true, @@ -78929,29 +77020,39 @@ } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "open_weights": false, + "knowledge": "2025-04", + "release_date": "2025-09-23", + "last_updated": "2025-09-23", "type": "chat" - }, + } + ] + }, + "boundless": { + "id": "boundless", + "name": "Boundless", + "display_name": "Boundless", + "api": "https://api.inference.boundless.network/v1", + "doc": "https://inference.boundless.network/models", + "models": [ { - "id": "zai-org/GLM-5.1", - "name": "GLM-5.1", - "display_name": "GLM-5.1", + "id": "claude-opus-5.5", + "name": "Claude Opus 5.5", + "display_name": "Claude Opus 5.5", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 202752, - "output": 131072 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -78959,25 +77060,24 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "low", + "medium", + "high" ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-04-07", - "last_updated": "2026-04-07", + "attachment": true, + "open_weights": false, + "knowledge": "2026-06", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "zai-org/GLM-5.3", - "name": "GLM-5.3", - "display_name": "GLM-5.3", + "id": "glm-5.2", + "name": "GLM-5.2", + "display_name": "GLM-5.2", "modalities": { "input": [ "text" @@ -78999,29 +77099,22 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ - "low", - "high", - "max" + "none", + "high" ] } }, "attachment": false, "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "zai-org/GLM-5.2", - "name": "GLM-5.2", - "display_name": "GLM-5.2", + "id": "gpt-5.6-sol", + "name": "GPT-5.6 Sol", + "display_name": "GPT-5.6 Sol", "modalities": { "input": [ "text" @@ -79031,10 +77124,10 @@ ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 262144, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -79043,33 +77136,41 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ + "none", + "low", + "medium", "high", + "xhigh", "max" - ] + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": false, - "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "open_weights": false, + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "zai-org/GLM-5.3-Flash", - "name": "GLM-5.3-Flash", - "display_name": "GLM-5.3-Flash", + "id": "deepseek-v4.1-flash", + "name": "DeepSeek V4.1 Flash", + "display_name": "DeepSeek V4.1 Flash", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" @@ -79077,7 +77178,7 @@ }, "limit": { "context": 1048576, - "output": 131072 + "output": 384000 }, "temperature": true, "tool_call": true, @@ -79088,38 +77189,24 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ + "none", "low", - "high", - "max" + "high" ] } }, "attachment": true, "open_weights": true, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", + "knowledge": "2025-05", + "release_date": "2026-09-10", + "last_updated": "2026-09-10", "type": "chat" - } - ] - }, - "scaleway": { - "id": "scaleway", - "name": "Scaleway", - "display_name": "Scaleway", - "api": "https://api.scaleway.ai/v1", - "doc": "https://www.scaleway.com/en/docs/generative-apis/", - "models": [ + }, { - "id": "llama-3.3-70b-instruct", - "name": "Llama-3.3-70B-Instruct", - "display_name": "Llama-3.3-70B-Instruct", + "id": "gpt-5.6-luna", + "name": "GPT-5.6 Luna", + "display_name": "GPT-5.6 Luna", "modalities": { "input": [ "text" @@ -79129,57 +77216,52 @@ ] }, "limit": { - "context": 100000, - "output": 16384 + "context": 262144, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } }, "attachment": false, - "open_weights": true, - "knowledge": "2023-12", - "release_date": "2024-12-06", - "last_updated": "2024-12-06", + "open_weights": false, + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "whisper-large-v3", - "name": "Whisper Large v3", - "display_name": "Whisper Large v3", + "id": "nemotron3-super", + "name": "Nemotron 3 Super 120B A12B", + "display_name": "Nemotron 3 Super 120B A12B", "modalities": { "input": [ - "audio" - ], - "output": [ "text" - ] - }, - "limit": { - "context": 8192, - "output": 8192 - }, - "temperature": false, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": true, - "knowledge": "2023-09", - "release_date": "2023-09-01", - "last_updated": "2026-03-17" - }, - { - "id": "qwen3.8-27b", - "name": "Qwen3.8 27B", - "display_name": "Qwen3.8 27B", - "modalities": { - "input": [ - "text", - "image", - "video" ], "output": [ "text" @@ -79187,7 +77269,7 @@ }, "limit": { "context": 262144, - "output": 32768 + "output": 262144 }, "temperature": true, "tool_call": true, @@ -79200,54 +77282,63 @@ "effort_options": [ "none", "low", - "medium", - "xhigh" + "medium" ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "knowledge": "2025-06", + "release_date": "2026-03-11", + "last_updated": "2026-03-11", "type": "chat" }, { - "id": "mistral-small-3.2-24b-instruct-2506", - "name": "Mistral Small 3.2 24B Instruct (2506)", - "display_name": "Mistral Small 3.2 24B Instruct (2506)", + "id": "glm-5.3", + "name": "GLM-5.3", + "display_name": "GLM-5.3", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 32768 + "context": 1048576, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "low", + "high" + ] + } + }, + "attachment": false, "open_weights": true, - "knowledge": "2025-03", - "release_date": "2025-06-20", - "last_updated": "2025-06-20", + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "qwen3.5-397b-a17b", - "name": "Qwen3.5 397B A17B", - "display_name": "Qwen3.5 397B A17B", + "id": "mimo-v2.6-pro", + "name": "MiMo-V2.6-Pro", + "display_name": "MiMo-V2.6-Pro", "modalities": { "input": [ "text", "image", + "audio", "video" ], "output": [ @@ -79255,8 +77346,8 @@ ] }, "limit": { - "context": 256000, - "output": 16384 + "context": 1048576, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -79264,34 +77355,16 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "none", - "low", - "medium", - "high" - ] - } - }, "attachment": true, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2026-02-15", - "last_updated": "2026-02-15", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "qwen3.6-35b-a3b", - "name": "Qwen3.6 35B A3B", - "display_name": "Qwen3.6 35B A3B", + "id": "gpt-6-luna", + "name": "GPT-6 Luna", + "display_name": "GPT-6 Luna", "modalities": { "input": [ "text", @@ -79302,10 +77375,10 @@ ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -79313,13 +77386,6 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ "none", "low", @@ -79329,16 +77395,16 @@ } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2026-04-17", - "last_updated": "2026-04-17", + "open_weights": false, + "knowledge": "2026-05-18", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "lightonocr-3-0.8b", - "name": "LightOnOCR-3 0.8B", - "display_name": "LightOnOCR-3 0.8B", + "id": "qwen3.6", + "name": "Qwen3.6 35B-A3B", + "display_name": "Qwen3.6 35B-A3B", "modalities": { "input": [ "text", @@ -79350,23 +77416,24 @@ }, "limit": { "context": 262144, - "output": 16384 + "output": 65536 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": true, "open_weights": true, - "release_date": "2026-10-08", - "last_updated": "2026-10-14", + "release_date": "2026-04-17", + "last_updated": "2026-04-17", "type": "chat" }, { - "id": "glm-5.3", - "name": "GLM-5.3", - "display_name": "GLM-5.3", + "id": "claude-opus-5", + "name": "Claude Opus 5", + "display_name": "Claude Opus 5", "modalities": { "input": [ "text" @@ -79376,10 +77443,10 @@ ] }, "limit": { - "context": 256000, - "output": 16384 + "context": 262144, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -79389,35 +77456,38 @@ "reasoning": { "supported": true, "effort_options": [ + "none", "low", - "high", - "max" + "medium", + "high" ] } }, "attachment": false, - "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "open_weights": false, + "knowledge": "2026-05", + "release_date": "2026-07-24", + "last_updated": "2026-07-24", "type": "chat" }, { - "id": "deepseek-v4-flash-0731", - "name": "DeepSeek V4 Flash 0731", - "display_name": "DeepSeek V4 Flash 0731", + "id": "gpt-6-sol", + "name": "GPT-6 Sol", + "display_name": "GPT-6 Sol", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 32768 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -79425,65 +77495,74 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, "effort_options": [ "none", "low", - "high", - "max" + "medium", + "high" ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-07-31", - "last_updated": "2026-07-31", + "attachment": true, + "open_weights": false, + "knowledge": "2026-04-20", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "bge-multilingual-gemma2", - "name": "BGE Multilingual Gemma2", - "display_name": "BGE Multilingual Gemma2", + "id": "minimax-m3", + "name": "MiniMax-M3", + "display_name": "MiniMax-M3", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 8191, - "output": 8192 + "context": 1048576, + "output": 512000 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": true, "open_weights": true, - "release_date": "2024-07-25", - "last_updated": "2024-07-25", - "type": "embedding" + "release_date": "2026-06-01", + "last_updated": "2026-06-01", + "type": "chat" }, { - "id": "gpt-oss-120b", - "name": "GPT-OSS 120B", - "display_name": "GPT-OSS 120B", + "id": "mimo-v2.6-flash", + "name": "MiMo-V2.6-Flash", + "display_name": "MiMo-V2.6-Flash", "modalities": { "input": [ - "text" + "text", + "image", + "audio", + "video" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 32768 + "context": 1048576, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -79491,27 +77570,16 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "low", - "medium", - "high" - ] - } - }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "glm-5.2", - "name": "GLM-5.2", - "display_name": "GLM-5.2", + "id": "claude-fable-5.1", + "name": "Claude Fable 5.1", + "display_name": "Claude Fable 5.1", "modalities": { "input": [ "text" @@ -79521,10 +77589,10 @@ ] }, "limit": { - "context": 256000, - "output": 16384 + "context": 262144, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -79533,24 +77601,40 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", "effort_options": [ - "none", "low", "medium", - "high" + "high", + "xhigh", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", + "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", + "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." ] } }, "attachment": false, - "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "open_weights": false, + "knowledge": "2026-06", + "release_date": "2026-09-01", + "last_updated": "2026-09-01", "type": "chat" }, { - "id": "deepseek-v4.1-flash", - "name": "DeepSeek V4.1 Flash", - "display_name": "DeepSeek V4.1 Flash", + "id": "kimi-k3", + "name": "Kimi K3", + "display_name": "Kimi K3", "modalities": { "input": [ "text", @@ -79561,10 +77645,10 @@ ] }, "limit": { - "context": 256000, - "output": 32768 + "context": 1048576, + "output": 131072 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -79573,26 +77657,23 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, "effort_options": [ "none", "low", - "high", - "max" + "high" ] } }, "attachment": true, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-09-10", - "last_updated": "2026-09-10", + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" }, { - "id": "mistral-medium-3.5-128b", - "name": "Mistral Medium 3.5 128B", - "display_name": "Mistral Medium 3.5 128B", + "id": "qwen3.8-flash", + "name": "Qwen3.8 Flash", + "display_name": "Qwen3.8 Flash", "modalities": { "input": [ "text", @@ -79603,8 +77684,8 @@ ] }, "limit": { - "context": 256000, - "output": 16384 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -79614,22 +77695,23 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ - "none", - "high" + "low", + "medium" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-04-29", - "last_updated": "2026-04-29", + "open_weights": false, + "release_date": "2026-08-26", + "last_updated": "2026-08-26", "type": "chat" }, { - "id": "qwen3-235b-a22b-instruct-2507", - "name": "Qwen3 235B A22B Instruct 2507", - "display_name": "Qwen3 235B A22B Instruct 2507", + "id": "dsv4", + "name": "DeepSeek V4 Flash 0731", + "display_name": "DeepSeek V4 Flash 0731", "modalities": { "input": [ "text" @@ -79639,37 +77721,48 @@ ] }, "limit": { - "context": 260000, - "output": 16384 + "context": 1048576, + "output": 384000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "low", + "high" + ] + } }, "attachment": false, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-07-21", - "last_updated": "2025-07-21", + "knowledge": "2025-05", + "release_date": "2026-07-31", + "last_updated": "2026-07-31", "type": "chat" }, { - "id": "gemma-4-26b-a4b-it", - "name": "Gemma 4 26B A4B IT", - "display_name": "Gemma 4 26B A4B IT", + "id": "glm-5.3-flash", + "name": "GLM-5.3-Flash", + "display_name": "GLM-5.3-Flash", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 16384 + "context": 1048576, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -79681,24 +77774,21 @@ "reasoning": { "supported": true, "effort_options": [ - "none", "low", - "medium", "high" ] } }, "attachment": true, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "release_date": "2026-08-26", + "last_updated": "2026-08-26", "type": "chat" }, { - "id": "qwen3-embedding-8b", - "name": "Qwen3 Embedding 8B", - "display_name": "Qwen3 Embedding 8B", + "id": "deepseek-v4-pro-0813", + "name": "DeepSeek V4 Pro 0813", + "display_name": "DeepSeek V4 Pro 0813", "modalities": { "input": [ "text" @@ -79708,48 +77798,58 @@ ] }, "limit": { - "context": 32768, - "output": 8192 + "context": 1048576, + "output": 384000 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "none", + "low", + "high" + ] + } }, "attachment": false, "open_weights": true, - "release_date": "2025-06-05", - "last_updated": "2025-06-05", - "type": "embedding" + "release_date": "2026-08-13", + "last_updated": "2026-08-22", + "type": "chat" } ] }, - "empiriolabs": { - "id": "empiriolabs", - "name": "EmpirioLabs AI", - "display_name": "EmpirioLabs AI", - "api": "https://api.empiriolabs.ai/v1", - "doc": "https://docs.empiriolabs.ai", + "gitlab": { + "id": "gitlab", + "name": "GitLab Duo", + "display_name": "GitLab Duo", + "doc": "https://docs.gitlab.com/user/duo_agent_platform/", "models": [ { - "id": "muse-spark-1-3", - "name": "Muse Spark 1.3", - "display_name": "Muse Spark 1.3", + "id": "duo-chat-fable-5-1", + "name": "Agentic Chat (Claude Fable 5.1)", + "display_name": "Agentic Chat (Claude Fable 5.1)", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -79758,28 +77858,30 @@ "extra_capabilities": { "reasoning": { "effort_options": [ - "minimal", "low", "medium", "high", - "xhigh" + "xhigh", + "max" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-09-02", - "last_updated": "2026-09-02", + "knowledge": "2026-06", + "release_date": "2026-09-01", + "last_updated": "2026-09-01", "type": "chat" }, { - "id": "deepseek-v4-1-flash", - "name": "DeepSeek V4.1 Flash", - "display_name": "DeepSeek V4.1 Flash", + "id": "duo-chat-opus-4-7", + "name": "Agentic Chat (Claude Opus 4.7)", + "display_name": "Agentic Chat (Claude Opus 4.7)", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" @@ -79787,9 +77889,9 @@ }, "limit": { "context": 1000000, - "output": 393216 + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -79798,28 +77900,30 @@ "extra_capabilities": { "reasoning": { "effort_options": [ - "none", "low", "medium", "high", + "xhigh", "max" ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-09-10", - "last_updated": "2026-09-10", + "open_weights": false, + "knowledge": "2026-01-31", + "release_date": "2026-04-16", + "last_updated": "2026-04-16", "type": "chat" }, { - "id": "minimax-m2-7", - "name": "MiniMax M2.7", - "display_name": "MiniMax M2.7", + "id": "duo-chat-opus-4-5", + "name": "Agentic Chat (Claude Opus 4.5)", + "display_name": "Agentic Chat (Claude Opus 4.5)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" @@ -79827,7 +77931,7 @@ }, "limit": { "context": 200000, - "output": 32768 + "output": 64000 }, "temperature": true, "tool_call": true, @@ -79835,29 +77939,41 @@ "supported": true, "default": true }, - "attachment": false, - "open_weights": true, - "release_date": "2026-03-18", - "last_updated": "2026-03-18", + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "high" + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-05", + "release_date": "2025-11-24", + "last_updated": "2025-11-24", "type": "chat" }, { - "id": "step-3-5-flash-2603", - "name": "Step 3.5 Flash 2603", - "display_name": "Step 3.5 Flash 2603", + "id": "duo-chat-gpt-5-2-codex", + "name": "Agentic Chat (GPT-5.2 Codex)", + "display_name": "Agentic Chat (GPT-5.2 Codex)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 131072 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -79867,34 +77983,36 @@ "reasoning": { "effort_options": [ "low", - "high" + "medium", + "high", + "xhigh" ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "attachment": true, + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2025-12-11", + "last_updated": "2025-12-11", "type": "chat" }, { - "id": "kimi-k2-7-code-highspeed", - "name": "Kimi K2.7 Code Highspeed", - "display_name": "Kimi K2.7 Code Highspeed", + "id": "duo-chat-opus-4-8", + "name": "Agentic Chat (Claude Opus 4.8)", + "display_name": "Agentic Chat (Claude Opus 4.8)", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 131072 + "context": 1000000, + "output": 128000 }, "temperature": false, "tool_call": true, @@ -79902,30 +78020,41 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-06-12", - "last_updated": "2026-06-12", + "open_weights": false, + "knowledge": "2026-01", + "release_date": "2026-05-28", + "last_updated": "2026-05-28", "type": "chat" }, { - "id": "step-5-preview", - "name": "Step 5 Preview", - "display_name": "Step 5 Preview", + "id": "duo-chat-gpt-5-4", + "name": "Agentic Chat (GPT-5.4)", + "display_name": "Agentic Chat (GPT-5.4)", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1024000, - "output": 131072 + "context": 1050000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -79936,36 +78065,38 @@ "extra_capabilities": { "reasoning": { "effort_options": [ + "none", "low", "medium", - "high" + "high", + "xhigh" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-09-16", - "last_updated": "2026-09-20", + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-03-05", + "last_updated": "2026-03-05", "type": "chat" }, { - "id": "mimo-v2-6-flash", - "name": "MiMo V2.6 Flash", - "display_name": "MiMo V2.6 Flash", + "id": "duo-chat-haiku-4-5", + "name": "Agentic Chat (Claude Haiku 4.5)", + "display_name": "Agentic Chat (Claude Haiku 4.5)", "modalities": { "input": [ "text", "image", - "audio", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, @@ -79974,27 +78105,29 @@ "default": true }, "attachment": true, - "open_weights": true, - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "open_weights": false, + "knowledge": "2025-02-28", + "release_date": "2025-10-15", + "last_updated": "2025-10-15", "type": "chat" }, { - "id": "fugu-ultra-v1-0", - "name": "Fugu Ultra v1.0", - "display_name": "Fugu Ultra v1.0", + "id": "duo-chat-gpt-6-luna", + "name": "Agentic Chat (GPT-6 Luna)", + "display_name": "Agentic Chat (GPT-6 Luna)", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 1050000, + "output": 128000 }, "temperature": false, "tool_call": true, @@ -80005,6 +78138,9 @@ "extra_capabilities": { "reasoning": { "effort_options": [ + "none", + "low", + "medium", "high", "xhigh", "max" @@ -80013,29 +78149,30 @@ }, "attachment": true, "open_weights": false, - "release_date": "2026-06-15", - "last_updated": "2026-06-15", + "knowledge": "2026-05-18", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "seed-2-0-lite", - "name": "Seed 2.0 Lite", - "display_name": "Seed 2.0 Lite", + "id": "duo-chat-opus-5", + "name": "Agentic Chat (Claude Opus 5)", + "display_name": "Agentic Chat (Claude Opus 5)", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 256000, + "context": 1000000, "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -80046,24 +78183,28 @@ "effort_options": [ "low", "medium", - "high" + "high", + "xhigh", + "max" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-02-14", - "last_updated": "2026-02-14", + "knowledge": "2026-05", + "release_date": "2026-07-24", + "last_updated": "2026-07-24", "type": "chat" }, { - "id": "fugu-max", - "name": "Fugu Max", - "display_name": "Fugu Max", + "id": "duo-chat-sonnet-5", + "name": "Agentic Chat (Claude Sonnet 5)", + "display_name": "Agentic Chat (Claude Sonnet 5)", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" @@ -80071,7 +78212,7 @@ }, "limit": { "context": 1000000, - "output": 131072 + "output": 64000 }, "temperature": false, "tool_call": true, @@ -80082,6 +78223,8 @@ "extra_capabilities": { "reasoning": { "effort_options": [ + "low", + "medium", "high", "xhigh", "max" @@ -80090,28 +78233,27 @@ }, "attachment": true, "open_weights": false, - "release_date": "2026-09-11", - "last_updated": "2026-09-11", + "knowledge": "2026-01-31", + "release_date": "2026-06-30", + "last_updated": "2026-06-30", "type": "chat" }, { - "id": "glm-5-3-flash", - "name": "GLM 5.3 Flash", - "display_name": "GLM 5.3 Flash", + "id": "duo-chat-gpt-5-4-mini", + "name": "Agentic Chat (GPT-5.4 Mini)", + "display_name": "Agentic Chat (GPT-5.4 Mini)", "modalities": { "input": [ "text", - "image", - "video", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 400000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -80122,35 +78264,39 @@ "extra_capabilities": { "reasoning": { "effort_options": [ + "none", "low", + "medium", "high", - "max" + "xhigh" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-03-17", + "last_updated": "2026-03-17", "type": "chat" }, { - "id": "deepseek-v4-pro", - "name": "DeepSeek V4 Pro", - "display_name": "DeepSeek V4 Pro", + "id": "duo-chat-gpt-5-codex", + "name": "Agentic Chat (GPT-5 Codex)", + "display_name": "Agentic Chat (GPT-5 Codex)", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 393216 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -80158,42 +78304,29 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", "effort_options": [ "low", - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." + "medium", + "high" ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "attachment": true, + "open_weights": false, + "knowledge": "2024-09-30", + "release_date": "2025-09-15", + "last_updated": "2025-09-15", "type": "chat" }, { - "id": "qwen3-6-flash", - "name": "Qwen3.6 Flash", - "display_name": "Qwen3.6 Flash", + "id": "duo-chat-sonnet-5-5", + "name": "Agentic Chat (Claude Sonnet 5.5)", + "display_name": "Agentic Chat (Claude Sonnet 5.5)", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" @@ -80201,9 +78334,9 @@ }, "limit": { "context": 1000000, - "output": 65536 + "output": 64000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -80212,37 +78345,40 @@ "extra_capabilities": { "reasoning": { "effort_options": [ - "none", "low", "medium", "high", + "xhigh", "max" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-04-27", - "last_updated": "2026-04-27", + "knowledge": "2026-06", + "release_date": "2026-09-28", + "last_updated": "2026-09-28", "type": "chat" }, { - "id": "deepseek-v4-pro-0813", - "name": "DeepSeek V4 Pro 0813", - "display_name": "DeepSeek V4 Pro 0813", + "id": "duo-chat-gpt-6-1-sol", + "name": "Agentic Chat (GPT-6.1 Sol)", + "display_name": "Agentic Chat (GPT-6.1 Sol)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 393216 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -80250,29 +78386,31 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ - "none", "low", "medium", "high", + "xhigh", "max" ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-08-13", - "last_updated": "2026-08-22", + "attachment": true, + "open_weights": false, + "knowledge": "2026-04-30", + "release_date": "2026-09-29", + "last_updated": "2026-09-29", "type": "chat" }, { - "id": "glm-5-2", - "name": "GLM 5.2", - "display_name": "GLM 5.2", + "id": "duo-chat-opus-4-6", + "name": "Agentic Chat (Claude Opus 4.6)", + "display_name": "Agentic Chat (Claude Opus 4.6)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" @@ -80280,7 +78418,7 @@ }, "limit": { "context": 1000000, - "output": 131072 + "output": 128000 }, "temperature": true, "tool_call": true, @@ -80291,39 +78429,37 @@ "extra_capabilities": { "reasoning": { "effort_options": [ - "none", - "minimal", "low", "medium", "high", - "xhigh", "max" ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "attachment": true, + "open_weights": false, + "knowledge": "2025-05-31", + "release_date": "2026-02-05", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "qwen3-6-27b", - "name": "Qwen3.6 27B", - "display_name": "Qwen3.6 27B", + "id": "duo-chat-gpt-5-3-codex", + "name": "Agentic Chat (GPT-5.3 Codex)", + "display_name": "Agentic Chat (GPT-5.3 Codex)", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 64000 + "context": 400000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -80338,25 +78474,26 @@ "low", "medium", "high", - "max" + "xhigh" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-04-22", - "last_updated": "2026-04-22", + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-02-05", + "last_updated": "2026-02-05", "type": "chat" }, { - "id": "qwen3-8-flash", - "name": "Qwen3.8 Flash", - "display_name": "Qwen3.8 Flash", + "id": "duo-chat-opus-5-5", + "name": "Agentic Chat (Claude Opus 5.5)", + "display_name": "Agentic Chat (Claude Opus 5.5)", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" @@ -80364,9 +78501,9 @@ }, "limit": { "context": 1000000, - "output": 131072 + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -80375,37 +78512,37 @@ "extra_capabilities": { "reasoning": { "effort_options": [ - "none", "low", "medium", "high", + "xhigh", "max" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", + "knowledge": "2026-06", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "qwen3-5-27b", - "name": "Qwen3.5 27B", - "display_name": "Qwen3.5 27B", + "id": "duo-chat-gpt-5-1", + "name": "Agentic Chat (GPT-5.1)", + "display_name": "Agentic Chat (GPT-5.1)", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 64000 + "context": 400000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -80419,36 +78556,35 @@ "none", "low", "medium", - "high", - "max" + "high" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-02-23", - "last_updated": "2026-02-23", + "open_weights": false, + "knowledge": "2024-09-30", + "release_date": "2025-11-13", + "last_updated": "2025-11-13", "type": "chat" }, { - "id": "qwen3-5-397b-a17b", - "name": "Qwen3.5 397B-A17B", - "display_name": "Qwen3.5 397B-A17B", + "id": "duo-chat-gpt-5-mini", + "name": "Agentic Chat (GPT-5 Mini)", + "display_name": "Agentic Chat (GPT-5 Mini)", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 64000 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -80457,37 +78593,36 @@ "extra_capabilities": { "reasoning": { "effort_options": [ - "none", + "minimal", "low", "medium", - "high", - "max" + "high" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-02-15", - "last_updated": "2026-02-15", + "open_weights": false, + "knowledge": "2024-05-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "qwen3-5-4b", - "name": "Qwen3.5 4B", - "display_name": "Qwen3.5 4B", + "id": "duo-chat-gpt-5-2", + "name": "Agentic Chat (GPT-5.2)", + "display_name": "Agentic Chat (GPT-5.2)", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 400000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -80502,25 +78637,26 @@ "low", "medium", "high", - "max" + "xhigh" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-03-02", - "last_updated": "2026-03-02", + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2025-12-11", + "last_updated": "2025-12-11", "type": "chat" }, { - "id": "qwen3-5-flash", - "name": "Qwen3.5 Flash", - "display_name": "Qwen3.5 Flash", + "id": "duo-chat-sonnet-4-6", + "name": "Agentic Chat (Claude Sonnet 4.6)", + "display_name": "Agentic Chat (Claude Sonnet 4.6)", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" @@ -80528,7 +78664,7 @@ }, "limit": { "context": 1000000, - "output": 32768 + "output": 64000 }, "temperature": true, "tool_call": true, @@ -80536,27 +78672,39 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "high", + "max" + ] + } + }, "attachment": true, "open_weights": false, - "release_date": "2026-02-23", - "last_updated": "2026-02-23", + "knowledge": "2025-08-31", + "release_date": "2026-02-17", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "glm-4-7-flash", - "name": "GLM 4.7 Flash", - "display_name": "GLM 4.7 Flash", + "id": "duo-chat-gpt-5-4-nano", + "name": "Agentic Chat (GPT-5.4 Nano)", + "display_name": "Agentic Chat (GPT-5.4 Nano)", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 131072 + "context": 400000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -80564,33 +78712,43 @@ "supported": true, "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2026-01-19", - "last_updated": "2026-01-19", + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-03-17", + "last_updated": "2026-03-17", "type": "chat" }, { - "id": "muse-spark-1-1", - "name": "Muse Spark 1.1", - "display_name": "Muse Spark 1.1", + "id": "duo-chat-fable-5", + "name": "Agentic Chat (Claude Fable 5)", + "display_name": "Agentic Chat (Claude Fable 5)", "modalities": { "input": [ "text", "image", - "video", - "audio" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -80599,29 +78757,29 @@ "extra_capabilities": { "reasoning": { "effort_options": [ - "minimal", "low", "medium", "high", - "xhigh" + "xhigh", + "max" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-04-08", - "last_updated": "2026-07-09", + "knowledge": "2026-01-31", + "release_date": "2026-06-09", + "last_updated": "2026-06-09", "type": "chat" }, { - "id": "glm-4-6v-flash", - "name": "GLM 4.6V Flash", - "display_name": "GLM 4.6V Flash", + "id": "duo-chat-gpt-5-6-terra", + "name": "Agentic Chat (GPT-5.6 Terra)", + "display_name": "Agentic Chat (GPT-5.6 Terra)", "modalities": { "input": [ "text", "image", - "video", "pdf" ], "output": [ @@ -80629,69 +78787,95 @@ ] }, "limit": { - "context": 128000, - "output": 32768 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + }, "attachment": true, - "open_weights": true, - "release_date": "2025-12-08", - "last_updated": "2025-12-08", + "open_weights": false, + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "mimo-v2-6-pro", - "name": "MiMo V2.6 Pro", - "display_name": "MiMo V2.6 Pro", + "id": "duo-chat-gpt-6-astra", + "name": "Agentic Chat (GPT-6 Astra)", + "display_name": "Agentic Chat (GPT-6 Astra)", "modalities": { "input": [ "text", "image", - "audio", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + }, "attachment": true, - "open_weights": true, - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "open_weights": false, + "knowledge": "2026-04-30", + "release_date": "2026-09-04", + "last_updated": "2026-09-04", "type": "chat" }, { - "id": "deepseek-v4-flash-0731", - "name": "DeepSeek V4 Flash 0731", - "display_name": "DeepSeek V4 Flash 0731", + "id": "duo-chat-gpt-5-6-sol", + "name": "Agentic Chat (GPT-5.6 Sol)", + "display_name": "Agentic Chat (GPT-5.6 Sol)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 393216 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -80699,40 +78883,42 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ "none", "low", "medium", "high", + "xhigh", "max" ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-07-31", - "last_updated": "2026-07-31", + "attachment": true, + "open_weights": false, + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "glm-5-1", - "name": "GLM 5.1", - "display_name": "GLM 5.1", + "id": "duo-chat-gpt-6-sol", + "name": "Agentic Chat (GPT-6 Sol)", + "display_name": "Agentic Chat (GPT-6 Sol)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 202000, + "context": 1050000, "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -80745,92 +78931,110 @@ "low", "medium", "high", + "xhigh", "max" ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-04-07", - "last_updated": "2026-04-07", + "attachment": true, + "open_weights": false, + "knowledge": "2026-04-20", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "mistral-small-4", - "name": "Mistral Small 4", - "display_name": "Mistral Small 4", + "id": "duo-chat-sonnet-4-5", + "name": "Agentic Chat (Claude Sonnet 4.5)", + "display_name": "Agentic Chat (Claude Sonnet 4.5)", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 65536 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": true, - "open_weights": true, - "knowledge": "2025-06", - "release_date": "2026-03-16", - "last_updated": "2026-03-16", + "open_weights": false, + "knowledge": "2025-07-31", + "release_date": "2025-09-29", + "last_updated": "2025-09-29", "type": "chat" }, { - "id": "minimax-m2-7-highspeed", - "name": "MiniMax M2.7 Highspeed", - "display_name": "MiniMax M2.7 Highspeed", + "id": "duo-chat-haiku-5-5", + "name": "Agentic Chat (Claude Haiku 5.5)", + "display_name": "Agentic Chat (Claude Haiku 5.5)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 32768 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": false, - "open_weights": true, - "release_date": "2026-03-18", - "last_updated": "2026-03-18", + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2026-06", + "release_date": "2026-10-07", + "last_updated": "2026-10-07", "type": "chat" }, { - "id": "qwen3-5-9b", - "name": "Qwen3.5 9B", - "display_name": "Qwen3.5 9B", + "id": "duo-chat-gpt-5-5", + "name": "Agentic Chat (GPT-5.5)", + "display_name": "Agentic Chat (GPT-5.5)", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -80843,33 +79047,34 @@ "low", "medium", "high", - "max" + "xhigh" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-02-23", - "last_updated": "2026-02-23", + "open_weights": false, + "knowledge": "2025-12-01", + "release_date": "2026-04-23", + "last_updated": "2026-04-23", "type": "chat" }, { - "id": "kimi-k3", - "name": "Kimi K3", - "display_name": "Kimi K3", + "id": "duo-chat-gpt-5-6-luna", + "name": "Agentic Chat (GPT-5.6 Luna)", + "display_name": "Agentic Chat (GPT-5.6 Luna)", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 1050000, + "output": 128000 }, "temperature": false, "tool_call": true, @@ -80879,24 +79084,36 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ + "none", "low", + "medium", "high", + "xhigh", "max" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-16", + "open_weights": false, + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" - }, + } + ] + }, + "zhipuai": { + "id": "zhipuai", + "name": "Zhipu AI", + "display_name": "Zhipu AI", + "api": "https://open.bigmodel.cn/api/paas/v4", + "doc": "https://docs.bigmodel.cn/cn/guide/start/pricing", + "models": [ { - "id": "step-3-5-flash", - "name": "Step 3.5 Flash", - "display_name": "Step 3.5 Flash", + "id": "glm-5.2", + "name": "GLM-5.2", + "display_name": "GLM-5.2", "modalities": { "input": [ "text" @@ -80906,7 +79123,7 @@ ] }, "limit": { - "context": 256000, + "context": 1000000, "output": 131072 }, "temperature": true, @@ -80915,20 +79132,37 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "high", + "max" + ] + } + }, "attachment": false, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-01-29", - "last_updated": "2026-02-13", + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "glm-4-5-flash", - "name": "GLM 4.5 Flash", - "display_name": "GLM 4.5 Flash", + "id": "glm-5v-turbo", + "name": "GLM-5V-Turbo", + "display_name": "GLM-5V-Turbo", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "pdf" ], "output": [ "text" @@ -80936,7 +79170,7 @@ }, "limit": { "context": 200000, - "output": 98304 + "output": 131072 }, "temperature": true, "tool_call": true, @@ -80944,21 +79178,33 @@ "supported": true, "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": true, "open_weights": false, - "knowledge": "2025-04", - "release_date": "2025-07-28", - "last_updated": "2025-07-28", + "release_date": "2026-04-01", + "last_updated": "2026-04-01", "type": "chat" }, { - "id": "deepseek-v4-1-flash-1017", - "name": "DeepSeek V4.1 Flash 1017", - "display_name": "DeepSeek V4.1 Flash 1017", + "id": "glm-5.3-flashx", + "name": "GLM-5.3-FlashX", + "display_name": "GLM-5.3-FlashX", "modalities": { "input": [ "text", - "image" + "image", + "video", + "pdf" ], "output": [ "text" @@ -80966,7 +79212,7 @@ }, "limit": { "context": 1000000, - "output": 393216 + "output": 131072 }, "temperature": true, "tool_call": true, @@ -80976,10 +79222,15 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ - "none", "low", - "medium", "high", "max" ] @@ -80987,20 +79238,17 @@ }, "attachment": true, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-10-17", - "last_updated": "2026-10-17", + "release_date": "2026-09-18", + "last_updated": "2026-09-18", "type": "chat" }, { - "id": "qwen3-8-max-0902", - "name": "Qwen3.8 Max 0902", - "display_name": "Qwen3.8 Max 0902", + "id": "glm-5.3", + "name": "GLM-5.3", + "display_name": "GLM-5.3", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" @@ -81018,38 +79266,41 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ - "none", "low", - "medium", "high", "max" ] } }, - "attachment": true, - "open_weights": false, - "release_date": "2026-09-02", - "last_updated": "2026-09-02", + "attachment": false, + "open_weights": true, + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "qwen3-7-plus", - "name": "Qwen3.7 Plus", - "display_name": "Qwen3.7 Plus", + "id": "glm-4.7-flashx", + "name": "GLM-4.7-FlashX", + "display_name": "GLM-4.7-FlashX", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 200000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -81059,40 +79310,37 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "high", - "max" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, - "attachment": true, - "open_weights": false, + "attachment": false, + "open_weights": true, "knowledge": "2025-04", - "release_date": "2026-06-02", - "last_updated": "2026-06-02", + "release_date": "2026-01-19", + "last_updated": "2026-01-19", "type": "chat" }, { - "id": "mimo-v2-6-pro-ultraspeed", - "name": "MiMo V2.6 Pro UltraSpeed", - "display_name": "MiMo V2.6 Pro UltraSpeed", + "id": "glm-4.5", + "name": "GLM-4.5", + "display_name": "GLM-4.5", "modalities": { "input": [ - "text", - "image", - "audio", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 131072, + "output": 98304 }, "temperature": true, "tool_call": true, @@ -81100,16 +79348,28 @@ "supported": true, "default": true }, - "attachment": true, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, "open_weights": true, - "release_date": "2026-09-21", - "last_updated": "2026-09-21", + "knowledge": "2025-04", + "release_date": "2025-07-28", + "last_updated": "2025-07-28", "type": "chat" }, { - "id": "minimax-m3-1-flash", - "name": "MiniMax M3.1 Flash", - "display_name": "MiniMax M3.1 Flash", + "id": "glm-4.6v", + "name": "GLM-4.6V", + "display_name": "GLM-4.6V", "modalities": { "input": [ "text", @@ -81121,8 +79381,8 @@ ] }, "limit": { - "context": 1000000, - "output": 524288 + "context": 128000, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -81132,39 +79392,39 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, "attachment": true, - "open_weights": false, - "release_date": "2026-10-19", - "last_updated": "2026-10-19", + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-12-08", + "last_updated": "2025-12-08", "type": "chat" }, { - "id": "fugu-ultra-v1-1", - "name": "Fugu Ultra v1.1", - "display_name": "Fugu Ultra v1.1", + "id": "glm-4.7-flash", + "name": "GLM-4.7-Flash", + "display_name": "GLM-4.7-Flash", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, + "context": 200000, "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -81172,36 +79432,37 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "high", - "xhigh", - "max" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, - "attachment": true, - "open_weights": false, - "release_date": "2026-06-15", - "last_updated": "2026-06-15", + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2026-01-19", + "last_updated": "2026-01-19", "type": "chat" }, { - "id": "seed-2-0-code", - "name": "Seed 2.0 Code", - "display_name": "Seed 2.0 Code", + "id": "glm-4.6", + "name": "GLM-4.6", + "display_name": "GLM-4.6", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 128000 + "context": 204800, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -81211,38 +79472,39 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "low", - "medium", - "high" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, - "attachment": true, - "open_weights": false, - "release_date": "2026-02-14", - "last_updated": "2026-02-14", + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-09-30", + "last_updated": "2025-09-30", "type": "chat" }, { - "id": "seed-2-0-pro", - "name": "Seed 2.0 Pro", - "display_name": "Seed 2.0 Pro", + "id": "glm-4.5-flash", + "name": "GLM-4.5-Flash", + "display_name": "GLM-4.5-Flash", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 128000 + "context": 131072, + "output": 98304 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -81250,23 +79512,66 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "low", - "medium", - "high" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2026-02-14", - "last_updated": "2026-02-14", + "knowledge": "2025-04", + "release_date": "2025-07-28", + "last_updated": "2025-07-28", "type": "chat" }, { - "id": "seed-2-0-mini", - "name": "Seed 2.0 Mini", - "display_name": "Seed 2.0 Mini", + "id": "glm-4.5-air", + "name": "GLM-4.5-Air", + "display_name": "GLM-4.5-Air", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 131072, + "output": 98304 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-07-28", + "last_updated": "2025-07-28", + "type": "chat" + }, + { + "id": "glm-4.5v", + "name": "GLM-4.5V", + "display_name": "GLM-4.5V", "modalities": { "input": [ "text", @@ -81278,8 +79583,8 @@ ] }, "limit": { - "context": 256000, - "output": 128000 + "context": 64000, + "output": 16384 }, "temperature": true, "tool_call": true, @@ -81289,23 +79594,26 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "low", - "medium", - "high" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, "attachment": true, - "open_weights": false, - "release_date": "2026-02-14", - "last_updated": "2026-02-14", + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-08-11", + "last_updated": "2025-08-11", "type": "chat" }, { - "id": "gemma-4-26b-a4b", - "name": "Gemma 4 26B-A4B", - "display_name": "Gemma 4 26B-A4B", + "id": "glm-4.6v-flash", + "name": "GLM-4.6V-Flash", + "display_name": "GLM-4.6V-Flash", "modalities": { "input": [ "text", @@ -81317,7 +79625,7 @@ ] }, "limit": { - "context": 262144, + "context": 128000, "output": 32768 }, "temperature": true, @@ -81328,25 +79636,25 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "high", - "max" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, "attachment": true, "open_weights": true, - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "release_date": "2025-12-08", + "last_updated": "2025-12-08", "type": "chat" }, { - "id": "qwen3-6-35b-a3b", - "name": "Qwen3.6 35B A3B", - "display_name": "Qwen3.6 35B A3B", + "id": "glm-5", + "name": "GLM-5", + "display_name": "GLM-5", "modalities": { "input": [ "text" @@ -81356,8 +79664,8 @@ ] }, "limit": { - "context": 131072, - "output": 16384 + "context": 204800, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -81367,38 +79675,39 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "high", - "max" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, "attachment": false, "open_weights": true, - "release_date": "2026-04-17", - "last_updated": "2026-04-17", + "release_date": "2026-02-12", + "last_updated": "2026-02-12", "type": "chat" }, { - "id": "kimi-k2-6", - "name": "Kimi K2.6", - "display_name": "Kimi K2.6", + "id": "glm-5.3-flash", + "name": "GLM-5.3-Flash", + "display_name": "GLM-5.3-Flash", "modalities": { "input": [ "text", "image", - "video" + "video", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 16000 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -81408,10 +79717,15 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ - "none", "low", - "medium", "high", "max" ] @@ -81419,28 +79733,24 @@ }, "attachment": true, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-20", - "last_updated": "2026-04-20", + "release_date": "2026-08-26", + "last_updated": "2026-08-26", "type": "chat" }, { - "id": "muse-spark-1-2", - "name": "Muse Spark 1.2", - "display_name": "Muse Spark 1.2", + "id": "glm-4.7", + "name": "GLM-4.7", + "display_name": "GLM-4.7", "modalities": { "input": [ - "text", - "image", - "video", - "audio" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, + "context": 204800, "output": 131072 }, "temperature": true, @@ -81451,38 +79761,37 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "minimal", - "low", - "medium", - "high", - "xhigh" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, - "attachment": true, - "open_weights": false, - "release_date": "2026-08-05", - "last_updated": "2026-08-05", + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-12-22", + "last_updated": "2025-12-22", "type": "chat" }, { - "id": "minimax-m3", - "name": "MiniMax M3", - "display_name": "MiniMax M3", + "id": "glm-5.1", + "name": "GLM-5.1", + "display_name": "GLM-5.1", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 524288 + "context": 200000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -81492,61 +79801,91 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-06-01", - "last_updated": "2026-06-01", + "release_date": "2026-04-07", + "last_updated": "2026-04-07", "type": "chat" - }, + } + ] + }, + "neon": { + "id": "neon", + "name": "Neon", + "display_name": "Neon", + "api": "${NEON_AI_GATEWAY_BASE_URL}/v1", + "doc": "https://neon.com/docs", + "models": [ { - "id": "qwen3-7-max", - "name": "Qwen3.7 Max", - "display_name": "Qwen3.7 Max", + "id": "claude-sonnet-4-5", + "name": "Claude Sonnet 4.5 (latest)", + "display_name": "Claude Sonnet 4.5 (latest)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "high", - "max" + "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-05-21", - "last_updated": "2026-05-21", + "knowledge": "2025-07-31", + "release_date": "2025-09-29", + "last_updated": "2025-09-29", "type": "chat" }, { - "id": "glm-5-3", - "name": "GLM 5.3", - "display_name": "GLM 5.3", + "id": "claude-fable-5", + "name": "Claude Fable 5", + "display_name": "Claude Fable 5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" @@ -81554,9 +79893,9 @@ }, "limit": { "context": 1000000, - "output": 131072 + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -81564,28 +79903,44 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", "effort_options": [ "low", + "medium", "high", + "xhigh", "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", + "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", + "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "attachment": true, + "open_weights": false, + "knowledge": "2026-01-31", + "release_date": "2026-06-09", + "last_updated": "2026-06-09", "type": "chat" }, { - "id": "qwen3-8-27b", - "name": "Qwen3.8 27B", - "display_name": "Qwen3.8 27B", + "id": "qwen35-122b-a10b", + "name": "Qwen3.5 122B-A10B", + "display_name": "Qwen3.5 122B-A10B", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" @@ -81593,7 +79948,7 @@ }, "limit": { "context": 262144, - "output": 32768 + "output": 25000 }, "temperature": true, "tool_call": true, @@ -81607,75 +79962,83 @@ "none", "low", "medium", - "xhigh" + "high" ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" }, { - "id": "qwen3-8-omni-flash", - "name": "Qwen3.8 Omni Flash", - "display_name": "Qwen3.8 Omni Flash", + "id": "claude-haiku-4-5", + "name": "Claude Haiku 4.5 (latest)", + "display_name": "Claude Haiku 4.5 (latest)", "modalities": { "input": [ "text", "image", - "audio", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "high", - "max" + "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-09-17", - "last_updated": "2026-09-17", + "knowledge": "2025-02-28", + "release_date": "2025-10-15", + "last_updated": "2025-10-15", "type": "chat" }, { - "id": "qwen3-7-flash", - "name": "Qwen3.7 Flash", - "display_name": "Qwen3.7 Flash", + "id": "gpt-oss-20b", + "name": "GPT OSS 20B", + "display_name": "GPT OSS 20B", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 131072, + "output": 25000 }, "temperature": true, "tool_call": true, @@ -81685,68 +80048,91 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ - "none", "low", "medium", - "high", - "max" + "high" ] } }, - "attachment": true, - "open_weights": false, - "release_date": "2026-07-15", - "last_updated": "2026-07-15", + "attachment": false, + "open_weights": true, + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "qwen3-5-plus", - "name": "Qwen3.5 Plus", - "display_name": "Qwen3.5 Plus", + "id": "gpt-5-4-nano", + "name": "GPT-5.4 nano", + "display_name": "GPT-5.4 nano", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 400000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } }, "attachment": true, "open_weights": false, - "knowledge": "2025-04", - "release_date": "2026-02-16", - "last_updated": "2026-02-16", + "knowledge": "2025-08-31", + "release_date": "2026-03-17", + "last_updated": "2026-03-17", "type": "chat" }, { - "id": "seed-2-1-turbo", - "name": "Seed 2.1 Turbo", - "display_name": "Seed 2.1 Turbo", + "id": "gemini-3-5-flash-lite", + "name": "Gemini 3.5 Flash Lite", + "display_name": "Gemini 3.5 Flash Lite", "modalities": { "input": [ "text", "image", - "video" + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 256000, + "context": 1048576, "output": 65536 }, "temperature": true, @@ -81758,6 +80144,7 @@ "extra_capabilities": { "reasoning": { "effort_options": [ + "minimal", "low", "medium", "high" @@ -81766,58 +80153,89 @@ }, "attachment": true, "open_weights": false, - "release_date": "2026-06-23", - "last_updated": "2026-06-23", + "knowledge": "2026-03", + "release_date": "2026-07-21", + "last_updated": "2026-07-21", "type": "chat" }, { - "id": "kimi-k2-7-code", - "name": "Kimi K2.7 Code", - "display_name": "Kimi K2.7 Code", + "id": "claude-sonnet-4-6", + "name": "Claude Sonnet 4.6", + "display_name": "Claude Sonnet 4.6", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 131072 + "context": 1000000, + "output": 64000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." + ] + } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-06-12", - "last_updated": "2026-06-12", + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-02-17", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "step-3-7-flash", - "name": "Step 3.7 Flash", - "display_name": "Step 3.7 Flash", + "id": "gemini-3-flash", + "name": "Gemini 3 Flash Preview", + "display_name": "Gemini 3 Flash Preview", "modalities": { "input": [ "text", "image", - "video" + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 131072 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -81827,24 +80245,34 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", "low", "medium", "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2026-03-01", - "release_date": "2026-05-29", - "last_updated": "2026-05-29", + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2025-12-17", + "last_updated": "2025-12-17", "type": "chat" }, { - "id": "fugu-ultra-v2-0", - "name": "Fugu Ultra v2.0", - "display_name": "Fugu Ultra v2.0", + "id": "deepseek-v4-1-flash", + "name": "DeepSeek V4.1 Flash", + "display_name": "DeepSeek V4.1 Flash", "modalities": { "input": [ "text", @@ -81856,9 +80284,9 @@ }, "limit": { "context": 1000000, - "output": 131072 + "output": 384000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -81867,36 +80295,34 @@ "extra_capabilities": { "reasoning": { "effort_options": [ + "low", "high", - "xhigh", "max" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-08-28", - "release_date": "2026-09-11", - "last_updated": "2026-09-11", + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-09-10", + "last_updated": "2026-09-10", "type": "chat" }, { - "id": "qwen3-8-max", - "name": "Qwen3.8 Max", - "display_name": "Qwen3.8 Max", + "id": "grok-4-7", + "name": "Grok 4.7", + "display_name": "Grok 4.7", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 500000, + "output": 500000 }, "temperature": true, "tool_call": true, @@ -81907,55 +80333,76 @@ "extra_capabilities": { "reasoning": { "effort_options": [ - "none", "low", "medium", "high", - "max" + "xhigh" ] } }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2026-08-03", - "last_updated": "2026-08-03", + "knowledge": "2026-05", + "release_date": "2026-09-21", + "last_updated": "2026-09-21", "type": "chat" }, { - "id": "qwen3-6-plus", - "name": "Qwen3.6 Plus", - "display_name": "Qwen3.6 Plus", + "id": "gpt-5-2", + "name": "GPT-5.2", + "display_name": "GPT-5.2", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 400000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } }, "attachment": true, "open_weights": false, - "knowledge": "2025-04", - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "knowledge": "2025-08-31", + "release_date": "2025-12-11", + "last_updated": "2025-12-11", "type": "chat" }, { - "id": "gemma-3-27b", - "name": "Gemma 3 27B", - "display_name": "Gemma 3 27B", + "id": "glm-5-3-flash", + "name": "GLM-5.3 Flash", + "display_name": "GLM-5.3 Flash", "modalities": { "input": [ "text", @@ -81966,122 +80413,160 @@ ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 1048576, + "output": 131072 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "high", + "max" + ] + } }, "attachment": true, "open_weights": true, - "knowledge": "2024-08", - "release_date": "2025-03-12", - "last_updated": "2025-03-12", + "release_date": "2026-08-26", + "last_updated": "2026-08-26", "type": "chat" }, { - "id": "qwen3-5-35b-a3b", - "name": "Qwen3.5 35B-A3B", - "display_name": "Qwen3.5 35B-A3B", + "id": "gpt-5-4-mini", + "name": "GPT-5.4 mini", + "display_name": "GPT-5.4 mini", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 64000 + "context": 400000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", "effort_options": [ "none", "low", "medium", "high", - "max" - ] + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, - "open_weights": true, - "release_date": "2026-02-23", - "last_updated": "2026-02-23", + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-03-17", + "last_updated": "2026-03-17", "type": "chat" }, { - "id": "muse-glimmer-30b", - "name": "Muse Glimmer 30B", - "display_name": "Muse Glimmer 30B", + "id": "claude-opus-4-7", + "name": "Claude Opus 4.7", + "display_name": "Claude Opus 4.7", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "high", "effort_options": [ - "none", "low", "medium", "high", + "xhigh", "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2026-01-04", - "release_date": "2026-08-10", - "last_updated": "2026-08-10", + "open_weights": false, + "knowledge": "2026-01-31", + "release_date": "2026-04-16", + "last_updated": "2026-04-16", "type": "chat" }, { - "id": "qwen3-5-122b-a10b", - "name": "Qwen3.5 122B-A10B", - "display_name": "Qwen3.5 122B-A10B", + "id": "gemini-3-8-flash", + "name": "Gemini 3.8 Flash", + "display_name": "Gemini 3.8 Flash", "modalities": { "input": [ "text", "image", - "video" + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 64000 + "context": 1048576, + "output": 65536 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -82090,38 +80575,27 @@ "extra_capabilities": { "reasoning": { "effort_options": [ - "none", "low", "medium", - "high", - "max" + "high" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-02-23", - "last_updated": "2026-02-23", + "open_weights": false, + "release_date": "2026-09-02", + "last_updated": "2026-09-02", "type": "chat" - } - ] - }, - "meganova": { - "id": "meganova", - "name": "Meganova", - "display_name": "Meganova", - "api": "https://api.meganova.ai/v1", - "doc": "https://docs.meganova.ai", - "models": [ + }, { - "id": "Qwen/Qwen3.5-Plus", - "name": "Qwen3.5 Plus", - "display_name": "Qwen3.5 Plus", + "id": "claude-fable-5-1", + "name": "Claude Fable 5.1", + "display_name": "Claude Fable 5.1", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" @@ -82129,9 +80603,9 @@ }, "limit": { "context": 1000000, - "output": 65536 + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -82140,91 +80614,105 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], "interleaved": true, "summaries": true, - "visibility": "summary", + "visibility": "omitted", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", + "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", + "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-04", - "release_date": "2026-02-16", - "last_updated": "2026-02-16", + "knowledge": "2026-06", + "release_date": "2026-09-01", + "last_updated": "2026-09-01", "type": "chat" }, { - "id": "Qwen/Qwen2.5-VL-32B-Instruct", - "name": "Qwen2.5 VL 32B Instruct", - "display_name": "Qwen2.5 VL 32B Instruct", + "id": "gpt-5-4", + "name": "GPT-5.4", + "display_name": "GPT-5.4", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 16384, - "output": 16384 + "context": 1050000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false }, - "attachment": true, - "open_weights": true, - "release_date": "2025-03-24", - "last_updated": "2025-03-24", - "type": "chat" - }, - { - "id": "Qwen/Qwen3-235B-A22B-Instruct-2507", - "name": "Qwen3 235B A22B Instruct 2507", - "display_name": "Qwen3 235B A22B Instruct 2507", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 262000, - "output": 262000 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } }, - "attachment": false, - "open_weights": true, - "release_date": "2025-07-21", - "last_updated": "2025-07-21", + "attachment": true, + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-03-05", + "last_updated": "2026-03-05", "type": "chat" }, { - "id": "MiniMaxAI/MiniMax-M2.1", - "name": "MiniMax M2.1", - "display_name": "MiniMax M2.1", + "id": "grok-4-6", + "name": "Grok 4.6", + "display_name": "Grok 4.6", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 196608, - "output": 131072 + "context": 500000, + "output": 524288 }, "temperature": true, "tool_call": true, @@ -82234,25 +80722,25 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "low", + "medium", + "high", + "xhigh" ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2025-12-23", - "last_updated": "2025-12-23", + "attachment": true, + "open_weights": false, + "knowledge": "2026-02-01", + "release_date": "2026-08-12", + "last_updated": "2026-08-12", "type": "chat" }, { - "id": "MiniMaxAI/MiniMax-M2.5", - "name": "MiniMax M2.5", - "display_name": "MiniMax M2.5", + "id": "meta-llama-3-1-8b-instruct", + "name": "Llama 3.1 8B Instruct", + "display_name": "Llama 3.1 8B Instruct", "modalities": { "input": [ "text" @@ -82262,50 +80750,40 @@ ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 131072, + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": false, "open_weights": true, - "release_date": "2026-02-12", - "last_updated": "2026-02-12", + "knowledge": "2023-12-31", + "release_date": "2024-07-23", + "last_updated": "2024-07-23", "type": "chat" }, { - "id": "moonshotai/Kimi-K2.5", - "name": "Kimi K2.5", - "display_name": "Kimi K2.5", + "id": "gpt-6-1-sol", + "name": "GPT-6.1 Sol", + "display_name": "GPT-6.1 Sol", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -82313,39 +80791,40 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "low", + "medium", + "high", + "xhigh" ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2026-01", - "release_date": "2026-01-27", - "last_updated": "2026-01-27", + "open_weights": false, + "knowledge": "2026-04-30", + "release_date": "2026-09-29", + "last_updated": "2026-09-29", "type": "chat" }, { - "id": "moonshotai/Kimi-K2-Thinking", - "name": "Kimi K2 Thinking", - "display_name": "Kimi K2 Thinking", + "id": "gpt-6-luna", + "name": "GPT-6 Luna", + "display_name": "GPT-6 Luna", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -82353,147 +80832,171 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-08", - "release_date": "2025-11-06", - "last_updated": "2025-11-06", + "attachment": true, + "open_weights": false, + "knowledge": "2026-05-18", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "XiaomiMiMo/MiMo-V2-Flash", - "name": "MiMo V2 Flash", - "display_name": "MiMo V2 Flash", + "id": "claude-opus-5-5", + "name": "Claude Opus 5.5", + "display_name": "Claude Opus 5.5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32000 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-12-01", - "release_date": "2025-12-16", - "last_updated": "2026-02-04", + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2026-06", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "zai-org/GLM-5", - "name": "GLM-5", - "display_name": "GLM-5", + "id": "gemma-3-12b", + "name": "Gemma 3 12B", + "display_name": "Gemma 3 12B", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 202752, - "output": 131072 + "context": 131072, + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-02-12", - "last_updated": "2026-02-12", + "knowledge": "2024-08-31", + "release_date": "2025-03-12", + "last_updated": "2025-03-12", "type": "chat" }, { - "id": "zai-org/GLM-4.6", - "name": "GLM-4.6", - "display_name": "GLM-4.6", + "id": "claude-opus-4-6", + "name": "Claude Opus 4.6", + "display_name": "Claude Opus 4.6", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 202752, - "output": 131072 + "context": 1000000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "max" + ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-09-30", - "last_updated": "2025-09-30", + "attachment": true, + "open_weights": false, + "knowledge": "2025-05-31", + "release_date": "2026-02-05", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "zai-org/GLM-4.7", - "name": "GLM-4.7", - "display_name": "GLM-4.7", + "id": "gpt-5-5-pro", + "name": "GPT-5.5 Pro", + "display_name": "GPT-5.5 Pro", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 202752, - "output": 131072 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -82501,126 +81004,124 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "medium", + "high", + "xhigh" ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-12-22", - "last_updated": "2025-12-22", + "attachment": true, + "open_weights": false, + "knowledge": "2025-12-01", + "release_date": "2026-04-23", + "last_updated": "2026-04-23", "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-V3.1", - "name": "DeepSeek V3.1", - "display_name": "DeepSeek V3.1", + "id": "claude-opus-4-8", + "name": "Claude Opus 4.8", + "display_name": "Claude Opus 4.8", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 164000, - "output": 164000 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": true, - "release_date": "2025-08-21", - "last_updated": "2025-08-21", - "type": "chat" - }, - { - "id": "deepseek-ai/DeepSeek-R1-0528", - "name": "DeepSeek R1 0528", - "display_name": "DeepSeek R1 0528", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 163840, - "output": 64000 - }, - "temperature": true, - "tool_call": false, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], "interleaved": true, "summaries": true, - "visibility": "summary", + "visibility": "omitted", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-07", - "release_date": "2025-05-28", - "last_updated": "2025-05-28", + "attachment": true, + "open_weights": false, + "knowledge": "2026-01", + "release_date": "2026-05-28", + "last_updated": "2026-05-28", "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-V3.2", - "name": "DeepSeek V3.2", - "display_name": "DeepSeek V3.2", + "id": "gemini-3-5-flash", + "name": "Gemini 3.5 Flash", + "display_name": "Gemini 3.5 Flash", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 164000, - "output": 164000 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true + "effort_options": [ + "minimal", + "low", + "medium", + "high" + ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-07", - "release_date": "2025-12-01", - "last_updated": "2025-12-01", + "attachment": true, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2026-05-19", + "last_updated": "2026-05-19", "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-V3-0324", - "name": "DeepSeek V3 0324", - "display_name": "DeepSeek V3 0324", + "id": "qwen3-next-80b-a3b-instruct", + "name": "Qwen3-Next 80B-A3B Instruct", + "display_name": "Qwen3-Next 80B-A3B Instruct", "modalities": { "input": [ "text" @@ -82630,8 +81131,8 @@ ] }, "limit": { - "context": 163840, - "output": 163840 + "context": 131072, + "output": 10000 }, "temperature": true, "tool_call": true, @@ -82640,148 +81141,219 @@ }, "attachment": false, "open_weights": true, - "release_date": "2025-03-24", - "last_updated": "2025-03-24", + "knowledge": "2025-04", + "release_date": "2025-09", + "last_updated": "2025-09", "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-V3.2-Exp", - "name": "DeepSeek V3.2 Exp", - "display_name": "DeepSeek V3.2 Exp", + "id": "gpt-5-mini", + "name": "GPT-5 Mini", + "display_name": "GPT-5 Mini", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 164000, - "output": 164000 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "release_date": "2025-10-10", - "last_updated": "2025-10-10", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "minimal", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2024-05-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "mistralai/Mistral-Small-3.2-24B-Instruct-2506", - "name": "Mistral Small 3.2 24B Instruct", - "display_name": "Mistral Small 3.2 24B Instruct", + "id": "claude-opus-5", + "name": "Claude Opus 5", + "display_name": "Claude Opus 5", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 32768, - "output": 8192 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } }, "attachment": true, - "open_weights": true, - "knowledge": "2024-10", - "release_date": "2025-06-20", - "last_updated": "2025-06-20", + "open_weights": false, + "knowledge": "2026-05", + "release_date": "2026-07-24", + "last_updated": "2026-07-24", "type": "chat" }, { - "id": "mistralai/Mistral-Nemo-Instruct-2407", - "name": "Mistral Nemo Instruct 2407", - "display_name": "Mistral Nemo Instruct 2407", + "id": "gemini-3-6-flash", + "name": "Gemini 3.6 Flash", + "display_name": "Gemini 3.6 Flash", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, + "context": 1048576, "output": 65536 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-07", - "release_date": "2024-07-18", - "last_updated": "2024-07-18", + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "minimal", + "low", + "medium", + "high" + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2026-03", + "release_date": "2026-07-21", + "last_updated": "2026-07-21", "type": "chat" }, { - "id": "meta-llama/Llama-3.3-70B-Instruct", - "name": "Llama 3.3 70B Instruct", - "display_name": "Llama 3.3 70B Instruct", + "id": "gpt-5-5", + "name": "GPT-5.5", + "display_name": "GPT-5.5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 16384 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2023-12", - "release_date": "2024-12-06", - "last_updated": "2024-12-06", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-12-01", + "release_date": "2026-04-23", + "last_updated": "2026-04-23", "type": "chat" - } - ] - }, - "neuralwatt": { - "id": "neuralwatt", - "name": "Neuralwatt", - "display_name": "Neuralwatt", - "api": "https://api.neuralwatt.com/v1", - "doc": "https://portal.neuralwatt.com/docs", - "models": [ + }, { - "id": "mimo-v2.6-pro", - "name": "MiMo-V2.6-Pro", - "display_name": "MiMo-V2.6-Pro", + "id": "gemini-3-1-pro", + "name": "Gemini 3.1 Pro Preview Custom Tools", + "display_name": "Gemini 3.1 Pro Preview Custom Tools", "modalities": { "input": [ "text", "image", - "audio" + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048560, - "output": 393216 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -82791,37 +81363,39 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, "effort_options": [ - "none", + "low", + "medium", "high" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2026-02-19", + "last_updated": "2026-02-19", "type": "chat" }, { - "id": "deepseek-v4-flash", - "name": "DeepSeek V4 Flash", - "display_name": "DeepSeek V4 Flash", + "id": "gpt-6-sol", + "name": "GPT-6 Sol", + "display_name": "GPT-6 Sol", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048560, - "output": 393216 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -82829,87 +81403,78 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", "effort_options": [ + "none", "low", + "medium", "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." + "xhigh" ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "attachment": true, + "open_weights": false, + "knowledge": "2026-04-20", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "qwen3.6-35b-fast", - "name": "Qwen3.6 35B Fast", - "display_name": "Qwen3.6 35B Fast", + "id": "gpt-oss-120b", + "name": "GPT OSS 120B", + "display_name": "GPT OSS 120B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 131056, - "output": 131056 + "context": 131072, + "output": 25000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "low", + "medium", + "high" ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-04-17", - "last_updated": "2026-04-17", + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "glm-5.3-flex", - "name": "GLM 5.3 Flex", - "display_name": "GLM 5.3 Flex", + "id": "inkling", + "name": "Inkling", + "display_name": "Inkling", "modalities": { "input": [ - "text" + "text", + "image", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 1048560, - "output": 1048560 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -82919,75 +81484,101 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, "effort_options": [ + "none", + "minimal", "low", + "medium", "high", "max" ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "release_date": "2026-07-15", + "last_updated": "2026-07-15", "type": "chat" }, { - "id": "kimi-k2.7-code-flex", - "name": "Kimi K2.7 Code Flex", - "display_name": "Kimi K2.7 Code Flex", + "id": "claude-opus-4-5", + "name": "Claude Opus 4.5 (latest)", + "display_name": "Claude Opus 4.5 (latest)", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262128, - "output": 262128 + "context": 200000, + "output": 64000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", + "effort_options": [ + "low", + "medium", + "high" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." + ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-06-12", - "last_updated": "2026-06-12", + "open_weights": false, + "knowledge": "2025-05", + "release_date": "2025-11-24", + "last_updated": "2025-11-24", "type": "chat" }, { - "id": "kimi-k3-flex", - "name": "Kimi K3 Flex", - "display_name": "Kimi K3 Flex", + "id": "gemini-3-1-flash-lite", + "name": "Gemini 3.1 Flash Lite Preview", + "display_name": "Gemini 3.1 Flash Lite Preview", "modalities": { "input": [ "text", - "image" + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048560, - "output": 1048560 + "context": 1048576, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -82995,38 +81586,37 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, "effort_options": [ - "none", "low", - "high", - "max" + "medium", + "high" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-16", + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2026-03-03", + "last_updated": "2026-03-03", "type": "chat" }, { - "id": "kimi-k2.7-code", - "name": "Kimi K2.7 Code", - "display_name": "Kimi K2.7 Code", + "id": "claude-haiku-5-5", + "name": "Claude Haiku 5.5", + "display_name": "Claude Haiku 5.5", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262128, - "output": 262128 + "context": 1000000, + "output": 128000 }, "temperature": false, "tool_call": true, @@ -83034,23 +81624,17 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true - } - }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-06-12", - "last_updated": "2026-06-12", + "open_weights": false, + "knowledge": "2026-06", + "release_date": "2026-10-07", + "last_updated": "2026-10-07", "type": "chat" }, { - "id": "kimi-k2.7-code-fast", - "name": "Kimi K2.7 Code Fast", - "display_name": "Kimi K2.7 Code Fast", + "id": "gpt-5", + "name": "GPT-5", + "display_name": "GPT-5", "modalities": { "input": [ "text", @@ -83061,8 +81645,8 @@ ] }, "limit": { - "context": 262128, - "output": 262128 + "context": 400000, + "output": 128000 }, "temperature": false, "tool_call": true, @@ -83073,31 +81657,48 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "minimal", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-06-12", - "last_updated": "2026-06-12", + "open_weights": false, + "knowledge": "2024-09-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "deepseek-v4-flash-speed", - "name": "DeepSeek V4 Flash (Speed)", - "display_name": "DeepSeek V4 Flash (Speed)", + "id": "gpt-5-3-codex", + "name": "GPT-5.3 Codex", + "display_name": "GPT-5.3 Codex", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048560, - "output": 393216 + "context": 400000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -83108,25 +81709,35 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ - "none", + "low", + "medium", "high", - "max" - ] + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-07-31", - "last_updated": "2026-07-31", + "attachment": true, + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-02-05", + "last_updated": "2026-02-05", "type": "chat" }, { - "id": "glm-5.3", - "name": "GLM 5.3", - "display_name": "GLM 5.3", + "id": "glm-5-2", + "name": "GLM-5.2", + "display_name": "GLM-5.2", "modalities": { "input": [ "text" @@ -83136,8 +81747,8 @@ ] }, "limit": { - "context": 1048560, - "output": 1048560 + "context": 1000000, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -83147,10 +81758,11 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, "effort_options": [ + "none", + "minimal", "low", + "medium", "high", "max" ] @@ -83158,28 +81770,29 @@ }, "attachment": false, "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "qwen-3.8-27b-flex", - "name": "Qwen3.8 27B Flex", - "display_name": "Qwen3.8 27B Flex", + "id": "gpt-5-6-luna", + "name": "GPT-5.6 Luna", + "display_name": "GPT-5.6 Luna", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262128, - "output": 131072 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -83188,77 +81801,101 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ "none", "low", "medium", - "xhigh" - ] + "high", + "xhigh", + "max" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, - "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "open_weights": false, + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "deepseek-v4-flash-flex", - "name": "DeepSeek V4 Flash Flex", - "display_name": "DeepSeek V4 Flash Flex", + "id": "gpt-5-1", + "name": "GPT-5.1", + "display_name": "GPT-5.1", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048560, - "output": 393216 + "context": 400000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", "effort_options": [ "none", - "high", - "max" - ] - } + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "attachment": true, + "open_weights": false, + "knowledge": "2024-09-30", + "release_date": "2025-11-13", + "last_updated": "2025-11-13", "type": "chat" }, { - "id": "kimi-k3", - "name": "Kimi K3", - "display_name": "Kimi K3", + "id": "claude-sonnet-5-5", + "name": "Claude Sonnet 5.5", + "display_name": "Claude Sonnet 5.5", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048560, - "output": 1048560 + "context": 1000000, + "output": 128000 }, "temperature": false, "tool_call": true, @@ -83268,78 +81905,89 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, "effort_options": [ - "none", "low", + "medium", "high", + "xhigh", "max" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-16", + "open_weights": false, + "knowledge": "2026-06", + "release_date": "2026-09-28", + "last_updated": "2026-09-28", "type": "chat" }, { - "id": "mimo-v2.6-pro-flex", - "name": "MiMo-V2.6-Pro Flex", - "display_name": "MiMo-V2.6-Pro Flex", + "id": "claude-opus-4-1", + "name": "Claude Opus 4.1 (latest)", + "display_name": "Claude Opus 4.1 (latest)", "modalities": { "input": [ "text", "image", - "audio" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048560, - "output": 393216 + "context": 200000, + "output": 32000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, "interleaved": true, - "effort_options": [ - "none", - "high" + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "open_weights": false, + "knowledge": "2025-03-31", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "glm-5.3-flash-flex", - "name": "GLM-5.3 Flash Flex", - "display_name": "GLM-5.3 Flash Flex", + "id": "glm-5-3", + "name": "GLM-5.3", + "display_name": "GLM-5.3", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048560, - "output": 1048560 + "context": 1048576, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -83349,8 +81997,6 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, "effort_options": [ "low", "high", @@ -83358,30 +82004,31 @@ ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "gemma-4-31b", - "name": "Gemma 4 31B", - "display_name": "Gemma 4 31B", + "id": "claude-sonnet-5", + "name": "Claude Sonnet 5", + "display_name": "Claude Sonnet 5", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262128, - "output": 16384 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -83390,38 +82037,71 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, "effort_options": [ - "none", + "low", + "medium", + "high", + "xhigh", "max" ] } }, "attachment": true, + "open_weights": false, + "knowledge": "2026-01-31", + "release_date": "2026-06-30", + "last_updated": "2026-06-30", + "type": "chat" + }, + { + "id": "meta-llama-3-3-70b-instruct", + "name": "Llama-3.3-70B-Instruct", + "display_name": "Llama-3.3-70B-Instruct", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 128000, + "output": 8192 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": false, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "knowledge": "2023-12", + "release_date": "2024-12-06", + "last_updated": "2024-12-06", "type": "chat" }, { - "id": "deepseek-v4.1-flash-flex", - "name": "DeepSeek V4.1 Flash Flex", - "display_name": "DeepSeek V4.1 Flash Flex", + "id": "gemini-4-argon", + "name": "Gemini 4 Argon", + "display_name": "Gemini 4 Argon", "modalities": { "input": [ "text", - "image" + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048560, - "output": 393216 + "context": 1048576, + "output": 65536 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -83429,40 +82109,37 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, "effort_options": [ - "none", "low", - "high", - "xhigh", - "max" + "medium", + "high" ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-10-17", - "last_updated": "2026-10-17", + "open_weights": false, + "knowledge": "2026-03", + "release_date": "2026-10-13", + "last_updated": "2026-10-13", "type": "chat" }, { - "id": "deepseek-v4.1-flash", - "name": "DeepSeek V4.1 Flash", - "display_name": "DeepSeek V4.1 Flash", + "id": "kimi-k3", + "name": "Kimi K3", + "display_name": "Kimi K3", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1048560, - "output": 393216 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -83473,41 +82150,43 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, "effort_options": [ "none", + "minimal", "low", + "medium", "high", - "xhigh", "max" ] } }, "attachment": true, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-10-17", - "last_updated": "2026-10-17", + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" }, { - "id": "qwen3.6-35b", - "name": "Qwen3.6 35B", - "display_name": "Qwen3.6 35B", + "id": "gemini-3-7-flash", + "name": "Gemini 3.7 Flash", + "display_name": "Gemini 3.7 Flash", "modalities": { "input": [ "text", - "image" + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131056, - "output": 131056 + "context": 1048576, + "output": 65536 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -83515,29 +82194,24 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ - "none", + "low", + "medium", "high" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-04-17", - "last_updated": "2026-04-17", + "open_weights": false, + "knowledge": "2026-03", + "release_date": "2026-08-13", + "last_updated": "2026-08-13", "type": "chat" }, { - "id": "qwen3.6-35b-flex", - "name": "Qwen3.6 35B Flex", - "display_name": "Qwen3.6 35B Flex", + "id": "llama-4-maverick", + "name": "Llama 4 Maverick 17B Instruct", + "display_name": "Llama 4 Maverick 17B Instruct", "modalities": { "input": [ "text", @@ -83548,54 +82222,40 @@ ] }, "limit": { - "context": 131056, - "output": 131056 + "context": 1000000, + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "none", - "high" - ] - } + "supported": false }, "attachment": true, "open_weights": true, - "release_date": "2026-04-17", - "last_updated": "2026-04-17", + "knowledge": "2024-08", + "release_date": "2025-04-05", + "last_updated": "2025-04-05", "type": "chat" }, { - "id": "glm-5.3-flash", - "name": "GLM-5.3 Flash", - "display_name": "GLM-5.3 Flash", + "id": "gpt-5-6-sol", + "name": "GPT-5.6 Sol", + "display_name": "GPT-5.6 Sol", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048560, - "output": 1048560 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -83604,52 +82264,80 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ + "none", "low", + "medium", "high", + "xhigh", "max" - ] + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, - "open_weights": true, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", + "open_weights": false, + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "kimi-k3-fast", - "name": "Kimi K3 Fast", - "display_name": "Kimi K3 Fast", + "id": "gpt-6-astra", + "name": "GPT-6 Astra", + "display_name": "GPT-6 Astra", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048560, - "output": 1048560 + "context": 1050000, + "output": 128000 }, "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } }, "attachment": true, - "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-16", + "open_weights": false, + "knowledge": "2026-04-30", + "release_date": "2026-09-04", + "last_updated": "2026-09-04", "type": "chat" }, { - "id": "qwen-3.8-27b", - "name": "Qwen3.8 27B", - "display_name": "Qwen3.8 27B", + "id": "gpt-5-nano", + "name": "GPT-5 Nano", + "display_name": "GPT-5 Nano", "modalities": { "input": [ "text", @@ -83660,10 +82348,10 @@ ] }, "limit": { - "context": 262128, - "output": 131072 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -83672,47 +82360,50 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ - "none", + "minimal", "low", "medium", - "xhigh" - ] + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, - "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "open_weights": false, + "knowledge": "2024-05-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" - } - ] - }, - "vancine": { - "id": "vancine", - "name": "Vancine", - "display_name": "Vancine", - "api": "https://vancine.com/v1", - "doc": "https://vancine.com/docs", - "models": [ + }, { - "id": "hy4-preview", - "name": "Hy4 preview", - "display_name": "Hy4 preview", + "id": "gpt-5-6-terra", + "name": "GPT-5.6 Terra", + "display_name": "GPT-5.6 Terra", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1024000, - "output": 64000 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -83721,27 +82412,50 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ "none", + "low", + "medium", + "high", + "xhigh", + "max" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", "high" - ] + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-08-28", - "last_updated": "2026-08-28", + "attachment": true, + "open_weights": false, + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" - }, + } + ] + }, + "model-oracle-ai": { + "id": "model-oracle-ai", + "name": "Model Oracle AI", + "display_name": "Model Oracle AI", + "api": "https://api.modeloracle.com/api/v1", + "doc": "https://modeloracle.com/setup/", + "models": [ { - "id": "qwen3.8-max", - "name": "Qwen3.8 Max", - "display_name": "Qwen3.8 Max", + "id": "claude-fable-5", + "name": "Claude Fable 5", + "display_name": "Claude Fable 5", "modalities": { "input": [ "text", "image", - "video", "pdf" ], "output": [ @@ -83750,9 +82464,9 @@ }, "limit": { "context": 1000000, - "output": 131072 + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -83761,32 +82475,45 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], "interleaved": true, "summaries": true, - "visibility": "summary", + "visibility": "omitted", "continuation": [ "thinking_blocks" ], - "effort_options": [ - "low", - "medium", - "xhigh" + "notes": [ + "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", + "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", + "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-08-03", - "last_updated": "2026-08-03", + "knowledge": "2026-01-31", + "release_date": "2026-06-09", + "last_updated": "2026-06-09", "type": "chat" }, { - "id": "glm-5.3", - "name": "GLM-5.3", - "display_name": "GLM-5.3", + "id": "auto", + "name": "Auto", + "display_name": "Auto", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" @@ -83794,7 +82521,7 @@ }, "limit": { "context": 1000000, - "output": 131072 + "output": 128000 }, "temperature": true, "tool_call": true, @@ -83806,72 +82533,81 @@ "reasoning": { "supported": true, "effort_options": [ + "none", + "minimal", "low", + "medium", "high", + "xhigh", "max" ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "attachment": true, + "open_weights": false, + "release_date": "2026-06-29", + "last_updated": "2026-07-07", "type": "chat" }, { - "id": "kimi-k3", - "name": "Kimi K3", - "display_name": "Kimi K3", + "id": "claude-haiku-4.5", + "name": "Claude Haiku 4.5 (latest)", + "display_name": "Claude Haiku 4.5 (latest)", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 200000, + "output": 64000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" ], - "effort_options": [ - "low", - "high", - "max" + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-16", + "open_weights": false, + "knowledge": "2025-02-28", + "release_date": "2025-10-15", + "last_updated": "2025-10-15", "type": "chat" }, { - "id": "deepseek-v4.1-flash", - "name": "DeepSeek V4.1 Flash", - "display_name": "DeepSeek V4.1 Flash", + "id": "glm-5.2", + "name": "GLM-5.2", + "display_name": "GLM-5.2", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" @@ -83879,7 +82615,7 @@ }, "limit": { "context": 1000000, - "output": 384000 + "output": 131072 }, "temperature": true, "tool_call": true, @@ -83897,28 +82633,26 @@ "thinking_blocks" ], "effort_options": [ - "low", + "none", "high", - "max" + "xhigh" ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-09-10", - "last_updated": "2026-09-10", + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "glm-5.3-flash", - "name": "GLM-5.3-Flash", - "display_name": "GLM-5.3-Flash", + "id": "gpt-5.4", + "name": "GPT-5.4", + "display_name": "GPT-5.4", "modalities": { "input": [ "text", "image", - "video", "pdf" ], "output": [ @@ -83926,187 +82660,201 @@ ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 1050000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", "effort_options": [ + "none", "low", + "medium", "high", - "max" - ] + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, - "open_weights": true, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-03-05", + "last_updated": "2026-03-05", "type": "chat" }, { - "id": "MiniMax-M3", - "name": "MiniMax-M3", - "display_name": "MiniMax-M3", + "id": "claude-opus-4.8", + "name": "Claude Opus 4.8", + "display_name": "Claude Opus 4.8", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 512000 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], "interleaved": true, "summaries": true, - "visibility": "summary", + "visibility": "omitted", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-06-01", - "last_updated": "2026-06-01", + "open_weights": false, + "knowledge": "2026-01", + "release_date": "2026-05-28", + "last_updated": "2026-05-28", "type": "chat" }, { - "id": "qwen3.8-flash", - "name": "Qwen3.8 Flash", - "display_name": "Qwen3.8 Flash", + "id": "gpt-5.4-mini", + "name": "GPT-5.4 mini", + "display_name": "GPT-5.4 mini", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 400000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", + "knowledge": "2025-08-31", + "release_date": "2026-03-17", + "last_updated": "2026-03-17", "type": "chat" - } - ] - }, - "stepfun": { - "id": "stepfun", - "name": "StepFun (China)", - "display_name": "StepFun (China)", - "api": "https://api.stepfun.com/v1", - "doc": "https://platform.stepfun.com/docs/zh/overview/concept", - "models": [ + }, { - "id": "step-5-preview", - "name": "Step 5 Preview", - "display_name": "Step 5 Preview", + "id": "gpt-4.1", + "name": "GPT-4.1", + "display_name": "GPT-4.1", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 1047576, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": true, - "open_weights": true, - "release_date": "2026-09-16", - "last_updated": "2026-09-20", + "open_weights": false, + "knowledge": "2024-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", "type": "chat" }, { - "id": "step-3.5-flash-2603", - "name": "Step 3.5 Flash 2603", - "display_name": "Step 3.5 Flash 2603", + "id": "gpt-5", + "name": "GPT-5", + "display_name": "GPT-5", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 256000 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -84115,55 +82863,78 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ + "minimal", "low", + "medium", "high" - ] + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "attachment": true, + "open_weights": false, + "knowledge": "2024-09-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "stepaudio-2.5-asr", - "name": "StepAudio 2.5 ASR", - "display_name": "StepAudio 2.5 ASR", + "id": "claude-sonnet-5", + "name": "Claude Sonnet 5", + "display_name": "Claude Sonnet 5", "modalities": { "input": [ - "audio" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 1000000, + "output": 128000 }, "temperature": false, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } }, "attachment": true, "open_weights": false, - "release_date": "2026-04-24", - "last_updated": "2026-07-02" + "knowledge": "2026-01-31", + "release_date": "2026-06-30", + "last_updated": "2026-06-30", + "type": "chat" }, { - "id": "step-3.5-flash", - "name": "Step 3.5 Flash", - "display_name": "Step 3.5 Flash", + "id": "deepseek-v4-pro", + "name": "DeepSeek V4 Pro", + "display_name": "DeepSeek V4 Pro", "modalities": { "input": [ "text" @@ -84173,8 +82944,8 @@ ] }, "limit": { - "context": 256000, - "output": 256000 + "context": 1000000, + "output": 384000 }, "temperature": true, "tool_call": true, @@ -84185,153 +82956,103 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "high", + "max" + ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" ], - "effort_options": [ - "low", - "high" + "notes": [ + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, "attachment": false, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-01-29", - "last_updated": "2026-02-13", + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "step-tts-2", - "name": "Step TTS 2", - "display_name": "Step TTS 2", - "modalities": { - "input": [ - "text" - ], - "output": [ - "audio" - ] - }, - "limit": { - "context": 8192, - "output": 8192 - }, - "temperature": false, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": false, - "release_date": "2026-03-01", - "last_updated": "2026-07-02" - }, - { - "id": "step-3.7-flash", - "name": "Step 3.7 Flash", - "display_name": "Step 3.7 Flash", + "id": "gpt-5.4-nano", + "name": "GPT-5.4 nano", + "display_name": "GPT-5.4 nano", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 256000 + "context": 400000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], + "default_enabled": false, + "mode": "effort", + "effort": "none", "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ "low", "medium", "high" - ] + ], + "visibility": "hidden" } }, "attachment": true, - "open_weights": true, - "knowledge": "2026-03-01", - "release_date": "2026-05-29", - "last_updated": "2026-05-29", + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-03-17", + "last_updated": "2026-03-17", "type": "chat" }, { - "id": "stepaudio-2.5-tts", - "name": "StepAudio 2.5 TTS", - "display_name": "StepAudio 2.5 TTS", - "modalities": { - "input": [ - "text" - ], - "output": [ - "audio" - ] - }, - "limit": { - "context": 8192, - "output": 8192 - }, - "temperature": false, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": false, - "release_date": "2026-04-16", - "last_updated": "2026-07-02" - } - ] - }, - "prime": { - "id": "prime", - "name": "Prime Inference", - "display_name": "Prime Inference", - "api": "https://api.pinference.ai/api/v1", - "doc": "https://docs.primeintellect.ai/inference/overview", - "models": [ - { - "id": "meta/muse-spark-open", - "name": "Muse Spark Open", - "display_name": "Muse Spark Open", + "id": "gpt-5.5", + "name": "GPT-5.5", + "display_name": "GPT-5.5", "modalities": { "input": [ "text", "image", - "video", - "audio" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 943718 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -84339,37 +83060,49 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ "low", "medium", "high", "xhigh" - ] + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, - "open_weights": true, - "knowledge": "2026-01-04", - "release_date": "2026-10-15", - "last_updated": "2026-10-15", + "open_weights": false, + "knowledge": "2025-12-01", + "release_date": "2026-04-23", + "last_updated": "2026-04-23", "type": "chat" }, { - "id": "google/gemma-3-27b-it", - "name": "Gemma 3 27B", - "display_name": "Gemma 3 27B", + "id": "gpt-4.1-mini", + "name": "GPT-4.1 mini", + "display_name": "GPT-4.1 mini", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 117964 + "context": 1047576, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -84377,32 +83110,30 @@ "supported": false }, "attachment": true, - "open_weights": true, - "knowledge": "2024-08", - "release_date": "2025-03-12", - "last_updated": "2025-03-12", + "open_weights": false, + "knowledge": "2024-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", "type": "chat" }, { - "id": "google/gemini-4-argon", - "name": "Gemini 4 Argon", - "display_name": "Gemini 4 Argon", + "id": "o4-mini", + "name": "o4-mini", + "display_name": "o4-mini", "modalities": { "input": [ - "audio", - "image", "text", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 943718 + "context": 200000, + "output": 100000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -84410,30 +83141,42 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ "low", "medium", "high" - ] + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-10-13", - "last_updated": "2026-10-13", + "knowledge": "2024-05", + "release_date": "2025-04-16", + "last_updated": "2025-04-16", "type": "chat" - }, + } + ] + }, + "nvidia": { + "id": "nvidia", + "name": "Nvidia", + "display_name": "Nvidia", + "api": "https://integrate.api.nvidia.com/v1", + "doc": "https://docs.api.nvidia.com/nim/", + "models": [ { - "id": "google/gemini-3.5-flash", - "name": "Gemini 3.5 Flash", - "display_name": "Gemini 3.5 Flash", + "id": "stepfun-ai/step-5-preview", + "name": "Step 5 Preview", + "display_name": "Step 5 Preview", "modalities": { "input": [ "text", - "image", - "video", - "audio" + "image" ], "output": [ "text" @@ -84441,7 +83184,7 @@ }, "limit": { "context": 1048576, - "output": 65536 + "output": 1048576 }, "temperature": true, "tool_call": true, @@ -84452,38 +83195,37 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", - "low", - "medium", - "high" - ], + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" + ], + "effort_options": [ + "none", + "minimal", + "low", + "medium", + "high", + "xhigh", + "max" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-05-19", - "last_updated": "2026-05-19", + "open_weights": true, + "release_date": "2026-09-16", + "last_updated": "2026-09-20", "type": "chat" }, { - "id": "google/gemini-3.1-pro-preview", - "name": "Gemini 3.1 Pro Preview", - "display_name": "Gemini 3.1 Pro Preview", + "id": "minimaxai/minimax-m3.1-flash", + "name": "MiniMax-M3.1-Flash", + "display_name": "MiniMax-M3.1-Flash", "modalities": { "input": [ - "audio", - "image", "text", + "image", "video" ], "output": [ @@ -84491,8 +83233,8 @@ ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, @@ -84503,45 +83245,44 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "low", - "high" - ], + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" + ], + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-02-19", - "last_updated": "2026-02-19", + "release_date": "2026-10-19", + "last_updated": "2026-10-19", "type": "chat" }, { - "id": "google/gemini-3.8-flash", - "name": "Gemini 3.8 Flash", - "display_name": "Gemini 3.8 Flash", + "id": "moonshotai/kimi-k2.6", + "name": "Kimi K2.6", + "display_name": "Kimi K2.6", "modalities": { "input": [ "text", "image", - "video", - "audio" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, @@ -84552,88 +83293,38 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", - "low", - "medium", - "high" - ], + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" - ] - } - }, - "attachment": true, - "open_weights": false, - "release_date": "2026-09-02", - "last_updated": "2026-09-02", - "type": "chat" - }, - { - "id": "google/gemini-3.7-flash", - "name": "Gemini 3.7 Flash", - "display_name": "Gemini 3.7 Flash", - "modalities": { - "input": [ - "text", - "image", - "video", - "audio" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 1048576, - "output": 65536 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ + "thinking_blocks" + ], + "effort_options": [ + "none", "minimal", "low", "medium", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" + "high", + "xhigh", + "max" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-08-13", - "last_updated": "2026-08-13", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-04-20", + "last_updated": "2026-04-20", "type": "chat" }, { - "id": "google/gemini-3-flash-preview", - "name": "Gemini 3 Flash Preview", - "display_name": "Gemini 3 Flash Preview", + "id": "moonshotai/kimi-k3", + "name": "Kimi K3", + "display_name": "Kimi K3", "modalities": { "input": [ "text", "image", - "audio", "video" ], "output": [ @@ -84642,9 +83333,9 @@ }, "limit": { "context": 1048576, - "output": 65536 + "output": 131072 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -84653,204 +83344,149 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", - "low", - "medium", - "high" - ], + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" + ], + "effort_options": [ + "low", + "high", + "max" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-12-17", - "last_updated": "2025-12-17", + "open_weights": true, + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" }, { - "id": "google/gemini-3.6-flash", - "name": "Gemini 3.6 Flash", - "display_name": "Gemini 3.6 Flash", + "id": "black-forest-labs/flux_1-kontext-dev", + "name": "FLUX.1-Kontext-dev", + "display_name": "FLUX.1-Kontext-dev", "modalities": { "input": [ "text", - "image", - "video", - "audio" + "image" ], "output": [ - "text" + "image" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 8192, + "output": 8192 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", - "low", - "medium", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] - } + "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-07-21", - "last_updated": "2026-07-21", - "type": "chat" + "open_weights": true, + "release_date": "2025-05-29", + "last_updated": "2025-05-29" }, { - "id": "moonshotai/kimi-k2-0905", - "name": "Kimi K2 0905", - "display_name": "Kimi K2 0905", + "id": "black-forest-labs/flux.1-dev", + "name": "FLUX.1-dev", + "display_name": "FLUX.1-dev", "modalities": { "input": [ "text" ], "output": [ - "text" + "image" ] }, "limit": { - "context": 262144, - "output": 98304 + "context": 8192, + "output": 8192 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { "supported": false }, "attachment": false, "open_weights": true, - "release_date": "2025-09-05", - "last_updated": "2025-09-05", - "type": "chat" + "knowledge": "2024-08", + "release_date": "2024-08-01", + "last_updated": "2024-08-01" }, { - "id": "moonshotai/kimi-k3", - "name": "Kimi K3", - "display_name": "Kimi K3", + "id": "black-forest-labs/flux_2-klein-4b", + "name": "FLUX.2 Klein 4B", + "display_name": "FLUX.2 Klein 4B", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ - "text" + "image" ] }, "limit": { - "context": 1048576, - "output": 943718 + "context": 8192, + "output": 8192 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "none", - "low", - "high", - "max" - ] - } + "supported": false }, "attachment": true, "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-16", - "type": "chat" + "knowledge": "2025-06", + "release_date": "2026-01-15", + "last_updated": "2026-01-15" }, { - "id": "moonshotai/kimi-k3.1-pro", - "name": "Kimi K3.1 Pro", - "display_name": "Kimi K3.1 Pro", + "id": "black-forest-labs/flux_1-schnell", + "name": "FLUX.1-schnell", + "display_name": "FLUX.1-schnell", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ - "text" + "image" ] }, "limit": { - "context": 1048576, - "output": 943718 + "context": 8192, + "output": 8192 }, "temperature": false, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "low", - "high", - "max" - ] - } + "supported": false }, - "attachment": true, - "open_weights": false, - "release_date": "2026-10-23", - "last_updated": "2026-10-23", - "type": "chat" + "attachment": false, + "open_weights": true, + "knowledge": "2024-07", + "release_date": "2024-08-01", + "last_updated": "2024-08-01" }, { - "id": "x-ai/grok-4.7", - "name": "Grok 4.7", - "display_name": "Grok 4.7", + "id": "openai/gpt-oss-20b", + "name": "GPT OSS 20B", + "display_name": "GPT OSS 20B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 500000, - "output": 450000 + "context": 131072, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -84860,66 +83496,52 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ "low", "medium", - "high", - "xhigh" + "high" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-05", - "release_date": "2026-09-21", - "last_updated": "2026-09-21", + "attachment": false, + "open_weights": true, + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "x-ai/grok-4.6", - "name": "Grok 4.6", - "display_name": "Grok 4.6", + "id": "openai/whisper-large-v3", + "name": "Whisper Large v3", + "display_name": "Whisper Large v3", "modalities": { "input": [ - "text", - "image" + "audio" ], "output": [ "text" ] }, "limit": { - "context": 500000, - "output": 450000 + "context": 448, + "output": 4096 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ] - } + "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2026-02-01", - "release_date": "2026-08-12", - "last_updated": "2026-08-12", - "type": "chat" + "open_weights": true, + "knowledge": "2023-09", + "release_date": "2023-11-06", + "last_updated": "2023-11-06" }, { - "id": "openai/gpt-5.2", - "name": "GPT-5.2", - "display_name": "GPT-5.2", + "id": "nvidia/llama-nemotron-embed-vl-1b-v2", + "name": "llama-nemotron-embed-vl-1b-v2", + "display_name": "llama-nemotron-embed-vl-1b-v2", "modalities": { "input": [ "text", @@ -84930,51 +83552,26 @@ ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 8192, + "output": 2048 }, "temperature": false, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2025-12-11", - "last_updated": "2025-12-11", - "type": "chat" + "open_weights": true, + "release_date": "2025-12-18", + "last_updated": "2025-12-18", + "type": "embedding" }, { - "id": "openai/gpt-5.6-luna-pro", - "name": "GPT-5.6 Luna Pro", - "display_name": "GPT-5.6 Luna Pro", + "id": "nvidia/llama-3.1-nemotron-ultra-253b-v1", + "name": "Llama 3.1 Nemotron Ultra 253B", + "display_name": "Llama 3.1 Nemotron Ultra 253B", "modalities": { "input": [ - "image", "text" ], "output": [ @@ -84982,93 +83579,53 @@ ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 128000, + "output": 16384 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ] - } - }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "attachment": false, + "open_weights": true, + "release_date": "2025-04-07", + "last_updated": "2025-04-07", "type": "chat" }, { - "id": "openai/gpt-5.4-mini", - "name": "GPT-5.4 Mini", - "display_name": "GPT-5.4 Mini", + "id": "nvidia/rerank-qa-mistral-4b", + "name": "rerank-qa-mistral-4b", + "display_name": "rerank-qa-mistral-4b", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 128000, + "output": 4096 }, "temperature": false, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-17", - "last_updated": "2026-03-17", - "type": "chat" + "attachment": false, + "open_weights": true, + "release_date": "2024-03-17", + "last_updated": "2025-01-17" }, { - "id": "openai/gpt-5.6-sol", - "name": "GPT-5.6 Sol", - "display_name": "GPT-5.6 Sol", + "id": "nvidia/riva-translate-4b-instruct-v1.1", + "name": "riva-translate-4b-instruct-v1_1", + "display_name": "riva-translate-4b-instruct-v1_1", "modalities": { "input": [ - "image", "text" ], "output": [ @@ -85076,104 +83633,58 @@ ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 128000, + "output": 4096 }, "temperature": false, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "attachment": false, + "open_weights": true, + "release_date": "2025-12-12", + "last_updated": "2025-12-12", "type": "chat" }, { - "id": "openai/gpt-5-nano", - "name": "GPT-5 Nano", - "display_name": "GPT-5 Nano", + "id": "nvidia/cosmos-reason2-8b", + "name": "Cosmos Reason2 8B", + "display_name": "Cosmos Reason2 8B", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 131072, + "output": 16384 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "minimal", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } - }, "attachment": true, - "open_weights": false, - "knowledge": "2024-05-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "open_weights": true, + "release_date": "2025-12-01", + "last_updated": "2025-12-01", "type": "chat" }, { - "id": "openai/gpt-4o", - "name": "GPT-4o", - "display_name": "GPT-4o", + "id": "nvidia/nemotron-voicechat", + "name": "nemotron-voicechat", + "display_name": "nemotron-voicechat", "modalities": { "input": [ "text", - "image" + "audio" ], "output": [ "text" @@ -85181,7 +83692,7 @@ }, "limit": { "context": 128000, - "output": 16384 + "output": 8192 }, "temperature": true, "tool_call": true, @@ -85189,124 +83700,99 @@ "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2023-09", - "release_date": "2024-05-13", - "last_updated": "2024-08-06", + "open_weights": true, + "release_date": "2026-03-16", + "last_updated": "2026-03-16", "type": "chat" }, { - "id": "openai/gpt-5.4-nano", - "name": "GPT-5.4 Nano", - "display_name": "GPT-5.4 Nano", + "id": "nvidia/synthetic-video-detector", + "name": "synthetic-video-detector", + "display_name": "synthetic-video-detector", "modalities": { "input": [ - "text", - "image" + "video" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 8192, + "output": 4096 }, "temperature": false, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-17", - "last_updated": "2026-03-17", + "open_weights": true, + "release_date": "2026-04-16", + "last_updated": "2026-04-16", "type": "chat" }, { - "id": "openai/gpt-5.6-luna", - "name": "GPT-5.6 Luna", - "display_name": "GPT-5.6 Luna", + "id": "nvidia/cosmos-transfer2_5-2b", + "name": "cosmos-transfer2.5-2b", + "display_name": "cosmos-transfer2.5-2b", "modalities": { "input": [ + "text", "image", - "text" + "video" ], "output": [ - "text" + "video" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 8192, + "output": 4096 }, "temperature": false, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "attachment": true, + "open_weights": true, + "release_date": "2026-02-26", + "last_updated": "2026-02-26" + }, + { + "id": "nvidia/active-speaker-detection", + "name": "Active Speaker Detection", + "display_name": "Active Speaker Detection", + "modalities": { + "input": [ + "video" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 8192, + "output": 4096 + }, + "temperature": false, + "tool_call": false, + "reasoning": { + "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "open_weights": true, + "release_date": "2026-04-16", + "last_updated": "2026-04-16", "type": "chat" }, { - "id": "openai/gpt-5.6-terra", - "name": "GPT-5.6 Terra", - "display_name": "GPT-5.6 Terra", + "id": "nvidia/nemotron-3.5-lightning-30b-a3b", + "name": "Nemotron 3.5 Lightning 30B A3B", + "display_name": "Nemotron 3.5 Lightning 30B A3B", "modalities": { "input": [ - "image", "text" ], "output": [ @@ -85314,63 +83800,42 @@ ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 262144, + "output": 262144 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } - }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "attachment": false, + "open_weights": true, + "knowledge": "2025-09", + "release_date": "2026-08-11", + "last_updated": "2026-08-11", "type": "chat" }, { - "id": "openai/gpt-6-sol", - "name": "GPT-6 Sol", - "display_name": "GPT-6 Sol", + "id": "nvidia/nemotron-3-nano-omni-30b-a3b-reasoning", + "name": "Nemotron 3 Nano Omni", + "display_name": "Nemotron 3 Nano Omni", "modalities": { "input": [ + "text", "image", - "text" + "video", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 256000, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -85378,69 +83843,46 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ] + "supported": true } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-04-20", - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "open_weights": true, + "release_date": "2026-04-28", + "last_updated": "2026-04-28", "type": "chat" }, { - "id": "openai/gpt-5.6-sol-pro", - "name": "GPT-5.6 Sol Pro", - "display_name": "GPT-5.6 Sol Pro", + "id": "nvidia/streampetr", + "name": "streampetr", + "display_name": "streampetr", "modalities": { "input": [ - "image", - "text" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 128000, + "output": 8192 }, "temperature": false, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ] - } + "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "open_weights": true, + "release_date": "2025-11-13", + "last_updated": "2025-11-13", "type": "chat" }, { - "id": "openai/gpt-5.3-codex", - "name": "GPT-5.3-Codex", - "display_name": "GPT-5.3-Codex", + "id": "nvidia/llama-nemotron-rerank-vl-1b-v2", + "name": "llama-nemotron-rerank-vl-1b-v2", + "display_name": "llama-nemotron-rerank-vl-1b-v2", "modalities": { "input": [ "text", @@ -85451,50 +83893,25 @@ ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 10240, + "output": 4096 }, "temperature": false, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-05", - "last_updated": "2026-02-05", - "type": "chat" + "open_weights": true, + "release_date": "2025-12-18", + "last_updated": "2025-12-18" }, { - "id": "openai/gpt-6.1-sol", - "name": "GPT-6.1 Sol", - "display_name": "GPT-6.1 Sol", + "id": "nvidia/llama-3.1-nemotron-safety-guard-8b-v3", + "name": "llama-3.1-nemotron-safety-guard-8b-v3", + "display_name": "llama-3.1-nemotron-safety-guard-8b-v3", "modalities": { "input": [ - "image", "text" ], "output": [ @@ -85502,37 +83919,24 @@ ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 128000, + "output": 4096 }, "temperature": false, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ] - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-04-30", - "release_date": "2026-09-29", - "last_updated": "2026-09-29", + "attachment": false, + "open_weights": true, + "release_date": "2025-10-28", + "last_updated": "2025-10-28", "type": "chat" }, { - "id": "openai/gpt-5.4", - "name": "GPT-5.4", - "display_name": "GPT-5.4", + "id": "nvidia/nemotron-3.5-content-safety", + "name": "Nemotron 3.5 Content Safety", + "display_name": "Nemotron 3.5 Content Safety", "modalities": { "input": [ "text", @@ -85543,62 +83947,51 @@ ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 128000, + "output": 8192 }, - "temperature": false, - "tool_call": true, + "temperature": true, + "tool_call": false, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-05", - "last_updated": "2026-03-05", + "open_weights": true, + "release_date": "2026-06-02", + "last_updated": "2026-06-02", "type": "chat" }, { - "id": "openai/gpt-5.6-terra-pro", - "name": "GPT-5.6 Terra Pro", - "display_name": "GPT-5.6 Terra Pro", + "id": "nvidia/nemotron-3.5-super-vl-120b-a12b", + "name": "Nemotron 3.5 Super VL 120B A12B", + "display_name": "Nemotron 3.5 Super VL 120B A12B", "modalities": { "input": [ + "text", "image", - "text" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1048576, + "output": 8192 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -85606,149 +83999,106 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "open_weights": true, + "release_date": "2026-10-15", + "last_updated": "2026-10-15", "type": "chat" }, { - "id": "openai/gpt-5.1", - "name": "GPT-5.1", - "display_name": "GPT-5.1", + "id": "nvidia/llama-3.1-nemotron-70b-instruct", + "name": "Llama 3.1 Nemotron 70B Instruct", + "display_name": "Llama 3.1 Nemotron 70B Instruct", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 128000, + "output": 8192 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-11-13", - "last_updated": "2025-11-13", + "attachment": false, + "open_weights": true, + "release_date": "2025-04-15", + "last_updated": "2025-04-15", "type": "chat" }, { - "id": "openai/gpt-4.1-mini", - "name": "GPT-4.1 Mini", - "display_name": "GPT-4.1 Mini", + "id": "nvidia/magpie-tts-zeroshot", + "name": "magpie-tts-zeroshot", + "display_name": "magpie-tts-zeroshot", "modalities": { "input": [ - "image", - "text" + "text", + "audio" ], "output": [ - "text" + "audio" ] }, "limit": { - "context": 1047576, - "output": 32768 + "context": 8192, + "output": 4096 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-04-14", - "last_updated": "2025-04-14", - "type": "chat" + "open_weights": true, + "release_date": "2025-05-22", + "last_updated": "2025-06-12" }, { - "id": "openai/gpt-6-astra", - "name": "GPT-6 Astra", - "display_name": "GPT-6 Astra", + "id": "nvidia/bevformer", + "name": "bevformer", + "display_name": "bevformer", "modalities": { "input": [ - "image", - "text" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 128000, + "output": 8192 }, "temperature": false, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ] - } + "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2026-04-30", - "release_date": "2026-09-04", - "last_updated": "2026-09-04", + "open_weights": true, + "release_date": "2025-03-18", + "last_updated": "2025-07-20", "type": "chat" }, { - "id": "openai/gpt-oss-120b", - "name": "gpt-oss-120b", - "display_name": "gpt-oss-120b", + "id": "nvidia/nemotron-3-ultra-550b-a55b", + "name": "Nemotron 3 Ultra 550B A55B", + "display_name": "Nemotron 3 Ultra 550B A55B", "modalities": { "input": [ "text" @@ -85758,7 +84108,7 @@ ] }, "limit": { - "context": 131072, + "context": 1000000, "output": 65536 }, "temperature": true, @@ -85771,7 +84121,7 @@ "reasoning": { "supported": true, "effort_options": [ - "low", + "none", "medium", "high" ] @@ -85779,70 +84129,99 @@ }, "attachment": false, "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "knowledge": "2025-09", + "release_date": "2026-06-04", + "last_updated": "2026-06-04", "type": "chat" }, { - "id": "openai/gpt-5.5", - "name": "GPT-5.5", - "display_name": "GPT-5.5", + "id": "nvidia/sparsedrive", + "name": "sparsedrive", + "display_name": "sparsedrive", "modalities": { "input": [ - "image", - "text" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 128000, + "output": 8192 }, "temperature": false, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "attachment": true, + "open_weights": true, + "release_date": "2025-03-18", + "last_updated": "2025-07-20", + "type": "chat" + }, + { + "id": "nvidia/studiovoice", + "name": "studiovoice", + "display_name": "studiovoice", + "modalities": { + "input": [ + "audio" + ], + "output": [ + "audio" + ] + }, + "limit": { + "context": 8192, + "output": 8192 + }, + "temperature": false, + "tool_call": false, + "reasoning": { + "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2025-12-01", - "release_date": "2026-04-23", - "last_updated": "2026-04-23", + "open_weights": true, + "release_date": "2024-10-03", + "last_updated": "2025-06-13", "type": "chat" }, { - "id": "openai/gpt-4o-mini", - "name": "GPT-4o-mini", - "display_name": "GPT-4o-mini", + "id": "nvidia/usdvalidate", + "name": "usdvalidate", + "display_name": "usdvalidate", "modalities": { "input": [ - "text", - "image" + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 8192, + "output": 4096 + }, + "temperature": false, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "release_date": "2024-07-24", + "last_updated": "2025-01-08", + "type": "chat" + }, + { + "id": "nvidia/usdcode", + "name": "usdcode", + "display_name": "usdcode", + "modalities": { + "input": [ + "text" ], "output": [ "text" @@ -85850,38 +84229,36 @@ }, "limit": { "context": 128000, - "output": 16384 + "output": 4096 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2023-09", - "release_date": "2024-07-18", - "last_updated": "2024-07-18", + "release_date": "2026-01-01", + "last_updated": "2026-01-01", "type": "chat" }, { - "id": "openai/gpt-5-mini", - "name": "GPT-5 Mini", - "display_name": "GPT-5 Mini", + "id": "z-ai/glm-5.3", + "name": "GLM-5.3", + "display_name": "GLM-5.3", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 1000000, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -85890,46 +84267,41 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "minimal", - "low", - "medium", - "high" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ], - "verbosity": "medium", - "verbosity_options": [ + "effort_options": [ "low", - "medium", - "high" - ], - "visibility": "hidden" + "high", + "max" + ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-05-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "attachment": false, + "open_weights": true, + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "openai/gpt-oss-20b", - "name": "gpt-oss-20b", - "display_name": "gpt-oss-20b", + "id": "z-ai/glm-5.3-flash", + "name": "GLM-5.3-Flash", + "display_name": "GLM-5.3-Flash", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -85940,38 +84312,42 @@ "extra_capabilities": { "reasoning": { "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ "low", - "medium", - "high" + "high", + "max" ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "release_date": "2026-08-26", + "last_updated": "2026-08-26", "type": "chat" }, { - "id": "openai/gpt-5", - "name": "GPT-5", - "display_name": "GPT-5", + "id": "poolside/laguna-xs-2.1", + "name": "Laguna XS 2.1", + "display_name": "Laguna XS 2.1", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 262144, + "output": 16384 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -85979,50 +84355,62 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "minimal", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "supported": true } }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "attachment": false, + "open_weights": true, + "release_date": "2026-07-02", + "last_updated": "2026-07-02", "type": "chat" }, { - "id": "openai/gpt-6-luna", - "name": "GPT-6 Luna", - "display_name": "GPT-6 Luna", + "id": "meta/llama-3.2-11b-vision-instruct", + "name": "Llama 3.2 11b Vision Instruct", + "display_name": "Llama 3.2 11b Vision Instruct", "modalities": { "input": [ - "image", + "text", + "image" + ], + "output": [ "text" + ] + }, + "limit": { + "context": 128000, + "output": 4096 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": true, + "knowledge": "2023-12", + "release_date": "2024-09-25", + "last_updated": "2024-09-25", + "type": "chat" + }, + { + "id": "meta/muse-glimmer-30b", + "name": "Muse Glimmer 30B", + "display_name": "Muse Glimmer 30B", + "modalities": { + "input": [ + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 131072, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -86030,56 +84418,62 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ "none", + "minimal", "low", "medium", "high", - "xhigh", "max" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-05-18", - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "open_weights": true, + "knowledge": "2026-01-04", + "release_date": "2026-08-10", + "last_updated": "2026-08-10", "type": "chat" }, { - "id": "openai/gpt-4.1", - "name": "GPT-4.1", - "display_name": "GPT-4.1", + "id": "meta/llama-guard-4-12b", + "name": "Llama Guard 4 12B", + "display_name": "Llama Guard 4 12B", "modalities": { "input": [ - "image", - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1047576, - "output": 32768 + "context": 163840, + "output": 16384 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-04-14", - "last_updated": "2025-04-14", + "open_weights": true, + "release_date": "2025-04-29", + "last_updated": "2025-04-29", "type": "chat" }, { - "id": "openai/gpt-4.1-nano", - "name": "GPT-4.1 Nano", - "display_name": "GPT-4.1 Nano", + "id": "meta/llama-3.2-90b-vision-instruct", + "name": "Llama-3.2-90B-Vision-Instruct", + "display_name": "Llama-3.2-90B-Vision-Instruct", "modalities": { "input": [ "text", @@ -86090,8 +84484,8 @@ ] }, "limit": { - "context": 1047576, - "output": 942818 + "context": 128000, + "output": 8192 }, "temperature": true, "tool_call": true, @@ -86099,16 +84493,16 @@ "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-04-14", - "last_updated": "2025-04-14", + "open_weights": true, + "knowledge": "2023-12", + "release_date": "2024-09-25", + "last_updated": "2024-09-25", "type": "chat" }, { - "id": "openai/gpt-5.4-pro", - "name": "GPT-5.4 Pro", - "display_name": "GPT-5.4 Pro", + "id": "deepseek-ai/deepseek-v4.1-flash", + "name": "DeepSeek V4.1 Flash", + "display_name": "DeepSeek V4.1 Flash", "modalities": { "input": [ "text", @@ -86119,10 +84513,10 @@ ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1000000, + "output": 384000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -86131,74 +84525,58 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "medium", - "high", - "xhigh" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ], - "verbosity": "medium", - "verbosity_options": [ + "effort_options": [ + "none", "low", - "medium", - "high" - ], - "visibility": "hidden" + "high", + "max" + ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-05", - "last_updated": "2026-03-05", + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-09-10", + "last_updated": "2026-09-10", "type": "chat" }, { - "id": "qwen/qwen3.8-27b", - "name": "Qwen3.8 27B", - "display_name": "Qwen3.8 27B", + "id": "mistralai/magistral-small-2506", + "name": "Magistral Small 2506", + "display_name": "Magistral Small 2506", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 235929 + "context": 32768, + "output": 32768 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "xhigh" - ] - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "release_date": "2025-06-10", + "last_updated": "2025-06-10", "type": "chat" }, { - "id": "qwen/qwen3-30b-a3b-instruct-2507", - "name": "Qwen3 30B A3B Instruct 2507", - "display_name": "Qwen3 30B A3B Instruct 2507", + "id": "mistralai/mistral-7b-instruct-v0.3", + "name": "Mistral-7B-Instruct-v0.3", + "display_name": "Mistral-7B-Instruct-v0.3", "modalities": { "input": [ "text" @@ -86208,8 +84586,8 @@ ] }, "limit": { - "context": 262144, - "output": 235929 + "context": 65536, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -86218,14 +84596,14 @@ }, "attachment": false, "open_weights": true, - "release_date": "2025-07-28", - "last_updated": "2025-07-28", + "release_date": "2024-05-22", + "last_updated": "2024-05-22", "type": "chat" }, { - "id": "qwen/qwen3-vl-235b-a22b-instruct", - "name": "Qwen3 VL 235B A22B Instruct", - "display_name": "Qwen3 VL 235B A22B Instruct", + "id": "mistralai/mistral-medium-3-instruct", + "name": "Mistral Medium 3", + "display_name": "Mistral Medium 3", "modalities": { "input": [ "text", @@ -86236,53 +84614,54 @@ ] }, "limit": { - "context": 262144, + "context": 131072, "output": 32768 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, "attachment": true, - "open_weights": true, + "open_weights": false, "knowledge": "2025-03-31", - "release_date": "2025-09-23", - "last_updated": "2025-09-23", + "release_date": "2025-05-07", + "last_updated": "2025-05-07", "type": "chat" }, { - "id": "qwen/qwen3-coder-next", - "name": "Qwen3 Coder Next", - "display_name": "Qwen3 Coder Next", + "id": "google/gemma-3-12b-it", + "name": "Gemma 3 12B IT", + "display_name": "Gemma 3 12B IT", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 235929 + "context": 131072, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2025-09", - "release_date": "2026-02-03", - "last_updated": "2026-02-03", + "knowledge": "2024-08", + "release_date": "2025-03-12", + "last_updated": "2025-03-12", "type": "chat" }, { - "id": "qwen/qwen3-vl-30b-a3b-instruct", - "name": "Qwen3 VL 30B A3B Instruct", - "display_name": "Qwen3 VL 30B A3B Instruct", + "id": "google/gemma-3-4b-it", + "name": "Gemma 3 4B IT", + "display_name": "Gemma 3 4B IT", "modalities": { "input": [ "text", @@ -86293,7 +84672,7 @@ ] }, "limit": { - "context": 262144, + "context": 131072, "output": 16384 }, "temperature": true, @@ -86303,25 +84682,28 @@ }, "attachment": true, "open_weights": true, - "release_date": "2025-10-04", - "last_updated": "2025-10-04", + "knowledge": "2024-08", + "release_date": "2025-03-12", + "last_updated": "2025-03-12", "type": "chat" }, { - "id": "z-ai/glm-5.3", - "name": "GLM 5.3", - "display_name": "GLM 5.3", + "id": "google/diffusiongemma-26b-a4b-it", + "name": "DiffusionGemma 26B A4B IT", + "display_name": "DiffusionGemma 26B A4B IT", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 250000, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -86331,62 +84713,56 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ + "none", + "minimal", "low", + "medium", "high", + "xhigh", "max" ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "knowledge": "2025-01", + "release_date": "2026-06-09", + "last_updated": "2026-07-15", "type": "chat" }, { - "id": "z-ai/glm-5.2", - "name": "GLM 5.2", - "display_name": "GLM 5.2", + "id": "google/google-paligemma", + "name": "paligemma", + "display_name": "paligemma", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 943718 + "context": 128000, + "output": 8192 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "none", - "high", - "xhigh" - ] - } + "supported": false }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "release_date": "2024-05-14", + "last_updated": "2024-08-26", "type": "chat" }, { - "id": "z-ai/glm-5.3-flash", - "name": "GLM 5.3 Flash", - "display_name": "GLM 5.3 Flash", + "id": "google/gemma-4-31b-it", + "name": "Gemma-4-31B-IT", + "display_name": "Gemma-4-31B-IT", "modalities": { "input": [ "text", @@ -86398,8 +84774,8 @@ ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 256000, + "output": 16384 }, "temperature": true, "tool_call": true, @@ -86409,24 +84785,82 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "effort_options": [ - "low", - "high", - "max" - ] + "supported": true } }, "attachment": true, "open_weights": true, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", + "knowledge": "2025-01", + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "deepseek/deepseek-v4-flash", - "name": "DeepSeek V4 Flash 0423", - "display_name": "DeepSeek V4 Flash 0423", + "id": "qwen/qwen-image-edit", + "name": "Qwen Image Edit", + "display_name": "Qwen Image Edit", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "image" + ] + }, + "limit": { + "context": 8192, + "output": 8192 + }, + "temperature": false, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": false, + "release_date": "2025-08-19", + "last_updated": "2025-08-19" + }, + { + "id": "qwen/qwen-image", + "name": "Qwen Image", + "display_name": "Qwen Image", + "modalities": { + "input": [ + "text" + ], + "output": [ + "image" + ] + }, + "limit": { + "context": 8192, + "output": 8192 + }, + "temperature": false, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": false, + "release_date": "2025-08-07", + "last_updated": "2025-08-07" + } + ] + }, + "above": { + "id": "above", + "name": "above.dev", + "display_name": "above.dev", + "api": "https://api.above.dev/v1", + "doc": "https://above.dev/docs", + "models": [ + { + "id": "glm-5.2", + "name": "GLM 5.2", + "display_name": "GLM 5.2", "modalities": { "input": [ "text" @@ -86436,8 +84870,8 @@ ] }, "limit": { - "context": 1048576, - "output": 943717 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -86448,46 +84882,40 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "high", - "max" - ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" ], - "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." + "effort_options": [ + "none", + "high", + "max" ] } }, "attachment": false, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "deepseek/deepseek-v4-pro", - "name": "DeepSeek V4 Pro 0423", - "display_name": "DeepSeek V4 Pro 0423", + "id": "deepseek-v4-flash", + "name": "DeepSeek V4 Flash", + "display_name": "DeepSeek V4 Flash", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, + "context": 1000000, "output": 384000 }, "temperature": true, @@ -86518,17 +84946,17 @@ ] } }, - "attachment": false, + "attachment": true, "open_weights": true, "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "release_date": "2026-09-10", + "last_updated": "2026-09-10", "type": "chat" }, { - "id": "deepseek/deepseek-v4-flash-0731", - "name": "DeepSeek V4 Flash 0731", - "display_name": "DeepSeek V4 Flash 0731", + "id": "glm-5.2-fast", + "name": "GLM 5.2 Fast", + "display_name": "GLM 5.2 Fast", "modalities": { "input": [ "text" @@ -86538,7 +84966,7 @@ ] }, "limit": { - "context": 1048576, + "context": 1000000, "output": 131072 }, "temperature": true, @@ -86550,9 +84978,14 @@ "extra_capabilities": { "reasoning": { "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ "none", - "low", "high", "max" ] @@ -86560,15 +84993,14 @@ }, "attachment": false, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-07-31", - "last_updated": "2026-07-31", + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "deepseek/deepseek-v4.1-flash-1017", - "name": "DeepSeek V4.1 Flash 1017", - "display_name": "DeepSeek V4.1 Flash 1017", + "id": "deepseek-v4.1-flash", + "name": "DeepSeek V4.1 Flash", + "display_name": "DeepSeek V4.1 Flash", "modalities": { "input": [ "text", @@ -86579,8 +85011,8 @@ ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 1000000, + "output": 384000 }, "temperature": true, "tool_call": true, @@ -86590,8 +85022,14 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ - "none", "low", "high", "max" @@ -86601,18 +85039,20 @@ "attachment": true, "open_weights": true, "knowledge": "2025-05", - "release_date": "2026-10-17", - "last_updated": "2026-10-17", + "release_date": "2026-09-10", + "last_updated": "2026-09-10", "type": "chat" }, { - "id": "deepseek/deepseek-v4.1-flash", - "name": "DeepSeek V4.1 Flash", - "display_name": "DeepSeek V4.1 Flash", + "id": "mimo-v2.6-pro", + "name": "MiMo V2.6 Pro", + "display_name": "MiMo V2.6 Pro", "modalities": { "input": [ "text", - "image" + "image", + "audio", + "video" ], "output": [ "text" @@ -86631,25 +85071,24 @@ "extra_capabilities": { "reasoning": { "supported": true, - "effort_options": [ - "none", - "low", - "high", - "max" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, "attachment": true, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-09-10", - "last_updated": "2026-09-10", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "anthropic/claude-opus-4.7", - "name": "Claude Opus 4.7", - "display_name": "Claude Opus 4.7", + "id": "qwen3.8-max", + "name": "Qwen 3.8 Max", + "display_name": "Qwen 3.8 Max", "modalities": { "input": [ "text", @@ -86661,113 +85100,80 @@ }, "limit": { "context": 1000000, - "output": 128000 + "output": 32768 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], "interleaved": true, "summaries": true, - "visibility": "omitted", + "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-04-16", - "last_updated": "2026-04-16", + "release_date": "2026-08-03", + "last_updated": "2026-08-03", "type": "chat" }, { - "id": "anthropic/claude-opus-4.6", - "name": "Claude Opus 4.6", - "display_name": "Claude Opus 4.6", + "id": "mimo-v2.6-flash", + "name": "MiMo V2.6 Flash", + "display_name": "MiMo V2.6 Flash", "modalities": { "input": [ "text", - "image" + "image", + "audio", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 1048576, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "max" - ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-05-31", - "release_date": "2026-02-05", - "last_updated": "2026-03-13", + "open_weights": true, + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "anthropic/claude-sonnet-5", - "name": "Claude Sonnet 5", - "display_name": "Claude Sonnet 5", + "id": "deepseek-v4-pro", + "name": "DeepSeek V4 Pro", + "display_name": "DeepSeek V4 Pro", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" @@ -86775,9 +85181,9 @@ }, "limit": { "context": 1000000, - "output": 128000 + "output": 384000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -86786,83 +85192,77 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", "effort_options": [ - "none", "low", - "medium", "high", - "xhigh", "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-30", - "last_updated": "2026-06-30", + "attachment": false, + "open_weights": true, + "release_date": "2026-08-13", + "last_updated": "2026-08-22", "type": "chat" }, { - "id": "anthropic/claude-opus-4.8", - "name": "Claude Opus 4.8", - "display_name": "Claude Opus 4.8", + "id": "mimo-v2.6-pro-ultraspeed", + "name": "MiMo V2.6 Pro UltraSpeed", + "display_name": "MiMo V2.6 Pro UltraSpeed", "modalities": { "input": [ "text", - "image" + "image", + "audio", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 1048576, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], "interleaved": true, "summaries": true, - "visibility": "omitted", + "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-01", - "release_date": "2026-05-28", - "last_updated": "2026-05-28", + "open_weights": true, + "release_date": "2026-09-21", + "last_updated": "2026-09-21", "type": "chat" }, { - "id": "anthropic/claude-opus-5.5", - "name": "Claude Opus 5.5", - "display_name": "Claude Opus 5.5", + "id": "glm-5.3-flash", + "name": "GLM 5.3 Flash", + "display_name": "GLM 5.3 Flash", "modalities": { "input": [ "text", @@ -86874,9 +85274,9 @@ }, "limit": { "context": 1000000, - "output": 128000 + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -86884,26 +85284,103 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ - "low", - "medium", "high", - "xhigh", "max" ] } }, "attachment": true, + "open_weights": true, + "release_date": "2026-08-26", + "last_updated": "2026-08-26", + "type": "chat" + } + ] + }, + "abacus": { + "id": "abacus", + "name": "Abacus", + "display_name": "Abacus", + "api": "https://routellm.abacus.ai/v1", + "doc": "https://abacus.ai/help/api", + "models": [ + { + "id": "gpt-4.1-nano", + "name": "GPT-4.1 nano", + "display_name": "GPT-4.1 nano", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1047576, + "output": 32768 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": true, "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "knowledge": "2024-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", "type": "chat" }, { - "id": "anthropic/claude-fable-5.1", - "name": "Claude Fable 5.1", - "display_name": "Claude Fable 5.1", + "id": "muse-spark-1.2", + "name": "Muse Spark 1.2", + "display_name": "Muse Spark 1.2", + "modalities": { + "input": [ + "text", + "image", + "audio", + "video" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1048576, + "output": 131072 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": true, + "open_weights": false, + "release_date": "2026-08-05", + "last_updated": "2026-08-05", + "type": "chat" + }, + { + "id": "claude-fable-5", + "name": "Claude Fable 5", + "display_name": "Claude Fable 5", "modalities": { "input": [ "text", @@ -86951,29 +85428,30 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-09-01", - "last_updated": "2026-09-01", + "knowledge": "2026-01-31", + "release_date": "2026-06-09", + "last_updated": "2026-06-09", "type": "chat" }, { - "id": "anthropic/claude-opus-5", - "name": "Claude Opus 5", - "display_name": "Claude Opus 5", + "id": "gemini-3.1-pro-preview", + "name": "Gemini 3.1 Pro Preview", + "display_name": "Gemini 3.1 Pro Preview", "modalities": { "input": [ "text", - "image" + "image", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 1048576, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -86982,89 +85460,86 @@ "extra_capabilities": { "reasoning": { "supported": true, - "effort_options": [ - "none", + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ "low", - "medium", - "high", - "xhigh", - "max" + "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-05", - "release_date": "2026-07-24", - "last_updated": "2026-07-24", + "knowledge": "2025-01", + "release_date": "2026-02-19", + "last_updated": "2026-02-19", "type": "chat" }, { - "id": "anthropic/claude-sonnet-4.6", - "name": "Claude Sonnet 4.6", - "display_name": "Claude Sonnet 4.6", + "id": "gemini-3-flash-preview", + "name": "Gemini 3 Flash Preview", + "display_name": "Gemini 3 Flash Preview", "modalities": { "input": [ "text", - "image" + "image", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", - "effort_options": [ + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", "low", "medium", - "high", - "max" + "high" ], - "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." + "thought_signatures" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-17", - "last_updated": "2026-03-13", + "knowledge": "2025-01", + "release_date": "2025-12-17", + "last_updated": "2025-12-17", "type": "chat" }, { - "id": "anthropic/claude-sonnet-5.5", - "name": "Claude Sonnet 5.5", - "display_name": "Claude Sonnet 5.5", + "id": "muse-spark-1.1", + "name": "Muse Spark 1.1", + "display_name": "Muse Spark 1.1", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" @@ -87072,9 +85547,9 @@ }, "limit": { "context": 1000000, - "output": 128000 + "output": 32000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -87082,26 +85557,19 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ] + "supported": true } }, "attachment": true, "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-09-28", - "last_updated": "2026-09-28", + "release_date": "2026-04-08", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "anthropic/claude-fable-5", - "name": "Claude Fable 5", - "display_name": "Claude Fable 5", + "id": "gpt-5.6-terra", + "name": "GPT-5.6 Terra", + "display_name": "GPT-5.6 Terra", "modalities": { "input": [ "text", @@ -87126,38 +85594,35 @@ "supported": true, "default_enabled": true, "mode": "effort", - "effort": "high", + "effort": "medium", "effort_options": [ + "none", "low", "medium", "high", "xhigh", "max" ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" ], - "notes": [ - "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", - "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", - "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." - ] + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-09", - "last_updated": "2026-06-09", + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "mistralai/mistral-large-2512", - "name": "Mistral Large 3 2512", - "display_name": "Mistral Large 3 2512", + "id": "gpt-5.4", + "name": "GPT-5.4", + "display_name": "GPT-5.4", "modalities": { "input": [ "text", @@ -87168,53 +85633,106 @@ ] }, "limit": { - "context": 262144, - "output": 209715 + "context": 400000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } }, "attachment": true, - "open_weights": true, - "knowledge": "2024-11", - "release_date": "2025-12-02", - "last_updated": "2025-12-02", + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-03-05", + "last_updated": "2026-03-05", "type": "chat" }, { - "id": "mistralai/mistral-nemo", - "name": "Mistral Nemo", - "display_name": "Mistral Nemo", + "id": "claude-sonnet-4-6", + "name": "Claude Sonnet 4.6", + "display_name": "Claude Sonnet 4.6", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 16384 + "context": 1000000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-07", - "release_date": "2024-07-18", - "last_updated": "2024-07-18", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-02-17", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "mistralai/mistral-small-2603", - "name": "Mistral Small 4", - "display_name": "Mistral Small 4", + "id": "gpt-5.6-sol", + "name": "GPT-5.6 Sol", + "display_name": "GPT-5.6 Sol", "modalities": { "input": [ "text", @@ -87225,10 +85743,10 @@ ] }, "limit": { - "context": 262144, - "output": 209715 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -87236,51 +85754,38 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ "none", + "low", + "medium", + "high", + "xhigh", + "max" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", "high" - ] + ], + "visibility": "hidden" } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-06", - "release_date": "2026-03-16", - "last_updated": "2026-03-16", - "type": "chat" - }, - { - "id": "mistralai/mixtral-8x22b-instruct", - "name": "Mixtral 8x22B Instruct", - "display_name": "Mixtral 8x22B Instruct", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 65536, - "output": 52428 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-01-31", - "release_date": "2024-04-17", - "last_updated": "2024-04-17", + "open_weights": false, + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "meta-llama/llama-3.3-70b-instruct", - "name": "Llama 3.3 70B Instruct", - "display_name": "Llama 3.3 70B Instruct", + "id": "qwen3-max", + "name": "Qwen3 Max", + "display_name": "Qwen3 Max", "modalities": { "input": [ "text" @@ -87296,28 +85801,31 @@ "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, - "open_weights": true, - "knowledge": "2023-12", - "release_date": "2024-12-06", - "last_updated": "2024-12-06", + "open_weights": false, + "knowledge": "2025-04", + "release_date": "2025-09-23", + "last_updated": "2025-09-23", "type": "chat" - } - ] - }, - "llmgateway-providers": { - "id": "llmgateway-providers", - "name": "LLM Gateway", - "display_name": "LLM Gateway", - "api": "https://api.llmgateway.io/v1", - "doc": "https://llmgateway.io/docs", - "models": [ + }, { - "id": "azure-ai-foundry/grok-4-1-fast-reasoning", - "name": "Grok 4.1 Fast Reasoning (Azure AI Foundry)", - "display_name": "Grok 4.1 Fast Reasoning (Azure AI Foundry)", + "id": "gpt-5.4-mini", + "name": "GPT-5.4 mini", + "display_name": "GPT-5.4 mini", "modalities": { "input": [ "text", @@ -87328,35 +85836,48 @@ ] }, "limit": { - "context": 2000000, - "output": 30000 + "context": 400000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ "low", "medium", "high" - ] + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "release_date": "2025-11-19", - "last_updated": "2025-11-19", + "knowledge": "2025-08-31", + "release_date": "2026-03-17", + "last_updated": "2026-03-17", "type": "chat" }, { - "id": "azure-ai-foundry/grok-4-1-fast-non-reasoning", - "name": "Grok 4.1 Fast Non-Reasoning (Azure AI Foundry)", - "display_name": "Grok 4.1 Fast Non-Reasoning (Azure AI Foundry)", + "id": "gpt-4o", + "name": "GPT-4o", + "display_name": "GPT-4o", "modalities": { "input": [ "text", @@ -87367,8 +85888,8 @@ ] }, "limit": { - "context": 2000000, - "output": 30000 + "context": 128000, + "output": 16384 }, "temperature": true, "tool_call": true, @@ -87377,64 +85898,56 @@ }, "attachment": true, "open_weights": false, - "release_date": "2025-11-19", - "last_updated": "2025-11-19", + "knowledge": "2023-09", + "release_date": "2024-05-13", + "last_updated": "2024-08-06", "type": "chat" }, { - "id": "azure-ai-foundry/grok-4-3", - "name": "Grok 4.3 (Azure AI Foundry)", - "display_name": "Grok 4.3 (Azure AI Foundry)", + "id": "grok-4-fast-non-reasoning", + "name": "Grok 4 Fast (Non-Reasoning)", + "display_name": "Grok 4 Fast (Non-Reasoning)", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 20000, - "output": 8192 + "context": 2000000, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "high" - ] - } + "supported": false }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-04-17", - "last_updated": "2026-04-17", + "release_date": "2025-12-18", + "last_updated": "2025-12-18", "type": "chat" }, { - "id": "xai/grok-4-6", - "name": "Grok 4.6 (xAI)", - "display_name": "Grok 4.6 (xAI)", + "id": "gemini-2.5-pro", + "name": "Gemini 2.5 Pro", + "display_name": "Gemini 2.5 Pro", "modalities": { "input": [ "text", - "image" + "image", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 500000, - "output": 500000 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -87444,25 +85957,34 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "xhigh" + "supported": true, + "default_enabled": true, + "mode": "budget", + "budget": { + "default": -1, + "min": 128, + "max": 32768, + "auto": -1, + "unit": "tokens" + }, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-02-01", - "release_date": "2026-08-12", - "last_updated": "2026-08-12", + "knowledge": "2025-01", + "release_date": "2025-06-17", + "last_updated": "2025-06-17", "type": "chat" }, { - "id": "xai/grok-4-20-beta-0309-reasoning", - "name": "Grok 4.20 Beta Reasoning (0309) (xAI)", - "display_name": "Grok 4.20 Beta Reasoning (0309) (xAI)", + "id": "claude-opus-4-20250514", + "name": "Claude Opus 4", + "display_name": "Claude Opus 4", "modalities": { "input": [ "text", @@ -87474,34 +85996,47 @@ ] }, "limit": { - "context": 2000000, - "output": 30000 + "context": 200000, + "output": 32000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "low", - "medium", - "high" + "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-03-09", - "last_updated": "2026-03-09", + "knowledge": "2025-03-31", + "release_date": "2025-05-22", + "last_updated": "2025-05-22", "type": "chat" }, { - "id": "xai/grok-4", - "name": "Grok 4 (xAI)", - "display_name": "Grok 4 (xAI)", + "id": "gpt-5.6-luna", + "name": "GPT-5.6 Luna", + "display_name": "GPT-5.6 Luna", "modalities": { "input": [ "text", @@ -87512,10 +86047,10 @@ ] }, "limit": { - "context": 256000, - "output": 256000 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -87523,19 +86058,38 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "release_date": "2025-07-09", - "last_updated": "2025-07-09", + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "xai/grok-4-5", - "name": "Grok 4.5 (xAI)", - "display_name": "Grok 4.5 (xAI)", + "id": "grok-4.6", + "name": "Grok 4.6", + "display_name": "Grok 4.6", "modalities": { "input": [ "text", @@ -87547,7 +86101,7 @@ }, "limit": { "context": 500000, - "output": 500000 + "output": 32768 }, "temperature": true, "tool_call": true, @@ -87557,36 +86111,33 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "low", - "medium", - "high" - ] + "supported": true } }, "attachment": true, "open_weights": false, - "release_date": "2026-07-08", - "last_updated": "2026-07-08", + "knowledge": "2026-02-01", + "release_date": "2026-08-12", + "last_updated": "2026-08-12", "type": "chat" }, { - "id": "xai/grok-build-0-1", - "name": "Grok Build 0.1 (xAI)", - "display_name": "Grok Build 0.1 (xAI)", + "id": "gemini-3.5-flash-lite", + "name": "Gemini 3.5 Flash Lite", + "display_name": "Gemini 3.5 Flash Lite", "modalities": { "input": [ "text", "image", - "pdf" + "audio" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 256000 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -87596,77 +86147,88 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "low", - "medium", - "high" - ] + "supported": true } }, "attachment": true, "open_weights": false, - "release_date": "2026-04-16", - "last_updated": "2026-04-16", + "knowledge": "2026-03", + "release_date": "2026-07-21", + "last_updated": "2026-07-21", "type": "chat" }, { - "id": "xai/grok-4-7", - "name": "Grok 4.7 (xAI)", - "display_name": "Grok 4.7 (xAI)", + "id": "claude-opus-4-7", + "name": "Claude Opus 4.7", + "display_name": "Claude Opus 4.7", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 500000, - "output": 500000 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "high", "effort_options": [ "low", "medium", "high", - "xhigh" + "xhigh", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-05", - "release_date": "2026-09-21", - "last_updated": "2026-09-21", + "knowledge": "2026-01-31", + "release_date": "2026-04-16", + "last_updated": "2026-04-16", "type": "chat" }, { - "id": "xai/grok-4-3", - "name": "Grok 4.3 (xAI)", - "display_name": "Grok 4.3 (xAI)", + "id": "gpt-5.2-chat-latest", + "name": "GPT-5.2 Chat Latest", + "display_name": "GPT-5.2 Chat Latest", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 1000000 + "context": 400000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -87674,106 +86236,102 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "high" - ] - } - }, "attachment": true, "open_weights": false, - "release_date": "2026-04-17", - "last_updated": "2026-04-17", + "knowledge": "2024-09-30", + "release_date": "2025-12-11", + "last_updated": "2025-12-11", "type": "chat" }, { - "id": "xai/grok-4-20-beta-0309-non-reasoning", - "name": "Grok 4.20 Beta Non-Reasoning (0309) (xAI)", - "display_name": "Grok 4.20 Beta Non-Reasoning (0309) (xAI)", + "id": "grok-4.5", + "name": "Grok 4.5", + "display_name": "Grok 4.5", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 2000000, - "output": 30000 + "context": 500000, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": true, "open_weights": false, - "release_date": "2026-03-09", - "last_updated": "2026-03-09", + "release_date": "2026-07-08", + "last_updated": "2026-07-08", "type": "chat" }, { - "id": "ranoai/deepseek-v4-flash", - "name": "DeepSeek V4 Flash (RanoAI)", - "display_name": "DeepSeek V4 Flash (RanoAI)", + "id": "gpt-5.1-codex", + "name": "GPT-5.1 Codex", + "display_name": "GPT-5.1 Codex", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 393216 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, + "default_enabled": false, "mode": "effort", - "effort": "high", + "effort": "none", "effort_options": [ + "none", "low", - "high", - "max" + "medium", + "high" ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" ], - "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." - ] + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "attachment": true, + "open_weights": false, + "knowledge": "2024-09-30", + "release_date": "2025-11-13", + "last_updated": "2025-11-13", "type": "chat" }, { - "id": "cerebras/llama-3.3-70b-instruct", - "name": "Llama 3.3 70B Instruct (Cerebras)", - "display_name": "Llama 3.3 70B Instruct (Cerebras)", + "id": "kimi-k2-turbo-preview", + "name": "Kimi K2 Turbo Preview", + "display_name": "Kimi K2 Turbo Preview", "modalities": { "input": [ "text" @@ -87783,8 +86341,8 @@ ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 256000, + "output": 8192 }, "temperature": true, "tool_call": true, @@ -87792,102 +86350,100 @@ "supported": false }, "attachment": false, - "open_weights": true, - "knowledge": "2023-12", - "release_date": "2024-12-06", - "last_updated": "2024-12-06", + "open_weights": false, + "release_date": "2025-07-08", + "last_updated": "2025-07-08", "type": "chat" }, { - "id": "cerebras/gemma-4-31b-it", - "name": "Gemma 4 31B IT (Cerebras)", - "display_name": "Gemma 4 31B IT (Cerebras)", + "id": "claude-3-7-sonnet-20250219", + "name": "Claude Sonnet 3.7", + "display_name": "Claude Sonnet 3.7", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "effort_options": [ - "none", - "minimal", - "low", - "medium", - "high", - "xhigh", - "max" + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": false, + "summaries": false, + "visibility": "full", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Anthropic uses thinking budget tokens" ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "open_weights": false, + "knowledge": "2024-10-31", + "release_date": "2025-02-19", + "last_updated": "2025-02-19", "type": "chat" }, { - "id": "cerebras/gpt-oss-120b", - "name": "GPT OSS 120B (Cerebras)", - "display_name": "GPT OSS 120B (Cerebras)", + "id": "gpt-4.1", + "name": "GPT-4.1", + "display_name": "GPT-4.1", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 131072, + "context": 1047576, "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "low", - "medium", - "high" - ] - } + "supported": false }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "attachment": true, + "open_weights": false, + "knowledge": "2024-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", "type": "chat" }, { - "id": "cerebras/glm-4.7", - "name": "GLM-4.7 (Cerebras)", - "display_name": "GLM-4.7 (Cerebras)", + "id": "claude-opus-4-1-20250805", + "name": "Claude Opus 4.1", + "display_name": "Claude Opus 4.1", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" @@ -87895,36 +86451,46 @@ }, "limit": { "context": 200000, - "output": 128000 + "output": 32000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-12-22", - "last_updated": "2025-12-22", + "attachment": true, + "open_weights": false, + "knowledge": "2025-03-31", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "cerebras/qwen3-235b-a22b-instruct-2507", - "name": "Qwen3 235B A22B Instruct 2507 (Cerebras)", - "display_name": "Qwen3 235B A22B Instruct 2507 (Cerebras)", + "id": "mimo-v2-pro", + "name": "MiMo-V2-Pro", + "display_name": "MiMo-V2-Pro", "modalities": { "input": [ "text" @@ -87934,35 +86500,41 @@ ] }, "limit": { - "context": 262000, - "output": 8192 + "context": 1048576, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": false, - "open_weights": true, - "release_date": "2025-07-21", - "last_updated": "2025-07-21", + "open_weights": false, + "knowledge": "2024-12", + "release_date": "2026-03-18", + "last_updated": "2026-03-18", "type": "chat" }, { - "id": "scx-ai-gp/glm-5.2-fast", - "name": "GLM-5.2 Turbo (SCX.ai)", - "display_name": "GLM-5.2 Turbo (SCX.ai)", + "id": "gemini-3.1-flash-lite-preview", + "name": "Gemini 3.1 Flash Lite Preview", + "display_name": "Gemini 3.1 Flash Lite Preview", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -87970,58 +86542,66 @@ "supported": true, "default": true }, - "attachment": false, - "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "attachment": true, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2026-03-03", + "last_updated": "2026-03-03", "type": "chat" }, { - "id": "scx-ai-gp/glm-5.3-fast", - "name": "GLM 5.3 Fast (SCX.ai)", - "display_name": "GLM 5.3 Fast (SCX.ai)", + "id": "gemini-3.1-flash-lite", + "name": "Gemini 3.1 Flash Lite", + "display_name": "Gemini 3.1 Flash Lite", "modalities": { "input": [ - "text" + "text", + "image", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 1048576, + "output": 65536 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2026-05-07", + "last_updated": "2026-05-07", "type": "chat" }, { - "id": "scx-ai-gp/kimi-k2.7-code", - "name": "Kimi K2.7 Code (SCX.ai)", - "display_name": "Kimi K2.7 Code (SCX.ai)", + "id": "qwen3.7-max", + "name": "Qwen3.7 Max", + "display_name": "Qwen3.7 Max", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1000000, + "output": 64000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -88029,50 +86609,33 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "none", - "minimal", - "low", - "medium", - "high", - "xhigh" - ] + "supported": true } }, - "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-06-12", - "last_updated": "2026-06-12", + "attachment": false, + "open_weights": false, + "release_date": "2026-05-21", + "last_updated": "2026-05-21", "type": "chat" }, { - "id": "scx-ai-gp/qwen3.8-max", - "name": "Qwen3.8 Max (SCX.ai)", - "display_name": "Qwen3.8 Max (SCX.ai)", + "id": "o3-pro", + "name": "o3-pro", + "display_name": "o3-pro", "modalities": { "input": [ "text", - "image", - "video", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 200000, + "output": 100000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -88081,33 +86644,39 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ "low", "medium", - "xhigh" - ] + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "release_date": "2026-08-03", - "last_updated": "2026-08-03", + "knowledge": "2024-05", + "release_date": "2025-06-10", + "last_updated": "2025-06-10", "type": "chat" }, { - "id": "scx-ai-gp/glm-5.3", - "name": "GLM-5.3 (SCX.ai)", - "display_name": "GLM-5.3 (SCX.ai)", + "id": "gpt-5.3-codex", + "name": "GPT-5.3 Codex", + "display_name": "GPT-5.3 Codex", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, + "context": 400000, "output": 128000 }, "temperature": true, @@ -88119,161 +86688,156 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ "low", + "medium", "high", - "max" - ] + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "attachment": true, + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-02-05", + "last_updated": "2026-02-05", "type": "chat" }, { - "id": "scx-ai-gp/kimi-k3", - "name": "Kimi K3 (SCX.ai)", - "display_name": "Kimi K3 (SCX.ai)", + "id": "gpt-5.1", + "name": "GPT-5.1", + "display_name": "GPT-5.1", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 1048576 + "context": 400000, + "output": 128000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", "effort_options": [ "none", - "minimal", "low", "medium", - "high", - "xhigh", - "max" - ] + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, - "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-16", + "open_weights": false, + "knowledge": "2024-09-30", + "release_date": "2025-11-13", + "last_updated": "2025-11-13", "type": "chat" }, { - "id": "scx-ai-gp/glm-5.2", - "name": "GLM-5.2 (SCX.ai)", - "display_name": "GLM-5.2 (SCX.ai)", + "id": "gpt-4o-2024-11-20", + "name": "GPT-4o (2024-11-20)", + "display_name": "GPT-4o (2024-11-20)", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 128000, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "none", - "minimal", - "low", - "medium", - "high", - "xhigh", - "max" - ] - } + "supported": false }, - "attachment": false, - "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "attachment": true, + "open_weights": false, + "knowledge": "2024-10", + "release_date": "2024-11-20", + "last_updated": "2024-11-20", "type": "chat" }, { - "id": "scx-ai-gp/deepseek-v4.1-flash", - "name": "DeepSeek V4.1 Flash (SCX.ai)", - "display_name": "DeepSeek V4.1 Flash (SCX.ai)", + "id": "grok-4-0709", + "name": "Grok 4", + "display_name": "Grok 4", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 256000, + "output": 16384 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-09-10", - "last_updated": "2026-09-10", + "attachment": true, + "open_weights": false, + "release_date": "2025-07-09", + "last_updated": "2025-07-09", "type": "chat" }, { - "id": "scx-ai-gp/glm-5.3-flash", - "name": "GLM-5.3 Flash (SCX.ai)", - "display_name": "GLM-5.3 Flash (SCX.ai)", + "id": "qwen3.8-max", + "name": "Qwen3.8 Max", + "display_name": "Qwen3.8 Max", "modalities": { "input": [ "text", "image", - "video", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1048576, + "context": 1000000, "output": 131072 }, "temperature": true, @@ -88284,211 +86848,260 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "effort_options": [ - "low", - "high", - "max" - ] + "supported": true } }, "attachment": true, - "open_weights": true, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", + "open_weights": false, + "release_date": "2026-08-03", + "last_updated": "2026-08-03", "type": "chat" }, { - "id": "meta/muse-spark-1.3", - "name": "Muse Spark 1.3 (Meta)", - "display_name": "Muse Spark 1.3 (Meta)", + "id": "claude-opus-4-6", + "name": "Claude Opus 4.6", + "display_name": "Claude Opus 4.6", "modalities": { "input": [ "text", - "image", - "video", - "pdf", - "audio" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 1048576 + "context": 1000000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", "effort_options": [ - "minimal", "low", "medium", "high", - "xhigh" + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-09-02", - "last_updated": "2026-09-02", + "knowledge": "2025-05-31", + "release_date": "2026-02-05", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "meta/muse-wonder-1.0", - "name": "Muse Wonder 1.0 (Meta)", - "display_name": "Muse Wonder 1.0 (Meta)", + "id": "qwen-2.5-coder-32b", + "name": "Qwen 2.5 Coder 32B", + "display_name": "Qwen 2.5 Coder 32B", "modalities": { "input": [ - "text", - "image", - "video", - "pdf", - "audio" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 1048576 + "context": 128000, + "output": 8192 }, "temperature": true, "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "release_date": "2024-11-12", + "last_updated": "2024-11-12", + "type": "chat" + }, + { + "id": "gpt-5-codex", + "name": "GPT-5-Codex", + "display_name": "GPT-5-Codex", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 400000, + "output": 128000 + }, + "temperature": false, + "tool_call": true, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ "minimal", "low", "medium", - "high", - "xhigh" - ] + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "release_date": "2026-10-12", - "last_updated": "2026-10-12", + "knowledge": "2024-09-30", + "release_date": "2025-09-15", + "last_updated": "2025-09-15", "type": "chat" }, { - "id": "meta/muse-spark-1.2", - "name": "Muse Spark 1.2 (Meta)", - "display_name": "Muse Spark 1.2 (Meta)", + "id": "claude-opus-4-8", + "name": "Claude Opus 4.8", + "display_name": "Claude Opus 4.8", "modalities": { "input": [ "text", - "image", - "video", - "pdf", - "audio" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "high", "effort_options": [ - "minimal", "low", "medium", "high", - "xhigh" + "xhigh", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-08-05", - "last_updated": "2026-08-05", + "knowledge": "2026-01", + "release_date": "2026-05-28", + "last_updated": "2026-05-28", "type": "chat" }, { - "id": "meta/muse-spark-1.1", - "name": "Muse Spark 1.1 (Meta)", - "display_name": "Muse Spark 1.1 (Meta)", + "id": "gemini-3.1-flash-image", + "name": "Nano Banana 2", + "display_name": "Nano Banana 2", "modalities": { "input": [ "text", - "image", - "pdf", - "video" + "image" ], "output": [ - "text" + "text", + "image" ] }, "limit": { "context": 1048576, - "output": 131072 + "output": 32768 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "effort_options": [ - "minimal", - "low", - "medium", - "high", - "xhigh" - ] + "supported": true } }, "attachment": true, "open_weights": false, - "release_date": "2026-04-08", - "last_updated": "2026-07-09", - "type": "chat" + "knowledge": "2025-01", + "release_date": "2026-05-28", + "last_updated": "2026-05-28" }, { - "id": "fireworks/glm-5.3", - "name": "GLM-5.3 (Fireworks AI)", - "display_name": "GLM-5.3 (Fireworks AI)", + "id": "gpt-5-mini", + "name": "GPT-5 Mini", + "display_name": "GPT-5 Mini", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -88497,35 +87110,47 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ - "xhigh", - "max" - ] + "minimal", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "attachment": true, + "open_weights": false, + "knowledge": "2024-05-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "fireworks/kimi-k3", - "name": "Kimi K3 (Fireworks AI)", - "display_name": "Kimi K3 (Fireworks AI)", + "id": "claude-opus-5", + "name": "Claude Opus 5", + "display_name": "Claude Opus 5", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1040384, - "output": 1040384 + "context": 1000000, + "output": 128000 }, "temperature": false, "tool_call": true, @@ -88535,27 +87160,20 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ] + "supported": true } }, "attachment": true, - "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-16", + "open_weights": false, + "knowledge": "2026-05", + "release_date": "2026-07-24", + "last_updated": "2026-07-24", "type": "chat" }, { - "id": "fireworks/deepseek-v4.1-flash", - "name": "DeepSeek V4.1 Flash (Fireworks AI)", - "display_name": "DeepSeek V4.1 Flash (Fireworks AI)", + "id": "claude-haiku-4-5-20251001", + "name": "Claude Haiku 4.5", + "display_name": "Claude Haiku 4.5", "modalities": { "input": [ "text", @@ -88566,45 +87184,52 @@ ] }, "limit": { - "context": 1048576, - "output": 393216 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-09-10", - "last_updated": "2026-09-10", + "open_weights": false, + "knowledge": "2025-02-28", + "release_date": "2025-10-15", + "last_updated": "2025-10-15", "type": "chat" }, { - "id": "fireworks/glm-5.3-flash", - "name": "GLM-5.3 Flash (Fireworks AI)", - "display_name": "GLM-5.3 Flash (Fireworks AI)", + "id": "gemini-2.5-flash", + "name": "Gemini 2.5 Flash", + "display_name": "Gemini 2.5 Flash", "modalities": { "input": [ "text", "image", - "video", - "pdf" + "audio" ], "output": [ "text" @@ -88612,7 +87237,7 @@ }, "limit": { "context": 1048576, - "output": 131072 + "output": 65536 }, "temperature": true, "tool_call": true, @@ -88623,77 +87248,97 @@ "extra_capabilities": { "reasoning": { "supported": true, - "effort_options": [ - "xhigh", - "max" + "default_enabled": true, + "mode": "budget", + "budget": { + "default": -1, + "min": 0, + "max": 24576, + "auto": -1, + "off": 0, + "unit": "tokens" + }, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2025-06-17", + "last_updated": "2025-06-17", "type": "chat" }, { - "id": "fireworks/kimi-k3-fast", - "name": "Kimi K3 Fast (Fireworks AI)", - "display_name": "Kimi K3 Fast (Fireworks AI)", + "id": "gpt-5.1-codex-max", + "name": "GPT-5.1 Codex Max", + "display_name": "GPT-5.1 Codex Max", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1040384, - "output": 1040384 + "context": 400000, + "output": 128000 }, "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", "effort_options": [ "none", "low", "medium", - "high", - "xhigh", - "max" - ] + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, - "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-16", + "open_weights": false, + "knowledge": "2024-09-30", + "release_date": "2025-11-13", + "last_updated": "2025-11-13", "type": "chat" }, { - "id": "runpod/kimi-k3", - "name": "Kimi K3 (Runpod)", - "display_name": "Kimi K3 (Runpod)", + "id": "gpt-5", + "name": "GPT-5", + "display_name": "GPT-5", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 1048576 + "context": 400000, + "output": 128000 }, "temperature": false, "tool_call": true, @@ -88704,106 +87349,117 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ - "none", "minimal", "low", "medium", - "high", - "xhigh", - "max" - ] + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, - "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-16", + "open_weights": false, + "knowledge": "2024-09-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "sakana/fugu-max", - "name": "Fugu Max (Sakana AI)", - "display_name": "Fugu Max (Sakana AI)", + "id": "gemini-3.1-flash-image-preview", + "name": "Nano Banana 2 Preview", + "display_name": "Nano Banana 2 Preview", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ - "text" + "text", + "image" ] }, "limit": { - "context": 1000000, - "output": 1000000 + "context": 1048576, + "output": 32768 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "high", - "xhigh", - "max" - ] + "supported": true } }, "attachment": true, "open_weights": false, - "release_date": "2026-09-11", - "last_updated": "2026-09-11", - "type": "chat" + "knowledge": "2025-01", + "release_date": "2026-02-26", + "last_updated": "2026-02-26" }, { - "id": "sakana/fugu-ultra-v2.0", - "name": "Fugu Ultra v2.0 (Sakana AI)", - "display_name": "Fugu Ultra v2.0 (Sakana AI)", + "id": "gemini-3-pro-image", + "name": "Nano Banana Pro", + "display_name": "Nano Banana Pro", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ - "text" + "text", + "image" ] }, "limit": { - "context": 1000000, - "output": 1000000 + "context": 65536, + "output": 32768 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "high", - "xhigh", - "max" + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "low", + "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-08-28", - "release_date": "2026-09-11", - "last_updated": "2026-09-11", - "type": "chat" + "knowledge": "2025-01", + "release_date": "2026-05-28", + "last_updated": "2026-05-28" }, { - "id": "sakana/fugu-ultra", - "name": "Fugu Ultra (Sakana AI)", - "display_name": "Fugu Ultra (Sakana AI)", + "id": "gpt-5.1-chat-latest", + "name": "GPT-5.1 Chat Latest", + "display_name": "GPT-5.1 Chat Latest", "modalities": { "input": [ "text", @@ -88814,8 +87470,8 @@ ] }, "limit": { - "context": 1000000, - "output": 1000000 + "context": 400000, + "output": 128000 }, "temperature": false, "tool_call": true, @@ -88823,38 +87479,29 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "high", - "xhigh", - "max" - ] - } - }, "attachment": true, "open_weights": false, - "release_date": "2026-06-15", - "last_updated": "2026-06-15", + "knowledge": "2024-09-30", + "release_date": "2025-11-13", + "last_updated": "2025-11-13", "type": "chat" }, { - "id": "moonshot/kimi-k2.7-code", - "name": "Kimi K2.7 Code (Moonshot AI)", - "display_name": "Kimi K2.7 Code (Moonshot AI)", + "id": "gpt-5.2-codex", + "name": "GPT-5.2 Codex", + "display_name": "GPT-5.2 Codex", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 400000, + "output": 128000 }, "temperature": false, "tool_call": true, @@ -88865,96 +87512,99 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ "low", "medium", "high", - "xhigh", - "max" - ] + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-06-12", - "last_updated": "2026-06-12", + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2025-12-11", + "last_updated": "2025-12-11", "type": "chat" }, { - "id": "moonshot/kimi-k2.6", - "name": "Kimi K2.6 (Moonshot AI)", - "display_name": "Kimi K2.6 (Moonshot AI)", + "id": "gpt-5.2", + "name": "GPT-5.2", + "display_name": "GPT-5.2", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 400000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], + "default_enabled": false, + "mode": "effort", + "effort": "none", "effort_options": [ "none", - "minimal", "low", "medium", "high", - "xhigh", - "max" - ] + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-20", - "last_updated": "2026-04-20", + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2025-12-11", + "last_updated": "2025-12-11", "type": "chat" }, { - "id": "moonshot/kimi-k3", - "name": "Kimi K3 (Moonshot AI)", - "display_name": "Kimi K3 (Moonshot AI)", + "id": "claude-sonnet-5", + "name": "Claude Sonnet 5", + "display_name": "Claude Sonnet 5", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 1048576 + "context": 1000000, + "output": 64000 }, "temperature": false, "tool_call": true, @@ -88964,24 +87614,20 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "effort_options": [ - "low", - "high", - "max" - ] + "supported": true } }, "attachment": true, - "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-16", + "open_weights": false, + "knowledge": "2026-01-31", + "release_date": "2026-06-30", + "last_updated": "2026-06-30", "type": "chat" }, { - "id": "moonshot/kimi-k3.1-pro-highspeed", - "name": "Kimi K3.1 Pro Highspeed (Moonshot AI)", - "display_name": "Kimi K3.1 Pro Highspeed (Moonshot AI)", + "id": "o3", + "name": "o3", + "display_name": "o3", "modalities": { "input": [ "text", @@ -88992,8 +87638,8 @@ ] }, "limit": { - "context": 1048576, - "output": 1048576 + "context": 200000, + "output": 100000 }, "temperature": false, "tool_call": true, @@ -89003,36 +87649,42 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ "low", - "high", - "max" - ] + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "release_date": "2026-10-23", - "last_updated": "2026-10-23", + "knowledge": "2024-05", + "release_date": "2025-04-16", + "last_updated": "2025-04-16", "type": "chat" }, { - "id": "moonshot/kimi-k3.1-pro", - "name": "Kimi K3.1 Pro (Moonshot AI)", - "display_name": "Kimi K3.1 Pro (Moonshot AI)", + "id": "gpt-5.3-codex-xhigh", + "name": "GPT-5.3 Codex XHigh", + "display_name": "GPT-5.3 Codex XHigh", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 1048576 + "context": 400000, + "output": 128000 }, "temperature": false, "tool_call": true, @@ -89042,88 +87694,161 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ "low", + "medium", "high", - "max" - ] + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "release_date": "2026-10-23", - "last_updated": "2026-10-23", + "knowledge": "2025-08-31", + "release_date": "2026-02-05", + "last_updated": "2026-02-05", "type": "chat" }, { - "id": "moonshot/kimi-k2.7-code-highspeed", - "name": "Kimi K2.7 Code Highspeed (Moonshot AI)", - "display_name": "Kimi K2.7 Code Highspeed (Moonshot AI)", + "id": "gemini-2.5-flash-image", + "name": "Nano Banana", + "display_name": "Nano Banana", "modalities": { "input": [ "text", - "image", - "video" + "image" + ], + "output": [ + "text", + "image" + ] + }, + "limit": { + "context": 32768, + "output": 32768 + }, + "temperature": true, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": false, + "knowledge": "2024-06", + "release_date": "2025-08-26", + "last_updated": "2025-08-26" + }, + { + "id": "gpt-5.4-nano", + "name": "GPT-5.4 nano", + "display_name": "GPT-5.4 nano", + "modalities": { + "input": [ + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 400000, + "output": 128000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], + "default_enabled": false, + "mode": "effort", + "effort": "none", "effort_options": [ + "none", "low", "medium", "high", - "xhigh", - "max" - ] + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-06-12", - "last_updated": "2026-06-12", + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-03-17", + "last_updated": "2026-03-17", "type": "chat" }, { - "id": "moonshot/kimi-k2.5", - "name": "Kimi K2.5 (Moonshot AI)", - "display_name": "Kimi K2.5 (Moonshot AI)", + "id": "llama-3.3-70b-versatile", + "name": "Llama 3.3 70B Versatile", + "display_name": "Llama 3.3 70B Versatile", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, + "context": 128000, "output": 32768 }, - "temperature": false, + "temperature": true, "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "knowledge": "2023-12", + "release_date": "2024-12-06", + "last_updated": "2024-12-06", + "type": "chat" + }, + { + "id": "gemini-3-pro-image-preview", + "name": "Nano Banana Pro Preview", + "display_name": "Nano Banana Pro Preview", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text", + "image" + ] + }, + "limit": { + "context": 65536, + "output": 32768 + }, + "temperature": true, + "tool_call": false, "reasoning": { "supported": true, "default": true @@ -89131,34 +87856,30 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "low", + "high" + ], "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "none", - "minimal", - "low", - "medium", - "high", - "xhigh", - "max" + "thought_signatures" ] } }, "attachment": true, - "open_weights": true, + "open_weights": false, "knowledge": "2025-01", - "release_date": "2026-01-27", - "last_updated": "2026-01-27", - "type": "chat" + "release_date": "2025-11-20", + "last_updated": "2025-11-20" }, { - "id": "reka-ai/reka-edge-2603", - "name": "Reka Edge 2603 (reka-ai)", - "display_name": "Reka Edge 2603 (reka-ai)", + "id": "gpt-5.3-chat-latest", + "name": "GPT-5.3 Chat Latest", + "display_name": "GPT-5.3 Chat Latest", "modalities": { "input": [ "text", @@ -89169,8 +87890,8 @@ ] }, "limit": { - "context": 16384, - "output": 16384 + "context": 400000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -89179,43 +87900,44 @@ }, "attachment": true, "open_weights": false, - "release_date": "2026-10-09", - "last_updated": "2026-10-09", + "knowledge": "2025-08-31", + "release_date": "2026-03-03", + "last_updated": "2026-03-03", "type": "chat" }, { - "id": "reka-ai/deepseek-v4-pro", - "name": "DeepSeek V4 Pro (reka-ai)", - "display_name": "DeepSeek V4 Pro (reka-ai)", + "id": "claude-sonnet-4-20250514", + "name": "Claude Sonnet 4", + "display_name": "Claude Sonnet 4", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 393216 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "high", - "max" - ], + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, "interleaved": true, "summaries": true, "visibility": "summary", @@ -89223,24 +87945,28 @@ "thinking_blocks" ], "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "attachment": true, + "open_weights": false, + "knowledge": "2025-03-31", + "release_date": "2025-05-22", + "last_updated": "2025-05-22", "type": "chat" }, { - "id": "reka-ai/glm-5.3", - "name": "GLM-5.3 (reka-ai)", - "display_name": "GLM-5.3 (reka-ai)", + "id": "gemini-3.7-flash", + "name": "Gemini 3.7 Flash", + "display_name": "Gemini 3.7 Flash", "modalities": { "input": [ - "text" + "text", + "image", + "audio", + "video" ], "output": [ "text" @@ -89248,7 +87974,7 @@ }, "limit": { "context": 1048576, - "output": 262144 + "output": 65536 }, "temperature": true, "tool_call": true, @@ -89259,39 +87985,46 @@ "extra_capabilities": { "reasoning": { "supported": true, - "effort_options": [ - "none", + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ "minimal", "low", "medium", - "high", - "xhigh", - "max" + "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "attachment": true, + "open_weights": false, + "knowledge": "2026-03", + "release_date": "2026-08-13", + "last_updated": "2026-08-13", "type": "chat" }, { - "id": "reka-ai/deepseek-v4.1-flash-1017", - "name": "DeepSeek V4.1 Flash 1017 (reka-ai)", - "display_name": "DeepSeek V4.1 Flash 1017 (reka-ai)", + "id": "kimi-k2.5", + "name": "Kimi K2.5", + "display_name": "Kimi K2.5", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 393216 + "context": 262144, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -89301,28 +88034,26 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "none", - "minimal", - "low", - "medium", - "high", - "xhigh", - "max" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, "attachment": true, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-10-17", - "last_updated": "2026-10-17", + "knowledge": "2025-01", + "release_date": "2026-01-27", + "last_updated": "2026-01-27", "type": "chat" }, { - "id": "reka-ai/deepseek-v4.1-flash", - "name": "DeepSeek V4.1 Flash (reka-ai)", - "display_name": "DeepSeek V4.1 Flash (reka-ai)", + "id": "grok-4.3", + "name": "Grok 4.3", + "display_name": "Grok 4.3", "modalities": { "input": [ "text", @@ -89333,8 +88064,8 @@ ] }, "limit": { - "context": 1048576, - "output": 393216 + "context": 1000000, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -89342,45 +88073,85 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": true, + "open_weights": false, + "release_date": "2026-04-17", + "last_updated": "2026-04-17", + "type": "chat" + }, + { + "id": "gpt-5.5", + "name": "GPT-5.5", + "display_name": "GPT-5.5", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1000000, + "output": 128000 + }, + "temperature": false, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ - "none", - "minimal", "low", "medium", "high", - "xhigh", - "max" - ] + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-09-10", - "last_updated": "2026-09-10", + "open_weights": false, + "knowledge": "2025-12-01", + "release_date": "2026-04-23", + "last_updated": "2026-04-23", "type": "chat" }, { - "id": "reka-ai/glm-5.3-flash", - "name": "GLM-5.3 Flash (reka-ai)", - "display_name": "GLM-5.3 Flash (reka-ai)", + "id": "gemini-3.5-flash", + "name": "Gemini 3.5 Flash", + "display_name": "Gemini 3.5 Flash", "modalities": { "input": [ "text", "image", - "video", - "pdf" + "audio" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -89391,40 +88162,44 @@ "extra_capabilities": { "reasoning": { "supported": true, - "effort_options": [ - "none", + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ "minimal", "low", "medium", - "high", - "xhigh", - "max" + "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2026-05-19", + "last_updated": "2026-05-19", "type": "chat" }, { - "id": "vertex-openai/grok-4-20-non-reasoning", - "name": "Grok 4.20 Non-Reasoning (Vertex AI (OpenAI-compatible))", - "display_name": "Grok 4.20 Non-Reasoning (Vertex AI (OpenAI-compatible))", + "id": "grok-code-fast-1", + "name": "Grok Code Fast 1", + "display_name": "Grok Code Fast 1", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 2000000, - "output": 30000 + "context": 256000, + "output": 16384 }, "temperature": true, "tool_call": true, @@ -89436,16 +88211,16 @@ "supported": true } }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2026-03-09", - "last_updated": "2026-03-09", + "release_date": "2025-09-02", + "last_updated": "2025-09-02", "type": "chat" }, { - "id": "vertex-openai/grok-4-6", - "name": "Grok 4.6 (Vertex AI (OpenAI-compatible))", - "display_name": "Grok 4.6 (Vertex AI (OpenAI-compatible))", + "id": "route-llm", + "name": "RouteLLM", + "display_name": "RouteLLM", "modalities": { "input": [ "text", @@ -89456,156 +88231,132 @@ ] }, "limit": { - "context": 500000, - "output": 500000 + "context": 128000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "minimal", - "low", - "medium", - "high" - ] - } + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2026-02-01", - "release_date": "2026-08-12", - "last_updated": "2026-08-12", + "release_date": "2024-01-01", + "last_updated": "2026-07-10", "type": "chat" }, { - "id": "vertex-openai/grok-4-20-reasoning", - "name": "Grok 4.20 Reasoning (Vertex AI (OpenAI-compatible))", - "display_name": "Grok 4.20 Reasoning (Vertex AI (OpenAI-compatible))", + "id": "gpt-4.1-mini", + "name": "GPT-4.1 mini", + "display_name": "GPT-4.1 mini", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 2000000, - "output": 30000 + "context": 1047576, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "low", - "medium", - "high" - ] - } + "supported": false }, "attachment": true, "open_weights": false, - "release_date": "2026-03-09", - "last_updated": "2026-03-09", + "knowledge": "2024-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", "type": "chat" }, { - "id": "vertex-openai/grok-4-7", - "name": "Grok 4.7 (Vertex AI (OpenAI-compatible))", - "display_name": "Grok 4.7 (Vertex AI (OpenAI-compatible))", + "id": "claude-sonnet-4-5-20250929", + "name": "Claude Sonnet 4.5", + "display_name": "Claude Sonnet 4.5", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 524288, - "output": 524288 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "minimal", - "low", - "medium", - "high" + "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-05", - "release_date": "2026-09-21", - "last_updated": "2026-09-21", + "knowledge": "2025-07-31", + "release_date": "2025-09-29", + "last_updated": "2025-09-29", "type": "chat" }, { - "id": "minimax/minimax-m2", - "name": "MiniMax M2 (MiniMax)", - "display_name": "MiniMax M2 (MiniMax)", + "id": "grok-4-1-fast-non-reasoning", + "name": "Grok 4.1 Fast (Non-Reasoning)", + "display_name": "Grok 4.1 Fast (Non-Reasoning)", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 196608, - "output": 131072 + "context": 2000000, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ] - } + "supported": false }, - "attachment": false, - "open_weights": true, - "release_date": "2025-10-27", - "last_updated": "2025-10-27", + "attachment": true, + "open_weights": false, + "release_date": "2025-11-17", + "last_updated": "2025-11-17", "type": "chat" }, { - "id": "minimax/minimax-m2.5", - "name": "MiniMax M2.5 (MiniMax)", - "display_name": "MiniMax M2.5 (MiniMax)", + "id": "o3-mini", + "name": "o3-mini", + "display_name": "o3-mini", "modalities": { "input": [ "text" @@ -89615,10 +88366,10 @@ ] }, "limit": { - "context": 204800, - "output": 131100 + "context": 200000, + "output": 100000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -89627,38 +88378,42 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ "low", "medium", - "high", - "xhigh", - "max" - ] + "high" + ], + "visibility": "hidden" } }, "attachment": false, - "open_weights": true, - "release_date": "2026-02-12", - "last_updated": "2026-02-12", + "open_weights": false, + "knowledge": "2024-05", + "release_date": "2024-12-20", + "last_updated": "2025-01-29", "type": "chat" }, { - "id": "minimax/minimax-m2.5-highspeed", - "name": "MiniMax M2.5 Highspeed (MiniMax)", - "display_name": "MiniMax M2.5 Highspeed (MiniMax)", + "id": "o4-mini", + "name": "o4-mini", + "display_name": "o4-mini", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 204800, - "output": 131100 + "context": 200000, + "output": 100000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -89667,79 +88422,71 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ "low", "medium", - "high", - "xhigh", - "max" - ] + "high" + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-02-13", - "last_updated": "2026-02-13", + "attachment": true, + "open_weights": false, + "knowledge": "2024-05", + "release_date": "2025-04-16", + "last_updated": "2025-04-16", "type": "chat" }, { - "id": "minimax/minimax-m3.1-flash", - "name": "MiniMax M3.1 Flash (MiniMax)", - "display_name": "MiniMax M3.1 Flash (MiniMax)", + "id": "gpt-4o-mini", + "name": "GPT-4o mini", + "display_name": "GPT-4o mini", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 524288 + "context": 128000, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ] - } + "supported": false }, "attachment": true, "open_weights": false, - "release_date": "2026-10-19", - "last_updated": "2026-10-19", + "knowledge": "2023-09", + "release_date": "2024-07-18", + "last_updated": "2024-07-18", "type": "chat" }, { - "id": "minimax/minimax-m2.1", - "name": "MiniMax M2.1 (MiniMax)", - "display_name": "MiniMax M2.1 (MiniMax)", + "id": "gpt-5-nano", + "name": "GPT-5 Nano", + "display_name": "GPT-5 Nano", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 196608, - "output": 131072 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -89748,36 +88495,48 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ + "minimal", "low", "medium", - "high", - "xhigh", - "max" - ] + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "release_date": "2025-12-23", - "last_updated": "2025-12-23", + "attachment": true, + "open_weights": false, + "knowledge": "2024-05-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "minimax/minimax-m2.1-lightning", - "name": "MiniMax M2.1 Lightning (MiniMax)", - "display_name": "MiniMax M2.1 Lightning (MiniMax)", + "id": "gemini-3.6-flash", + "name": "Gemini 3.6 Flash", + "display_name": "Gemini 3.6 Flash", "modalities": { "input": [ - "text" + "text", + "image", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 196608, - "output": 131072 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -89787,97 +88546,119 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", "low", "medium", - "high", - "xhigh", - "max" + "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" ] } }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2025-12-23", - "last_updated": "2025-12-23", + "knowledge": "2026-03", + "release_date": "2026-07-21", + "last_updated": "2026-07-21", "type": "chat" }, { - "id": "minimax/minimax-text-01", - "name": "MiniMax Text 01 (MiniMax)", - "display_name": "MiniMax Text 01 (MiniMax)", + "id": "claude-opus-4-5-20251101", + "name": "Claude Opus 4.5", + "display_name": "Claude Opus 4.5", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", + "effort_options": [ + "low", + "medium", + "high" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." + ] + } + }, + "attachment": true, "open_weights": false, - "release_date": "2025-01-15", - "last_updated": "2025-01-15", + "knowledge": "2025-05", + "release_date": "2025-11-24", + "last_updated": "2025-11-24", "type": "chat" }, { - "id": "minimax/minimax-m3", - "name": "MiniMax M3 (MiniMax)", - "display_name": "MiniMax M3 (MiniMax)", + "id": "meta-llama/Meta-Llama-3.3-70B-Instruct", + "name": "Llama-3.3-70B-Instruct", + "display_name": "Llama-3.3-70B-Instruct", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 512000, - "output": 131072 + "context": 131072, + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "none", - "minimal", - "low", - "medium", - "high", - "xhigh", - "max" - ] - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-06-01", - "last_updated": "2026-06-01", + "knowledge": "2023-12", + "release_date": "2024-12-06", + "last_updated": "2024-12-06", "type": "chat" }, { - "id": "minimax/minimax-m2.7", - "name": "MiniMax M2.7 (MiniMax)", - "display_name": "MiniMax M2.7 (MiniMax)", + "id": "meta-llama/Meta-Llama-3.1-405B-Instruct-Turbo", + "name": "Llama 3.1 405B Instruct Turbo", + "display_name": "Llama 3.1 405B Instruct Turbo", "modalities": { "input": [ "text" @@ -89887,89 +88668,53 @@ ] }, "limit": { - "context": 204800, - "output": 131100 + "context": 128000, + "output": 4096 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ] - } + "supported": false }, "attachment": false, "open_weights": true, - "release_date": "2026-03-18", - "last_updated": "2026-03-18", + "release_date": "2024-07-23", + "last_updated": "2024-07-23", "type": "chat" }, { - "id": "minimax/minimax-m2.7-highspeed", - "name": "MiniMax M2.7 Highspeed (MiniMax)", - "display_name": "MiniMax M2.7 Highspeed (MiniMax)", + "id": "meta-llama/Llama-4-Maverick-17B-128E-Instruct-FP8", + "name": "Llama 4 Maverick 17B Instruct", + "display_name": "Llama 4 Maverick 17B Instruct", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 204800, - "output": 131100 + "context": 1048576, + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ] - } + "supported": false }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-03-18", - "last_updated": "2026-03-18", + "knowledge": "2024-08", + "release_date": "2025-04-05", + "last_updated": "2025-04-05", "type": "chat" }, { - "id": "deepinfra/granite-4.2-8b", - "name": "Granite 4.2 8B (DeepInfra)", - "display_name": "Granite 4.2 8B (DeepInfra)", + "id": "meta-llama/Meta-Llama-3.1-8B-Instruct", + "name": "Llama 3.1 8B Instruct", + "display_name": "Llama 3.1 8B Instruct", "modalities": { "input": [ "text" @@ -89979,35 +88724,25 @@ ] }, "limit": { - "context": 131072, - "output": 117964 + "context": 128000, + "output": 4096 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "high" - ] - } + "supported": false }, "attachment": false, "open_weights": true, - "release_date": "2026-08-25", - "last_updated": "2026-08-25", + "knowledge": "2023-12", + "release_date": "2024-07-23", + "last_updated": "2024-07-23", "type": "chat" }, { - "id": "deepinfra/ling-3.0-flash-vl", - "name": "Ling 3.0 Flash VL (DeepInfra)", - "display_name": "Ling 3.0 Flash VL (DeepInfra)", + "id": "moonshotai/Kimi-K2.6", + "name": "Kimi K2.6", + "display_name": "Kimi K2.6", "modalities": { "input": [ "text", @@ -90019,8 +88754,8 @@ ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, @@ -90030,29 +88765,24 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "high" - ] + "supported": true } }, "attachment": true, "open_weights": true, - "release_date": "2026-09-10", - "last_updated": "2026-09-10", + "knowledge": "2025-01", + "release_date": "2026-04-20", + "last_updated": "2026-04-20", "type": "chat" }, { - "id": "deepinfra/mimo-v2.6-pro", - "name": "MiMo V2.6 Pro (DeepInfra)", - "display_name": "MiMo V2.6 Pro (DeepInfra)", + "id": "moonshotai/Kimi-K2.7-Code", + "name": "Kimi K2.7 Code", + "display_name": "Kimi K2.7 Code", "modalities": { "input": [ "text", "image", - "audio", "video" ], "output": [ @@ -90060,10 +88790,10 @@ ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 262144, + "output": 262144 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -90071,40 +88801,35 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "none", - "minimal", - "low", - "medium", - "high", - "xhigh", - "max" - ] + "supported": true } }, "attachment": true, "open_weights": true, - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "knowledge": "2025-01", + "release_date": "2026-06-12", + "last_updated": "2026-06-12", "type": "chat" }, { - "id": "deepinfra/deepseek-v4-flash", - "name": "DeepSeek V4 Flash (DeepInfra)", - "display_name": "DeepSeek V4 Flash (DeepInfra)", + "id": "moonshotai/Kimi-K3", + "name": "Kimi K3", + "display_name": "Kimi K3", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 393216 + "context": 1048576, + "output": 131072 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -90112,66 +88837,47 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." - ] + "supported": true } }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" }, { - "id": "deepinfra/qwen3-vl-235b-a22b-instruct", - "name": "Qwen3 VL 235B A22B Instruct (DeepInfra)", - "display_name": "Qwen3 VL 235B A22B Instruct (DeepInfra)", + "id": "deepseek/deepseek-v3.1", + "name": "DeepSeek V3.1", + "display_name": "DeepSeek V3.1", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 128000, + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2025-03-31", - "release_date": "2025-09-23", - "last_updated": "2025-09-23", + "release_date": "2025-08-21", + "last_updated": "2025-08-21", "type": "chat" }, { - "id": "deepinfra/gemma-4-31b-it", - "name": "Gemma 4 31B IT (DeepInfra)", - "display_name": "Gemma 4 31B IT (DeepInfra)", + "id": "openai/gpt-oss-120b", + "name": "GPT OSS 120B", + "display_name": "GPT OSS 120B", "modalities": { "input": [ "text" @@ -90181,8 +88887,8 @@ ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 128000, + "output": 16384 }, "temperature": true, "tool_call": true, @@ -90192,29 +88898,20 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "effort_options": [ - "none", - "minimal", - "low", - "medium", - "high", - "xhigh", - "max" - ] + "supported": true } }, "attachment": false, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "deepinfra/deepseek-v4-pro", - "name": "DeepSeek V4 Pro (DeepInfra)", - "display_name": "DeepSeek V4 Pro (DeepInfra)", + "id": "MiniMaxAI/MiniMax-M2.7", + "name": "MiniMax-M2.7", + "display_name": "MiniMax-M2.7", "modalities": { "input": [ "text" @@ -90224,8 +88921,8 @@ ] }, "limit": { - "context": 1048576, - "output": 64000 + "context": 204800, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -90236,48 +88933,37 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "high", - "max" - ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, "attachment": false, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "release_date": "2026-03-18", + "last_updated": "2026-03-18", "type": "chat" }, { - "id": "deepinfra/deepseek-v4.1-flash-1017", - "name": "DeepSeek V4.1 Flash 1017 (DeepInfra)", - "display_name": "DeepSeek V4.1 Flash 1017 (DeepInfra)", + "id": "MiniMaxAI/MiniMax-M3", + "name": "MiniMax-M3", + "display_name": "MiniMax-M3", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 393216 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -90287,40 +88973,29 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "none", - "minimal", - "low", - "medium", - "high", - "xhigh", - "max" - ] + "supported": true } }, "attachment": true, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-10-17", - "last_updated": "2026-10-17", + "release_date": "2026-06-01", + "last_updated": "2026-06-01", "type": "chat" }, { - "id": "deepinfra/qwen3.5-9b", - "name": "Qwen3.5 9B (DeepInfra)", - "display_name": "Qwen3.5 9B (DeepInfra)", + "id": "Qwen/QwQ-32B", + "name": "QwQ 32B", + "display_name": "QwQ 32B", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, + "context": 32768, "output": 32768 }, "temperature": true, @@ -90340,65 +89015,20 @@ ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-02-23", - "last_updated": "2026-02-23", + "knowledge": "2024-04", + "release_date": "2025-03-05", + "last_updated": "2025-03-05", "type": "chat" }, { - "id": "deepinfra/deepseek-v4.1-flash", - "name": "DeepSeek V4.1 Flash (DeepInfra)", - "display_name": "DeepSeek V4.1 Flash (DeepInfra)", + "id": "Qwen/Qwen3-Coder-480B-A35B-Instruct", + "name": "Qwen3-Coder 480B-A35B Instruct", + "display_name": "Qwen3-Coder 480B-A35B Instruct", "modalities": { "input": [ - "text", - "image" - ], - "output": [ "text" - ] - }, - "limit": { - "context": 1048576, - "output": 393216 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "none", - "minimal", - "low", - "medium", - "high", - "xhigh", - "max" - ] - } - }, - "attachment": true, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-09-10", - "last_updated": "2026-09-10", - "type": "chat" - }, - { - "id": "deepinfra/qwen3-vl-30b-a3b-instruct", - "name": "Qwen3 VL 30B A3B Instruct (DeepInfra)", - "display_name": "Qwen3 VL 30B A3B Instruct (DeepInfra)", - "modalities": { - "input": [ - "text", - "image", - "video" ], "output": [ "text" @@ -90406,23 +89036,24 @@ }, "limit": { "context": 262144, - "output": 32768 + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2025-10-04", - "last_updated": "2025-10-04", + "knowledge": "2025-04", + "release_date": "2025-07-22", + "last_updated": "2025-07-22", "type": "chat" }, { - "id": "deepinfra/ling-3.0-flash", - "name": "InclusionAI Ling 3.0 Flash (DeepInfra)", - "display_name": "InclusionAI Ling 3.0 Flash (DeepInfra)", + "id": "Qwen/Qwen3-32B", + "name": "Qwen3 32B", + "display_name": "Qwen3 32B", "modalities": { "input": [ "text" @@ -90432,8 +89063,8 @@ ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 131072, + "output": 8192 }, "temperature": true, "tool_call": true, @@ -90441,20 +89072,31 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, "attachment": false, "open_weights": true, - "release_date": "2026-07-23", - "last_updated": "2026-07-23", + "knowledge": "2025-04", + "release_date": "2025-04-28", + "last_updated": "2025-04-28", "type": "chat" }, { - "id": "deepinfra/nemotron-3-ultra-550b", - "name": "Nemotron 3 Ultra 550B (DeepInfra)", - "display_name": "Nemotron 3 Ultra 550B (DeepInfra)", + "id": "Qwen/Qwen3-235B-A22B-Instruct-2507", + "name": "Qwen3 235B A22B Instruct", + "display_name": "Qwen3 235B A22B Instruct", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" @@ -90462,23 +89104,23 @@ }, "limit": { "context": 262144, - "output": 262144 + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": true, - "open_weights": false, - "release_date": "2026-06-01", - "last_updated": "2026-06-01", + "attachment": false, + "open_weights": true, + "release_date": "2025-07-21", + "last_updated": "2025-07-21", "type": "chat" }, { - "id": "deepinfra/deepseek-v3.2", - "name": "DeepSeek V3.2 (DeepInfra)", - "display_name": "DeepSeek V3.2 (DeepInfra)", + "id": "Qwen/Qwen2.5-72B-Instruct", + "name": "Qwen 2.5 72B Instruct", + "display_name": "Qwen 2.5 72B Instruct", "modalities": { "input": [ "text" @@ -90488,30 +89130,24 @@ ] }, "limit": { - "context": 160000, - "output": 65536 + "context": 128000, + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, "attachment": false, "open_weights": true, - "knowledge": "2024-07", - "release_date": "2025-12-01", - "last_updated": "2025-12-01", + "release_date": "2024-09-19", + "last_updated": "2024-09-19", "type": "chat" }, { - "id": "deepinfra/gemma-4-26b-a4b-it", - "name": "Gemma 4 26B A4B IT (DeepInfra)", - "display_name": "Gemma 4 26B A4B IT (DeepInfra)", + "id": "Qwen/Qwen3.6-27B", + "name": "Qwen3.6 27B", + "display_name": "Qwen3.6 27B", "modalities": { "input": [ "text" @@ -90522,7 +89158,7 @@ }, "limit": { "context": 262144, - "output": 32768 + "output": 8192 }, "temperature": true, "tool_call": true, @@ -90532,33 +89168,37 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": false, "open_weights": true, - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "release_date": "2026-04-22", + "last_updated": "2026-04-22", "type": "chat" }, { - "id": "deepinfra/mimo-v2.6-flash", - "name": "MiMo V2.6 Flash (DeepInfra)", - "display_name": "MiMo V2.6 Flash (DeepInfra)", + "id": "thinkingmachines/Inkling", + "name": "Inkling", + "display_name": "Inkling", "modalities": { "input": [ "text", - "image", - "audio", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 262144, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -90566,41 +89206,27 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "minimal", - "low", - "medium", - "high", - "xhigh", - "max" - ] - } - }, "attachment": true, "open_weights": true, - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "release_date": "2026-07-15", + "last_updated": "2026-07-15", "type": "chat" }, { - "id": "deepinfra/muse-glimmer-30b", - "name": "Muse Glimmer 30B (DeepInfra)", - "display_name": "Muse Glimmer 30B (DeepInfra)", + "id": "zai-org/GLM-5", + "name": "GLM-5", + "display_name": "GLM-5", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 16384 + "context": 204800, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -90610,146 +89236,107 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "minimal", - "low", - "medium", - "high", - "xhigh", - "max" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2026-01-04", - "release_date": "2026-08-10", - "last_updated": "2026-08-10", + "release_date": "2026-02-12", + "last_updated": "2026-02-12", "type": "chat" }, { - "id": "azure/gpt-5.2", - "name": "GPT-5.2 (Azure)", - "display_name": "GPT-5.2 (Azure)", + "id": "zai-org/GLM-4.7", + "name": "GLM-4.7", + "display_name": "GLM-4.7", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 204800, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2025-12-11", - "last_updated": "2025-12-11", + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-12-22", + "last_updated": "2025-12-22", "type": "chat" }, { - "id": "azure/gpt-5.4-mini", - "name": "GPT-5.4 Mini (Azure)", - "display_name": "GPT-5.4 Mini (Azure)", + "id": "zai-org/GLM-4.5", + "name": "GLM-4.5", + "display_name": "GLM-4.5", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 131072, + "output": 96000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "default": true }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-17", - "last_updated": "2026-03-17", + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-07-28", + "last_updated": "2025-07-28", "type": "chat" }, { - "id": "azure/gpt-5.6-sol", - "name": "GPT-5.6 Sol (Azure)", - "display_name": "GPT-5.6 Sol (Azure)", + "id": "zai-org/GLM-5.2", + "name": "GLM-5.2", + "display_name": "GLM-5.2", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1048576, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -90757,53 +89344,32 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "supported": true } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "attachment": false, + "open_weights": true, + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "azure/gpt-5.2-codex", - "name": "GPT-5.2 Codex (Azure)", - "display_name": "GPT-5.2 Codex (Azure)", + "id": "zai-org/GLM-5.1", + "name": "GLM-5.1", + "display_name": "GLM-5.1", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 204800, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -90811,36 +89377,19 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "supported": true } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2025-12-11", - "last_updated": "2025-12-11", + "attachment": false, + "open_weights": true, + "release_date": "2026-04-07", + "last_updated": "2026-04-07", "type": "chat" }, { - "id": "azure/gpt-5-nano", - "name": "GPT-5 Nano (Azure)", - "display_name": "GPT-5 Nano (Azure)", + "id": "zai-org/GLM-4.6", + "name": "GLM-4.6", + "display_name": "GLM-4.6", "modalities": { "input": [ "text" @@ -90850,10 +89399,10 @@ ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 202752, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -90861,41 +89410,23 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "minimal", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "supported": true } }, "attachment": false, - "open_weights": false, - "knowledge": "2024-05-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-09-30", + "last_updated": "2025-09-30", "type": "chat" }, { - "id": "azure/gpt-4o", - "name": "GPT-4o (Azure)", - "display_name": "GPT-4o (Azure)", + "id": "deepseek-ai/DeepSeek-V3.1-Terminus", + "name": "DeepSeek V3.1 Terminus", + "display_name": "DeepSeek V3.1 Terminus", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" @@ -90903,91 +89434,71 @@ }, "limit": { "context": 128000, - "output": 16384 + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, - "open_weights": false, - "knowledge": "2023-09", - "release_date": "2024-05-13", - "last_updated": "2024-08-06", + "attachment": false, + "open_weights": true, + "release_date": "2025-06-01", + "last_updated": "2025-06-01", "type": "chat" }, { - "id": "azure/gpt-5.4-nano", - "name": "GPT-5.4 Nano (Azure)", - "display_name": "GPT-5.4 Nano (Azure)", + "id": "deepseek-ai/DeepSeek-V3.2", + "name": "DeepSeek V3.2", + "display_name": "DeepSeek V3.2", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 128000, + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "supported": true } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-17", - "last_updated": "2026-03-17", + "attachment": false, + "open_weights": true, + "knowledge": "2024-07", + "release_date": "2025-12-01", + "last_updated": "2025-12-01", "type": "chat" }, { - "id": "azure/gpt-5.6-luna", - "name": "GPT-5.6 Luna (Azure)", - "display_name": "GPT-5.6 Luna (Azure)", + "id": "deepseek-ai/DeepSeek-V4-Pro", + "name": "DeepSeek V4 Pro", + "display_name": "DeepSeek V4 Pro", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1000000, + "output": 32768 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -90998,50 +89509,47 @@ "supported": true, "default_enabled": true, "mode": "effort", - "effort": "medium", + "effort": "high", "effort_options": [ - "none", "low", - "medium", "high", - "xhigh", "max" ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ], - "visibility": "hidden" + "notes": [ + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." + ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "azure/gpt-5.6-terra", - "name": "GPT-5.6 Terra (Azure)", - "display_name": "GPT-5.6 Terra (Azure)", + "id": "deepseek-ai/DeepSeek-V4-Flash", + "name": "DeepSeek V4 Flash", + "display_name": "DeepSeek V4 Flash", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1000000, + "output": 32768 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -91052,50 +89560,47 @@ "supported": true, "default_enabled": true, "mode": "effort", - "effort": "medium", + "effort": "high", "effort_options": [ - "none", "low", - "medium", "high", - "xhigh", "max" ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ], - "visibility": "hidden" + "notes": [ + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." + ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "azure/gpt-6-sol", - "name": "GPT-6 Sol (Azure)", - "display_name": "GPT-6 Sol (Azure)", + "id": "deepseek-ai/DeepSeek-R1", + "name": "DeepSeek R1", + "display_name": "DeepSeek R1", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 128000, + "output": 8192 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -91103,40 +89608,38 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-04-20", - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "attachment": false, + "open_weights": true, + "knowledge": "2024-07", + "release_date": "2025-01-20", + "last_updated": "2025-05-29", "type": "chat" }, { - "id": "azure/gpt-5.3-codex", - "name": "GPT-5.3 Codex (Azure)", - "display_name": "GPT-5.3 Codex (Azure)", + "id": "google/gemma-4-31b-it", + "name": "Gemma 4 31B IT", + "display_name": "Gemma 4 31B IT", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 262144, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -91146,255 +89649,198 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "supported": true } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-05", - "last_updated": "2026-02-05", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" - }, + } + ] + }, + "novita-ai": { + "id": "novita-ai", + "name": "Novita AI", + "display_name": "Novita AI", + "api": "https://api.novita.ai/openai", + "doc": "https://novita.ai/docs/guides/introduction", + "models": [ { - "id": "azure/gpt-6.1-sol", - "name": "GPT-6.1 Sol (Azure)", - "display_name": "GPT-6.1 Sol (Azure)", + "id": "meta-llama/llama-4-scout-17b-16e-instruct", + "name": "Llama 4 Scout 17B Instruct", + "display_name": "Llama 4 Scout 17B Instruct", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 131072, + "output": 131072 }, - "temperature": false, - "tool_call": true, + "temperature": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ] - } + "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2026-04-30", - "release_date": "2026-09-29", - "last_updated": "2026-09-29", + "open_weights": true, + "knowledge": "2024-08", + "release_date": "2025-04-05", + "last_updated": "2025-04-05", "type": "chat" }, { - "id": "azure/gpt-5.4", - "name": "GPT-5.4 (Azure)", - "display_name": "GPT-5.4 (Azure)", + "id": "meta-llama/llama-4-maverick-17b-128e-instruct-fp8", + "name": "Llama 4 Maverick 17B Instruct", + "display_name": "Llama 4 Maverick 17B Instruct", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1048576, + "output": 8192 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-05", - "last_updated": "2026-03-05", + "open_weights": true, + "knowledge": "2024-08", + "release_date": "2025-04-05", + "last_updated": "2025-04-05", "type": "chat" }, { - "id": "azure/gpt-5.1", - "name": "GPT-5.1 (Azure)", - "display_name": "GPT-5.1 (Azure)", + "id": "meta-llama/llama-3.1-8b-instruct", + "name": "Llama-3.1-8B-Instruct", + "display_name": "Llama-3.1-8B-Instruct", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 16384, + "output": 16384 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-11-13", - "last_updated": "2025-11-13", + "attachment": false, + "open_weights": true, + "knowledge": "2023-12", + "release_date": "2024-07-23", + "last_updated": "2024-07-23", "type": "chat" }, { - "id": "azure/gpt-4.1-mini", - "name": "GPT-4.1 Mini (Azure)", - "display_name": "GPT-4.1 Mini (Azure)", + "id": "meta-llama/llama-3.2-1b-instruct", + "name": "Llama 3.2 1B Instruct", + "display_name": "Llama 3.2 1B Instruct", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 32768 + "context": 131000, + "output": 32000 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-04-14", - "last_updated": "2025-04-14", + "attachment": false, + "open_weights": true, + "knowledge": "2023-12", + "release_date": "2024-09-25", + "last_updated": "2024-09-25", "type": "chat" }, { - "id": "azure/gpt-6-astra", - "name": "GPT-6 Astra (Azure)", - "display_name": "GPT-6 Astra (Azure)", + "id": "meta-llama/llama-3.3-70b-instruct", + "name": "Llama-3.3-70B-Instruct", + "display_name": "Llama-3.3-70B-Instruct", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 12288, + "output": 12288 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ] - } + "attachment": false, + "open_weights": true, + "knowledge": "2023-12", + "release_date": "2024-12-06", + "last_updated": "2024-12-06", + "type": "chat" + }, + { + "id": "microsoft/wizardlm-2-8x22b", + "name": "WizardLM 2 8x22B", + "display_name": "WizardLM 2 8x22B", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-04-30", - "release_date": "2026-09-04", - "last_updated": "2026-09-04", + "limit": { + "context": 65535, + "output": 8000 + }, + "temperature": true, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "release_date": "2024-04-15", + "last_updated": "2024-04-15", "type": "chat" }, { - "id": "azure/gpt-oss-120b", - "name": "GPT OSS 120B (Azure)", - "display_name": "GPT OSS 120B (Azure)", + "id": "minimaxai/minimax-m1-80k", + "name": "MiniMax M1 80K", + "display_name": "MiniMax M1 80K", "modalities": { "input": [ "text" @@ -91404,8 +89850,8 @@ ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 1000000, + "output": 40000 }, "temperature": true, "tool_call": true, @@ -91413,42 +89859,29 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "low", - "medium", - "high" - ] - } - }, "attachment": false, "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "release_date": "2025-06-17", + "last_updated": "2025-06-17", "type": "chat" }, { - "id": "azure/gpt-5.5", - "name": "GPT-5.5 (Azure)", - "display_name": "GPT-5.5 (Azure)", + "id": "moonshotai/kimi-k2-thinking", + "name": "Kimi K2 Thinking", + "display_name": "Kimi K2 Thinking", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 262144, + "output": 98304 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -91457,47 +89890,38 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-12-01", - "release_date": "2026-04-23", - "last_updated": "2026-04-23", + "attachment": false, + "open_weights": true, + "knowledge": "2024-08", + "release_date": "2025-11-06", + "last_updated": "2025-11-06", "type": "chat" }, { - "id": "azure/gpt-5-mini", - "name": "GPT-5 Mini (Azure)", - "display_name": "GPT-5 Mini (Azure)", + "id": "moonshotai/kimi-k3.1-pro", + "name": "Kimi K3.1 Pro", + "display_name": "Kimi K3.1 Pro", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 1048576, + "output": 1048576 }, "temperature": false, "tool_call": true, @@ -91508,47 +89932,42 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "minimal", - "low", - "medium", - "high" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ], - "verbosity": "medium", - "verbosity_options": [ + "effort_options": [ "low", - "medium", - "high" - ], - "visibility": "hidden" + "high", + "max" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2024-05-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "release_date": "2026-10-23", + "last_updated": "2026-10-23", "type": "chat" }, { - "id": "azure/gpt-5", - "name": "GPT-5 (Azure)", - "display_name": "GPT-5 (Azure)", + "id": "moonshotai/kimi-k2.7-code", + "name": "Kimi K2.7 Code", + "display_name": "Kimi K2.7 Code", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 262144, + "output": 262144 }, "temperature": false, "tool_call": true, @@ -91559,48 +89978,80 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "minimal", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-06-12", + "last_updated": "2026-06-12", "type": "chat" }, { - "id": "azure/gpt-6-luna", - "name": "GPT-6 Luna (Azure)", - "display_name": "GPT-6 Luna (Azure)", + "id": "moonshotai/kimi-k2.6", + "name": "Kimi K2.6", + "display_name": "Kimi K2.6", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 262144, + "output": 262144 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": true, + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-04-20", + "last_updated": "2026-04-20", + "type": "chat" + }, + { + "id": "moonshotai/kimi-k3.1-pro-highspeed", + "name": "Kimi K3.1 Pro Highspeed", + "display_name": "Kimi K3.1 Pro Highspeed", + "modalities": { + "input": [ + "text", + "image", + "video" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1048576, + "output": 1048576 }, "temperature": false, "tool_call": true, @@ -91610,447 +90061,374 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ - "none", "low", - "medium", "high", - "xhigh", "max" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-05-18", - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "release_date": "2026-10-23", + "last_updated": "2026-10-23", "type": "chat" }, { - "id": "azure/gpt-4.1", - "name": "GPT-4.1 (Azure)", - "display_name": "GPT-4.1 (Azure)", + "id": "moonshotai/kimi-k2-0905", + "name": "Kimi K2 Instruct 0905", + "display_name": "Kimi K2 Instruct 0905", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 32768 + "context": 262144, + "output": 98304 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-04-14", - "last_updated": "2025-04-14", + "attachment": false, + "open_weights": true, + "release_date": "2025-09-05", + "last_updated": "2025-09-05", "type": "chat" }, { - "id": "azure/gpt-5.1-codex-mini", - "name": "GPT-5.1 Codex mini (Azure)", - "display_name": "GPT-5.1 Codex mini (Azure)", + "id": "moonshotai/kimi-k3", + "name": "Kimi K3", + "display_name": "Kimi K3", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 1048576, + "output": 1048576 }, "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ "none", "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "high", + "max" + ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-11-13", - "last_updated": "2025-11-13", + "open_weights": true, + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" }, { - "id": "azure/gpt-5.1-codex", - "name": "GPT-5.1 Codex (Azure)", - "display_name": "GPT-5.1 Codex (Azure)", + "id": "moonshotai/kimi-k2.5", + "name": "Kimi K2.5", + "display_name": "Kimi K2.5", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 272000 + "context": 262144, + "output": 262144 }, "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-11-13", - "last_updated": "2025-11-13", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-01-27", + "last_updated": "2026-01-27", "type": "chat" }, { - "id": "azure/gpt-5.4-pro", - "name": "GPT-5.4 Pro (Azure)", - "display_name": "GPT-5.4 Pro (Azure)", + "id": "moonshotai/kimi-k2-instruct", + "name": "Kimi K2 Instruct", + "display_name": "Kimi K2 Instruct", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 131072, + "output": 98304 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-05", - "last_updated": "2026-03-05", + "attachment": false, + "open_weights": true, + "release_date": "2025-07-11", + "last_updated": "2025-07-11", "type": "chat" }, { - "id": "vertex-anthropic/claude-opus-4-7", - "name": "Claude Opus 4.7 (Vertex AI (Anthropic))", - "display_name": "Claude Opus 4.7 (Vertex AI (Anthropic))", + "id": "deepseek/deepseek-v4-flash-0731", + "name": "DeepSeek V4 Flash 0731", + "display_name": "DeepSeek V4 Flash 0731", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 1048576, + "output": 393216 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], "interleaved": true, "summaries": true, - "visibility": "omitted", + "visibility": "summary", "continuation": [ "thinking_blocks" ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." + "effort_options": [ + "low", + "high", + "max" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-04-16", - "last_updated": "2026-04-16", + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-07-31", + "last_updated": "2026-07-31", "type": "chat" }, { - "id": "vertex-anthropic/claude-sonnet-4-5", - "name": "Claude Sonnet 4.5 (Vertex AI (Anthropic))", - "display_name": "Claude Sonnet 4.5 (Vertex AI (Anthropic))", + "id": "deepseek/deepseek-v4.1-flash", + "name": "DeepSeek V4.1 Flash", + "display_name": "DeepSeek V4.1 Flash", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 1048576, + "output": 393216 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + "effort_options": [ + "low", + "high", + "max" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-07-31", - "release_date": "2025-09-29", - "last_updated": "2025-09-29", + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-09-10", + "last_updated": "2026-09-10", "type": "chat" }, { - "id": "vertex-anthropic/claude-haiku-4-5", - "name": "Claude Haiku 4.5 (Vertex AI (Anthropic))", - "display_name": "Claude Haiku 4.5 (Vertex AI (Anthropic))", + "id": "deepseek/deepseek_v3", + "name": "DeepSeek-V3", + "display_name": "DeepSeek-V3", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 64000, + "output": 16000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": false + "supported": false }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." - ] - } + "attachment": false, + "open_weights": true, + "release_date": "2024-12-26", + "last_updated": "2024-12-26", + "type": "chat" + }, + { + "id": "deepseek/deepseek-r1-0528-qwen3-8b", + "name": "DeepSeek R1 0528 Qwen3 8B", + "display_name": "DeepSeek R1 0528 Qwen3 8B", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-02-28", - "release_date": "2025-10-15", - "last_updated": "2025-10-15", + "limit": { + "context": 128000, + "output": 32000 + }, + "temperature": true, + "tool_call": false, + "reasoning": { + "supported": true, + "default": true + }, + "attachment": false, + "open_weights": true, + "release_date": "2025-05-29", + "last_updated": "2025-05-29", "type": "chat" }, { - "id": "vertex-anthropic/claude-sonnet-5", - "name": "Claude Sonnet 5 (Vertex AI (Anthropic))", - "display_name": "Claude Sonnet 5 (Vertex AI (Anthropic))", + "id": "deepseek/deepseek-r1-turbo", + "name": "DeepSeek R1 (Turbo)", + "display_name": "DeepSeek R1 (Turbo)", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 64000, + "output": 16000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ] - } - }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-30", - "last_updated": "2026-06-30", + "attachment": false, + "open_weights": true, + "knowledge": "2024-07", + "release_date": "2025-01-20", + "last_updated": "2025-05-29", "type": "chat" }, { - "id": "vertex-anthropic/claude-sonnet-4-6", - "name": "Claude Sonnet 4.6 (Vertex AI (Anthropic))", - "display_name": "Claude Sonnet 4.6 (Vertex AI (Anthropic))", + "id": "deepseek/deepseek-v4-pro", + "name": "DeepSeek V4 Pro", + "display_name": "DeepSeek V4 Pro", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 64000 + "context": 1048576, + "output": 393216 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, + "default_enabled": true, + "mode": "effort", "effort": "high", "effort_options": [ "low", - "medium", "high", "max" ], @@ -92061,139 +90439,134 @@ "thinking_blocks" ], "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-17", - "last_updated": "2026-03-13", + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "vertex-anthropic/claude-opus-4-5-20251101", - "name": "Claude Opus 4.5 (Vertex AI (Anthropic))", - "display_name": "Claude Opus 4.5 (Vertex AI (Anthropic))", + "id": "deepseek/deepseek-v4.1-flash-1017", + "name": "DeepSeek V4.1 Flash 1017", + "display_name": "DeepSeek V4.1 Flash 1017", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 32000 + "context": 1048576, + "output": 393216 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high" - ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" ], - "notes": [ - "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." + "effort_options": [ + "low", + "high", + "max" ] } }, "attachment": true, - "open_weights": false, + "open_weights": true, "knowledge": "2025-05", - "release_date": "2025-11-24", - "last_updated": "2025-11-24", + "release_date": "2026-10-17", + "last_updated": "2026-10-17", "type": "chat" }, { - "id": "vertex-anthropic/claude-opus-4-6", - "name": "Claude Opus 4.6 (Vertex AI (Anthropic))", - "display_name": "Claude Opus 4.6 (Vertex AI (Anthropic))", + "id": "deepseek/deepseek-ocr-2", + "name": "DeepSeek OCR 2", + "display_name": "DeepSeek OCR 2", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 8192, + "output": 8192 + }, + "temperature": true, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": true, + "release_date": "2026-01-27", + "last_updated": "2026-01-27", + "type": "chat" + }, + { + "id": "deepseek/deepseek-r1-0528", + "name": "DeepSeek R1 0528", + "display_name": "DeepSeek R1 0528", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 163840, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "max" - ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-05-31", - "release_date": "2026-02-05", - "last_updated": "2026-03-13", + "attachment": false, + "open_weights": true, + "release_date": "2025-05-28", + "last_updated": "2025-05-28", "type": "chat" }, { - "id": "gonka24/minimax-m2.7", - "name": "MiniMax M2.7 (Gonka24)", - "display_name": "MiniMax M2.7 (Gonka24)", + "id": "deepseek/deepseek-v4-pro-0813", + "name": "DeepSeek V4 Pro 0813", + "display_name": "DeepSeek V4 Pro 0813", "modalities": { "input": [ "text" @@ -92203,8 +90576,8 @@ ] }, "limit": { - "context": 204800, - "output": 131100 + "context": 1048576, + "output": 393216 }, "temperature": true, "tool_call": true, @@ -92223,38 +90596,32 @@ ], "effort_options": [ "low", - "medium", "high", - "xhigh", "max" ] } }, "attachment": false, "open_weights": true, - "release_date": "2026-03-18", - "last_updated": "2026-03-18", + "release_date": "2026-08-13", + "last_updated": "2026-08-22", "type": "chat" }, { - "id": "quartz/gemini-3.1-pro-preview", - "name": "Gemini 3.1 Pro (Preview) (Quartz)", - "display_name": "Gemini 3.1 Pro (Preview) (Quartz)", + "id": "openai/gpt-oss-120b", + "name": "GPT OSS 120B", + "display_name": "GPT OSS 120B", "modalities": { "input": [ - "text", - "image", - "video", - "audio", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 131072, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -92265,83 +90632,68 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "low", - "high" - ], + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" + ], + "effort_options": [ + "low", + "medium", + "high" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-02-19", - "last_updated": "2026-02-19", + "attachment": false, + "open_weights": true, + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "meta-contributor/muse-spark-1.3-contributor", - "name": "Muse Spark 1.3 Contributor (Meta Contributor)", - "display_name": "Muse Spark 1.3 Contributor (Meta Contributor)", + "id": "gryphe/mythomax-l2-13b", + "name": "MythoMax L2 13B", + "display_name": "MythoMax L2 13B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 1048576 + "context": 4096, + "output": 3200 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "minimal", - "low", - "medium", - "high", - "xhigh" - ] - } + "supported": false }, - "attachment": true, - "open_weights": false, - "release_date": "2026-09-02", - "last_updated": "2026-09-02", + "attachment": false, + "open_weights": true, + "release_date": "2023-08-10", + "last_updated": "2023-08-10", "type": "chat" }, { - "id": "meta-contributor/muse-spark-1.2-contributor", - "name": "Muse Spark 1.2 Contributor (Meta Contributor)", - "display_name": "Muse Spark 1.2 Contributor (Meta Contributor)", + "id": "nvidia/nemotron-3-nano-30b-a3b", + "name": "Nemotron 3 Nano 30B A3B", + "display_name": "Nemotron 3 Nano 30B A3B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 262144, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -92351,42 +90703,39 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "minimal", - "low", - "medium", - "high", - "xhigh" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, - "attachment": true, - "open_weights": false, - "release_date": "2026-08-06", - "last_updated": "2026-08-06", + "attachment": false, + "open_weights": true, + "knowledge": "2025-06-25", + "release_date": "2025-12-15", + "last_updated": "2025-12-15", "type": "chat" }, { - "id": "google-vertex/gemini-4-argon", - "name": "Gemini 4 Argon (Google Vertex AI)", - "display_name": "Gemini 4 Argon (Google Vertex AI)", + "id": "baidu/cobuddy", + "name": "CoBuddy", + "display_name": "CoBuddy", "modalities": { "input": [ - "text", - "image", - "video", - "audio", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 1048576 + "context": 131072, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -92394,81 +90743,58 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "high" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-10-13", - "last_updated": "2026-10-13", + "release_date": "2026-05-06", + "last_updated": "2026-05-06", "type": "chat" }, { - "id": "google-vertex/gemini-3.5-flash", - "name": "Gemini 3.5 Flash (Google Vertex AI)", - "display_name": "Gemini 3.5 Flash (Google Vertex AI)", + "id": "baidu/ernie-4.5-21B-a3b", + "name": "ERNIE 4.5 21B A3B", + "display_name": "ERNIE 4.5 21B A3B", "modalities": { "input": [ - "text", - "image", - "video", - "audio", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 120000, + "output": 8000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", - "low", - "medium", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-05-19", - "last_updated": "2026-05-19", + "attachment": false, + "open_weights": true, + "release_date": "2025-06-30", + "last_updated": "2025-06-30", "type": "chat" }, { - "id": "google-vertex/gemini-3.5-flash-lite", - "name": "Gemini 3.5 Flash Lite (Google Vertex AI)", - "display_name": "Gemini 3.5 Flash Lite (Google Vertex AI)", + "id": "xiaomimimo/mimo-v2.6-pro", + "name": "MiMo-V2.6-Pro", + "display_name": "MiMo-V2.6-Pro", "modalities": { "input": [ "text", "image", - "video", "audio", - "pdf" + "video" ], "output": [ "text" @@ -92476,7 +90802,7 @@ }, "limit": { "context": 1048576, - "output": 65536 + "output": 131072 }, "temperature": true, "tool_call": true, @@ -92487,32 +90813,27 @@ "extra_capabilities": { "reasoning": { "supported": true, - "effort_options": [ - "minimal", - "low", - "medium", - "high" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-07-21", - "last_updated": "2026-07-21", + "open_weights": true, + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "google-vertex/gemini-3.1-pro-preview", - "name": "Gemini 3.1 Pro (Preview) (Google Vertex AI)", - "display_name": "Gemini 3.1 Pro (Preview) (Google Vertex AI)", + "id": "xiaomimimo/mimo-v2.5-pro", + "name": "MiMo-V2.5-Pro", + "display_name": "MiMo-V2.5-Pro", "modalities": { "input": [ - "text", - "image", - "video", - "audio", - "pdf" + "text" ], "output": [ "text" @@ -92520,7 +90841,7 @@ }, "limit": { "context": 1048576, - "output": 65536 + "output": 131072 }, "temperature": true, "tool_call": true, @@ -92531,38 +90852,30 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "low", - "high" - ], + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-02-19", - "last_updated": "2026-02-19", + "attachment": false, + "open_weights": true, + "knowledge": "2024-12", + "release_date": "2026-04-22", + "last_updated": "2026-04-22", "type": "chat" }, { - "id": "google-vertex/gemini-3.8-flash", - "name": "Gemini 3.8 Flash (Google Vertex AI)", - "display_name": "Gemini 3.8 Flash (Google Vertex AI)", + "id": "xiaomimimo/mimo-v2.5", + "name": "MiMo-V2.5", + "display_name": "MiMo-V2.5", "modalities": { "input": [ "text", "image", - "video", - "audio", - "pdf" + "video" ], "output": [ "text" @@ -92570,7 +90883,7 @@ }, "limit": { "context": 1048576, - "output": 65536 + "output": 131072 }, "temperature": true, "tool_call": true, @@ -92581,39 +90894,31 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", - "low", - "medium", - "high" - ], + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" ] } }, "attachment": true, - "open_weights": false, - "release_date": "2026-09-02", - "last_updated": "2026-09-02", + "open_weights": true, + "knowledge": "2024-12", + "release_date": "2026-04-22", + "last_updated": "2026-04-22", "type": "chat" }, { - "id": "google-vertex/gemini-3.7-flash", - "name": "Gemini 3.7 Flash (Google Vertex AI)", - "display_name": "Gemini 3.7 Flash (Google Vertex AI)", + "id": "xiaomimimo/mimo-v2.6-flash", + "name": "MiMo-V2.6-Flash", + "display_name": "MiMo-V2.6-Flash", "modalities": { "input": [ "text", "image", - "video", "audio", - "pdf" + "video" ], "output": [ "text" @@ -92621,7 +90926,7 @@ }, "limit": { "context": 1048576, - "output": 65536 + "output": 131072 }, "temperature": true, "tool_call": true, @@ -92632,48 +90937,35 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", - "low", - "medium", - "high" - ], + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-08-13", - "last_updated": "2026-08-13", + "open_weights": true, + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "google-vertex/gemini-3-flash-preview", - "name": "Gemini 3 Flash (Preview) (Google Vertex AI)", - "display_name": "Gemini 3 Flash (Preview) (Google Vertex AI)", + "id": "apodex/apodex-1.1-mini", + "name": "Apodex 1.1 Mini", + "display_name": "Apodex 1.1 Mini", "modalities": { "input": [ - "text", - "image", - "video", - "audio", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65535 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, @@ -92684,48 +90976,37 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", - "low", - "medium", - "high" - ], + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-12-17", - "last_updated": "2025-12-17", + "attachment": false, + "open_weights": true, + "release_date": "2026-08-24", + "last_updated": "2026-08-24", "type": "chat" }, { - "id": "google-vertex/gemini-3.6-flash", - "name": "Gemini 3.6 Flash (Google Vertex AI)", - "display_name": "Gemini 3.6 Flash (Google Vertex AI)", + "id": "stepfun/step-5-preview", + "name": "Step 5 Preview", + "display_name": "Step 5 Preview", "modalities": { "input": [ "text", "image", - "video", - "audio", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 1000000, + "output": 64000 }, "temperature": true, "tool_call": true, @@ -92736,48 +91017,42 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", - "low", - "medium", - "high" - ], + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" + ], + "effort_options": [ + "low", + "medium", + "high" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-07-21", - "last_updated": "2026-07-21", + "open_weights": true, + "release_date": "2026-09-16", + "last_updated": "2026-09-20", "type": "chat" }, { - "id": "google-vertex/gemini-3.1-flash-lite", - "name": "Gemini 3.1 Flash Lite (Google Vertex AI)", - "display_name": "Gemini 3.1 Flash Lite (Google Vertex AI)", + "id": "stepfun/step-3.7-flash", + "name": "Step 3.7 Flash", + "display_name": "Step 3.7 Flash", "modalities": { "input": [ "text", "image", - "video", - "audio", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 262144, + "output": 256000 }, "temperature": true, "tool_call": true, @@ -92788,8 +91063,13 @@ "extra_capabilities": { "reasoning": { "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ - "minimal", "low", "medium", "high" @@ -92797,16 +91077,16 @@ } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-05-07", - "last_updated": "2026-05-07", + "open_weights": true, + "knowledge": "2026-03-01", + "release_date": "2026-05-29", + "last_updated": "2026-05-29", "type": "chat" }, { - "id": "baidu/glm-5.1", - "name": "GLM-5.1 (Baidu)", - "display_name": "GLM-5.1 (Baidu)", + "id": "tencent/hy3", + "name": "Hy3", + "display_name": "Hy3", "modalities": { "input": [ "text" @@ -92816,8 +91096,8 @@ ] }, "limit": { - "context": 202752, - "output": 131072 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, @@ -92836,25 +91116,20 @@ ], "effort_options": [ "none", - "minimal", - "low", - "medium", - "high", - "xhigh", - "max" + "high" ] } }, "attachment": false, "open_weights": true, - "release_date": "2026-04-07", - "last_updated": "2026-04-07", + "release_date": "2026-07-06", + "last_updated": "2026-07-06", "type": "chat" }, { - "id": "baidu/deepseek-v4-flash", - "name": "DeepSeek V4 Flash (Baidu)", - "display_name": "DeepSeek V4 Flash (Baidu)", + "id": "tencent/hy4-preview", + "name": "Hy4 preview", + "display_name": "Hy4 preview", "modalities": { "input": [ "text" @@ -92864,8 +91139,8 @@ ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 1000000, + "output": 64000 }, "temperature": true, "tool_call": true, @@ -92876,36 +91151,28 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "high", - "max" - ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" ], - "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." + "effort_options": [ + "none", + "high" ] } }, "attachment": false, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "release_date": "2026-08-28", + "last_updated": "2026-08-28", "type": "chat" }, { - "id": "baidu/deepseek-v4-pro", - "name": "DeepSeek V4 Pro (Baidu)", - "display_name": "DeepSeek V4 Pro (Baidu)", + "id": "nousresearch/hermes-2-pro-llama-3-8b", + "name": "Hermes 2 Pro Llama 3 8B", + "display_name": "Hermes 2 Pro Llama 3 8B", "modalities": { "input": [ "text" @@ -92915,48 +91182,24 @@ ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 8192, + "output": 8192 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." - ] - } + "supported": false }, "attachment": false, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "release_date": "2024-04-30", + "last_updated": "2024-04-30", "type": "chat" }, { - "id": "baidu/glm-5.3", - "name": "GLM-5.3 (Baidu)", - "display_name": "GLM-5.3 (Baidu)", + "id": "baichuan/baichuan-m2-32b", + "name": "Baichuan M2 32B", + "display_name": "Baichuan M2 32B", "modalities": { "input": [ "text" @@ -92966,48 +91209,36 @@ ] }, "limit": { - "context": 1048576, + "context": 131072, "output": 131072 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "low", - "high", - "max" - ] - } - }, "attachment": false, "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "release_date": "2025-08-13", + "last_updated": "2025-08-13", "type": "chat" }, { - "id": "baidu/kimi-k2.6", - "name": "Kimi K2.6 (Baidu)", - "display_name": "Kimi K2.6 (Baidu)", + "id": "zai-org/glm-5.2", + "name": "GLM-5.2", + "display_name": "GLM-5.2", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1048576, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -93026,26 +91257,21 @@ ], "effort_options": [ "none", - "minimal", - "low", - "medium", "high", - "xhigh", "max" ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-20", - "last_updated": "2026-04-20", + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "baidu/glm-5.2", - "name": "GLM-5.2 (Baidu)", - "display_name": "GLM-5.2 (Baidu)", + "id": "zai-org/glm-5.3", + "name": "GLM-5.3", + "display_name": "GLM-5.3", "modalities": { "input": [ "text" @@ -93075,25 +91301,22 @@ ], "effort_options": [ "none", - "minimal", "low", - "medium", "high", - "xhigh", "max" ] } }, "attachment": false, "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "baidu/deepseek-v4.1-flash", - "name": "DeepSeek V4.1 Flash (Baidu)", - "display_name": "DeepSeek V4.1 Flash (Baidu)", + "id": "zai-org/autoglm-phone-9b-multilingual", + "name": "AutoGLM Phone 9B Multilingual", + "display_name": "AutoGLM Phone 9B Multilingual", "modalities": { "input": [ "text", @@ -93104,112 +91327,79 @@ ] }, "limit": { - "context": 1048576, - "output": 393216 + "context": 65536, + "output": 65536 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "none", - "minimal", - "low", - "medium", - "high", - "xhigh", - "max" - ] - } + "supported": false }, "attachment": true, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-09-10", - "last_updated": "2026-09-10", + "release_date": "2025-12-10", + "last_updated": "2025-12-10", "type": "chat" }, { - "id": "azure-anthropic/claude-opus-4-7", - "name": "Claude Opus 4.7 (Azure Anthropic)", - "display_name": "Claude Opus 4.7 (Azure Anthropic)", + "id": "zai-org/glm-4.6v", + "name": "GLM-4.6V", + "display_name": "GLM-4.6V", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 131072, + "output": 32768 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], "interleaved": true, "summaries": true, - "visibility": "omitted", + "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-04-16", - "last_updated": "2026-04-16", + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-12-08", + "last_updated": "2025-12-08", "type": "chat" }, { - "id": "azure-anthropic/claude-sonnet-5-5", - "name": "Claude Sonnet 5.5 (Azure Anthropic)", - "display_name": "Claude Sonnet 5.5 (Azure Anthropic)", + "id": "zai-org/glm-4.7-flash", + "name": "GLM-4.7-Flash", + "display_name": "GLM-4.7-Flash", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, + "context": 200000, "output": 128000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -93217,41 +91407,39 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-09-28", - "last_updated": "2026-09-28", + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2026-01-19", + "last_updated": "2026-01-19", "type": "chat" }, { - "id": "azure-anthropic/claude-fable-5-1", - "name": "Claude Fable 5.1 (Azure Anthropic)", - "display_name": "Claude Fable 5.1 (Azure Anthropic)", + "id": "zai-org/glm-4.6", + "name": "GLM-4.6", + "display_name": "GLM-4.6", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 204800, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -93260,55 +91448,38 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], "interleaved": true, "summaries": true, - "visibility": "omitted", + "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", - "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", - "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-09-01", - "last_updated": "2026-09-01", + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-09-30", + "last_updated": "2025-09-30", "type": "chat" }, { - "id": "azure-anthropic/claude-sonnet-5", - "name": "Claude Sonnet 5 (Azure Anthropic)", - "display_name": "Claude Sonnet 5 (Azure Anthropic)", + "id": "zai-org/glm-4.5-air", + "name": "GLM-4.5-Air", + "display_name": "GLM-4.5-Air", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 131072, + "output": 98304 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -93317,42 +91488,40 @@ "extra_capabilities": { "reasoning": { "supported": true, - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-30", - "last_updated": "2026-06-30", + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-07-28", + "last_updated": "2025-07-28", "type": "chat" }, { - "id": "azure-anthropic/claude-opus-5-5", - "name": "Claude Opus 5.5 (Azure Anthropic)", - "display_name": "Claude Opus 5.5 (Azure Anthropic)", + "id": "zai-org/glm-4.5v", + "name": "GLM-4.5V", + "display_name": "GLM-4.5V", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 65536, + "output": 16384 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -93360,41 +91529,39 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-08-11", + "last_updated": "2025-08-11", "type": "chat" }, { - "id": "azure-anthropic/claude-opus-5", - "name": "Claude Opus 5 (Azure Anthropic)", - "display_name": "Claude Opus 5 (Azure Anthropic)", + "id": "zai-org/glm-5", + "name": "GLM-5", + "display_name": "GLM-5", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 202800, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -93403,158 +91570,123 @@ "extra_capabilities": { "reasoning": { "supported": true, - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-05", - "release_date": "2026-07-24", - "last_updated": "2026-07-24", + "attachment": false, + "open_weights": true, + "release_date": "2026-02-12", + "last_updated": "2026-02-12", "type": "chat" }, { - "id": "azure-anthropic/claude-opus-4-6", - "name": "Claude Opus 4.6 (Azure Anthropic)", - "display_name": "Claude Opus 4.6 (Azure Anthropic)", + "id": "zai-org/glm-5.3-flash", + "name": "GLM-5.3-Flash", + "display_name": "GLM-5.3-Flash", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 1048576, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "max" - ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." + "effort_options": [ + "low", + "high", + "max" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-05-31", - "release_date": "2026-02-05", - "last_updated": "2026-03-13", + "open_weights": true, + "release_date": "2026-08-26", + "last_updated": "2026-08-26", "type": "chat" }, { - "id": "azure-anthropic/claude-opus-4-8", - "name": "Claude Opus 4.8 (Azure Anthropic)", - "display_name": "Claude Opus 4.8 (Azure Anthropic)", + "id": "zai-org/glm-4.7", + "name": "GLM-4.7", + "display_name": "GLM-4.7", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 204800, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], "interleaved": true, "summaries": true, - "visibility": "omitted", + "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-01", - "release_date": "2026-05-28", - "last_updated": "2026-05-28", + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-12-22", + "last_updated": "2025-12-22", "type": "chat" }, { - "id": "azure-anthropic/claude-fable-5", - "name": "Claude Fable 5 (Azure Anthropic)", - "display_name": "Claude Fable 5 (Azure Anthropic)", + "id": "zai-org/glm-5.1", + "name": "GLM-5.1", + "display_name": "GLM-5.1", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 204800, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -93563,55 +91695,37 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], "interleaved": true, "summaries": true, - "visibility": "omitted", + "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", - "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", - "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-09", - "last_updated": "2026-06-09", + "attachment": false, + "open_weights": true, + "release_date": "2026-04-07", + "last_updated": "2026-04-07", "type": "chat" }, { - "id": "aws-mantle/gpt-5.6-sol", - "name": "GPT-5.6 Sol (AWS Mantle)", - "display_name": "GPT-5.6 Sol (AWS Mantle)", + "id": "minimax/minimax-m2.7", + "name": "MiniMax-M2.7", + "display_name": "MiniMax-M2.7", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 921600, - "output": 128000 + "context": 204800, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -93620,52 +91734,37 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "attachment": false, + "open_weights": true, + "release_date": "2026-03-18", + "last_updated": "2026-03-18", "type": "chat" }, { - "id": "aws-mantle/gpt-5.6-luna", - "name": "GPT-5.6 Luna (AWS Mantle)", - "display_name": "GPT-5.6 Luna (AWS Mantle)", + "id": "minimax/minimax-m2.7-highspeed", + "name": "MiniMax-M2.7-highspeed", + "display_name": "MiniMax-M2.7-highspeed", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 921600, - "output": 128000 + "context": 204800, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -93674,52 +91773,39 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "attachment": false, + "open_weights": true, + "release_date": "2026-03-18", + "last_updated": "2026-03-18", "type": "chat" }, { - "id": "aws-mantle/gpt-5.6-terra", - "name": "GPT-5.6 Terra (AWS Mantle)", - "display_name": "GPT-5.6 Terra (AWS Mantle)", + "id": "minimax/minimax-m3", + "name": "MiniMax-M3", + "display_name": "MiniMax-M3", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 921600, - "output": 128000 + "context": 1000000, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -93728,52 +91814,39 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "open_weights": true, + "release_date": "2026-06-01", + "last_updated": "2026-06-01", "type": "chat" }, { - "id": "aws-mantle/gpt-6-astra", - "name": "GPT-6 Astra (AWS Mantle)", - "display_name": "GPT-6 Astra (AWS Mantle)", + "id": "minimax/minimax-m3.1-flash", + "name": "MiniMax-M3.1-Flash", + "display_name": "MiniMax-M3.1-Flash", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1000000, + "output": 524288 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -93782,6 +91855,12 @@ "extra_capabilities": { "reasoning": { "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ "low", "medium", @@ -93793,15 +91872,14 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2026-04-30", - "release_date": "2026-09-04", - "last_updated": "2026-09-04", + "release_date": "2026-10-19", + "last_updated": "2026-10-19", "type": "chat" }, { - "id": "alibaba/glm-5", - "name": "GLM-5 (Alibaba Cloud)", - "display_name": "GLM-5 (Alibaba Cloud)", + "id": "minimax/minimax-m2.5", + "name": "MiniMax-M2.5", + "display_name": "MiniMax-M2.5", "modalities": { "input": [ "text" @@ -93811,8 +91889,8 @@ ] }, "limit": { - "context": 202752, - "output": 16384 + "context": 204800, + "output": 131100 }, "temperature": true, "tool_call": true, @@ -93828,14 +91906,6 @@ "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "effort_options": [ - "none", - "minimal", - "low", - "medium", - "high", - "xhigh" ] } }, @@ -93846,65 +91916,42 @@ "type": "chat" }, { - "id": "alibaba/deepseek-v4-flash", - "name": "DeepSeek V4 Flash (Alibaba Cloud)", - "display_name": "DeepSeek V4 Flash (Alibaba Cloud)", + "id": "google/gemma-3-12b-it", + "name": "Gemma 3 12B IT", + "display_name": "Gemma 3 12B IT", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 393216 + "context": 131072, + "output": 8192 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." - ] - } + "supported": false }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "knowledge": "2024-08", + "release_date": "2025-03-12", + "last_updated": "2025-03-12", "type": "chat" }, { - "id": "alibaba/qwen3.6-35b-a3b", - "name": "Qwen3.6 35B A3B (Alibaba Cloud)", - "display_name": "Qwen3.6 35B A3B (Alibaba Cloud)", + "id": "google/gemma-4-26b-a4b-it", + "name": "Gemma 4 26B A4B IT", + "display_name": "Gemma 4 26B A4B IT", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" @@ -93912,7 +91959,7 @@ }, "limit": { "context": 262144, - "output": 65536 + "output": 131072 }, "temperature": true, "tool_call": true, @@ -93928,41 +91975,31 @@ "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "effort_options": [ - "none", - "minimal", - "low", - "medium", - "high", - "xhigh", - "max" ] } }, "attachment": true, "open_weights": true, - "release_date": "2026-04-17", - "last_updated": "2026-04-17", + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "alibaba/qwen3.7-plus", - "name": "Qwen3.7 Plus (Alibaba Cloud)", - "display_name": "Qwen3.7 Plus (Alibaba Cloud)", + "id": "google/gemma-4-31b-it", + "name": "Gemma 4 31B IT", + "display_name": "Gemma 4 31B IT", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 983616, - "output": 65536 + "context": 262144, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -93973,69 +92010,65 @@ "extra_capabilities": { "reasoning": { "supported": true, - "effort_options": [ - "none", - "minimal", - "low", - "medium", - "high", - "xhigh", - "max" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-04", - "release_date": "2026-06-02", - "last_updated": "2026-06-02", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "alibaba/qwen-max", - "name": "Qwen Max (Alibaba Cloud)", - "display_name": "Qwen Max (Alibaba Cloud)", + "id": "google/gemma-3-27b-it", + "name": "Gemma 3 27B IT", + "display_name": "Gemma 3 27B IT", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 32768, - "output": 8192 + "context": 98304, + "output": 16384 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, - "attachment": false, - "open_weights": false, - "knowledge": "2024-04", - "release_date": "2024-04-03", - "last_updated": "2025-01-25", + "attachment": true, + "open_weights": true, + "knowledge": "2024-08", + "release_date": "2025-03-12", + "last_updated": "2025-03-12", "type": "chat" }, { - "id": "alibaba/qwen3.5-35b-a3b", - "name": "Qwen3.5 35B A3B (Alibaba Cloud)", - "display_name": "Qwen3.5 35B A3B (Alibaba Cloud)", + "id": "mindai/macaron-v1-venti", + "name": "Macaron V1 Venti", + "display_name": "Macaron V1 Venti", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 1048576, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -94054,39 +92087,32 @@ ], "effort_options": [ "none", - "minimal", - "low", - "medium", "high", - "xhigh", "max" ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-02-23", - "last_updated": "2026-02-23", + "release_date": "2026-07-21", + "last_updated": "2026-07-21", "type": "chat" }, { - "id": "alibaba/qwen3.8-max", - "name": "Qwen3.8 Max (Alibaba Cloud)", - "display_name": "Qwen3.8 Max (Alibaba Cloud)", + "id": "mindai/macaron-v1-tall", + "name": "Macaron V1 Tall", + "display_name": "Macaron V1 Tall", "modalities": { "input": [ - "text", - "image", - "video", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 983616, - "output": 131072 + "context": 262144, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -94097,23 +92123,28 @@ "extra_capabilities": { "reasoning": { "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ - "low", - "medium", - "xhigh" + "none", + "high" ] } }, - "attachment": true, - "open_weights": false, - "release_date": "2026-08-03", - "last_updated": "2026-08-03", + "attachment": false, + "open_weights": true, + "release_date": "2026-07-21", + "last_updated": "2026-07-21", "type": "chat" }, { - "id": "alibaba/deepseek-v4-pro", - "name": "DeepSeek V4 Pro (Alibaba Cloud)", - "display_name": "DeepSeek V4 Pro (Alibaba Cloud)", + "id": "inclusionai/ling-3.1-flash", + "name": "Ling 3.1 Flash", + "display_name": "Ling 3.1 Flash", "modalities": { "input": [ "text" @@ -94124,7 +92155,7 @@ }, "limit": { "context": 1000000, - "output": 393216 + "output": 262144 }, "temperature": true, "tool_call": true, @@ -94135,41 +92166,27 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "high", - "max" - ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, "attachment": false, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "release_date": "2026-09-29", + "last_updated": "2026-09-29", "type": "chat" }, { - "id": "alibaba/qwen3.5-27b", - "name": "Qwen3.5 27B (Alibaba Cloud)", - "display_name": "Qwen3.5 27B (Alibaba Cloud)", + "id": "inclusionai/ling-3.0-flash", + "name": "Ling 3.0 Flash", + "display_name": "Ling 3.0 Flash", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" @@ -94177,7 +92194,7 @@ }, "limit": { "context": 262144, - "output": 65536 + "output": 32768 }, "temperature": true, "tool_call": true, @@ -94193,41 +92210,30 @@ "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "effort_options": [ - "none", - "minimal", - "low", - "medium", - "high", - "xhigh", - "max" ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-02-23", - "last_updated": "2026-02-23", + "release_date": "2026-07-23", + "last_updated": "2026-07-23", "type": "chat" }, { - "id": "alibaba/qwen3.7-flash", - "name": "Qwen3.7 Flash (Alibaba Cloud)", - "display_name": "Qwen3.7 Flash (Alibaba Cloud)", + "id": "inclusionai/ling-3.0-flash-sante", + "name": "Ling 3.0 Flash Sante", + "display_name": "Ling 3.0 Flash Sante", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 983616, - "output": 65536 + "context": 262144, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -94238,27 +92244,24 @@ "extra_capabilities": { "reasoning": { "supported": true, - "effort_options": [ - "none", - "minimal", - "low", - "medium", - "high", - "xhigh", - "max" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2026-07-15", - "last_updated": "2026-07-15", + "release_date": "2026-09-04", + "last_updated": "2026-09-04", "type": "chat" }, { - "id": "alibaba/qwen3.6-plus", - "name": "Qwen3.6 Plus (Alibaba Cloud)", - "display_name": "Qwen3.6 Plus (Alibaba Cloud)", + "id": "inclusionai/ling-3.0-flash-vl", + "name": "Ling 3.0 Flash VL", + "display_name": "Ling 3.0 Flash VL", "modalities": { "input": [ "text", @@ -94270,8 +92273,8 @@ ] }, "limit": { - "context": 983616, - "output": 65536 + "context": 262144, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -94287,42 +92290,30 @@ "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "effort_options": [ - "none", - "minimal", - "low", - "medium", - "high", - "xhigh", - "max" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-04", - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "open_weights": true, + "release_date": "2026-09-10", + "last_updated": "2026-09-10", "type": "chat" }, { - "id": "alibaba/qwen3.6-flash", - "name": "Qwen3.6 Flash (Alibaba Cloud)", - "display_name": "Qwen3.6 Flash (Alibaba Cloud)", + "id": "inclusionai/ling-3.0-flash-fin", + "name": "Ling 3.0 Flash Fin", + "display_name": "Ling 3.0 Flash Fin", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 983616, - "output": 65536 + "context": 262144, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -94338,56 +92329,47 @@ "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "effort_options": [ - "none", - "minimal", - "low", - "medium", - "high", - "xhigh", - "max" ] } }, - "attachment": true, - "open_weights": false, - "release_date": "2026-04-27", - "last_updated": "2026-04-27", + "attachment": false, + "open_weights": true, + "release_date": "2026-08-27", + "last_updated": "2026-09-03", "type": "chat" }, { - "id": "alibaba/qwen3-coder-flash", - "name": "Qwen3 Coder Flash (Alibaba Cloud)", - "display_name": "Qwen3 Coder Flash (Alibaba Cloud)", + "id": "paddlepaddle/paddleocr-vl", + "name": "PaddleOCR VL", + "display_name": "PaddleOCR VL", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 997952, - "output": 65536 + "context": 16384, + "output": 16384 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, - "attachment": false, - "open_weights": false, - "knowledge": "2025-04", - "release_date": "2025-07-28", - "last_updated": "2025-07-28", + "attachment": true, + "open_weights": true, + "release_date": "2025-10-16", + "last_updated": "2025-10-16", "type": "chat" }, { - "id": "alibaba/glm-5.3", - "name": "GLM-5.3 (Alibaba Cloud)", - "display_name": "GLM-5.3 (Alibaba Cloud)", + "id": "baai/bge-m3", + "name": "BGE M3", + "display_name": "BGE M3", "modalities": { "input": [ "text" @@ -94397,35 +92379,51 @@ ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 8192, + "output": 8192 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "low", - "high", - "max" - ] - } + "attachment": false, + "open_weights": true, + "release_date": "2024-01-30", + "last_updated": "2024-01-30", + "type": "embedding" + }, + { + "id": "baai/bge-reranker-v2-m3", + "name": "BGE Reranker V2 M3", + "display_name": "BGE Reranker V2 M3", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 8000, + "output": 8192 + }, + "temperature": false, + "tool_call": false, + "reasoning": { + "supported": false }, "attachment": false, "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", - "type": "chat" + "release_date": "2024-03-15", + "last_updated": "2024-03-15", + "type": "rerank" }, { - "id": "alibaba/qwen35-397b-a17b", - "name": "Qwen3.5 397B A17B (Alibaba Cloud)", - "display_name": "Qwen3.5 397B A17B (Alibaba Cloud)", + "id": "qwen/qwen3.5-35b-a3b", + "name": "Qwen3.5 35B-A3B", + "display_name": "Qwen3.5 35B-A3B", "modalities": { "input": [ "text", @@ -94448,37 +92446,37 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "none", - "minimal", - "low", - "medium", - "high", - "xhigh", - "max" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, "attachment": true, "open_weights": true, - "release_date": "2026-02-15", - "last_updated": "2026-02-15", + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" }, { - "id": "alibaba/qwen3.7-max", - "name": "Qwen3.7 Max (Alibaba Cloud)", - "display_name": "Qwen3.7 Max (Alibaba Cloud)", + "id": "qwen/qwen3.6-27b", + "name": "Qwen3.6 27B", + "display_name": "Qwen3.6 27B", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 983616, + "context": 262144, "output": 65536 }, "temperature": true, @@ -94490,42 +92488,37 @@ "extra_capabilities": { "reasoning": { "supported": true, - "effort_options": [ - "none", - "minimal", - "low", - "medium", - "high", - "xhigh", - "max" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, - "attachment": false, - "open_weights": false, - "release_date": "2026-05-21", - "last_updated": "2026-05-21", + "attachment": true, + "open_weights": true, + "release_date": "2026-04-22", + "last_updated": "2026-04-22", "type": "chat" }, { - "id": "alibaba/kimi-k3", - "name": "Kimi K3 (Alibaba Cloud)", - "display_name": "Kimi K3 (Alibaba Cloud)", + "id": "qwen/qwen3.8-2.4t-a95b", + "name": "Qwen3.8 2.4T A95B", + "display_name": "Qwen3.8 2.4T A95B", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 1048576 + "context": 1000000, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -94534,82 +92527,74 @@ "extra_capabilities": { "reasoning": { "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ - "none", - "minimal", "low", "medium", - "high", - "xhigh", - "max" + "xhigh" ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-16", + "release_date": "2026-08-12", + "last_updated": "2026-08-12", "type": "chat" }, { - "id": "alibaba/qwen3-vl-plus", - "name": "Qwen3 VL Plus (Alibaba Cloud)", - "display_name": "Qwen3 VL Plus (Alibaba Cloud)", + "id": "qwen/qwen3-vl-30b-a3b-instruct", + "name": "Qwen3 VL 30B A3B Instruct", + "display_name": "Qwen3 VL 30B A3B Instruct", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 262144, + "context": 131072, "output": 32768 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2025-04", - "release_date": "2025-09-23", - "last_updated": "2025-09-23", + "open_weights": true, + "release_date": "2025-10-04", + "last_updated": "2025-10-04", "type": "chat" }, { - "id": "alibaba/kimi-k2.5", - "name": "Kimi K2.5 (Alibaba Cloud)", - "display_name": "Kimi K2.5 (Alibaba Cloud)", + "id": "qwen/qwen3-omni-30b-a3b-thinking", + "name": "Qwen3 Omni 30B A3B Thinking", + "display_name": "Qwen3 Omni 30B A3B Thinking", "modalities": { "input": [ "text", "image", - "video" + "video", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 98304 + "context": 65536, + "output": 16384 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -94623,29 +92608,19 @@ "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "effort_options": [ - "none", - "minimal", - "low", - "medium", - "high", - "xhigh", - "max" ] } }, "attachment": true, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-01-27", - "last_updated": "2026-01-27", + "release_date": "2025-09-22", + "last_updated": "2025-09-22", "type": "chat" }, { - "id": "alibaba/qwen-flash", - "name": "Qwen Flash (Alibaba Cloud)", - "display_name": "Qwen Flash (Alibaba Cloud)", + "id": "qwen/qwen3.7-max", + "name": "Qwen3.7 Max", + "display_name": "Qwen3.7 Max", "modalities": { "input": [ "text" @@ -94656,12 +92631,13 @@ }, "limit": { "context": 1000000, - "output": 32000 + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { @@ -94676,19 +92652,19 @@ }, "attachment": false, "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-07-28", - "last_updated": "2025-07-28", + "release_date": "2026-05-21", + "last_updated": "2026-05-21", "type": "chat" }, { - "id": "alibaba/deepseek-v4.1-flash-1017", - "name": "DeepSeek V4.1 Flash 1017 (Alibaba Cloud)", - "display_name": "DeepSeek V4.1 Flash 1017 (Alibaba Cloud)", + "id": "qwen/qwen3.8-max", + "name": "Qwen3.8 Max", + "display_name": "Qwen3.8 Max", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" @@ -94696,7 +92672,7 @@ }, "limit": { "context": 1000000, - "output": 393216 + "output": 131072 }, "temperature": true, "tool_call": true, @@ -94706,28 +92682,30 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ - "none", - "minimal", "low", "medium", - "high", - "xhigh", - "max" + "xhigh" ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-10-17", - "last_updated": "2026-10-17", + "open_weights": false, + "release_date": "2026-08-03", + "last_updated": "2026-08-03", "type": "chat" }, { - "id": "alibaba/qwen-plus", - "name": "Qwen Plus (Alibaba Cloud)", - "display_name": "Qwen Plus (Alibaba Cloud)", + "id": "qwen/qwen-mt-plus", + "name": "Qwen MT Plus", + "display_name": "Qwen MT Plus", "modalities": { "input": [ "text" @@ -94737,13 +92715,43 @@ ] }, "limit": { - "context": 131072, - "output": 32000 + "context": 16384, + "output": 8192 + }, + "temperature": true, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": false, + "release_date": "2025-07-24", + "last_updated": "2025-07-24", + "type": "chat" + }, + { + "id": "qwen/qwen3.6-35b-a3b", + "name": "Qwen3.6 35B-A3B", + "display_name": "Qwen3.6 35B-A3B", + "modalities": { + "input": [ + "text", + "image", + "video" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 262144, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { @@ -94756,17 +92764,16 @@ ] } }, - "attachment": false, - "open_weights": false, - "knowledge": "2024-04", - "release_date": "2024-01-25", - "last_updated": "2025-09-11", + "attachment": true, + "open_weights": true, + "release_date": "2026-04-17", + "last_updated": "2026-04-17", "type": "chat" }, { - "id": "alibaba/glm-5.2", - "name": "GLM-5.2 (Alibaba Cloud)", - "display_name": "GLM-5.2 (Alibaba Cloud)", + "id": "qwen/qwen3-reranker-8b", + "name": "Qwen3 Reranker 8B", + "display_name": "Qwen3 Reranker 8B", "modalities": { "input": [ "text" @@ -94776,8 +92783,37 @@ ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 32768, + "output": 8192 + }, + "temperature": false, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "release_date": "2025-06-05", + "last_updated": "2025-06-05", + "type": "rerank" + }, + { + "id": "qwen/qwen3.5-397b-a17b", + "name": "Qwen3.5 397B-A17B", + "display_name": "Qwen3.5 397B-A17B", + "modalities": { + "input": [ + "text", + "image", + "video" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 262144, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -94793,40 +92829,32 @@ "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "effort_options": [ - "none", - "minimal", - "low", - "medium", - "high", - "xhigh", - "max" ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "release_date": "2026-02-15", + "last_updated": "2026-02-15", "type": "chat" }, { - "id": "alibaba/deepseek-v4.1-flash", - "name": "DeepSeek V4.1 Flash (Alibaba Cloud)", - "display_name": "DeepSeek V4.1 Flash (Alibaba Cloud)", + "id": "qwen/qwen3.5-27b", + "name": "Qwen3.5 27B", + "display_name": "Qwen3.5 27B", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 393216 + "context": 262144, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -94837,28 +92865,24 @@ "extra_capabilities": { "reasoning": { "supported": true, - "effort_options": [ - "none", - "minimal", - "low", - "medium", - "high", - "xhigh", - "max" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, "attachment": true, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-09-10", - "last_updated": "2026-09-10", + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" }, { - "id": "alibaba/qwen3.5-122b-a10b", - "name": "Qwen3.5 122B A10B (Alibaba Cloud)", - "display_name": "Qwen3.5 122B A10B (Alibaba Cloud)", + "id": "qwen/qwen3.5-122b-a10b", + "name": "Qwen3.5 122B-A10B", + "display_name": "Qwen3.5 122B-A10B", "modalities": { "input": [ "text", @@ -94887,15 +92911,6 @@ "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "effort_options": [ - "none", - "minimal", - "low", - "medium", - "high", - "xhigh", - "max" ] } }, @@ -94906,9 +92921,36 @@ "type": "chat" }, { - "id": "alibaba/qwen3.8-flash", - "name": "Qwen3.8 Flash (Alibaba Cloud)", - "display_name": "Qwen3.8 Flash (Alibaba Cloud)", + "id": "qwen/qwen3-embedding-8b", + "name": "Qwen3 Embedding 8B", + "display_name": "Qwen3 Embedding 8B", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 32768, + "output": 8192 + }, + "temperature": false, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "release_date": "2025-06-05", + "last_updated": "2025-06-05", + "type": "embedding" + }, + { + "id": "qwen/qwen3.8-flash", + "name": "Qwen3.8 Flash", + "display_name": "Qwen3.8 Flash", "modalities": { "input": [ "text", @@ -94920,7 +92962,7 @@ ] }, "limit": { - "context": 983616, + "context": 1000000, "output": 131072 }, "temperature": true, @@ -94932,14 +92974,16 @@ "extra_capabilities": { "reasoning": { "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ - "none", - "minimal", "low", "medium", - "high", - "xhigh", - "max" + "xhigh" ] } }, @@ -94950,12 +92994,14 @@ "type": "chat" }, { - "id": "alibaba/qwen-plus-latest", - "name": "Qwen Plus Latest (Alibaba Cloud)", - "display_name": "Qwen Plus Latest (Alibaba Cloud)", + "id": "qwen/qwen3.8-27b", + "name": "Qwen3.8 27B", + "display_name": "Qwen3.8 27B", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" @@ -94963,12 +93009,13 @@ }, "limit": { "context": 1000000, - "output": 32000 + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { @@ -94978,71 +93025,103 @@ "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "effort_options": [ + "low", + "medium", + "xhigh" ] } }, - "attachment": false, - "open_weights": false, - "release_date": "2024-09-09", - "last_updated": "2024-09-09", + "attachment": true, + "open_weights": true, + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" - }, + } + ] + }, + "greenpt": { + "id": "greenpt", + "name": "GreenPT", + "display_name": "GreenPT", + "api": "https://api.greenpt.ai/v1", + "doc": "https://docs.greenpt.ai", + "models": [ { - "id": "openai/gpt-5.2", - "name": "GPT-5.2 (OpenAI)", - "display_name": "GPT-5.2 (OpenAI)", + "id": "voxtral-small-24b-2507", + "name": "Voxtral Small 24B", + "display_name": "Voxtral Small 24B", "modalities": { "input": [ "text", - "image" + "audio" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 32768, + "output": 16384 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": true, + "knowledge": "2025-07", + "release_date": "2025-07-15", + "last_updated": "2025-07-15", + "type": "chat" + }, + { + "id": "deepseek-v4-flash-0731", + "name": "DeepSeek V4 Flash 0731", + "display_name": "DeepSeek V4 Flash 0731", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1000000, + "output": 384000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", "effort_options": [ "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ + "minimal", "low", "medium", "high" - ], - "visibility": "hidden" + ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2025-12-11", - "last_updated": "2025-12-11", + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-07-31", + "last_updated": "2026-07-31", "type": "chat" }, { - "id": "openai/gpt-5.4-mini", - "name": "GPT-5.4 Mini (OpenAI)", - "display_name": "GPT-5.4 Mini (OpenAI)", + "id": "gemma4", + "name": "gemma4", + "display_name": "gemma4", "modalities": { "input": [ "text", @@ -95053,63 +93132,49 @@ ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 262144, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", "effort_options": [ "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ + "minimal", "low", "medium", "high" - ], - "visibility": "hidden" + ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-17", - "last_updated": "2026-03-17", + "open_weights": true, + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "openai/gpt-5.6-sol", - "name": "GPT-5.6 Sol (OpenAI)", - "display_name": "GPT-5.6 Sol (OpenAI)", + "id": "glm-5.2-caveman-ultra", + "name": "GLM-5.2 Caveman Ultra", + "display_name": "GLM-5.2 Caveman Ultra", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1000000, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -95117,53 +93182,39 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", "effort_options": [ "none", - "low", - "medium", - "high", - "xhigh", - "max" - ], - "verbosity": "medium", - "verbosity_options": [ + "minimal", "low", "medium", "high" - ], - "visibility": "hidden" + ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "attachment": false, + "open_weights": true, + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "openai/gpt-5.5-pro", - "name": "GPT-5.5 Pro (OpenAI)", - "display_name": "GPT-5.5 Pro (OpenAI)", + "id": "mistral-medium-3.5-128b", + "name": "Mistral Medium 3.5", + "display_name": "Mistral Medium 3.5", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 262144, + "output": 16384 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -95171,25 +93222,22 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ - "medium", - "high", - "xhigh" + "none", + "high" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-12-01", - "release_date": "2026-04-23", - "last_updated": "2026-04-23", + "open_weights": true, + "release_date": "2026-04-29", + "last_updated": "2026-04-29", "type": "chat" }, { - "id": "openai/gpt-5-nano", - "name": "GPT-5 Nano (OpenAI)", - "display_name": "GPT-5 Nano (OpenAI)", + "id": "glm-5.2", + "name": "GLM-5.2", + "display_name": "GLM-5.2", "modalities": { "input": [ "text" @@ -95199,10 +93247,10 @@ ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 1000000, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -95211,40 +93259,29 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", "effort_options": [ + "none", "minimal", "low", "medium", "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + ] } }, "attachment": false, - "open_weights": false, - "knowledge": "2024-05-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "open_weights": true, + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "openai/gpt-4o", - "name": "GPT-4o (OpenAI)", - "display_name": "GPT-4o (OpenAI)", + "id": "pixtral-12b-2409", + "name": "Pixtral 12B", + "display_name": "Pixtral 12B", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" @@ -95252,7 +93289,7 @@ }, "limit": { "context": 128000, - "output": 16384 + "output": 4096 }, "temperature": true, "tool_call": true, @@ -95260,16 +93297,16 @@ "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2023-09", - "release_date": "2024-05-13", - "last_updated": "2024-08-06", + "open_weights": true, + "knowledge": "2024-09", + "release_date": "2024-09-11", + "last_updated": "2024-09-11", "type": "chat" }, { - "id": "openai/gpt-5.2-pro", - "name": "GPT-5.2 Pro (OpenAI)", - "display_name": "GPT-5.2 Pro (OpenAI)", + "id": "holo2-30b-a3b", + "name": "Holo2 30B A3B", + "display_name": "Holo2 30B A3B", "modalities": { "input": [ "text", @@ -95280,10 +93317,10 @@ ] }, "limit": { - "context": 400000, - "output": 272000 + "context": 22016, + "output": 16384 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -95291,35 +93328,23 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", "effort_options": [ - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ "low", "medium", "high" - ], - "visibility": "hidden" + ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2025-12-11", - "last_updated": "2025-12-11", + "open_weights": true, + "release_date": "2025-11", + "last_updated": "2025-11", "type": "chat" }, { - "id": "openai/gpt-5.4-nano", - "name": "GPT-5.4 Nano (OpenAI)", - "display_name": "GPT-5.4 Nano (OpenAI)", + "id": "deepseek-v4.1-flash", + "name": "DeepSeek V4.1 Flash", + "display_name": "DeepSeek V4.1 Flash", "modalities": { "input": [ "text", @@ -95330,63 +93355,51 @@ ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 1000000, + "output": 384000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", "effort_options": [ "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ + "minimal", "low", "medium", "high" - ], - "visibility": "hidden" + ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-17", - "last_updated": "2026-03-17", + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-09-10", + "last_updated": "2026-09-10", "type": "chat" }, { - "id": "openai/gpt-5.6-luna", - "name": "GPT-5.6 Luna (OpenAI)", - "display_name": "GPT-5.6 Luna (OpenAI)", + "id": "glm-5.2-honey", + "name": "GLM-5.2 Honey", + "display_name": "GLM-5.2 Honey", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1000000, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -95394,53 +93407,38 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", "effort_options": [ "none", - "low", - "medium", - "high", - "xhigh", - "max" - ], - "verbosity": "medium", - "verbosity_options": [ + "minimal", "low", "medium", "high" - ], - "visibility": "hidden" + ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "attachment": false, + "open_weights": true, + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "openai/gpt-5.6-terra", - "name": "GPT-5.6 Terra (OpenAI)", - "display_name": "GPT-5.6 Terra (OpenAI)", + "id": "glm-5.2-caveman-lite", + "name": "GLM-5.2 Caveman Lite", + "display_name": "GLM-5.2 Caveman Lite", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1000000, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -95448,291 +93446,224 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", "effort_options": [ "none", - "low", - "medium", - "high", - "xhigh", - "max" - ], - "verbosity": "medium", - "verbosity_options": [ + "minimal", "low", "medium", "high" - ], - "visibility": "hidden" + ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "attachment": false, + "open_weights": true, + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "openai/o3", - "name": "o3 (OpenAI)", - "display_name": "o3 (OpenAI)", + "id": "glm-5.2-honey-ultra", + "name": "GLM-5.2 Honey Ultra", + "display_name": "GLM-5.2 Honey Ultra", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 1000000, + "output": 131072 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", "effort_options": [ + "none", + "minimal", "low", "medium", "high" - ], - "visibility": "hidden" + ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-05", - "release_date": "2025-04-16", - "last_updated": "2025-04-16", + "attachment": false, + "open_weights": true, + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "openai/gpt-live-transcribe", - "name": "GPT Live Transcribe (OpenAI)", - "display_name": "GPT Live Transcribe (OpenAI)", + "id": "glm-5.3", + "name": "GLM-5.3", + "display_name": "GLM-5.3", "modalities": { "input": [ - "text", - "audio" + "text" ], "output": [ "text" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 1000000, + "output": 131072 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, - "open_weights": false, - "release_date": "2026-07-28", - "last_updated": "2026-07-28" + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "none", + "minimal", + "low", + "medium", + "high" + ] + } + }, + "attachment": false, + "open_weights": true, + "release_date": "2026-08-14", + "last_updated": "2026-08-14", + "type": "chat" }, { - "id": "openai/gpt-5-pro", - "name": "GPT-5 Pro (OpenAI)", - "display_name": "GPT-5 Pro (OpenAI)", + "id": "green-s-pro", + "name": "Green S Pro", + "display_name": "Green S Pro", "modalities": { "input": [ - "text", - "image" + "audio" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 272000 + "context": 8192, + "output": 8192 }, "temperature": false, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "fixed", - "effort": "high", - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-10-06", - "last_updated": "2025-10-06", - "type": "chat" + "release_date": "2025-02", + "last_updated": "2025-02" }, { - "id": "openai/gpt-6-sol", - "name": "GPT-6 Sol (OpenAI)", - "display_name": "GPT-6 Sol (OpenAI)", + "id": "devstral-2-123b-instruct-2512", + "name": "Devstral 2", + "display_name": "Devstral 2", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 200000, + "output": 16384 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ] - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-04-20", - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "attachment": false, + "open_weights": true, + "knowledge": "2025-12", + "release_date": "2025-12-09", + "last_updated": "2025-12-09", "type": "chat" }, { - "id": "openai/gpt-5.3-codex", - "name": "GPT-5.3 Codex (OpenAI)", - "display_name": "GPT-5.3 Codex (OpenAI)", + "id": "green-s", + "name": "Green S", + "display_name": "Green S", "modalities": { "input": [ - "text", - "image", - "pdf" + "audio" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 8192, + "output": 8192 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-05", - "last_updated": "2026-02-05", - "type": "chat" + "release_date": "2025-01", + "last_updated": "2025-01" }, { - "id": "openai/gpt-4o-mini-transcribe", - "name": "GPT-4o Mini Transcribe (OpenAI)", - "display_name": "GPT-4o Mini Transcribe (OpenAI)", + "id": "green-l", + "name": "Green L", + "display_name": "Green L", "modalities": { "input": [ "text", - "audio" + "image" ], "output": [ "text" ] }, "limit": { - "context": 16000, - "output": 2000 + "context": 128000, + "output": 32768 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, "attachment": true, - "open_weights": false, - "release_date": "2025-03-20", - "last_updated": "2025-03-20", + "open_weights": true, + "knowledge": "2025-03", + "release_date": "2025-06-20", + "last_updated": "2025-06-20", "type": "chat" }, { - "id": "openai/gpt-6.1-sol", - "name": "GPT-6.1 Sol (OpenAI)", - "display_name": "GPT-6.1 Sol (OpenAI)", + "id": "kimi-k2.7-code", + "name": "Kimi K2.7 Code", + "display_name": "Kimi K2.7 Code", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 262144, + "output": 262144 }, "temperature": false, "tool_call": true, @@ -95742,79 +93673,66 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ + "none", + "minimal", "low", "medium", - "high", - "xhigh", - "max" + "high" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-04-30", - "release_date": "2026-09-29", - "last_updated": "2026-09-29", + "attachment": false, + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-06-12", + "last_updated": "2026-06-12", "type": "chat" }, { - "id": "openai/gpt-5.4", - "name": "GPT-5.4 (OpenAI)", - "display_name": "GPT-5.4 (OpenAI)", + "id": "glm-5.2-ponytail-ultra", + "name": "GLM-5.2 Ponytail Ultra", + "display_name": "GLM-5.2 Ponytail Ultra", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", "effort_options": [ "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ + "minimal", "low", "medium", "high" - ], - "visibility": "hidden" + ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-05", - "last_updated": "2026-03-05", + "attachment": false, + "open_weights": true, + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "openai/gpt-5.1", - "name": "GPT-5.1 (OpenAI)", - "display_name": "GPT-5.1 (OpenAI)", + "id": "green-r", + "name": "Green R", + "display_name": "Green R", "modalities": { "input": [ "text", @@ -95825,92 +93743,95 @@ ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 131072, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", "effort_options": [ - "none", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ "low", "medium", "high" - ], - "visibility": "hidden" + ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-11-13", - "last_updated": "2025-11-13", + "open_weights": true, + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "openai/gpt-4.1-mini", - "name": "GPT-4.1 Mini (OpenAI)", - "display_name": "GPT-4.1 Mini (OpenAI)", + "id": "qwen3.6-35b-a3b", + "name": "Qwen3.6 35B-A3B", + "display_name": "Qwen3.6 35B-A3B", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, + "context": 262144, "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "none", + "minimal", + "low", + "medium", + "high" + ] + } }, "attachment": true, - "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-04-14", - "last_updated": "2025-04-14", + "open_weights": true, + "release_date": "2026-04-17", + "last_updated": "2026-04-17", "type": "chat" }, { - "id": "openai/gpt-6-astra", - "name": "GPT-6 Astra (OpenAI)", - "display_name": "GPT-6 Astra (OpenAI)", + "id": "glm-5.2-honey-lite", + "name": "GLM-5.2 Honey Lite", + "display_name": "GLM-5.2 Honey Lite", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1000000, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -95918,69 +93839,67 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ + "none", + "minimal", "low", "medium", - "high", - "xhigh", - "max" + "high" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-04-30", - "release_date": "2026-09-04", - "last_updated": "2026-09-04", + "attachment": false, + "open_weights": true, + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "openai/gpt-transcribe", - "name": "GPT Transcribe (OpenAI)", - "display_name": "GPT Transcribe (OpenAI)", + "id": "qwen3-coder-30b-a3b-instruct", + "name": "Qwen3-Coder 30B-A3B Instruct", + "display_name": "Qwen3-Coder 30B-A3B Instruct", "modalities": { "input": [ - "text", - "audio" + "text" ], "output": [ "text" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 128000, + "output": 32768 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, - "attachment": true, - "open_weights": false, - "release_date": "2026-07-28", - "last_updated": "2026-07-28" + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-07-31", + "last_updated": "2025-07-31", + "type": "chat" }, { - "id": "openai/gpt-5.5", - "name": "GPT-5.5 (OpenAI)", - "display_name": "GPT-5.5 (OpenAI)", + "id": "gpt-oss-120b", + "name": "GPT OSS 120B", + "display_name": "GPT OSS 120B", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 131072, + "output": 32768 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -95989,65 +93908,24 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ "low", "medium", "high" - ], - "visibility": "hidden" + ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-12-01", - "release_date": "2026-04-23", - "last_updated": "2026-04-23", - "type": "chat" - }, - { - "id": "openai/gpt-4o-mini", - "name": "GPT-4o Mini (OpenAI)", - "display_name": "GPT-4o Mini (OpenAI)", - "modalities": { - "input": [ - "text", - "image", - "pdf" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 128000, - "output": 16384 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": false, - "knowledge": "2023-09", - "release_date": "2024-07-18", - "last_updated": "2024-07-18", + "open_weights": true, + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "openai/gpt-5-mini", - "name": "GPT-5 Mini (OpenAI)", - "display_name": "GPT-5 Mini (OpenAI)", + "id": "kimi-k2.6", + "name": "Kimi K2.6", + "display_name": "Kimi K2.6", "modalities": { "input": [ "text", @@ -96058,10 +93936,10 @@ ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 262144, + "output": 262144 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -96070,77 +93948,78 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", "effort_options": [ + "none", "minimal", "low", "medium", "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2024-05-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-04-20", + "last_updated": "2026-04-20", "type": "chat" }, { - "id": "openai/gpt-4o-transcribe", - "name": "GPT-4o Transcribe (OpenAI)", - "display_name": "GPT-4o Transcribe (OpenAI)", + "id": "green-r-raw", + "name": "Green R Raw", + "display_name": "Green R Raw", "modalities": { "input": [ "text", - "audio" + "image" ], "output": [ "text" ] }, "limit": { - "context": 16000, - "output": 2000 + "context": 131072, + "output": 32768 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "high" + ] + } }, "attachment": true, - "open_weights": false, - "release_date": "2025-03-20", - "last_updated": "2025-03-20", + "open_weights": true, + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "openai/gpt-5", - "name": "GPT-5 (OpenAI)", - "display_name": "GPT-5 (OpenAI)", + "id": "glm-5.2-caveman", + "name": "GLM-5.2 Caveman", + "display_name": "GLM-5.2 Caveman", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 1000000, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -96148,51 +94027,38 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", "effort_options": [ + "none", "minimal", "low", "medium", "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "attachment": false, + "open_weights": true, + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "openai/gpt-6-luna", - "name": "GPT-6 Luna (OpenAI)", - "display_name": "GPT-6 Luna (OpenAI)", + "id": "minimax-m2.5", + "name": "MiniMax-M2.5", + "display_name": "MiniMax-M2.5", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 204800, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -96200,32 +94066,29 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ "none", + "minimal", "low", "medium", - "high", - "xhigh", - "max" + "high" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-05-18", - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "attachment": false, + "open_weights": true, + "release_date": "2026-02-12", + "last_updated": "2026-02-12", "type": "chat" }, { - "id": "openai/gpt-4.1", - "name": "GPT-4.1 (OpenAI)", - "display_name": "GPT-4.1 (OpenAI)", + "id": "glm-5.2-ponytail", + "name": "GLM-5.2 Ponytail", + "display_name": "GLM-5.2 Ponytail", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" @@ -96233,38 +94096,48 @@ }, "limit": { "context": 1000000, - "output": 32768 + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-04-14", - "last_updated": "2025-04-14", + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "minimal", + "low", + "medium", + "high" + ] + } + }, + "attachment": false, + "open_weights": true, + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "openai/gpt-5.4-pro", - "name": "GPT-5.4 Pro (OpenAI)", - "display_name": "GPT-5.4 Pro (OpenAI)", + "id": "qwen3.5-397b-a17b", + "name": "Qwen3.5 397B-A17B", + "display_name": "Qwen3.5 397B-A17B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 262144, + "output": 16384 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -96273,34 +94146,31 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "medium", - "high", - "xhigh" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ], - "verbosity": "medium", - "verbosity_options": [ + "effort_options": [ + "none", + "minimal", "low", "medium", "high" - ], - "visibility": "hidden" + ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-05", - "last_updated": "2026-03-05", + "attachment": false, + "open_weights": true, + "release_date": "2026-02-15", + "last_updated": "2026-02-15", "type": "chat" }, { - "id": "mistral/codestral-2508", - "name": "Codestral (Mistral AI)", - "display_name": "Codestral (Mistral AI)", + "id": "llama-3.3-70b-instruct", + "name": "Llama-3.3-70B-Instruct", + "display_name": "Llama-3.3-70B-Instruct", "modalities": { "input": [ "text" @@ -96310,24 +94180,25 @@ ] }, "limit": { - "context": 256000, - "output": 256000 + "context": 100000, + "output": 16384 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2025-07-30", - "last_updated": "2025-07-30", + "open_weights": true, + "knowledge": "2023-12", + "release_date": "2024-12-06", + "last_updated": "2024-12-06", "type": "chat" }, { - "id": "mistral/mistral-large-4", - "name": "Mistral Large 4 (Mistral AI)", - "display_name": "Mistral Large 4 (Mistral AI)", + "id": "kimi-k2.6-fast", + "name": "Kimi K2.6 Fast", + "display_name": "Kimi K2.6 Fast", "modalities": { "input": [ "text", @@ -96338,24 +94209,26 @@ ] }, "limit": { - "context": 1000000, + "context": 262144, "output": 262144 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": true, - "open_weights": false, - "release_date": "2026-10-06", - "last_updated": "2026-10-06", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-04-20", + "last_updated": "2026-04-20", "type": "chat" }, { - "id": "mistral/mistral-large-2512", - "name": "Mistral Large 3 (Mistral AI)", - "display_name": "Mistral Large 3 (Mistral AI)", + "id": "kimi-k3", + "name": "Kimi K3", + "display_name": "Kimi K3", "modalities": { "input": [ "text", @@ -96366,30 +94239,40 @@ ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1048576, + "output": 131072 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "none", + "minimal", + "low", + "medium", + "high" + ] + } }, "attachment": true, "open_weights": true, - "knowledge": "2024-11", - "release_date": "2025-12-02", - "last_updated": "2025-12-02", + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" }, { - "id": "mistral/mistral-medium-3-5", - "name": "Mistral Medium 3.5 (Mistral AI)", - "display_name": "Mistral Medium 3.5 (Mistral AI)", + "id": "qwen3-235b-a22b-instruct-2507", + "name": "Qwen3 235B A22B Instruct 2507", + "display_name": "Qwen3 235B A22B Instruct 2507", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" @@ -96397,23 +94280,24 @@ }, "limit": { "context": 262144, - "output": 262144 + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": true, - "open_weights": false, - "release_date": "2026-04-30", - "last_updated": "2026-04-30", + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-07-21", + "last_updated": "2025-07-21", "type": "chat" }, { - "id": "mistral/ministral-3b-2512", - "name": "Ministral 3B (Mistral AI)", - "display_name": "Ministral 3B (Mistral AI)", + "id": "green-l-raw", + "name": "Green L Raw", + "display_name": "Green L Raw", "modalities": { "input": [ "text", @@ -96424,52 +94308,64 @@ ] }, "limit": { - "context": 131072, - "output": 131072 + "context": 128000, + "output": 32768 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, "attachment": true, "open_weights": true, - "release_date": "2025-12-02", - "last_updated": "2025-12-02", + "knowledge": "2025-03", + "release_date": "2025-06-20", + "last_updated": "2025-06-20", "type": "chat" }, { - "id": "mistral/ministral-14b-2512", - "name": "Ministral 14B (Mistral AI)", - "display_name": "Ministral 14B (Mistral AI)", + "id": "glm-5.2-ponytail-lite", + "name": "GLM-5.2 Ponytail Lite", + "display_name": "GLM-5.2 Ponytail Lite", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1000000, + "output": 131072 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "minimal", + "low", + "medium", + "high" + ] + } + }, + "attachment": false, "open_weights": true, - "release_date": "2025-12-02", - "last_updated": "2025-12-02", + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "mistral/glm-5.3", - "name": "GLM-5.3 (Mistral AI)", - "display_name": "GLM-5.3 (Mistral AI)", + "id": "glm-5.3-flash", + "name": "GLM-5.3-Flash", + "display_name": "GLM-5.3-Flash", "modalities": { "input": [ "text" @@ -96479,7 +94375,7 @@ ] }, "limit": { - "context": 1048576, + "context": 1000000, "output": 131072 }, "temperature": true, @@ -96492,22 +94388,24 @@ "reasoning": { "supported": true, "effort_options": [ + "none", + "minimal", "low", - "high", - "max" + "medium", + "high" ] } }, "attachment": false, "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "release_date": "2026-08-26", + "last_updated": "2026-08-26", "type": "chat" }, { - "id": "mistral/mistral-small-2603", - "name": "Mistral Small 4 (Mistral AI)", - "display_name": "Mistral Small 4 (Mistral AI)", + "id": "mistral-small-3.2-24b-instruct-2506", + "name": "Mistral Small 3.2", + "display_name": "Mistral Small 3.2", "modalities": { "input": [ "text", @@ -96518,8 +94416,8 @@ ] }, "limit": { - "context": 262144, - "output": 256000 + "context": 128000, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -96528,72 +94426,85 @@ }, "attachment": true, "open_weights": true, - "knowledge": "2025-06", - "release_date": "2026-03-16", - "last_updated": "2026-03-16", + "knowledge": "2025-03", + "release_date": "2025-06-20", + "last_updated": "2025-06-20", "type": "chat" }, { - "id": "mistral/devstral-2512", - "name": "Devstral 2 (Mistral AI)", - "display_name": "Devstral 2 (Mistral AI)", + "id": "gemma-3-27b-it", + "name": "Gemma 3 27B", + "display_name": "Gemma 3 27B", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 40000, + "output": 8192 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2025-12", - "release_date": "2025-12-09", - "last_updated": "2025-12-09", + "knowledge": "2024-08", + "release_date": "2025-03-12", + "last_updated": "2025-03-12", "type": "chat" }, { - "id": "mistral/mistral-small-2506", - "name": "Mistral Small 3.2 (Mistral AI)", - "display_name": "Mistral Small 3.2 (Mistral AI)", + "id": "glm-5.1", + "name": "GLM-5.1", + "display_name": "GLM-5.1", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 200000, + "output": 131072 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": false, "open_weights": true, - "knowledge": "2025-03", - "release_date": "2025-06-20", - "last_updated": "2025-06-20", + "release_date": "2026-04-07", + "last_updated": "2026-04-07", "type": "chat" - }, + } + ] + }, + "salad-cloud": { + "id": "salad-cloud", + "name": "SaladCloud AI Gateway", + "display_name": "SaladCloud AI Gateway", + "doc": "https://docs.salad.com/ai-gateway/explanation/overview", + "models": [ { - "id": "mistral/ministral-8b-2512", - "name": "Ministral 8B (Mistral AI)", - "display_name": "Ministral 8B (Mistral AI)", + "id": "qwen3.6-35b-a3b", + "name": "Qwen3.6 35B-A3B", + "display_name": "Qwen3.6 35B-A3B", "modalities": { "input": [ "text", @@ -96608,20 +94519,41 @@ "output": 262144 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": true, "open_weights": true, - "release_date": "2025-12-02", - "last_updated": "2025-12-02", + "release_date": "2026-04-17", + "last_updated": "2026-04-17", "type": "chat" - }, + } + ] + }, + "tempr": { + "id": "tempr", + "name": "Tempr Gateway", + "display_name": "Tempr Gateway", + "api": "https://api.temprhq.io/v1", + "doc": "https://temprhq.io/docs/gateway-reference.html", + "models": [ { - "id": "mistral/mistral-large-latest", - "name": "Mistral Large Latest (Mistral AI)", - "display_name": "Mistral Large Latest (Mistral AI)", + "id": "groq/allam-2-7b", + "name": "ALLaM-2-7b", + "display_name": "ALLaM-2-7b", "modalities": { "input": [ "text" @@ -96631,8 +94563,8 @@ ] }, "limit": { - "context": 128000, - "output": 262144 + "context": 4096, + "output": 4096 }, "temperature": true, "tool_call": false, @@ -96641,15 +94573,14 @@ }, "attachment": false, "open_weights": true, - "knowledge": "2024-11", - "release_date": "2024-11-01", - "last_updated": "2025-12-02", + "release_date": "2025-01-23", + "last_updated": "2025-01-23", "type": "chat" }, { - "id": "consensusprotocol/deepseek-v4-flash", - "name": "DeepSeek V4 Flash (Consensus Protocol)", - "display_name": "DeepSeek V4 Flash (Consensus Protocol)", + "id": "groq/openai/gpt-oss-20b", + "name": "GPT OSS 20B", + "display_name": "GPT OSS 20B", "modalities": { "input": [ "text" @@ -96659,8 +94590,8 @@ ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 131072, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -96671,36 +94602,24 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", "effort_options": [ "low", - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." + "medium", + "high" ] } }, "attachment": false, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "consensusprotocol/gemma-4-31b-it", - "name": "Gemma 4 31B IT (Consensus Protocol)", - "display_name": "Gemma 4 31B IT (Consensus Protocol)", + "id": "groq/openai/gpt-oss-120b", + "name": "GPT OSS 120B", + "display_name": "GPT OSS 120B", "modalities": { "input": [ "text" @@ -96710,8 +94629,8 @@ ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 131072, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -96723,37 +94642,35 @@ "reasoning": { "supported": true, "effort_options": [ - "none", - "high", - "xhigh", - "max" + "low", + "medium", + "high" ] } }, "attachment": false, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "consensusprotocol/Qwen3.8-27B", - "name": "Qwen3.8 27B (Consensus Protocol)", - "display_name": "Qwen3.8 27B (Consensus Protocol)", + "id": "groq/qwen/qwen3.8-27b", + "name": "Qwen3.8 27B", + "display_name": "Qwen3.8 27B", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 262000, - "output": 32768 + "context": 131042, + "output": 16384 }, "temperature": true, "tool_call": true, @@ -96764,9 +94681,10 @@ "extra_capabilities": { "reasoning": { "effort_options": [ + "none", "low", "medium", - "xhigh" + "high" ] } }, @@ -96777,21 +94695,22 @@ "type": "chat" }, { - "id": "consensusprotocol/deepseek-v4.1-flash", - "name": "DeepSeek V4.1 Flash (Consensus Protocol)", - "display_name": "DeepSeek V4.1 Flash (Consensus Protocol)", + "id": "xai/grok-build-0.1", + "name": "Grok Build 0.1", + "display_name": "Grok Build 0.1", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 384000 + "context": 256000, + "output": 256000 }, "temperature": true, "tool_call": true, @@ -96801,37 +94720,32 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "effort_options": [ - "low", - "high", - "xhigh", - "max" - ] + "supported": true } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-09-10", - "last_updated": "2026-09-10", + "open_weights": false, + "release_date": "2026-04-16", + "last_updated": "2026-04-16", "type": "chat" }, { - "id": "consensusprotocol/gpt-oss-20b", - "name": "GPT OSS 20B (Consensus Protocol)", - "display_name": "GPT OSS 20B (Consensus Protocol)", + "id": "xai/grok-4.6", + "name": "Grok 4.6", + "display_name": "Grok 4.6", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 32768 + "context": 500000, + "output": 500000 }, "temperature": true, "tool_call": true, @@ -96845,32 +94759,94 @@ "effort_options": [ "low", "medium", - "high" + "high", + "xhigh" ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "attachment": true, + "open_weights": false, + "knowledge": "2026-02-01", + "release_date": "2026-08-12", + "last_updated": "2026-08-12", "type": "chat" }, { - "id": "consensusprotocol/minimax-m3", - "name": "MiniMax M3 (Consensus Protocol)", - "display_name": "MiniMax M3 (Consensus Protocol)", + "id": "xai/grok-4.20-0309-reasoning", + "name": "Grok 4.20 (Reasoning)", + "display_name": "Grok 4.20 (Reasoning)", + "modalities": { + "input": [ + "text", + "image", + "pdf" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1000000, + "output": 30000 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "attachment": true, + "open_weights": false, + "release_date": "2026-03-09", + "last_updated": "2026-03-09", + "type": "chat" + }, + { + "id": "xai/grok-4.20-0309-non-reasoning", + "name": "Grok 4.20 (Non-Reasoning)", + "display_name": "Grok 4.20 (Non-Reasoning)", "modalities": { "input": [ + "text", + "image", + "pdf" + ], + "output": [ "text" + ] + }, + "limit": { + "context": 1000000, + "output": 30000 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": false, + "release_date": "2026-03-09", + "last_updated": "2026-03-09", + "type": "chat" + }, + { + "id": "xai/grok-4.5", + "name": "Grok 4.5", + "display_name": "Grok 4.5", + "modalities": { + "input": [ + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 512000 + "context": 500000, + "output": 500000 }, "temperature": true, "tool_call": true, @@ -96882,31 +94858,27 @@ "reasoning": { "supported": true, "effort_options": [ - "none", - "minimal", "low", "medium", "high", - "xhigh", - "max" + "xhigh" ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-06-01", - "last_updated": "2026-06-01", + "attachment": true, + "open_weights": false, + "release_date": "2026-07-08", + "last_updated": "2026-07-08", "type": "chat" }, { - "id": "consensusprotocol/glm-5.3-flash", - "name": "GLM-5.3 Flash (Consensus Protocol)", - "display_name": "GLM-5.3 Flash (Consensus Protocol)", + "id": "xai/grok-4.3", + "name": "Grok 4.3", + "display_name": "Grok 4.3", "modalities": { "input": [ "text", "image", - "video", "pdf" ], "output": [ @@ -96914,8 +94886,8 @@ ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 1000000, + "output": 30000 }, "temperature": true, "tool_call": true, @@ -96927,33 +94899,37 @@ "reasoning": { "supported": true, "effort_options": [ + "none", "low", + "medium", "high", - "max" + "xhigh" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", + "open_weights": false, + "release_date": "2026-04-17", + "last_updated": "2026-04-17", "type": "chat" }, { - "id": "consensusprotocol/mimo-v2.6-flash", - "name": "MiMo V2.6 Flash (Consensus Protocol)", - "display_name": "MiMo V2.6 Flash (Consensus Protocol)", + "id": "xai/grok-4.7", + "name": "Grok 4.7", + "display_name": "Grok 4.7", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 500000, + "output": 500000 }, "temperature": true, "tool_call": true, @@ -96964,26 +94940,24 @@ "extra_capabilities": { "reasoning": { "effort_options": [ - "none", - "minimal", "low", "medium", "high", - "xhigh", - "max" + "xhigh" ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "attachment": true, + "open_weights": false, + "knowledge": "2026-05", + "release_date": "2026-09-21", + "last_updated": "2026-09-21", "type": "chat" }, { - "id": "entrim/glm-5.3", - "name": "GLM-5.3 (entrim)", - "display_name": "GLM-5.3 (entrim)", + "id": "zai/glm-5.2", + "name": "GLM-5.2", + "display_name": "GLM-5.2", "modalities": { "input": [ "text" @@ -96993,7 +94967,7 @@ ] }, "limit": { - "context": 1048576, + "context": 1000000, "output": 131072 }, "temperature": true, @@ -97006,36 +94980,36 @@ "reasoning": { "supported": true, "effort_options": [ - "low", - "medium", + "none", "high", - "xhigh", "max" ] } }, "attachment": false, "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "entrim/deepseek-v4.1-flash-1017", - "name": "DeepSeek V4.1 Flash 1017 (entrim)", - "display_name": "DeepSeek V4.1 Flash 1017 (entrim)", + "id": "zai/glm-5v-turbo", + "name": "GLM-5V-Turbo", + "display_name": "GLM-5V-Turbo", "modalities": { "input": [ "text", - "image" + "image", + "video", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 384000 + "context": 200000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -97043,40 +95017,30 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ] - } - }, "attachment": true, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-10-17", - "last_updated": "2026-10-17", + "open_weights": false, + "release_date": "2026-04-01", + "last_updated": "2026-04-01", "type": "chat" }, { - "id": "entrim/deepseek-v4.1-flash", - "name": "DeepSeek V4.1 Flash (entrim)", - "display_name": "DeepSeek V4.1 Flash (entrim)", + "id": "zai/glm-5.3-flashx", + "name": "GLM-5.3-FlashX", + "display_name": "GLM-5.3-FlashX", "modalities": { "input": [ "text", - "image" + "image", + "video", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 384000 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -97086,40 +95050,33 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ "low", - "medium", "high", - "xhigh", "max" ] } }, "attachment": true, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-09-10", - "last_updated": "2026-09-10", + "release_date": "2026-09-18", + "last_updated": "2026-09-18", "type": "chat" }, { - "id": "entrim/glm-5.3-flash", - "name": "GLM-5.3 Flash (entrim)", - "display_name": "GLM-5.3 Flash (entrim)", + "id": "zai/glm-5.3", + "name": "GLM-5.3", + "display_name": "GLM-5.3", "modalities": { "input": [ - "text", - "image", - "video", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, + "context": 1000000, "output": 131072 }, "temperature": true, @@ -97133,23 +95090,21 @@ "supported": true, "effort_options": [ "low", - "medium", "high", - "xhigh", "max" ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "tencent/glm-5.1", - "name": "GLM-5.1 (Tencent Cloud)", - "display_name": "GLM-5.1 (Tencent Cloud)", + "id": "zai/glm-4.7-flashx", + "name": "GLM-4.7-FlashX", + "display_name": "GLM-4.7-FlashX", "modalities": { "input": [ "text" @@ -97160,7 +95115,7 @@ }, "limit": { "context": 200000, - "output": 128000 + "output": 131072 }, "temperature": true, "tool_call": true, @@ -97168,40 +95123,20 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ] - } - }, "attachment": false, "open_weights": true, - "release_date": "2026-04-07", - "last_updated": "2026-04-07", + "knowledge": "2025-04", + "release_date": "2026-01-19", + "last_updated": "2026-01-19", "type": "chat" }, { - "id": "tencent/glm-5v-turbo", - "name": "GLM-5V Turbo (Tencent Cloud)", - "display_name": "GLM-5V Turbo (Tencent Cloud)", + "id": "zai/glm-5-turbo", + "name": "GLM-5-Turbo", + "display_name": "GLM-5-Turbo", "modalities": { "input": [ - "text", - "image", - "video", - "pdf" + "text" ], "output": [ "text" @@ -97209,7 +95144,7 @@ }, "limit": { "context": 200000, - "output": 128000 + "output": 131072 }, "temperature": true, "tool_call": true, @@ -97219,25 +95154,19 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ] + "supported": true } }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2026-04-01", - "last_updated": "2026-04-01", + "release_date": "2026-03-16", + "last_updated": "2026-03-16", "type": "chat" }, { - "id": "tencent/glm-5", - "name": "GLM-5 (Tencent Cloud)", - "display_name": "GLM-5 (Tencent Cloud)", + "id": "zai/glm-4.5", + "name": "GLM-4.5", + "display_name": "GLM-4.5", "modalities": { "input": [ "text" @@ -97247,8 +95176,8 @@ ] }, "limit": { - "context": 200000, - "output": 128000 + "context": 131072, + "output": 98304 }, "temperature": true, "tool_call": true, @@ -97256,47 +95185,30 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "none", - "minimal", - "low", - "medium", - "high", - "xhigh", - "max" - ] - } - }, "attachment": false, "open_weights": true, - "release_date": "2026-02-12", - "last_updated": "2026-02-12", + "knowledge": "2025-04", + "release_date": "2025-07-28", + "last_updated": "2025-07-28", "type": "chat" }, { - "id": "tencent/deepseek-v4-flash", - "name": "DeepSeek V4 Flash (Tencent Cloud)", - "display_name": "DeepSeek V4 Flash (Tencent Cloud)", + "id": "zai/glm-4.6v", + "name": "GLM-4.6V", + "display_name": "GLM-4.6V", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 393216 + "context": 128000, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -97304,39 +95216,17 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." - ] - } - }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "knowledge": "2025-04", + "release_date": "2025-12-08", + "last_updated": "2025-12-08", "type": "chat" }, { - "id": "tencent/hy3", - "name": "Hy3 (Tencent Cloud)", - "display_name": "Hy3 (Tencent Cloud)", + "id": "zai/glm-4.7-flash", + "name": "GLM-4.7-Flash", + "display_name": "GLM-4.7-Flash", "modalities": { "input": [ "text" @@ -97346,7 +95236,7 @@ ] }, "limit": { - "context": 262144, + "context": 200000, "output": 131072 }, "temperature": true, @@ -97357,27 +95247,20 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "effort_options": [ - "none", - "minimal", - "low", - "medium", - "high", - "xhigh" - ] + "supported": true } }, "attachment": false, "open_weights": true, - "release_date": "2026-07-06", - "last_updated": "2026-07-06", + "knowledge": "2025-04", + "release_date": "2026-01-19", + "last_updated": "2026-01-19", "type": "chat" }, { - "id": "tencent/hy4-preview", - "name": "Hy4 Preview (Tencent Cloud)", - "display_name": "Hy4 Preview (Tencent Cloud)", + "id": "zai/glm-4.6", + "name": "GLM-4.6", + "display_name": "GLM-4.6", "modalities": { "input": [ "text" @@ -97387,8 +95270,8 @@ ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 204800, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -97398,78 +95281,49 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "effort_options": [ - "none", - "minimal", - "low", - "medium", - "high", - "xhigh", - "max" - ] + "supported": true } }, "attachment": false, "open_weights": true, - "release_date": "2026-08-28", - "last_updated": "2026-08-28", + "knowledge": "2025-04", + "release_date": "2025-09-30", + "last_updated": "2025-09-30", "type": "chat" }, { - "id": "tencent/kimi-k2.7-code", - "name": "Kimi K2.7 Code (Tencent Cloud)", - "display_name": "Kimi K2.7 Code (Tencent Cloud)", + "id": "zai/glm-4.5-flash", + "name": "GLM-4.5-Flash", + "display_name": "GLM-4.5-Flash", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 131072, + "output": 98304 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "minimal", - "low", - "medium", - "high", - "xhigh", - "max" - ] - } - }, - "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-06-12", - "last_updated": "2026-06-12", + "attachment": false, + "open_weights": false, + "knowledge": "2025-04", + "release_date": "2025-07-28", + "last_updated": "2025-07-28", "type": "chat" }, { - "id": "tencent/deepseek-v4-pro", - "name": "DeepSeek V4 Pro (Tencent Cloud)", - "display_name": "DeepSeek V4 Pro (Tencent Cloud)", + "id": "zai/glm-4.5-air", + "name": "GLM-4.5-Air", + "display_name": "GLM-4.5-Air", "modalities": { "input": [ "text" @@ -97479,8 +95333,8 @@ ] }, "limit": { - "context": 1000000, - "output": 393216 + "context": 131072, + "output": 98304 }, "temperature": true, "tool_call": true, @@ -97488,66 +95342,48 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." - ] - } - }, "attachment": false, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "knowledge": "2025-04", + "release_date": "2025-07-28", + "last_updated": "2025-07-28", "type": "chat" }, { - "id": "tencent/hy-mt2-plus", - "name": "Hy-MT2 Plus (Tencent Cloud)", - "display_name": "Hy-MT2 Plus (Tencent Cloud)", + "id": "zai/glm-4.5v", + "name": "GLM-4.5V", + "display_name": "GLM-4.5V", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 8192, - "output": 4096 + "context": 64000, + "output": 16384 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": false, - "release_date": "2026-05-21", - "last_updated": "2026-05-21", + "attachment": true, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-08-11", + "last_updated": "2025-08-11", "type": "chat" }, { - "id": "tencent/kimi-k2.6", - "name": "Kimi K2.6 (Tencent Cloud)", - "display_name": "Kimi K2.6 (Tencent Cloud)", + "id": "zai/glm-4.6v-flash", + "name": "GLM-4.6V-Flash", + "display_name": "GLM-4.6V-Flash", "modalities": { "input": [ "text", @@ -97559,8 +95395,36 @@ ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 128000, + "output": 32768 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "attachment": true, + "open_weights": true, + "release_date": "2025-12-08", + "last_updated": "2025-12-08", + "type": "chat" + }, + { + "id": "zai/glm-5", + "name": "GLM-5", + "display_name": "GLM-5", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 204800, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -97576,44 +95440,35 @@ "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "effort_options": [ - "none", - "minimal", - "low", - "medium", - "high", - "xhigh", - "max" ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-20", - "last_updated": "2026-04-20", + "release_date": "2026-02-12", + "last_updated": "2026-02-12", "type": "chat" }, { - "id": "tencent/kimi-k3", - "name": "Kimi K3 (Tencent Cloud)", - "display_name": "Kimi K3 (Tencent Cloud)", + "id": "zai/glm-5.3-flash", + "name": "GLM-5.3-Flash", + "display_name": "GLM-5.3-Flash", "modalities": { "input": [ "text", "image", - "video" + "video", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 1048576 + "context": 1000000, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -97623,41 +95478,35 @@ "reasoning": { "supported": true, "effort_options": [ - "none", - "minimal", "low", - "medium", "high", - "xhigh", "max" ] } }, "attachment": true, "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-16", + "release_date": "2026-08-26", + "last_updated": "2026-08-26", "type": "chat" }, { - "id": "tencent/kimi-k2.7-code-highspeed", - "name": "Kimi K2.7 Code Highspeed (Tencent Cloud)", - "display_name": "Kimi K2.7 Code Highspeed (Tencent Cloud)", + "id": "zai/glm-4.7", + "name": "GLM-4.7", + "display_name": "GLM-4.7", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 204800, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -97671,28 +95520,20 @@ "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "effort_options": [ - "minimal", - "low", - "medium", - "high", - "xhigh", - "max" ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-06-12", - "last_updated": "2026-06-12", + "knowledge": "2025-04", + "release_date": "2025-12-22", + "last_updated": "2025-12-22", "type": "chat" }, { - "id": "tencent/glm-5.2", - "name": "GLM-5.2 (Tencent Cloud)", - "display_name": "GLM-5.2 (Tencent Cloud)", + "id": "zai/glm-5.1", + "name": "GLM-5.1", + "display_name": "GLM-5.1", "modalities": { "input": [ "text" @@ -97702,8 +95543,8 @@ ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 200000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -97713,39 +95554,23 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "none", - "minimal", - "low", - "medium", - "high", - "xhigh", - "max" - ] + "supported": true } }, "attachment": false, "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "release_date": "2026-04-07", + "last_updated": "2026-04-07", "type": "chat" }, { - "id": "tencent/minimax-m3", - "name": "MiniMax M3 (Tencent Cloud)", - "display_name": "MiniMax M3 (Tencent Cloud)", + "id": "deepseek/deepseek-flash", + "name": "DeepSeek V4.1 Flash", + "display_name": "DeepSeek V4.1 Flash", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" @@ -97753,7 +95578,7 @@ }, "limit": { "context": 1000000, - "output": 131072 + "output": 384000 }, "temperature": true, "tool_call": true, @@ -97763,26 +95588,24 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ "low", - "medium", "high", - "xhigh", "max" ] } }, "attachment": true, "open_weights": true, - "release_date": "2026-06-01", - "last_updated": "2026-06-01", + "knowledge": "2025-05", + "release_date": "2026-09-10", + "last_updated": "2026-09-10", "type": "chat" }, { - "id": "tencent/glm-5-turbo", - "name": "GLM-5 Turbo (Tencent Cloud)", - "display_name": "GLM-5 Turbo (Tencent Cloud)", + "id": "deepseek/deepseek-v4-pro", + "name": "DeepSeek V4 Pro", + "display_name": "DeepSeek V4 Pro", "modalities": { "input": [ "text" @@ -97792,8 +95615,8 @@ ] }, "limit": { - "context": 200000, - "output": 128000 + "context": 1000000, + "output": 384000 }, "temperature": true, "tool_call": true, @@ -97804,38 +95627,50 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", "effort_options": [ "low", - "medium", "high", - "xhigh", "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, "attachment": false, - "open_weights": false, - "release_date": "2026-03-16", - "last_updated": "2026-03-16", + "open_weights": true, + "release_date": "2026-08-13", + "last_updated": "2026-08-22", "type": "chat" }, { - "id": "tencent/minimax-m2.7", - "name": "MiniMax M2.7 (Tencent Cloud)", - "display_name": "MiniMax M2.7 (Tencent Cloud)", + "id": "moonshot/kimi-k2.7-code-highspeed", + "name": "Kimi K2.7 Code Highspeed", + "display_name": "Kimi K2.7 Code Highspeed", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 128000 + "context": 262144, + "output": 262144 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -97843,59 +95678,56 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ] + "supported": true } }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-03-18", - "last_updated": "2026-03-18", + "knowledge": "2025-01", + "release_date": "2026-06-12", + "last_updated": "2026-06-12", "type": "chat" }, { - "id": "inference.net/llama-3.2-11b-instruct", - "name": "Llama 3.2 11B Instruct (Inference.net)", - "display_name": "Llama 3.2 11B Instruct (Inference.net)", + "id": "moonshot/kimi-k2.7-code", + "name": "Kimi K2.7 Code", + "display_name": "Kimi K2.7 Code", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 128000 + "context": 262144, + "output": 262144 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": false, - "release_date": "2024-09-25", - "last_updated": "2024-09-25", + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": true, + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-06-12", + "last_updated": "2026-06-12", "type": "chat" }, { - "id": "inference.net/minimax-m3.1-flash", - "name": "MiniMax M3.1 Flash (Inference.net)", - "display_name": "MiniMax M3.1 Flash (Inference.net)", + "id": "moonshot/kimi-k2.6", + "name": "Kimi K2.6", + "display_name": "Kimi K2.6", "modalities": { "input": [ "text", @@ -97907,10 +95739,10 @@ ] }, "limit": { - "context": 1000000, - "output": 524288 + "context": 262144, + "output": 262144 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -97918,28 +95750,25 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ] + "supported": true } }, "attachment": true, - "open_weights": false, - "release_date": "2026-10-19", - "last_updated": "2026-10-19", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-04-20", + "last_updated": "2026-04-20", "type": "chat" }, { - "id": "inference.net/glm-5.3", - "name": "GLM-5.3 (Inference.net)", - "display_name": "GLM-5.3 (Inference.net)", + "id": "moonshot/kimi-k3", + "name": "Kimi K3", + "display_name": "Kimi K3", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" @@ -97949,7 +95778,7 @@ "context": 1048576, "output": 131072 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -97965,27 +95794,29 @@ ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" }, { - "id": "inference.net/deepseek-v4.1-flash-1017", - "name": "DeepSeek V4.1 Flash 1017 (Inference.net)", - "display_name": "DeepSeek V4.1 Flash 1017 (Inference.net)", + "id": "xiaomi-mimo/mimo-v2.6-pro", + "name": "MiMo-V2.6-Pro", + "display_name": "MiMo-V2.6-Pro", "modalities": { "input": [ "text", - "image" + "image", + "audio", + "video" ], "output": [ "text" ] }, "limit": { - "context": 262144, + "context": 1048576, "output": 131072 }, "temperature": true, @@ -97994,34 +95825,22 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "low", - "high", - "xhigh", - "max" - ] - } - }, "attachment": true, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-10-17", - "last_updated": "2026-10-17", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "inference.net/glm-5.3-flash", - "name": "GLM-5.3 Flash (Inference.net)", - "display_name": "GLM-5.3 Flash (Inference.net)", + "id": "xiaomi-mimo/mimo-v2.6-flash", + "name": "MiMo-V2.6-Flash", + "display_name": "MiMo-V2.6-Flash", "modalities": { "input": [ "text", "image", - "video", - "pdf" + "audio", + "video" ], "output": [ "text" @@ -98029,7 +95848,7 @@ }, "limit": { "context": 1048576, - "output": 128000 + "output": 131072 }, "temperature": true, "tool_call": true, @@ -98037,37 +95856,30 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "low", - "high", - "max" - ] - } - }, "attachment": true, "open_weights": true, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "scx-ai/qwen3-32b", - "name": "Qwen3 32B (SCX.ai (Turbo))", - "display_name": "Qwen3 32B (SCX.ai (Turbo))", + "id": "xiaomi-mimo/mimo-v2.6-pro-ultraspeed", + "name": "MiMo-V2.6-Pro-UltraSpeed", + "display_name": "MiMo-V2.6-Pro-UltraSpeed", "modalities": { "input": [ - "text" + "text", + "image", + "audio", + "video" ], "output": [ "text" ] }, "limit": { - "context": 32768, - "output": 8192 + "context": 1048576, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -98075,28 +95887,16 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-04-28", - "last_updated": "2025-04-28", + "release_date": "2026-09-21", + "last_updated": "2026-09-21", "type": "chat" }, { - "id": "scx-ai/gpt-oss-120b", - "name": "GPT OSS 120B (SCX.ai (Turbo))", - "display_name": "GPT OSS 120B (SCX.ai (Turbo))", + "id": "mistral/zai-glm-5-3", + "name": "GLM-5.3", + "display_name": "GLM-5.3", "modalities": { "input": [ "text" @@ -98106,8 +95906,8 @@ ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -98117,36 +95917,35 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ "low", - "medium", - "high" + "high", + "max" ] } }, "attachment": false, "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "scx-ai/minimax-m2.7", - "name": "MiniMax M2.7 (SCX.ai (Turbo))", - "display_name": "MiniMax M2.7 (SCX.ai (Turbo))", + "id": "mistral/mistral-small-2603", + "name": "Mistral Small 4", + "display_name": "Mistral Small 4", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 196608, - "output": 196608 + "context": 256000, + "output": 256000 }, "temperature": true, "tool_call": true, @@ -98156,43 +95955,35 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" + "none", + "high" ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-03-18", - "last_updated": "2026-03-18", + "knowledge": "2025-06", + "release_date": "2026-03-16", + "last_updated": "2026-03-16", "type": "chat" }, { - "id": "runware/deepseek-v4-flash", - "name": "DeepSeek V4 Flash (Runware)", - "display_name": "DeepSeek V4 Flash (Runware)", + "id": "mistral/mistral-medium-2604", + "name": "Mistral Medium 3.5", + "display_name": "Mistral Medium 3.5", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 384000 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, @@ -98202,129 +95993,78 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", "effort_options": [ - "low", - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." + "none", + "high" ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "release_date": "2026-04-29", + "last_updated": "2026-04-29", "type": "chat" }, { - "id": "runware/gemma-4-31b-it", - "name": "Gemma 4 31B IT (Runware)", - "display_name": "Gemma 4 31B IT (Runware)", + "id": "mistral/mistral-embed", + "name": "Mistral Embed", + "display_name": "Mistral Embed", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 8000, + "output": 3072 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "none", - "high", - "xhigh", - "max" - ] - } + "supported": false }, - "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-02", - "last_updated": "2026-04-02", - "type": "chat" + "attachment": false, + "open_weights": false, + "release_date": "2023-12-11", + "last_updated": "2023-12-11", + "type": "embedding" }, { - "id": "runware/deepseek-v4-pro", - "name": "DeepSeek V4 Pro (Runware)", - "display_name": "DeepSeek V4 Pro (Runware)", + "id": "mistral/mistral-large-2512", + "name": "Mistral Large 3", + "display_name": "Mistral Large 3", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 384000 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." - ] - } + "supported": false }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "knowledge": "2024-11", + "release_date": "2025-12-02", + "last_updated": "2025-12-02", "type": "chat" }, { - "id": "runware/glm-5.3", - "name": "GLM-5.3 (Runware)", - "display_name": "GLM-5.3 (Runware)", + "id": "mistral/zai-glm-5-2", + "name": "GLM-5.2", + "display_name": "GLM-5.2", "modalities": { "input": [ "text" @@ -98345,9 +96085,8 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ - "low", + "none", "high", "max" ] @@ -98355,19 +96094,18 @@ }, "attachment": false, "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "runware/kimi-k2.6", - "name": "Kimi K2.6 (Runware)", - "display_name": "Kimi K2.6 (Runware)", + "id": "mistral/mistral-large-latest", + "name": "Mistral Large (latest)", + "display_name": "Mistral Large (latest)", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" @@ -98375,86 +96113,52 @@ }, "limit": { "context": 262144, - "output": 131072 + "output": 262144 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "none", - "minimal", - "low", - "medium", - "high", - "xhigh", - "max" - ] - } + "supported": false }, "attachment": true, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-20", - "last_updated": "2026-04-20", + "knowledge": "2024-11", + "release_date": "2024-11-01", + "last_updated": "2025-12-02", "type": "chat" }, { - "id": "runware/kimi-k3", - "name": "Kimi K3 (Runware)", - "display_name": "Kimi K3 (Runware)", + "id": "mistral/voxtral-small-latest", + "name": "Voxtral Small (latest)", + "display_name": "Voxtral Small (latest)", "modalities": { "input": [ "text", - "image", - "video" + "audio" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 1048576 + "context": 32000, + "output": 32000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "none", - "low", - "high", - "max" - ] - } + "supported": false }, "attachment": true, "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-16", + "release_date": "2025-07-15", + "last_updated": "2025-07-15", "type": "chat" }, { - "id": "runware/deepseek-v4.1-flash-1017", - "name": "DeepSeek V4.1 Flash 1017 (runware)", - "display_name": "DeepSeek V4.1 Flash 1017 (runware)", + "id": "mistral/mistral-medium-latest", + "name": "Mistral Medium (latest)", + "display_name": "Mistral Medium (latest)", "modalities": { "input": [ "text", @@ -98465,8 +96169,8 @@ ] }, "limit": { - "context": 1048576, - "output": 1048576 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, @@ -98478,35 +96182,32 @@ "reasoning": { "effort_options": [ "none", - "low", - "high", - "xhigh", - "max" + "high" ] } }, "attachment": true, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-10-17", - "last_updated": "2026-10-17", + "release_date": "2026-04-29", + "last_updated": "2026-04-29", "type": "chat" }, { - "id": "runware/gpt-oss-120b", - "name": "GPT OSS 120B (Runware)", - "display_name": "GPT OSS 120B (Runware)", + "id": "mistral/mistral-small-latest", + "name": "Mistral Small (latest)", + "display_name": "Mistral Small (latest)", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 256000, + "output": 256000 }, "temperature": true, "tool_call": true, @@ -98516,87 +96217,90 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ - "low", - "medium", + "none", "high" ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "knowledge": "2025-06", + "release_date": "2026-03-16", + "last_updated": "2026-03-16", "type": "chat" }, { - "id": "runware/glm-5.2", - "name": "GLM-5.2 (Runware)", - "display_name": "GLM-5.2 (Runware)", + "id": "anthropic/claude-sonnet-4-5", + "name": "Claude Sonnet 4.5 (latest)", + "display_name": "Claude Sonnet 4.5 (latest)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1024000, - "output": 128000 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" ], - "effort_options": [ - "none", - "minimal", - "low", - "medium", - "high", - "xhigh", - "max" + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "attachment": true, + "open_weights": false, + "knowledge": "2025-07-31", + "release_date": "2025-09-29", + "last_updated": "2025-09-29", "type": "chat" }, { - "id": "runware/deepseek-v4.1-flash", - "name": "DeepSeek V4.1 Flash (Runware)", - "display_name": "DeepSeek V4.1 Flash (Runware)", + "id": "anthropic/claude-fable-5", + "name": "Claude Fable 5", + "display_name": "Claude Fable 5", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 384000 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -98605,31 +96309,44 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", "effort_options": [ - "none", "low", + "medium", "high", "xhigh", "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", + "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", + "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-09-10", - "last_updated": "2026-09-10", + "open_weights": false, + "knowledge": "2026-01-31", + "release_date": "2026-06-09", + "last_updated": "2026-06-09", "type": "chat" }, { - "id": "runware/glm-5.3-flash", - "name": "GLM-5.3 Flash (Runware)", - "display_name": "GLM-5.3 Flash (Runware)", + "id": "anthropic/claude-haiku-4-5", + "name": "Claude Haiku 4.5 (latest)", + "display_name": "Claude Haiku 4.5 (latest)", "modalities": { "input": [ "text", "image", - "video", "pdf" ], "output": [ @@ -98637,65 +96354,80 @@ ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "effort_options": [ - "none", - "minimal", - "low", - "medium", - "high", - "xhigh", - "max" + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", + "open_weights": false, + "knowledge": "2025-02-28", + "release_date": "2025-10-15", + "last_updated": "2025-10-15", "type": "chat" }, { - "id": "deepseek/deepseek-v4-pro", - "name": "DeepSeek V4 Pro (DeepSeek)", - "display_name": "DeepSeek V4 Pro (DeepSeek)", + "id": "anthropic/claude-sonnet-4-6", + "name": "Claude Sonnet 4.6", + "display_name": "Claude Sonnet 4.6", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 393216 + "context": 1000000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, "effort": "high", "effort_options": [ "low", + "medium", "high", "max" ], @@ -98706,74 +96438,94 @@ "thinking_blocks" ], "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "attachment": true, + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-02-17", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "deepseek/deepseek-v4.1-flash-1017", - "name": "DeepSeek V4.1 Flash 1017 (DeepSeek)", - "display_name": "DeepSeek V4.1 Flash 1017 (DeepSeek)", + "id": "anthropic/claude-opus-4-7", + "name": "Claude Opus 4.7", + "display_name": "Claude Opus 4.7", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 393216 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "high", "effort_options": [ - "none", "low", + "medium", "high", + "xhigh", "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-10-17", - "last_updated": "2026-10-17", + "open_weights": false, + "knowledge": "2026-01-31", + "release_date": "2026-04-16", + "last_updated": "2026-04-16", "type": "chat" }, { - "id": "together-ai/deepseek-v4-pro", - "name": "DeepSeek V4 Pro (Together AI)", - "display_name": "DeepSeek V4 Pro (Together AI)", + "id": "anthropic/claude-fable-5-1", + "name": "Claude Fable 5.1", + "display_name": "Claude Fable 5.1", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 163840 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -98787,104 +96539,156 @@ "effort": "high", "effort_options": [ "low", + "medium", "high", + "xhigh", "max" ], "interleaved": true, "summaries": true, - "visibility": "summary", + "visibility": "omitted", "continuation": [ "thinking_blocks" ], "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." + "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", + "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", + "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "attachment": true, + "open_weights": false, + "knowledge": "2026-06", + "release_date": "2026-09-01", + "last_updated": "2026-09-01", "type": "chat" }, { - "id": "together-ai/minimax-m3.1-flash", - "name": "MiniMax M3.1 Flash (Together AI)", - "display_name": "MiniMax M3.1 Flash (Together AI)", + "id": "anthropic/claude-opus-4-6", + "name": "Claude Opus 4.6", + "display_name": "Claude Opus 4.6", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 1048576 + "context": 1000000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." + ] + } }, "attachment": true, "open_weights": false, - "release_date": "2026-10-19", - "last_updated": "2026-10-19", + "knowledge": "2025-05-31", + "release_date": "2026-02-05", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "together-ai/glm-5.3", - "name": "GLM-5.3 (Together AI)", - "display_name": "GLM-5.3 (Together AI)", + "id": "anthropic/claude-opus-4-8", + "name": "Claude Opus 4.8", + "display_name": "Claude Opus 4.8", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 943717 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "high", "effort_options": [ "low", + "medium", "high", + "xhigh", "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "attachment": true, + "open_weights": false, + "knowledge": "2026-01", + "release_date": "2026-05-28", + "last_updated": "2026-05-28", "type": "chat" }, { - "id": "together-ai/kimi-k3", - "name": "Kimi K3 (Together AI)", - "display_name": "Kimi K3 (Together AI)", + "id": "anthropic/claude-opus-5", + "name": "Claude Opus 5", + "display_name": "Claude Opus 5", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" @@ -98892,7 +96696,7 @@ }, "limit": { "context": 1000000, - "output": 1000000 + "output": 128000 }, "temperature": false, "tool_call": true, @@ -98902,113 +96706,152 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-16", + "open_weights": false, + "knowledge": "2026-05", + "release_date": "2026-07-24", + "last_updated": "2026-07-24", "type": "chat" }, { - "id": "together-ai/deepseek-v4.1-flash-1017", - "name": "DeepSeek V4.1 Flash 1017 (Together AI)", - "display_name": "DeepSeek V4.1 Flash 1017 (Together AI)", + "id": "anthropic/claude-haiku-4-5-20251001", + "name": "Claude Haiku 4.5", + "display_name": "Claude Haiku 4.5", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 393216 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "none", - "low", - "high", - "xhigh", - "max" + "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-10-17", - "last_updated": "2026-10-17", + "open_weights": false, + "knowledge": "2025-02-28", + "release_date": "2025-10-15", + "last_updated": "2025-10-15", "type": "chat" }, { - "id": "together-ai/gpt-oss-120b", - "name": "GPT OSS 120B (Together AI)", - "display_name": "GPT OSS 120B (Together AI)", + "id": "anthropic/claude-opus-4-5", + "name": "Claude Opus 4.5 (latest)", + "display_name": "Claude Opus 4.5 (latest)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", "effort_options": [ "low", "medium", "high" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "attachment": true, + "open_weights": false, + "knowledge": "2025-05", + "release_date": "2025-11-24", + "last_updated": "2025-11-24", "type": "chat" }, { - "id": "together-ai/deepseek-v4.1-flash", - "name": "DeepSeek V4.1 Flash (Together AI)", - "display_name": "DeepSeek V4.1 Flash (Together AI)", + "id": "anthropic/claude-sonnet-5", + "name": "Claude Sonnet 5", + "display_name": "Claude Sonnet 5", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 393216 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -99018,8 +96861,8 @@ "reasoning": { "supported": true, "effort_options": [ - "none", "low", + "medium", "high", "xhigh", "max" @@ -99027,54 +96870,72 @@ } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-09-10", - "last_updated": "2026-09-10", + "open_weights": false, + "knowledge": "2026-01-31", + "release_date": "2026-06-30", + "last_updated": "2026-06-30", "type": "chat" }, { - "id": "together-ai/minimax-m3", - "name": "MiniMax M3 (Together AI)", - "display_name": "MiniMax M3 (Together AI)", + "id": "anthropic/claude-sonnet-4-5-20250929", + "name": "Claude Sonnet 4.5", + "display_name": "Claude Sonnet 4.5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 524288, - "output": 131072 + "context": 200000, + "output": 64000 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-06-01", - "last_updated": "2026-06-01", + "attachment": true, + "open_weights": false, + "knowledge": "2025-07-31", + "release_date": "2025-09-29", + "last_updated": "2025-09-29", "type": "chat" }, { - "id": "together-ai/glm-5.3-flash", - "name": "GLM-5.3 Flash (Together AI)", - "display_name": "GLM-5.3 Flash (Together AI)", + "id": "anthropic/claude-opus-4-5-20251101", + "name": "Claude Opus 4.5", + "display_name": "Claude Opus 4.5", "modalities": { "input": [ "text", "image", - "video", "pdf" ], "output": [ @@ -99082,35 +96943,53 @@ ] }, "limit": { - "context": 1048576, - "output": 943717 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", "effort_options": [ "low", - "high", - "max" + "medium", + "high" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", + "open_weights": false, + "knowledge": "2025-05", + "release_date": "2025-11-24", + "last_updated": "2025-11-24", "type": "chat" }, { - "id": "together-ai/glm-4.7", - "name": "GLM-4.7 (Together AI)", - "display_name": "GLM-4.7 (Together AI)", + "id": "minimax/MiniMax-M2.7", + "name": "MiniMax-M2.7", + "display_name": "MiniMax-M2.7", "modalities": { "input": [ "text" @@ -99120,11 +96999,11 @@ ] }, "limit": { - "context": 202752, - "output": 128000 + "context": 204800, + "output": 131072 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, "default": true @@ -99142,26 +97021,27 @@ }, "attachment": false, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-12-22", - "last_updated": "2025-12-22", + "release_date": "2026-03-18", + "last_updated": "2026-03-18", "type": "chat" }, { - "id": "together-ai/qwen3.8-2.4t-a95b", - "name": "Qwen3.8 2.4T A95B (Together AI)", - "display_name": "Qwen3.8 2.4T A95B (Together AI)", + "id": "minimax/MiniMax-M3", + "name": "MiniMax-M3", + "display_name": "MiniMax-M3", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1010000, - "output": 909000 + "context": 1048576, + "output": 512000 }, "temperature": true, "tool_call": true, @@ -99171,37 +97051,30 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "effort_options": [ - "none", - "low", - "medium", - "xhigh" - ] + "supported": true } }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-08-12", - "last_updated": "2026-08-12", + "release_date": "2026-06-01", + "last_updated": "2026-06-01", "type": "chat" }, { - "id": "together-ai/muse-glimmer-30b", - "name": "Muse Glimmer 30B (Together AI)", - "display_name": "Muse Glimmer 30B (Together AI)", + "id": "minimax/MiniMax-M2.7-highspeed", + "name": "MiniMax-M2.7-highspeed", + "display_name": "MiniMax-M2.7-highspeed", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 117964 + "context": 204800, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -99211,31 +97084,31 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "minimal", - "low", - "medium", - "high", - "xhigh", - "max" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2026-01-04", - "release_date": "2026-08-10", - "last_updated": "2026-08-10", + "release_date": "2026-03-18", + "last_updated": "2026-03-18", "type": "chat" }, { - "id": "anthropic/claude-haiku-5-5", - "name": "Claude Haiku 5.5 (Anthropic)", - "display_name": "Claude Haiku 5.5 (Anthropic)", + "id": "google/gemini-3.1-pro-preview", + "name": "Gemini 3.1 Pro Preview", + "display_name": "Gemini 3.1 Pro Preview", "modalities": { "input": [ "text", "image", + "video", + "audio", "pdf" ], "output": [ @@ -99243,10 +97116,10 @@ ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 1048576, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -99254,31 +97127,38 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "none", + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ "low", - "medium", - "high", - "xhigh", - "max" + "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-10-07", - "last_updated": "2026-10-07", + "knowledge": "2025-01", + "release_date": "2026-02-19", + "last_updated": "2026-02-19", "type": "chat" }, { - "id": "anthropic/claude-haiku-4-5-20251001", - "name": "Claude Haiku 4.5 (2025-10-01) (Anthropic)", - "display_name": "Claude Haiku 4.5 (2025-10-01) (Anthropic)", + "id": "google/gemini-3-flash-preview", + "name": "Gemini 3 Flash Preview", + "display_name": "Gemini 3 Flash Preview", "modalities": { "input": [ "text", "image", + "video", + "audio", "pdf" ], "output": [ @@ -99286,51 +97166,51 @@ ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", + "low", + "medium", + "high" + ], "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + "thought_signatures" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-02-28", - "release_date": "2025-10-15", - "last_updated": "2025-10-15", + "knowledge": "2025-01", + "release_date": "2025-12-17", + "last_updated": "2025-12-17", "type": "chat" }, { - "id": "anthropic/claude-opus-4-7", - "name": "Claude Opus 4.7 (Anthropic)", - "display_name": "Claude Opus 4.7 (Anthropic)", + "id": "google/gemini-3.1-pro-preview-customtools", + "name": "Gemini 3.1 Pro Preview Custom Tools", + "display_name": "Gemini 3.1 Pro Preview Custom Tools", "modalities": { "input": [ "text", "image", + "video", + "audio", "pdf" ], "output": [ @@ -99338,56 +97218,49 @@ ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 1048576, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "high", - "effort_options": [ + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ "low", - "medium", - "high", - "xhigh", - "max" + "high" ], - "interleaved": true, "summaries": true, - "visibility": "omitted", + "visibility": "summary", "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." + "thought_signatures" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-04-16", - "last_updated": "2026-04-16", + "knowledge": "2025-01", + "release_date": "2026-02-19", + "last_updated": "2026-02-19", "type": "chat" }, { - "id": "anthropic/claude-sonnet-4-5", - "name": "Claude Sonnet 4.5 (Anthropic)", - "display_name": "Claude Sonnet 4.5 (Anthropic)", + "id": "google/gemini-3.5-flash-lite", + "name": "Gemini 3.5 Flash Lite", + "display_name": "Gemini 3.5 Flash Lite", "modalities": { "input": [ "text", "image", + "video", + "audio", "pdf" ], "output": [ @@ -99395,103 +97268,71 @@ ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + "effort_options": [ + "minimal", + "low", + "medium", + "high" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-07-31", - "release_date": "2025-09-29", - "last_updated": "2025-09-29", + "knowledge": "2026-03", + "release_date": "2026-07-21", + "last_updated": "2026-07-21", "type": "chat" }, { - "id": "anthropic/claude-haiku-4-5", - "name": "Claude Haiku 4.5 (Anthropic)", - "display_name": "Claude Haiku 4.5 (Anthropic)", + "id": "google/gemini-embedding-001", + "name": "Gemini Embedding 001", + "display_name": "Gemini Embedding 001", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 2048, + "output": 1 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." - ] - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-02-28", - "release_date": "2025-10-15", - "last_updated": "2025-10-15", - "type": "chat" + "knowledge": "2025-05", + "release_date": "2025-05-20", + "last_updated": "2025-05-20", + "type": "embedding" }, { - "id": "anthropic/claude-sonnet-5-5", - "name": "Claude Sonnet 5.5 (Anthropic)", - "display_name": "Claude Sonnet 5.5 (Anthropic)", + "id": "google/gemini-flash-latest", + "name": "Gemini Flash Latest", + "display_name": "Gemini Flash Latest", "modalities": { "input": [ "text", "image", + "video", + "audio", "pdf" ], "output": [ @@ -99499,10 +97340,10 @@ ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 1048576, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -99513,27 +97354,27 @@ "effort_options": [ "low", "medium", - "high", - "xhigh", - "max" + "high" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-09-28", - "last_updated": "2026-09-28", + "knowledge": "2026-03", + "release_date": "2026-08-13", + "last_updated": "2026-08-13", "type": "chat" }, { - "id": "anthropic/claude-fable-5-1", - "name": "Claude Fable 5.1 (Anthropic)", - "display_name": "Claude Fable 5.1 (Anthropic)", + "id": "google/gemini-3.1-flash-lite", + "name": "Gemini 3.1 Flash Lite", + "display_name": "Gemini 3.1 Flash Lite", "modalities": { "input": [ "text", "image", + "video", + "audio", "pdf" ], "output": [ @@ -99541,10 +97382,10 @@ ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 1048576, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -99553,44 +97394,31 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", "effort_options": [ + "minimal", "low", "medium", - "high", - "xhigh", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", - "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", - "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." + "high" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-09-01", - "last_updated": "2026-09-01", + "knowledge": "2025-01", + "release_date": "2026-05-07", + "last_updated": "2026-05-07", "type": "chat" }, { - "id": "anthropic/claude-sonnet-5", - "name": "Claude Sonnet 5 (Anthropic)", - "display_name": "Claude Sonnet 5 (Anthropic)", + "id": "google/gemini-flash-lite-latest", + "name": "Gemini Flash-Lite Latest", + "display_name": "Gemini Flash-Lite Latest", "modalities": { "input": [ "text", "image", + "video", + "audio", "pdf" ], "output": [ @@ -99598,10 +97426,10 @@ ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 1048576, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -99609,85 +97437,67 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ - "none", + "minimal", "low", "medium", - "high", - "xhigh", - "max" + "high" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-30", - "last_updated": "2026-06-30", + "knowledge": "2026-03", + "release_date": "2026-07-21", + "last_updated": "2026-07-21", "type": "chat" }, { - "id": "anthropic/claude-opus-5-5", - "name": "Claude Opus 5.5 (Anthropic)", - "display_name": "Claude Opus 5.5 (Anthropic)", + "id": "google/gemini-embedding-2", + "name": "Gemini Embedding 2", + "display_name": "Gemini Embedding 2", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 8192, + "output": 1 }, "temperature": false, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ] - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-09-22", - "last_updated": "2026-09-22", - "type": "chat" + "knowledge": "2025-11", + "release_date": "2026-04-22", + "last_updated": "2026-04-22", + "type": "embedding" }, { - "id": "anthropic/claude-opus-5", - "name": "Claude Opus 5 (Anthropic)", - "display_name": "Claude Opus 5 (Anthropic)", + "id": "google/gemma-4-26b-a4b-it", + "name": "Gemma 4 26B A4B IT", + "display_name": "Gemma 4 26B A4B IT", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 262144, + "output": 32768 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -99695,91 +97505,60 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ] + "supported": true } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-05", - "release_date": "2026-07-24", - "last_updated": "2026-07-24", + "open_weights": true, + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "anthropic/claude-sonnet-4-6", - "name": "Claude Sonnet 4.6 (Anthropic)", - "display_name": "Claude Sonnet 4.6 (Anthropic)", + "id": "google/gemma-4-31b-it", + "name": "Gemma 4 31B IT", + "display_name": "Gemma 4 31B IT", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 64000 + "context": 262144, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." - ] + "supported": true } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-17", - "last_updated": "2026-03-13", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "anthropic/claude-opus-4-5-20251101", - "name": "Claude Opus 4.5 (Anthropic)", - "display_name": "Claude Opus 4.5 (Anthropic)", + "id": "google/gemini-3.7-flash", + "name": "Gemini 3.7 Flash", + "display_name": "Gemini 3.7 Flash", "modalities": { "input": [ "text", "image", + "video", + "audio", "pdf" ], "output": [ @@ -99787,57 +97566,51 @@ ] }, "limit": { - "context": 200000, - "output": 32000 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", - "effort_options": [ + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", "low", "medium", "high" ], - "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." + "thought_signatures" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-05", - "release_date": "2025-11-24", - "last_updated": "2025-11-24", + "knowledge": "2026-03", + "release_date": "2026-08-13", + "last_updated": "2026-08-13", "type": "chat" }, { - "id": "anthropic/claude-opus-4-6", - "name": "Claude Opus 4.6 (Anthropic)", - "display_name": "Claude Opus 4.6 (Anthropic)", + "id": "google/gemini-3.5-flash", + "name": "Gemini 3.5 Flash", + "display_name": "Gemini 3.5 Flash", "modalities": { "input": [ "text", "image", + "video", + "audio", "pdf" ], "output": [ @@ -99845,58 +97618,51 @@ ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", - "effort_options": [ + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", "low", "medium", - "high", - "max" + "high" ], - "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." + "thought_signatures" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-05-31", - "release_date": "2026-02-05", - "last_updated": "2026-03-13", + "knowledge": "2025-01", + "release_date": "2026-05-19", + "last_updated": "2026-05-19", "type": "chat" }, { - "id": "anthropic/claude-opus-4-8", - "name": "Claude Opus 4.8 (Anthropic)", - "display_name": "Claude Opus 4.8 (Anthropic)", + "id": "google/gemini-3.8-flash", + "name": "Gemini 3.8 Flash", + "display_name": "Gemini 3.8 Flash", "modalities": { "input": [ "text", "image", + "video", + "audio", "pdf" ], "output": [ @@ -99904,56 +97670,50 @@ ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 1048576, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "high", - "effort_options": [ + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", "low", "medium", - "high", - "xhigh", - "max" + "high" ], - "interleaved": true, "summaries": true, - "visibility": "omitted", + "visibility": "summary", "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." + "thought_signatures" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-01", - "release_date": "2026-05-28", - "last_updated": "2026-05-28", + "release_date": "2026-09-02", + "last_updated": "2026-09-02", "type": "chat" }, { - "id": "anthropic/claude-sonnet-4-5-20250929", - "name": "Claude Sonnet 4.5 (2025-09-29) (Anthropic)", - "display_name": "Claude Sonnet 4.5 (2025-09-29) (Anthropic)", + "id": "google/gemini-3.6-flash", + "name": "Gemini 3.6 Flash", + "display_name": "Gemini 3.6 Flash", "modalities": { "input": [ "text", "image", + "video", + "audio", "pdf" ], "output": [ @@ -99961,62 +97721,59 @@ ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", + "low", + "medium", + "high" + ], "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + "thought_signatures" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-07-31", - "release_date": "2025-09-29", - "last_updated": "2025-09-29", + "knowledge": "2026-03", + "release_date": "2026-07-21", + "last_updated": "2026-07-21", "type": "chat" }, { - "id": "anthropic/claude-fable-5", - "name": "Claude Fable 5 (Anthropic)", - "display_name": "Claude Fable 5 (Anthropic)", + "id": "cerebras/qwen-3.8-27b", + "name": "Qwen3.8 27B", + "display_name": "Qwen3.8 27B", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 131072, + "output": 40960 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -100024,41 +97781,24 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", "effort_options": [ + "none", "low", "medium", - "high", - "xhigh", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", - "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", - "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." + "high" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-09", - "last_updated": "2026-06-09", + "open_weights": true, + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "zai/glm-5.1", - "name": "GLM-5.1 (Z AI)", - "display_name": "GLM-5.1 (Z AI)", + "id": "cerebras/gpt-oss-120b", + "name": "GPT OSS 120B", + "display_name": "GPT OSS 120B", "modalities": { "input": [ "text" @@ -100068,8 +97808,8 @@ ] }, "limit": { - "context": 200000, - "output": 128000 + "context": 131072, + "output": 40960 }, "temperature": true, "tool_call": true, @@ -100080,46 +97820,48 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ - "none", - "minimal", "low", "medium", - "high", - "xhigh", - "max" + "high" ] } }, "attachment": false, "open_weights": true, - "release_date": "2026-04-07", - "last_updated": "2026-04-07", + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" - }, + } + ] + }, + "github-copilot": { + "id": "github-copilot", + "name": "GitHub Copilot", + "display_name": "GitHub Copilot", + "api": "https://api.githubcopilot.com", + "doc": "https://docs.github.com/en/copilot", + "models": [ { - "id": "zai/glm-5", - "name": "GLM-5 (Z AI)", - "display_name": "GLM-5 (Z AI)", + "id": "gpt-6.1-terra", + "name": "GPT-6.1 Terra", + "display_name": "GPT-6.1 Terra", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 202800, - "output": 131100 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -100127,16 +97869,8 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ "none", - "minimal", "low", "medium", "high", @@ -100145,29 +97879,32 @@ ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-02-12", - "last_updated": "2026-02-12", + "attachment": true, + "open_weights": false, + "knowledge": "2026-06-01", + "release_date": "2026-10-26", + "last_updated": "2026-10-26", "type": "chat" }, { - "id": "zai/glm-4.6", - "name": "GLM-4.6 (Z AI)", - "display_name": "GLM-4.6 (Z AI)", + "id": "claude-opus-5.5", + "name": "Claude Opus 5.5", + "display_name": "Claude Opus 5.5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 131072 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -100175,88 +97912,150 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-09-30", - "last_updated": "2025-09-30", + "attachment": true, + "open_weights": false, + "knowledge": "2026-06", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "zai/glm-4.5-airx", - "name": "GLM-4.5 AirX (Z AI)", - "display_name": "GLM-4.5 AirX (Z AI)", + "id": "claude-fable-5", + "name": "Claude Fable 5", + "display_name": "Claude Fable 5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, + "context": 1000000, "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", + "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", + "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." + ] + } + }, + "attachment": true, "open_weights": false, - "release_date": "2025-07-28", - "last_updated": "2025-07-28", + "knowledge": "2026-01-31", + "release_date": "2026-06-09", + "last_updated": "2026-06-09", "type": "chat" }, { - "id": "zai/glm-4.5-air", - "name": "GLM-4.5 Air (Z AI)", - "display_name": "GLM-4.5 Air (Z AI)", + "id": "claude-haiku-4.5", + "name": "Claude Haiku 4.5 (latest)", + "display_name": "Claude Haiku 4.5 (latest)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 98304 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-07-28", - "last_updated": "2025-07-28", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-02-28", + "release_date": "2025-10-15", + "last_updated": "2025-10-15", "type": "chat" }, { - "id": "zai/glm-5.3", - "name": "GLM-5.3 (Z AI)", - "display_name": "GLM-5.3 (Z AI)", + "id": "gpt-5.6-terra", + "name": "GPT-5.6 Terra", + "display_name": "GPT-5.6 Terra", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, + "context": 1050000, "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -100265,190 +98064,299 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ + "none", "low", + "medium", "high", + "xhigh", "max" - ] + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "attachment": true, + "open_weights": false, + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "zai/glm-4.6v", - "name": "GLM-4.6V (Z AI)", - "display_name": "GLM-4.6V (Z AI)", + "id": "gpt-5.4", + "name": "GPT-5.4", + "display_name": "GPT-5.4", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16000 + "context": 1050000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-12-08", - "last_updated": "2025-12-08", + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-03-05", + "last_updated": "2026-03-05", "type": "chat" }, { - "id": "zai/glm-5.2", - "name": "GLM-5.2 (Z AI)", - "display_name": "GLM-5.2 (Z AI)", + "id": "claude-opus-4.8", + "name": "Claude Opus 4.8", + "display_name": "Claude Opus 4.8", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 200000, + "output": 64000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], "interleaved": true, "summaries": true, - "visibility": "summary", + "visibility": "omitted", "continuation": [ "thinking_blocks" ], - "effort_options": [ - "none", - "high", - "max" + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "attachment": true, + "open_weights": false, + "knowledge": "2026-01", + "release_date": "2026-05-28", + "last_updated": "2026-05-28", "type": "chat" }, { - "id": "zai/glm-4.7-flashx", - "name": "GLM-4.7 FlashX (Z AI)", - "display_name": "GLM-4.7 FlashX (Z AI)", + "id": "gpt-5.6-sol", + "name": "GPT-5.6 Sol", + "display_name": "GPT-5.6 Sol", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 200000, + "context": 1050000, "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2026-01-19", - "last_updated": "2026-01-19", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "zai/glm-4-32b-0414-128k", - "name": "GLM-4 32B (0414-128k) (Z AI)", - "display_name": "GLM-4 32B (0414-128k) (Z AI)", + "id": "gpt-5.4-mini", + "name": "GPT-5.4 mini", + "display_name": "GPT-5.4 mini", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 128000, + "context": 400000, "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, "open_weights": false, - "release_date": "2025-04-14", - "last_updated": "2025-04-14", + "knowledge": "2025-08-31", + "release_date": "2026-03-17", + "last_updated": "2026-03-17", "type": "chat" }, { - "id": "zai/glm-4.5v", - "name": "GLM-4.5V (Z AI)", - "display_name": "GLM-4.5V (Z AI)", + "id": "claude-haiku-5.5", + "name": "Claude Haiku 5.5", + "display_name": "Claude Haiku 5.5", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16000 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + }, "attachment": true, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-08-11", - "last_updated": "2025-08-11", + "open_weights": false, + "knowledge": "2026-06", + "release_date": "2026-10-07", + "last_updated": "2026-10-07", "type": "chat" }, { - "id": "zai/glm-5.3-flash", - "name": "GLM-5.3 Flash (Z AI)", - "display_name": "GLM-5.3 Flash (Z AI)", + "id": "gpt-5.6-luna", + "name": "GPT-5.6 Luna", + "display_name": "GPT-5.6 Luna", "modalities": { "input": [ "text", "image", - "video", "pdf" ], "output": [ @@ -100456,10 +98364,10 @@ ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -100468,33 +98376,48 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ + "none", "low", + "medium", "high", + "xhigh", "max" - ] + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, - "open_weights": true, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", + "open_weights": false, + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "zai/glm-4.7", - "name": "GLM-4.7 (Z AI)", - "display_name": "GLM-4.7 (Z AI)", + "id": "grok-4.6", + "name": "Grok 4.6", + "display_name": "Grok 4.6", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 200000, + "context": 500000, "output": 128000 }, "temperature": true, @@ -100506,64 +98429,93 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "low", + "medium", + "high", + "xhigh" ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-12-22", - "last_updated": "2025-12-22", + "attachment": true, + "open_weights": false, + "knowledge": "2026-02-01", + "release_date": "2026-08-12", + "last_updated": "2026-08-12", "type": "chat" }, { - "id": "zai/glm-4.5", - "name": "GLM-4.5 (Z AI)", - "display_name": "GLM-4.5 (Z AI)", + "id": "claude-opus-4.7", + "name": "Claude Opus 4.7", + "display_name": "Claude Opus 4.7", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 98304 + "context": 200000, + "output": 32000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-07-28", - "last_updated": "2025-07-28", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2026-01-31", + "release_date": "2026-04-16", + "last_updated": "2026-04-16", "type": "chat" }, { - "id": "zai/glm-4.5-x", - "name": "GLM-4.5 X (Z AI)", - "display_name": "GLM-4.5 X (Z AI)", + "id": "grok-4.5", + "name": "Grok 4.5", + "display_name": "Grok 4.5", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 128000, + "context": 500000, "output": 128000 }, "temperature": true, @@ -100572,28 +98524,39 @@ "supported": true, "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "low", + "medium", + "high" + ] + } + }, + "attachment": true, "open_weights": false, - "release_date": "2025-07-28", - "last_updated": "2025-07-28", + "release_date": "2026-07-08", + "last_updated": "2026-07-08", "type": "chat" }, { - "id": "zai/glm-4.6v-flashx", - "name": "GLM-4.6V FlashX (Z AI)", - "display_name": "GLM-4.6V FlashX (Z AI)", + "id": "gpt-5.3-codex", + "name": "GPT-5.3 Codex", + "display_name": "GPT-5.3 Codex", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16000 + "context": 400000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -100601,29 +98564,53 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, "attachment": true, "open_weights": false, - "release_date": "2025-12-08", - "last_updated": "2025-12-08", + "knowledge": "2025-08-31", + "release_date": "2026-02-05", + "last_updated": "2026-02-05", "type": "chat" }, { - "id": "embercloud/glm-5.1", - "name": "GLM-5.1 (EmberCloud)", - "display_name": "GLM-5.1 (EmberCloud)", + "id": "mai-code-1.1-flash", + "name": "MAI-Code-1.1-Flash", + "display_name": "MAI-Code-1.1-Flash", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 203000, - "output": 131000 + "context": 256000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -100631,38 +98618,38 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "low", + "medium", + "high" ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-04-07", - "last_updated": "2026-04-07", + "attachment": true, + "open_weights": false, + "release_date": "2026-08-11", + "last_updated": "2026-08-11", "type": "chat" }, { - "id": "embercloud/glm-5", - "name": "GLM-5 (EmberCloud)", - "display_name": "GLM-5 (EmberCloud)", + "id": "gpt-6-luna", + "name": "GPT-6 Luna", + "display_name": "GPT-6 Luna", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 203000, - "output": 131000 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -100670,16 +98657,8 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ "none", - "minimal", "low", "medium", "high", @@ -100688,124 +98667,177 @@ ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-02-12", - "last_updated": "2026-02-12", + "attachment": true, + "open_weights": false, + "knowledge": "2026-05-18", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "embercloud/qwen3-coder-next", - "name": "Qwen3 Coder Next (EmberCloud)", - "display_name": "Qwen3 Coder Next (EmberCloud)", + "id": "kimi-k2.7-code", + "name": "Kimi K2.7 Code", + "display_name": "Kimi K2.7 Code", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 256000, + "output": 32000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": true, "open_weights": true, - "knowledge": "2025-09", - "release_date": "2026-02-03", - "last_updated": "2026-02-03", + "knowledge": "2025-01", + "release_date": "2026-06-12", + "last_updated": "2026-06-12", "type": "chat" }, { - "id": "embercloud/glm-4.5-air", - "name": "GLM-4.5 Air (EmberCloud)", - "display_name": "GLM-4.5 Air (EmberCloud)", + "id": "claude-sonnet-4.6", + "name": "Claude Sonnet 4.6", + "display_name": "Claude Sonnet 4.6", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131000, - "output": 96000 + "context": 200000, + "output": 32000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-07-28", - "last_updated": "2025-07-28", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-02-17", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "embercloud/kimi-k2.5", - "name": "Kimi K2.5 (EmberCloud)", - "display_name": "Kimi K2.5 (EmberCloud)", + "id": "gpt-5-mini", + "name": "GPT-5 Mini", + "display_name": "GPT-5 Mini", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 264000, + "output": 64000 }, "temperature": false, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "minimal", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-01-27", - "last_updated": "2026-01-27", + "attachment": true, + "open_weights": false, + "knowledge": "2024-05-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "embercloud/glm-5.2", - "name": "GLM-5.2 (EmberCloud)", - "display_name": "GLM-5.2 (EmberCloud)", + "id": "claude-opus-5", + "name": "Claude Opus 5", + "display_name": "Claude Opus 5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 203000, - "output": 131000 + "context": 1000000, + "output": 64000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -100814,15 +98846,7 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ - "none", - "minimal", "low", "medium", "high", @@ -100831,29 +98855,32 @@ ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "attachment": true, + "open_weights": false, + "knowledge": "2026-05", + "release_date": "2026-07-24", + "last_updated": "2026-07-24", "type": "chat" }, { - "id": "embercloud/glm-4.7", - "name": "GLM-4.7 (EmberCloud)", - "display_name": "GLM-4.7 (EmberCloud)", + "id": "gpt-6-sol", + "name": "GPT-6 Sol", + "display_name": "GPT-6 Sol", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 131000 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -100861,143 +98888,179 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-12-22", - "last_updated": "2025-12-22", + "attachment": true, + "open_weights": false, + "knowledge": "2026-04-20", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "embercloud/glm-4.5", - "name": "GLM-4.5 (EmberCloud)", - "display_name": "GLM-4.5 (EmberCloud)", + "id": "gpt-6.1-sol", + "name": "GPT-6.1 Sol", + "display_name": "GPT-6.1 Sol", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131000, - "output": 96000 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-07-28", - "last_updated": "2025-07-28", + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2026-04-30", + "release_date": "2026-09-29", + "last_updated": "2026-09-29", "type": "chat" }, { - "id": "embercloud/glm-4.7-flash", - "name": "GLM-4.7 Flash (EmberCloud)", - "display_name": "GLM-4.7 Flash (EmberCloud)", + "id": "claude-sonnet-5", + "name": "Claude Sonnet 5", + "display_name": "Claude Sonnet 5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 131000 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2026-01-19", - "last_updated": "2026-01-19", + "attachment": true, + "open_weights": false, + "knowledge": "2026-01-31", + "release_date": "2026-06-30", + "last_updated": "2026-06-30", "type": "chat" }, { - "id": "nebius/minimax-m3.1-flash", - "name": "MiniMax M3.1 Flash (Nebius AI)", - "display_name": "MiniMax M3.1 Flash (Nebius AI)", + "id": "gpt-5.4-nano", + "name": "GPT-5.4 nano", + "display_name": "GPT-5.4 nano", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 1048576 + "context": 400000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", "effort_options": [ "none", - "minimal", "low", "medium", "high", - "xhigh", - "max" - ] + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "release_date": "2026-10-19", - "last_updated": "2026-10-19", + "knowledge": "2025-08-31", + "release_date": "2026-03-17", + "last_updated": "2026-03-17", "type": "chat" }, { - "id": "novita/glm-5.1", - "name": "GLM-5.1 (NovitaAI)", - "display_name": "GLM-5.1 (NovitaAI)", + "id": "claude-sonnet-5.5", + "name": "Claude Sonnet 5.5", + "display_name": "Claude Sonnet 5.5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -101005,16 +99068,7 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ - "none", - "minimal", "low", "medium", "high", @@ -101023,57 +99077,72 @@ ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-04-07", - "last_updated": "2026-04-07", + "attachment": true, + "open_weights": false, + "knowledge": "2026-06", + "release_date": "2026-09-28", + "last_updated": "2026-09-28", "type": "chat" }, { - "id": "novita/llama-3.3-70b-instruct", - "name": "Llama 3.3 70B Instruct (NovitaAI)", - "display_name": "Llama 3.3 70B Instruct (NovitaAI)", + "id": "gemini-4-argon", + "name": "Gemini 4 Argon", + "display_name": "Gemini 4 Argon", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 120000 + "context": 1048576, + "output": 65536 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2023-12", - "release_date": "2024-12-06", - "last_updated": "2024-12-06", + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "high" + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2026-03", + "release_date": "2026-10-13", + "last_updated": "2026-10-13", "type": "chat" }, { - "id": "novita/glm-5", - "name": "GLM-5 (NovitaAI)", - "display_name": "GLM-5 (NovitaAI)", + "id": "claude-fable-5.1", + "name": "Claude Fable 5.1", + "display_name": "Claude Fable 5.1", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 202800, - "output": 131072 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -101082,36 +99151,44 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], + "default_enabled": true, + "mode": "effort", + "effort": "high", "effort_options": [ - "none", - "minimal", "low", "medium", "high", "xhigh", "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", + "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", + "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-02-12", - "last_updated": "2026-02-12", + "attachment": true, + "open_weights": false, + "knowledge": "2026-06", + "release_date": "2026-09-01", + "last_updated": "2026-09-01", "type": "chat" }, { - "id": "novita/qwen3.8-27b", - "name": "Qwen3.8 27B (NovitaAI)", - "display_name": "Qwen3.8 27B (NovitaAI)", + "id": "gemini-3.7-flash", + "name": "Gemini 3.7 Flash", + "display_name": "Gemini 3.7 Flash", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" @@ -101119,7 +99196,7 @@ }, "limit": { "context": 1000000, - "output": 131072 + "output": 64000 }, "temperature": true, "tool_call": true, @@ -101127,29 +99204,50 @@ "supported": true, "default": true }, - "attachment": false, - "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", + "low", + "medium", + "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2026-03", + "release_date": "2026-08-13", + "last_updated": "2026-08-13", "type": "chat" }, { - "id": "novita/glm-4.6", - "name": "GLM-4.6 (NovitaAI)", - "display_name": "GLM-4.6 (NovitaAI)", + "id": "kimi-k3", + "name": "Kimi K3", + "display_name": "Kimi K3", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 204800, + "context": 1048576, "output": 131072 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -101157,23 +99255,29 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "effort_options": [ + "low", + "high", + "max" + ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-09-30", - "last_updated": "2025-09-30", + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" }, { - "id": "novita/deepseek-v4-flash", - "name": "DeepSeek V4 Flash (NovitaAI)", - "display_name": "DeepSeek V4 Flash (NovitaAI)", + "id": "gpt-5.5", + "name": "GPT-5.5", + "display_name": "GPT-5.5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" @@ -101181,9 +99285,9 @@ }, "limit": { "context": 1050000, - "output": 393216 + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -101194,103 +99298,149 @@ "supported": true, "default_enabled": true, "mode": "effort", - "effort": "high", + "effort": "medium", "effort_options": [ "low", + "medium", "high", - "max" + "xhigh" ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" ], - "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." - ] + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "attachment": true, + "open_weights": false, + "knowledge": "2025-12-01", + "release_date": "2026-04-23", + "last_updated": "2026-04-23", "type": "chat" }, { - "id": "novita/qwen3-next-80b-a3b-instruct", - "name": "Qwen3 Next 80B A3B Instruct (NovitaAI)", - "display_name": "Qwen3 Next 80B A3B Instruct (NovitaAI)", + "id": "gemini-3.5-flash", + "name": "Gemini 3.5 Flash", + "display_name": "Gemini 3.5 Flash", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-09", - "last_updated": "2025-09", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", + "low", + "medium", + "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2026-05-19", + "last_updated": "2026-05-19", "type": "chat" }, { - "id": "novita/qwen3-coder-30b-a3b-instruct", - "name": "Qwen3 Coder 30B A3B Instruct (NovitaAI)", - "display_name": "Qwen3 Coder 30B A3B Instruct (NovitaAI)", + "id": "gemini-3.8-flash", + "name": "Gemini 3.8 Flash", + "display_name": "Gemini 3.8 Flash", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 160000, - "output": 32768 + "context": 1000000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-07-31", - "last_updated": "2025-07-31", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", + "low", + "medium", + "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] + } + }, + "attachment": true, + "open_weights": false, + "release_date": "2026-09-02", + "last_updated": "2026-09-02", "type": "chat" }, { - "id": "novita/hy3", - "name": "Hy3 (NovitaAI)", - "display_name": "Hy3 (NovitaAI)", + "id": "gpt-6-astra", + "name": "GPT-6 Astra", + "display_name": "GPT-6 Astra", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -101300,34 +99450,37 @@ "reasoning": { "supported": true, "effort_options": [ - "none", "low", - "high" + "medium", + "high", + "xhigh", + "max" ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-07-06", - "last_updated": "2026-07-06", + "attachment": true, + "open_weights": false, + "knowledge": "2026-04-30", + "release_date": "2026-09-04", + "last_updated": "2026-09-04", "type": "chat" }, { - "id": "novita/qwen3.6-35b-a3b", - "name": "Qwen3.6 35B A3B (NovitaAI)", - "display_name": "Qwen3.6 35B A3B (NovitaAI)", + "id": "gemini-3.6-flash", + "name": "Gemini 3.6 Flash", + "display_name": "Gemini 3.6 Flash", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, + "context": 1000000, "output": 64000 }, "temperature": true, @@ -101339,44 +99492,45 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "none", + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ "minimal", "low", "medium", - "high", - "xhigh", - "max" + "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-04-17", - "last_updated": "2026-04-17", + "open_weights": false, + "knowledge": "2026-03", + "release_date": "2026-07-21", + "last_updated": "2026-07-21", "type": "chat" }, { - "id": "novita/minimax-m2.5", - "name": "MiniMax M2.5 (NovitaAI)", - "display_name": "MiniMax M2.5 (NovitaAI)", + "id": "grok-4.7", + "name": "Grok 4.7", + "display_name": "Grok 4.7", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 204800, - "output": 131100 + "context": 500000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -101386,26 +99540,34 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ "low", "medium", "high", - "xhigh", - "max" + "xhigh" ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-02-12", - "last_updated": "2026-02-12", + "attachment": true, + "open_weights": false, + "knowledge": "2026-05", + "release_date": "2026-09-21", + "last_updated": "2026-09-21", "type": "chat" - }, + } + ] + }, + "moark": { + "id": "moark", + "name": "Moark", + "display_name": "Moark", + "api": "https://moark.com/v1", + "doc": "https://moark.com/docs/openapi/v1#tag/%E6%96%87%E6%9C%AC%E7%94%9F%E6%88%90", + "models": [ { - "id": "novita/qwen3-235b-a22b-thinking-2507", - "name": "Qwen3 235B A22B Thinking 2507 (NovitaAI)", - "display_name": "Qwen3 235B A22B Thinking 2507 (NovitaAI)", + "id": "deepseek-v4-flash-0731", + "name": "DeepSeek V4 Flash 0731", + "display_name": "DeepSeek V4 Flash 0731", "modalities": { "input": [ "text" @@ -101415,79 +99577,80 @@ ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 1000000, + "output": 384000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, "attachment": false, "open_weights": true, - "release_date": "2025-07-25", - "last_updated": "2025-07-25", + "knowledge": "2025-05", + "release_date": "2026-07-31", + "last_updated": "2026-07-31", "type": "chat" }, { - "id": "novita/qwen3-vl-235b-a22b-instruct", - "name": "Qwen3 VL 235B A22B Instruct (NovitaAI)", - "display_name": "Qwen3 VL 235B A22B Instruct (NovitaAI)", + "id": "Kimi-K2.6", + "name": "Kimi K2.6", + "display_name": "Kimi K2.6", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": true, "open_weights": true, - "knowledge": "2025-03-31", - "release_date": "2025-09-23", - "last_updated": "2025-09-23", + "knowledge": "2025-01", + "release_date": "2026-04-20", + "last_updated": "2026-04-20", "type": "chat" }, { - "id": "novita/kimi-k2.7-code", - "name": "Kimi K2.7 Code (NovitaAI)", - "display_name": "Kimi K2.7 Code (NovitaAI)", + "id": "MiniMax-M2.7", + "name": "MiniMax-M2.7", + "display_name": "MiniMax-M2.7", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 204800, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -101501,27 +99664,19 @@ "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-06-12", - "last_updated": "2026-06-12", + "release_date": "2026-03-18", + "last_updated": "2026-03-18", "type": "chat" }, { - "id": "novita/llama-3.2-3b-instruct", - "name": "Llama 3.2 3B Instruct (NovitaAI)", - "display_name": "Llama 3.2 3B Instruct (NovitaAI)", + "id": "GLM-4.7", + "name": "GLM-4.7", + "display_name": "GLM-4.7", "modalities": { "input": [ "text" @@ -101531,91 +99686,81 @@ ] }, "limit": { - "context": 32768, - "output": 32000 + "context": 204800, + "output": 131072 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": false, - "release_date": "2024-09-18", - "last_updated": "2024-09-18", - "type": "chat" - }, - { - "id": "novita/qwen3-235b-a22b-fp8", - "name": "Qwen3 235B A22B FP8 (NovitaAI)", - "display_name": "Qwen3 235B A22B FP8 (NovitaAI)", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 40960, - "output": 20000 + "supported": true, + "default": true }, - "temperature": true, - "tool_call": false, - "reasoning": { - "supported": false + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, "open_weights": true, "knowledge": "2025-04", - "release_date": "2025-04-28", - "last_updated": "2025-04-28", + "release_date": "2025-12-22", + "last_updated": "2025-12-22", "type": "chat" }, { - "id": "novita/gemma-4-31b-it", - "name": "Gemma 4 31B IT (NovitaAI)", - "display_name": "Gemma 4 31B IT (NovitaAI)", + "id": "Qwen3.6-Flash", + "name": "Qwen3.6 Flash", + "display_name": "Qwen3.6 Flash", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 1000000, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "attachment": true, + "open_weights": false, + "release_date": "2026-04-27", + "last_updated": "2026-04-27", "type": "chat" }, { - "id": "novita/qwen3.8-max", - "name": "Qwen3.8 Max (NovitaAI)", - "display_name": "Qwen3.8 Max (NovitaAI)", + "id": "DeepSeek-V4-Pro", + "name": "DeepSeek V4 Pro", + "display_name": "DeepSeek V4 Pro", "modalities": { "input": [ - "text", - "image", - "video", - "pdf" + "text" ], "output": [ "text" @@ -101623,7 +99768,7 @@ }, "limit": { "context": 1000000, - "output": 131072 + "output": 384000 }, "temperature": true, "tool_call": true, @@ -101634,28 +99779,39 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", "effort_options": [ "low", - "medium", - "xhigh" + "high", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, - "attachment": true, - "open_weights": false, - "release_date": "2026-08-03", - "last_updated": "2026-08-03", + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "novita/minimax-m3.1-flash", - "name": "MiniMax M3.1 Flash (NovitaAI)", - "display_name": "MiniMax M3.1 Flash (NovitaAI)", + "id": "DeepSeek-V4-Flash", + "name": "DeepSeek V4 Flash", + "display_name": "DeepSeek V4 Flash", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" @@ -101663,7 +99819,7 @@ }, "limit": { "context": 1000000, - "output": 524288 + "output": 384000 }, "temperature": true, "tool_call": true, @@ -101673,25 +99829,37 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", "effort_options": [ "low", - "medium", "high", - "xhigh", "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, - "attachment": true, - "open_weights": false, - "release_date": "2026-10-19", - "last_updated": "2026-10-19", + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "novita/minimax-m2.1", - "name": "MiniMax M2.1 (NovitaAI)", - "display_name": "MiniMax M2.1 (NovitaAI)", + "id": "MiniMax-M2.1", + "name": "MiniMax-M2.1", + "display_name": "MiniMax-M2.1", "modalities": { "input": [ "text" @@ -101712,14 +99880,7 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ] + "supported": true } }, "attachment": false, @@ -101729,9 +99890,9 @@ "type": "chat" }, { - "id": "novita/kimi-k2", - "name": "Kimi K2 (NovitaAI)", - "display_name": "Kimi K2 (NovitaAI)", + "id": "GLM-5.3", + "name": "GLM-5.3", + "display_name": "GLM-5.3", "modalities": { "input": [ "text" @@ -101741,63 +99902,86 @@ ] }, "limit": { - "context": 131072, + "context": 1000000, "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": false, - "open_weights": false, - "release_date": "2025-07-11", - "last_updated": "2025-07-11", + "open_weights": true, + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "novita/qwen3-coder-480b-a35b-instruct", - "name": "Qwen3 Coder 480B A35B Instruct (NovitaAI)", - "display_name": "Qwen3 Coder 480B A35B Instruct (NovitaAI)", + "id": "kimi-k3", + "name": "Kimi K3", + "display_name": "Kimi K3", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 1048576, + "output": 131072 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": true, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-07-22", - "last_updated": "2025-07-22", + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" - }, + } + ] + }, + "edenai": { + "id": "edenai", + "name": "Eden AI", + "display_name": "Eden AI", + "api": "https://api.edenai.run/v3", + "doc": "https://docs.edenai.co", + "models": [ { - "id": "novita/glm-5.3", - "name": "GLM-5.3 (NovitaAI)", - "display_name": "GLM-5.3 (NovitaAI)", + "id": "deepseek-v4-flash-vision-exp", + "name": "DeepSeek V4 Flash Vision Exp", + "display_name": "DeepSeek V4 Flash Vision Exp", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 1000000, + "output": 384000 }, "temperature": true, "tool_call": true, @@ -101808,23 +99992,62 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", "effort_options": [ "low", "high", "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, + "attachment": true, + "open_weights": true, + "release_date": "2026-08-21", + "last_updated": "2026-09-01", + "type": "chat" + }, + { + "id": "groq/meta-llama/llama-prompt-guard-2-86m", + "name": "Llama Prompt Guard 2 86M (Groq)", + "display_name": "Llama Prompt Guard 2 86M (Groq)", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 512, + "output": 512 + }, + "temperature": false, + "tool_call": false, + "reasoning": { + "supported": false + }, "attachment": false, "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "release_date": "2025-04-29", + "last_updated": "2025-04-29", "type": "chat" }, { - "id": "novita/llama-3-70b-instruct", - "name": "Llama 3 70B Instruct (NovitaAI)", - "display_name": "Llama 3 70B Instruct (NovitaAI)", + "id": "groq/meta-llama/llama-prompt-guard-2-22m", + "name": "Llama Prompt Guard 2 22M (Groq)", + "display_name": "Llama Prompt Guard 2 22M (Groq)", "modalities": { "input": [ "text" @@ -101834,24 +100057,24 @@ ] }, "limit": { - "context": 8192, - "output": 8000 + "context": 512, + "output": 512 }, - "temperature": true, + "temperature": false, "tool_call": false, "reasoning": { "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2024-04-18", - "last_updated": "2024-04-18", + "open_weights": true, + "release_date": "2025-04-29", + "last_updated": "2025-04-29", "type": "chat" }, { - "id": "novita/qwen3-max", - "name": "Qwen3 Max (NovitaAI)", - "display_name": "Qwen3 Max (NovitaAI)", + "id": "groq/openai/gpt-oss-20b", + "name": "GPT OSS 20B (Groq)", + "display_name": "GPT OSS 20B (Groq)", "modalities": { "input": [ "text" @@ -101861,49 +100084,47 @@ ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 131072, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "low", + "medium", + "high" ] } }, "attachment": false, - "open_weights": false, - "knowledge": "2025-04", - "release_date": "2025-09-23", - "last_updated": "2025-09-23", + "open_weights": true, + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "novita/qwen35-397b-a17b", - "name": "Qwen3.5 397B A17B (NovitaAI)", - "display_name": "Qwen3.5 397B A17B (NovitaAI)", + "id": "groq/openai/gpt-oss-safeguard-20b", + "name": "GPT OSS Safeguard 20B (Groq)", + "display_name": "GPT OSS Safeguard 20B (Groq)", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 64000 + "context": 131072, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -101914,26 +100135,22 @@ "extra_capabilities": { "reasoning": { "effort_options": [ - "none", - "minimal", "low", "medium", - "high", - "xhigh", - "max" + "high" ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-02-15", - "last_updated": "2026-02-15", + "release_date": "2025-10-29", + "last_updated": "2025-10-29", "type": "chat" }, { - "id": "novita/qwen3.7-max", - "name": "Qwen3.7 Max (NovitaAI)", - "display_name": "Qwen3.7 Max (NovitaAI)", + "id": "groq/openai/gpt-oss-120b", + "name": "GPT OSS 120B (Groq)", + "display_name": "GPT OSS 120B (Groq)", "modalities": { "input": [ "text" @@ -101943,8 +100160,8 @@ ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 131072, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -101956,164 +100173,173 @@ "reasoning": { "supported": true, "effort_options": [ - "none", - "minimal", "low", "medium", - "high", - "xhigh", - "max" + "high" ] } }, "attachment": false, - "open_weights": false, - "release_date": "2026-05-21", - "last_updated": "2026-05-21", + "open_weights": true, + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "novita/kimi-k2.6", - "name": "Kimi K2.6 (NovitaAI)", - "display_name": "Kimi K2.6 (NovitaAI)", + "id": "perplexityai/sonar-reasoning-pro", + "name": "Sonar Reasoning Pro", + "display_name": "Sonar Reasoning Pro", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 128000, + "output": 4096 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ - "none", "minimal", "low", "medium", - "high", - "xhigh", - "max" + "high" ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-20", - "last_updated": "2026-04-20", + "open_weights": false, + "knowledge": "2025-09-01", + "release_date": "2024-01-01", + "last_updated": "2025-09-01", "type": "chat" }, { - "id": "novita/kimi-k3", - "name": "Kimi K3 (NovitaAI)", - "display_name": "Kimi K3 (NovitaAI)", + "id": "perplexityai/sonar", + "name": "Sonar", + "display_name": "Sonar", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 1048576 + "context": 127072, + "output": 4096 + }, + "temperature": true, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-09-01", + "release_date": "2024-01-01", + "last_updated": "2025-09-01", + "type": "chat" + }, + { + "id": "perplexityai/sonar-deep-research", + "name": "Sonar Deep Research", + "display_name": "Sonar Deep Research", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 128000, + "output": 32768 }, "temperature": false, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ - "none", "minimal", "low", "medium", - "high", - "xhigh", - "max" + "high" ] } }, - "attachment": true, - "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-16", + "attachment": false, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2025-02-01", + "last_updated": "2025-09-01", "type": "chat" }, { - "id": "novita/glm-4.6v", - "name": "GLM-4.6V (NovitaAI)", - "display_name": "GLM-4.6V (NovitaAI)", + "id": "perplexityai/sonar-pro", + "name": "Sonar Pro", + "display_name": "Sonar Pro", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 16000 + "context": 200000, + "output": 8192 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": true, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-12-08", - "last_updated": "2025-12-08", + "open_weights": false, + "knowledge": "2025-09-01", + "release_date": "2024-01-01", + "last_updated": "2025-09-01", "type": "chat" }, { - "id": "novita/deepseek-v4.1-flash-1017", - "name": "DeepSeek V4.1 Flash 1017 (NovitaAI)", - "display_name": "DeepSeek V4.1 Flash 1017 (NovitaAI)", + "id": "xai/grok-build-0.1", + "name": "Grok Build 0.1", + "display_name": "Grok Build 0.1", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 393216 + "context": 256000, + "output": 256000 }, "temperature": true, "tool_call": true, @@ -102123,28 +100349,19 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "none", - "minimal", - "low", - "medium", - "high", - "xhigh", - "max" - ] + "supported": true } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-10-17", - "last_updated": "2026-10-17", + "open_weights": false, + "release_date": "2026-04-16", + "last_updated": "2026-04-16", "type": "chat" }, { - "id": "novita/glm-5.2", - "name": "GLM-5.2 (NovitaAI)", - "display_name": "GLM-5.2 (NovitaAI)", + "id": "xai/grok-4-fast-non-reasoning", + "name": "X-Ai/Grok-4-Fast-Non-Reasoning", + "display_name": "X-Ai/Grok-4-Fast-Non-Reasoning", "modalities": { "input": [ "text" @@ -102154,57 +100371,37 @@ ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 2000000, + "output": 2000000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "none", - "minimal", - "low", - "medium", - "high", - "xhigh", - "max" - ] - } + "supported": false }, "attachment": false, - "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "open_weights": false, + "release_date": "2025-12-18", + "last_updated": "2025-12-18", "type": "chat" }, { - "id": "novita/deepseek-v4.1-flash", - "name": "DeepSeek V4.1 Flash (NovitaAI)", - "display_name": "DeepSeek V4.1 Flash (NovitaAI)", + "id": "xai/grok-4.6", + "name": "Grok 4.6", + "display_name": "Grok 4.6", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 393216 + "context": 500000, + "output": 500000 }, "temperature": true, "tool_call": true, @@ -102216,56 +100413,53 @@ "reasoning": { "supported": true, "effort_options": [ - "none", - "minimal", "low", "medium", "high", - "xhigh", - "max" + "xhigh" ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-09-10", - "last_updated": "2026-09-10", + "open_weights": false, + "knowledge": "2026-02-01", + "release_date": "2026-08-12", + "last_updated": "2026-08-12", "type": "chat" }, { - "id": "novita/qwen3-vl-30b-a3b-instruct", - "name": "Qwen3 VL 30B A3B Instruct (NovitaAI)", - "display_name": "Qwen3 VL 30B A3B Instruct (NovitaAI)", + "id": "xai/grok-4.20-0309-reasoning", + "name": "Grok 4.20 (Reasoning)", + "display_name": "Grok 4.20 (Reasoning)", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 1000000, + "output": 30000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": true, - "open_weights": true, - "release_date": "2025-10-04", - "last_updated": "2025-10-04", + "open_weights": false, + "release_date": "2026-03-09", + "last_updated": "2026-03-09", "type": "chat" }, { - "id": "novita/llama-4-maverick-17b-instruct", - "name": "Llama 4 Maverick 17B Instruct (NovitaAI)", - "display_name": "Llama 4 Maverick 17B Instruct (NovitaAI)", + "id": "xai/grok-4.20-0309-non-reasoning", + "name": "Grok 4.20 (Non-Reasoning)", + "display_name": "Grok 4.20 (Non-Reasoning)", "modalities": { "input": [ "text", @@ -102276,36 +100470,37 @@ ] }, "limit": { - "context": 1048576, - "output": 8192 + "context": 1000000, + "output": 30000 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, "attachment": true, - "open_weights": true, - "knowledge": "2024-08", - "release_date": "2025-04-05", - "last_updated": "2025-04-05", + "open_weights": false, + "release_date": "2026-03-09", + "last_updated": "2026-03-09", "type": "chat" }, { - "id": "novita/ling-3.0-flash", - "name": "InclusionAI Ling 3.0 Flash (NovitaAI)", - "display_name": "InclusionAI Ling 3.0 Flash (NovitaAI)", + "id": "xai/grok-4.5", + "name": "Grok 4.5", + "display_name": "Grok 4.5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 500000, + "output": 500000 }, "temperature": true, "tool_call": true, @@ -102315,34 +100510,38 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ - "none" + "low", + "medium", + "high", + "xhigh" ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-07-23", - "last_updated": "2026-07-23", + "attachment": true, + "open_weights": false, + "release_date": "2026-07-08", + "last_updated": "2026-07-08", "type": "chat" }, { - "id": "novita/glm-4.5v", - "name": "GLM-4.5V (NovitaAI)", - "display_name": "GLM-4.5V (NovitaAI)", + "id": "xai/grok-latest", + "name": "Grok Latest (Grok 4.7)", + "display_name": "Grok Latest (Grok 4.7)", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 65536, - "output": 16000 + "context": 500000, + "output": 500000 }, "temperature": true, "tool_call": true, @@ -102350,22 +100549,31 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "high", + "xhigh" + ] + } + }, "attachment": true, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-08-11", - "last_updated": "2025-08-11", + "open_weights": false, + "knowledge": "2026-05", + "release_date": "2026-09-21", + "last_updated": "2026-09-21", "type": "chat" }, { - "id": "novita/glm-5.3-flash", - "name": "GLM-5.3 Flash (NovitaAI)", - "display_name": "GLM-5.3 Flash (NovitaAI)", + "id": "xai/grok-4.3", + "name": "Grok 4.3", + "display_name": "Grok 4.3", "modalities": { "input": [ "text", "image", - "video", "pdf" ], "output": [ @@ -102373,8 +100581,8 @@ ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 1000000, + "output": 30000 }, "temperature": true, "tool_call": true, @@ -102386,33 +100594,37 @@ "reasoning": { "supported": true, "effort_options": [ + "none", "low", + "medium", "high", - "max" + "xhigh" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", + "open_weights": false, + "release_date": "2026-04-17", + "last_updated": "2026-04-17", "type": "chat" }, { - "id": "novita/glm-4.7", - "name": "GLM-4.7 (NovitaAI)", - "display_name": "GLM-4.7 (NovitaAI)", + "id": "xai/grok-4.7", + "name": "Grok 4.7", + "display_name": "Grok 4.7", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 204800, - "output": 128000 + "context": 500000, + "output": 500000 }, "temperature": true, "tool_call": true, @@ -102422,26 +100634,25 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "low", + "medium", + "high", + "xhigh" ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-12-22", - "last_updated": "2025-12-22", + "attachment": true, + "open_weights": false, + "knowledge": "2026-05", + "release_date": "2026-09-21", + "last_updated": "2026-09-21", "type": "chat" }, { - "id": "novita/minimax-m2.7", - "name": "MiniMax M2.7 (NovitaAI)", - "display_name": "MiniMax M2.7 (NovitaAI)", + "id": "microsoft/gpt-4", + "name": "GPT-4 (Microsoft)", + "display_name": "GPT-4 (Microsoft)", "modalities": { "input": [ "text" @@ -102451,11 +100662,39 @@ ] }, "limit": { - "context": 204800, - "output": 131100 + "context": 8191, + "output": 8192 }, "temperature": true, "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": false, + "knowledge": "2023-11", + "release_date": "2023-11-06", + "last_updated": "2024-04-09", + "type": "chat" + }, + { + "id": "microsoft/o3-mini", + "name": "o3-mini (Microsoft)", + "display_name": "o3-mini (Microsoft)", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 200000, + "output": 100000 + }, + "temperature": false, + "tool_call": false, "reasoning": { "supported": true, "default": true @@ -102463,101 +100702,96 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ "low", "medium", - "high", - "xhigh", - "max" - ] + "high" + ], + "visibility": "hidden" } }, "attachment": false, - "open_weights": true, - "release_date": "2026-03-18", - "last_updated": "2026-03-18", + "open_weights": false, + "knowledge": "2024-05", + "release_date": "2024-12-20", + "last_updated": "2025-01-29", "type": "chat" }, { - "id": "novita/llama-4-scout-17b-instruct", - "name": "Llama 4 Scout 17B Instruct (NovitaAI)", - "display_name": "Llama 4 Scout 17B Instruct (NovitaAI)", + "id": "zai/glm-5.2", + "name": "GLM-5.2", + "display_name": "GLM-5.2", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 131072, + "context": 1048576, "output": 131072 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "none", + "high", + "max" + ] + } + }, + "attachment": false, "open_weights": true, - "knowledge": "2024-08", - "release_date": "2025-04-05", - "last_updated": "2025-04-05", + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "novita/qwen3-vl-235b-a22b-thinking", - "name": "Qwen3 VL 235B A22B Thinking (NovitaAI)", - "display_name": "Qwen3 VL 235B A22B Thinking (NovitaAI)", + "id": "zai/glm-5v-turbo", + "name": "GLM-5V-Turbo", + "display_name": "GLM-5V-Turbo", "modalities": { "input": [ + "image", "text", - "image" + "video" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 202752, + "output": 131072 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, "attachment": true, - "open_weights": true, - "knowledge": "2025-03-31", - "release_date": "2025-09-23", - "last_updated": "2025-09-23", + "open_weights": false, + "release_date": "2026-04-01", + "last_updated": "2026-04-01", "type": "chat" }, { - "id": "novita/deepseek-v3.2", - "name": "DeepSeek V3.2 (NovitaAI)", - "display_name": "DeepSeek V3.2 (NovitaAI)", + "id": "zai/glm-5.3", + "name": "GLM-5.3", + "display_name": "GLM-5.3", "modalities": { "input": [ "text" @@ -102567,8 +100801,8 @@ ] }, "limit": { - "context": 163840, - "output": 65536 + "context": 1048576, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -102578,20 +100812,24 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "effort_options": [ + "low", + "high", + "max" + ] } }, "attachment": false, "open_weights": true, - "knowledge": "2024-07", - "release_date": "2025-12-01", - "last_updated": "2025-12-01", + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "novita/qwen3-235b-a22b-instruct-2507", - "name": "Qwen3 235B A22B Instruct 2507 (NovitaAI)", - "display_name": "Qwen3 235B A22B Instruct 2507 (NovitaAI)", + "id": "zai/glm-5-turbo", + "name": "GLM-5-Turbo", + "display_name": "GLM-5-Turbo", "modalities": { "input": [ "text" @@ -102601,35 +100839,43 @@ ] }, "limit": { - "context": 131072, - "output": 16384 + "context": 202752, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": false, - "open_weights": true, - "release_date": "2025-07-21", - "last_updated": "2025-07-21", + "open_weights": false, + "release_date": "2026-03-16", + "last_updated": "2026-03-16", "type": "chat" }, { - "id": "novita/qwen3.8-2.4t-a95b", - "name": "Qwen3.8 2.4T A95B (NovitaAI)", - "display_name": "Qwen3.8 2.4T A95B (NovitaAI)", + "id": "zai/glm-4.6v", + "name": "GLM-4.6V", + "display_name": "GLM-4.6V", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 131072, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -102637,30 +100883,17 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "none", - "minimal", - "low", - "medium", - "high", - "xhigh", - "max" - ] - } - }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-08-12", - "last_updated": "2026-08-12", + "knowledge": "2025-04", + "release_date": "2025-12-08", + "last_updated": "2025-12-08", "type": "chat" }, { - "id": "novita/gemma-4-26b-a4b-it", - "name": "Gemma 4 26B A4B IT (NovitaAI)", - "display_name": "Gemma 4 26B A4B IT (NovitaAI)", + "id": "zai/glm-4.6", + "name": "GLM-4.6", + "display_name": "GLM-4.6", "modalities": { "input": [ "text" @@ -102670,13 +100903,14 @@ ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 202752, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { @@ -102685,27 +100919,26 @@ }, "attachment": false, "open_weights": true, - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "knowledge": "2025-04", + "release_date": "2025-09-30", + "last_updated": "2025-09-30", "type": "chat" }, { - "id": "novita/qwen3.5-122b-a10b", - "name": "Qwen3.5 122B A10B (NovitaAI)", - "display_name": "Qwen3.5 122B A10B (NovitaAI)", + "id": "zai/glm-5", + "name": "GLM-5", + "display_name": "GLM-5", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 202752, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -102721,38 +100954,31 @@ "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "effort_options": [ - "none", - "minimal", - "low", - "medium", - "high", - "xhigh", - "max" ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-02-23", - "last_updated": "2026-02-23", + "release_date": "2026-02-12", + "last_updated": "2026-02-12", "type": "chat" }, { - "id": "novita/qwen3.8-flash", - "name": "Qwen3.8 Flash (NovitaAI)", - "display_name": "Qwen3.8 Flash (NovitaAI)", + "id": "zai/glm-5.3-flash", + "name": "GLM-5.3-Flash", + "display_name": "GLM-5.3-Flash", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, + "context": 1048576, "output": 131072 }, "temperature": true, @@ -102765,39 +100991,33 @@ "reasoning": { "supported": true, "effort_options": [ - "none", - "minimal", "low", - "medium", "high", - "xhigh", "max" ] } }, - "attachment": false, - "open_weights": false, + "attachment": true, + "open_weights": true, "release_date": "2026-08-26", "last_updated": "2026-08-26", "type": "chat" }, { - "id": "novita/step-3.7-flash", - "name": "Step 3.7 Flash (NovitaAI)", - "display_name": "Step 3.7 Flash (NovitaAI)", + "id": "zai/glm-4.7", + "name": "GLM-4.7", + "display_name": "GLM-4.7", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 256000 + "context": 202752, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -102807,73 +101027,72 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "minimal", - "low", - "medium", - "high", - "xhigh", - "max" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2026-03-01", - "release_date": "2026-05-29", - "last_updated": "2026-05-29", + "knowledge": "2025-04", + "release_date": "2025-12-22", + "last_updated": "2025-12-22", "type": "chat" }, { - "id": "novita/ernie-4.5-vl-424b-a47b", - "name": "ERNIE 4.5 VL 424B A47B (NovitaAI)", - "display_name": "ERNIE 4.5 VL 424B A47B (NovitaAI)", + "id": "zai/glm-5.1", + "name": "GLM-5.1", + "display_name": "GLM-5.1", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 123000, - "output": 16000 + "context": 202752, + "output": 131072 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": true, - "open_weights": false, - "release_date": "2025-06-30", - "last_updated": "2025-06-30", + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": false, + "open_weights": true, + "release_date": "2026-04-07", + "last_updated": "2026-04-07", "type": "chat" }, { - "id": "google-ai-studio/gemini-4-argon", - "name": "Gemini 4 Argon (Google AI Studio)", - "display_name": "Gemini 4 Argon (Google AI Studio)", + "id": "flexai/gpt-oss-20b", + "name": "GPT OSS 20B (FlexAI)", + "display_name": "GPT OSS 20B (FlexAI)", "modalities": { "input": [ - "text", - "image", - "video", - "audio", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 1048576 + "context": 131072, + "output": 32768 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -102881,35 +101100,37 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ + "low", + "medium", "high" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-10-13", - "last_updated": "2026-10-13", + "attachment": false, + "open_weights": true, + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "google-ai-studio/gemini-pro-latest", - "name": "Gemini Pro Latest (Google AI Studio)", - "display_name": "Gemini Pro Latest (Google AI Studio)", + "id": "flexai/Muse-Glimmer-30B", + "name": "Muse Glimmer 30B (FlexAI)", + "display_name": "Muse Glimmer 30B (FlexAI)", "modalities": { "input": [ "text", - "image", - "audio" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 131072, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -102922,35 +101143,34 @@ "effort_options": [ "low", "medium", - "high" + "high", + "xhigh" ] } }, "attachment": true, - "open_weights": false, - "release_date": "2026-02-27", - "last_updated": "2026-02-27", + "open_weights": true, + "knowledge": "2026-01-04", + "release_date": "2026-08-10", + "last_updated": "2026-08-10", "type": "chat" }, { - "id": "google-ai-studio/gemini-3.5-flash-lite", - "name": "Gemini 3.5 Flash Lite (Google AI Studio)", - "display_name": "Gemini 3.5 Flash Lite (Google AI Studio)", + "id": "flexai/Step-3.7-Flash", + "name": "Step 3.7 Flash (FlexAI)", + "display_name": "Step 3.7 Flash (FlexAI)", "modalities": { "input": [ "text", - "image", - "video", - "audio", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 262144, + "output": 256000 }, "temperature": true, "tool_call": true, @@ -102960,9 +101180,7 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ - "minimal", "low", "medium", "high" @@ -102970,23 +101188,19 @@ } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-07-21", - "last_updated": "2026-07-21", + "open_weights": true, + "knowledge": "2026-03-01", + "release_date": "2026-05-29", + "last_updated": "2026-05-29", "type": "chat" }, { - "id": "google-ai-studio/gemini-3.1-pro-preview", - "name": "Gemini 3.1 Pro (Preview) (Google AI Studio)", - "display_name": "Gemini 3.1 Pro (Preview) (Google AI Studio)", + "id": "flexai/DeepSeek-V4-Flash-0731", + "name": "DeepSeek V4 Flash 0731 (FlexAI)", + "display_name": "DeepSeek V4 Flash 0731 (FlexAI)", "modalities": { "input": [ - "text", - "image", - "video", - "audio", - "pdf" + "text" ], "output": [ "text" @@ -102994,7 +101208,7 @@ }, "limit": { "context": 1048576, - "output": 65536 + "output": 384000 }, "temperature": true, "tool_call": true, @@ -103005,46 +101219,36 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ + "effort_options": [ + "none", "low", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" + "high", + "max" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-02-19", - "last_updated": "2026-02-19", + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-07-31", + "last_updated": "2026-07-31", "type": "chat" }, { - "id": "google-ai-studio/gemini-3.8-flash", - "name": "Gemini 3.8 Flash (Google AI Studio)", - "display_name": "Gemini 3.8 Flash (Google AI Studio)", + "id": "flexai/gpt-oss-120b", + "name": "GPT OSS 120B (FlexAI)", + "display_name": "GPT OSS 120B (FlexAI)", "modalities": { "input": [ - "text", - "image", - "video", - "audio", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 131072, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -103055,39 +101259,28 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", + "effort_options": [ "low", "medium", "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" ] } }, - "attachment": true, - "open_weights": false, - "release_date": "2026-09-02", - "last_updated": "2026-09-02", + "attachment": false, + "open_weights": true, + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "google-ai-studio/gemini-3-flash-preview", - "name": "Gemini 3 Flash (Preview) (Google AI Studio)", - "display_name": "Gemini 3 Flash (Preview) (Google AI Studio)", + "id": "flexai/DeepSeek-V4.1-Flash-1017", + "name": "DeepSeek V4.1 Flash 1017 (FlexAI)", + "display_name": "DeepSeek V4.1 Flash 1017 (FlexAI)", "modalities": { "input": [ "text", - "image", - "video", - "audio", - "pdf" + "image" ], "output": [ "text" @@ -103095,7 +101288,7 @@ }, "limit": { "context": 1048576, - "output": 65535 + "output": 384000 }, "temperature": true, "tool_call": true, @@ -103105,41 +101298,29 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", + "effort_options": [ + "none", "low", - "medium", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" + "high", + "max" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-12-17", - "last_updated": "2025-12-17", + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-10-17", + "last_updated": "2026-10-17", "type": "chat" }, { - "id": "google-ai-studio/gemini-3.6-flash", - "name": "Gemini 3.6 Flash (Google AI Studio)", - "display_name": "Gemini 3.6 Flash (Google AI Studio)", + "id": "flexai/DeepSeek-V4.1-Flash", + "name": "DeepSeek V4.1 Flash (FlexAI)", + "display_name": "DeepSeek V4.1 Flash (FlexAI)", "modalities": { "input": [ "text", - "image", - "video", - "audio", - "pdf" + "image" ], "output": [ "text" @@ -103147,7 +101328,7 @@ }, "limit": { "context": 1048576, - "output": 65536 + "output": 384000 }, "temperature": true, "tool_call": true, @@ -103158,48 +101339,37 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", + "effort_options": [ + "none", "low", - "medium", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" + "high", + "max" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-07-21", - "last_updated": "2026-07-21", + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-09-10", + "last_updated": "2026-09-10", "type": "chat" }, { - "id": "google-ai-studio/gemini-3.1-flash-lite", - "name": "Gemini 3.1 Flash Lite (Google AI Studio)", - "display_name": "Gemini 3.1 Flash Lite (Google AI Studio)", + "id": "deepseek/deepseek-v4-flash", + "name": "DeepSeek V4 Flash", + "display_name": "DeepSeek V4 Flash", "modalities": { "input": [ "text", - "image", - "video", - "audio", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 1000000, + "output": 384000 }, "temperature": true, "tool_call": true, @@ -103210,25 +101380,36 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", "effort_options": [ - "minimal", "low", - "medium", - "high" + "high", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-05-07", - "last_updated": "2026-05-07", + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "canopywave/deepseek-v4-flash", - "name": "DeepSeek V4 Flash (CanopyWave)", - "display_name": "DeepSeek V4 Flash (CanopyWave)", + "id": "deepseek/deepseek-chat", + "name": "DeepSeek Chat", + "display_name": "DeepSeek Chat", "modalities": { "input": [ "text" @@ -103237,9 +101418,38 @@ "text" ] }, + "limit": { + "context": 131072, + "output": 384000 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "knowledge": "2025-09", + "release_date": "2025-12-01", + "last_updated": "2026-02-28", + "type": "chat" + }, + { + "id": "deepseek/deepseek-v4-flash-vision-exp", + "name": "DeepSeek V4 Flash Vision Exp", + "display_name": "DeepSeek V4 Flash Vision Exp", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, "limit": { "context": 1000000, - "output": 393216 + "output": 384000 }, "temperature": true, "tool_call": true, @@ -103269,17 +101479,16 @@ ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "release_date": "2026-08-21", + "last_updated": "2026-09-01", "type": "chat" }, { - "id": "canopywave/deepseek-v4-pro", - "name": "DeepSeek V4 Pro (CanopyWave)", - "display_name": "DeepSeek V4 Pro (CanopyWave)", + "id": "deepseek/deepseek-v4-pro", + "name": "DeepSeek V4 Pro", + "display_name": "DeepSeek V4 Pro", "modalities": { "input": [ "text" @@ -103290,7 +101499,7 @@ }, "limit": { "context": 1000000, - "output": 393216 + "output": 384000 }, "temperature": true, "tool_call": true, @@ -103328,24 +101537,24 @@ "type": "chat" }, { - "id": "canopywave/kimi-k2.6", - "name": "Kimi K2.6 (CanopyWave)", - "display_name": "Kimi K2.6 (CanopyWave)", + "id": "openai/gpt-6.1-terra", + "name": "GPT-6.1 Terra", + "display_name": "GPT-6.1 Terra", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -103353,16 +101562,8 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ "none", - "minimal", "low", "medium", "high", @@ -103372,29 +101573,29 @@ } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-20", - "last_updated": "2026-04-20", + "open_weights": false, + "knowledge": "2026-06-01", + "release_date": "2026-10-26", + "last_updated": "2026-10-26", "type": "chat" }, { - "id": "canopywave/kimi-k3", - "name": "Kimi K3 (CanopyWave)", - "display_name": "Kimi K3 (CanopyWave)", + "id": "openai/gpt-5.6-terra", + "name": "GPT-5.6 Terra", + "display_name": "GPT-5.6 Terra", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 1048576 + "context": 1050000, + "output": 128000 }, "temperature": false, "tool_call": true, @@ -103405,89 +101606,105 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ "none", - "minimal", "low", "medium", "high", "xhigh", "max" - ] + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, - "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-16", + "open_weights": false, + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "canopywave/glm-5.2", - "name": "GLM-5.2 (CanopyWave)", - "display_name": "GLM-5.2 (CanopyWave)", + "id": "openai/gpt-5.4", + "name": "GPT-5.4", + "display_name": "GPT-5.4", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 32768 + "context": 1050000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], + "default_enabled": false, + "mode": "effort", + "effort": "none", "effort_options": [ "none", - "minimal", "low", "medium", "high", - "xhigh", - "max" - ] + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "attachment": true, + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-03-05", + "last_updated": "2026-03-05", "type": "chat" }, { - "id": "luminal/deepseek-v4.1-flash", - "name": "DeepSeek V4.1 Flash (luminal)", - "display_name": "DeepSeek V4.1 Flash (luminal)", + "id": "openai/gpt-5.6-sol", + "name": "GPT-5.6 Sol", + "display_name": "GPT-5.6 Sol", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -103496,69 +101713,41 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ "none", - "minimal", "low", "medium", "high", "xhigh", "max" - ] - } - }, - "attachment": true, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-09-10", - "last_updated": "2026-09-10", - "type": "chat" - }, - { - "id": "groq/gpt-oss-120b", - "name": "GPT OSS 120B (Groq)", - "display_name": "GPT OSS 120B (Groq)", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 131072, - "output": 32766 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ + ], + "verbosity": "medium", + "verbosity_options": [ "low", "medium", "high" - ] + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "attachment": true, + "open_weights": false, + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "groq/gpt-oss-20b", - "name": "GPT OSS 20B (Groq)", - "display_name": "GPT OSS 20B (Groq)", + "id": "openai/gpt-5.4-mini", + "name": "GPT-5.4 mini", + "display_name": "GPT-5.4 mini", "modalities": { "input": [ + "pdf", + "image", "text" ], "output": [ @@ -103566,77 +101755,93 @@ ] }, "limit": { - "context": 131072, - "output": 32766 + "context": 400000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ "low", "medium", "high" - ] + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "attachment": true, + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-03-17", + "last_updated": "2026-03-17", "type": "chat" }, { - "id": "perplexity/sonar", - "name": "Sonar (Perplexity)", - "display_name": "Sonar (Perplexity)", + "id": "openai/gpt-4o", + "name": "GPT-4o", + "display_name": "GPT-4o", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 130000, - "output": 4096 + "context": 128000, + "output": 16384 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2025-09-01", - "release_date": "2024-01-01", - "last_updated": "2025-09-01", + "knowledge": "2023-09", + "release_date": "2024-05-13", + "last_updated": "2024-08-06", "type": "chat" }, { - "id": "bytedance/deepseek-v4-flash", - "name": "DeepSeek V4 Flash (ByteDance)", - "display_name": "DeepSeek V4 Flash (ByteDance)", + "id": "openai/gpt-5.6-luna", + "name": "GPT-5.6 Luna", + "display_name": "GPT-5.6 Luna", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 393216 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -103647,125 +101852,110 @@ "supported": true, "default_enabled": true, "mode": "effort", - "effort": "high", + "effort": "medium", "effort_options": [ + "none", "low", + "medium", "high", + "xhigh", "max" ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" ], - "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." - ] + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "attachment": true, + "open_weights": false, + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "bytedance/seed-2-0-mini-260428", - "name": "Seed 2.0 Mini (260428) (ByteDance)", - "display_name": "Seed 2.0 Mini (260428) (ByteDance)", + "id": "openai/gpt-4.1", + "name": "GPT-4.1", + "display_name": "GPT-4.1", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 131072 + "context": 1047576, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "minimal", - "low", - "medium", - "high" - ] - } + "supported": false }, "attachment": true, "open_weights": false, - "release_date": "2026-04-28", - "last_updated": "2026-04-28", + "knowledge": "2024-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", "type": "chat" }, { - "id": "bytedance/seed-1-6-250915", - "name": "Seed 1.6 (250915) (ByteDance)", - "display_name": "Seed 1.6 (250915) (ByteDance)", + "id": "openai/gpt-4o-2024-08-06", + "name": "GPT-4o (2024-08-06)", + "display_name": "GPT-4o (2024-08-06)", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 256000 + "context": 128000, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "minimal", - "low", - "medium", - "high" - ] - } + "supported": false }, "attachment": true, "open_weights": false, - "release_date": "2025-09-15", - "last_updated": "2025-09-15", + "knowledge": "2023-09", + "release_date": "2024-08-06", + "last_updated": "2024-08-06", "type": "chat" }, { - "id": "bytedance/deepseek-v4-pro", - "name": "DeepSeek V4 Pro (ByteDance)", - "display_name": "DeepSeek V4 Pro (ByteDance)", + "id": "openai/o3-pro", + "name": "o3-pro", + "display_name": "o3-pro", "modalities": { "input": [ - "text" + "text", + "pdf", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 393216 + "context": 200000, + "output": 100000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -103776,46 +101966,39 @@ "supported": true, "default_enabled": true, "mode": "effort", - "effort": "high", + "effort": "medium", "effort_options": [ "low", - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "medium", + "high" ], - "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." - ] + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "attachment": true, + "open_weights": false, + "knowledge": "2024-05", + "release_date": "2025-06-10", + "last_updated": "2025-06-10", "type": "chat" }, { - "id": "bytedance/seed-1-6-250615", - "name": "Seed 1.6 (250615) (ByteDance)", - "display_name": "Seed 1.6 (250615) (ByteDance)", + "id": "openai/gpt-5.3-codex", + "name": "GPT-5.3 Codex", + "display_name": "GPT-5.3 Codex", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 256000 + "context": 400000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -103825,116 +102008,133 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ - "minimal", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ "low", "medium", "high" - ] + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "release_date": "2025-06-25", - "last_updated": "2025-06-25", + "knowledge": "2025-08-31", + "release_date": "2026-02-05", + "last_updated": "2026-02-05", "type": "chat" }, { - "id": "bytedance/seed-2-0-pro-260328", - "name": "Seed 2.0 Pro (260328) (ByteDance)", - "display_name": "Seed 2.0 Pro (260328) (ByteDance)", + "id": "openai/gpt-5.1", + "name": "GPT-5.1", + "display_name": "GPT-5.1", "modalities": { "input": [ + "image", "text", - "image" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 131072 + "context": 400000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", "effort_options": [ - "minimal", + "none", "low", "medium", "high" - ] + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "release_date": "2026-03-28", - "last_updated": "2026-03-28", + "knowledge": "2024-09-30", + "release_date": "2025-11-13", + "last_updated": "2025-11-13", "type": "chat" }, { - "id": "bytedance/seed-1-6-flash-250715", - "name": "Seed 1.6 Flash (250715) (ByteDance)", - "display_name": "Seed 1.6 Flash (250715) (ByteDance)", + "id": "openai/gpt-4o-2024-11-20", + "name": "GPT-4o (2024-11-20)", + "display_name": "GPT-4o (2024-11-20)", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 256000 + "context": 128000, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "minimal", - "low", - "medium", - "high" - ] - } + "supported": false }, "attachment": true, "open_weights": false, - "release_date": "2025-07-26", - "last_updated": "2025-07-26", + "knowledge": "2023-09", + "release_date": "2024-11-20", + "last_updated": "2024-11-20", "type": "chat" }, { - "id": "bytedance/seed-1-8-251228", - "name": "Seed 1.8 (251228) (ByteDance)", - "display_name": "Seed 1.8 (251228) (ByteDance)", + "id": "openai/gpt-6-luna", + "name": "GPT-6 Luna", + "display_name": "GPT-6 Luna", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 256000 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -103943,36 +102143,41 @@ "extra_capabilities": { "reasoning": { "effort_options": [ - "minimal", + "none", "low", "medium", - "high" + "high", + "xhigh", + "max" ] } }, "attachment": true, "open_weights": false, - "release_date": "2025-12-18", - "last_updated": "2025-12-18", + "knowledge": "2026-05-18", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "bytedance/gpt-oss-120b", - "name": "GPT OSS 120B (ByteDance)", - "display_name": "GPT OSS 120B (ByteDance)", + "id": "openai/gpt-5-mini", + "name": "GPT-5 Mini", + "display_name": "GPT-5 Mini", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 32000 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -103981,37 +102186,50 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ + "minimal", "low", "medium", "high" - ] + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "attachment": true, + "open_weights": false, + "knowledge": "2024-05-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "bytedance/glm-5.2", - "name": "GLM-5.2 (ByteDance)", - "display_name": "GLM-5.2 (ByteDance)", + "id": "openai/gpt-6-sol", + "name": "GPT-6 Sol", + "display_name": "GPT-6 Sol", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1024000, + "context": 1050000, "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -104019,16 +102237,8 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ "none", - "minimal", "low", "medium", "high", @@ -104037,29 +102247,32 @@ ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "attachment": true, + "open_weights": false, + "knowledge": "2026-04-20", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "bytedance/glm-4.7", - "name": "GLM-4.7 (ByteDance)", - "display_name": "GLM-4.7 (ByteDance)", + "id": "openai/gpt-5.4-pro", + "name": "GPT-5.4 Pro", + "display_name": "GPT-5.4 Pro", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 200000, + "context": 1050000, "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -104068,38 +102281,49 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-12-22", - "last_updated": "2025-12-22", + "attachment": true, + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-03-05", + "last_updated": "2026-03-05", "type": "chat" }, { - "id": "bytedance/deepseek-v3.2", - "name": "DeepSeek V3.2 (ByteDance)", - "display_name": "DeepSeek V3.2 (ByteDance)", + "id": "openai/gpt-5", + "name": "GPT-5", + "display_name": "GPT-5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -104107,34 +102331,51 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "minimal", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-07", - "release_date": "2025-12-01", - "last_updated": "2025-12-01", + "attachment": true, + "open_weights": false, + "knowledge": "2024-09-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "bytedance/seed-2-0-code-preview-260328", - "name": "Seed 2.0 Code Preview (260328) (ByteDance)", - "display_name": "Seed 2.0 Code Preview (260328) (ByteDance)", + "id": "openai/gpt-6.1-sol", + "name": "GPT-6.1 Sol", + "display_name": "GPT-6.1 Sol", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 131072 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -104143,37 +102384,40 @@ "extra_capabilities": { "reasoning": { "effort_options": [ - "minimal", "low", "medium", - "high" + "high", + "xhigh", + "max" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-03-28", - "last_updated": "2026-03-28", + "knowledge": "2026-04-30", + "release_date": "2026-09-29", + "last_updated": "2026-09-29", "type": "chat" }, { - "id": "bytedance/seed-2-0-lite-260428", - "name": "Seed 2.0 Lite (260428) (ByteDance)", - "display_name": "Seed 2.0 Lite (260428) (ByteDance)", + "id": "openai/gpt-pro-latest", + "name": "GPT Pro Latest (GPT-5.6 Sol)", + "display_name": "GPT Pro Latest (GPT-5.6 Sol)", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 131072 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -104182,25 +102426,30 @@ "extra_capabilities": { "reasoning": { "effort_options": [ - "minimal", + "none", "low", "medium", - "high" + "high", + "xhigh", + "max" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-04-28", - "last_updated": "2026-04-28", + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "greenference/qwen3-14b", - "name": "Qwen3 14B (greenference)", - "display_name": "Qwen3 14B (greenference)", - "modalities": { - "input": [ + "id": "openai/gpt-5.2", + "name": "GPT-5.2", + "display_name": "GPT-5.2", + "modalities": { + "input": [ + "pdf", + "image", "text" ], "output": [ @@ -104208,78 +102457,98 @@ ] }, "limit": { - "context": 16384, - "output": 8192 + "context": 400000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2025-04-28", - "last_updated": "2025-04-28", + "knowledge": "2025-08-31", + "release_date": "2025-12-11", + "last_updated": "2025-12-11", "type": "chat" }, { - "id": "greenference/qwen3.6-27b", - "name": "Qwen3.6 27B (greenference)", - "display_name": "Qwen3.6 27B (greenference)", + "id": "openai/gpt-5-pro", + "name": "GPT-5 Pro", + "display_name": "GPT-5 Pro", "modalities": { "input": [ - "text" + "image", + "text", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 16384, - "output": 8192 + "context": 400000, + "output": 272000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "default_enabled": true, + "mode": "fixed", + "effort": "high", + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-04-22", - "last_updated": "2026-04-22", + "attachment": true, + "open_weights": false, + "knowledge": "2024-09-30", + "release_date": "2025-10-06", + "last_updated": "2025-10-06", "type": "chat" }, { - "id": "greenference/glm-5.3-flash", - "name": "GLM-5.3 Flash (greenference)", - "display_name": "GLM-5.3 Flash (greenference)", + "id": "openai/gpt-latest", + "name": "GPT Latest (GPT-6 Astra)", + "display_name": "GPT Latest (GPT-6 Astra)", "modalities": { "input": [ "text", "image", - "video", "pdf" ], "output": [ @@ -104287,10 +102556,10 @@ ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -104298,62 +102567,55 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ "low", "medium", - "high" + "high", + "xhigh", + "max" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", + "open_weights": false, + "knowledge": "2026-04-30", + "release_date": "2026-09-04", + "last_updated": "2026-09-04", "type": "chat" }, { - "id": "greenference/qwen3-30b-a3b", - "name": "Qwen3 30B A3B (greenference)", - "display_name": "Qwen3 30B A3B (greenference)", + "id": "openai/gpt-5-search-api", + "name": "GPT-5 Search API", + "display_name": "GPT-5 Search API", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 8192, - "output": 4096 + "context": 272000, + "output": 100000 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { - "supported": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, - "attachment": false, - "open_weights": true, - "release_date": "2025-04-28", - "last_updated": "2025-04-28", + "attachment": true, + "open_weights": false, + "release_date": "2025-10-14", + "last_updated": "2025-10-14", "type": "chat" }, { - "id": "aws-bedrock/claude-haiku-5-5", - "name": "Claude Haiku 5.5 (AWS Bedrock)", - "display_name": "Claude Haiku 5.5 (AWS Bedrock)", + "id": "openai/o3", + "name": "o3", + "display_name": "o3", "modalities": { "input": [ "text", @@ -104365,8 +102627,8 @@ ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 200000, + "output": 100000 }, "temperature": false, "tool_call": true, @@ -104376,40 +102638,42 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ - "none", "low", "medium", - "high", - "xhigh", - "max" - ] + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-10-07", - "last_updated": "2026-10-07", + "knowledge": "2024-05", + "release_date": "2025-04-16", + "last_updated": "2025-04-16", "type": "chat" }, { - "id": "aws-bedrock/claude-haiku-4-5-20251001", - "name": "Claude Haiku 4.5 (2025-10-01) (AWS Bedrock)", - "display_name": "Claude Haiku 4.5 (2025-10-01) (AWS Bedrock)", + "id": "openai/gpt-5.4-nano", + "name": "GPT-5.4 nano", + "display_name": "GPT-5.4 nano", "modalities": { "input": [ - "text", + "pdf", "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 400000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -104421,34 +102685,35 @@ "reasoning": { "supported": true, "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." - ] + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2025-02-28", - "release_date": "2025-10-15", - "last_updated": "2025-10-15", + "knowledge": "2025-08-31", + "release_date": "2026-03-17", + "last_updated": "2026-03-17", "type": "chat" }, { - "id": "aws-bedrock/claude-opus-4-7", - "name": "Claude Opus 4.7 (AWS Bedrock)", - "display_name": "Claude Opus 4.7 (AWS Bedrock)", + "id": "openai/gpt-5.5-pro", + "name": "GPT-5.5 Pro", + "display_name": "GPT-5.5 Pro", "modalities": { "input": [ "text", @@ -104460,52 +102725,36 @@ ] }, "limit": { - "context": 1000000, + "context": 1050000, "output": 128000 }, "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "high", "effort_options": [ - "low", "medium", "high", - "xhigh", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." + "xhigh" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-04-16", - "last_updated": "2026-04-16", + "knowledge": "2025-12-01", + "release_date": "2026-04-23", + "last_updated": "2026-04-23", "type": "chat" }, { - "id": "aws-bedrock/claude-sonnet-4-5", - "name": "Claude Sonnet 4.5 (AWS Bedrock)", - "display_name": "Claude Sonnet 4.5 (AWS Bedrock)", + "id": "openai/gpt-5.5", + "name": "GPT-5.5", + "display_name": "GPT-5.5", "modalities": { "input": [ "text", @@ -104517,51 +102766,51 @@ ] }, "limit": { - "context": 200000, - "output": 8192 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high", + "xhigh" ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." - ] + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2025-07-31", - "release_date": "2025-09-29", - "last_updated": "2025-09-29", + "knowledge": "2025-12-01", + "release_date": "2026-04-23", + "last_updated": "2026-04-23", "type": "chat" }, { - "id": "aws-bedrock/claude-haiku-4-5", - "name": "Claude Haiku 4.5 (AWS Bedrock)", - "display_name": "Claude Haiku 4.5 (AWS Bedrock)", + "id": "openai/gpt-5.2-pro", + "name": "GPT-5.2 Pro", + "display_name": "GPT-5.2 Pro", "modalities": { "input": [ - "text", "image", + "text", "pdf" ], "output": [ @@ -104569,47 +102818,46 @@ ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "medium", + "high", + "xhigh" ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." - ] + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2025-02-28", - "release_date": "2025-10-15", - "last_updated": "2025-10-15", + "knowledge": "2025-08-31", + "release_date": "2025-12-11", + "last_updated": "2025-12-11", "type": "chat" }, { - "id": "aws-bedrock/claude-sonnet-5-5", - "name": "Claude Sonnet 5.5 (AWS Bedrock)", - "display_name": "Claude Sonnet 5.5 (AWS Bedrock)", + "id": "openai/gpt-4.1-mini", + "name": "GPT-4.1 mini", + "display_name": "GPT-4.1 mini", "modalities": { "input": [ "text", @@ -104621,37 +102869,25 @@ ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 1047576, + "output": 32768 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ] - } + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-09-28", - "last_updated": "2026-09-28", + "knowledge": "2024-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", "type": "chat" }, { - "id": "aws-bedrock/claude-fable-5-1", - "name": "Claude Fable 5.1 (AWS Bedrock)", - "display_name": "Claude Fable 5.1 (AWS Bedrock)", + "id": "openai/gpt-4o-mini", + "name": "GPT-4o mini", + "display_name": "GPT-4o mini", "modalities": { "input": [ "text", @@ -104663,66 +102899,40 @@ ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 128000, + "output": 16384 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", - "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", - "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." - ] - } + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-09-01", - "last_updated": "2026-09-01", + "knowledge": "2023-09", + "release_date": "2024-07-18", + "last_updated": "2024-07-18", "type": "chat" }, { - "id": "aws-bedrock/grok-4-6", - "name": "Grok 4.6 (AWS Bedrock)", - "display_name": "Grok 4.6 (AWS Bedrock)", + "id": "openai/gpt-6-astra", + "name": "GPT-6 Astra", + "display_name": "GPT-6 Astra", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 500000, - "output": 500000 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -104730,25 +102940,27 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ "low", "medium", "high", - "xhigh" + "xhigh", + "max" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-02-01", - "release_date": "2026-08-12", - "last_updated": "2026-08-12", + "knowledge": "2026-04-30", + "release_date": "2026-09-04", + "last_updated": "2026-09-04", "type": "chat" }, { - "id": "aws-bedrock/claude-sonnet-5", - "name": "Claude Sonnet 5 (AWS Bedrock)", - "display_name": "Claude Sonnet 5 (AWS Bedrock)", + "id": "openai/gpt-5-nano", + "name": "GPT-5 Nano", + "display_name": "GPT-5 Nano", "modalities": { "input": [ "text", @@ -104760,7 +102972,7 @@ ] }, "limit": { - "context": 1000000, + "context": 400000, "output": 128000 }, "temperature": false, @@ -104772,27 +102984,35 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ - "none", + "minimal", "low", "medium", - "high", - "xhigh", - "max" - ] + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-30", - "last_updated": "2026-06-30", + "knowledge": "2024-05-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "aws-bedrock/claude-opus-5-5", - "name": "Claude Opus 5.5 (AWS Bedrock)", - "display_name": "Claude Opus 5.5 (AWS Bedrock)", + "id": "openai/gpt-mini-latest", + "name": "GPT Mini Latest (GPT-5.6 Luna)", + "display_name": "GPT Mini Latest (GPT-5.6 Luna)", "modalities": { "input": [ "text", @@ -104804,7 +103024,7 @@ ] }, "limit": { - "context": 1000000, + "context": 1050000, "output": 128000 }, "temperature": false, @@ -104816,6 +103036,7 @@ "extra_capabilities": { "reasoning": { "effort_options": [ + "none", "low", "medium", "high", @@ -104826,15 +103047,15 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "aws-bedrock/llama-3.1-70b-instruct", - "name": "Llama 3.1 70B Instruct (AWS Bedrock)", - "display_name": "Llama 3.1 70B Instruct (AWS Bedrock)", + "id": "deepinfra/nemotron-3-super-120b-a12b", + "name": "Nemotron 3 Super 120B A12B (Deep Infra)", + "display_name": "Nemotron 3 Super 120B A12B (Deep Infra)", "modalities": { "input": [ "text" @@ -104844,40 +103065,48 @@ ] }, "limit": { - "context": 128000, - "output": 2048 + "context": 262144, + "output": 262144 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "low", + "medium" + ] + } }, "attachment": false, "open_weights": true, - "knowledge": "2023-12", - "release_date": "2024-07-23", - "last_updated": "2024-07-23", + "knowledge": "2025-06", + "release_date": "2026-03-11", + "last_updated": "2026-03-11", "type": "chat" }, { - "id": "aws-bedrock/kimi-k3", - "name": "Kimi K3 (AWS Bedrock)", - "display_name": "Kimi K3 (AWS Bedrock)", + "id": "deepinfra/nemotron-3-ultra-550b-a55b", + "name": "Nemotron 3 Ultra 550B A55B (Deep Infra)", + "display_name": "Nemotron 3 Ultra 550B A55B (Deep Infra)", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 1048576 + "context": 262144, + "output": 128000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -104888,39 +103117,35 @@ "supported": true, "effort_options": [ "none", - "low", "medium", - "high", - "xhigh", - "max" + "high" ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-16", + "knowledge": "2025-09", + "release_date": "2026-06-04", + "last_updated": "2026-06-04", "type": "chat" }, { - "id": "aws-bedrock/claude-opus-5", - "name": "Claude Opus 5 (AWS Bedrock)", - "display_name": "Claude Opus 5 (AWS Bedrock)", + "id": "deepinfra/stepfun-ai/Step-3.5-Flash", + "name": "Step 3.5 Flash (Deep Infra)", + "display_name": "Step 3.5 Flash (Deep Infra)", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 262144, + "output": 256000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -104928,100 +103153,76 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ - "none", "low", - "medium", - "high", - "xhigh", - "max" + "high" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-05", - "release_date": "2026-07-24", - "last_updated": "2026-07-24", + "attachment": false, + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-01-29", + "last_updated": "2026-02-13", "type": "chat" }, { - "id": "aws-bedrock/claude-sonnet-4-6", - "name": "Claude Sonnet 4.6 (AWS Bedrock)", - "display_name": "Claude Sonnet 4.6 (AWS Bedrock)", + "id": "deepinfra/stepfun-ai/Step-3.7-Flash", + "name": "Step 3.7 Flash (Deep Infra)", + "display_name": "Step 3.7 Flash (Deep Infra)", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 64000 + "context": 262144, + "output": 256000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", "effort_options": [ "low", "medium", - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." + "high" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-17", - "last_updated": "2026-03-13", + "open_weights": true, + "knowledge": "2026-03-01", + "release_date": "2026-05-29", + "last_updated": "2026-05-29", "type": "chat" }, { - "id": "aws-bedrock/grok-4-7", - "name": "Grok 4.7 (AWS Bedrock)", - "display_name": "Grok 4.7 (AWS Bedrock)", + "id": "deepinfra/stepfun-ai/Step-5-Preview", + "name": "Step 5 Preview (Deep Infra)", + "display_name": "Step 5 Preview (Deep Infra)", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 524288, - "output": 524288 + "context": 1048576, + "output": 1000000 }, "temperature": true, "tool_call": true, @@ -105034,120 +103235,76 @@ "effort_options": [ "low", "medium", - "high", - "xhigh" + "high" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-05", - "release_date": "2026-09-21", - "last_updated": "2026-09-21", + "open_weights": true, + "release_date": "2026-09-16", + "last_updated": "2026-09-20", "type": "chat" }, { - "id": "aws-bedrock/claude-opus-4-5-20251101", - "name": "Claude Opus 4.5 (AWS Bedrock)", - "display_name": "Claude Opus 4.5 (AWS Bedrock)", + "id": "deepinfra/meta-llama/Llama-3.2-3B-Instruct", + "name": "Llama 3.2 3B Instruct (Deep Infra)", + "display_name": "Llama 3.2 3B Instruct (Deep Infra)", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 32000 + "context": 131072, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." - ] - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-05", - "release_date": "2025-11-24", - "last_updated": "2025-11-24", + "attachment": false, + "open_weights": true, + "knowledge": "2023-12", + "release_date": "2024-09-25", + "last_updated": "2024-09-25", "type": "chat" }, { - "id": "aws-bedrock/grok-4-3", - "name": "Grok 4.3 (AWS Bedrock)", - "display_name": "Grok 4.3 (AWS Bedrock)", + "id": "deepinfra/meta-llama/Llama-Guard-3-8B", + "name": "Llama-Guard-3-8B (Deep Infra)", + "display_name": "Llama-Guard-3-8B (Deep Infra)", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 131072, + "output": 4096 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "high" - ] - } + "supported": false }, - "attachment": true, - "open_weights": false, - "release_date": "2026-04-17", - "last_updated": "2026-04-17", + "attachment": false, + "open_weights": true, + "knowledge": "2023-12", + "release_date": "2024-07-23", + "last_updated": "2024-07-23", "type": "chat" }, { - "id": "aws-bedrock/llama-4-maverick-17b-instruct", - "name": "Llama 4 Maverick 17B Instruct (AWS Bedrock)", - "display_name": "Llama 4 Maverick 17B Instruct (AWS Bedrock)", + "id": "deepinfra/meta-llama/Llama-Guard-4-12B", + "name": "Llama Guard 4 12B (Deep Infra)", + "display_name": "Llama Guard 4 12B (Deep Infra)", "modalities": { "input": [ "text", @@ -105158,8 +103315,8 @@ ] }, "limit": { - "context": 8192, - "output": 2048 + "context": 163840, + "output": 163840 }, "temperature": true, "tool_call": false, @@ -105168,74 +103325,42 @@ }, "attachment": true, "open_weights": true, - "knowledge": "2024-08", - "release_date": "2025-04-05", - "last_updated": "2025-04-05", + "release_date": "2025-04-29", + "last_updated": "2025-04-29", "type": "chat" }, { - "id": "aws-bedrock/claude-opus-4-6", - "name": "Claude Opus 4.6 (AWS Bedrock)", - "display_name": "Claude Opus 4.6 (AWS Bedrock)", + "id": "deepinfra/meta-llama/Llama-3.3-70B-Instruct", + "name": "Llama-3.3-70B-Instruct (Deep Infra)", + "display_name": "Llama-3.3-70B-Instruct (Deep Infra)", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 131072, + "output": 4096 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." - ] - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-05-31", - "release_date": "2026-02-05", - "last_updated": "2026-03-13", + "attachment": false, + "open_weights": true, + "knowledge": "2023-12", + "release_date": "2024-12-06", + "last_updated": "2024-12-06", "type": "chat" }, { - "id": "aws-bedrock/llama-4-scout-17b-instruct", - "name": "Llama 4 Scout 17B Instruct (AWS Bedrock)", - "display_name": "Llama 4 Scout 17B Instruct (AWS Bedrock)", + "id": "deepinfra/meta-llama/Llama-3.2-11B-Vision-Instruct", + "name": "Llama-3.2-11B-Vision-Instruct (Deep Infra)", + "display_name": "Llama-3.2-11B-Vision-Instruct (Deep Infra)", "modalities": { "input": [ "text", @@ -105246,8 +103371,8 @@ ] }, "limit": { - "context": 8192, - "output": 2048 + "context": 131072, + "output": 4096 }, "temperature": true, "tool_call": false, @@ -105256,137 +103381,81 @@ }, "attachment": true, "open_weights": true, - "knowledge": "2024-08", - "release_date": "2025-04-05", - "last_updated": "2025-04-05", + "knowledge": "2023-12", + "release_date": "2024-09-25", + "last_updated": "2024-09-25", "type": "chat" }, { - "id": "aws-bedrock/claude-opus-4-8", - "name": "Claude Opus 4.8 (AWS Bedrock)", - "display_name": "Claude Opus 4.8 (AWS Bedrock)", + "id": "deepinfra/microsoft/WizardLM-2-8x22B", + "name": "WizardLM 2 8x22B (Deep Infra)", + "display_name": "WizardLM 2 8x22B (Deep Infra)", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 65536, + "output": 8000 }, - "temperature": false, - "tool_call": true, + "temperature": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." - ] - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-01", - "release_date": "2026-05-28", - "last_updated": "2026-05-28", + "attachment": false, + "open_weights": true, + "release_date": "2024-04-15", + "last_updated": "2024-04-15", "type": "chat" }, { - "id": "aws-bedrock/claude-sonnet-4-5-20250929", - "name": "Claude Sonnet 4.5 (2025-09-29) (AWS Bedrock)", - "display_name": "Claude Sonnet 4.5 (2025-09-29) (AWS Bedrock)", + "id": "deepinfra/moonshotai/Kimi-K2-Instruct", + "name": "Kimi K2 Instruct (Deep Infra)", + "display_name": "Kimi K2 Instruct (Deep Infra)", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 8192 + "context": 131072, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." - ] - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-07-31", - "release_date": "2025-09-29", - "last_updated": "2025-09-29", + "attachment": false, + "open_weights": true, + "release_date": "2025-07-11", + "last_updated": "2025-07-11", "type": "chat" }, { - "id": "aws-bedrock/claude-fable-5", - "name": "Claude Fable 5 (AWS Bedrock)", - "display_name": "Claude Fable 5 (AWS Bedrock)", + "id": "deepinfra/moonshotai/Kimi-K2.5", + "name": "Kimi K2.5 (Deep Infra)", + "display_name": "Kimi K2.5 (Deep Infra)", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 262144, + "output": 262144 }, "temperature": false, "tool_call": true, @@ -105397,54 +103466,36 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], "interleaved": true, "summaries": true, - "visibility": "omitted", + "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", - "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", - "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-09", - "last_updated": "2026-06-09", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-01-27", + "last_updated": "2026-01-27", "type": "chat" }, { - "id": "xiaomi/mimo-v2.6-pro", - "name": "MiMo V2.6 Pro (Xiaomi)", - "display_name": "MiMo V2.6 Pro (Xiaomi)", + "id": "deepinfra/openai/gpt-oss-20b", + "name": "GPT OSS 20B (Deep Infra)", + "display_name": "GPT OSS 20B (Deep Infra)", "modalities": { "input": [ - "text", - "image", - "audio", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 131072, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -105454,38 +103505,36 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ - "none", "low", "medium", "high" ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "xiaomi/mimo-v2.6-flash", - "name": "MiMo V2.6 Flash (Xiaomi)", - "display_name": "MiMo V2.6 Flash (Xiaomi)", + "id": "deepinfra/openai/gpt-oss-120b", + "name": "GPT OSS 120B (Deep Infra)", + "display_name": "GPT OSS 120B (Deep Infra)", "modalities": { "input": [ - "text", - "image", - "audio", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 131072, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -105495,95 +103544,36 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ - "none", "low", "medium", "high" ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" - } - ] - }, - "google-vertex": { - "id": "google-vertex", - "name": "Vertex", - "display_name": "Vertex", - "doc": "https://cloud.google.com/vertex-ai/generative-ai/docs/models", - "models": [ - { - "id": "gemini-3-pro-image", - "name": "Nano Banana Pro", - "display_name": "Nano Banana Pro", - "modalities": { - "input": [ - "text", - "image", - "pdf" - ], - "output": [ - "text", - "image" - ] - }, - "limit": { - "context": 65536, - "output": 32768 - }, - "temperature": true, - "tool_call": false, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "low", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] - } - }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-05-28", - "last_updated": "2026-05-28" }, { - "id": "gemini-3.1-flash-lite-image", - "name": "Nano Banana 2 Lite", - "display_name": "Nano Banana 2 Lite", + "id": "deepinfra/ibm-granite/granite-4.2-8b", + "name": "Granite 4.2 8B (Deep Infra)", + "display_name": "Granite 4.2 8B (Deep Infra)", "modalities": { "input": [ - "text", - "image", - "video", - "pdf" + "text" ], "output": [ - "text", - "image" + "text" ] }, "limit": { - "context": 65536, - "output": 4096 + "context": 131072, + "output": 117964 }, "temperature": true, "tool_call": true, @@ -105593,27 +103583,26 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ - "minimal", + "none", + "low", "high" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-06-30", - "last_updated": "2026-06-30" + "attachment": false, + "open_weights": true, + "release_date": "2026-08-25", + "last_updated": "2026-08-25", + "type": "chat" }, { - "id": "mistral-medium-3", - "name": "Mistral Medium 3", - "display_name": "Mistral Medium 3", + "id": "deepinfra/nvidia/Llama-3.1-Nemotron-70B-Instruct", + "name": "Llama 3.1 Nemotron 70B Instruct (Deep Infra)", + "display_name": "Llama 3.1 Nemotron 70B Instruct (Deep Infra)", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" @@ -105621,133 +103610,91 @@ }, "limit": { "context": 131072, - "output": 131072 + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-05", - "release_date": "2025-05-07", - "last_updated": "2025-05-07", + "attachment": false, + "open_weights": true, + "release_date": "2025-04-15", + "last_updated": "2025-04-15", "type": "chat" }, { - "id": "gemini-4-argon", - "name": "Gemini 4 Argon", - "display_name": "Gemini 4 Argon", + "id": "deepinfra/nvidia/Nemotron-3-Nano-30B-A3B", + "name": "Nemotron 3 Nano 30B A3B (Deep Infra)", + "display_name": "Nemotron 3 Nano 30B A3B (Deep Infra)", "modalities": { "input": [ - "text", - "image", - "video", - "audio", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 262144, + "output": 262144 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high" - ] - } - }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-10-13", - "last_updated": "2026-10-13", + "attachment": false, + "open_weights": true, + "knowledge": "2025-06-25", + "release_date": "2025-12-15", + "last_updated": "2025-12-15", "type": "chat" }, { - "id": "gemini-2.5-pro", - "name": "Gemini 2.5 Pro", - "display_name": "Gemini 2.5 Pro", + "id": "deepinfra/Gryphe/MythoMax-L2-13b", + "name": "MythoMax L2 13B (Deep Infra)", + "display_name": "MythoMax L2 13B (Deep Infra)", "modalities": { "input": [ - "text", - "image", - "audio", - "video", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 4096, + "output": 3200 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "budget", - "budget": { - "default": -1, - "min": 128, - "max": 32768, - "auto": -1, - "unit": "tokens" - }, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-06-17", - "last_updated": "2025-06-17", + "attachment": false, + "open_weights": true, + "release_date": "2023-08-10", + "last_updated": "2023-08-10", "type": "chat" }, { - "id": "gemini-3.5-flash", - "name": "Gemini 3.5 Flash", - "display_name": "Gemini 3.5 Flash", + "id": "deepinfra/meta-models/Muse-Glimmer-30B", + "name": "Muse Glimmer 30B (Deep Infra)", + "display_name": "Muse Glimmer 30B (Deep Infra)", "modalities": { "input": [ "text", - "image", - "video", - "audio", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 131072, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -105757,63 +103704,52 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", + "effort_options": [ "low", "medium", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" + "high", + "xhigh" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-05-19", - "last_updated": "2026-05-19", + "open_weights": true, + "knowledge": "2026-01-04", + "release_date": "2026-08-10", + "last_updated": "2026-08-10", "type": "chat" }, { - "id": "mistral-small-2503", - "name": "Mistral Small 3.1 24B", - "display_name": "Mistral Small 3.1 24B", + "id": "deepinfra/Qwen/Qwen2.5-7B-Instruct", + "name": "Qwen2.5 7B Instruct (Deep Infra)", + "display_name": "Qwen2.5 7B Instruct (Deep Infra)", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 32768, + "output": 8192 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-03-17", - "last_updated": "2025-03-17", + "release_date": "2024-09-19", + "last_updated": "2024-09-19", "type": "chat" }, { - "id": "gemini-embedding-001", - "name": "Gemini Embedding 001", - "display_name": "Gemini Embedding 001", + "id": "deepinfra/Qwen/Qwen3-Coder-480B-A35B-Instruct", + "name": "Qwen3-Coder 480B-A35B Instruct (Deep Infra)", + "display_name": "Qwen3-Coder 480B-A35B Instruct (Deep Infra)", "modalities": { "input": [ "text" @@ -105823,161 +103759,148 @@ ] }, "limit": { - "context": 2048, - "output": 1 + "context": 262144, + "output": 65536 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": false }, "attachment": false, - "open_weights": false, - "knowledge": "2025-05", - "release_date": "2025-05-20", - "last_updated": "2025-05-20", - "type": "embedding" + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-07-22", + "last_updated": "2025-07-22", + "type": "chat" }, { - "id": "gemini-2.5-pro-tts", - "name": "Gemini 2.5 Pro TTS", - "display_name": "Gemini 2.5 Pro TTS", + "id": "deepinfra/Qwen/Qwen3-235B-A22B-Instruct-2507", + "name": "Qwen3 235B-A22B Instruct 2507 (Deep Infra)", + "display_name": "Qwen3 235B-A22B Instruct 2507 (Deep Infra)", "modalities": { "input": [ "text" ], "output": [ - "audio" + "text" ] }, "limit": { - "context": 32768, + "context": 262144, "output": 16384 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "budget", - "budget": { - "default": -1, - "min": 128, - "max": 32768, - "auto": -1, - "unit": "tokens" - }, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] - } + "supported": false }, "attachment": false, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-09-30", - "last_updated": "2025-12-10" + "open_weights": true, + "release_date": "2025-07-21", + "last_updated": "2025-07-21", + "type": "chat" }, { - "id": "gemini-3.5-flash-lite", - "name": "Gemini 3.5 Flash Lite", - "display_name": "Gemini 3.5 Flash Lite", + "id": "deepinfra/Qwen/Qwen3-VL-30B-A3B-Instruct", + "name": "Qwen3 VL 30B A3B Instruct (Deep Infra)", + "display_name": "Qwen3 VL 30B A3B Instruct (Deep Infra)", "modalities": { "input": [ "text", - "image", - "video", - "audio", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 262144, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "minimal", - "low", - "medium", - "high" - ] - } + "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-07-21", - "last_updated": "2026-07-21", + "open_weights": true, + "release_date": "2025-10-04", + "last_updated": "2025-10-04", "type": "chat" }, { - "id": "gemini-2.5-flash-image", - "name": "Nano Banana", - "display_name": "Nano Banana", + "id": "deepinfra/Qwen/Qwen3-Next-80B-A3B-Instruct", + "name": "Qwen3-Next 80B-A3B Instruct (Deep Infra)", + "display_name": "Qwen3-Next 80B-A3B Instruct (Deep Infra)", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ + "text" + ] + }, + "limit": { + "context": 262144, + "output": 32768 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-09", + "last_updated": "2025-09", + "type": "chat" + }, + { + "id": "deepinfra/Qwen/Qwen3-VL-235B-A22B-Instruct", + "name": "Qwen3 VL 235B A22B Instruct (Deep Infra)", + "display_name": "Qwen3 VL 235B A22B Instruct (Deep Infra)", + "modalities": { + "input": [ "text", "image" + ], + "output": [ + "text" ] }, "limit": { - "context": 32768, + "context": 262144, "output": 32768 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2024-06", - "release_date": "2025-08-26", - "last_updated": "2025-08-26" + "open_weights": true, + "knowledge": "2025-03-31", + "release_date": "2025-09-23", + "last_updated": "2025-09-23", + "type": "chat" }, { - "id": "gemini-3.1-pro-preview", - "name": "Gemini 3.1 Pro Preview", - "display_name": "Gemini 3.1 Pro Preview", + "id": "deepinfra/Qwen/Qwen3-235B-A22B-Thinking-2507", + "name": "Qwen3 235B-A22B Thinking 2507 (Deep Infra)", + "display_name": "Qwen3 235B-A22B Thinking 2507 (Deep Infra)", "modalities": { "input": [ - "text", - "image", - "video", - "audio", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 262144, + "output": 81920 }, "temperature": true, "tool_call": true, @@ -105988,91 +103911,66 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "low", - "high" - ], + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-02-19", - "last_updated": "2026-02-19", + "attachment": false, + "open_weights": true, + "release_date": "2025-07-25", + "last_updated": "2025-07-25", "type": "chat" }, { - "id": "gemini-2.5-flash", - "name": "Gemini 2.5 Flash", - "display_name": "Gemini 2.5 Flash", + "id": "deepinfra/Qwen/Qwen3-Max", + "name": "Qwen3 Max (Deep Infra)", + "display_name": "Qwen3 Max (Deep Infra)", "modalities": { "input": [ - "text", - "image", - "audio", - "video", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, + "context": 256000, "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "budget", - "budget": { - "default": -1, - "min": 0, - "max": 24576, - "auto": -1, - "off": 0, - "unit": "tokens" - }, + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" ] } }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-06-17", - "last_updated": "2025-06-17", + "knowledge": "2025-04", + "release_date": "2025-09-23", + "last_updated": "2025-09-23", "type": "chat" }, { - "id": "gemini-3.8-flash", - "name": "Gemini 3.8 Flash", - "display_name": "Gemini 3.8 Flash", + "id": "deepinfra/tencent/Hy4-preview", + "name": "Hy4 preview (Deep Infra)", + "display_name": "Hy4 preview (Deep Infra)", "modalities": { "input": [ - "text", - "image", - "video", - "audio", - "pdf" + "text" ], "output": [ "text" @@ -106080,7 +103978,7 @@ }, "limit": { "context": 1048576, - "output": 65536 + "output": 64000 }, "temperature": true, "tool_call": true, @@ -106091,74 +103989,74 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", + "effort_options": [ + "none", "low", - "medium", "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" ] } }, - "attachment": true, - "open_weights": false, - "release_date": "2026-09-02", - "last_updated": "2026-09-02", + "attachment": false, + "open_weights": true, + "release_date": "2026-08-28", + "last_updated": "2026-08-28", "type": "chat" }, { - "id": "gemini-2.5-flash-tts", - "name": "Gemini 2.5 Flash TTS", - "display_name": "Gemini 2.5 Flash TTS", + "id": "deepinfra/tencent/Hy3", + "name": "Hy3 (Deep Infra)", + "display_name": "Hy3 (Deep Infra)", "modalities": { "input": [ "text" ], "output": [ - "audio" + "text" ] }, "limit": { - "context": 32768, - "output": 16384 + "context": 262144, + "output": 128000 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "none", + "low", + "high" + ] + } }, "attachment": false, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-09-30", - "last_updated": "2025-12-10" + "open_weights": true, + "release_date": "2026-07-06", + "last_updated": "2026-07-06", + "type": "chat" }, { - "id": "gemini-3.7-flash", - "name": "Gemini 3.7 Flash", - "display_name": "Gemini 3.7 Flash", + "id": "deepinfra/thinkingmachines/Inkling", + "name": "Inkling (Deep Infra)", + "display_name": "Inkling (Deep Infra)", "modalities": { "input": [ "text", "image", - "video", - "audio", - "pdf" + "audio" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 524288, + "output": 1048576 }, "temperature": true, "tool_call": true, @@ -106168,101 +104066,79 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ + "effort_options": [ + "none", "minimal", "low", "medium", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" + "high", + "max" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-08-13", - "last_updated": "2026-08-13", + "open_weights": true, + "release_date": "2026-07-15", + "last_updated": "2026-07-15", "type": "chat" }, { - "id": "gemini-2.5-flash-lite", - "name": "Gemini 2.5 Flash-Lite", - "display_name": "Gemini 2.5 Flash-Lite", + "id": "deepinfra/thinkingmachines/Inkling-Small", + "name": "Inkling Small (Deep Infra)", + "display_name": "Inkling Small (Deep Infra)", "modalities": { "input": [ "text", "image", - "audio", - "video", - "pdf" + "audio" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 524288, + "output": 1048576 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "default": -1, - "min": 512, - "max": 24576, - "auto": -1, - "unit": "tokens" - }, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" + "effort_options": [ + "none", + "minimal", + "low", + "medium", + "high", + "max" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-06-17", - "last_updated": "2025-06-17", + "open_weights": true, + "release_date": "2026-07-30", + "last_updated": "2026-07-30", "type": "chat" }, { - "id": "gemini-3-flash-preview", - "name": "Gemini 3 Flash Preview", - "display_name": "Gemini 3 Flash Preview", + "id": "deepinfra/zai-org/GLM-4.7-Flash", + "name": "GLM-4.7-Flash (Deep Infra)", + "display_name": "GLM-4.7-Flash (Deep Infra)", "modalities": { "input": [ - "text", - "image", - "video", - "audio", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 202752, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -106272,34 +104148,20 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", - "low", - "medium", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] + "supported": true } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-12-17", - "last_updated": "2025-12-17", + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2026-01-19", + "last_updated": "2026-01-19", "type": "chat" }, { - "id": "codestral-2", - "name": "Codestral 2", - "display_name": "Codestral 2", + "id": "deepinfra/deepseek-ai/DeepSeek-V3-0324", + "name": "DeepSeek V3 0324 (Deep Infra)", + "display_name": "DeepSeek V3 0324 (Deep Infra)", "modalities": { "input": [ "text" @@ -106309,8 +104171,8 @@ ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 163840, + "output": 163840 }, "temperature": true, "tool_call": true, @@ -106318,30 +104180,26 @@ "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2025-07-30", - "last_updated": "2025-07-30", + "open_weights": true, + "release_date": "2025-03-24", + "last_updated": "2025-03-24", "type": "chat" }, { - "id": "gemini-3.6-flash", - "name": "Gemini 3.6 Flash", - "display_name": "Gemini 3.6 Flash", + "id": "deepinfra/deepseek-ai/DeepSeek-R1-0528", + "name": "DeepSeek R1 0528 (Deep Infra)", + "display_name": "DeepSeek R1 0528 (Deep Infra)", "modalities": { "input": [ - "text", - "image", - "video", - "audio", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 163840, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -106352,51 +104210,38 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", - "low", - "medium", - "high" - ], + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-07-21", - "last_updated": "2026-07-21", + "attachment": false, + "open_weights": true, + "release_date": "2025-05-28", + "last_updated": "2025-05-28", "type": "chat" }, { - "id": "gemini-3.1-flash-image", - "name": "Nano Banana 2", - "display_name": "Nano Banana 2", + "id": "deepinfra/deepseek-ai/DeepSeek-V4-Flash-0731", + "name": "DeepSeek V4 Flash 0731 (Deep Infra)", + "display_name": "DeepSeek V4 Flash 0731 (Deep Infra)", "modalities": { "input": [ - "text", - "image", - "video", - "pdf" + "text" ], "output": [ - "text", - "image" + "text" ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 1048576, + "output": 384000 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, "default": true @@ -106405,78 +104250,55 @@ "reasoning": { "supported": true, "effort_options": [ - "minimal", - "high" + "none", + "low", + "high", + "max" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-05-28", - "last_updated": "2026-05-28" + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-07-31", + "last_updated": "2026-07-31", + "type": "chat" }, { - "id": "gemini-3.1-pro-preview-customtools", - "name": "Gemini 3.1 Pro Preview Custom Tools", - "display_name": "Gemini 3.1 Pro Preview Custom Tools", + "id": "deepinfra/deepseek-ai/DeepSeek-V3", + "name": "DeepSeek-V3 (Deep Infra)", + "display_name": "DeepSeek-V3 (Deep Infra)", "modalities": { "input": [ - "text", - "image", - "video", - "audio", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 163840, + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "low", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-02-19", - "last_updated": "2026-02-19", + "attachment": false, + "open_weights": true, + "release_date": "2024-12-26", + "last_updated": "2024-12-26", "type": "chat" }, { - "id": "gemini-3.1-flash-lite", - "name": "Gemini 3.1 Flash Lite", - "display_name": "Gemini 3.1 Flash Lite", + "id": "deepinfra/deepseek-ai/DeepSeek-V4.1-Flash-1017", + "name": "DeepSeek V4.1 Flash 1017 (Deep Infra)", + "display_name": "DeepSeek V4.1 Flash 1017 (Deep Infra)", "modalities": { "input": [ "text", - "image", - "video", - "audio", - "pdf" + "image" ], "output": [ "text" @@ -106484,7 +104306,7 @@ }, "limit": { "context": 1048576, - "output": 65536 + "output": 384000 }, "temperature": true, "tool_call": true, @@ -106494,66 +104316,64 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ - "minimal", + "none", "low", - "medium", - "high" + "high", + "max" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-05-07", - "last_updated": "2026-05-07", + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-10-17", + "last_updated": "2026-10-17", "type": "chat" }, { - "id": "gemini-nano-banana-2.1", - "name": "Nano Banana 2.1", - "display_name": "Nano Banana 2.1", + "id": "deepinfra/deepseek-ai/DeepSeek-V4-Pro-0813", + "name": "DeepSeek V4 Pro 0813 (Deep Infra)", + "display_name": "DeepSeek V4 Pro 0813 (Deep Infra)", "modalities": { "input": [ - "text", - "image", - "video", - "pdf" + "text" ], "output": [ - "text", - "image" + "text" ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 1048576, + "output": 384000 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ - "minimal", - "medium", - "high" + "none", + "low", + "high", + "max" ] } }, - "attachment": true, - "open_weights": false, - "release_date": "2026-10-06", - "last_updated": "2026-10-06" + "attachment": false, + "open_weights": true, + "release_date": "2026-08-13", + "last_updated": "2026-08-22", + "type": "chat" }, { - "id": "xai/grok-4.3", - "name": "Grok 4.3", - "display_name": "Grok 4.3", + "id": "deepinfra/deepseek-ai/DeepSeek-V4.1-Flash", + "name": "DeepSeek V4.1 Flash (Deep Infra)", + "display_name": "DeepSeek V4.1 Flash (Deep Infra)", "modalities": { "input": [ "text", @@ -106564,8 +104384,8 @@ ] }, "limit": { - "context": 200000, - "output": 30000 + "context": 1048576, + "output": 384000 }, "temperature": true, "tool_call": true, @@ -106575,31 +104395,37 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "effort_options": [ + "none", + "low", + "high", + "max" + ] } }, "attachment": true, - "open_weights": false, - "release_date": "2026-04-17", - "last_updated": "2026-04-17", + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-09-10", + "last_updated": "2026-09-10", "type": "chat" }, { - "id": "xai/grok-4.7", - "name": "Grok 4.7", - "display_name": "Grok 4.7", + "id": "deepinfra/deepseek-ai/DeepSeek-R1", + "name": "DeepSeek-R1 (Deep Infra)", + "display_name": "DeepSeek-R1 (Deep Infra)", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 524288, - "output": 500000 + "context": 163840, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -106609,80 +104435,81 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "low", - "medium", - "high" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-05", - "release_date": "2026-09-21", - "last_updated": "2026-09-21", + "attachment": false, + "open_weights": true, + "knowledge": "2024-07", + "release_date": "2025-01-20", + "last_updated": "2025-05-29", "type": "chat" }, { - "id": "xai/grok-4.1-fast-non-reasoning", - "name": "Grok 4.1 Fast", - "display_name": "Grok 4.1 Fast", + "id": "deepinfra/mistralai/Mistral-Small-24B-Instruct-2501", + "name": "Mistral Small 3 (Deep Infra)", + "display_name": "Mistral Small 3 (Deep Infra)", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 30000 + "context": 32768, + "output": 16384 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, - "attachment": true, - "open_weights": false, - "release_date": "2025-11-19", - "last_updated": "2025-11-19", + "attachment": false, + "open_weights": true, + "knowledge": "2023-10-31", + "release_date": "2025-01-30", + "last_updated": "2025-01-30", "type": "chat" }, { - "id": "xai/grok-4.20-non-reasoning", - "name": "Grok 4.20 (Non-Reasoning)", - "display_name": "Grok 4.20 (Non-Reasoning)", + "id": "deepinfra/mistralai/Mixtral-8x7B-Instruct-v0.1", + "name": "Mixtral 8x7B Instruct v0.1 (Deep Infra)", + "display_name": "Mixtral 8x7B Instruct v0.1 (Deep Infra)", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 2000000, - "output": 30000 + "context": 32768, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": true, - "open_weights": false, - "release_date": "2026-03-09", - "last_updated": "2026-03-09", + "attachment": false, + "open_weights": true, + "release_date": "2023-12-11", + "last_updated": "2023-12-11", "type": "chat" }, { - "id": "xai/grok-4.20-reasoning", - "name": "Grok 4.20 (Reasoning)", - "display_name": "Grok 4.20 (Reasoning)", + "id": "deepinfra/google/gemma-3-12b-it", + "name": "Gemma 3 12B IT (Deep Infra)", + "display_name": "Gemma 3 12B IT (Deep Infra)", "modalities": { "input": [ "text", @@ -106693,25 +104520,25 @@ ] }, "limit": { - "context": 2000000, - "output": 30000 + "context": 131072, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": true, - "open_weights": false, - "release_date": "2026-03-09", - "last_updated": "2026-03-09", + "open_weights": true, + "knowledge": "2024-08", + "release_date": "2025-03-12", + "last_updated": "2025-03-12", "type": "chat" }, { - "id": "xai/grok-4.1-fast-reasoning", - "name": "Grok 4.1 Fast (Reasoning)", - "display_name": "Grok 4.1 Fast (Reasoning)", + "id": "deepinfra/google/gemma-3-4b-it", + "name": "Gemma 3 4B IT (Deep Infra)", + "display_name": "Gemma 3 4B IT (Deep Infra)", "modalities": { "input": [ "text", @@ -106722,25 +104549,25 @@ ] }, "limit": { - "context": 128000, - "output": 30000 + "context": 131072, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": true, - "open_weights": false, - "release_date": "2025-11-19", - "last_updated": "2025-11-19", + "open_weights": true, + "knowledge": "2024-08", + "release_date": "2025-03-12", + "last_updated": "2025-03-12", "type": "chat" }, { - "id": "xai/grok-4.6", - "name": "Grok 4.6", - "display_name": "Grok 4.6", + "id": "deepinfra/google/gemma-3-27b-it", + "name": "Gemma 3 27B IT (Deep Infra)", + "display_name": "Gemma 3 27B IT (Deep Infra)", "modalities": { "input": [ "text", @@ -106751,36 +104578,25 @@ ] }, "limit": { - "context": 524288, - "output": 500000 + "context": 131072, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "low", - "medium", - "high" - ] - } + "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2026-02-01", - "release_date": "2026-08-12", - "last_updated": "2026-08-12", + "open_weights": true, + "knowledge": "2024-08", + "release_date": "2025-03-12", + "last_updated": "2025-03-12", "type": "chat" }, { - "id": "meta/llama-3.3-70b-instruct-maas", - "name": "Llama 3.3 70B Instruct", - "display_name": "Llama 3.3 70B Instruct", + "id": "deepinfra/NousResearch/Hermes-3-Llama-3.1-70B", + "name": "Hermes 3 70B Instruct (Deep Infra)", + "display_name": "Hermes 3 70B Instruct (Deep Infra)", "modalities": { "input": [ "text" @@ -106790,83 +104606,53 @@ ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 131072, + "output": 16384 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, "attachment": false, "open_weights": true, - "knowledge": "2023-12", - "release_date": "2025-04-29", - "last_updated": "2025-04-29", + "knowledge": "2023-12-31", + "release_date": "2024-08-18", + "last_updated": "2024-08-18", "type": "chat" }, { - "id": "meta/llama-4-scout-17b-16e-instruct-maas", - "name": "Llama 4 Scout 17B Instruct", - "display_name": "Llama 4 Scout 17B Instruct", + "id": "deepinfra/NousResearch/Hermes-3-Llama-3.1-405B", + "name": "Hermes 3 405B Instruct (Deep Infra)", + "display_name": "Hermes 3 405B Instruct (Deep Infra)", "modalities": { "input": [ - "text", - "image" - ], - "output": [ "text" - ] - }, - "limit": { - "context": 1310720, - "output": 8192 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": true, - "knowledge": "2024-08", - "release_date": "2025-04-05", - "last_updated": "2025-04-05", - "type": "chat" - }, - { - "id": "meta/llama-4-maverick-17b-128e-instruct-maas", - "name": "Llama 4 Maverick 17B 128E Instruct", - "display_name": "Llama 4 Maverick 17B 128E Instruct", - "modalities": { - "input": [ - "text", - "image" ], "output": [ "text" ] }, "limit": { - "context": 524288, - "output": 8192 + "context": 131072, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2024-08", - "release_date": "2025-04-29", - "last_updated": "2025-04-29", + "knowledge": "2023-12-31", + "release_date": "2024-08-16", + "last_updated": "2024-08-16", "type": "chat" }, { - "id": "google/gemma-4-26b-a4b-it-maas", - "name": "Gemma 4 26B A4B IT", - "display_name": "Gemma 4 26B A4B IT", + "id": "deepinfra/ByteDance/Seed-2.0-mini", + "name": "Seed 2.0 Mini (Deep Infra)", + "display_name": "Seed 2.0 Mini (Deep Infra)", "modalities": { "input": [ "text", @@ -106877,8 +104663,8 @@ ] }, "limit": { - "context": 262144, - "output": 128000 + "context": 256000, + "output": 32000 }, "temperature": true, "tool_call": true, @@ -106888,36 +104674,37 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "none", + "minimal", + "low", + "medium", + "high" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "open_weights": false, + "release_date": "2026-02-14", + "last_updated": "2026-02-14", "type": "chat" }, { - "id": "moonshotai/kimi-k2-thinking-maas", - "name": "Kimi K2 Thinking", - "display_name": "Kimi K2 Thinking", + "id": "deepinfra/ByteDance/Seed-2.0-code", + "name": "Seed 2.0 Code (Deep Infra)", + "display_name": "Seed 2.0 Code (Deep Infra)", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 256000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -106927,26 +104714,24 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "none", + "low", + "medium", + "high" ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-08", - "release_date": "2025-11-13", - "last_updated": "2025-11-13", + "attachment": true, + "open_weights": false, + "release_date": "2026-02-14", + "last_updated": "2026-02-14", "type": "chat" }, { - "id": "openai/gpt-oss-120b-maas", - "name": "GPT OSS 120B", - "display_name": "GPT OSS 120B", + "id": "fireworks_ai/gpt-oss-120b", + "name": "GPT OSS 120B (Fireworks AI)", + "display_name": "GPT OSS 120B (Fireworks AI)", "modalities": { "input": [ "text" @@ -106957,7 +104742,7 @@ }, "limit": { "context": 131072, - "output": 131072 + "output": 32768 }, "temperature": true, "tool_call": true, @@ -106967,6 +104752,7 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ "low", "medium", @@ -106982,20 +104768,21 @@ "type": "chat" }, { - "id": "openai/gpt-oss-20b-maas", - "name": "GPT OSS 20B", - "display_name": "GPT OSS 20B", + "id": "fireworks_ai/accounts/fireworks/models/ember-1", + "name": "Ember-1 (Fireworks AI)", + "display_name": "Ember-1 (Fireworks AI)", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 1048576, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -107006,33 +104793,38 @@ "extra_capabilities": { "reasoning": { "effort_options": [ + "none", "low", - "medium", - "high" + "high", + "max" ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "attachment": true, + "open_weights": false, + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "zai-org/glm-4.7-maas", - "name": "GLM-4.7", - "display_name": "GLM-4.7", + "id": "fireworks_ai/accounts/fireworks/models/muse-spark-open", + "name": "Muse Spark Open (Fireworks AI)", + "display_name": "Muse Spark Open (Fireworks AI)", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "pdf", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 128000 + "context": 1048576, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -107042,26 +104834,25 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "low", + "medium", + "high", + "xhigh" ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2026-01-06", - "last_updated": "2026-01-06", + "knowledge": "2026-01-04", + "release_date": "2026-10-15", + "last_updated": "2026-10-15", "type": "chat" }, { - "id": "zai-org/glm-5.2-maas", - "name": "GLM-5.2", - "display_name": "GLM-5.2", + "id": "fireworks_ai/accounts/fireworks/models/gpt-oss-120b", + "name": "GPT OSS 120B (Fireworks AI)", + "display_name": "GPT OSS 120B (Fireworks AI)", "modalities": { "input": [ "text" @@ -107071,8 +104862,8 @@ ] }, "limit": { - "context": 1000000, - "output": 64000 + "context": 131072, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -107083,35 +104874,36 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "low", + "medium", + "high" ] } }, "attachment": false, "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "zai-org/glm-5-maas", - "name": "GLM-5", - "display_name": "GLM-5", + "id": "fireworks_ai/accounts/fireworks/models/inkling", + "name": "Inkling (Fireworks AI)", + "display_name": "Inkling (Fireworks AI)", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 128000 + "context": 1048576, + "output": 1048576 }, "temperature": true, "tool_call": true, @@ -107121,95 +104913,106 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "none", + "minimal", + "low", + "medium", + "high", + "max" ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-02-12", - "last_updated": "2026-02-12", + "release_date": "2026-07-15", + "last_updated": "2026-07-15", "type": "chat" }, { - "id": "deepseek-ai/deepseek-v3.2-maas", - "name": "DeepSeek V3.2", - "display_name": "DeepSeek V3.2", + "id": "moonshot/kimi-k2.7-code-highspeed", + "name": "Kimi K2.7 Code Highspeed", + "display_name": "Kimi K2.7 Code Highspeed", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 163840, - "output": 65536 + "context": 262144, + "output": 262144 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2025-12-17", - "last_updated": "2026-04-04", + "knowledge": "2025-01", + "release_date": "2026-06-12", + "last_updated": "2026-06-12", "type": "chat" }, { - "id": "deepseek-ai/deepseek-v3.1-maas", - "name": "DeepSeek V3.1", - "display_name": "DeepSeek V3.1", + "id": "moonshot/kimi-k3.1-pro", + "name": "Kimi K3.1 Pro", + "display_name": "Kimi K3.1 Pro", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 163840, - "output": 32768 + "context": 1048576, + "output": 131072 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": false, - "open_weights": true, - "release_date": "2025-08-28", - "last_updated": "2025-08-28", + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "high", + "max" + ] + } + }, + "attachment": true, + "open_weights": false, + "release_date": "2026-10-23", + "last_updated": "2026-10-23", "type": "chat" }, { - "id": "qwen/qwen3-235b-a22b-instruct-2507-maas", - "name": "Qwen3 235B A22B Instruct", - "display_name": "Qwen3 235B A22B Instruct", + "id": "moonshot/kimi-k2.7-code", + "name": "Kimi K2.7 Code", + "display_name": "Kimi K2.7 Code", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" @@ -107217,43 +105020,43 @@ }, "limit": { "context": 262144, - "output": 16384 + "output": 262144 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": true, "open_weights": true, - "release_date": "2025-08-13", - "last_updated": "2025-08-13", + "knowledge": "2025-01", + "release_date": "2026-06-12", + "last_updated": "2026-06-12", "type": "chat" - } - ] - }, - "greenpt": { - "id": "greenpt", - "name": "GreenPT", - "display_name": "GreenPT", - "api": "https://api.greenpt.ai/v1", - "doc": "https://docs.greenpt.ai", - "models": [ + }, { - "id": "glm-5.1", - "name": "GLM-5.1", - "display_name": "GLM-5.1", + "id": "moonshot/kimi-k2.6", + "name": "Kimi K2.6", + "display_name": "Kimi K2.6", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 131072 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, @@ -107266,44 +105069,57 @@ "supported": true } }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-04-07", - "last_updated": "2026-04-07", + "knowledge": "2025-01", + "release_date": "2026-04-20", + "last_updated": "2026-04-20", "type": "chat" }, { - "id": "llama-3.3-70b-instruct", - "name": "Llama-3.3-70B-Instruct", - "display_name": "Llama-3.3-70B-Instruct", + "id": "moonshot/kimi-k3", + "name": "Kimi K3", + "display_name": "Kimi K3", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 100000, - "output": 16384 + "context": 1048576, + "output": 131072 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "low", + "high", + "max" + ] + } + }, + "attachment": true, "open_weights": true, - "knowledge": "2023-12", - "release_date": "2024-12-06", - "last_updated": "2024-12-06", + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" }, { - "id": "glm-5.2-caveman-lite", - "name": "GLM-5.2 Caveman Lite", - "display_name": "GLM-5.2 Caveman Lite", + "id": "greenpt/deepseek-v4-flash-0731", + "name": "DeepSeek V4 Flash 0731 (Greenpt)", + "display_name": "DeepSeek V4 Flash 0731 (Greenpt)", "modalities": { "input": [ "text" @@ -107314,7 +105130,7 @@ }, "limit": { "context": 1000000, - "output": 131072 + "output": 384000 }, "temperature": true, "tool_call": true, @@ -107324,25 +105140,26 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ "none", - "minimal", "low", - "medium", - "high" + "high", + "max" ] } }, "attachment": false, "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "knowledge": "2025-05", + "release_date": "2026-07-31", + "last_updated": "2026-07-31", "type": "chat" }, { - "id": "gemma-3-27b-it", - "name": "Gemma 3 27B", - "display_name": "Gemma 3 27B", + "id": "greenpt/deepseek-v4.1-flash", + "name": "DeepSeek V4.1 Flash (Greenpt)", + "display_name": "DeepSeek V4.1 Flash (Greenpt)", "modalities": { "input": [ "text", @@ -107353,58 +105170,79 @@ ] }, "limit": { - "context": 40000, - "output": 8192 + "context": 1000000, + "output": 384000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "none", + "low", + "high", + "max" + ] + } }, "attachment": true, "open_weights": true, - "knowledge": "2024-08", - "release_date": "2025-03-12", - "last_updated": "2025-03-12", + "knowledge": "2025-05", + "release_date": "2026-09-10", + "last_updated": "2026-09-10", "type": "chat" }, { - "id": "voxtral-small-24b-2507", - "name": "Voxtral Small 24B", - "display_name": "Voxtral Small 24B", + "id": "greenpt/gpt-oss-120b", + "name": "GPT OSS 120B (Greenpt)", + "display_name": "GPT OSS 120B (Greenpt)", "modalities": { "input": [ - "text", - "audio" + "text" ], "output": [ "text" ] }, "limit": { - "context": 32768, - "output": 16384 + "context": 128000, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "low", + "medium", + "high" + ] + } + }, + "attachment": false, "open_weights": true, - "knowledge": "2025-07", - "release_date": "2025-07-15", - "last_updated": "2025-07-15", + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "mistral-small-3.2-24b-instruct-2506", - "name": "Mistral Small 3.2", - "display_name": "Mistral Small 3.2", + "id": "greenpt/llama-3.3-70b-instruct", + "name": "Llama-3.3-70B-Instruct (Greenpt)", + "display_name": "Llama-3.3-70B-Instruct (Greenpt)", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" @@ -107412,24 +105250,24 @@ }, "limit": { "context": 128000, - "output": 32768 + "output": 4096 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2025-03", - "release_date": "2025-06-20", - "last_updated": "2025-06-20", + "knowledge": "2023-12", + "release_date": "2024-12-06", + "last_updated": "2024-12-06", "type": "chat" }, { - "id": "qwen3-coder-30b-a3b-instruct", - "name": "Qwen3-Coder 30B-A3B Instruct", - "display_name": "Qwen3-Coder 30B-A3B Instruct", + "id": "greenpt/qwen3-235b-a22b-instruct-2507", + "name": "Qwen3 235B-A22B Instruct 2507 (Greenpt)", + "display_name": "Qwen3 235B-A22B Instruct 2507 (Greenpt)", "modalities": { "input": [ "text" @@ -107439,8 +105277,8 @@ ] }, "limit": { - "context": 128000, - "output": 32768 + "context": 250000, + "output": 16384 }, "temperature": true, "tool_call": true, @@ -107449,15 +105287,14 @@ }, "attachment": false, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-07-31", - "last_updated": "2025-07-31", + "release_date": "2025-07-21", + "last_updated": "2025-07-21", "type": "chat" }, { - "id": "qwen3.5-397b-a17b", - "name": "Qwen3.5 397B-A17B", - "display_name": "Qwen3.5 397B-A17B", + "id": "nebius/openai/gpt-oss-120b", + "name": "GPT OSS 120B (Nebius)", + "display_name": "GPT OSS 120B (Nebius)", "modalities": { "input": [ "text" @@ -107467,8 +105304,8 @@ ] }, "limit": { - "context": 262144, - "output": 16384 + "context": 131072, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -107479,15 +105316,7 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ - "none", - "minimal", "low", "medium", "high" @@ -107496,26 +105325,26 @@ }, "attachment": false, "open_weights": true, - "release_date": "2026-02-15", - "last_updated": "2026-02-15", + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "qwen3.6-35b-a3b", - "name": "Qwen3.6 35B-A3B", - "display_name": "Qwen3.6 35B-A3B", + "id": "nebius/nvidia/Nemotron-3-Ultra-550b-a55b", + "name": "Nemotron 3 Ultra 550B A55B (Nebius)", + "display_name": "Nemotron 3 Ultra 550B A55B (Nebius)", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 1048576, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -107526,31 +105355,24 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ "none", - "minimal", - "low", "medium", "high" ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-04-17", - "last_updated": "2026-04-17", + "knowledge": "2025-09", + "release_date": "2026-06-04", + "last_updated": "2026-06-04", "type": "chat" }, { - "id": "glm-5.2-honey-lite", - "name": "GLM-5.2 Honey Lite", - "display_name": "GLM-5.2 Honey Lite", + "id": "nebius/nvidia/nemotron-3-super-120b-a12b", + "name": "Nemotron 3 Super 120B A12B (Nebius)", + "display_name": "Nemotron 3 Super 120B A12B (Nebius)", "modalities": { "input": [ "text" @@ -107560,8 +105382,8 @@ ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, @@ -107573,23 +105395,22 @@ "reasoning": { "effort_options": [ "none", - "minimal", "low", - "medium", - "high" + "medium" ] } }, "attachment": false, "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "knowledge": "2025-06", + "release_date": "2026-03-11", + "last_updated": "2026-03-11", "type": "chat" }, { - "id": "green-l", - "name": "Green L", - "display_name": "Green L", + "id": "nebius/meta-models/muse-spark-open", + "name": "Muse Spark Open (Nebius)", + "display_name": "Muse Spark Open (Nebius)", "modalities": { "input": [ "text", @@ -107600,25 +105421,36 @@ ] }, "limit": { - "context": 128000, - "output": 32768 + "context": 1048576, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "high", + "xhigh" + ] + } }, "attachment": true, "open_weights": true, - "knowledge": "2025-03", - "release_date": "2025-06-20", - "last_updated": "2025-06-20", + "knowledge": "2026-01-04", + "release_date": "2026-10-15", + "last_updated": "2026-10-15", "type": "chat" }, { - "id": "minimax-m2.5", - "name": "MiniMax-M2.5", - "display_name": "MiniMax-M2.5", + "id": "nebius/Qwen/Qwen3-235B-A22B-Instruct-2507", + "name": "Qwen3 235B-A22B Instruct 2507 (Nebius)", + "display_name": "Qwen3 235B-A22B Instruct 2507 (Nebius)", "modalities": { "input": [ "text" @@ -107628,37 +105460,24 @@ ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 262144, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "none", - "minimal", - "low", - "medium", - "high" - ] - } + "supported": false }, "attachment": false, "open_weights": true, - "release_date": "2026-02-12", - "last_updated": "2026-02-12", + "release_date": "2025-07-21", + "last_updated": "2025-07-21", "type": "chat" }, { - "id": "devstral-2-123b-instruct-2512", - "name": "Devstral 2", - "display_name": "Devstral 2", + "id": "nebius/Qwen/Qwen3-30B-A3B-Instruct-2507", + "name": "Qwen3 30B-A3B Instruct 2507 (Nebius)", + "display_name": "Qwen3 30B-A3B Instruct 2507 (Nebius)", "modalities": { "input": [ "text" @@ -107668,7 +105487,7 @@ ] }, "limit": { - "context": 200000, + "context": 262144, "output": 16384 }, "temperature": true, @@ -107678,15 +105497,14 @@ }, "attachment": false, "open_weights": true, - "knowledge": "2025-12", - "release_date": "2025-12-09", - "last_updated": "2025-12-09", + "release_date": "2025-07-28", + "last_updated": "2025-07-28", "type": "chat" }, { - "id": "kimi-k2.7-code", - "name": "Kimi K2.7 Code", - "display_name": "Kimi K2.7 Code", + "id": "nebius/deepseek-ai/DeepSeek-V4-Flash-0731", + "name": "DeepSeek V4 Flash 0731 (Nebius)", + "display_name": "DeepSeek V4 Flash 0731 (Nebius)", "modalities": { "input": [ "text" @@ -107696,10 +105514,10 @@ ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1024000, + "output": 384000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -107710,35 +105528,35 @@ "supported": true, "effort_options": [ "none", - "minimal", "low", - "medium", - "high" + "high", + "max" ] } }, "attachment": false, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-06-12", - "last_updated": "2026-06-12", + "knowledge": "2025-05", + "release_date": "2026-07-31", + "last_updated": "2026-07-31", "type": "chat" }, { - "id": "glm-5.2-ponytail", - "name": "GLM-5.2 Ponytail", - "display_name": "GLM-5.2 Ponytail", + "id": "nebius/deepseek-ai/DeepSeek-V4.1-Flash-1017", + "name": "DeepSeek V4.1 Flash 1017 (Nebius)", + "display_name": "DeepSeek V4.1 Flash 1017 (Nebius)", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 1048576, + "output": 384000 }, "temperature": true, "tool_call": true, @@ -107750,61 +105568,34 @@ "reasoning": { "effort_options": [ "none", - "minimal", "low", - "medium", - "high" + "high", + "max" ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "knowledge": "2025-05", + "release_date": "2026-10-17", + "last_updated": "2026-10-17", "type": "chat" }, { - "id": "green-s-pro", - "name": "Green S Pro", - "display_name": "Green S Pro", + "id": "nebius/deepseek-ai/DeepSeek-V4-Pro-0813", + "name": "DeepSeek V4 Pro 0813 (Nebius)", + "display_name": "DeepSeek V4 Pro 0813 (Nebius)", "modalities": { "input": [ - "audio" - ], - "output": [ "text" - ] - }, - "limit": { - "context": 8192, - "output": 8192 - }, - "temperature": false, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": false, - "release_date": "2025-02", - "last_updated": "2025-02" - }, - { - "id": "kimi-k2.6-fast", - "name": "Kimi K2.6 Fast", - "display_name": "Kimi K2.6 Fast", - "modalities": { - "input": [ - "text", - "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 979000, + "output": 384000 }, "temperature": true, "tool_call": true, @@ -107812,17 +105603,27 @@ "supported": true, "default": true }, - "attachment": true, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "none", + "low", + "high", + "max" + ] + } + }, + "attachment": false, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-20", - "last_updated": "2026-04-20", + "release_date": "2026-08-13", + "last_updated": "2026-08-22", "type": "chat" }, { - "id": "holo2-30b-a3b", - "name": "Holo2 30B A3B", - "display_name": "Holo2 30B A3B", + "id": "nebius/deepseek-ai/DeepSeek-V4.1-Flash", + "name": "DeepSeek V4.1 Flash (Nebius)", + "display_name": "DeepSeek V4.1 Flash (Nebius)", "modalities": { "input": [ "text", @@ -107833,8 +105634,8 @@ ] }, "limit": { - "context": 22016, - "output": 16384 + "context": 1048000, + "output": 384000 }, "temperature": true, "tool_call": true, @@ -107844,23 +105645,26 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ + "none", "low", - "medium", - "high" + "high", + "max" ] } }, "attachment": true, "open_weights": true, - "release_date": "2025-11", - "last_updated": "2025-11", + "knowledge": "2025-05", + "release_date": "2026-09-10", + "last_updated": "2026-09-10", "type": "chat" }, { - "id": "glm-5.2-ponytail-ultra", - "name": "GLM-5.2 Ponytail Ultra", - "display_name": "GLM-5.2 Ponytail Ultra", + "id": "nebius/google/gemma-3-27b-it", + "name": "Gemma 3 27B IT (Nebius)", + "display_name": "Gemma 3 27B IT (Nebius)", "modalities": { "input": [ "text" @@ -107870,47 +105674,40 @@ ] }, "limit": { - "context": 1000000, + "context": 110000, "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "minimal", - "low", - "medium", - "high" - ] - } + "supported": false }, "attachment": false, "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "knowledge": "2024-08", + "release_date": "2025-03-12", + "last_updated": "2025-03-12", "type": "chat" }, { - "id": "glm-5.2-caveman-ultra", - "name": "GLM-5.2 Caveman Ultra", - "display_name": "GLM-5.2 Caveman Ultra", + "id": "vertex/gemini-3.1-pro-preview", + "name": "Gemini 3.1 Pro Preview (Vertex AI)", + "display_name": "Gemini 3.1 Pro Preview (Vertex AI)", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -107920,37 +105717,47 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "none", - "minimal", + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ "low", - "medium", "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "attachment": true, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2026-02-19", + "last_updated": "2026-02-19", "type": "chat" }, { - "id": "green-r", - "name": "Green R", - "display_name": "Green R", + "id": "vertex/gemini-3-flash-preview", + "name": "Gemini 3 Flash Preview (Vertex AI)", + "display_name": "Gemini 3 Flash Preview (Vertex AI)", "modalities": { "input": [ "text", - "image" + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -107960,64 +105767,93 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", "low", "medium", "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2025-12-17", + "last_updated": "2025-12-17", "type": "chat" }, { - "id": "green-l-raw", - "name": "Green L Raw", - "display_name": "Green L Raw", + "id": "vertex/gemini-3.5-flash-lite", + "name": "Gemini 3.5 Flash Lite (Vertex AI)", + "display_name": "Gemini 3.5 Flash Lite (Vertex AI)", "modalities": { "input": [ "text", - "image" + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 32768 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "minimal", + "low", + "medium", + "high" + ] + } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-03", - "release_date": "2025-06-20", - "last_updated": "2025-06-20", + "open_weights": false, + "knowledge": "2026-03", + "release_date": "2026-07-21", + "last_updated": "2026-07-21", "type": "chat" }, { - "id": "glm-5.3", - "name": "GLM-5.3", - "display_name": "GLM-5.3", + "id": "vertex/gemini-flash-latest", + "name": "Gemini Flash Latest (Gemini 3.8 Flash, Vertex AI)", + "display_name": "Gemini Flash Latest (Gemini 3.8 Flash, Vertex AI)", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -108027,39 +105863,40 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ - "none", - "minimal", "low", "medium", "high" ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "attachment": true, + "open_weights": false, + "release_date": "2026-09-02", + "last_updated": "2026-09-02", "type": "chat" }, { - "id": "deepseek-v4-flash-0731", - "name": "DeepSeek V4 Flash 0731", - "display_name": "DeepSeek V4 Flash 0731", + "id": "vertex/gemini-pro-latest", + "name": "Gemini Pro Latest (Gemini 4 Argon, Vertex AI)", + "display_name": "Gemini Pro Latest (Gemini 4 Argon, Vertex AI)", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 1048576, + "output": 65536 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -108067,65 +105904,39 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ - "none", - "minimal", "low", "medium", "high" ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-07-31", - "last_updated": "2026-07-31", - "type": "chat" - }, - { - "id": "green-s", - "name": "Green S", - "display_name": "Green S", - "modalities": { - "input": [ - "audio" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 8192, - "output": 8192 - }, - "temperature": false, - "tool_call": false, - "reasoning": { - "supported": false - }, "attachment": true, "open_weights": false, - "release_date": "2025-01", - "last_updated": "2025-01" + "knowledge": "2026-03", + "release_date": "2026-10-13", + "last_updated": "2026-10-13", + "type": "chat" }, { - "id": "kimi-k2.6", - "name": "Kimi K2.6", - "display_name": "Kimi K2.6", + "id": "vertex/gemini-3.1-flash-lite", + "name": "Gemini 3.1 Flash Lite (Vertex AI)", + "display_name": "Gemini 3.1 Flash Lite (Vertex AI)", "modalities": { "input": [ "text", - "image" + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -108137,7 +105948,6 @@ "reasoning": { "supported": true, "effort_options": [ - "none", "minimal", "low", "medium", @@ -108146,31 +105956,32 @@ } }, "attachment": true, - "open_weights": true, + "open_weights": false, "knowledge": "2025-01", - "release_date": "2026-04-20", - "last_updated": "2026-04-20", + "release_date": "2026-05-07", + "last_updated": "2026-05-07", "type": "chat" }, { - "id": "kimi-k3", - "name": "Kimi K3", - "display_name": "Kimi K3", + "id": "vertex/gemini-3.1-flash-image", + "name": "Nano Banana 2 (Vertex AI)", + "display_name": "Nano Banana 2 (Vertex AI)", "modalities": { "input": [ - "text", - "image" + "image", + "text" ], "output": [ - "text" + "text", + "image" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 131072, + "output": 32768 }, - "temperature": false, - "tool_call": true, + "temperature": true, + "tool_call": false, "reasoning": { "supported": true, "default": true @@ -108179,118 +105990,122 @@ "reasoning": { "supported": true, "effort_options": [ - "none", "minimal", - "low", - "medium", "high" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-16", - "type": "chat" + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2026-05-28", + "last_updated": "2026-05-28" }, { - "id": "gemma4", - "name": "gemma4", - "display_name": "gemma4", + "id": "vertex/gemini-3-pro-image", + "name": "Nano Banana Pro (Vertex AI)", + "display_name": "Nano Banana Pro (Vertex AI)", "modalities": { "input": [ "text", "image" ], "output": [ - "text" + "text", + "image" ] }, "limit": { - "context": 262144, + "context": 65536, "output": 32768 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "none", - "minimal", + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ "low", - "medium", "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-04-02", - "last_updated": "2026-04-02", - "type": "chat" + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2026-05-28", + "last_updated": "2026-05-28" }, { - "id": "gpt-oss-120b", - "name": "GPT OSS 120B", - "display_name": "GPT OSS 120B", + "id": "vertex/gemini-nano-banana-2.1", + "name": "Nano Banana 2.1 (Vertex AI)", + "display_name": "Nano Banana 2.1 (Vertex AI)", "modalities": { "input": [ "text", "image" ], "output": [ - "text" + "text", + "image" ] }, "limit": { "context": 131072, "output": 32768 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ - "low", + "minimal", "medium", "high" ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", - "type": "chat" + "open_weights": false, + "release_date": "2026-10-06", + "last_updated": "2026-10-06" }, { - "id": "glm-5.2", - "name": "GLM-5.2", - "display_name": "GLM-5.2", + "id": "vertex/gemini-3.1-flash-lite-image", + "name": "Nano Banana 2 Lite (Vertex AI)", + "display_name": "Nano Banana 2 Lite (Vertex AI)", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ - "text" + "text", + "image" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 65536, + "output": 4096 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true @@ -108299,38 +106114,67 @@ "reasoning": { "supported": true, "effort_options": [ - "none", "minimal", - "low", - "medium", "high" ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", - "type": "chat" + "attachment": true, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2026-06-30", + "last_updated": "2026-06-30" }, { - "id": "deepseek-v4.1-flash", - "name": "DeepSeek V4.1 Flash", - "display_name": "DeepSeek V4.1 Flash", + "id": "vertex/gemini-2.5-flash-image", + "name": "Nano Banana (Vertex AI)", + "display_name": "Nano Banana (Vertex AI)", "modalities": { "input": [ "text", "image" ], "output": [ - "text" + "text", + "image" ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 32768, + "output": 32768 }, "temperature": true, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": false, + "knowledge": "2024-06", + "release_date": "2025-08-26", + "last_updated": "2025-08-26" + }, + { + "id": "vertex/gemini-4-argon", + "name": "Gemini 4 Argon (Vertex AI)", + "display_name": "Gemini 4 Argon (Vertex AI)", + "modalities": { + "input": [ + "text", + "image", + "video", + "audio", + "pdf" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1048576, + "output": 65536 + }, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -108338,10 +106182,7 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ - "none", - "minimal", "low", "medium", "high" @@ -108349,27 +106190,31 @@ } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-09-10", - "last_updated": "2026-09-10", + "open_weights": false, + "knowledge": "2026-03", + "release_date": "2026-10-13", + "last_updated": "2026-10-13", "type": "chat" }, { - "id": "glm-5.2-ponytail-lite", - "name": "GLM-5.2 Ponytail Lite", - "display_name": "GLM-5.2 Ponytail Lite", + "id": "vertex/gemini-3.7-flash", + "name": "Gemini 3.7 Flash (Vertex AI)", + "display_name": "Gemini 3.7 Flash (Vertex AI)", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -108379,36 +106224,49 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "none", + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ "minimal", "low", "medium", "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "attachment": true, + "open_weights": false, + "knowledge": "2026-03", + "release_date": "2026-08-13", + "last_updated": "2026-08-13", "type": "chat" }, { - "id": "glm-5.3-flash", - "name": "GLM-5.3-Flash", - "display_name": "GLM-5.3-Flash", + "id": "vertex/gemini-3.5-flash", + "name": "Gemini 3.5 Flash (Vertex AI)", + "display_name": "Gemini 3.5 Flash (Vertex AI)", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -108419,37 +106277,48 @@ "extra_capabilities": { "reasoning": { "supported": true, - "effort_options": [ - "none", + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ "minimal", "low", "medium", "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", + "attachment": true, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2026-05-19", + "last_updated": "2026-05-19", "type": "chat" }, { - "id": "mistral-medium-3.5-128b", - "name": "Mistral Medium 3.5", - "display_name": "Mistral Medium 3.5", + "id": "vertex/gemini-3.8-flash", + "name": "Gemini 3.8 Flash (Vertex AI)", + "display_name": "Gemini 3.8 Flash (Vertex AI)", "modalities": { "input": [ "text", - "image" + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 16384 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -108459,33 +106328,48 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "none", + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", + "low", + "medium", "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-04-29", - "last_updated": "2026-04-29", + "open_weights": false, + "release_date": "2026-09-02", + "last_updated": "2026-09-02", "type": "chat" }, { - "id": "glm-5.2-honey-ultra", - "name": "GLM-5.2 Honey Ultra", - "display_name": "GLM-5.2 Honey Ultra", + "id": "vertex/gemini-3.6-flash", + "name": "Gemini 3.6 Flash (Vertex AI)", + "display_name": "Gemini 3.6 Flash (Vertex AI)", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -108495,25 +106379,34 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "none", + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ "minimal", "low", "medium", "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "attachment": true, + "open_weights": false, + "knowledge": "2026-03", + "release_date": "2026-07-21", + "last_updated": "2026-07-21", "type": "chat" }, { - "id": "glm-5.2-honey", - "name": "GLM-5.2 Honey", - "display_name": "GLM-5.2 Honey", + "id": "scaleway/deepseek-v4-flash-0731", + "name": "DeepSeek V4 Flash 0731 (Scaleway)", + "display_name": "DeepSeek V4 Flash 0731 (Scaleway)", "modalities": { "input": [ "text" @@ -108523,8 +106416,8 @@ ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 256000, + "output": 384000 }, "temperature": true, "tool_call": true, @@ -108534,57 +106427,70 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ "none", - "minimal", "low", - "medium", - "high" + "high", + "max" ] } }, "attachment": false, "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "knowledge": "2025-05", + "release_date": "2026-07-31", + "last_updated": "2026-07-31", "type": "chat" }, { - "id": "qwen3-235b-a22b-instruct-2507", - "name": "Qwen3 235B A22B Instruct 2507", - "display_name": "Qwen3 235B A22B Instruct 2507", + "id": "scaleway/deepseek-v4.1-flash", + "name": "DeepSeek V4.1 Flash (Scaleway)", + "display_name": "DeepSeek V4.1 Flash (Scaleway)", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 16384 + "context": 256000, + "output": 384000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "none", + "low", + "high", + "max" + ] + } + }, + "attachment": true, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-07-21", - "last_updated": "2025-07-21", + "knowledge": "2025-05", + "release_date": "2026-09-10", + "last_updated": "2026-09-10", "type": "chat" }, { - "id": "pixtral-12b-2409", - "name": "Pixtral 12B", - "display_name": "Pixtral 12B", + "id": "scaleway/qwen3-coder-30b-a3b-instruct", + "name": "Qwen3-Coder 30B-A3B Instruct (Scaleway)", + "display_name": "Qwen3-Coder 30B-A3B Instruct (Scaleway)", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" @@ -108592,24 +106498,24 @@ }, "limit": { "context": 128000, - "output": 4096 + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2024-09", - "release_date": "2024-09-11", - "last_updated": "2024-09-11", + "knowledge": "2025-04", + "release_date": "2025-07-31", + "last_updated": "2025-07-31", "type": "chat" }, { - "id": "glm-5.2-caveman", - "name": "GLM-5.2 Caveman", - "display_name": "GLM-5.2 Caveman", + "id": "scaleway/gpt-oss-120b", + "name": "GPT OSS 120B (Scaleway)", + "display_name": "GPT OSS 120B (Scaleway)", "modalities": { "input": [ "text" @@ -108619,8 +106525,8 @@ ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 128000, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -108630,9 +106536,8 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ - "none", - "minimal", "low", "medium", "high" @@ -108641,280 +106546,190 @@ }, "attachment": false, "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "green-r-raw", - "name": "Green R Raw", - "display_name": "Green R Raw", + "id": "scaleway/llama-3.3-70b-instruct", + "name": "Llama-3.3-70B-Instruct (Scaleway)", + "display_name": "Llama-3.3-70B-Instruct (Scaleway)", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 128000, + "output": 4096 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high" - ] - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "knowledge": "2023-12", + "release_date": "2024-12-06", + "last_updated": "2024-12-06", "type": "chat" - } - ] - }, - "commandcode": { - "id": "commandcode", - "name": "CommandCode", - "display_name": "CommandCode", - "api": "https://api.commandcode.ai/provider/v1", - "doc": "https://commandcode.ai/docs/provider", - "models": [ + }, { - "id": "claude-haiku-5-5", - "name": "Claude Haiku 5.5", - "display_name": "Claude Haiku 5.5", + "id": "scaleway/qwen3-235b-a22b-instruct-2507", + "name": "Qwen3 235B-A22B Instruct 2507 (Scaleway)", + "display_name": "Qwen3 235B-A22B Instruct 2507 (Scaleway)", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 250000, + "output": 16384 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ] - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-10-07", - "last_updated": "2026-10-07", + "attachment": false, + "open_weights": true, + "release_date": "2025-07-21", + "last_updated": "2025-07-21", "type": "chat" }, { - "id": "claude-haiku-4-5-20251001", - "name": "Claude Haiku 4.5", - "display_name": "Claude Haiku 4.5", + "id": "scaleway/gemma-3-27b-it", + "name": "Gemma 3 27B IT (Scaleway)", + "display_name": "Gemma 3 27B IT (Scaleway)", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 40000, + "output": 131072 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." - ] - } + "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2025-02-28", - "release_date": "2025-10-15", - "last_updated": "2025-10-15", + "open_weights": true, + "knowledge": "2024-08", + "release_date": "2025-03-12", + "last_updated": "2025-03-12", "type": "chat" }, { - "id": "gpt-5.4-mini", - "name": "GPT-5.4 mini", - "display_name": "GPT-5.4 mini", + "id": "greenference/gpt-oss-20b", + "name": "GPT OSS 20B (Greenference)", + "display_name": "GPT OSS 20B (Greenference)", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 131072, + "output": 32768 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ "low", "medium", "high" - ], - "visibility": "hidden" + ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-17", - "last_updated": "2026-03-17", + "attachment": false, + "open_weights": true, + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "claude-opus-4-7", - "name": "Claude Opus 4.7", - "display_name": "Claude Opus 4.7", + "id": "mistral/mistral-small-2603", + "name": "Mistral Small 4", + "display_name": "Mistral Small 4", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 262144, + "output": 256000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "high", "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." + "none", + "high" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-04-16", - "last_updated": "2026-04-16", + "open_weights": true, + "knowledge": "2025-06", + "release_date": "2026-03-16", + "last_updated": "2026-03-16", "type": "chat" }, { - "id": "gpt-5.6-sol", - "name": "GPT-5.6 Sol", - "display_name": "GPT-5.6 Sol", + "id": "mistral/mistral-medium-2604", + "name": "Mistral Medium 3.5", + "display_name": "Mistral Medium 3.5", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 262144, + "output": 262144 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -108922,138 +106737,82 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", "effort_options": [ "none", - "low", - "medium", - "high", - "xhigh", - "max" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", "high" - ], - "visibility": "hidden" + ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "open_weights": true, + "release_date": "2026-04-29", + "last_updated": "2026-04-29", "type": "chat" }, { - "id": "claude-sonnet-5-5", - "name": "Claude Sonnet 5.5", - "display_name": "Claude Sonnet 5.5", + "id": "mistral/mistral-medium-2505", + "name": "Mistral Medium 3", + "display_name": "Mistral Medium 3", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 131072, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ] - } + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-09-28", - "last_updated": "2026-09-28", + "knowledge": "2025-05", + "release_date": "2025-05-07", + "last_updated": "2025-05-07", "type": "chat" }, { - "id": "gpt-5.6-luna", - "name": "GPT-5.6 Luna", - "display_name": "GPT-5.6 Luna", + "id": "mistral/devstral-medium-latest", + "name": "Devstral 2 (latest)", + "display_name": "Devstral 2 (latest)", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 262144, + "output": 262144 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "attachment": false, + "open_weights": true, + "knowledge": "2025-12", + "release_date": "2025-12-02", + "last_updated": "2025-12-02", "type": "chat" }, { - "id": "claude-fable-5-1", - "name": "Claude Fable 5.1", - "display_name": "Claude Fable 5.1", + "id": "mistral/mistral-large-2407", + "name": "Mistral Large 2407", + "display_name": "Mistral Large 2407", "modalities": { "input": [ "text", - "image", "pdf" ], "output": [ @@ -109061,52 +106820,25 @@ ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 131072, + "output": 104857 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", - "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", - "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." - ] - } + "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-09-01", - "last_updated": "2026-09-01", + "open_weights": true, + "knowledge": "2024-03-31", + "release_date": "2024-07-24", + "last_updated": "2024-07-24", "type": "chat" }, { - "id": "claude-sonnet-5", - "name": "Claude Sonnet 5", - "display_name": "Claude Sonnet 5", + "id": "mistral/mistral-large-2512", + "name": "Mistral Large 3", + "display_name": "Mistral Large 3", "modalities": { "input": [ "text", @@ -109118,53 +106850,39 @@ ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 262144, + "output": 262144 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ] - } + "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-30", - "last_updated": "2026-06-30", + "open_weights": true, + "knowledge": "2024-11", + "release_date": "2025-12-02", + "last_updated": "2025-12-02", "type": "chat" }, { - "id": "gpt-5.6-terra", - "name": "GPT-5.6 Terra", - "display_name": "GPT-5.6 Terra", + "id": "mistral/magistral-medium-latest", + "name": "Magistral Medium (latest)", + "display_name": "Magistral Medium (latest)", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 262144, + "output": 16384 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -109172,80 +106890,51 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", "effort_options": [ "none", - "low", - "medium", - "high", - "xhigh", - "max" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", "high" - ], - "visibility": "hidden" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "knowledge": "2025-06", + "release_date": "2025-03-17", + "last_updated": "2025-03-20", "type": "chat" }, { - "id": "claude-opus-5-5", - "name": "Claude Opus 5.5", - "display_name": "Claude Opus 5.5", + "id": "mistral/ministral-3b-2512", + "name": "Ministral 3 3B 2512", + "display_name": "Ministral 3 3B 2512", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 131072, + "output": 104857 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ] - } + "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "open_weights": true, + "release_date": "2025-12-02", + "last_updated": "2025-12-02", "type": "chat" }, { - "id": "gpt-6-sol", - "name": "GPT-6 Sol", - "display_name": "GPT-6 Sol", + "id": "mistral/mistral-medium-3", + "name": "Mistral Medium 3", + "display_name": "Mistral Medium 3", "modalities": { "input": [ "text", @@ -109257,89 +106946,81 @@ ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 262144, + "output": 104857 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ] - } + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2026-04-20", - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "knowledge": "2025-03-31", + "release_date": "2025-05-07", + "last_updated": "2025-05-07", "type": "chat" }, { - "id": "gpt-5.3-codex", - "name": "GPT-5.3 Codex", - "display_name": "GPT-5.3 Codex", + "id": "mistral/ministral-14b-2512", + "name": "Ministral 3 14B 2512", + "display_name": "Ministral 3 14B 2512", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 262144, + "output": 209715 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-05", - "last_updated": "2026-02-05", + "open_weights": true, + "release_date": "2025-12-02", + "last_updated": "2025-12-02", "type": "chat" }, { - "id": "gpt-6.1-sol", - "name": "GPT-6.1 Sol", - "display_name": "GPT-6.1 Sol", + "id": "mistral/codestral-latest", + "name": "Codestral (latest)", + "display_name": "Codestral (latest)", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 256000, + "output": 4096 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "knowledge": "2024-10", + "release_date": "2024-05-29", + "last_updated": "2025-01-04", + "type": "chat" + }, + { + "id": "mistral/mistral-large-latest", + "name": "Mistral Large (latest)", + "display_name": "Mistral Large (latest)", "modalities": { "input": [ "text", @@ -109351,105 +107032,67 @@ ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 262144, + "output": 262144 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ] - } + "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2026-04-30", - "release_date": "2026-09-29", - "last_updated": "2026-09-29", + "open_weights": true, + "knowledge": "2024-11", + "release_date": "2024-11-01", + "last_updated": "2025-12-02", "type": "chat" }, { - "id": "gpt-5.4", - "name": "GPT-5.4", - "display_name": "GPT-5.4", + "id": "mistral/voxtral-small-latest", + "name": "Voxtral Small (latest)", + "display_name": "Voxtral Small (latest)", "modalities": { "input": [ "text", - "image", - "pdf" + "audio" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 32768, + "output": 32000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-05", - "last_updated": "2026-03-05", + "open_weights": true, + "release_date": "2025-07-15", + "last_updated": "2025-07-15", "type": "chat" }, { - "id": "claude-opus-5", - "name": "Claude Opus 5", - "display_name": "Claude Opus 5", + "id": "mistral/mistral-medium-latest", + "name": "Mistral Medium (latest)", + "display_name": "Mistral Medium (latest)", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 262144, + "output": 262144 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -109457,90 +107100,63 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" + "none", + "high" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-05", - "release_date": "2026-07-24", - "last_updated": "2026-07-24", + "open_weights": true, + "release_date": "2026-04-29", + "last_updated": "2026-04-29", "type": "chat" }, { - "id": "claude-sonnet-4-6", - "name": "Claude Sonnet 4.6", - "display_name": "Claude Sonnet 4.6", + "id": "mistral/mistral-small-latest", + "name": "Mistral Small (latest)", + "display_name": "Mistral Small (latest)", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 64000 + "context": 262144, + "output": 256000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", "effort_options": [ - "low", - "medium", - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." + "none", + "high" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-17", - "last_updated": "2026-03-13", + "open_weights": true, + "knowledge": "2025-06", + "release_date": "2026-03-16", + "last_updated": "2026-03-16", "type": "chat" }, { - "id": "gpt-6-astra", - "name": "GPT-6 Astra", - "display_name": "GPT-6 Astra", + "id": "mistral/devstral-2512", + "name": "Devstral 2", + "display_name": "Devstral 2", "modalities": { "input": [ "text", - "image", "pdf" ], "output": [ @@ -109548,90 +107164,53 @@ ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 262144, + "output": 262144 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ] - } + "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2026-04-30", - "release_date": "2026-09-04", - "last_updated": "2026-09-04", + "open_weights": true, + "knowledge": "2025-12", + "release_date": "2025-12-09", + "last_updated": "2025-12-09", "type": "chat" }, { - "id": "gpt-5.5", - "name": "GPT-5.5", - "display_name": "GPT-5.5", + "id": "mistral/ministral-8b-2512", + "name": "Ministral 3 8B 2512", + "display_name": "Ministral 3 8B 2512", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 262144, + "output": 209715 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2025-12-01", - "release_date": "2026-04-23", - "last_updated": "2026-04-23", + "open_weights": true, + "release_date": "2025-12-02", + "last_updated": "2025-12-02", "type": "chat" }, { - "id": "gpt-6-luna", - "name": "GPT-6 Luna", - "display_name": "GPT-6 Luna", + "id": "mistral/mistral-medium-3-5", + "name": "Mistral Medium 3.5", + "display_name": "Mistral Medium 3.5", "modalities": { "input": [ "text", @@ -109643,10 +107222,10 @@ ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 262144, + "output": 209715 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -109655,29 +107234,24 @@ "extra_capabilities": { "reasoning": { "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" + "none", + "high" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-05-18", - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "release_date": "2026-04-30", + "last_updated": "2026-04-30", "type": "chat" }, { - "id": "claude-opus-4-8", - "name": "Claude Opus 4.8", - "display_name": "Claude Opus 4.8", + "id": "mistral/codestral-2508", + "name": "Codestral 25.08", + "display_name": "Codestral 25.08", "modalities": { "input": [ "text", - "image", "pdf" ], "output": [ @@ -109685,123 +107259,63 @@ ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 256000, + "output": 8192 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." - ] - } + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2026-01", - "release_date": "2026-05-28", - "last_updated": "2026-05-28", + "release_date": "2025-07-30", + "last_updated": "2025-07-30", "type": "chat" }, { - "id": "claude-fable-5", - "name": "Claude Fable 5", - "display_name": "Claude Fable 5", + "id": "ionos/meta-llama/Llama-3.3-70B-Instruct", + "name": "Llama-3.3-70B-Instruct (IONOS)", + "display_name": "Llama-3.3-70B-Instruct (IONOS)", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 128000, + "output": 4096 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", - "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", - "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." - ] - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-09", - "last_updated": "2026-06-09", + "attachment": false, + "open_weights": true, + "knowledge": "2023-12", + "release_date": "2024-12-06", + "last_updated": "2024-12-06", "type": "chat" }, { - "id": "Qwen/Qwen3.8-Max", - "name": "Qwen3.8 Max", - "display_name": "Qwen3.8 Max", + "id": "ionos/openai/gpt-oss-120b", + "name": "GPT OSS 120B (IONOS)", + "display_name": "GPT OSS 120B (IONOS)", "modalities": { "input": [ - "text", - "image", - "video", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 128000, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -109815,33 +107329,61 @@ "effort_options": [ "low", "medium", - "xhigh" + "high" ] } }, - "attachment": true, - "open_weights": false, - "release_date": "2026-08-03", - "last_updated": "2026-08-03", + "attachment": false, + "open_weights": true, + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "Qwen/Qwen3.8-Omni-Flash", - "name": "Qwen3.8 Omni Flash", - "display_name": "Qwen3.8 Omni Flash", + "id": "ionos/Qwen/Qwen3-Coder-Next", + "name": "Qwen3 Coder Next (IONOS)", + "display_name": "Qwen3 Coder Next (IONOS)", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 128000, + "output": 65536 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "knowledge": "2025-09", + "release_date": "2026-02-03", + "last_updated": "2026-02-03", + "type": "chat" + }, + { + "id": "meta/muse-spark-1.2", + "name": "Muse Spark 1.2 (Meta)", + "display_name": "Muse Spark 1.2 (Meta)", "modalities": { "input": [ "text", "image", - "audio", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, + "context": 1048576, "output": 131072 }, "temperature": true, @@ -109852,35 +107394,38 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ + "minimal", "low", "medium", + "high", "xhigh" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-09-17", - "last_updated": "2026-09-17", + "release_date": "2026-08-05", + "last_updated": "2026-08-05", "type": "chat" }, { - "id": "Qwen/Qwen3.8-Flash", - "name": "Qwen3.8 Flash", - "display_name": "Qwen3.8 Flash", + "id": "meta/muse-spark-1.1", + "name": "Muse Spark 1.1 (Meta)", + "display_name": "Muse Spark 1.1 (Meta)", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, + "context": 1048576, "output": 131072 }, "temperature": true, @@ -109893,35 +107438,37 @@ "reasoning": { "supported": true, "effort_options": [ + "minimal", "low", "medium", + "high", "xhigh" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", + "release_date": "2026-04-08", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "Qwen/Qwen3.8-27B", - "name": "Qwen3.8 27B", - "display_name": "Qwen3.8 27B", + "id": "meta/muse-wonder-1.0", + "name": "Muse Wonder (Meta)", + "display_name": "Muse Wonder (Meta)", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 1048576, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -109932,27 +107479,29 @@ "extra_capabilities": { "reasoning": { "effort_options": [ + "minimal", "low", "medium", - "xhigh" + "high", + "xhigh", + "max" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "open_weights": false, + "release_date": "2026-10-12", + "last_updated": "2026-10-12", "type": "chat" }, { - "id": "Qwen/Qwen3.8-Max-0902", - "name": "Qwen3.8 Max 0902", - "display_name": "Qwen3.8 Max 0902", + "id": "meta/muse-spark-1.3", + "name": "Muse Spark 1.3 (Meta)", + "display_name": "Muse Spark 1.3 (Meta)", "modalities": { "input": [ "text", "image", - "video", "pdf" ], "output": [ @@ -109960,7 +107509,7 @@ ] }, "limit": { - "context": 1000000, + "context": 1048576, "output": 131072 }, "temperature": true, @@ -109971,10 +107520,14 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ + "minimal", "low", "medium", - "xhigh" + "high", + "xhigh", + "max" ] } }, @@ -109985,9 +107538,9 @@ "type": "chat" }, { - "id": "xai/grok-4.5", - "name": "Grok 4.5", - "display_name": "Grok 4.5", + "id": "tensorx/moonshotai/kimi-k2.5", + "name": "Kimi K2.5 (TensorX)", + "display_name": "Kimi K2.5 (TensorX)", "modalities": { "input": [ "text", @@ -109998,10 +107551,10 @@ ] }, "limit": { - "context": 500000, - "output": 500000 + "context": 262144, + "output": 262144 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -110010,36 +107563,36 @@ "extra_capabilities": { "reasoning": { "supported": true, - "effort_options": [ - "low", - "medium", - "high" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, "attachment": true, - "open_weights": false, - "release_date": "2026-07-08", - "last_updated": "2026-07-08", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-01-27", + "last_updated": "2026-01-27", "type": "chat" }, { - "id": "xai/grok-4.7", - "name": "Grok 4.7", - "display_name": "Grok 4.7", + "id": "tensorx/deepseek/deepseek-v4-flash-0731", + "name": "DeepSeek V4 Flash 0731 (TensorX)", + "display_name": "DeepSeek V4 Flash 0731 (TensorX)", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 500000, - "output": 500000 + "context": 1048576, + "output": 384000 }, "temperature": true, "tool_call": true, @@ -110049,25 +107602,26 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ + "none", "low", - "medium", "high", - "xhigh" + "max" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-05", - "release_date": "2026-09-21", - "last_updated": "2026-09-21", + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-07-31", + "last_updated": "2026-07-31", "type": "chat" }, { - "id": "xai/grok-4.6", - "name": "Grok 4.6", - "display_name": "Grok 4.6", + "id": "tensorx/deepseek/deepseek-v4.1-flash", + "name": "DeepSeek V4.1 Flash (TensorX)", + "display_name": "DeepSeek V4.1 Flash (TensorX)", "modalities": { "input": [ "text", @@ -110078,8 +107632,8 @@ ] }, "limit": { - "context": 500000, - "output": 500000 + "context": 1048576, + "output": 384000 }, "temperature": true, "tool_call": true, @@ -110091,31 +107645,28 @@ "reasoning": { "supported": true, "effort_options": [ + "none", "low", - "medium", "high", - "xhigh" + "max" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-02-01", - "release_date": "2026-08-12", - "last_updated": "2026-08-12", + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-09-10", + "last_updated": "2026-09-10", "type": "chat" }, { - "id": "meta/muse-spark-1.3-contributor", - "name": "Muse Spark 1.3 (Contributor)", - "display_name": "Muse Spark 1.3 (Contributor)", + "id": "tensorx/deepseek/deepseek-v4.1-flash-1017", + "name": "DeepSeek V4.1 Flash 1017 (TensorX)", + "display_name": "DeepSeek V4.1 Flash 1017 (TensorX)", "modalities": { "input": [ "text", - "image", - "video", - "pdf", - "audio" + "image" ], "output": [ "text" @@ -110123,7 +107674,7 @@ }, "limit": { "context": 1048576, - "output": 131072 + "output": 384000 }, "temperature": true, "tool_call": true, @@ -110134,38 +107685,35 @@ "extra_capabilities": { "reasoning": { "effort_options": [ + "none", "low", - "medium", "high", - "xhigh" + "max" ] } }, "attachment": true, - "open_weights": false, - "release_date": "2026-09-02", - "last_updated": "2026-09-02", + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-10-17", + "last_updated": "2026-10-17", "type": "chat" }, { - "id": "meta/muse-spark-1.2-contributor", - "name": "Muse Spark 1.2 (Contributor)", - "display_name": "Muse Spark 1.2 (Contributor)", + "id": "tensorx/deepseek/deepseek-r1-0528", + "name": "DeepSeek R1 0528 (TensorX)", + "display_name": "DeepSeek R1 0528 (TensorX)", "modalities": { "input": [ - "text", - "image", - "video", - "pdf", - "audio" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 164000, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -110175,31 +107723,28 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "xhigh" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, - "attachment": true, - "open_weights": false, - "release_date": "2026-08-05", - "last_updated": "2026-08-05", + "attachment": false, + "open_weights": true, + "release_date": "2025-05-28", + "last_updated": "2025-05-28", "type": "chat" }, { - "id": "meta/muse-spark-1.3", - "name": "Muse Spark 1.3", - "display_name": "Muse Spark 1.3", + "id": "tensorx/deepseek/deepseek-v4-pro-0813", + "name": "DeepSeek V4 Pro 0813 (TensorX)", + "display_name": "DeepSeek V4 Pro 0813 (TensorX)", "modalities": { "input": [ - "text", - "image", - "video", - "pdf", - "audio" + "text" ], "output": [ "text" @@ -110207,7 +107752,7 @@ }, "limit": { "context": 1048576, - "output": 131072 + "output": 384000 }, "temperature": true, "tool_call": true, @@ -110219,39 +107764,34 @@ "reasoning": { "supported": true, "effort_options": [ + "none", "low", - "medium", "high", - "xhigh", "max" ] } }, - "attachment": true, - "open_weights": false, - "release_date": "2026-09-02", - "last_updated": "2026-09-02", + "attachment": false, + "open_weights": true, + "release_date": "2026-08-13", + "last_updated": "2026-08-22", "type": "chat" }, { - "id": "meta/muse-wonder-1.0", - "name": "Muse Wonder", - "display_name": "Muse Wonder", + "id": "databricks/databricks-gpt-oss-20b", + "name": "GPT OSS 20B (Databricks)", + "display_name": "GPT OSS 20B (Databricks)", "modalities": { "input": [ - "text", - "image", - "video", - "pdf", - "audio" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 131072, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -110264,37 +107804,33 @@ "effort_options": [ "low", "medium", - "high", - "xhigh", - "max" + "high" ] } }, - "attachment": true, - "open_weights": false, - "release_date": "2026-10-12", - "last_updated": "2026-10-12", + "attachment": false, + "open_weights": true, + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "meta/muse-spark-1.2", - "name": "Muse Spark 1.2", - "display_name": "Muse Spark 1.2", + "id": "databricks/databricks-inkling", + "name": "Inkling (Databricks)", + "display_name": "Inkling (Databricks)", "modalities": { "input": [ "text", - "image", - "video", - "pdf", - "audio" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 1000000, + "output": 1048576 }, "temperature": true, "tool_call": true, @@ -110304,39 +107840,37 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ + "none", + "minimal", "low", "medium", "high", - "xhigh" + "max" ] } }, "attachment": true, - "open_weights": false, - "release_date": "2026-08-05", - "last_updated": "2026-08-05", + "open_weights": true, + "release_date": "2026-07-15", + "last_updated": "2026-07-15", "type": "chat" }, { - "id": "meta/muse-spark-1.1", - "name": "Muse Spark 1.1", - "display_name": "Muse Spark 1.1", + "id": "databricks/databricks-deepseek-v4-flash-0731", + "name": "DeepSeek V4 Flash 0731 (Databricks)", + "display_name": "DeepSeek V4 Flash 0731 (Databricks)", "modalities": { "input": [ - "text", - "image", - "pdf", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 1000000, + "output": 384000 }, "temperature": true, "tool_call": true, @@ -110346,25 +107880,25 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ + "none", "low", - "medium", "high", - "xhigh" + "max" ] } }, - "attachment": true, - "open_weights": false, - "release_date": "2026-04-08", - "last_updated": "2026-07-09", + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-07-31", + "last_updated": "2026-07-31", "type": "chat" }, { - "id": "MiniMaxAI/MiniMax-M2.7", - "name": "MiniMax-M2.7", - "display_name": "MiniMax-M2.7", + "id": "databricks/databricks-gpt-oss-120b", + "name": "GPT OSS 120B (Databricks)", + "display_name": "GPT OSS 120B (Databricks)", "modalities": { "input": [ "text" @@ -110374,8 +107908,8 @@ ] }, "limit": { - "context": 200000, - "output": 131072 + "context": 131072, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -110385,30 +107919,27 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "low", + "medium", + "high" ] } }, "attachment": false, "open_weights": true, - "release_date": "2026-03-18", - "last_updated": "2026-03-18", + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "MiniMaxAI/MiniMax-M3", - "name": "MiniMax-M3", - "display_name": "MiniMax-M3", + "id": "databricks/databricks-deepseek-v4-pro-0813", + "name": "DeepSeek V4 Pro 0813 (Databricks)", + "display_name": "DeepSeek V4 Pro 0813 (Databricks)", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" @@ -110416,7 +107947,7 @@ }, "limit": { "context": 1000000, - "output": 512000 + "output": 384000 }, "temperature": true, "tool_call": true, @@ -110426,19 +107957,24 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "effort_options": [ + "none", + "low", + "high", + "max" + ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-06-01", - "last_updated": "2026-06-01", + "release_date": "2026-08-13", + "last_updated": "2026-08-22", "type": "chat" }, { - "id": "MiniMaxAI/MiniMax-M2.5", - "name": "MiniMax-M2.5", - "display_name": "MiniMax-M2.5", + "id": "databricks/databricks-qwen3-next-80b-a3b-instruct", + "name": "Qwen3-Next 80B-A3B Instruct (Databricks)", + "display_name": "Qwen3-Next 80B-A3B Instruct (Databricks)", "modalities": { "input": [ "text" @@ -110448,30 +107984,25 @@ ] }, "limit": { - "context": 200000, - "output": 131072 + "context": 262144, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, "attachment": false, "open_weights": true, - "release_date": "2026-02-12", - "last_updated": "2026-02-12", + "knowledge": "2025-04", + "release_date": "2025-09", + "last_updated": "2025-09", "type": "chat" }, { - "id": "inclusionai/ling-3.1-flash:free", - "name": "Ling 3.1 Flash", - "display_name": "Ling 3.1 Flash", + "id": "tencent/hy3", + "name": "Hy3 (Tencent)", + "display_name": "Hy3 (Tencent)", "modalities": { "input": [ "text" @@ -110481,8 +108012,8 @@ ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 256000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -110492,23 +108023,24 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ + "none", "low", - "medium", "high" ] } }, "attachment": false, "open_weights": true, - "release_date": "2026-09-29", - "last_updated": "2026-09-29", + "release_date": "2026-07-06", + "last_updated": "2026-07-06", "type": "chat" }, { - "id": "sakana/fugu-ultra", - "name": "Fugu Ultra", - "display_name": "Fugu Ultra", + "id": "tencent/deepseek-v4.1-flash", + "name": "DeepSeek V4.1 Flash (Tencent)", + "display_name": "DeepSeek V4.1 Flash (Tencent)", "modalities": { "input": [ "text", @@ -110520,9 +108052,9 @@ }, "limit": { "context": 1000000, - "output": 128000 + "output": 384000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -110530,22 +108062,26 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ + "none", + "low", "high", - "xhigh" + "max" ] } }, "attachment": true, - "open_weights": false, - "release_date": "2026-06-15", - "last_updated": "2026-06-15", + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-09-10", + "last_updated": "2026-09-10", "type": "chat" }, { - "id": "nvidia/nemotron-3-ultra-550b-a55b", - "name": "Nemotron 3 Ultra 550B A55B", - "display_name": "Nemotron 3 Ultra 550B A55B", + "id": "tencent/hy4-preview", + "name": "Hy4 preview (Tencent)", + "display_name": "Hy4 preview (Tencent)", "modalities": { "input": [ "text" @@ -110556,7 +108092,7 @@ }, "limit": { "context": 1000000, - "output": 128000 + "output": 64000 }, "temperature": true, "tool_call": true, @@ -110566,27 +108102,30 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "effort_options": [ + "none", + "low", + "high" + ] } }, "attachment": false, "open_weights": true, - "knowledge": "2025-09", - "release_date": "2026-06-04", - "last_updated": "2026-06-04", + "release_date": "2026-08-28", + "last_updated": "2026-08-28", "type": "chat" }, { - "id": "google/gemini-4-argon", - "name": "Gemini 4 Argon", - "display_name": "Gemini 4 Argon", + "id": "tencent/step-5-preview", + "name": "Step 5 Preview (Tencent)", + "display_name": "Step 5 Preview (Tencent)", "modalities": { "input": [ "text", "image", "video", - "audio", - "pdf" + "audio" ], "output": [ "text" @@ -110594,9 +108133,9 @@ }, "limit": { "context": 1000000, - "output": 65536 + "output": 1000000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -110612,23 +108151,19 @@ } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-10-13", - "last_updated": "2026-10-13", + "open_weights": true, + "release_date": "2026-09-16", + "last_updated": "2026-09-20", "type": "chat" }, { - "id": "google/gemini-3.5-flash", - "name": "Gemini 3.5 Flash", - "display_name": "Gemini 3.5 Flash", + "id": "tencent/deepseek-v4.1-flash-1017", + "name": "DeepSeek V4.1 Flash 1017 (Tencent)", + "display_name": "DeepSeek V4.1 Flash 1017 (Tencent)", "modalities": { "input": [ "text", - "image", - "video", - "audio", - "pdf" + "image" ], "output": [ "text" @@ -110636,7 +108171,7 @@ }, "limit": { "context": 1000000, - "output": 65536 + "output": 384000 }, "temperature": true, "tool_call": true, @@ -110646,41 +108181,28 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", + "effort_options": [ + "none", "low", - "medium", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" + "high", + "max" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-05-19", - "last_updated": "2026-05-19", + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-10-17", + "last_updated": "2026-10-17", "type": "chat" }, { - "id": "google/gemini-3.5-flash-lite", - "name": "Gemini 3.5 Flash Lite", - "display_name": "Gemini 3.5 Flash Lite", + "id": "tencent/deepseek-v4-pro-0813", + "name": "DeepSeek V4 Pro 0813 (Tencent)", + "display_name": "DeepSeek V4 Pro 0813 (Tencent)", "modalities": { "input": [ - "text", - "image", - "video", - "audio", - "pdf" + "text" ], "output": [ "text" @@ -110688,7 +108210,7 @@ }, "limit": { "context": 1000000, - "output": 65536 + "output": 384000 }, "temperature": true, "tool_call": true, @@ -110700,81 +108222,95 @@ "reasoning": { "supported": true, "effort_options": [ + "none", "low", - "medium", - "high" + "high", + "max" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-07-21", - "last_updated": "2026-07-21", + "attachment": false, + "open_weights": true, + "release_date": "2026-08-13", + "last_updated": "2026-08-22", "type": "chat" }, { - "id": "google/gemini-3.8-flash", - "name": "Gemini 3.8 Flash", - "display_name": "Gemini 3.8 Flash", + "id": "infomaniak/mistralai/Ministral-3-14B-Instruct-2512", + "name": "Ministral 3 14B (Infomaniak)", + "display_name": "Ministral 3 14B (Infomaniak)", "modalities": { "input": [ "text", - "image", - "video", - "audio", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 100000, + "output": 262144 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false + }, + "attachment": true, + "open_weights": true, + "release_date": "2025-12-02", + "last_updated": "2025-12-02", + "type": "chat" + }, + { + "id": "sference/deepseek-ai/DeepSeek-V4-Flash-0731", + "name": "DeepSeek V4 Flash 0731 (Sference)", + "display_name": "DeepSeek V4 Flash 0731 (Sference)", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1048576, + "output": 384000 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", + "effort_options": [ + "none", "low", - "medium", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" + "high", + "max" ] } }, - "attachment": true, - "open_weights": false, - "release_date": "2026-09-02", - "last_updated": "2026-09-02", + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-07-31", + "last_updated": "2026-07-31", "type": "chat" }, { - "id": "google/gemini-3.7-flash", - "name": "Gemini 3.7 Flash", - "display_name": "Gemini 3.7 Flash", + "id": "sference/deepseek-ai/DeepSeek-V4.1-Flash-1017", + "name": "DeepSeek V4.1 Flash 1017 (Sference)", + "display_name": "DeepSeek V4.1 Flash 1017 (Sference)", "modalities": { "input": [ "text", - "image", - "video", - "audio", - "pdf" + "image" ], "output": [ "text" @@ -110782,7 +108318,7 @@ }, "limit": { "context": 1048576, - "output": 65536 + "output": 384000 }, "temperature": true, "tool_call": true, @@ -110792,49 +108328,36 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", + "effort_options": [ + "none", "low", - "medium", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" + "high", + "max" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-08-13", - "last_updated": "2026-08-13", + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-10-17", + "last_updated": "2026-10-17", "type": "chat" }, { - "id": "google/gemini-3.6-flash", - "name": "Gemini 3.6 Flash", - "display_name": "Gemini 3.6 Flash", + "id": "together_ai/openai/gpt-oss-120b", + "name": "GPT OSS 120B (Together AI)", + "display_name": "GPT OSS 120B (Together AI)", "modalities": { "input": [ - "text", - "image", - "video", - "audio", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 131072, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -110845,48 +108368,36 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", + "effort_options": [ "low", "medium", "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-07-21", - "last_updated": "2026-07-21", + "attachment": false, + "open_weights": true, + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "google/gemini-3.1-flash-lite", - "name": "Gemini 3.1 Flash Lite", - "display_name": "Gemini 3.1 Flash Lite", + "id": "together_ai/meta-models/Muse-Glimmer-30B", + "name": "Muse Glimmer 30B (Together AI)", + "display_name": "Muse Glimmer 30B (Together AI)", "modalities": { "input": [ "text", - "image", - "video", - "audio", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 131072, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -110896,40 +108407,40 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ "low", "medium", - "high" + "high", + "xhigh" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-05-07", - "last_updated": "2026-05-07", + "open_weights": true, + "knowledge": "2026-01-04", + "release_date": "2026-08-10", + "last_updated": "2026-08-10", "type": "chat" }, { - "id": "moonshotai/Kimi-K2.7-Code-Highspeed", - "name": "Kimi K2.7 Code Highspeed", - "display_name": "Kimi K2.7 Code Highspeed", + "id": "together_ai/thinkingmachines/Inkling", + "name": "Inkling (Together AI)", + "display_name": "Inkling (Together AI)", "modalities": { "input": [ "text", "image", - "video" + "audio" ], "output": [ "text" ] }, "limit": { - "context": 262000, - "output": 262000 + "context": 524288, + "output": 1048576 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -110937,35 +108448,39 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "effort_options": [ + "none", + "minimal", + "low", + "medium", + "high", + "max" + ] } }, "attachment": true, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-06-12", - "last_updated": "2026-06-12", + "release_date": "2026-07-15", + "last_updated": "2026-07-15", "type": "chat" }, { - "id": "moonshotai/Kimi-K3", - "name": "Kimi K3", - "display_name": "Kimi K3", + "id": "together_ai/reflection/Beam-1.0-501B-A23B", + "name": "Beam 1.0 501B A23B (Together AI)", + "display_name": "Beam 1.0 501B A23B (Together AI)", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, + "context": 1048576, "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -110973,39 +108488,40 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ "low", + "medium", "high", + "xhigh", "max" ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-16", + "knowledge": "2026-06-30", + "release_date": "2026-10-05", + "last_updated": "2026-10-16", "type": "chat" }, { - "id": "moonshotai/Kimi-K2.7-Code", - "name": "Kimi K2.7 Code", - "display_name": "Kimi K2.7 Code", + "id": "together_ai/deepseek-ai/DeepSeek-V4.1-Flash-1017", + "name": "DeepSeek V4.1 Flash 1017 (Together AI)", + "display_name": "DeepSeek V4.1 Flash 1017 (Together AI)", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 256000 + "context": 1048576, + "output": 384000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -111013,20 +108529,25 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "effort_options": [ + "none", + "low", + "high", + "max" + ] } }, "attachment": true, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-06-12", - "last_updated": "2026-06-12", + "knowledge": "2025-05", + "release_date": "2026-10-17", + "last_updated": "2026-10-17", "type": "chat" }, { - "id": "stepfun/Step-3.5-Flash", - "name": "Step 3.5 Flash", - "display_name": "Step 3.5 Flash", + "id": "together_ai/deepseek-ai/DeepSeek-V4-Pro-0813", + "name": "DeepSeek V4 Pro 0813 (Together AI)", + "display_name": "DeepSeek V4 Pro 0813 (Together AI)", "modalities": { "input": [ "text" @@ -111036,8 +108557,8 @@ ] }, "limit": { - "context": 256000, - "output": 256000 + "context": 1048576, + "output": 384000 }, "temperature": true, "tool_call": true, @@ -111047,36 +108568,37 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ + "none", "low", - "high" + "high", + "max" ] } }, "attachment": false, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-01-29", - "last_updated": "2026-02-13", + "release_date": "2026-08-13", + "last_updated": "2026-08-22", "type": "chat" }, { - "id": "stepfun/Step-5-Preview", - "name": "Step 5 Preview", - "display_name": "Step 5 Preview", + "id": "together_ai/deepseek-ai/DeepSeek-V4.1-Flash", + "name": "DeepSeek V4.1 Flash (Together AI)", + "display_name": "DeepSeek V4.1 Flash (Together AI)", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 1000000 + "context": 1048576, + "output": 384000 }, "temperature": true, "tool_call": true, @@ -111086,63 +108608,85 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ + "none", "low", - "medium", - "high" + "high", + "max" ] } }, "attachment": true, "open_weights": true, - "release_date": "2026-09-16", - "last_updated": "2026-09-20", + "knowledge": "2025-05", + "release_date": "2026-09-10", + "last_updated": "2026-09-10", "type": "chat" }, { - "id": "stepfun/Step-3.7-Flash", - "name": "Step 3.7 Flash", - "display_name": "Step 3.7 Flash", + "id": "amazon/mistral.voxtral-small-24b-2507", + "name": "Voxtral Small 24B 2507 (Amazon Bedrock)", + "display_name": "Voxtral Small 24B 2507 (Amazon Bedrock)", + "modalities": { + "input": [ + "text", + "audio" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 32768, + "output": 32768 + }, + "temperature": true, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": true, + "release_date": "2025-07-15", + "last_updated": "2025-07-15", + "type": "chat" + }, + { + "id": "amazon/amazon.nova-lite-v1:0", + "name": "Nova Lite", + "display_name": "Nova Lite", "modalities": { "input": [ "text", "image", - "video" + "video", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 256000 + "context": 300000, + "output": 10000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high" - ] - } + "supported": false }, "attachment": true, - "open_weights": true, - "knowledge": "2026-03-01", - "release_date": "2026-05-29", - "last_updated": "2026-05-29", + "open_weights": false, + "knowledge": "2024-10", + "release_date": "2024-12-03", + "last_updated": "2024-12-03", "type": "chat" }, { - "id": "mistral/mistral-large-4", - "name": "Mistral Large 4", - "display_name": "Mistral Large 4", + "id": "amazon/moonshotai.kimi-k2.5", + "name": "Kimi K2.5 (Amazon Bedrock)", + "display_name": "Kimi K2.5 (Amazon Bedrock)", "modalities": { "input": [ "text", @@ -111153,32 +108697,54 @@ ] }, "limit": { - "context": 524288, + "context": 262144, "output": 262144 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "high" - ] - } + "attachment": true, + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-01-27", + "last_updated": "2026-01-27", + "type": "chat" + }, + { + "id": "amazon/mistral.pixtral-large-2502-v1:0", + "name": "Pixtral Large (25.02) (Amazon Bedrock)", + "display_name": "Pixtral Large (25.02) (Amazon Bedrock)", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 128000, + "output": 8192 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false }, "attachment": true, "open_weights": false, - "release_date": "2026-10-06", - "last_updated": "2026-10-06", + "release_date": "2025-04-08", + "last_updated": "2025-04-08", "type": "chat" }, { - "id": "zai-org/GLM-5.2-Fast", - "name": "GLM-5.2-Fast", - "display_name": "GLM-5.2-Fast", + "id": "amazon/qwen.qwen3-coder-next", + "name": "Qwen3 Coder Next (Amazon Bedrock)", + "display_name": "Qwen3 Coder Next (Amazon Bedrock)", "modalities": { "input": [ "text" @@ -111188,33 +108754,25 @@ ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 256000, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "high", - "max" - ] - } + "supported": false }, "attachment": false, "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "knowledge": "2025-09", + "release_date": "2026-02-03", + "last_updated": "2026-02-03", "type": "chat" }, { - "id": "zai-org/GLM-5.3", - "name": "GLM-5.3", - "display_name": "GLM-5.3", + "id": "amazon/openai.gpt-oss-safeguard-20b", + "name": "GPT OSS Safeguard 20B (Amazon Bedrock)", + "display_name": "GPT OSS Safeguard 20B (Amazon Bedrock)", "modalities": { "input": [ "text" @@ -111224,7 +108782,7 @@ ] }, "limit": { - "context": 1000000, + "context": 128000, "output": 131072 }, "temperature": true, @@ -111235,61 +108793,112 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ "low", - "high", - "max" + "medium", + "high" ] } }, "attachment": false, "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "release_date": "2025-10-29", + "last_updated": "2025-10-29", "type": "chat" }, { - "id": "zai-org/GLM-5.2", - "name": "GLM-5.2", - "display_name": "GLM-5.2", + "id": "amazon/amazon.nova-pro-v1:0", + "name": "Nova Pro", + "display_name": "Nova Pro", "modalities": { "input": [ + "text", + "image", + "video", + "pdf" + ], + "output": [ "text" + ] + }, + "limit": { + "context": 300000, + "output": 10000 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": false, + "knowledge": "2024-10", + "release_date": "2024-12-03", + "last_updated": "2024-12-03", + "type": "chat" + }, + { + "id": "amazon/google.gemma-3-27b-it", + "name": "Gemma 3 27B IT (Amazon Bedrock)", + "display_name": "Gemma 3 27B IT (Amazon Bedrock)", + "modalities": { + "input": [ + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, + "context": 128000, "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "high", - "max" - ] - } + "attachment": true, + "open_weights": true, + "knowledge": "2024-08", + "release_date": "2025-03-12", + "last_updated": "2025-03-12", + "type": "chat" + }, + { + "id": "amazon/google.gemma-3-12b-it", + "name": "Gemma 3 12B IT (Amazon Bedrock)", + "display_name": "Gemma 3 12B IT (Amazon Bedrock)", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] }, - "attachment": false, + "limit": { + "context": 128000, + "output": 131072 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": true, "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "knowledge": "2024-08", + "release_date": "2025-03-12", + "last_updated": "2025-03-12", "type": "chat" }, { - "id": "tencent/hy4-preview", - "name": "Hy4 preview", - "display_name": "Hy4 preview", + "id": "amazon/moonshot.kimi-k2-thinking", + "name": "Kimi K2 Thinking (Amazon Bedrock)", + "display_name": "Kimi K2 Thinking (Amazon Bedrock)", "modalities": { "input": [ "text" @@ -111299,8 +108908,8 @@ ] }, "limit": { - "context": 1024000, - "output": 64000 + "context": 256000, + "output": 262144 }, "temperature": true, "tool_call": true, @@ -111308,24 +108917,17 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "high" - ] - } - }, "attachment": false, "open_weights": true, - "release_date": "2026-08-28", - "last_updated": "2026-08-28", + "knowledge": "2024-08", + "release_date": "2025-11-06", + "last_updated": "2025-11-06", "type": "chat" }, { - "id": "tencent/hy3-paid", - "name": "Hy3", - "display_name": "Hy3", + "id": "amazon/zai.glm-4.7-flash", + "name": "GLM-4.7-Flash (Amazon Bedrock)", + "display_name": "GLM-4.7-Flash (Amazon Bedrock)", "modalities": { "input": [ "text" @@ -111335,8 +108937,8 @@ ] }, "limit": { - "context": 256000, - "output": 128000 + "context": 203000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -111344,29 +108946,106 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "high" - ] - } + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2026-01-19", + "last_updated": "2026-01-19", + "type": "chat" + }, + { + "id": "amazon/amazon.nova-micro-v1:0", + "name": "Nova Micro", + "display_name": "Nova Micro", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 128000, + "output": 10000 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false }, "attachment": false, + "open_weights": false, + "knowledge": "2024-10", + "release_date": "2024-12-03", + "last_updated": "2024-12-03", + "type": "chat" + }, + { + "id": "amazon/mistral.voxtral-mini-3b-2507", + "name": "Voxtral Mini 3B 2507 (Amazon Bedrock)", + "display_name": "Voxtral Mini 3B 2507 (Amazon Bedrock)", + "modalities": { + "input": [ + "text", + "audio" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 32768, + "output": 32768 + }, + "temperature": true, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": true, "open_weights": true, - "release_date": "2026-07-06", - "last_updated": "2026-07-06", + "release_date": "2025-07-15", + "last_updated": "2025-07-15", "type": "chat" }, { - "id": "z-ai/glm-5.3-flashx", - "name": "GLM-5.3-FlashX", - "display_name": "GLM-5.3-FlashX", + "id": "amazon/google.gemma-3-4b-it", + "name": "Gemma 3 4B IT (Amazon Bedrock)", + "display_name": "Gemma 3 4B IT (Amazon Bedrock)", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 128000, + "output": 131072 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": true, + "knowledge": "2024-08", + "release_date": "2025-03-12", + "last_updated": "2025-03-12", + "type": "chat" + }, + { + "id": "anthropic/claude-fable-5", + "name": "Claude Fable 5", + "display_name": "Claude Fable 5", "modalities": { "input": [ "text", "image", - "video", "pdf" ], "output": [ @@ -111375,9 +109054,9 @@ }, "limit": { "context": 1000000, - "output": 131072 + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -111385,28 +109064,45 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", "effort_options": [ "low", + "medium", "high", + "xhigh", "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", + "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", + "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", + "open_weights": false, + "knowledge": "2026-01-31", + "release_date": "2026-06-09", + "last_updated": "2026-06-09", "type": "chat" }, { - "id": "z-ai/glm-5.3-flash", - "name": "GLM-5.3-Flash", - "display_name": "GLM-5.3-Flash", + "id": "anthropic/claude-sonnet-4-6", + "name": "Claude Sonnet 4.6", + "display_name": "Claude Sonnet 4.6", "modalities": { "input": [ "text", "image", - "video", "pdf" ], "output": [ @@ -111415,38 +109111,58 @@ }, "limit": { "context": 1000000, - "output": 131072 + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", "effort_options": [ "low", + "medium", "high", "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-02-17", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "deepseek/deepseek-v4.1-flash-fast", - "name": "DeepSeek V4.1 Flash Fast", - "display_name": "DeepSeek V4.1 Flash Fast", + "id": "anthropic/claude-opus-latest", + "name": "Claude Opus Latest (Claude Opus 5.5)", + "display_name": "Claude Opus Latest (Claude Opus 5.5)", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" @@ -111454,9 +109170,9 @@ }, "limit": { "context": 1000000, - "output": 384000 + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -111466,25 +109182,29 @@ "reasoning": { "effort_options": [ "low", + "medium", "high", + "xhigh", "max" ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-09-10", - "last_updated": "2026-09-10", + "open_weights": false, + "knowledge": "2026-06", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "deepseek/deepseek-v4-flash", - "name": "DeepSeek V4 Flash", - "display_name": "DeepSeek V4 Flash", + "id": "anthropic/claude-fable-latest", + "name": "Claude Fable Latest (Claude Fable 5.1)", + "display_name": "Claude Fable Latest (Claude Fable 5.1)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" @@ -111492,9 +109212,9 @@ }, "limit": { "context": 1000000, - "output": 384000 + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -111508,34 +109228,40 @@ "effort": "high", "effort_options": [ "low", + "medium", "high", + "xhigh", "max" ], "interleaved": true, "summaries": true, - "visibility": "summary", + "visibility": "omitted", "continuation": [ "thinking_blocks" ], "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." + "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", + "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", + "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "attachment": true, + "open_weights": false, + "knowledge": "2026-06", + "release_date": "2026-09-01", + "last_updated": "2026-09-01", "type": "chat" }, { - "id": "deepseek/deepseek-v4-pro", - "name": "DeepSeek V4 Pro", - "display_name": "DeepSeek V4 Pro", + "id": "anthropic/claude-opus-4-7", + "name": "Claude Opus 4.7", + "display_name": "Claude Opus 4.7", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" @@ -111543,51 +109269,56 @@ }, "limit": { "context": 1000000, - "output": 384000 + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, + "default_enabled": false, "mode": "effort", "effort": "high", "effort_options": [ "low", + "medium", "high", + "xhigh", "max" ], "interleaved": true, "summaries": true, - "visibility": "summary", + "visibility": "omitted", "continuation": [ "thinking_blocks" ], "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "attachment": true, + "open_weights": false, + "knowledge": "2026-01-31", + "release_date": "2026-04-16", + "last_updated": "2026-04-16", "type": "chat" }, { - "id": "deepseek/deepseek-v4-flash-vision-exp", - "name": "DeepSeek V4 Flash Vision Exp", - "display_name": "DeepSeek V4 Flash Vision Exp", + "id": "anthropic/claude-fable-5-1", + "name": "Claude Fable 5.1", + "display_name": "Claude Fable 5.1", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" @@ -111595,9 +109326,9 @@ }, "limit": { "context": 1000000, - "output": 384000 + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -111611,33 +109342,40 @@ "effort": "high", "effort_options": [ "low", + "medium", "high", + "xhigh", "max" ], "interleaved": true, "summaries": true, - "visibility": "summary", + "visibility": "omitted", "continuation": [ "thinking_blocks" ], "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." + "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", + "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", + "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-08-21", + "open_weights": false, + "knowledge": "2026-06", + "release_date": "2026-09-01", "last_updated": "2026-09-01", "type": "chat" }, { - "id": "deepseek/deepseek-v4-flash-fast", - "name": "DeepSeek V4 Flash Fast", - "display_name": "DeepSeek V4 Flash Fast", + "id": "anthropic/claude-sonnet-latest", + "name": "Claude Sonnet Latest (Claude Sonnet 5.5)", + "display_name": "Claude Sonnet Latest (Claude Sonnet 5.5)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" @@ -111645,9 +109383,9 @@ }, "limit": { "context": 1000000, - "output": 384000 + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -111657,26 +109395,29 @@ "reasoning": { "effort_options": [ "low", + "medium", "high", + "xhigh", "max" ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "attachment": true, + "open_weights": false, + "knowledge": "2026-06", + "release_date": "2026-09-28", + "last_updated": "2026-09-28", "type": "chat" }, { - "id": "deepseek/deepseek-v4.1-flash", - "name": "DeepSeek V4.1 Flash", - "display_name": "DeepSeek V4.1 Flash", + "id": "anthropic/claude-opus-5-5", + "name": "Claude Opus 5.5", + "display_name": "Claude Opus 5.5", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" @@ -111684,9 +109425,9 @@ }, "limit": { "context": 1000000, - "output": 384000 + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -111694,30 +109435,31 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ "low", + "medium", "high", + "xhigh", "max" ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-09-10", - "last_updated": "2026-09-10", + "open_weights": false, + "knowledge": "2026-06", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "thinkingmachines/inkling-small", - "name": "Inkling Small", - "display_name": "Inkling Small", + "id": "anthropic/claude-opus-4-6", + "name": "Claude Opus 4.6", + "display_name": "Claude Opus 4.6", "modalities": { "input": [ "text", "image", - "audio" + "pdf" ], "output": [ "text" @@ -111725,83 +109467,110 @@ }, "limit": { "context": 1000000, - "output": 1000000 + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", "effort_options": [ "low", "medium", "high", "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-07-30", - "last_updated": "2026-07-30", + "open_weights": false, + "knowledge": "2025-05-31", + "release_date": "2026-02-05", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "thinkingmachines/inkling", - "name": "Inkling", - "display_name": "Inkling", + "id": "anthropic/claude-opus-4-8", + "name": "Claude Opus 4.8", + "display_name": "Claude Opus 4.8", "modalities": { "input": [ "text", "image", - "audio" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 256000 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "high", "effort_options": [ "low", "medium", "high", + "xhigh", "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-07-15", - "last_updated": "2026-07-15", + "open_weights": false, + "knowledge": "2026-01", + "release_date": "2026-05-28", + "last_updated": "2026-05-28", "type": "chat" - } - ] - }, - "infer": { - "id": "infer", - "name": "Infer by Flow7", - "display_name": "Infer by Flow7", - "api": "https://infer.flow7.org/v1", - "doc": "https://infer.flow7.org/opencode", - "models": [ + }, { - "id": "infer/gpt-5.6-sol:official", - "name": "GPT-5.6 Sol (Official API)", - "display_name": "GPT-5.6 Sol (Official API)", + "id": "anthropic/claude-opus-5", + "name": "Claude Opus 5", + "display_name": "Claude Opus 5", "modalities": { "input": [ "text", @@ -111813,7 +109582,7 @@ ] }, "limit": { - "context": 271999, + "context": 1000000, "output": 128000 }, "temperature": false, @@ -111824,8 +109593,8 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ - "none", "low", "medium", "high", @@ -111836,15 +109605,15 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "knowledge": "2026-05", + "release_date": "2026-07-24", + "last_updated": "2026-07-24", "type": "chat" }, { - "id": "infer/gpt-6-astra:official", - "name": "GPT-6 Astra (Official API)", - "display_name": "GPT-6 Astra (Official API)", + "id": "anthropic/claude-opus-4-5", + "name": "Claude Opus 4.5 (latest)", + "display_name": "Claude Opus 4.5 (latest)", "modalities": { "input": [ "text", @@ -111856,60 +109625,68 @@ ] }, "limit": { - "context": 271999, - "output": 128000 + "context": 200000, + "output": 64000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", "effort_options": [ "low", "medium", - "high", - "xhigh", - "max" + "high" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-04-30", - "release_date": "2026-09-04", - "last_updated": "2026-09-04", + "knowledge": "2025-05", + "release_date": "2025-11-24", + "last_updated": "2025-11-24", "type": "chat" - } - ] - }, - "ovhcloud": { - "id": "ovhcloud", - "name": "OVHcloud AI Endpoints", - "display_name": "OVHcloud AI Endpoints", - "api": "https://oai.endpoints.kepler.ai.cloud.ovh.net/v1", - "doc": "https://www.ovhcloud.com/en/public-cloud/ai-endpoints/catalog//", - "models": [ + }, { - "id": "qwen3.8-27b", - "name": "Qwen3.8-27B", - "display_name": "Qwen3.8-27B", + "id": "anthropic/claude-haiku-5-5", + "name": "Claude Haiku 5.5", + "display_name": "Claude Haiku 5.5", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -111919,66 +109696,40 @@ "reasoning": { "effort_options": [ "none", - "minimal", "low", "medium", - "high" + "high", + "xhigh", + "max" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", - "type": "chat" - }, - { - "id": "mistral-small-3.2-24b-instruct-2506", - "name": "Mistral-Small-3.2-24B-Instruct-2506", - "display_name": "Mistral-Small-3.2-24B-Instruct-2506", - "modalities": { - "input": [ - "image", - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 131072, - "output": 131072 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": true, - "knowledge": "2023-10-31", - "release_date": "2025-06-20", - "last_updated": "2025-06-20", + "open_weights": false, + "knowledge": "2026-06", + "release_date": "2026-10-07", + "last_updated": "2026-10-07", "type": "chat" }, { - "id": "qwen3.5-397b-a17b", - "name": "Qwen3.5-397B-A17B", - "display_name": "Qwen3.5-397B-A17B", + "id": "anthropic/claude-sonnet-5-5", + "name": "Claude Sonnet 5.5", + "display_name": "Claude Sonnet 5.5", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -111986,128 +109737,41 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ - "none", "low", "medium", - "high" + "high", + "xhigh", + "max" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-02-15", - "last_updated": "2026-02-15", - "type": "chat" - }, - { - "id": "qwen3guard-gen-8b", - "name": "Qwen3Guard-Gen-8B", - "display_name": "Qwen3Guard-Gen-8B", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 32768, - "output": 16384 - }, - "temperature": true, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": true, - "release_date": "2026-01-22", - "last_updated": "2026-01-22", - "type": "chat" - }, - { - "id": "mistral-nemo-instruct-2407", - "name": "Mistral-Nemo-Instruct-2407", - "display_name": "Mistral-Nemo-Instruct-2407", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 65536, - "output": 65536 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-07", - "release_date": "2024-07-18", - "last_updated": "2024-07-18", - "type": "chat" - }, - { - "id": "meta-llama-3_3-70b-instruct", - "name": "Meta-Llama-3_3-70B-Instruct", - "display_name": "Meta-Llama-3_3-70B-Instruct", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 131072, - "output": 131072 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": true, - "knowledge": "2023-12", - "release_date": "2024-12-06", - "last_updated": "2024-12-06", + "open_weights": false, + "knowledge": "2026-06", + "release_date": "2026-09-28", + "last_updated": "2026-09-28", "type": "chat" }, { - "id": "qwen3.6-27b", - "name": "Qwen3.6-27B", - "display_name": "Qwen3.6-27B", + "id": "anthropic/claude-haiku-latest", + "name": "Claude Haiku Latest (Claude Haiku 5.5)", + "display_name": "Claude Haiku Latest (Claude Haiku 5.5)", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -112115,45 +109779,42 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ "none", - "minimal", "low", "medium", - "high" + "high", + "xhigh", + "max" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-04-22", - "last_updated": "2026-04-22", + "open_weights": false, + "knowledge": "2026-06", + "release_date": "2026-10-07", + "last_updated": "2026-10-07", "type": "chat" }, { - "id": "gpt-oss-120b", - "name": "gpt-oss-120b", - "display_name": "gpt-oss-120b", + "id": "anthropic/claude-sonnet-5", + "name": "Claude Sonnet 5", + "display_name": "Claude Sonnet 5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 131072 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -112163,98 +109824,84 @@ "reasoning": { "supported": true, "effort_options": [ + "none", "low", "medium", - "high" + "high", + "xhigh", + "max" ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "attachment": true, + "open_weights": false, + "knowledge": "2026-01-31", + "release_date": "2026-06-30", + "last_updated": "2026-06-30", "type": "chat" }, { - "id": "qwen3.5-9b", - "name": "Qwen3.5-9B", - "display_name": "Qwen3.5-9B", + "id": "anthropic/claude-opus-4-5-20251101", + "name": "Claude Opus 4.5", + "display_name": "Claude Opus 4.5", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", + "effort_options": [ + "low", + "medium", + "high" + ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" ], - "effort_options": [ - "none", - "low", - "medium", - "high" + "notes": [ + "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-02-23", - "last_updated": "2026-02-23", - "type": "chat" - }, - { - "id": "qwen2.5-vl-72b-instruct", - "name": "Qwen2.5-VL-72B-Instruct", - "display_name": "Qwen2.5-VL-72B-Instruct", - "modalities": { - "input": [ - "text", - "image" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 32768, - "output": 32768 - }, - "temperature": true, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": true, - "knowledge": "2024-04", - "release_date": "2025-01-26", - "last_updated": "2025-01-26", + "open_weights": false, + "knowledge": "2025-05", + "release_date": "2025-11-24", + "last_updated": "2025-11-24", "type": "chat" }, { - "id": "gpt-oss-20b", - "name": "gpt-oss-20b", - "display_name": "gpt-oss-20b", + "id": "minimax/MiniMax-M2.7", + "name": "MiniMax-M2.7", + "display_name": "MiniMax-M2.7", "modalities": { "input": [ "text" @@ -112264,7 +109911,7 @@ ] }, "limit": { - "context": 131072, + "context": 204800, "output": 131072 }, "temperature": true, @@ -112276,24 +109923,24 @@ "extra_capabilities": { "reasoning": { "supported": true, - "effort_options": [ - "low", - "medium", - "high" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, "attachment": false, "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "release_date": "2026-03-18", + "last_updated": "2026-03-18", "type": "chat" }, { - "id": "qwen3guard-gen-0.6b", - "name": "Qwen3Guard-Gen-0.6B", - "display_name": "Qwen3Guard-Gen-0.6B", + "id": "minimax/MiniMax-M2", + "name": "MiniMax-M2", + "display_name": "MiniMax-M2", "modalities": { "input": [ "text" @@ -112303,33 +109950,25 @@ ] }, "limit": { - "context": 32768, - "output": 16384 + "context": 204800, + "output": 131072 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": false, "open_weights": true, - "release_date": "2026-01-22", - "last_updated": "2026-01-22", + "release_date": "2025-10-27", + "last_updated": "2025-10-27", "type": "chat" - } - ] - }, - "modelis": { - "id": "modelis", - "name": "Modelis", - "display_name": "Modelis", - "api": "https://modelishub.com/v1", - "doc": "https://modelishub.com/pricing", - "models": [ + }, { - "id": "deepseek-v4-flash", - "name": "DeepSeek V4 Flash", - "display_name": "DeepSeek V4 Flash", + "id": "minimax/MiniMax-M2.5", + "name": "MiniMax-M2.5", + "display_name": "MiniMax-M2.5", "modalities": { "input": [ "text" @@ -112339,8 +109978,8 @@ ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 204800, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -112350,44 +109989,24 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." - ] + "supported": true } }, "attachment": false, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "release_date": "2026-02-12", + "last_updated": "2026-02-12", "type": "chat" }, { - "id": "gemini-2.5-pro", - "name": "Gemini 2.5 Pro", - "display_name": "Gemini 2.5 Pro", + "id": "minimax/MiniMax-M3.1-Flash", + "name": "MiniMax-M3.1-Flash", + "display_name": "MiniMax-M3.1-Flash", "modalities": { "input": [ "text", "image", - "audio", - "video", - "pdf" + "video" ], "output": [ "text" @@ -112395,7 +110014,7 @@ }, "limit": { "context": 1048576, - "output": 65536 + "output": 512000 }, "temperature": true, "tool_call": true, @@ -112405,45 +110024,38 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "budget", - "budget": { - "default": -1, - "min": 128, - "max": 32768, - "auto": -1, - "unit": "tokens" - }, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-06-17", - "last_updated": "2025-06-17", + "release_date": "2026-10-19", + "last_updated": "2026-10-19", "type": "chat" }, { - "id": "deepseek-v4-pro", - "name": "DeepSeek V4 Pro", - "display_name": "DeepSeek V4 Pro", + "id": "minimax/MiniMax-M3", + "name": "MiniMax-M3", + "display_name": "MiniMax-M3", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 524288, + "output": 512000 }, "temperature": true, "tool_call": true, @@ -112453,52 +110065,30 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." - ] + "supported": true } }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "release_date": "2026-06-01", + "last_updated": "2026-06-01", "type": "chat" }, { - "id": "gemini-2.5-flash", - "name": "Gemini 2.5 Flash", - "display_name": "Gemini 2.5 Flash", + "id": "minimax/MiniMax-M2.1", + "name": "MiniMax-M2.1", + "display_name": "MiniMax-M2.1", "modalities": { "input": [ - "text", - "image", - "audio", - "video", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 204800, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -112508,244 +110098,152 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "budget", - "budget": { - "default": -1, - "min": 0, - "max": 24576, - "auto": -1, - "off": 0, - "unit": "tokens" - }, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] + "supported": true } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-06-17", - "last_updated": "2025-06-17", + "attachment": false, + "open_weights": true, + "release_date": "2025-12-23", + "last_updated": "2025-12-23", "type": "chat" }, { - "id": "claude-sonnet-4-6", - "name": "Claude Sonnet 4.6", - "display_name": "Claude Sonnet 4.6", + "id": "ovhcloud/gpt-oss-20b", + "name": "GPT OSS 20B (OVHcloud)", + "display_name": "GPT OSS 20B (OVHcloud)", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 64000 + "context": 131072, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", "effort_options": [ "low", "medium", - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." + "high" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-17", - "last_updated": "2026-03-13", + "attachment": false, + "open_weights": true, + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "claude-opus-4-8", - "name": "Claude Opus 4.8", - "display_name": "Claude Opus 4.8", + "id": "ovhcloud/gpt-oss-120b", + "name": "GPT OSS 120B (OVHcloud)", + "display_name": "GPT OSS 120B (OVHcloud)", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 131072, + "output": 32768 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "high", "effort_options": [ "low", "medium", - "high", - "xhigh", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." + "high" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-01", - "release_date": "2026-05-28", - "last_updated": "2026-05-28", + "attachment": false, + "open_weights": true, + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "claude-fable-5", - "name": "Claude Fable 5", - "display_name": "Claude Fable 5", + "id": "cohere/command-a-03-2025", + "name": "Command A", + "display_name": "Command A", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 288000, + "output": 8000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", - "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", - "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." - ] - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-09", - "last_updated": "2026-06-09", + "attachment": false, + "open_weights": true, + "knowledge": "2024-06-01", + "release_date": "2025-03-13", + "last_updated": "2025-03-13", "type": "chat" }, { - "id": "qwen/qwen3.7-plus", - "name": "Qwen3.7 Plus", - "display_name": "Qwen3.7 Plus", + "id": "cohere/c4ai-aya-expanse-32b", + "name": "Aya Expanse 32B", + "display_name": "Aya Expanse 32B", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 64000 + "context": 128000, + "output": 4000 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-04", - "release_date": "2026-06-02", - "last_updated": "2026-06-02", + "attachment": false, + "open_weights": true, + "release_date": "2024-10-24", + "last_updated": "2024-10-24", "type": "chat" }, { - "id": "qwen/qwen3.7-max", - "name": "Qwen3.7 Max", - "display_name": "Qwen3.7 Max", + "id": "cohere/command-r-08-2024", + "name": "Command R", + "display_name": "Command R", "modalities": { "input": [ "text" @@ -112755,135 +110253,93 @@ ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 128000, + "output": 4000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2026-05-21", - "last_updated": "2026-05-21", + "open_weights": true, + "knowledge": "2024-06-01", + "release_date": "2024-08-30", + "last_updated": "2024-08-30", "type": "chat" - } - ] - }, - "tempr": { - "id": "tempr", - "name": "Tempr Gateway", - "display_name": "Tempr Gateway", - "api": "https://api.temprhq.io/v1", - "doc": "https://temprhq.io/docs/gateway-reference.html", - "models": [ + }, { - "id": "xai/grok-4.3", - "name": "Grok 4.3", - "display_name": "Grok 4.3", + "id": "cohere/command-r7b-12-2024", + "name": "Command R7B", + "display_name": "Command R7B", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 30000 + "context": 132000, + "output": 4000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ] - } + "supported": false }, - "attachment": true, - "open_weights": false, - "release_date": "2026-04-17", - "last_updated": "2026-04-17", + "attachment": false, + "open_weights": true, + "knowledge": "2024-06-01", + "release_date": "2024-12-13", + "last_updated": "2024-12-13", "type": "chat" }, { - "id": "xai/grok-4.5", - "name": "Grok 4.5", - "display_name": "Grok 4.5", + "id": "cohere/command-r-plus-08-2024", + "name": "Command R+", + "display_name": "Command R+", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 500000, - "output": 500000 + "context": 128000, + "output": 4000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ] - } + "supported": false }, - "attachment": true, - "open_weights": false, - "release_date": "2026-07-08", - "last_updated": "2026-07-08", + "attachment": false, + "open_weights": true, + "knowledge": "2024-06-01", + "release_date": "2024-08-30", + "last_updated": "2024-08-30", "type": "chat" }, { - "id": "xai/grok-4.20-0309-non-reasoning", - "name": "Grok 4.20 (Non-Reasoning)", - "display_name": "Grok 4.20 (Non-Reasoning)", + "id": "arkanecloud/ministral-14b", + "name": "Ministral 14B (Arkanecloud)", + "display_name": "Ministral 14B (Arkanecloud)", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 30000 + "context": 32768, + "output": 262144 }, "temperature": true, "tool_call": true, @@ -112891,134 +110347,110 @@ "supported": false }, "attachment": true, - "open_weights": false, - "release_date": "2026-03-09", - "last_updated": "2026-03-09", + "open_weights": true, + "release_date": "2025-12-02", + "last_updated": "2025-12-02", "type": "chat" }, { - "id": "xai/grok-4.20-0309-reasoning", - "name": "Grok 4.20 (Reasoning)", - "display_name": "Grok 4.20 (Reasoning)", + "id": "arkanecloud/meta-llama/Llama-3.1-8B-Instruct", + "name": "Llama-3.1-8B-Instruct (Arkanecloud)", + "display_name": "Llama-3.1-8B-Instruct (Arkanecloud)", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 30000 + "context": 131072, + "output": 4096 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": true, - "open_weights": false, - "release_date": "2026-03-09", - "last_updated": "2026-03-09", + "attachment": false, + "open_weights": true, + "knowledge": "2023-12", + "release_date": "2024-07-23", + "last_updated": "2024-07-23", "type": "chat" }, { - "id": "xai/grok-4.7", - "name": "Grok 4.7", - "display_name": "Grok 4.7", + "id": "arkanecloud/meta-llama/Llama-3.3-70B-Instruct", + "name": "Llama-3.3-70B-Instruct (Arkanecloud)", + "display_name": "Llama-3.3-70B-Instruct (Arkanecloud)", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 500000, - "output": 500000 + "context": 128000, + "output": 4096 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ] - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-05", - "release_date": "2026-09-21", - "last_updated": "2026-09-21", + "attachment": false, + "open_weights": true, + "knowledge": "2023-12", + "release_date": "2024-12-06", + "last_updated": "2024-12-06", "type": "chat" }, { - "id": "xai/grok-build-0.1", - "name": "Grok Build 0.1", - "display_name": "Grok Build 0.1", + "id": "arkanecloud/meta-llama/Llama-3.1-70B-Instruct", + "name": "Llama-3.1-70B-Instruct (Arkanecloud)", + "display_name": "Llama-3.1-70B-Instruct (Arkanecloud)", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 256000 + "context": 131072, + "output": 4096 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, - "attachment": true, - "open_weights": false, - "release_date": "2026-04-16", - "last_updated": "2026-04-16", + "attachment": false, + "open_weights": true, + "knowledge": "2023-12", + "release_date": "2024-07-23", + "last_updated": "2024-07-23", "type": "chat" }, { - "id": "xai/grok-4.6", - "name": "Grok 4.6", - "display_name": "Grok 4.6", + "id": "arkanecloud/openai/gpt-oss-20b", + "name": "GPT OSS 20B (Arkanecloud)", + "display_name": "GPT OSS 20B (Arkanecloud)", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 500000, - "output": 500000 + "context": 131072, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -113032,22 +110464,21 @@ "effort_options": [ "low", "medium", - "high", - "xhigh" + "high" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-02-01", - "release_date": "2026-08-12", - "last_updated": "2026-08-12", + "attachment": false, + "open_weights": true, + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "cerebras/gpt-oss-120b", - "name": "GPT OSS 120B", - "display_name": "GPT OSS 120B", + "id": "arkanecloud/openai/gpt-oss-120b", + "name": "GPT OSS 120B (Arkanecloud)", + "display_name": "GPT OSS 120B (Arkanecloud)", "modalities": { "input": [ "text" @@ -113058,7 +110489,7 @@ }, "limit": { "context": 131072, - "output": 40960 + "output": 32768 }, "temperature": true, "tool_call": true, @@ -113084,21 +110515,20 @@ "type": "chat" }, { - "id": "cerebras/qwen-3.8-27b", - "name": "Qwen3.8 27B", - "display_name": "Qwen3.8 27B", + "id": "arkanecloud/nvidia/nemotron-3-super-120b-a12b", + "name": "Nemotron 3 Super 120B A12B (Arkanecloud)", + "display_name": "Nemotron 3 Super 120B A12B (Arkanecloud)", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 40960 + "context": 256000, + "output": 262144 }, "temperature": true, "tool_call": true, @@ -113111,36 +110541,34 @@ "effort_options": [ "none", "low", - "medium", - "high" + "medium" ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "knowledge": "2025-06", + "release_date": "2026-03-11", + "last_updated": "2026-03-11", "type": "chat" }, { - "id": "moonshot/kimi-k2.7-code", - "name": "Kimi K2.7 Code", - "display_name": "Kimi K2.7 Code", + "id": "arkanecloud/nvidia/nemotron-3-ultra-550b-a55b", + "name": "Nemotron 3 Ultra 550B A55B (Arkanecloud)", + "display_name": "Nemotron 3 Ultra 550B A55B (Arkanecloud)", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 512288, + "output": 128000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -113148,61 +110576,56 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "effort_options": [ + "none", + "medium", + "high" + ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-06-12", - "last_updated": "2026-06-12", + "knowledge": "2025-09", + "release_date": "2026-06-04", + "last_updated": "2026-06-04", "type": "chat" }, { - "id": "moonshot/kimi-k2.6", - "name": "Kimi K2.6", - "display_name": "Kimi K2.6", + "id": "arkanecloud/Qwen/Qwen3-235B-A22B-Instruct-2507", + "name": "Qwen3 235B-A22B Instruct 2507 (Arkanecloud)", + "display_name": "Qwen3 235B-A22B Instruct 2507 (Arkanecloud)", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 262000, + "output": 16384 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-20", - "last_updated": "2026-04-20", + "release_date": "2025-07-21", + "last_updated": "2025-07-21", "type": "chat" }, { - "id": "moonshot/kimi-k3", - "name": "Kimi K3", - "display_name": "Kimi K3", + "id": "arkanecloud/deepseek-ai/DeepSeek-V4.1-Flash", + "name": "DeepSeek V4.1 Flash (Arkanecloud)", + "display_name": "DeepSeek V4.1 Flash (Arkanecloud)", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" @@ -113210,9 +110633,9 @@ }, "limit": { "context": 1048576, - "output": 131072 + "output": 384000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -113222,6 +110645,7 @@ "reasoning": { "supported": true, "effort_options": [ + "none", "low", "high", "max" @@ -113230,29 +110654,32 @@ }, "attachment": true, "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-16", + "knowledge": "2025-05", + "release_date": "2026-09-10", + "last_updated": "2026-09-10", "type": "chat" }, { - "id": "moonshot/kimi-k2.7-code-highspeed", - "name": "Kimi K2.7 Code Highspeed", - "display_name": "Kimi K2.7 Code Highspeed", + "id": "google/gemini-3.1-pro-preview", + "name": "Gemini 3.1 Pro Preview", + "display_name": "Gemini 3.1 Pro Preview", "modalities": { "input": [ "text", "image", - "video" + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1048576, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -113260,20 +110687,32 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "low", + "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] } }, "attachment": true, - "open_weights": true, + "open_weights": false, "knowledge": "2025-01", - "release_date": "2026-06-12", - "last_updated": "2026-06-12", + "release_date": "2026-02-19", + "last_updated": "2026-02-19", "type": "chat" }, { - "id": "google/gemini-flash-latest", - "name": "Gemini Flash Latest", - "display_name": "Gemini Flash Latest", + "id": "google/gemini-3-flash-preview", + "name": "Gemini 3 Flash Preview", + "display_name": "Gemini 3 Flash Preview", "modalities": { "input": [ "text", @@ -113298,59 +110737,34 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", "low", "medium", "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-08-13", - "last_updated": "2026-08-13", - "type": "chat" - }, - { - "id": "google/gemma-4-31b-it", - "name": "Gemma 4 31B IT", - "display_name": "Gemma 4 31B IT", - "modalities": { - "input": [ - "text", - "image" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 262144, - "output": 32768 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, - "attachment": true, - "open_weights": true, "knowledge": "2025-01", - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "release_date": "2025-12-17", + "last_updated": "2025-12-17", "type": "chat" }, { - "id": "google/gemini-3.5-flash", - "name": "Gemini 3.5 Flash", - "display_name": "Gemini 3.5 Flash", + "id": "google/gemini-3.1-pro-preview-customtools", + "name": "Gemini 3.1 Pro Preview Custom Tools", + "display_name": "Gemini 3.1 Pro Preview Custom Tools", "modalities": { "input": [ "text", @@ -113380,9 +110794,7 @@ "mode": "level", "level": "high", "level_options": [ - "minimal", "low", - "medium", "high" ], "summaries": true, @@ -113395,38 +110807,10 @@ "attachment": true, "open_weights": false, "knowledge": "2025-01", - "release_date": "2026-05-19", - "last_updated": "2026-05-19", + "release_date": "2026-02-19", + "last_updated": "2026-02-19", "type": "chat" }, - { - "id": "google/gemini-embedding-001", - "name": "Gemini Embedding 001", - "display_name": "Gemini Embedding 001", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 2048, - "output": 1 - }, - "temperature": false, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": false, - "knowledge": "2025-05", - "release_date": "2025-05-20", - "last_updated": "2025-05-20", - "type": "embedding" - }, { "id": "google/gemini-3.5-flash-lite", "name": "Gemini 3.5 Flash Lite", @@ -113472,9 +110856,9 @@ "type": "chat" }, { - "id": "google/gemini-3.1-pro-preview", - "name": "Gemini 3.1 Pro Preview", - "display_name": "Gemini 3.1 Pro Preview", + "id": "google/gemini-flash-latest", + "name": "Gemini Flash Latest (Gemini 3.8 Flash)", + "display_name": "Gemini Flash Latest (Gemini 3.8 Flash)", "modalities": { "input": [ "text", @@ -113499,32 +110883,23 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ + "effort_options": [ "low", + "medium", "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-02-19", - "last_updated": "2026-02-19", + "release_date": "2026-09-02", + "last_updated": "2026-09-02", "type": "chat" }, { - "id": "google/gemini-3.8-flash", - "name": "Gemini 3.8 Flash", - "display_name": "Gemini 3.8 Flash", + "id": "google/gemini-pro-latest", + "name": "Gemini Pro Latest (Gemini 4 Argon)", + "display_name": "Gemini Pro Latest (Gemini 4 Argon)", "modalities": { "input": [ "text", @@ -113541,7 +110916,7 @@ "context": 1048576, "output": 65536 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -113549,47 +110924,38 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", + "effort_options": [ "low", "medium", "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-09-02", - "last_updated": "2026-09-02", + "knowledge": "2026-03", + "release_date": "2026-10-13", + "last_updated": "2026-10-13", "type": "chat" }, { - "id": "google/gemini-3.7-flash", - "name": "Gemini 3.7 Flash", - "display_name": "Gemini 3.7 Flash", + "id": "google/gemini-robotics-er-2-preview", + "name": "Gemini Robotics-ER 2 Preview", + "display_name": "Gemini Robotics-ER 2 Preview", "modalities": { "input": [ "text", "image", - "video", + "pdf", "audio", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1048576, + "context": 131072, "output": 65536 }, "temperature": true, @@ -113600,34 +110966,24 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ + "effort_options": [ "minimal", "low", "medium", "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-08-13", - "last_updated": "2026-08-13", + "release_date": "2026-07-30", + "last_updated": "2026-07-30", "type": "chat" }, { - "id": "google/gemini-flash-lite-latest", - "name": "Gemini Flash-Lite Latest", - "display_name": "Gemini Flash-Lite Latest", + "id": "google/gemini-3.1-flash-lite-preview", + "name": "Gemini 3.1 Flash Lite Preview", + "display_name": "Gemini 3.1 Flash Lite Preview", "modalities": { "input": [ "text", @@ -113662,15 +111018,15 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-07-21", - "last_updated": "2026-07-21", + "knowledge": "2025-01", + "release_date": "2026-03-03", + "last_updated": "2026-03-03", "type": "chat" }, { - "id": "google/gemini-3-flash-preview", - "name": "Gemini 3 Flash Preview", - "display_name": "Gemini 3 Flash Preview", + "id": "google/gemini-3.1-flash-lite", + "name": "Gemini 3.1 Flash Lite", + "display_name": "Gemini 3.1 Flash Lite", "modalities": { "input": [ "text", @@ -113696,40 +111052,29 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ + "effort_options": [ "minimal", "low", "medium", "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" ] } }, "attachment": true, "open_weights": false, "knowledge": "2025-01", - "release_date": "2025-12-17", - "last_updated": "2025-12-17", + "release_date": "2026-05-07", + "last_updated": "2026-05-07", "type": "chat" }, { - "id": "google/gemini-3.6-flash", - "name": "Gemini 3.6 Flash", - "display_name": "Gemini 3.6 Flash", + "id": "google/deep-research-max-preview-04-2026", + "name": "Deep Research Max Preview", + "display_name": "Deep Research Max Preview", "modalities": { "input": [ "text", - "image", - "video", - "audio", - "pdf" + "image" ], "output": [ "text" @@ -113739,8 +111084,39 @@ "context": 1048576, "output": 65536 }, + "temperature": false, + "tool_call": false, + "reasoning": { + "supported": true, + "default": true + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2026-04-21", + "last_updated": "2026-04-21", + "type": "chat" + }, + { + "id": "google/gemini-3.1-flash-image", + "name": "Nano Banana 2", + "display_name": "Nano Banana 2", + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text", + "image" + ] + }, + "limit": { + "context": 65536, + "output": 32768 + }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true @@ -113748,51 +111124,38 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ + "effort_options": [ "minimal", - "low", - "medium", "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-07-21", - "last_updated": "2026-07-21", - "type": "chat" + "knowledge": "2025-01", + "release_date": "2026-05-28", + "last_updated": "2026-05-28" }, { - "id": "google/gemini-3.1-pro-preview-customtools", - "name": "Gemini 3.1 Pro Preview Custom Tools", - "display_name": "Gemini 3.1 Pro Preview Custom Tools", + "id": "google/gemini-3.1-flash-image-preview", + "name": "Nano Banana 2 Preview", + "display_name": "Nano Banana 2 Preview", "modalities": { "input": [ - "text", "image", - "video", - "audio", - "pdf" + "text" ], "output": [ - "text" + "text", + "image" ] }, "limit": { - "context": 1048576, + "context": 65536, "output": 65536 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true @@ -113800,38 +111163,27 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "low", + "effort_options": [ + "none", + "minimal", "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" ] } }, "attachment": true, "open_weights": false, "knowledge": "2025-01", - "release_date": "2026-02-19", - "last_updated": "2026-02-19", - "type": "chat" + "release_date": "2026-02-26", + "last_updated": "2026-02-26" }, { - "id": "google/gemini-3.1-flash-lite", - "name": "Gemini 3.1 Flash Lite", - "display_name": "Gemini 3.1 Flash Lite", + "id": "google/deep-research-preview-04-2026", + "name": "Gemini Deep Research Preview", + "display_name": "Gemini Deep Research Preview", "modalities": { "input": [ "text", - "image", - "video", - "audio", - "pdf" + "image" ], "output": [ "text" @@ -113841,110 +111193,124 @@ "context": 1048576, "output": 65536 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "minimal", - "low", - "medium", - "high" - ] - } - }, "attachment": true, "open_weights": false, "knowledge": "2025-01", - "release_date": "2026-05-07", - "last_updated": "2026-05-07", + "release_date": "2026-04-21", + "last_updated": "2026-04-21", "type": "chat" }, { - "id": "google/gemma-4-26b-a4b-it", - "name": "Gemma 4 26B A4B IT", - "display_name": "Gemma 4 26B A4B IT", + "id": "google/gemini-3-pro-image", + "name": "Nano Banana Pro", + "display_name": "Nano Banana Pro", "modalities": { "input": [ "text", "image" ], "output": [ - "text" + "text", + "image" ] }, "limit": { - "context": 262144, + "context": 65536, "output": 32768 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "low", + "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-04-02", - "last_updated": "2026-04-02", - "type": "chat" + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2026-05-28", + "last_updated": "2026-05-28" }, { - "id": "google/gemini-embedding-2", - "name": "Gemini Embedding 2", - "display_name": "Gemini Embedding 2", + "id": "google/gemini-nano-banana-2.1", + "name": "Nano Banana 2.1", + "display_name": "Nano Banana 2.1", "modalities": { "input": [ + "image", "text" ], "output": [ - "text" + "text", + "image" ] }, "limit": { - "context": 8192, - "output": 1 + "context": 65536, + "output": 32768 }, "temperature": false, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "minimal", + "medium", + "high" + ] + } + }, + "attachment": true, "open_weights": false, - "knowledge": "2025-11", - "release_date": "2026-04-22", - "last_updated": "2026-04-22", - "type": "embedding" + "release_date": "2026-10-06", + "last_updated": "2026-10-06" }, { - "id": "minimax/MiniMax-M2.7-highspeed", - "name": "MiniMax-M2.7-highspeed", - "display_name": "MiniMax-M2.7-highspeed", + "id": "google/gemini-3.1-flash-lite-image", + "name": "Nano Banana 2 Lite", + "display_name": "Nano Banana 2 Lite", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ - "text" + "text", + "image" ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 65536, + "output": 4096 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true @@ -113952,38 +111318,69 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "minimal", + "high" ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-03-18", - "last_updated": "2026-03-18", - "type": "chat" + "attachment": true, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2026-06-30", + "last_updated": "2026-06-30" }, { - "id": "minimax/MiniMax-M2.7", - "name": "MiniMax-M2.7", - "display_name": "MiniMax-M2.7", + "id": "google/gemini-2.5-flash-image", + "name": "Nano Banana", + "display_name": "Nano Banana", "modalities": { "input": [ - "text" + "audio", + "image", + "text", + "video" ], "output": [ - "text" + "text", + "image" ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 32768, + "output": 32768 }, "temperature": true, - "tool_call": true, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": false, + "knowledge": "2024-06", + "release_date": "2025-08-26", + "last_updated": "2025-08-26" + }, + { + "id": "google/gemini-3-pro-image-preview", + "name": "Nano Banana Pro Preview", + "display_name": "Nano Banana Pro Preview", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text", + "image" + ] + }, + "limit": { + "context": 65536, + "output": 32768 + }, + "temperature": true, + "tool_call": false, "reasoning": { "supported": true, "default": true @@ -113991,29 +111388,37 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "low", + "high" + ], "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" + "thought_signatures" ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-03-18", - "last_updated": "2026-03-18", - "type": "chat" + "attachment": true, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2025-11-20", + "last_updated": "2025-11-20" }, { - "id": "minimax/MiniMax-M3", - "name": "MiniMax-M3", - "display_name": "MiniMax-M3", + "id": "google/gemini-4-argon", + "name": "Gemini 4 Argon", + "display_name": "Gemini 4 Argon", "modalities": { "input": [ "text", "image", - "video" + "video", + "audio", + "pdf" ], "output": [ "text" @@ -114021,9 +111426,9 @@ }, "limit": { "context": 1048576, - "output": 512000 + "output": 65536 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -114031,25 +111436,31 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "effort_options": [ + "low", + "medium", + "high" + ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-06-01", - "last_updated": "2026-06-01", + "open_weights": false, + "knowledge": "2026-03", + "release_date": "2026-10-13", + "last_updated": "2026-10-13", "type": "chat" }, { - "id": "xiaomi-mimo/mimo-v2.6-pro", - "name": "MiMo-V2.6-Pro", - "display_name": "MiMo-V2.6-Pro", + "id": "google/gemini-3.7-flash", + "name": "Gemini 3.7 Flash", + "display_name": "Gemini 3.7 Flash", "modalities": { "input": [ "text", "image", + "video", "audio", - "video" + "pdf" ], "output": [ "text" @@ -114057,7 +111468,7 @@ }, "limit": { "context": 1048576, - "output": 131072 + "output": 65536 }, "temperature": true, "tool_call": true, @@ -114065,22 +111476,43 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", + "low", + "medium", + "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] + } + }, "attachment": true, - "open_weights": true, - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "open_weights": false, + "knowledge": "2026-03", + "release_date": "2026-08-13", + "last_updated": "2026-08-13", "type": "chat" }, { - "id": "xiaomi-mimo/mimo-v2.6-pro-ultraspeed", - "name": "MiMo-V2.6-Pro-UltraSpeed", - "display_name": "MiMo-V2.6-Pro-UltraSpeed", + "id": "google/gemini-3.5-flash", + "name": "Gemini 3.5 Flash", + "display_name": "Gemini 3.5 Flash", "modalities": { "input": [ "text", "image", + "video", "audio", - "video" + "pdf" ], "output": [ "text" @@ -114088,7 +111520,7 @@ }, "limit": { "context": 1048576, - "output": 131072 + "output": 65536 }, "temperature": true, "tool_call": true, @@ -114096,22 +111528,43 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", + "low", + "medium", + "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] + } + }, "attachment": true, - "open_weights": true, - "release_date": "2026-09-21", - "last_updated": "2026-09-21", + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2026-05-19", + "last_updated": "2026-05-19", "type": "chat" }, { - "id": "xiaomi-mimo/mimo-v2.6-flash", - "name": "MiMo-V2.6-Flash", - "display_name": "MiMo-V2.6-Flash", + "id": "google/gemini-3.8-flash", + "name": "Gemini 3.8 Flash", + "display_name": "Gemini 3.8 Flash", "modalities": { "input": [ "text", "image", + "video", "audio", - "video" + "pdf" ], "output": [ "text" @@ -114119,7 +111572,7 @@ }, "limit": { "context": 1048576, - "output": 131072 + "output": 65536 }, "temperature": true, "tool_call": true, @@ -114127,28 +111580,50 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", + "low", + "medium", + "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] + } + }, "attachment": true, - "open_weights": true, - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "open_weights": false, + "release_date": "2026-09-02", + "last_updated": "2026-09-02", "type": "chat" }, { - "id": "mistral/mistral-small-latest", - "name": "Mistral Small (latest)", - "display_name": "Mistral Small (latest)", + "id": "google/gemini-3.6-flash", + "name": "Gemini 3.6 Flash", + "display_name": "Gemini 3.6 Flash", "modalities": { "input": [ "text", - "image" + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 256000 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -114158,35 +111633,47 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "none", + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", + "low", + "medium", "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-06", - "release_date": "2026-03-16", - "last_updated": "2026-03-16", + "open_weights": false, + "knowledge": "2026-03", + "release_date": "2026-07-21", + "last_updated": "2026-07-21", "type": "chat" }, { - "id": "mistral/mistral-large-2512", - "name": "Mistral Large 3", - "display_name": "Mistral Large 3", + "id": "azure/gpt-4.1-nano", + "name": "GPT-4.1 nano (Azure)", + "display_name": "GPT-4.1 nano (Azure)", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1047576, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -114194,122 +111681,187 @@ "supported": false }, "attachment": true, - "open_weights": true, - "knowledge": "2024-11", - "release_date": "2025-12-02", - "last_updated": "2025-12-02", + "open_weights": false, + "knowledge": "2024-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", "type": "chat" }, { - "id": "mistral/mistral-embed", - "name": "Mistral Embed", - "display_name": "Mistral Embed", + "id": "azure/gpt-5.1-codex-mini", + "name": "GPT-5.1 Codex mini (Azure)", + "display_name": "GPT-5.1 Codex mini (Azure)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 8000, - "output": 3072 + "context": 272000, + "output": 128000 }, "temperature": false, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, "open_weights": false, - "release_date": "2023-12-11", - "last_updated": "2023-12-11", - "type": "embedding" + "knowledge": "2024-09-30", + "release_date": "2025-11-13", + "last_updated": "2025-11-13", + "type": "chat" }, { - "id": "mistral/mistral-medium-latest", - "name": "Mistral Medium (latest)", - "display_name": "Mistral Medium (latest)", + "id": "azure/gpt-5.1-codex", + "name": "GPT-5.1 Codex (Azure)", + "display_name": "GPT-5.1 Codex (Azure)", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 272000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", "effort_options": [ "none", + "low", + "medium", "high" - ] + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, - "open_weights": true, - "release_date": "2026-04-29", - "last_updated": "2026-04-29", + "open_weights": false, + "knowledge": "2024-09-30", + "release_date": "2025-11-13", + "last_updated": "2025-11-13", "type": "chat" }, { - "id": "mistral/voxtral-small-latest", - "name": "Voxtral Small (latest)", - "display_name": "Voxtral Small (latest)", + "id": "azure/gpt-5.1-codex-max", + "name": "GPT-5.1 Codex Max (Azure)", + "display_name": "GPT-5.1 Codex Max (Azure)", "modalities": { "input": [ "text", - "audio" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 32000, - "output": 32000 + "context": 272000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } }, "attachment": true, - "open_weights": true, - "release_date": "2025-07-15", - "last_updated": "2025-07-15", + "open_weights": false, + "knowledge": "2024-09-30", + "release_date": "2025-11-13", + "last_updated": "2025-11-13", "type": "chat" }, { - "id": "mistral/mistral-medium-2604", - "name": "Mistral Medium 3.5", - "display_name": "Mistral Medium 3.5", + "id": "azure/gpt-5.2-codex", + "name": "GPT-5.2 Codex (Azure)", + "display_name": "GPT-5.2 Codex (Azure)", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 272000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -114317,34 +111869,47 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ - "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", "high" - ] + ], + "visibility": "hidden" } }, "attachment": true, - "open_weights": true, - "release_date": "2026-04-29", - "last_updated": "2026-04-29", + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2025-12-11", + "last_updated": "2025-12-11", "type": "chat" }, { - "id": "mistral/mistral-small-2603", - "name": "Mistral Small 4", - "display_name": "Mistral Small 4", + "id": "qwen/deepseek-v4-flash-0731", + "name": "DeepSeek V4 Flash 0731 (Alibaba)", + "display_name": "DeepSeek V4 Flash 0731 (Alibaba)", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 256000 + "context": 1000000, + "output": 384000 }, "temperature": true, "tool_call": true, @@ -114354,26 +111919,30 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ "none", - "high" + "low", + "high", + "max" ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2025-06", - "release_date": "2026-03-16", - "last_updated": "2026-03-16", + "knowledge": "2025-05", + "release_date": "2026-07-31", + "last_updated": "2026-07-31", "type": "chat" }, { - "id": "mistral/zai-glm-5-3", - "name": "GLM-5.3", - "display_name": "GLM-5.3", + "id": "qwen/deepseek-v4.1-flash", + "name": "DeepSeek V4.1 Flash (Alibaba)", + "display_name": "DeepSeek V4.1 Flash (Alibaba)", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" @@ -114381,7 +111950,7 @@ }, "limit": { "context": 1000000, - "output": 131072 + "output": 384000 }, "temperature": true, "tool_call": true, @@ -114391,23 +111960,26 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ + "none", "low", "high", "max" ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "knowledge": "2025-05", + "release_date": "2026-09-10", + "last_updated": "2026-09-10", "type": "chat" }, { - "id": "mistral/zai-glm-5-2", - "name": "GLM-5.2", - "display_name": "GLM-5.2", + "id": "qwen/qwen3.8-2.4t-a95b", + "name": "Qwen3.8 2.4T A95B", + "display_name": "Qwen3.8 2.4T A95B", "modalities": { "input": [ "text" @@ -114428,52 +112000,92 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ - "none", - "high", - "max" + "low", + "medium", + "xhigh" ] } }, "attachment": false, "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", - "type": "chat" + "release_date": "2026-08-12", + "last_updated": "2026-08-12", + "type": "chat" }, { - "id": "mistral/mistral-large-latest", - "name": "Mistral Large (latest)", - "display_name": "Mistral Large (latest)", + "id": "qwen/qwen3.8-max", + "name": "Qwen3.8 Max", + "display_name": "Qwen3.8 Max", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "none", + "low", + "medium", + "xhigh" + ] + } }, "attachment": true, - "open_weights": true, - "knowledge": "2024-11", - "release_date": "2024-11-01", - "last_updated": "2025-12-02", + "open_weights": false, + "release_date": "2026-08-03", + "last_updated": "2026-08-03", "type": "chat" }, { - "id": "deepseek/deepseek-v4-pro", - "name": "DeepSeek V4 Pro", - "display_name": "DeepSeek V4 Pro", + "id": "qwen/qwen-mt-plus", + "name": "Qwen MT Plus", + "display_name": "Qwen MT Plus", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 4096, + "output": 8192 + }, + "temperature": true, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": false, + "release_date": "2025-07-24", + "last_updated": "2025-07-24", + "type": "chat" + }, + { + "id": "qwen/qwen-max", + "name": "Qwen Max", + "display_name": "Qwen Max", "modalities": { "input": [ "text" @@ -114482,9 +112094,40 @@ "text" ] }, + "limit": { + "context": 32768, + "output": 8192 + }, + "temperature": true, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": false, + "knowledge": "2024-04", + "release_date": "2024-04-03", + "last_updated": "2025-01-25", + "type": "chat" + }, + { + "id": "qwen/qwen3.8-omni-flash", + "name": "Qwen3.8 Omni Flash", + "display_name": "Qwen3.8 Omni Flash", + "modalities": { + "input": [ + "text", + "image", + "audio", + "video" + ], + "output": [ + "text" + ] + }, "limit": { "context": 1000000, - "output": 384000 + "output": 131072 }, "temperature": true, "tool_call": true, @@ -114494,36 +112137,52 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", "effort_options": [ + "none", "low", - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." + "medium", + "xhigh" ] } }, + "attachment": true, + "open_weights": false, + "release_date": "2026-09-17", + "last_updated": "2026-09-17", + "type": "chat" + }, + { + "id": "qwen/qwen3-coder-flash", + "name": "Qwen3 Coder Flash", + "display_name": "Qwen3 Coder Flash", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1000000, + "output": 65536 + }, + "temperature": true, + "tool_call": false, + "reasoning": { + "supported": false + }, "attachment": false, - "open_weights": true, - "release_date": "2026-08-13", - "last_updated": "2026-08-22", + "open_weights": false, + "knowledge": "2025-04", + "release_date": "2025-07-28", + "last_updated": "2025-07-28", "type": "chat" }, { - "id": "deepseek/deepseek-flash", - "name": "DeepSeek V4.1 Flash", - "display_name": "DeepSeek V4.1 Flash", + "id": "qwen/deepseek-v4.1-flash-1017", + "name": "DeepSeek V4.1 Flash 1017 (Alibaba)", + "display_name": "DeepSeek V4.1 Flash 1017 (Alibaba)", "modalities": { "input": [ "text", @@ -114546,6 +112205,7 @@ "extra_capabilities": { "reasoning": { "effort_options": [ + "none", "low", "high", "max" @@ -114555,71 +112215,60 @@ "attachment": true, "open_weights": true, "knowledge": "2025-05", - "release_date": "2026-09-10", - "last_updated": "2026-09-10", + "release_date": "2026-10-17", + "last_updated": "2026-10-17", "type": "chat" }, { - "id": "anthropic/claude-haiku-4-5-20251001", - "name": "Claude Haiku 4.5", - "display_name": "Claude Haiku 4.5", + "id": "qwen/qwen3.8-flash", + "name": "Qwen3.8 Flash", + "display_name": "Qwen3.8 Flash", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + "effort_options": [ + "none", + "low", + "medium", + "xhigh" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-02-28", - "release_date": "2025-10-15", - "last_updated": "2025-10-15", + "release_date": "2026-08-26", + "last_updated": "2026-08-26", "type": "chat" }, { - "id": "anthropic/claude-opus-4-7", - "name": "Claude Opus 4.7", - "display_name": "Claude Opus 4.7", + "id": "qwen/qwen3.8-max-0902", + "name": "Qwen3.8 Max 0902", + "display_name": "Qwen3.8 Max 0902", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" @@ -114627,155 +112276,161 @@ }, "limit": { "context": 1000000, - "output": 128000 + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "high", "effort_options": [ + "none", "low", "medium", - "high", - "xhigh", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." + "xhigh" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-04-16", - "last_updated": "2026-04-16", + "release_date": "2026-09-02", + "last_updated": "2026-09-02", "type": "chat" }, { - "id": "anthropic/claude-sonnet-4-5", - "name": "Claude Sonnet 4.5 (latest)", - "display_name": "Claude Sonnet 4.5 (latest)", + "id": "qwen/qwen3.8-27b", + "name": "Qwen3.8 27B", + "display_name": "Qwen3.8 27B", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 1000000, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + "effort_options": [ + "none", + "low", + "medium", + "xhigh" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-07-31", - "release_date": "2025-09-29", - "last_updated": "2025-09-29", + "open_weights": true, + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "anthropic/claude-haiku-4-5", - "name": "Claude Haiku 4.5 (latest)", - "display_name": "Claude Haiku 4.5 (latest)", + "id": "qwen/deepseek-v4-pro-0813", + "name": "DeepSeek V4 Pro 0813 (Alibaba)", + "display_name": "DeepSeek V4 Pro 0813 (Alibaba)", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 1000000, + "output": 384000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + "effort_options": [ + "none", + "low", + "high", + "max" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-02-28", - "release_date": "2025-10-15", - "last_updated": "2025-10-15", + "attachment": false, + "open_weights": true, + "release_date": "2026-08-13", + "last_updated": "2026-08-22", "type": "chat" }, { - "id": "anthropic/claude-fable-5-1", - "name": "Claude Fable 5.1", - "display_name": "Claude Fable 5.1", + "id": "cerebras/gpt-oss-120b", + "name": "GPT OSS 120B (Cerebras)", + "display_name": "GPT OSS 120B (Cerebras)", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 131072, + "output": 32768 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "low", + "medium", + "high" + ] + } + }, + "attachment": false, + "open_weights": true, + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", + "type": "chat" + } + ] + }, + "freemodel": { + "id": "freemodel", + "name": "FreeModel", + "display_name": "FreeModel", + "api": "https://cc.freemodel.dev/v1", + "doc": "https://freemodel.dev", + "models": [ + { + "id": "claude-fable-5", + "name": "Claude Fable 5", + "display_name": "Claude Fable 5", "modalities": { "input": [ "text", @@ -114824,15 +112479,15 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-09-01", - "last_updated": "2026-09-01", + "knowledge": "2026-01-31", + "release_date": "2026-06-09", + "last_updated": "2026-06-09", "type": "chat" }, { - "id": "anthropic/claude-sonnet-5", - "name": "Claude Sonnet 5", - "display_name": "Claude Sonnet 5", + "id": "gpt-5.4", + "name": "GPT-5.4", + "display_name": "GPT-5.4", "modalities": { "input": [ "text", @@ -114844,38 +112499,48 @@ ] }, "limit": { - "context": 1000000, + "context": 1050000, "output": 128000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", "effort_options": [ + "none", "low", "medium", "high", - "xhigh", - "max" - ] + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-30", - "last_updated": "2026-06-30", + "knowledge": "2025-08-31", + "release_date": "2026-03-05", + "last_updated": "2026-03-05", "type": "chat" }, { - "id": "anthropic/claude-opus-4-5", - "name": "Claude Opus 4.5 (latest)", - "display_name": "Claude Opus 4.5 (latest)", + "id": "claude-sonnet-4-6", + "name": "Claude Sonnet 4.6", + "display_name": "Claude Sonnet 4.6", "modalities": { "input": [ "text", @@ -114887,7 +112552,7 @@ ] }, "limit": { - "context": 200000, + "context": 1000000, "output": 64000 }, "temperature": true, @@ -114909,7 +112574,8 @@ "effort_options": [ "low", "medium", - "high" + "high", + "max" ], "interleaved": true, "summaries": true, @@ -114918,65 +112584,74 @@ "thinking_blocks" ], "notes": [ - "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-05", - "release_date": "2025-11-24", - "last_updated": "2025-11-24", + "knowledge": "2025-08-31", + "release_date": "2026-02-17", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "anthropic/claude-opus-5", - "name": "Claude Opus 5", - "display_name": "Claude Opus 5", + "id": "gpt-5.4-mini", + "name": "GPT-5.4 mini", + "display_name": "GPT-5.4 mini", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, + "context": 400000, "output": 128000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", "effort_options": [ + "none", "low", "medium", "high", - "xhigh", - "max" - ] + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2026-05", - "release_date": "2026-07-24", - "last_updated": "2026-07-24", + "knowledge": "2025-08-31", + "release_date": "2026-03-17", + "last_updated": "2026-03-17", "type": "chat" }, { - "id": "anthropic/claude-sonnet-4-6", - "name": "Claude Sonnet 4.6", - "display_name": "Claude Sonnet 4.6", + "id": "claude-opus-4-7", + "name": "Claude Opus 4.7", + "display_name": "Claude Opus 4.7", "modalities": { "input": [ "text", @@ -114989,9 +112664,9 @@ }, "limit": { "context": 1000000, - "output": 64000 + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -115001,41 +112676,39 @@ "reasoning": { "supported": true, "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, + "mode": "effort", "effort": "high", "effort_options": [ "low", "medium", "high", + "xhigh", "max" ], "interleaved": true, "summaries": true, - "visibility": "summary", + "visibility": "omitted", "continuation": [ "thinking_blocks" ], "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-17", - "last_updated": "2026-03-13", + "knowledge": "2026-01-31", + "release_date": "2026-04-16", + "last_updated": "2026-04-16", "type": "chat" }, { - "id": "anthropic/claude-opus-4-5-20251101", - "name": "Claude Opus 4.5", - "display_name": "Claude Opus 4.5", + "id": "gpt-5.3-codex", + "name": "GPT-5.3 Codex", + "display_name": "GPT-5.3 Codex", "modalities": { "input": [ "text", @@ -115047,51 +112720,45 @@ ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 400000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ "low", "medium", - "high" + "high", + "xhigh" ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" ], - "notes": [ - "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." - ] + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2025-05", - "release_date": "2025-11-24", - "last_updated": "2025-11-24", + "knowledge": "2025-08-31", + "release_date": "2026-02-05", + "last_updated": "2026-02-05", "type": "chat" }, { - "id": "anthropic/claude-opus-4-6", + "id": "claude-opus-4-6", "name": "Claude Opus 4.6", "display_name": "Claude Opus 4.6", "modalities": { @@ -115150,7 +112817,7 @@ "type": "chat" }, { - "id": "anthropic/claude-opus-4-8", + "id": "claude-opus-4-8", "name": "Claude Opus 4.8", "display_name": "Claude Opus 4.8", "modalities": { @@ -115207,9 +112874,9 @@ "type": "chat" }, { - "id": "anthropic/claude-sonnet-4-5-20250929", - "name": "Claude Sonnet 4.5", - "display_name": "Claude Sonnet 4.5", + "id": "claude-haiku-4-5-20251001", + "name": "Claude Haiku 4.5", + "display_name": "Claude Haiku 4.5", "modalities": { "input": [ "text", @@ -115253,15 +112920,15 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2025-07-31", - "release_date": "2025-09-29", - "last_updated": "2025-09-29", + "knowledge": "2025-02-28", + "release_date": "2025-10-15", + "last_updated": "2025-10-15", "type": "chat" }, { - "id": "anthropic/claude-fable-5", - "name": "Claude Fable 5", - "display_name": "Claude Fable 5", + "id": "gpt-5.5", + "name": "GPT-5.5", + "display_name": "GPT-5.5", "modalities": { "input": [ "text", @@ -115273,7 +112940,7 @@ ] }, "limit": { - "context": 1000000, + "context": 1050000, "output": 128000 }, "temperature": false, @@ -115287,51 +112954,57 @@ "supported": true, "default_enabled": true, "mode": "effort", - "effort": "high", + "effort": "medium", "effort_options": [ "low", "medium", "high", - "xhigh", - "max" + "xhigh" ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" ], - "notes": [ - "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", - "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", - "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." - ] + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-09", - "last_updated": "2026-06-09", + "knowledge": "2025-12-01", + "release_date": "2026-04-23", + "last_updated": "2026-04-23", "type": "chat" - }, + } + ] + }, + "vivgrid": { + "id": "vivgrid", + "name": "Vivgrid", + "display_name": "Vivgrid", + "api": "https://api.vivgrid.com/v1", + "doc": "https://docs.vivgrid.com/models", + "models": [ { - "id": "zai/glm-5.1", - "name": "GLM-5.1", - "display_name": "GLM-5.1", + "id": "gpt-6.1-terra", + "name": "GPT-6.1 Terra", + "display_name": "GPT-6.1 Terra", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 131072 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -115339,24 +113012,31 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-04-07", - "last_updated": "2026-04-07", + "attachment": true, + "open_weights": false, + "knowledge": "2026-06-01", + "release_date": "2026-10-26", + "last_updated": "2026-10-26", "type": "chat" }, { - "id": "zai/glm-5v-turbo", - "name": "GLM-5V-Turbo", - "display_name": "GLM-5V-Turbo", + "id": "claude-fable-5", + "name": "Claude Fable 5", + "display_name": "Claude Fable 5", "modalities": { "input": [ "text", "image", - "video", "pdf" ], "output": [ @@ -115364,36 +113044,67 @@ ] }, "limit": { - "context": 200000, - "output": 131072 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", + "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", + "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." + ] + } + }, "attachment": true, "open_weights": false, - "release_date": "2026-04-01", - "last_updated": "2026-04-01", + "knowledge": "2026-01-31", + "release_date": "2026-06-09", + "last_updated": "2026-06-09", "type": "chat" }, { - "id": "zai/glm-5", - "name": "GLM-5", - "display_name": "GLM-5", + "id": "gemini-3.1-pro-preview", + "name": "Gemini 3.1 Pro Preview", + "display_name": "Gemini 3.1 Pro Preview", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -115404,35 +113115,44 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "low", + "high" + ], "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" + "thought_signatures" ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-02-12", - "last_updated": "2026-02-12", + "attachment": true, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2026-02-19", + "last_updated": "2026-02-19", "type": "chat" }, { - "id": "zai/glm-4.6", - "name": "GLM-4.6", - "display_name": "GLM-4.6", + "id": "gpt-5.6-terra", + "name": "GPT 5.6 Terra", + "display_name": "GPT 5.6 Terra", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 1050000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -115442,20 +113162,38 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-09-30", - "last_updated": "2025-09-30", + "attachment": true, + "open_weights": false, + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "zai/glm-4.5-air", - "name": "GLM-4.5-Air", - "display_name": "GLM-4.5-Air", + "id": "glm-5.2", + "name": "GLM-5.2", + "display_name": "GLM-5.2", "modalities": { "input": [ "text" @@ -115465,8 +113203,8 @@ ] }, "limit": { - "context": 131072, - "output": 98304 + "context": 1000000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -115474,17 +113212,31 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "high", + "max" + ] + } + }, "attachment": false, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-07-28", - "last_updated": "2025-07-28", + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "zai/glm-5.3", - "name": "GLM-5.3", - "display_name": "GLM-5.3", + "id": "deepseek-v4-flash", + "name": "DeepSeek V4 Flash", + "display_name": "DeepSeek V4 Flash", "modalities": { "input": [ "text" @@ -115495,7 +113247,7 @@ }, "limit": { "context": 1000000, - "output": 131072 + "output": 384000 }, "temperature": true, "tool_call": true, @@ -115506,65 +113258,102 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", "effort_options": [ "low", "high", "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, "attachment": false, "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "knowledge": "2025-05", + "release_date": "2026-07-31", + "last_updated": "2026-07-31", "type": "chat" }, { - "id": "zai/glm-4.6v", - "name": "GLM-4.6V", - "display_name": "GLM-4.6V", + "id": "gpt-5.4", + "name": "GPT-5.4", + "display_name": "GPT-5.4", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 32768 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-12-08", - "last_updated": "2025-12-08", + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-03-05", + "last_updated": "2026-03-05", "type": "chat" }, { - "id": "zai/glm-5.2", - "name": "GLM-5.2", - "display_name": "GLM-5.2", + "id": "gpt-5.6-sol", + "name": "GPT 5.6 Sol", + "display_name": "GPT 5.6 Sol", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 1050000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -115575,58 +113364,94 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ "none", + "low", + "medium", "high", + "xhigh", "max" - ] + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "attachment": true, + "open_weights": false, + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "zai/glm-4.7-flashx", - "name": "GLM-4.7-FlashX", - "display_name": "GLM-4.7-FlashX", + "id": "gpt-5.4-mini", + "name": "GPT-5.4 Mini", + "display_name": "GPT-5.4 Mini", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 131072 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2026-01-19", - "last_updated": "2026-01-19", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-03-17", + "last_updated": "2026-03-17", "type": "chat" }, { - "id": "zai/glm-5.3-flashx", - "name": "GLM-5.3-FlashX", - "display_name": "GLM-5.3-FlashX", + "id": "viv-fast", + "name": "Viv Fast", + "display_name": "Viv Fast", "modalities": { "input": [ "text", - "image", - "video", - "pdf" + "image" ], "output": [ "text" @@ -115634,9 +113459,9 @@ }, "limit": { "context": 1000000, - "output": 131072 + "output": 256000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -115652,28 +113477,28 @@ } }, "attachment": true, - "open_weights": true, - "release_date": "2026-09-18", - "last_updated": "2026-09-18", + "open_weights": false, + "knowledge": "2026-09", + "release_date": "2026-09-21", + "last_updated": "2026-09-21", "type": "chat" }, { - "id": "zai/glm-4.5v", - "name": "GLM-4.5V", - "display_name": "GLM-4.5V", + "id": "deepseek-v4.1-flash", + "name": "DeepSeek V4.1 Flash", + "display_name": "DeepSeek V4.1 Flash", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 64000, - "output": 16384 + "context": 1000000, + "output": 384000 }, "temperature": true, "tool_call": true, @@ -115681,22 +113506,37 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "low", + "high", + "max" + ] + } + }, "attachment": true, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-08-11", - "last_updated": "2025-08-11", + "knowledge": "2025-05", + "release_date": "2026-09-10", + "last_updated": "2026-09-10", "type": "chat" }, { - "id": "zai/glm-5.3-flash", - "name": "GLM-5.3-Flash", - "display_name": "GLM-5.3-Flash", + "id": "gpt-5.6-luna", + "name": "GPT 5.6 Luna", + "display_name": "GPT 5.6 Luna", "modalities": { "input": [ "text", "image", - "video", "pdf" ], "output": [ @@ -115704,8 +113544,8 @@ ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 1050000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -115716,69 +113556,103 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ + "none", "low", + "medium", "high", + "xhigh", "max" - ] + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, - "open_weights": true, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", + "open_weights": false, + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "zai/glm-5-turbo", - "name": "GLM-5-Turbo", - "display_name": "GLM-5-Turbo", + "id": "gpt-5.1-codex", + "name": "GPT-5.1 Codex", + "display_name": "GPT-5.1 Codex", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 131072 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-03-16", - "last_updated": "2026-03-16", + "knowledge": "2024-09-30", + "release_date": "2025-11-13", + "last_updated": "2025-11-13", "type": "chat" }, { - "id": "zai/glm-4.7", - "name": "GLM-4.7", - "display_name": "GLM-4.7", + "id": "claude-fable-5-1", + "name": "Claude Fable 5.1", + "display_name": "Claude Fable 5.1", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -115787,25 +113661,40 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], "interleaved": true, "summaries": true, - "visibility": "summary", + "visibility": "omitted", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", + "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", + "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-12-22", - "last_updated": "2025-12-22", + "attachment": true, + "open_weights": false, + "knowledge": "2026-06", + "release_date": "2026-09-01", + "last_updated": "2026-09-01", "type": "chat" }, { - "id": "zai/glm-4.5", - "name": "GLM-4.5", - "display_name": "GLM-4.5", + "id": "glm-5.3", + "name": "GLM-5.3", + "display_name": "GLM-5.3", "modalities": { "input": [ "text" @@ -115815,8 +113704,8 @@ ] }, "limit": { - "context": 131072, - "output": 98304 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -115824,28 +113713,47 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "low", + "high", + "max" + ] + } + }, "attachment": false, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-07-28", - "last_updated": "2025-07-28", + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "zai/glm-4.5-flash", - "name": "GLM-4.5-Flash", - "display_name": "GLM-4.5-Flash", + "id": "gemini-3.1-flash-lite-preview", + "name": "Gemini 3.1 Flash Lite Preview", + "display_name": "Gemini 3.1 Flash Lite Preview", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 98304 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -115853,30 +113761,41 @@ "supported": true, "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "low", + "medium", + "high" + ] + } + }, + "attachment": true, "open_weights": false, - "knowledge": "2025-04", - "release_date": "2025-07-28", - "last_updated": "2025-07-28", + "knowledge": "2025-01", + "release_date": "2026-03-03", + "last_updated": "2026-03-03", "type": "chat" }, { - "id": "zai/glm-4.7-flash", - "name": "GLM-4.7-Flash", - "display_name": "GLM-4.7-Flash", + "id": "gpt-5.3-codex", + "name": "GPT-5.3 Codex", + "display_name": "GPT-5.3 Codex", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 131072 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -115884,90 +113803,135 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2026-01-19", - "last_updated": "2026-01-19", + "attachment": true, + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-02-05", + "last_updated": "2026-02-05", "type": "chat" }, { - "id": "zai/glm-4.6v-flash", - "name": "GLM-4.6V-Flash", - "display_name": "GLM-4.6V-Flash", + "id": "gpt-6-luna", + "name": "GPT-6 Luna", + "display_name": "GPT-6 Luna", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 32768 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + }, "attachment": true, - "open_weights": true, - "release_date": "2025-12-08", - "last_updated": "2025-12-08", + "open_weights": false, + "knowledge": "2026-05-18", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "groq/allam-2-7b", - "name": "ALLaM-2-7b", - "display_name": "ALLaM-2-7b", + "id": "claude-opus-5-5", + "name": "Claude Opus 5.5", + "display_name": "Claude Opus 5.5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 4096, - "output": 4096 + "context": 1000000, + "output": 128000 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "release_date": "2025-01-23", - "last_updated": "2025-01-23", + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2026-06", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "groq/openai/gpt-oss-120b", - "name": "GPT OSS 120B", - "display_name": "GPT OSS 120B", + "id": "gpt-5-mini", + "name": "GPT-5 Mini", + "display_name": "GPT-5 Mini", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 65536 + "context": 272000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -115976,37 +113940,50 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ + "minimal", "low", "medium", "high" - ] + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "attachment": true, + "open_weights": false, + "knowledge": "2024-05-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "groq/openai/gpt-oss-20b", - "name": "GPT OSS 20B", - "display_name": "GPT OSS 20B", + "id": "claude-opus-5", + "name": "Claude Opus 5", + "display_name": "Claude Opus 5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 65536 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -116018,35 +113995,38 @@ "effort_options": [ "low", "medium", - "high" + "high", + "xhigh", + "max" ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "attachment": true, + "open_weights": false, + "knowledge": "2026-05", + "release_date": "2026-07-24", + "last_updated": "2026-07-24", "type": "chat" }, { - "id": "groq/qwen/qwen3.8-27b", - "name": "Qwen3.8 27B", - "display_name": "Qwen3.8 27B", + "id": "gpt-6-sol", + "name": "GPT-6 Sol", + "display_name": "GPT-6 Sol", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131042, - "output": 16384 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -116058,82 +114038,89 @@ "none", "low", "medium", - "high" + "high", + "xhigh", + "max" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "open_weights": false, + "knowledge": "2026-04-20", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" - } - ] - }, - "huggingface": { - "id": "huggingface", - "name": "Hugging Face", - "display_name": "Hugging Face", - "api": "https://router.huggingface.co/v1", - "doc": "https://huggingface.co/docs/inference-providers", - "models": [ + }, { - "id": "Qwen/Qwen3-32B", - "name": "Qwen3 32B", - "display_name": "Qwen3 32B", + "id": "gpt-5.1-codex-max", + "name": "GPT-5.1 Codex Max", + "display_name": "GPT-5.1 Codex Max", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 16384 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-04-28", - "last_updated": "2025-04-28", + "attachment": true, + "open_weights": false, + "knowledge": "2024-09-30", + "release_date": "2025-11-13", + "last_updated": "2025-11-13", "type": "chat" }, { - "id": "Qwen/Qwen3.8-2.4T-A95B", - "name": "Qwen3.8 2.4T A95B", - "display_name": "Qwen3.8 2.4T A95B", + "id": "claude-haiku-5-5", + "name": "Claude Haiku 5.5", + "display_name": "Claude Haiku 5.5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 131072 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -116141,121 +114128,134 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ "low", "medium", - "xhigh" + "high", + "xhigh", + "max" ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-08-12", - "last_updated": "2026-08-12", + "attachment": true, + "open_weights": false, + "knowledge": "2026-06", + "release_date": "2026-10-07", + "last_updated": "2026-10-07", "type": "chat" }, { - "id": "Qwen/Qwen3-Embedding-4B", - "name": "Qwen 3 Embedding 4B", - "display_name": "Qwen 3 Embedding 4B", + "id": "gpt-6.1-sol", + "name": "GPT-6.1 Sol", + "display_name": "GPT-6.1 Sol", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 32768, - "output": 8192 + "context": 1050000, + "output": 128000 }, "temperature": false, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-12", - "release_date": "2025-06-05", - "last_updated": "2025-06-05", - "type": "embedding" - }, - { - "id": "Qwen/Qwen3-Next-80B-A3B-Instruct", - "name": "Qwen3-Next-80B-A3B-Instruct", - "display_name": "Qwen3-Next-80B-A3B-Instruct", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 262144, - "output": 32768 - }, - "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-09", - "last_updated": "2025-09", + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2026-04-30", + "release_date": "2026-09-29", + "last_updated": "2026-09-29", "type": "chat" }, { - "id": "Qwen/Qwen3-Coder-30B-A3B-Instruct", - "name": "Qwen3-Coder 30B-A3B Instruct", - "display_name": "Qwen3-Coder 30B-A3B Instruct", + "id": "gpt-5.2-codex", + "name": "GPT-5.2 Codex", + "display_name": "GPT-5.2 Codex", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-07-31", - "last_updated": "2025-07-31", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2025-12-11", + "last_updated": "2025-12-11", "type": "chat" }, { - "id": "Qwen/Qwen3-235B-A22B", - "name": "Qwen3 235B-A22B", - "display_name": "Qwen3 235B-A22B", + "id": "claude-sonnet-5-5", + "name": "Claude Sonnet 5.5", + "display_name": "Claude Sonnet 5.5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 40960, - "output": 16384 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -116263,39 +114263,41 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-04-28", - "last_updated": "2025-04-28", + "attachment": true, + "open_weights": false, + "knowledge": "2026-06", + "release_date": "2026-09-28", + "last_updated": "2026-09-28", "type": "chat" }, { - "id": "Qwen/Qwen3-8B", - "name": "Qwen3 8B", - "display_name": "Qwen3 8B", + "id": "claude-sonnet-5", + "name": "Claude Sonnet 5", + "display_name": "Claude Sonnet 5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 40960, - "output": 32768 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -116304,30 +114306,26 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ - "none", "low", "medium", - "high" + "high", + "xhigh", + "max" ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2025-04-29", - "last_updated": "2025-04-29", + "attachment": true, + "open_weights": false, + "knowledge": "2026-01-31", + "release_date": "2026-06-30", + "last_updated": "2026-06-30", "type": "chat" }, { - "id": "Qwen/Qwen3-235B-A22B-Thinking-2507", - "name": "Qwen3-235B-A22B-Thinking-2507", - "display_name": "Qwen3-235B-A22B-Thinking-2507", + "id": "deepseek-v4-pro", + "name": "DeepSeek V4 Pro", + "display_name": "DeepSeek V4 Pro", "modalities": { "input": [ "text" @@ -116337,8 +114335,8 @@ ] }, "limit": { - "context": 262144, - "output": 81920 + "context": 1000000, + "output": 384000 }, "temperature": true, "tool_call": true, @@ -116349,65 +114347,89 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "high", + "max" + ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "notes": [ + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, "attachment": false, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-07-25", - "last_updated": "2025-07-25", + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "Qwen/Qwen3.6-35B-A3B", - "name": "Qwen3.6 35B-A3B", - "display_name": "Qwen3.6 35B-A3B", + "id": "gpt-5.4-nano", + "name": "GPT-5.4 Nano", + "display_name": "GPT-5.4 Nano", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, - "open_weights": true, - "release_date": "2026-04-17", - "last_updated": "2026-04-17", + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-03-17", + "last_updated": "2026-03-17", "type": "chat" }, { - "id": "Qwen/Qwen3-Coder-480B-A35B-Instruct", - "name": "Qwen3-Coder-480B-A35B-Instruct", - "display_name": "Qwen3-Coder-480B-A35B-Instruct", + "id": "deepseek-v3.2", + "name": "DeepSeek-V3.2", + "display_name": "DeepSeek-V3.2", "modalities": { "input": [ "text" @@ -116417,36 +114439,52 @@ ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 128000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "none", + "low", + "medium", + "high" + ] + } }, "attachment": false, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-07-22", - "last_updated": "2025-07-22", + "knowledge": "2024-07", + "release_date": "2025-12-01", + "last_updated": "2025-12-01", "type": "chat" }, { - "id": "Qwen/Qwen3-30B-A3B", - "name": "Qwen3 30B A3B", - "display_name": "Qwen3 30B A3B", + "id": "gemini-3.7-flash", + "name": "Gemini 3.7 Flash", + "display_name": "Gemini 3.7 Flash", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 40960, - "output": 16384 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -116457,66 +114495,83 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", + "low", + "medium", + "high" + ], "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" + "thought_signatures" ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2025-04-28", - "last_updated": "2025-04-28", + "attachment": true, + "open_weights": false, + "knowledge": "2026-03", + "release_date": "2026-08-13", + "last_updated": "2026-08-13", "type": "chat" }, { - "id": "Qwen/Qwen3-VL-30B-A3B-Instruct", - "name": "Qwen3 VL 30B A3B Instruct", - "display_name": "Qwen3 VL 30B A3B Instruct", + "id": "kimi-k3", + "name": "Kimi K3", + "display_name": "Kimi K3", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 1000000, + "output": 131072 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": true, "open_weights": true, - "release_date": "2025-10-04", - "last_updated": "2025-10-04", + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" }, { - "id": "Qwen/Qwen3-VL-235B-A22B-Thinking", - "name": "Qwen3 VL 235B A22B Thinking", - "display_name": "Qwen3 VL 235B A22B Thinking", + "id": "gpt-5.5", + "name": "GPT-5.5", + "display_name": "GPT-5.5", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -116525,42 +114580,49 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ "low", "medium", "high" - ] + ], + "visibility": "hidden" } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-03-31", - "release_date": "2025-09-23", - "last_updated": "2025-09-23", + "open_weights": false, + "knowledge": "2025-12-01", + "release_date": "2026-04-23", + "last_updated": "2026-04-23", "type": "chat" }, { - "id": "Qwen/Qwen3.6-27B", - "name": "Qwen3.6 27B", - "display_name": "Qwen3.6 27B", + "id": "glm-5.3-flash", + "name": "GLM-5.3-Flash", + "display_name": "GLM-5.3-Flash", "modalities": { "input": [ "text", - "image" + "image", + "video", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -116576,31 +114638,39 @@ "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "effort_options": [ + "low", + "high", + "max" ] } }, "attachment": true, "open_weights": true, - "release_date": "2026-04-22", - "last_updated": "2026-04-22", + "release_date": "2026-08-26", + "last_updated": "2026-08-26", "type": "chat" }, { - "id": "Qwen/Qwen3.5-27B", - "name": "Qwen3.5 27B", - "display_name": "Qwen3.5 27B", + "id": "gemini-3.8-flash", + "name": "Gemini 3.8 Flash", + "display_name": "Gemini 3.8 Flash", "modalities": { "input": [ "text", - "image" + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 1048576, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -116611,36 +114681,43 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", + "low", + "medium", + "high" + ], "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" + "thought_signatures" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-02-23", - "last_updated": "2026-02-23", + "open_weights": false, + "release_date": "2026-09-02", + "last_updated": "2026-09-02", "type": "chat" }, { - "id": "Qwen/Qwen3.8-27B", - "name": "Qwen3.8 27B", - "display_name": "Qwen3.8 27B", + "id": "deepseek-v4-pro-0813", + "name": "DeepSeek V4 Pro 0813", + "display_name": "DeepSeek V4 Pro 0813", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 1000000, + "output": 384000 }, "temperature": true, "tool_call": true, @@ -116650,65 +114727,44 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ - "low", - "medium", - "xhigh" + "high", + "max" ] } }, - "attachment": true, - "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", - "type": "chat" - }, - { - "id": "Qwen/Qwen3-Coder-Next", - "name": "Qwen3-Coder-Next", - "display_name": "Qwen3-Coder-Next", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 262144, - "output": 65536 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, "attachment": false, "open_weights": true, - "knowledge": "2025-09", - "release_date": "2026-02-03", - "last_updated": "2026-02-03", + "release_date": "2026-08-13", + "last_updated": "2026-08-22", "type": "chat" }, { - "id": "Qwen/Qwen3.5-397B-A17B", - "name": "Qwen3.5-397B-A17B", - "display_name": "Qwen3.5-397B-A17B", + "id": "gpt-6-astra", + "name": "GPT-6 Astra", + "display_name": "GPT-6 Astra", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -116717,35 +114773,38 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ - "none", "low", "medium", - "high" + "high", + "xhigh", + "max" ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2026-02-15", - "last_updated": "2026-02-15", + "open_weights": false, + "knowledge": "2026-04-30", + "release_date": "2026-09-04", + "last_updated": "2026-09-04", "type": "chat" - }, + } + ] + }, + "nebius": { + "id": "nebius", + "name": "Nebius Token Factory", + "display_name": "Nebius Token Factory", + "api": "https://api.tokenfactory.nebius.com/v1", + "doc": "https://docs.tokenfactory.nebius.com/", + "models": [ { - "id": "Qwen/Qwen3.5-9B", - "name": "Qwen3.5 9B", - "display_name": "Qwen3.5 9B", + "id": "moonshotai/Kimi-K2.7-Code", + "name": "Kimi K2.7 Code", + "display_name": "Kimi K2.7 Code", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" @@ -116753,9 +114812,9 @@ }, "limit": { "context": 262144, - "output": 65536 + "output": 8000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -116772,16 +114831,17 @@ ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-02-23", - "last_updated": "2026-02-23", + "knowledge": "2025-01", + "release_date": "2026-06-12", + "last_updated": "2026-06-12", "type": "chat" }, { - "id": "Qwen/Qwen3-VL-235B-A22B-Instruct", - "name": "Qwen3 VL 235B A22B Instruct", - "display_name": "Qwen3 VL 235B A22B Instruct", + "id": "moonshotai/Kimi-K3", + "name": "Kimi K3", + "display_name": "Kimi K3", "modalities": { "input": [ "text", @@ -116792,37 +114852,54 @@ ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 1024000, + "output": 8000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "none", + "low", + "medium", + "high", + "max" + ] + } }, "attachment": true, "open_weights": true, - "knowledge": "2025-03-31", - "release_date": "2025-09-23", - "last_updated": "2025-09-23", + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" }, { - "id": "Qwen/Qwen3.5-122B-A10B", - "name": "Qwen3.5 122B-A10B", - "display_name": "Qwen3.5 122B-A10B", + "id": "openai/gpt-oss-120b", + "name": "gpt-oss-120b", + "display_name": "gpt-oss-120b", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 131072, + "output": 8192 }, "temperature": true, "tool_call": true, @@ -116838,31 +114915,36 @@ "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "effort_options": [ + "low", + "medium", + "high" ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-02-23", - "last_updated": "2026-02-23", + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "Qwen/Qwen3.5-35B-A3B", - "name": "Qwen3.5 35B-A3B", - "display_name": "Qwen3.5 35B-A3B", + "id": "nvidia/Nemotron-3-Ultra-550b-a55b", + "name": "Nemotron 3 Ultra 550B A55B", + "display_name": "Nemotron 3 Ultra 550B A55B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 1048576, + "output": 1048576 }, "temperature": true, "tool_call": true, @@ -116873,24 +114955,23 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "none", + "high" ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-02-23", - "last_updated": "2026-02-23", + "knowledge": "2025-09", + "release_date": "2026-06-04", + "last_updated": "2026-06-04", "type": "chat" }, { - "id": "Qwen/Qwen3-Embedding-8B", - "name": "Qwen 3 Embedding 8B", - "display_name": "Qwen 3 Embedding 8B", + "id": "nvidia/Nemotron-3_5-Lightning", + "name": "Nemotron 3.5 Lightning 30B A3B", + "display_name": "Nemotron 3.5 Lightning 30B A3B", "modalities": { "input": [ "text" @@ -116900,25 +114981,34 @@ ] }, "limit": { - "context": 32768, - "output": 8192 + "context": 1048576, + "output": 1048576 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "high" + ] + } }, "attachment": false, "open_weights": true, - "knowledge": "2024-12", - "release_date": "2025-06-05", - "last_updated": "2025-06-05", - "type": "embedding" + "knowledge": "2025-09", + "release_date": "2026-08-11", + "last_updated": "2026-08-11", + "type": "chat" }, { - "id": "Qwen/Qwen3-235B-A22B-Instruct-2507", - "name": "Qwen3 235B-A22B Instruct 2507", - "display_name": "Qwen3 235B-A22B Instruct 2507", + "id": "nvidia/nemotron-3-super-120b-a12b", + "name": "Nemotron-3-Super-120B-A12B", + "display_name": "Nemotron-3-Super-120B-A12B", "modalities": { "input": [ "text" @@ -116929,61 +115019,82 @@ }, "limit": { "context": 262144, - "output": 16384 + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": false, "open_weights": true, - "release_date": "2025-07-21", - "last_updated": "2025-07-21", + "knowledge": "2025-06", + "release_date": "2026-03-11", + "last_updated": "2026-03-11", "type": "chat" }, { - "id": "Qwen/Qwen2.5-Coder-32B-Instruct", - "name": "Qwen2.5-Coder-32B-Instruct", - "display_name": "Qwen2.5-Coder-32B-Instruct", + "id": "nvidia/Nemotron-3.5-Super-VL", + "name": "Nemotron 3.5 Super VL 120B A12B", + "display_name": "Nemotron 3.5 Super VL 120B A12B", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 1048576, + "output": 1048576 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "none", + "high" + ] + } + }, + "attachment": true, "open_weights": true, - "release_date": "2024-11-12", - "last_updated": "2024-11-12", + "release_date": "2026-10-15", + "last_updated": "2026-10-15", "type": "chat" }, { - "id": "MiniMaxAI/MiniMax-M2.1", - "name": "MiniMax-M2.1", - "display_name": "MiniMax-M2.1", + "id": "MiniMaxAI/MiniMax-M3.1-Flash", + "name": "MiniMax-M3.1-Flash", + "display_name": "MiniMax-M3.1-Flash", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 1048576, + "output": 1048576 }, "temperature": true, "tool_call": true, @@ -116999,31 +115110,73 @@ "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" ] } }, + "attachment": true, + "open_weights": false, + "release_date": "2026-10-19", + "last_updated": "2026-10-19", + "type": "chat" + }, + { + "id": "MiniMaxAI/MiniMax-M3", + "name": "MiniMax-M3", + "display_name": "MiniMax-M3", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1048576, + "output": 1048576 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, "attachment": false, "open_weights": true, - "knowledge": "2025-10", - "release_date": "2025-12-23", - "last_updated": "2025-12-23", + "release_date": "2026-06-01", + "last_updated": "2026-06-01", "type": "chat" }, { - "id": "MiniMaxAI/MiniMax-M2.7", - "name": "MiniMax-M2.7", - "display_name": "MiniMax-M2.7", + "id": "meta-models/muse-spark-open", + "name": "Muse Spark Open", + "display_name": "Muse Spark Open", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 1048576, + "output": 1048576 }, "temperature": true, "tool_call": true, @@ -117039,19 +115192,26 @@ "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "effort_options": [ + "low", + "medium", + "high", + "xhigh" ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-03-18", - "last_updated": "2026-03-18", + "knowledge": "2026-01-04", + "release_date": "2026-10-15", + "last_updated": "2026-10-15", "type": "chat" }, { - "id": "MiniMaxAI/MiniMax-M1-80k", - "name": "MiniMax M1 80K", - "display_name": "MiniMax M1 80K", + "id": "Qwen/Qwen3-Embedding-8B", + "name": "Qwen3-Embedding-8B", + "display_name": "Qwen3-Embedding-8B", "modalities": { "input": [ "text" @@ -117061,25 +115221,25 @@ ] }, "limit": { - "context": 1000000, - "output": 80000 + "context": 40960, + "output": 8192 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, "open_weights": true, - "release_date": "2025-06-17", - "last_updated": "2025-06-17", - "type": "chat" + "knowledge": "2025-10", + "release_date": "2025-06-05", + "last_updated": "2025-06-05", + "type": "embedding" }, { - "id": "MiniMaxAI/MiniMax-M2", - "name": "MiniMax-M2", - "display_name": "MiniMax-M2", + "id": "Qwen/Qwen3.5-397B-A17B", + "name": "Qwen3.5-397B-A17B", + "display_name": "Qwen3.5-397B-A17B", "modalities": { "input": [ "text" @@ -117089,8 +115249,8 @@ ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 262144, + "output": 8192 }, "temperature": true, "tool_call": true, @@ -117098,61 +115258,68 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, "attachment": false, "open_weights": true, - "release_date": "2025-10-27", - "last_updated": "2025-10-27", + "knowledge": "2025-07", + "release_date": "2026-02-15", + "last_updated": "2026-02-15", "type": "chat" }, { - "id": "MiniMaxAI/MiniMax-M3", - "name": "MiniMax-M3", - "display_name": "MiniMax-M3", + "id": "Qwen/Qwen3-235B-A22B-Instruct-2507", + "name": "Qwen3 235B A22B Instruct 2507", + "display_name": "Qwen3 235B A22B Instruct 2507", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 524288, - "output": 512000 + "context": 262144, + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-06-01", - "last_updated": "2026-06-01", + "knowledge": "2025-07", + "release_date": "2025-07-21", + "last_updated": "2025-07-21", "type": "chat" }, { - "id": "MiniMaxAI/MiniMax-M2.5", - "name": "MiniMax-M2.5", - "display_name": "MiniMax-M2.5", + "id": "Qwen/Qwen3.8-27B", + "name": "Qwen3.8 27B", + "display_name": "Qwen3.8 27B", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, @@ -117168,60 +115335,64 @@ "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "effort_options": [ + "none", + "low", + "medium", + "xhigh" ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-02-12", - "last_updated": "2026-02-12", + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "google/gemma-3-27b-it", - "name": "Gemma 3 27B IT", - "display_name": "Gemma 3 27B IT", + "id": "Qwen/Qwen3-30B-A3B-Instruct-2507", + "name": "Qwen3-30B-A3B-Instruct-2507", + "display_name": "Qwen3-30B-A3B-Instruct-2507", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 131072 + "context": 262144, + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2024-08", - "release_date": "2025-03-12", - "last_updated": "2025-03-12", + "knowledge": "2025-12", + "release_date": "2025-07-28", + "last_updated": "2025-07-28", "type": "chat" }, { - "id": "google/gemma-4-26B-A4B-it", - "name": "Gemma 4 26B A4B IT", - "display_name": "Gemma 4 26B A4B IT", + "id": "reflection/beam", + "name": "Beam 1.0 501B A23B", + "display_name": "Beam 1.0 501B A23B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 1048576, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -117231,48 +115402,78 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "minimal", + "low", + "medium", + "high", + "xhigh", + "max" + ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "knowledge": "2026-06-30", + "release_date": "2026-10-05", + "last_updated": "2026-10-16", "type": "chat" }, { - "id": "google/gemma-3-12b-it", - "name": "Gemma 3 12B IT", - "display_name": "Gemma 3 12B IT", + "id": "zai-org/GLM-5.2", + "name": "GLM-5.2", + "display_name": "GLM-5.2", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 131072 + "context": 1048576, + "output": 1048576 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "low", + "medium", + "high" + ] + } + }, + "attachment": false, "open_weights": true, - "knowledge": "2024-08", - "release_date": "2025-03-12", - "last_updated": "2025-03-12", + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "google/gemma-4-31B-it", - "name": "Gemma 4 31B IT", - "display_name": "Gemma 4 31B IT", + "id": "zai-org/GLM-5.3-Flash", + "name": "GLM-5.3-Flash", + "display_name": "GLM-5.3-Flash", "modalities": { "input": [ "text", @@ -117283,8 +115484,8 @@ ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 1024000, + "output": 1024000 }, "temperature": true, "tool_call": true, @@ -117294,62 +115495,85 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "low", + "high", + "max" + ] } }, "attachment": true, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "release_date": "2026-08-26", + "last_updated": "2026-08-26", "type": "chat" }, { - "id": "google/gemma-3-4b-it", - "name": "Gemma 3 4B IT", - "display_name": "Gemma 3 4B IT", + "id": "zai-org/GLM-5.3", + "name": "GLM-5.3", + "display_name": "GLM-5.3", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 131072 + "context": 1024000, + "output": 1024000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "low", + "high", + "max" + ] + } + }, + "attachment": false, "open_weights": true, - "knowledge": "2024-08", - "release_date": "2025-03-12", - "last_updated": "2025-03-12", + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "moonshotai/Kimi-K2.6", - "name": "Kimi-K2.6", - "display_name": "Kimi-K2.6", + "id": "deepseek-ai/DeepSeek-V4-Flash-0731", + "name": "DeepSeek V4 Flash 0731", + "display_name": "DeepSeek V4 Flash 0731", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1024000, + "output": 1024000 }, "temperature": true, "tool_call": true, @@ -117365,34 +115589,39 @@ "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "effort_options": [ + "none", + "low", + "high", + "max" ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-20", - "last_updated": "2026-04-20", + "knowledge": "2025-05", + "release_date": "2026-07-31", + "last_updated": "2026-07-31", "type": "chat" }, { - "id": "moonshotai/Kimi-K3", - "name": "Kimi K3", - "display_name": "Kimi K3", + "id": "deepseek-ai/DeepSeek-V4-Pro", + "name": "DeepSeek V4 Pro", + "display_name": "DeepSeek V4 Pro", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 1048576, + "output": 1048576 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -117401,65 +115630,89 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", "effort_options": [ "low", "high", "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-16", + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "moonshotai/Kimi-K2-Instruct-0905", - "name": "Kimi-K2-Instruct-0905", - "display_name": "Kimi-K2-Instruct-0905", + "id": "deepseek-ai/DeepSeek-V4.1-Flash-1017", + "name": "DeepSeek V4.1 Flash 1017", + "display_name": "DeepSeek V4.1 Flash 1017", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 16384 + "context": 1048576, + "output": 1048576 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "low", + "high", + "max" + ] + } + }, + "attachment": true, "open_weights": true, - "knowledge": "2024-10", - "release_date": "2025-09-05", - "last_updated": "2025-09-05", + "knowledge": "2025-05", + "release_date": "2026-10-17", + "last_updated": "2026-10-17", "type": "chat" }, { - "id": "moonshotai/Kimi-K2.7-Code", - "name": "Kimi K2.7 Code", - "display_name": "Kimi K2.7 Code", + "id": "deepseek-ai/DeepSeek-V4-Pro-0813", + "name": "DeepSeek V4 Pro 0813", + "display_name": "DeepSeek V4 Pro 0813", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 979000, + "output": 979000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -117467,33 +115720,43 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "none", + "low", + "high", + "max" + ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-06-12", - "last_updated": "2026-06-12", + "release_date": "2026-08-13", + "last_updated": "2026-08-22", "type": "chat" }, { - "id": "moonshotai/Kimi-K2.5", - "name": "Kimi-K2.5", - "display_name": "Kimi-K2.5", + "id": "deepseek-ai/DeepSeek-V4.1-Flash", + "name": "DeepSeek V4.1 Flash", + "display_name": "DeepSeek V4.1 Flash", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1048000, + "output": 1048000 }, "temperature": true, "tool_call": true, @@ -117509,48 +115772,55 @@ "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "effort_options": [ + "none", + "low", + "high", + "max" ] } }, "attachment": true, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-01-27", - "last_updated": "2026-01-27", + "knowledge": "2025-05", + "release_date": "2026-09-10", + "last_updated": "2026-09-10", "type": "chat" }, { - "id": "moonshotai/Kimi-K2-Instruct", - "name": "Kimi-K2-Instruct", - "display_name": "Kimi-K2-Instruct", + "id": "google/gemma-3-27b-it", + "name": "Gemma-3-27b-it", + "display_name": "Gemma-3-27b-it", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 16384 + "context": 110000, + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2024-10", - "release_date": "2025-07-11", - "last_updated": "2025-07-11", + "knowledge": "2024-08", + "release_date": "2025-03-12", + "last_updated": "2025-03-12", "type": "chat" }, { - "id": "moonshotai/Kimi-K2-Thinking", - "name": "Kimi-K2-Thinking", - "display_name": "Kimi-K2-Thinking", + "id": "NousResearch/Hermes-4-405B", + "name": "Hermes-4-405B", + "display_name": "Hermes-4-405B", "modalities": { "input": [ "text" @@ -117560,8 +115830,8 @@ ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 131072, + "output": 8192 }, "temperature": true, "tool_call": true, @@ -117582,15 +115852,24 @@ }, "attachment": false, "open_weights": true, - "knowledge": "2024-08", - "release_date": "2025-11-06", - "last_updated": "2025-11-06", + "knowledge": "2024-08-31", + "release_date": "2025-08-26", + "last_updated": "2025-08-26", "type": "chat" - }, + } + ] + }, + "tencent-coding-plan": { + "id": "tencent-coding-plan", + "name": "Tencent Coding Plan (China)", + "display_name": "Tencent Coding Plan (China)", + "api": "https://api.lkeap.cloud.tencent.com/coding/v3", + "doc": "https://cloud.tencent.com/document/product/1772/128947", + "models": [ { - "id": "XiaomiMiMo/MiMo-V2.5", - "name": "MiMo-V2.5", - "display_name": "MiMo-V2.5", + "id": "tc-code-latest", + "name": "Auto", + "display_name": "Auto", "modalities": { "input": [ "text" @@ -117600,37 +115879,24 @@ ] }, "limit": { - "context": 262144, - "output": 131072 + "context": 131072, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ] - } + "supported": false }, "attachment": false, - "open_weights": true, - "knowledge": "2024-12", - "release_date": "2026-04-22", - "last_updated": "2026-04-22", + "open_weights": false, + "release_date": "2026-03-08", + "last_updated": "2026-03-08", "type": "chat" }, { - "id": "XiaomiMiMo/MiMo-V2.5-Pro", - "name": "MiMo-V2.5-Pro", - "display_name": "MiMo-V2.5-Pro", + "id": "hunyuan-turbos", + "name": "Hunyuan-TurboS", + "display_name": "Hunyuan-TurboS", "modalities": { "input": [ "text" @@ -117640,37 +115906,24 @@ ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 131072, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ] - } + "supported": false }, "attachment": false, - "open_weights": true, - "knowledge": "2024-12", - "release_date": "2026-04-22", - "last_updated": "2026-04-22", + "open_weights": false, + "release_date": "2026-03-08", + "last_updated": "2026-03-08", "type": "chat" }, { - "id": "openai/gpt-oss-120b", - "name": "GPT OSS 120B", - "display_name": "GPT OSS 120B", + "id": "hunyuan-2.0-instruct", + "name": "Tencent HY 2.0 Instruct", + "display_name": "Tencent HY 2.0 Instruct", "modalities": { "input": [ "text" @@ -117681,35 +115934,23 @@ }, "limit": { "context": 131072, - "output": 32768 + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "low", - "medium", - "high" - ] - } + "supported": false }, "attachment": false, - "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "open_weights": false, + "release_date": "2026-03-08", + "last_updated": "2026-03-08", "type": "chat" }, { - "id": "openai/gpt-oss-20b", - "name": "GPT OSS 20B", - "display_name": "GPT OSS 20B", + "id": "hunyuan-t1", + "name": "Hunyuan-T1", + "display_name": "Hunyuan-T1", "modalities": { "input": [ "text" @@ -117720,7 +115961,7 @@ }, "limit": { "context": 131072, - "output": 32768 + "output": 16384 }, "temperature": true, "tool_call": true, @@ -117731,24 +115972,24 @@ "extra_capabilities": { "reasoning": { "supported": true, - "effort_options": [ - "low", - "medium", - "high" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, "attachment": false, - "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "open_weights": false, + "release_date": "2026-03-08", + "last_updated": "2026-03-08", "type": "chat" }, { - "id": "zai-org/GLM-5", - "name": "GLM-5", - "display_name": "GLM-5", + "id": "minimax-m2.5", + "name": "MiniMax-M2.5", + "display_name": "MiniMax-M2.5", "modalities": { "input": [ "text" @@ -117758,8 +115999,8 @@ ] }, "limit": { - "context": 202752, - "output": 131072 + "context": 204800, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -117785,9 +116026,9 @@ "type": "chat" }, { - "id": "zai-org/GLM-4.7-Flash", - "name": "GLM-4.7-Flash", - "display_name": "GLM-4.7-Flash", + "id": "glm-5", + "name": "GLM-5", + "display_name": "GLM-5", "modalities": { "input": [ "text" @@ -117797,8 +116038,8 @@ ] }, "limit": { - "context": 200000, - "output": 128000 + "context": 202752, + "output": 16384 }, "temperature": true, "tool_call": true, @@ -117819,26 +116060,26 @@ }, "attachment": false, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2026-01-19", - "last_updated": "2026-01-19", + "release_date": "2026-02-12", + "last_updated": "2026-02-12", "type": "chat" }, { - "id": "zai-org/GLM-4.6V-Flash", - "name": "GLM-4.6V-Flash", - "display_name": "GLM-4.6V-Flash", + "id": "kimi-k2.5", + "name": "Kimi-K2.5", + "display_name": "Kimi-K2.5", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 131072, + "context": 262144, "output": 32768 }, "temperature": true, @@ -117847,16 +116088,28 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, "attachment": true, "open_weights": true, - "release_date": "2025-12-08", - "last_updated": "2025-12-08", + "knowledge": "2025-01", + "release_date": "2026-01-27", + "last_updated": "2026-01-27", "type": "chat" }, { - "id": "zai-org/GLM-5.1", - "name": "GLM-5.1", - "display_name": "GLM-5.1", + "id": "hunyuan-2.0-thinking", + "name": "Tencent HY 2.0 Think", + "display_name": "Tencent HY 2.0 Think", "modalities": { "input": [ "text" @@ -117866,8 +116119,8 @@ ] }, "limit": { - "context": 202752, - "output": 131072 + "context": 131072, + "output": 16384 }, "temperature": true, "tool_call": true, @@ -117887,15 +116140,24 @@ } }, "attachment": false, - "open_weights": true, - "release_date": "2026-04-07", - "last_updated": "2026-04-07", + "open_weights": false, + "release_date": "2026-03-08", + "last_updated": "2026-03-08", "type": "chat" - }, + } + ] + }, + "iteracompute": { + "id": "iteracompute", + "name": "IteraCompute", + "display_name": "IteraCompute", + "api": "https://api.iteracompute.com/v1", + "doc": "https://iteracompute.com/docs.html", + "models": [ { - "id": "zai-org/GLM-4.6", - "name": "GLM-4.6", - "display_name": "GLM-4.6", + "id": "moonshotai/kimi-k2.7-code", + "name": "Kimi K2.7 Code", + "display_name": "Kimi K2.7 Code", "modalities": { "input": [ "text" @@ -117905,8 +116167,8 @@ ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 262144, + "output": 235929 }, "temperature": true, "tool_call": true, @@ -117921,18 +116183,19 @@ }, "attachment": false, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-09-30", - "last_updated": "2025-09-30", + "knowledge": "2025-01", + "release_date": "2026-06-12", + "last_updated": "2026-06-12", "type": "chat" }, { - "id": "zai-org/GLM-5.3", - "name": "GLM-5.3", - "display_name": "GLM-5.3", + "id": "moonshotai/kimi-k3", + "name": "Kimi K3", + "display_name": "Kimi K3", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" @@ -117940,7 +116203,7 @@ }, "limit": { "context": 1048576, - "output": 131072 + "output": 999999 }, "temperature": true, "tool_call": true, @@ -117958,16 +116221,16 @@ ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" }, { - "id": "zai-org/GLM-5.2", - "name": "GLM-5.2", - "display_name": "GLM-5.2", + "id": "deepseek/deepseek-v4-flash-0731", + "name": "DeepSeek V4 Flash 0731 (legacy alias)", + "display_name": "DeepSeek V4 Flash 0731 (legacy alias)", "modalities": { "input": [ "text" @@ -117977,8 +116240,8 @@ ] }, "limit": { - "context": 262144, - "output": 131072 + "context": 1048576, + "output": 393216 }, "temperature": true, "tool_call": true, @@ -117988,31 +116251,36 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "effort_options": [ + "low", + "high", + "max" + ] } }, "attachment": false, "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "knowledge": "2025-05", + "release_date": "2026-09-10", + "last_updated": "2026-09-10", "type": "chat" }, { - "id": "zai-org/GLM-4.5V", - "name": "GLM-4.5V", - "display_name": "GLM-4.5V", + "id": "deepseek/deepseek-v4.1-flash", + "name": "DeepSeek V4.1 Flash", + "display_name": "DeepSeek V4.1 Flash", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 65536, - "output": 16384 + "context": 1048576, + "output": 393216 }, "temperature": true, "tool_call": true, @@ -118020,17 +116288,27 @@ "supported": true, "default": true }, - "attachment": true, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "low", + "high", + "max" + ] + } + }, + "attachment": false, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-08-11", - "last_updated": "2025-08-11", + "knowledge": "2025-05", + "release_date": "2026-09-10", + "last_updated": "2026-09-10", "type": "chat" }, { - "id": "zai-org/GLM-4.7", - "name": "GLM-4.7", - "display_name": "GLM-4.7", + "id": "deepseek/deepseek-v4-pro-0813", + "name": "DeepSeek V4 Pro 0813", + "display_name": "DeepSeek V4 Pro 0813", "modalities": { "input": [ "text" @@ -118040,8 +116318,8 @@ ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 1048576, + "output": 393216 }, "temperature": true, "tool_call": true, @@ -118052,29 +116330,26 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "low", + "high", + "max" ] } }, "attachment": false, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-12-22", - "last_updated": "2025-12-22", + "release_date": "2026-08-13", + "last_updated": "2026-08-22", "type": "chat" }, { - "id": "zai-org/GLM-5.3-Flash", - "name": "GLM-5.3-Flash", - "display_name": "GLM-5.3-Flash", + "id": "z-ai/glm-5.3", + "name": "GLM-5.3", + "display_name": "GLM-5.3", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" @@ -118100,27 +116375,28 @@ ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "zai-org/GLM-4.5-Air", - "name": "GLM-4.5-Air", - "display_name": "GLM-4.5-Air", + "id": "z-ai/glm-5.3-flash", + "name": "GLM-5.3-Flash", + "display_name": "GLM-5.3-Flash", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 98304 + "context": 1048576, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -118128,56 +116404,38 @@ "supported": true, "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-07-28", - "last_updated": "2025-07-28", - "type": "chat" - }, - { - "id": "zai-org/AutoGLM-Phone-9B-Multilingual", - "name": "AutoGLM Phone 9B Multilingual", - "display_name": "AutoGLM Phone 9B Multilingual", - "modalities": { - "input": [ - "text", - "image" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 65536, - "output": 65536 - }, - "temperature": true, - "tool_call": false, - "reasoning": { - "supported": false + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "low", + "high", + "max" + ] + } }, "attachment": true, "open_weights": true, - "release_date": "2025-12-10", - "last_updated": "2025-12-10", + "release_date": "2026-08-26", + "last_updated": "2026-08-26", "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-V3.1", - "name": "DeepSeek-V3.1", - "display_name": "DeepSeek-V3.1", + "id": "minimax/minimax-m3", + "name": "MiniMax-M3", + "display_name": "MiniMax-M3", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 1048576, + "output": 524288 }, "temperature": true, "tool_call": true, @@ -118185,27 +116443,33 @@ "supported": true, "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": true, "open_weights": true, - "release_date": "2025-08-21", - "last_updated": "2025-08-21", + "release_date": "2026-06-01", + "last_updated": "2026-06-01", "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-V4-Pro-0813", - "name": "DeepSeek V4 Pro 0813", - "display_name": "DeepSeek V4 Pro 0813", + "id": "qwen/qwen3.8-2.4t-a95b", + "name": "Qwen3.8 2.4T A95B", + "display_name": "Qwen3.8 2.4T A95B", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 1048576, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -118218,32 +116482,33 @@ "supported": true, "effort_options": [ "low", - "high", - "max" + "medium", + "xhigh" ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-08-13", - "last_updated": "2026-08-22", + "release_date": "2026-08-12", + "last_updated": "2026-08-12", "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-V4-Flash", - "name": "DeepSeek V4 Flash", - "display_name": "DeepSeek V4 Flash", + "id": "qwen/qwen3.8-27b", + "name": "Qwen3.8 27B", + "display_name": "Qwen3.8 27B", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 384000 + "context": 131072, + "output": 8192 }, "temperature": true, "tool_call": true, @@ -118253,37 +116518,32 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", "effort_options": [ "low", - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." + "medium", + "xhigh" ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" - }, + } + ] + }, + "abliteration-ai": { + "id": "abliteration-ai", + "name": "abliteration.ai", + "display_name": "abliteration.ai", + "api": "https://api.abliteration.ai/v1", + "doc": "https://docs.abliteration.ai/models", + "models": [ { - "id": "deepseek-ai/DeepSeek-R1-0528", - "name": "DeepSeek-R1-0528", - "display_name": "DeepSeek-R1-0528", + "id": "abliterated-model-large", + "name": "Abliterated Model Large", + "display_name": "Abliterated Model Large", "modalities": { "input": [ "text" @@ -118293,8 +116553,8 @@ ] }, "limit": { - "context": 163840, - "output": 32768 + "context": 1000000, + "output": 999990 }, "temperature": true, "tool_call": true, @@ -118304,26 +116564,23 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "none", + "high", + "max" ] } }, "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2025-05-28", - "last_updated": "2025-05-28", + "open_weights": false, + "release_date": "2026-07-25", + "last_updated": "2026-07-28", "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-V4-Flash-Vision-Exp", - "name": "DeepSeek V4 Flash Vision Exp", - "display_name": "DeepSeek V4 Flash Vision Exp", + "id": "abliterated-model", + "name": "Abliterated Model", + "display_name": "Abliterated Model", "modalities": { "input": [ "text", @@ -118334,8 +116591,8 @@ ] }, "limit": { - "context": 1048576, - "output": 384000 + "context": 150000, + "output": 8192 }, "temperature": true, "tool_call": true, @@ -118345,36 +116602,27 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", "effort_options": [ + "none", + "minimal", "low", + "medium", "high", + "xhigh", "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, "attachment": true, "open_weights": true, - "release_date": "2026-08-21", - "last_updated": "2026-09-01", + "release_date": "2026-01-06", + "last_updated": "2026-07-28", "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-V4-Pro", - "name": "DeepSeek V4 Pro", - "display_name": "DeepSeek V4 Pro", + "id": "abliterated-model-large-v2", + "name": "Abliterated Model Large V2", + "display_name": "Abliterated Model Large V2", "modalities": { "input": [ "text" @@ -118384,8 +116632,8 @@ ] }, "limit": { - "context": 1048576, - "output": 393216 + "context": 1000000, + "output": 999990 }, "temperature": true, "tool_call": true, @@ -118395,69 +116643,30 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", "effort_options": [ "low", "high", "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", - "type": "chat" - }, - { - "id": "deepseek-ai/DeepSeek-V3.2", - "name": "DeepSeek-V3.2", - "display_name": "DeepSeek-V3.2", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 163840, - "output": 65536 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-07", - "release_date": "2025-12-01", - "last_updated": "2025-12-01", + "open_weights": false, + "release_date": "2026-08-29", + "last_updated": "2026-08-31", "type": "chat" - }, + } + ] + }, + "hyper": { + "id": "hyper", + "name": "Charm Hyper", + "display_name": "Charm Hyper", + "api": "https://hyper.charm.land/v1", + "doc": "https://hyper.charm.land", + "models": [ { - "id": "deepseek-ai/DeepSeek-V4-Flash-0731", + "id": "deepseek-v4-flash-0731", "name": "DeepSeek V4 Flash 0731", "display_name": "DeepSeek V4 Flash 0731", "modalities": { @@ -118469,7 +116678,7 @@ ] }, "limit": { - "context": 1048576, + "context": 1000000, "output": 384000 }, "temperature": true, @@ -118481,13 +116690,8 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ + "low", "high", "max" ] @@ -118501,21 +116705,20 @@ "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-V4.1-Flash-1017", - "name": "DeepSeek V4.1 Flash 1017", - "display_name": "DeepSeek V4.1 Flash 1017", + "id": "glm-5.2", + "name": "GLM-5.2", + "display_name": "GLM-5.2", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 384000 + "context": 1000000, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -118525,24 +116728,23 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ - "low", "high", - "max" + "xhigh" ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-10-17", - "last_updated": "2026-10-17", + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-R1", - "name": "DeepSeek-R1", - "display_name": "DeepSeek-R1", + "id": "minimax-m2.7", + "name": "MiniMax-M2.7", + "display_name": "MiniMax-M2.7", "modalities": { "input": [ "text" @@ -118552,8 +116754,8 @@ ] }, "limit": { - "context": 64000, - "output": 32768 + "context": 262100, + "output": 6553 }, "temperature": true, "tool_call": true, @@ -118574,13 +116776,12 @@ }, "attachment": false, "open_weights": true, - "knowledge": "2024-07", - "release_date": "2025-01-20", - "last_updated": "2025-05-29", + "release_date": "2026-03-18", + "last_updated": "2026-03-18", "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-V4.1-Flash", + "id": "deepseek-v4.1-flash", "name": "DeepSeek V4.1 Flash", "display_name": "DeepSeek V4.1 Flash", "modalities": { @@ -118594,7 +116795,7 @@ }, "limit": { "context": 1048576, - "output": 384000 + "output": 262144 }, "temperature": true, "tool_call": true, @@ -118606,10 +116807,8 @@ "reasoning": { "supported": true, "effort_options": [ - "none", "low", "high", - "xhigh", "max" ] } @@ -118622,9 +116821,9 @@ "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-V3-0324", - "name": "DeepSeek V3 0324", - "display_name": "DeepSeek V3 0324", + "id": "kimi-k2-thinking", + "name": "Kimi K2 Thinking", + "display_name": "Kimi K2 Thinking", "modalities": { "input": [ "text" @@ -118634,24 +116833,37 @@ ] }, "limit": { - "context": 163840, - "output": 163840 + "context": 262144, + "output": 26214 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, "open_weights": true, - "release_date": "2025-03-24", - "last_updated": "2025-03-24", + "knowledge": "2024-08", + "release_date": "2025-11-06", + "last_updated": "2025-11-06", "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-V3", - "name": "DeepSeek-V3", - "display_name": "DeepSeek-V3", + "id": "qwen3.8-2.4t-a95b", + "name": "Qwen3.8 2.4T A95B", + "display_name": "Qwen3.8 2.4T A95B", "modalities": { "input": [ "text" @@ -118661,24 +116873,36 @@ ] }, "limit": { - "context": 64000, - "output": 8192 + "context": 1000000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "minimal", + "low", + "medium", + "high" + ] + } }, "attachment": false, "open_weights": true, - "release_date": "2024-12-26", - "last_updated": "2024-12-26", + "release_date": "2026-08-12", + "last_updated": "2026-08-12", "type": "chat" }, { - "id": "tencent/Hy3", - "name": "Hy3", - "display_name": "Hy3", + "id": "glm-5.3", + "name": "GLM-5.3", + "display_name": "GLM-5.3", "modalities": { "input": [ "text" @@ -118688,7 +116912,7 @@ ] }, "limit": { - "context": 262144, + "context": 1000000, "output": 128000 }, "temperature": true, @@ -118701,22 +116925,22 @@ "reasoning": { "supported": true, "effort_options": [ - "none", "low", - "high" + "high", + "max" ] } }, "attachment": false, "open_weights": true, - "release_date": "2026-07-06", - "last_updated": "2026-07-06", + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "tencent/Hy4-preview", - "name": "Hy4 preview", - "display_name": "Hy4 preview", + "id": "qwen3.7-max", + "name": "Qwen3.7 Max", + "display_name": "Qwen3.7 Max", "modalities": { "input": [ "text" @@ -118740,31 +116964,35 @@ "supported": true, "effort_options": [ "none", + "minimal", + "low", + "medium", "high" ] } }, "attachment": false, - "open_weights": true, - "release_date": "2026-08-28", - "last_updated": "2026-08-28", + "open_weights": false, + "release_date": "2026-05-21", + "last_updated": "2026-05-21", "type": "chat" }, { - "id": "stepfun-ai/Step-3.5-Flash", - "name": "Step 3.5 Flash", - "display_name": "Step 3.5 Flash", + "id": "qwen3.7-flash", + "name": "Qwen3.7 Flash", + "display_name": "Qwen3.7 Flash", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 256000 + "context": 1000000, + "output": 64000 }, "temperature": true, "tool_call": true, @@ -118772,30 +117000,40 @@ "supported": true, "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-01-29", - "last_updated": "2026-02-13", + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "none", + "minimal", + "low", + "medium", + "high" + ] + } + }, + "attachment": true, + "open_weights": false, + "release_date": "2026-07-15", + "last_updated": "2026-07-15", "type": "chat" }, { - "id": "stepfun-ai/Step-3.7-Flash", - "name": "Step 3.7 Flash", - "display_name": "Step 3.7 Flash", + "id": "qwen3.8-max", + "name": "Qwen3.8 Max Preview", + "display_name": "Qwen3.8 Max Preview", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 256000 + "context": 1000000, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -118805,7 +117043,10 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ + "none", + "minimal", "low", "medium", "high" @@ -118813,16 +117054,15 @@ } }, "attachment": true, - "open_weights": true, - "knowledge": "2026-03-01", - "release_date": "2026-05-29", - "last_updated": "2026-05-29", + "open_weights": false, + "release_date": "2026-07-19", + "last_updated": "2026-07-19", "type": "chat" }, { - "id": "meta-llama/Llama-Guard-4-12B", - "name": "Llama Guard 4 12B", - "display_name": "Llama Guard 4 12B", + "id": "kimi-k2.7-code", + "name": "Kimi K2.7 Code", + "display_name": "Kimi K2.7 Code", "modalities": { "input": [ "text", @@ -118833,24 +117073,31 @@ ] }, "limit": { - "context": 163840, - "output": 163840 + "context": 256000, + "output": 16000 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": true, "open_weights": true, - "release_date": "2025-04-29", - "last_updated": "2025-04-29", + "knowledge": "2025-01", + "release_date": "2026-06-12", + "last_updated": "2026-06-12", "type": "chat" }, { - "id": "meta-llama/Llama-3.3-70B-Instruct", - "name": "Llama-3.3-70B-Instruct", - "display_name": "Llama-3.3-70B-Instruct", + "id": "gpt-oss-120b", + "name": "GPT OSS 120B", + "display_name": "GPT OSS 120B", "modalities": { "input": [ "text" @@ -118861,50 +117108,33 @@ }, "limit": { "context": 131072, - "output": 4096 + "output": 13107 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": true, - "knowledge": "2023-12", - "release_date": "2024-12-06", - "last_updated": "2024-12-06", - "type": "chat" - }, - { - "id": "meta-llama/Llama-3.1-8B-Instruct", - "name": "Llama-3.1-8B-Instruct", - "display_name": "Llama-3.1-8B-Instruct", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 131072, - "output": 4096 + "supported": true, + "default": true }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "low", + "medium", + "high" + ] + } }, "attachment": false, "open_weights": true, - "knowledge": "2023-12", - "release_date": "2024-07-23", - "last_updated": "2024-07-23", + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "thinkingmachines/Inkling", + "id": "inkling", "name": "Inkling", "display_name": "Inkling", "modalities": { @@ -118918,7 +117148,7 @@ }, "limit": { "context": 1048576, - "output": 1048576 + "output": 65536 }, "temperature": true, "tool_call": true, @@ -118942,9 +117172,9 @@ "type": "chat" }, { - "id": "thinkingmachines/Inkling-Small", - "name": "Inkling Small", - "display_name": "Inkling Small", + "id": "minimax-m3", + "name": "MiniMax-M3", + "display_name": "MiniMax-M3", "modalities": { "input": [ "text", @@ -118955,47 +117185,8 @@ ] }, "limit": { - "context": 524288, - "output": 1048576 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "attachment": true, - "open_weights": true, - "release_date": "2026-07-30", - "last_updated": "2026-07-30", - "type": "chat" - } - ] - }, - "stepfun-ai-step-plan": { - "id": "stepfun-ai-step-plan", - "name": "StepFun Step Plan (Global)", - "display_name": "StepFun Step Plan (Global)", - "api": "https://api.stepfun.ai/step_plan/v1", - "doc": "https://platform.stepfun.ai/docs/en/step-plan/integrations/reasoning-api", - "models": [ - { - "id": "step-5-preview", - "name": "Step 5 Preview", - "display_name": "Step 5 Preview", - "modalities": { - "input": [ - "text", - "image", - "video" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 1000000, - "output": 384000 + "context": 512000, + "output": 512000 }, "temperature": true, "tool_call": true, @@ -119006,31 +117197,23 @@ "extra_capabilities": { "reasoning": { "supported": true, - "mode": "effort", - "effort": "medium", "effort_options": [ "low", "medium", "high" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" ] } }, "attachment": true, "open_weights": true, - "release_date": "2026-09-16", - "last_updated": "2026-09-20", + "release_date": "2026-06-01", + "last_updated": "2026-06-01", "type": "chat" }, { - "id": "step-3.5-flash-2603", - "name": "Step 3.5 Flash 2603", - "display_name": "Step 3.5 Flash 2603", + "id": "gemma-4-26b-a4b-it", + "name": "Gemma 4 26B A4B IT", + "display_name": "Gemma 4 26B A4B IT", "modalities": { "input": [ "text" @@ -119041,7 +117224,7 @@ }, "limit": { "context": 256000, - "output": 256000 + "output": 25600 }, "temperature": true, "tool_call": true, @@ -119051,41 +117234,31 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "low", - "high" - ] + "supported": true } }, "attachment": false, "open_weights": true, - "knowledge": "2025-01", "release_date": "2026-04-02", "last_updated": "2026-04-02", "type": "chat" }, { - "id": "step-3.5-flash", - "name": "Step 3.5 Flash", - "display_name": "Step 3.5 Flash", + "id": "deepseek-v4.1-flash-1017", + "name": "DeepSeek V4.1 Flash 1017", + "display_name": "DeepSeek V4.1 Flash 1017", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 256000 + "context": 1000000, + "output": 262144 }, "temperature": true, "tool_call": true, @@ -119095,43 +117268,36 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ "low", - "high" + "high", + "max" ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-01-29", - "last_updated": "2026-02-13", + "knowledge": "2025-05", + "release_date": "2026-10-17", + "last_updated": "2026-10-17", "type": "chat" }, { - "id": "step-3.7-flash", - "name": "Step 3.7 Flash", - "display_name": "Step 3.7 Flash", + "id": "qwen3.7-plus", + "name": "Qwen3.7 Plus", + "display_name": "Qwen3.7 Plus", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 256000 + "context": 1000000, + "output": 64000 }, "temperature": true, "tool_call": true, @@ -119142,13 +117308,9 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ + "none", + "minimal", "low", "medium", "high" @@ -119156,38 +117318,30 @@ } }, "attachment": true, - "open_weights": true, - "knowledge": "2026-03-01", - "release_date": "2026-05-29", - "last_updated": "2026-05-29", + "open_weights": false, + "knowledge": "2025-04", + "release_date": "2026-06-02", + "last_updated": "2026-06-02", "type": "chat" - } - ] - }, - "upstage": { - "id": "upstage", - "name": "Upstage", - "display_name": "Upstage", - "api": "https://api.upstage.ai/v1/solar", - "doc": "https://developers.upstage.ai/docs/apis/chat", - "models": [ + }, { - "id": "solar-pro2", - "name": "solar-pro2", - "display_name": "solar-pro2", + "id": "kimi-k3", + "name": "Kimi K3", + "display_name": "Kimi K3", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 65536, - "output": 8192 + "context": 1048576, + "output": 16000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -119195,34 +117349,36 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ - "minimal", - "high" + "low", + "high", + "max" ] } }, - "attachment": false, - "open_weights": false, - "knowledge": "2025-03", - "release_date": "2025-05-20", - "last_updated": "2025-05-20", + "attachment": true, + "open_weights": true, + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" }, { - "id": "solar-pro4", - "name": "Solar Pro 4", - "display_name": "Solar Pro 4", + "id": "qwen3.8-flash", + "name": "Qwen3.8 Flash", + "display_name": "Qwen3.8 Flash", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 524288, - "output": 131072 + "context": 1000000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -119232,39 +117388,38 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ "none", "minimal", "low", "medium", - "high", - "xhigh", - "max" + "high" ] } }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2026-02", - "release_date": "2026-08-06", - "last_updated": "2026-08-06", + "release_date": "2026-08-26", + "last_updated": "2026-08-26", "type": "chat" }, { - "id": "solar-mini4", - "name": "Solar Mini 4", - "display_name": "Solar Mini 4", + "id": "qwen3.8-27b", + "name": "Qwen3.8 27B", + "display_name": "Qwen3.8 27B", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 524288, - "output": 131072 + "context": 1000000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -119279,111 +117434,59 @@ "minimal", "low", "medium", - "high", - "xhigh", - "max" + "high" ] } }, - "attachment": false, - "open_weights": false, - "knowledge": "2026-02", - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "attachment": true, + "open_weights": true, + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "solar-mini", - "name": "solar-mini", - "display_name": "solar-mini", + "id": "prism", + "name": "Prism", + "display_name": "Prism", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 32768, - "output": 4096 + "context": 1000000, + "output": 16000 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2024-09", - "release_date": "2024-06-12", - "last_updated": "2025-04-22", + "release_date": "1970-01-01", + "last_updated": "2026-10-15", "type": "chat" }, { - "id": "solar-pro3", - "name": "solar-pro3", - "display_name": "solar-pro3", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 131072, - "output": 8192 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high" - ] - } - }, - "attachment": false, - "open_weights": false, - "knowledge": "2025-03", - "release_date": "2026-01-26", - "last_updated": "2026-03-23", - "type": "chat" - } - ] - }, - "novita-ai": { - "id": "novita-ai", - "name": "Novita AI", - "display_name": "Novita AI", - "api": "https://api.novita.ai/openai", - "doc": "https://novita.ai/docs/guides/introduction", - "models": [ - { - "id": "inclusionai/ling-3.0-flash-vl", - "name": "Ling 3.0 Flash VL", - "display_name": "Ling 3.0 Flash VL", + "id": "glm-5.3-flash", + "name": "GLM-5.3-Flash", + "display_name": "GLM-5.3-Flash", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 1048576, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -119394,24 +117497,23 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "low", + "high", + "max" ] } }, "attachment": true, "open_weights": true, - "release_date": "2026-09-10", - "last_updated": "2026-09-10", + "release_date": "2026-08-26", + "last_updated": "2026-08-26", "type": "chat" }, { - "id": "inclusionai/ling-3.0-flash-fin", - "name": "Ling 3.0 Flash Fin", - "display_name": "Ling 3.0 Flash Fin", + "id": "deepseek-v4-pro-0813", + "name": "DeepSeek V4 Pro 0813", + "display_name": "DeepSeek V4 Pro 0813", "modalities": { "input": [ "text" @@ -119421,8 +117523,8 @@ ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 1000000, + "output": 262144 }, "temperature": true, "tool_call": true, @@ -119433,24 +117535,32 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "low", + "high", + "max" ] } }, "attachment": false, "open_weights": true, - "release_date": "2026-08-27", - "last_updated": "2026-09-03", + "release_date": "2026-08-13", + "last_updated": "2026-08-22", "type": "chat" - }, + } + ] + }, + "bailing": { + "id": "bailing", + "name": "Bailing", + "display_name": "Bailing", + "api": "https://api.tbox.cn/api/llm/v1", + "doc": "https://alipaytbox.yuque.com/sxs0ba/ling/intro", + "models": [ { - "id": "inclusionai/ling-3.1-flash", - "name": "Ling 3.1 Flash", - "display_name": "Ling 3.1 Flash", + "id": "Ring-1T", + "name": "Ring-1T", + "display_name": "Ring-1T", "modalities": { "input": [ "text" @@ -119460,36 +117570,31 @@ ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 128000, + "output": 32000 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, "attachment": false, "open_weights": true, - "release_date": "2026-09-29", - "last_updated": "2026-09-29", + "knowledge": "2024-06", + "release_date": "2025-10", + "last_updated": "2025-10", "type": "chat" }, { - "id": "inclusionai/ling-3.0-flash", - "name": "Ling 3.0 Flash", - "display_name": "Ling 3.0 Flash", + "id": "Ling-1T", + "name": "Ling-1T", + "display_name": "Ling-1T", "modalities": { "input": [ "text" @@ -119499,49 +117604,49 @@ ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 128000, + "output": 32000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": false, "open_weights": true, - "release_date": "2026-07-23", - "last_updated": "2026-07-23", + "knowledge": "2024-06", + "release_date": "2025-10", + "last_updated": "2025-10", "type": "chat" - }, + } + ] + }, + "modelis": { + "id": "modelis", + "name": "Modelis", + "display_name": "Modelis", + "api": "https://modelishub.com/v1", + "doc": "https://modelishub.com/pricing", + "models": [ { - "id": "inclusionai/ling-3.0-flash-sante", - "name": "Ling 3.0 Flash Sante", - "display_name": "Ling 3.0 Flash Sante", + "id": "claude-fable-5", + "name": "Claude Fable 5", + "display_name": "Claude Fable 5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -119550,52 +117655,40 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], "interleaved": true, "summaries": true, - "visibility": "summary", + "visibility": "omitted", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", + "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", + "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." ] } }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-09-04", - "last_updated": "2026-09-04", - "type": "chat" - }, - { - "id": "baichuan/baichuan-m2-32b", - "name": "Baichuan M2 32B", - "display_name": "Baichuan M2 32B", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 131072, - "output": 131072 - }, - "temperature": true, - "tool_call": false, - "reasoning": { - "supported": true, - "default": true - }, - "attachment": false, - "open_weights": true, - "release_date": "2025-08-13", - "last_updated": "2025-08-13", + "knowledge": "2026-01-31", + "release_date": "2026-06-09", + "last_updated": "2026-06-09", "type": "chat" }, { - "id": "nvidia/nemotron-3-nano-30b-a3b", - "name": "Nemotron 3 Nano 30B A3B", - "display_name": "Nemotron 3 Nano 30B A3B", + "id": "deepseek-v4-flash", + "name": "DeepSeek V4 Flash", + "display_name": "DeepSeek V4 Flash", "modalities": { "input": [ "text" @@ -119605,8 +117698,8 @@ ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 1000000, + "output": 384000 }, "temperature": true, "tool_call": true, @@ -119617,175 +117710,268 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "high", + "max" + ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "notes": [ + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, "attachment": false, "open_weights": true, - "knowledge": "2025-06-25", - "release_date": "2025-12-15", - "last_updated": "2025-12-15", + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "apodex/apodex-1.1-mini", - "name": "Apodex 1.1 Mini", - "display_name": "Apodex 1.1 Mini", + "id": "claude-sonnet-4-6", + "name": "Claude Sonnet 4.6", + "display_name": "Claude Sonnet 4.6", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1000000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "max" + ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-08-24", - "last_updated": "2026-08-24", + "attachment": true, + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-02-17", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "google/gemma-3-27b-it", - "name": "Gemma 3 27B IT", - "display_name": "Gemma 3 27B IT", + "id": "gemini-2.5-pro", + "name": "Gemini 2.5 Pro", + "display_name": "Gemini 2.5 Pro", "modalities": { "input": [ "text", - "image" + "image", + "audio", + "video", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 98304, - "output": 16384 + "context": 1048576, + "output": 65536 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "budget", + "budget": { + "default": -1, + "min": 128, + "max": 32768, + "auto": -1, + "unit": "tokens" + }, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] + } }, "attachment": true, - "open_weights": true, - "knowledge": "2024-08", - "release_date": "2025-03-12", - "last_updated": "2025-03-12", + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2025-06-17", + "last_updated": "2025-06-17", "type": "chat" }, { - "id": "google/gemma-4-31b-it", - "name": "Gemma 4 31B IT", - "display_name": "Gemma 4 31B IT", + "id": "claude-opus-4-8", + "name": "Claude Opus 4.8", + "display_name": "Claude Opus 4.8", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 131072 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], "interleaved": true, "summaries": true, - "visibility": "summary", + "visibility": "omitted", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "open_weights": false, + "knowledge": "2026-01", + "release_date": "2026-05-28", + "last_updated": "2026-05-28", "type": "chat" }, { - "id": "google/gemma-3-12b-it", - "name": "Gemma 3 12B IT", - "display_name": "Gemma 3 12B IT", + "id": "gemini-2.5-flash", + "name": "Gemini 2.5 Flash", + "display_name": "Gemini 2.5 Flash", "modalities": { "input": [ "text", - "image" + "image", + "audio", + "video", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 1048576, + "output": 65536 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "budget", + "budget": { + "default": -1, + "min": 0, + "max": 24576, + "auto": -1, + "off": 0, + "unit": "tokens" + }, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] + } }, "attachment": true, - "open_weights": true, - "knowledge": "2024-08", - "release_date": "2025-03-12", - "last_updated": "2025-03-12", + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2025-06-17", + "last_updated": "2025-06-17", "type": "chat" }, { - "id": "google/gemma-4-26b-a4b-it", - "name": "Gemma 4 26B A4B IT", - "display_name": "Gemma 4 26B A4B IT", + "id": "deepseek-v4-pro", + "name": "DeepSeek V4 Pro", + "display_name": "DeepSeek V4 Pro", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 131072 + "context": 1000000, + "output": 384000 }, "temperature": true, "tool_call": true, @@ -119796,24 +117982,36 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "high", + "max" + ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "notes": [ + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "minimax/minimax-m2.5", - "name": "MiniMax-M2.5", - "display_name": "MiniMax-M2.5", + "id": "qwen/qwen3.7-max", + "name": "Qwen3.7 Max", + "display_name": "Qwen3.7 Max", "modalities": { "input": [ "text" @@ -119823,8 +118021,8 @@ ] }, "limit": { - "context": 204800, - "output": 131100 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -119834,25 +118032,19 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, "attachment": false, - "open_weights": true, - "release_date": "2026-02-12", - "last_updated": "2026-02-12", + "open_weights": false, + "release_date": "2026-05-21", + "last_updated": "2026-05-21", "type": "chat" }, { - "id": "minimax/minimax-m3.1-flash", - "name": "MiniMax-M3.1-Flash", - "display_name": "MiniMax-M3.1-Flash", + "id": "qwen/qwen3.7-plus", + "name": "Qwen3.7 Plus", + "display_name": "Qwen3.7 Plus", "modalities": { "input": [ "text", @@ -119865,7 +118057,7 @@ }, "limit": { "context": 1000000, - "output": 524288 + "output": 64000 }, "temperature": true, "tool_call": true, @@ -119875,32 +118067,29 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ] + "supported": true } }, "attachment": true, "open_weights": false, - "release_date": "2026-10-19", - "last_updated": "2026-10-19", + "knowledge": "2025-04", + "release_date": "2026-06-02", + "last_updated": "2026-06-02", "type": "chat" - }, + } + ] + }, + "vultr": { + "id": "vultr", + "name": "Vultr", + "display_name": "Vultr", + "api": "https://api.vultrinference.com/v1", + "doc": "https://api.vultrinference.com/", + "models": [ { - "id": "minimax/minimax-m3", - "name": "MiniMax-M3", - "display_name": "MiniMax-M3", + "id": "muse-glimmer-30b", + "name": "Muse Glimmer 30B", + "display_name": "Muse Glimmer 30B", "modalities": { "input": [ "text", @@ -119912,7 +118101,7 @@ ] }, "limit": { - "context": 1000000, + "context": 131072, "output": 131072 }, "temperature": true, @@ -119923,25 +118112,25 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "low", + "medium", + "high", + "xhigh" ] } }, "attachment": true, "open_weights": true, - "release_date": "2026-06-01", - "last_updated": "2026-06-01", + "knowledge": "2026-01-04", + "release_date": "2026-08-10", + "last_updated": "2026-08-10", "type": "chat" }, { - "id": "minimax/minimax-m2.7", - "name": "MiniMax-M2.7", - "display_name": "MiniMax-M2.7", + "id": "deepseek-v4-flash-0731", + "name": "DeepSeek V4 Flash 0731", + "display_name": "DeepSeek V4 Flash 0731", "modalities": { "input": [ "text" @@ -119951,8 +118140,8 @@ ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 1048576, + "output": 384000 }, "temperature": true, "tool_call": true, @@ -119963,24 +118152,24 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "low", + "high", + "max" ] } }, "attachment": false, "open_weights": true, - "release_date": "2026-03-18", - "last_updated": "2026-03-18", + "knowledge": "2025-05", + "release_date": "2026-07-31", + "last_updated": "2026-07-31", "type": "chat" }, { - "id": "minimax/minimax-m2.7-highspeed", - "name": "MiniMax-M2.7-highspeed", - "display_name": "MiniMax-M2.7-highspeed", + "id": "glm-5.2", + "name": "GLM-5.2", + "display_name": "GLM-5.2", "modalities": { "input": [ "text" @@ -119990,7 +118179,7 @@ ] }, "limit": { - "context": 204800, + "context": 1048576, "output": 131072 }, "temperature": true, @@ -120002,51 +118191,63 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "none", + "high", + "max" ] } }, "attachment": false, "open_weights": true, - "release_date": "2026-03-18", - "last_updated": "2026-03-18", + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "moonshotai/kimi-k2-instruct", - "name": "Kimi K2 Instruct", - "display_name": "Kimi K2 Instruct", + "id": "deepseek-v4.1-flash", + "name": "DeepSeek V4.1 Flash", + "display_name": "DeepSeek V4.1 Flash", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 98304 + "context": 1048576, + "output": 384000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "low", + "high", + "max" + ] + } + }, + "attachment": true, "open_weights": true, - "release_date": "2025-07-11", - "last_updated": "2025-07-11", + "knowledge": "2025-05", + "release_date": "2026-09-10", + "last_updated": "2026-09-10", "type": "chat" }, { - "id": "moonshotai/kimi-k2-0905", - "name": "Kimi K2 Instruct 0905", - "display_name": "Kimi K2 Instruct 0905", + "id": "glm-5.x-menthol", + "name": "GLM-5", + "display_name": "GLM-5", "modalities": { "input": [ "text" @@ -120056,39 +118257,38 @@ ] }, "limit": { - "context": 262144, - "output": 98304 + "context": 202752, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": false, "open_weights": true, - "release_date": "2025-09-05", - "last_updated": "2025-09-05", + "release_date": "2026-02-12", + "last_updated": "2026-02-12", "type": "chat" }, { - "id": "moonshotai/kimi-k2.7-code", - "name": "Kimi K2.7 Code", - "display_name": "Kimi K2.7 Code", + "id": "glm-5.3", + "name": "GLM-5.3", + "display_name": "GLM-5.3", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1048576, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -120097,25 +118297,23 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "low", + "high", + "max" ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-06-12", - "last_updated": "2026-06-12", + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "moonshotai/kimi-k2-thinking", - "name": "Kimi K2 Thinking", - "display_name": "Kimi K2 Thinking", + "id": "laguna-s-2.1", + "name": "Laguna S 2.1", + "display_name": "Laguna S 2.1", "modalities": { "input": [ "text" @@ -120125,8 +118323,8 @@ ] }, "limit": { - "context": 262144, - "output": 98304 + "context": 1048576, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -120136,31 +118334,25 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, "attachment": false, "open_weights": true, - "knowledge": "2024-08", - "release_date": "2025-11-06", - "last_updated": "2025-11-06", + "release_date": "2026-07-21", + "last_updated": "2026-07-21", "type": "chat" }, { - "id": "moonshotai/kimi-k2.6", - "name": "Kimi K2.6", - "display_name": "Kimi K2.6", + "id": "nemotron-3-nano-omni-30b-a3b-reasoning", + "name": "Nemotron 3 Nano Omni 30B A3B Reasoning", + "display_name": "Nemotron 3 Nano Omni 30B A3B Reasoning", "modalities": { "input": [ "text", "image", - "video" + "video", + "audio" ], "output": [ "text" @@ -120168,7 +118360,7 @@ }, "limit": { "context": 262144, - "output": 262144 + "output": 65536 }, "temperature": true, "tool_call": true, @@ -120178,26 +118370,19 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, "attachment": true, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-20", - "last_updated": "2026-04-20", + "release_date": "2026-04-28", + "last_updated": "2026-04-28", "type": "chat" }, { - "id": "moonshotai/kimi-k3", - "name": "Kimi K3", - "display_name": "Kimi K3", + "id": "minimax-m3", + "name": "MiniMax-M3", + "display_name": "MiniMax-M3", "modalities": { "input": [ "text", @@ -120209,10 +118394,10 @@ ] }, "limit": { - "context": 1048576, - "output": 1048576 + "context": 524288, + "output": 512000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -120220,81 +118405,58 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "none", - "low", - "high", - "max" - ] + "supported": true } }, "attachment": true, "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-16", + "release_date": "2026-06-01", + "last_updated": "2026-06-01", "type": "chat" }, { - "id": "moonshotai/kimi-k3.1-pro-highspeed", - "name": "Kimi K3.1 Pro Highspeed", - "display_name": "Kimi K3.1 Pro Highspeed", + "id": "nemotron-3.5-content-safety", + "name": "Nemotron 3.5 Content Safety", + "display_name": "Nemotron 3.5 Content Safety", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 1048576 + "context": 131072, + "output": 8192 }, - "temperature": false, - "tool_call": true, + "temperature": true, + "tool_call": false, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "low", - "high", - "max" - ] + "supported": true } }, "attachment": true, - "open_weights": false, - "release_date": "2026-10-23", - "last_updated": "2026-10-23", + "open_weights": true, + "release_date": "2026-06-02", + "last_updated": "2026-06-02", "type": "chat" }, { - "id": "moonshotai/kimi-k3.1-pro", - "name": "Kimi K3.1 Pro", - "display_name": "Kimi K3.1 Pro", + "id": "mimo-v2.6-flash-rl", + "name": "MiMo-V2.6-Flash", + "display_name": "MiMo-V2.6-Flash", "modalities": { "input": [ "text", "image", + "audio", "video" ], "output": [ @@ -120303,40 +118465,24 @@ }, "limit": { "context": 1048576, - "output": 1048576 + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "low", - "high", - "max" - ] - } - }, "attachment": true, - "open_weights": false, - "release_date": "2026-10-23", - "last_updated": "2026-10-23", + "open_weights": true, + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "moonshotai/kimi-k2.5", - "name": "Kimi K2.5", - "display_name": "Kimi K2.5", + "id": "qwen3.8-27b", + "name": "Qwen3.8 27B", + "display_name": "Qwen3.8 27B", "modalities": { "input": [ "text", @@ -120349,9 +118495,9 @@ }, "limit": { "context": 262144, - "output": 262144 + "output": 32768 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -120359,26 +118505,23 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "low", + "medium", + "xhigh" ] } }, "attachment": true, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-01-27", - "last_updated": "2026-01-27", + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "stepfun/step-5-preview", - "name": "Step 5 Preview", - "display_name": "Step 5 Preview", + "id": "glm-5.3-flash", + "name": "GLM-5.3-Flash", + "display_name": "GLM-5.3-Flash", "modalities": { "input": [ "text", @@ -120390,8 +118533,8 @@ ] }, "limit": { - "context": 1000000, - "output": 64000 + "context": 1048576, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -120402,33 +118545,28 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ "low", - "medium", - "high" + "high", + "max" ] } }, "attachment": true, "open_weights": true, - "release_date": "2026-09-16", - "last_updated": "2026-09-20", + "release_date": "2026-08-26", + "last_updated": "2026-08-26", "type": "chat" }, { - "id": "stepfun/step-3.7-flash", - "name": "Step 3.7 Flash", - "display_name": "Step 3.7 Flash", + "id": "mimo-v2.6-pro-rl", + "name": "MiMo-V2.6-Pro", + "display_name": "MiMo-V2.6-Pro", "modalities": { "input": [ "text", "image", + "audio", "video" ], "output": [ @@ -120436,8 +118574,8 @@ ] }, "limit": { - "context": 262144, - "output": 256000 + "context": 1048576, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -120445,44 +118583,29 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "low", - "medium", - "high" - ] - } - }, "attachment": true, "open_weights": true, - "knowledge": "2026-03-01", - "release_date": "2026-05-29", - "last_updated": "2026-05-29", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "baidu/cobuddy", - "name": "CoBuddy", - "display_name": "CoBuddy", + "id": "qwen3.8-flash-next", + "name": "Qwen3.8 Flash Next", + "display_name": "Qwen3.8 Flash Next", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 65536 + "context": 262144, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -120492,52 +118615,32 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "low", + "medium", + "xhigh" ] } }, - "attachment": false, - "open_weights": false, - "release_date": "2026-05-06", - "last_updated": "2026-05-06", - "type": "chat" - }, - { - "id": "baidu/ernie-4.5-21B-a3b", - "name": "ERNIE 4.5 21B A3B", - "display_name": "ERNIE 4.5 21B A3B", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 120000, - "output": 8000 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2025-06-30", - "last_updated": "2025-06-30", + "release_date": "2026-08-27", + "last_updated": "2026-08-27", "type": "chat" - }, + } + ] + }, + "morph": { + "id": "morph", + "name": "Morph", + "display_name": "Morph", + "api": "https://api.morphllm.com/v1", + "doc": "https://docs.morphllm.com/api-reference/introduction", + "models": [ { - "id": "nousresearch/hermes-2-pro-llama-3-8b", - "name": "Hermes 2 Pro Llama 3 8B", - "display_name": "Hermes 2 Pro Llama 3 8B", + "id": "auto", + "name": "Auto", + "display_name": "Auto", "modalities": { "input": [ "text" @@ -120547,37 +118650,43 @@ ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 32000, + "output": 32000 }, - "temperature": true, + "temperature": false, "tool_call": false, "reasoning": { - "supported": false + "supported": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": false, - "open_weights": true, - "release_date": "2024-04-30", - "last_updated": "2024-04-30", + "open_weights": false, + "release_date": "2024-06-01", + "last_updated": "2024-06-01", "type": "chat" }, { - "id": "openai/gpt-oss-120b", - "name": "GPT OSS 120B", - "display_name": "GPT OSS 120B", + "id": "morph-kimik3", + "name": "Kimi K3", + "display_name": "Kimi K3", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 1048576, + "output": 1048576 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -120593,23 +118702,23 @@ "thinking_blocks" ], "effort_options": [ + "none", "low", - "medium", - "high" + "high", + "max" ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" }, { - "id": "zai-org/glm-5.1", - "name": "GLM-5.1", - "display_name": "GLM-5.1", + "id": "morph-dsv4flash", + "name": "DeepSeek V4 Flash 0731", + "display_name": "DeepSeek V4 Flash 0731", "modalities": { "input": [ "text" @@ -120619,8 +118728,8 @@ ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 1048576, + "output": 1048576 }, "temperature": true, "tool_call": true, @@ -120636,19 +118745,26 @@ "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "effort_options": [ + "none", + "low", + "high", + "max" ] } }, "attachment": false, "open_weights": true, - "release_date": "2026-04-07", - "last_updated": "2026-04-07", + "knowledge": "2025-05", + "release_date": "2026-07-31", + "last_updated": "2026-07-31", "type": "chat" }, { - "id": "zai-org/glm-5", - "name": "GLM-5", - "display_name": "GLM-5", + "id": "morph-v3-fast", + "name": "Morph V3 Fast", + "display_name": "Morph V3 Fast", "modalities": { "input": [ "text" @@ -120658,49 +118774,38 @@ ] }, "limit": { - "context": 202800, + "context": 262144, "output": 131072 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": false, - "open_weights": true, - "release_date": "2026-02-12", - "last_updated": "2026-02-12", + "open_weights": false, + "release_date": "2025-07-07", + "last_updated": "2025-07-07", "type": "chat" }, { - "id": "zai-org/glm-4.6", - "name": "GLM-4.6", - "display_name": "GLM-4.6", + "id": "morph-kimik3-fast", + "name": "Kimi K3 Fast", + "display_name": "Kimi K3 Fast", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 1048576, + "output": 1048576 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -120714,31 +118819,36 @@ "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "effort_options": [ + "none", + "low", + "high" ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-09-30", - "last_updated": "2025-09-30", + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" }, { - "id": "zai-org/glm-4.5-air", - "name": "GLM-4.5-Air", - "display_name": "GLM-4.5-Air", + "id": "morph-dsv41flash-1017", + "name": "DeepSeek V4.1 Flash 1017", + "display_name": "DeepSeek V4.1 Flash 1017", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 98304 + "context": 1048576, + "output": 1048576 }, "temperature": true, "tool_call": true, @@ -120754,20 +118864,27 @@ "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "effort_options": [ + "none", + "low", + "high", + "xhigh", + "max" ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-07-28", - "last_updated": "2025-07-28", + "knowledge": "2025-05", + "release_date": "2026-10-17", + "last_updated": "2026-10-17", "type": "chat" }, { - "id": "zai-org/glm-5.3", - "name": "GLM-5.3", - "display_name": "GLM-5.3", + "id": "morph-v3-large", + "name": "Morph V3 Large", + "display_name": "Morph V3 Large", "modalities": { "input": [ "text" @@ -120777,110 +118894,22 @@ ] }, "limit": { - "context": 1048576, + "context": 262144, "output": 131072 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "none", - "low", - "high", - "max" - ] - } + "supported": false }, "attachment": false, - "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", - "type": "chat" - }, - { - "id": "zai-org/autoglm-phone-9b-multilingual", - "name": "AutoGLM Phone 9B Multilingual", - "display_name": "AutoGLM Phone 9B Multilingual", - "modalities": { - "input": [ - "text", - "image" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 65536, - "output": 65536 - }, - "temperature": true, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": true, - "release_date": "2025-12-10", - "last_updated": "2025-12-10", - "type": "chat" - }, - { - "id": "zai-org/glm-4.6v", - "name": "GLM-4.6V", - "display_name": "GLM-4.6V", - "modalities": { - "input": [ - "text", - "image", - "video" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 131072, - "output": 32768 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, - "attachment": true, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-12-08", - "last_updated": "2025-12-08", + "open_weights": false, + "release_date": "2025-07-07", + "last_updated": "2025-07-07", "type": "chat" }, { - "id": "zai-org/glm-5.2", + "id": "morph-glm52-744b", "name": "GLM-5.2", "display_name": "GLM-5.2", "modalities": { @@ -120893,7 +118922,7 @@ }, "limit": { "context": 1048576, - "output": 131072 + "output": 1048576 }, "temperature": true, "tool_call": true, @@ -120924,22 +118953,21 @@ "type": "chat" }, { - "id": "zai-org/glm-4.5v", - "name": "GLM-4.5V", - "display_name": "GLM-4.5V", + "id": "morph-dsv41flash", + "name": "DeepSeek V4.1 Flash", + "display_name": "DeepSeek V4.1 Flash", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 65536, - "output": 16384 + "context": 1048576, + "output": 1048576 }, "temperature": true, "tool_call": true, @@ -120955,18 +118983,25 @@ "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "effort_options": [ + "none", + "low", + "high", + "xhigh", + "max" ] } }, "attachment": true, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-08-11", - "last_updated": "2025-08-11", + "knowledge": "2025-05", + "release_date": "2026-09-10", + "last_updated": "2026-09-10", "type": "chat" }, { - "id": "zai-org/glm-5.3-flash", + "id": "morph-glm53flash", "name": "GLM-5.3-Flash", "display_name": "GLM-5.3-Flash", "modalities": { @@ -120981,7 +119016,7 @@ }, "limit": { "context": 1048576, - "output": 131072 + "output": 1048576 }, "temperature": true, "tool_call": true, @@ -120999,6 +119034,7 @@ "thinking_blocks" ], "effort_options": [ + "none", "low", "high", "max" @@ -121012,9 +119048,9 @@ "type": "chat" }, { - "id": "zai-org/glm-4.7", - "name": "GLM-4.7", - "display_name": "GLM-4.7", + "id": "morph-glm53-744b", + "name": "GLM-5.3", + "display_name": "GLM-5.3", "modalities": { "input": [ "text" @@ -121024,8 +119060,8 @@ ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 1048576, + "output": 1048576 }, "temperature": true, "tool_call": true, @@ -121041,31 +119077,47 @@ "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "effort_options": [ + "none", + "low", + "high", + "max" ] } }, "attachment": false, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-12-22", - "last_updated": "2025-12-22", + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" - }, + } + ] + }, + "alibaba-coding-plan-cn": { + "id": "alibaba-coding-plan-cn", + "name": "Alibaba Coding Plan (China)", + "display_name": "Alibaba Coding Plan (China)", + "api": "https://coding.dashscope.aliyuncs.com/v1", + "doc": "https://help.aliyun.com/zh/model-studio/coding-plan", + "models": [ { - "id": "zai-org/glm-4.7-flash", - "name": "GLM-4.7-Flash", - "display_name": "GLM-4.7-Flash", + "id": "qwen3.6-plus", + "name": "Qwen3.6 Plus", + "display_name": "Qwen3.6 Plus", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 128000 + "context": 1000000, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -121084,76 +119136,55 @@ ] } }, - "attachment": false, - "open_weights": true, + "attachment": true, + "open_weights": false, "knowledge": "2025-04", - "release_date": "2026-01-19", - "last_updated": "2026-01-19", + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "qwen/qwen3.8-27b", - "name": "Qwen3.8 27B", - "display_name": "Qwen3.8 27B", + "id": "qwen3-coder-next", + "name": "Qwen3 Coder Next", + "display_name": "Qwen3 Coder Next", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 262144, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "low", - "medium", - "xhigh" - ] - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "release_date": "2026-02-03", + "last_updated": "2026-02-03", "type": "chat" }, { - "id": "qwen/qwen3.5-397b-a17b", - "name": "Qwen3.5 397B-A17B", - "display_name": "Qwen3.5 397B-A17B", + "id": "MiniMax-M2.5", + "name": "MiniMax-M2.5", + "display_name": "MiniMax-M2.5", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 196608, + "output": 24576 }, "temperature": true, "tool_call": true, @@ -121172,28 +119203,27 @@ ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-02-15", - "last_updated": "2026-02-15", + "release_date": "2026-02-12", + "last_updated": "2026-02-12", "type": "chat" }, { - "id": "qwen/qwen3.6-35b-a3b", - "name": "Qwen3.6 35B-A3B", - "display_name": "Qwen3.6 35B-A3B", + "id": "qwen3.5-plus", + "name": "Qwen3.5 Plus", + "display_name": "Qwen3.5 Plus", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, + "context": 1000000, "output": 65536 }, "temperature": true, @@ -121214,75 +119244,60 @@ } }, "attachment": true, - "open_weights": true, - "release_date": "2026-04-17", - "last_updated": "2026-04-17", + "open_weights": false, + "knowledge": "2025-04", + "release_date": "2026-02-16", + "last_updated": "2026-02-16", "type": "chat" }, { - "id": "qwen/qwen3.5-35b-a3b", - "name": "Qwen3.5 35B-A3B", - "display_name": "Qwen3.5 35B-A3B", + "id": "qwen3-coder-plus", + "name": "Qwen3 Coder Plus", + "display_name": "Qwen3 Coder Plus", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, + "context": 1000000, "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-02-23", - "last_updated": "2026-02-23", + "knowledge": "2025-04", + "release_date": "2025-07-23", + "last_updated": "2025-07-23", "type": "chat" }, { - "id": "qwen/qwen3.8-max", - "name": "Qwen3.8 Max", - "display_name": "Qwen3.8 Max", + "id": "qwen3-max-2026-01-23", + "name": "Qwen3 Max", + "display_name": "Qwen3 Max", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 262144, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": true }, "extra_capabilities": { "reasoning": { @@ -121292,37 +119307,30 @@ "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "effort_options": [ - "low", - "medium", - "xhigh" ] } }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2026-08-03", - "last_updated": "2026-08-03", + "knowledge": "2025-04", + "release_date": "2026-01-23", + "last_updated": "2026-01-23", "type": "chat" }, { - "id": "qwen/qwen3-omni-30b-a3b-thinking", - "name": "Qwen3 Omni 30B A3B Thinking", - "display_name": "Qwen3 Omni 30B A3B Thinking", + "id": "glm-5", + "name": "GLM-5", + "display_name": "GLM-5", "modalities": { "input": [ - "text", - "image", - "video", - "audio" + "text" ], "output": [ "text" ] }, "limit": { - "context": 65536, + "context": 202752, "output": 16384 }, "temperature": true, @@ -121342,16 +119350,16 @@ ] } }, - "attachment": true, - "open_weights": true, - "release_date": "2025-09-22", - "last_updated": "2025-09-22", + "attachment": false, + "open_weights": false, + "release_date": "2026-02-11", + "last_updated": "2026-02-11", "type": "chat" }, { - "id": "qwen/qwen3.5-27b", - "name": "Qwen3.5 27B", - "display_name": "Qwen3.5 27B", + "id": "qwen3.7-plus", + "name": "Qwen3.7 Plus", + "display_name": "Qwen3.7 Plus", "modalities": { "input": [ "text", @@ -121363,8 +119371,8 @@ ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 1000000, + "output": 64000 }, "temperature": true, "tool_call": true, @@ -121374,36 +119382,32 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, "attachment": true, - "open_weights": true, - "release_date": "2026-02-23", - "last_updated": "2026-02-23", + "open_weights": false, + "knowledge": "2025-04", + "release_date": "2026-06-02", + "last_updated": "2026-06-02", "type": "chat" }, { - "id": "qwen/qwen3.7-max", - "name": "Qwen3.7 Max", - "display_name": "Qwen3.7 Max", + "id": "kimi-k2.5", + "name": "Kimi K2.5", + "display_name": "Kimi K2.5", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 262144, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -121422,29 +119426,28 @@ ] } }, - "attachment": false, - "open_weights": false, - "release_date": "2026-05-21", - "last_updated": "2026-05-21", + "attachment": true, + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-01-27", + "last_updated": "2026-01-27", "type": "chat" }, { - "id": "qwen/qwen3.6-27b", - "name": "Qwen3.6 27B", - "display_name": "Qwen3.6 27B", + "id": "glm-4.7", + "name": "GLM-4.7", + "display_name": "GLM-4.7", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 202752, + "output": 16384 }, "temperature": true, "tool_call": true, @@ -121463,43 +119466,26 @@ ] } }, - "attachment": true, - "open_weights": true, - "release_date": "2026-04-22", - "last_updated": "2026-04-22", - "type": "chat" - }, - { - "id": "qwen/qwen-mt-plus", - "name": "Qwen MT Plus", - "display_name": "Qwen MT Plus", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 16384, - "output": 8192 - }, - "temperature": true, - "tool_call": false, - "reasoning": { - "supported": false - }, "attachment": false, - "open_weights": false, - "release_date": "2025-07-24", - "last_updated": "2025-07-24", + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-12-22", + "last_updated": "2025-12-22", "type": "chat" - }, + } + ] + }, + "cloudferro-sherlock": { + "id": "cloudferro-sherlock", + "name": "CloudFerro Sherlock", + "display_name": "CloudFerro Sherlock", + "api": "https://api-sherlock.cloudferro.com/openai/v1/", + "doc": "https://docs.sherlock.cloudferro.com/", + "models": [ { - "id": "qwen/qwen3-reranker-8b", - "name": "Qwen3 Reranker 8B", - "display_name": "Qwen3 Reranker 8B", + "id": "meta-llama/Llama-3.3-70B-Instruct", + "name": "Llama 3.3 70B Instruct", + "display_name": "Llama 3.3 70B Instruct", "modalities": { "input": [ "text" @@ -121509,53 +119495,25 @@ ] }, "limit": { - "context": 32768, - "output": 8192 - }, - "temperature": false, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": true, - "release_date": "2025-06-05", - "last_updated": "2025-06-05", - "type": "rerank" - }, - { - "id": "qwen/qwen3-vl-30b-a3b-instruct", - "name": "Qwen3 VL 30B A3B Instruct", - "display_name": "Qwen3 VL 30B A3B Instruct", - "modalities": { - "input": [ - "text", - "image", - "video" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 131072, - "output": 32768 + "context": 70000, + "output": 70000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2025-10-04", - "last_updated": "2025-10-04", + "knowledge": "2024-10-09", + "release_date": "2024-12-06", + "last_updated": "2024-12-06", "type": "chat" }, { - "id": "qwen/qwen3.8-2.4t-a95b", - "name": "Qwen3.8 2.4T A95B", - "display_name": "Qwen3.8 2.4T A95B", + "id": "openai/gpt-oss-120b", + "name": "OpenAI GPT OSS 120B", + "display_name": "OpenAI GPT OSS 120B", "modalities": { "input": [ "text" @@ -121565,8 +119523,8 @@ ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 131000, + "output": 131000 }, "temperature": true, "tool_call": true, @@ -121577,42 +119535,35 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ "low", "medium", - "xhigh" + "high" ] } }, "attachment": false, "open_weights": true, - "release_date": "2026-08-12", - "last_updated": "2026-08-12", + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "qwen/qwen3.5-122b-a10b", - "name": "Qwen3.5 122B-A10B", - "display_name": "Qwen3.5 122B-A10B", + "id": "MiniMaxAI/MiniMax-M2.5", + "name": "MiniMax-M2.5", + "display_name": "MiniMax-M2.5", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 196000, + "output": 16000 }, "temperature": true, "tool_call": true, @@ -121622,37 +119573,30 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-02-23", - "last_updated": "2026-02-23", + "knowledge": "2026-01", + "release_date": "2026-02-12", + "last_updated": "2026-02-12", "type": "chat" }, { - "id": "qwen/qwen3.8-flash", - "name": "Qwen3.8 Flash", - "display_name": "Qwen3.8 Flash", + "id": "zai-org/GLM-5.3", + "name": "GLM-5.3", + "display_name": "GLM-5.3", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, + "context": 262144, "output": 131072 }, "temperature": true, @@ -121664,29 +119608,22 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ "low", - "medium", - "xhigh" + "high" ] } }, - "attachment": true, - "open_weights": false, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", + "attachment": false, + "open_weights": true, + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "qwen/qwen3-embedding-8b", - "name": "Qwen3 Embedding 8B", - "display_name": "Qwen3 Embedding 8B", + "id": "speakleash/Bielik-11B-v3.0-Instruct", + "name": "Bielik 11B v3.0 Instruct", + "display_name": "Bielik 11B v3.0 Instruct", "modalities": { "input": [ "text" @@ -121696,24 +119633,34 @@ ] }, "limit": { - "context": 32768, - "output": 8192 + "context": 32000, + "output": 32000 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": false }, "attachment": false, "open_weights": true, - "release_date": "2025-06-05", - "last_updated": "2025-06-05", - "type": "embedding" - }, + "knowledge": "2025-03", + "release_date": "2025-03-13", + "last_updated": "2025-03-13", + "type": "chat" + } + ] + }, + "orcarouter": { + "id": "orcarouter", + "name": "OrcaRouter", + "display_name": "OrcaRouter", + "api": "https://api.orcarouter.ai/v1", + "doc": "https://docs.orcarouter.ai", + "models": [ { - "id": "tencent/hy3", - "name": "Hy3", - "display_name": "Hy3", + "id": "deepseek/deepseek-v4-flash-0731", + "name": "DeepSeek V4 Flash 0731", + "display_name": "DeepSeek V4 Flash 0731", "modalities": { "input": [ "text" @@ -121723,8 +119670,8 @@ ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1000000, + "output": 384000 }, "temperature": true, "tool_call": true, @@ -121742,21 +119689,23 @@ "thinking_blocks" ], "effort_options": [ - "none", - "high" + "low", + "high", + "max" ] } }, "attachment": false, "open_weights": true, - "release_date": "2026-07-06", - "last_updated": "2026-07-06", + "knowledge": "2025-05", + "release_date": "2026-07-31", + "last_updated": "2026-07-31", "type": "chat" }, { - "id": "tencent/hy4-preview", - "name": "Hy4 preview", - "display_name": "Hy4 preview", + "id": "deepseek/deepseek-v4-flash", + "name": "DeepSeek V4 Flash", + "display_name": "DeepSeek V4 Flash", "modalities": { "input": [ "text" @@ -121767,7 +119716,7 @@ }, "limit": { "context": 1000000, - "output": 64000 + "output": 384000 }, "temperature": true, "tool_call": true, @@ -121778,28 +119727,36 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "high", + "max" + ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" ], - "effort_options": [ - "none", - "high" + "notes": [ + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, "attachment": false, "open_weights": true, - "release_date": "2026-08-28", - "last_updated": "2026-08-28", + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "minimaxai/minimax-m1-80k", - "name": "MiniMax M1 80K", - "display_name": "MiniMax M1 80K", + "id": "deepseek/deepseek-chat", + "name": "DeepSeek Chat", + "display_name": "DeepSeek Chat", "modalities": { "input": [ "text" @@ -121810,162 +119767,24 @@ }, "limit": { "context": 1000000, - "output": 40000 + "output": 384000 }, "temperature": true, "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "attachment": false, - "open_weights": true, - "release_date": "2025-06-17", - "last_updated": "2025-06-17", - "type": "chat" - }, - { - "id": "baai/bge-reranker-v2-m3", - "name": "BGE Reranker V2 M3", - "display_name": "BGE Reranker V2 M3", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 8000, - "output": 8192 - }, - "temperature": false, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": true, - "release_date": "2024-03-15", - "last_updated": "2024-03-15", - "type": "rerank" - }, - { - "id": "baai/bge-m3", - "name": "BGE M3", - "display_name": "BGE M3", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 8192, - "output": 8192 - }, - "temperature": false, - "tool_call": false, "reasoning": { "supported": false }, "attachment": false, "open_weights": true, - "release_date": "2024-01-30", - "last_updated": "2024-01-30", - "type": "embedding" - }, - { - "id": "xiaomimimo/mimo-v2.5", - "name": "MiMo-V2.5", - "display_name": "MiMo-V2.5", - "modalities": { - "input": [ - "text", - "image", - "video" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 1048576, - "output": 131072 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, - "attachment": true, - "open_weights": true, - "knowledge": "2024-12", - "release_date": "2026-04-22", - "last_updated": "2026-04-22", - "type": "chat" - }, - { - "id": "xiaomimimo/mimo-v2.6-pro", - "name": "MiMo-V2.6-Pro", - "display_name": "MiMo-V2.6-Pro", - "modalities": { - "input": [ - "text", - "image", - "audio", - "video" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 1048576, - "output": 131072 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, - "attachment": true, - "open_weights": true, - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "knowledge": "2025-09", + "release_date": "2025-12-01", + "last_updated": "2026-02-28", "type": "chat" }, { - "id": "xiaomimimo/mimo-v2.5-pro", - "name": "MiMo-V2.5-Pro", - "display_name": "MiMo-V2.5-Pro", + "id": "deepseek/deepseek-v4-flash-free", + "name": "DeepSeek V4 Flash (free)", + "display_name": "DeepSeek V4 Flash (free)", "modalities": { "input": [ "text" @@ -121975,8 +119794,8 @@ ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 1000000, + "output": 384000 }, "temperature": true, "tool_call": true, @@ -121992,34 +119811,37 @@ "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "effort_options": [ + "low", + "high", + "max" ] } }, "attachment": false, "open_weights": true, - "knowledge": "2024-12", - "release_date": "2026-04-22", - "last_updated": "2026-04-22", + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "xiaomimimo/mimo-v2.6-flash", - "name": "MiMo-V2.6-Flash", - "display_name": "MiMo-V2.6-Flash", + "id": "deepseek/deepseek-v4-flash-vision-exp", + "name": "DeepSeek V4 Flash Vision Exp", + "display_name": "DeepSeek V4 Flash Vision Exp", "modalities": { "input": [ "text", - "image", - "audio", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 1000000, + "output": 384000 }, "temperature": true, "tool_call": true, @@ -122030,24 +119852,35 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "high", + "max" + ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "notes": [ + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, "attachment": true, "open_weights": true, - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "release_date": "2026-08-21", + "last_updated": "2026-09-01", "type": "chat" }, { - "id": "deepseek/deepseek-r1-0528", - "name": "DeepSeek R1 0528", - "display_name": "DeepSeek R1 0528", + "id": "deepseek/deepseek-reasoner", + "name": "DeepSeek Reasoner", + "display_name": "DeepSeek Reasoner", "modalities": { "input": [ "text" @@ -122057,8 +119890,8 @@ ] }, "limit": { - "context": 163840, - "output": 32768 + "context": 1000000, + "output": 384000 }, "temperature": true, "tool_call": true, @@ -122079,8 +119912,9 @@ }, "attachment": false, "open_weights": true, - "release_date": "2025-05-28", - "last_updated": "2025-05-28", + "knowledge": "2025-09", + "release_date": "2025-12-01", + "last_updated": "2026-02-28", "type": "chat" }, { @@ -122096,8 +119930,8 @@ ] }, "limit": { - "context": 1048576, - "output": 393216 + "context": 1000000, + "output": 384000 }, "temperature": true, "tool_call": true, @@ -122147,8 +119981,8 @@ ] }, "limit": { - "context": 1048576, - "output": 393216 + "context": 1000000, + "output": 384000 }, "temperature": true, "tool_call": true, @@ -122166,7 +120000,6 @@ "thinking_blocks" ], "effort_options": [ - "low", "high", "max" ] @@ -122179,57 +120012,42 @@ "type": "chat" }, { - "id": "deepseek/deepseek-v4-flash-0731", - "name": "DeepSeek V4 Flash 0731", - "display_name": "DeepSeek V4 Flash 0731", + "id": "openai/gpt-4.1-nano", + "name": "GPT-4.1 nano", + "display_name": "GPT-4.1 nano", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 393216 + "context": 1047576, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "low", - "high", - "max" - ] - } + "supported": false }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-07-31", - "last_updated": "2026-07-31", + "attachment": true, + "open_weights": false, + "knowledge": "2024-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", "type": "chat" }, { - "id": "deepseek/deepseek-r1-0528-qwen3-8b", - "name": "DeepSeek R1 0528 Qwen3 8B", - "display_name": "DeepSeek R1 0528 Qwen3 8B", + "id": "openai/gpt-4-turbo", + "name": "GPT-4 Turbo", + "display_name": "GPT-4 Turbo", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" @@ -122237,38 +120055,39 @@ }, "limit": { "context": 128000, - "output": 32000 + "output": 4096 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": false, - "open_weights": true, - "release_date": "2025-05-29", - "last_updated": "2025-05-29", + "attachment": true, + "open_weights": false, + "knowledge": "2023-12", + "release_date": "2023-11-06", + "last_updated": "2024-04-09", "type": "chat" }, { - "id": "deepseek/deepseek-v4.1-flash-1017", - "name": "DeepSeek V4.1 Flash 1017", - "display_name": "DeepSeek V4.1 Flash 1017", + "id": "openai/gpt-5.6-terra", + "name": "GPT-5.6 Terra", + "display_name": "GPT-5.6 Terra", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 393216 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -122277,30 +120096,37 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ + "none", "low", + "medium", "high", + "xhigh", "max" - ] + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-10-17", - "last_updated": "2026-10-17", + "open_weights": false, + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "deepseek/deepseek-v4.1-flash", - "name": "DeepSeek V4.1 Flash", - "display_name": "DeepSeek V4.1 Flash", + "id": "openai/gpt-4o-2024-05-13", + "name": "GPT-4o (2024-05-13)", + "display_name": "GPT-4o (2024-05-13)", "modalities": { "input": [ "text", @@ -122311,98 +120137,132 @@ ] }, "limit": { - "context": 1048576, - "output": 393216 + "context": 128000, + "output": 4096 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "low", - "high", - "max" - ] - } + "supported": false }, "attachment": true, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-09-10", - "last_updated": "2026-09-10", + "open_weights": false, + "knowledge": "2023-09", + "release_date": "2024-05-13", + "last_updated": "2024-05-13", "type": "chat" }, { - "id": "deepseek/deepseek-r1-turbo", - "name": "DeepSeek R1 (Turbo)", - "display_name": "DeepSeek R1 (Turbo)", + "id": "openai/gpt-5.4", + "name": "GPT-5.4", + "display_name": "GPT-5.4", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 64000, - "output": 16000 + "context": 1050000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-07", - "release_date": "2025-01-20", - "last_updated": "2025-05-29", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-03-05", + "last_updated": "2026-03-05", "type": "chat" }, { - "id": "deepseek/deepseek_v3", - "name": "DeepSeek-V3", - "display_name": "DeepSeek-V3", + "id": "openai/gpt-5.6-sol", + "name": "GPT-5.6 Sol", + "display_name": "GPT-5.6 Sol", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 64000, - "output": 16000 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "release_date": "2024-12-26", - "last_updated": "2024-12-26", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "deepseek/deepseek-ocr-2", - "name": "DeepSeek OCR 2", - "display_name": "DeepSeek OCR 2", + "id": "openai/gpt-5.4-mini", + "name": "GPT-5.4 mini", + "display_name": "GPT-5.4 mini", "modalities": { "input": [ "text", @@ -122413,51 +120273,78 @@ ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 400000, + "output": 128000 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } }, "attachment": true, - "open_weights": true, - "release_date": "2026-01-27", - "last_updated": "2026-01-27", + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-03-17", + "last_updated": "2026-03-17", "type": "chat" }, { - "id": "gryphe/mythomax-l2-13b", - "name": "MythoMax L2 13B", - "display_name": "MythoMax L2 13B", + "id": "openai/gpt-4o", + "name": "GPT-4o", + "display_name": "GPT-4o", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 4096, - "output": 3200 + "context": 128000, + "output": 16384 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, - "open_weights": true, - "release_date": "2023-08-10", - "last_updated": "2023-08-10", + "attachment": true, + "open_weights": false, + "knowledge": "2023-09", + "release_date": "2024-05-13", + "last_updated": "2024-08-06", "type": "chat" }, { - "id": "paddlepaddle/paddleocr-vl", - "name": "PaddleOCR VL", - "display_name": "PaddleOCR VL", + "id": "openai/gpt-5.1-codex-mini", + "name": "GPT-5.1 Codex mini", + "display_name": "GPT-5.1 Codex mini", "modalities": { "input": [ "text", @@ -122468,52 +120355,101 @@ ] }, "limit": { - "context": 16384, - "output": 16384 + "context": 400000, + "output": 128000 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } }, "attachment": true, - "open_weights": true, - "release_date": "2025-10-16", - "last_updated": "2025-10-16", + "open_weights": false, + "knowledge": "2024-09-30", + "release_date": "2025-11-13", + "last_updated": "2025-11-13", "type": "chat" }, { - "id": "meta-llama/llama-3.3-70b-instruct", - "name": "Llama-3.3-70B-Instruct", - "display_name": "Llama-3.3-70B-Instruct", + "id": "openai/gpt-5.6-luna", + "name": "GPT-5.6 Luna", + "display_name": "GPT-5.6 Luna", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 12288, - "output": 12288 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2023-12", - "release_date": "2024-12-06", - "last_updated": "2024-12-06", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "meta-llama/llama-4-scout-17b-16e-instruct", - "name": "Llama 4 Scout 17B Instruct", - "display_name": "Llama 4 Scout 17B Instruct", + "id": "openai/gpt-5.2-chat-latest", + "name": "GPT-5.2 Chat", + "display_name": "GPT-5.2 Chat", "modalities": { "input": [ "text", @@ -122524,25 +120460,33 @@ ] }, "limit": { - "context": 131072, - "output": 131072 + "context": 128000, + "output": 16384 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "medium" + ] + } }, "attachment": true, - "open_weights": true, - "knowledge": "2024-08", - "release_date": "2025-04-05", - "last_updated": "2025-04-05", + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2025-12-11", + "last_updated": "2025-12-11", "type": "chat" }, { - "id": "meta-llama/llama-4-maverick-17b-128e-instruct-fp8", - "name": "Llama 4 Maverick 17B Instruct", - "display_name": "Llama 4 Maverick 17B Instruct", + "id": "openai/gpt-5.1-codex", + "name": "GPT-5.1 Codex", + "display_name": "GPT-5.1 Codex", "modalities": { "input": [ "text", @@ -122553,81 +120497,106 @@ ] }, "limit": { - "context": 1048576, - "output": 8192 + "context": 400000, + "output": 128000 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } }, "attachment": true, - "open_weights": true, - "knowledge": "2024-08", - "release_date": "2025-04-05", - "last_updated": "2025-04-05", + "open_weights": false, + "knowledge": "2024-09-30", + "release_date": "2025-11-13", + "last_updated": "2025-11-13", "type": "chat" }, { - "id": "meta-llama/llama-3.2-1b-instruct", - "name": "Llama 3.2 1B Instruct", - "display_name": "Llama 3.2 1B Instruct", + "id": "openai/gpt-4.1", + "name": "GPT-4.1", + "display_name": "GPT-4.1", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131000, - "output": 32000 + "context": 1047576, + "output": 32768 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, - "open_weights": true, - "knowledge": "2023-12", - "release_date": "2024-09-25", - "last_updated": "2024-09-25", + "attachment": true, + "open_weights": false, + "knowledge": "2024-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", "type": "chat" }, { - "id": "meta-llama/llama-3.1-8b-instruct", - "name": "Llama-3.1-8B-Instruct", - "display_name": "Llama-3.1-8B-Instruct", + "id": "openai/gpt-4o-2024-08-06", + "name": "GPT-4o (2024-08-06)", + "display_name": "GPT-4o (2024-08-06)", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 16384, + "context": 128000, "output": 16384 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, - "open_weights": true, - "knowledge": "2023-12", - "release_date": "2024-07-23", - "last_updated": "2024-07-23", + "attachment": true, + "open_weights": false, + "knowledge": "2023-09", + "release_date": "2024-08-06", + "last_updated": "2024-08-06", "type": "chat" }, { - "id": "mindai/macaron-v1-venti", - "name": "Macaron V1 Venti", - "display_name": "Macaron V1 Venti", + "id": "openai/gpt-3.5-turbo", + "name": "GPT-3.5-turbo", + "display_name": "GPT-3.5-turbo", "modalities": { "input": [ "text" @@ -122637,52 +120606,38 @@ ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 16385, + "output": 4096 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "none", - "high", - "max" - ] - } + "supported": false }, "attachment": false, - "open_weights": true, - "release_date": "2026-07-21", - "last_updated": "2026-07-21", + "open_weights": false, + "knowledge": "2021-09-01", + "release_date": "2023-03-01", + "last_updated": "2023-11-06", "type": "chat" }, { - "id": "mindai/macaron-v1-tall", - "name": "Macaron V1 Tall", - "display_name": "Macaron V1 Tall", + "id": "openai/gpt-5.3-codex", + "name": "GPT-5.3 Codex", + "display_name": "GPT-5.3 Codex", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 400000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -122693,67 +120648,90 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ - "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", "high" - ] + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-07-21", - "last_updated": "2026-07-21", + "attachment": true, + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-02-05", + "last_updated": "2026-02-05", "type": "chat" }, { - "id": "microsoft/wizardlm-2-8x22b", - "name": "WizardLM 2 8x22B", - "display_name": "WizardLM 2 8x22B", + "id": "openai/gpt-5.1", + "name": "GPT-5.1", + "display_name": "GPT-5.1", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 65535, - "output": 8000 + "context": 400000, + "output": 128000 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false }, - "attachment": false, - "open_weights": true, - "release_date": "2024-04-15", - "last_updated": "2024-04-15", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2024-09-30", + "release_date": "2025-11-13", + "last_updated": "2025-11-13", "type": "chat" - } - ] - }, - "regolo-ai": { - "id": "regolo-ai", - "name": "Regolo AI", - "display_name": "Regolo AI", - "api": "https://api.regolo.ai/v1", - "doc": "https://docs.regolo.ai/", - "models": [ + }, { - "id": "llama-3.3-70b-instruct", - "name": "Llama 3.3 70B Instruct", - "display_name": "Llama 3.3 70B Instruct", + "id": "openai/gpt-4o-2024-11-20", + "name": "GPT-4o (2024-11-20)", + "display_name": "GPT-4o (2024-11-20)", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" @@ -122768,59 +120746,79 @@ "reasoning": { "supported": false }, - "attachment": false, - "open_weights": true, - "knowledge": "2023-12", - "release_date": "2024-12-06", - "last_updated": "2024-12-06", + "attachment": true, + "open_weights": false, + "knowledge": "2023-09", + "release_date": "2024-11-20", + "last_updated": "2024-11-20", "type": "chat" }, { - "id": "qwen3.8-27b", - "name": "Qwen3.8 27B", - "display_name": "Qwen3.8 27B", + "id": "openai/gpt-5-mini", + "name": "GPT-5 Mini", + "display_name": "GPT-5 Mini", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 120000, - "output": 120000 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "minimal", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, "attachment": true, - "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "open_weights": false, + "knowledge": "2024-05-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "mistral-small-4-119b", - "name": "Mistral Small 4 119B", - "display_name": "Mistral Small 4 119B", + "id": "openai/gpt-oss-120b", + "name": "GPT OSS 120B", + "display_name": "GPT OSS 120B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 16384 + "context": 131072, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -122828,17 +120826,27 @@ "supported": true, "default": true }, - "attachment": true, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "low", + "medium", + "high" + ] + } + }, + "attachment": false, "open_weights": true, - "knowledge": "2025-06", - "release_date": "2026-03-16", - "last_updated": "2026-03-16", + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "gemma4-31b", - "name": "Gemma 4 31B IT", - "display_name": "Gemma 4 31B IT", + "id": "openai/gpt-5.4-pro", + "name": "GPT-5.4 Pro", + "display_name": "GPT-5.4 Pro", "modalities": { "input": [ "text", @@ -122849,39 +120857,60 @@ ] }, "limit": { - "context": 100000, - "output": 100000 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-03-05", + "last_updated": "2026-03-05", "type": "chat" }, { - "id": "glm5.2", - "name": "GLM-5.2", - "display_name": "GLM-5.2", + "id": "openai/gpt-5", + "name": "GPT-5", + "display_name": "GPT-5", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 96000, - "output": 96000 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -122889,133 +120918,170 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ - "high", - "max" - ] + "minimal", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "attachment": true, + "open_weights": false, + "knowledge": "2024-09-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "qwen3-coder-next", - "name": "Qwen3-Coder-Next", - "display_name": "Qwen3-Coder-Next", + "id": "openai/gpt-5.1-chat-latest", + "name": "GPT-5.1 Chat", + "display_name": "GPT-5.1 Chat", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, + "context": 128000, "output": 16384 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-09", - "release_date": "2026-02-03", - "last_updated": "2026-02-03", + "attachment": true, + "open_weights": false, + "knowledge": "2024-09-30", + "release_date": "2025-11-13", + "last_updated": "2025-11-13", "type": "chat" }, { - "id": "brick-v1-beta", - "name": "Brick v1 Beta", - "display_name": "Brick v1 Beta", + "id": "openai/gpt-5.2-codex", + "name": "GPT-5.2 Codex", + "display_name": "GPT-5.2 Codex", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 100000, - "output": 15000 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } }, "attachment": true, "open_weights": false, - "release_date": "2026-02-06", - "last_updated": "2026-02-06", + "knowledge": "2025-08-31", + "release_date": "2025-12-11", + "last_updated": "2025-12-11", "type": "chat" }, { - "id": "apertus-70b", - "name": "Apertus 70B", - "display_name": "Apertus 70B", + "id": "openai/gpt-5.2", + "name": "GPT-5.2", + "display_name": "GPT-5.2", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 30000, - "output": 30000 + "context": 400000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-09", - "release_date": "2025-09-02", - "last_updated": "2025-09-02", - "type": "chat" - }, - { - "id": "faster-whisper-large-v3", - "name": "Faster Whisper Large v3", - "display_name": "Faster Whisper Large v3", - "modalities": { - "input": [ - "audio" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 448, - "output": 4096 + "supported": true, + "default": false }, - "temperature": true, - "tool_call": false, - "reasoning": { - "supported": false + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } }, "attachment": true, - "open_weights": true, - "release_date": "2023-11-06", - "last_updated": "2023-11-06" + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2025-12-11", + "last_updated": "2025-12-11", + "type": "chat" }, { - "id": "brick-complexity-pro", - "name": "Brick Complexity Pro", - "display_name": "Brick Complexity Pro", + "id": "openai/gpt-5-pro", + "name": "GPT-5 Pro", + "display_name": "GPT-5 Pro", "modalities": { "input": [ "text", @@ -123026,24 +121092,41 @@ ] }, "limit": { - "context": 100000, - "output": 15000 + "context": 400000, + "output": 272000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "fixed", + "effort": "high", + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } }, "attachment": true, "open_weights": false, - "release_date": "2026-02-06", - "last_updated": "2026-02-06", + "knowledge": "2024-09-30", + "release_date": "2025-10-06", + "last_updated": "2025-10-06", "type": "chat" }, { - "id": "qwen3-reranker-4b", - "name": "Qwen3-Reranker-4B", - "display_name": "Qwen3-Reranker-4B", + "id": "openai/gpt-4", + "name": "GPT-4", + "display_name": "GPT-4", "modalities": { "input": [ "text" @@ -123053,77 +121136,92 @@ ] }, "limit": { - "context": 32768, + "context": 8192, "output": 8192 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": false }, "attachment": false, - "open_weights": true, - "release_date": "2026-02-01", - "last_updated": "2026-02-01", - "type": "rerank" + "open_weights": false, + "knowledge": "2023-11", + "release_date": "2023-11-06", + "last_updated": "2024-04-09", + "type": "chat" }, { - "id": "gpt-oss-120b", - "name": "GPT-OSS-120B", - "display_name": "GPT-OSS-120B", + "id": "openai/gpt-5.4-nano", + "name": "GPT-5.4 nano", + "display_name": "GPT-5.4 nano", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 400000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ "low", "medium", "high" - ] + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "attachment": true, + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-03-17", + "last_updated": "2026-03-17", "type": "chat" }, { - "id": "qwen3.5-9b", - "name": "Qwen3.5-9B", - "display_name": "Qwen3.5-9B", + "id": "openai/gpt-5.5-pro", + "name": "GPT-5.5 Pro", + "display_name": "GPT-5.5 Pro", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 8192 + "context": 1050000, + "output": 100000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -123132,37 +121230,39 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "medium", + "high", + "xhigh" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-02-23", - "last_updated": "2026-02-23", + "open_weights": false, + "knowledge": "2025-12-01", + "release_date": "2026-04-23", + "last_updated": "2026-04-23", "type": "chat" }, { - "id": "gpt-oss-20b", - "name": "GPT-OSS-20B", - "display_name": "GPT-OSS-20B", + "id": "openai/gpt-5.5", + "name": "GPT-5.5", + "display_name": "GPT-5.5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -123171,24 +121271,35 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ "low", "medium", "high" - ] + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "attachment": true, + "open_weights": false, + "knowledge": "2025-12-01", + "release_date": "2026-04-23", + "last_updated": "2026-04-23", "type": "chat" }, { - "id": "qwen3.5-122b", - "name": "Qwen3.5-122B", - "display_name": "Qwen3.5-122B", + "id": "openai/gpt-5.2-pro", + "name": "GPT-5.2 Pro", + "display_name": "GPT-5.2 Pro", "modalities": { "input": [ "text", @@ -123199,10 +121310,10 @@ ] }, "limit": { - "context": 262144, - "output": 16384 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -123211,50 +121322,64 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, - "open_weights": true, - "release_date": "2026-02-23", - "last_updated": "2026-02-23", + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2025-12-11", + "last_updated": "2025-12-11", "type": "chat" }, { - "id": "qwen-image", - "name": "Qwen-Image", - "display_name": "Qwen-Image", + "id": "openai/gpt-4.1-mini", + "name": "GPT-4.1 mini", + "display_name": "GPT-4.1 mini", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ - "image" + "text" ] }, "limit": { - "context": 8192, - "output": 4096 + "context": 1047576, + "output": 32768 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-03-01", - "last_updated": "2026-03-01" + "knowledge": "2024-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", + "type": "chat" }, { - "id": "deepseek-ocr-2", - "name": "DeepSeek OCR 2", - "display_name": "DeepSeek OCR 2", + "id": "openai/gpt-5-chat-latest", + "name": "GPT-5 Chat (latest)", + "display_name": "GPT-5 Chat (latest)", "modalities": { "input": [ "text", @@ -123265,132 +121390,122 @@ ] }, "limit": { - "context": 4000, - "output": 4000 + "context": 400000, + "output": 100000 }, - "temperature": true, + "temperature": false, "tool_call": false, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": true, - "open_weights": true, - "release_date": "2026-01-27", - "last_updated": "2026-01-27", + "open_weights": false, + "knowledge": "2024-09-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "qwen3-embedding-8b", - "name": "Qwen3-Embedding-8B", - "display_name": "Qwen3-Embedding-8B", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 32768, - "output": 8192 - }, - "temperature": false, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": true, - "release_date": "2025-06-05", - "last_updated": "2025-06-05", - "type": "embedding" - } - ] - }, - "kilo": { - "id": "kilo", - "name": "Kilo Gateway", - "display_name": "Kilo Gateway", - "api": "https://api.kilo.ai/api/gateway", - "doc": "https://kilo.ai", - "models": [ - { - "id": "sao10k/l3-lunaris-8b", - "name": "Sao10K: Llama 3 8B Lunaris", - "display_name": "Sao10K: Llama 3 8B Lunaris", + "id": "openai/gpt-4o-mini", + "name": "GPT-4o mini", + "display_name": "GPT-4o mini", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 8192, - "output": 7372 + "context": 128000, + "output": 16384 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, - "open_weights": true, - "knowledge": "2023-12-31", - "release_date": "2024-08-13", - "last_updated": "2024-08-13", + "attachment": true, + "open_weights": false, + "knowledge": "2023-09", + "release_date": "2024-07-18", + "last_updated": "2024-07-18", "type": "chat" }, { - "id": "sao10k/l3.1-euryale-70b", - "name": "Sao10K: Llama 3.1 Euryale 70B v2.2", - "display_name": "Sao10K: Llama 3.1 Euryale 70B v2.2", + "id": "openai/gpt-5-nano", + "name": "GPT-5 Nano", + "display_name": "GPT-5 Nano", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 16384 + "context": 400000, + "output": 128000 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2023-12-31", - "release_date": "2024-08-28", - "last_updated": "2024-08-28", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "minimal", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2024-05-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "meta/muse-spark-1.3-contributor", - "name": "Meta: Muse Spark 1.3 Contributor", - "display_name": "Meta: Muse Spark 1.3 Contributor", + "id": "kimi/kimi-k2.7-code", + "name": "Kimi K2.7 Code", + "display_name": "Kimi K2.7 Code", "modalities": { "input": [ "text", "image", - "video", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 943718 + "context": 262144, + "output": 262144 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -123398,41 +121513,39 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "minimal", - "low", - "medium", - "high", - "xhigh", - "max" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, "attachment": true, - "open_weights": false, - "release_date": "2026-09-02", - "last_updated": "2026-09-02", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-06-12", + "last_updated": "2026-06-12", "type": "chat" }, { - "id": "meta/muse-wonder", - "name": "Meta: Muse Wonder", - "display_name": "Meta: Muse Wonder", + "id": "kimi/kimi-k2.6", + "name": "Kimi K2.6", + "display_name": "Kimi K2.6", "modalities": { "input": [ "text", "image", - "video", - "pdf", - "audio" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 943718 + "context": 262144, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -123442,32 +121555,31 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "minimal", - "low", - "medium", - "high", - "xhigh", - "max" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, "attachment": true, - "open_weights": false, - "release_date": "2026-10-12", - "last_updated": "2026-10-12", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-04-20", + "last_updated": "2026-04-20", "type": "chat" }, { - "id": "meta/muse-spark-1.2-contributor", - "name": "Meta: Muse Spark 1.2 Contributor", - "display_name": "Meta: Muse Spark 1.2 Contributor", + "id": "kimi/kimi-k3", + "name": "Kimi K3", + "display_name": "Kimi K3", "modalities": { "input": [ "text", "image", - "video", - "pdf" + "video" ], "output": [ "text" @@ -123475,9 +121587,9 @@ }, "limit": { "context": 1048576, - "output": 943718 + "output": 131072 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -123485,42 +121597,45 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ - "minimal", "low", - "medium", "high", - "xhigh" + "max" ] } }, "attachment": true, - "open_weights": false, - "release_date": "2026-08-21", - "last_updated": "2026-08-21", + "open_weights": true, + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" }, { - "id": "meta/muse-spark-open", - "name": "Muse Spark Open", - "display_name": "Muse Spark Open", + "id": "kimi/kimi-k2.5", + "name": "Kimi K2.5", + "display_name": "Kimi K2.5", "modalities": { "input": [ "text", "image", - "video", - "pdf", - "audio" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 943718 + "context": 262144, + "output": 32768 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -123528,39 +121643,37 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "xhigh" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, "attachment": true, "open_weights": true, - "knowledge": "2026-01-04", - "release_date": "2026-10-15", - "last_updated": "2026-10-15", + "knowledge": "2025-01", + "release_date": "2026-01-27", + "last_updated": "2026-01-27", "type": "chat" }, { - "id": "meta/muse-spark-1.3", - "name": "Muse Spark 1.3", - "display_name": "Muse Spark 1.3", + "id": "z-ai/glm-5.2", + "name": "GLM-5.2", + "display_name": "GLM-5.2", "modalities": { "input": [ - "text", - "image", - "video", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 943718 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -123571,40 +121684,39 @@ "extra_capabilities": { "reasoning": { "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ - "minimal", - "low", - "medium", "high", - "xhigh", "max" ] } }, - "attachment": true, - "open_weights": false, - "release_date": "2026-09-02", - "last_updated": "2026-09-02", + "attachment": false, + "open_weights": true, + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "meta/muse-spark-1.2", - "name": "Muse Spark 1.2", - "display_name": "Muse Spark 1.2", + "id": "z-ai/glm-5.3", + "name": "GLM-5.3", + "display_name": "GLM-5.3", "modalities": { "input": [ - "text", - "image", - "video", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 943718 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -123615,39 +121727,40 @@ "extra_capabilities": { "reasoning": { "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ - "minimal", "low", - "medium", "high", - "xhigh" + "max" ] } }, - "attachment": true, - "open_weights": false, - "release_date": "2026-08-05", - "last_updated": "2026-08-05", + "attachment": false, + "open_weights": true, + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "meta/muse-spark-1.1", - "name": "Muse Spark 1.1", - "display_name": "Muse Spark 1.1", + "id": "z-ai/glm-4.5", + "name": "GLM-4.5", + "display_name": "GLM-4.5", "modalities": { "input": [ - "text", - "image", - "pdf", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 943718 + "context": 131072, + "output": 98304 }, "temperature": true, "tool_call": true, @@ -123655,41 +121768,28 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "minimal", - "low", - "medium", - "high", - "xhigh" - ] - } - }, - "attachment": true, - "open_weights": false, - "release_date": "2026-04-08", - "last_updated": "2026-07-09", + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-07-28", + "last_updated": "2025-07-28", "type": "chat" }, { - "id": "meta/muse-glimmer-30b", - "name": "Muse Glimmer 30B", - "display_name": "Muse Glimmer 30B", + "id": "z-ai/glm-4.6", + "name": "GLM-4.6", + "display_name": "GLM-4.6", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 16384 + "context": 204800, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -123699,25 +121799,20 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ] + "supported": true } }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2026-01-04", - "release_date": "2026-08-10", - "last_updated": "2026-08-10", + "knowledge": "2025-04", + "release_date": "2025-09-30", + "last_updated": "2025-09-30", "type": "chat" }, { - "id": "writer/palmyra-x5", - "name": "Writer: Palmyra X5", - "display_name": "Writer: Palmyra X5", + "id": "z-ai/glm-4.5-air", + "name": "GLM-4.5-Air", + "display_name": "GLM-4.5-Air", "modalities": { "input": [ "text" @@ -123727,36 +121822,40 @@ ] }, "limit": { - "context": 1040000, - "output": 8192 + "context": 131072, + "output": 98304 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": false, - "open_weights": false, - "release_date": "2025-04-28", - "last_updated": "2025-04-28", + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-07-28", + "last_updated": "2025-07-28", "type": "chat" }, { - "id": "fireworks/ember-1", - "name": "Fireworks: Ember-1", - "display_name": "Fireworks: Ember-1", + "id": "z-ai/glm-5.3-flash-free", + "name": "GLM-5.3-Flash (free)", + "display_name": "GLM-5.3-Flash (free)", "modalities": { "input": [ "text", - "image" + "image", + "video", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 943718 + "context": 1000000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -123766,8 +121865,14 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ - "none", "low", "high", "max" @@ -123775,15 +121880,15 @@ } }, "attachment": true, - "open_weights": false, - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "open_weights": true, + "release_date": "2026-08-26", + "last_updated": "2026-08-26", "type": "chat" }, { - "id": "relace/relace-search", - "name": "Relace: Relace Search", - "display_name": "Relace: Relace Search", + "id": "z-ai/glm-5", + "name": "GLM-5", + "display_name": "GLM-5", "modalities": { "input": [ "text" @@ -123793,62 +121898,50 @@ ] }, "limit": { - "context": 256000, - "output": 128000 + "context": 204800, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": false, - "release_date": "2025-12-08", - "last_updated": "2025-12-08", - "type": "chat" - }, - { - "id": "relace/relace-apply-3", - "name": "Relace: Relace Apply 3", - "display_name": "Relace: Relace Apply 3", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 256000, - "output": 128000 + "supported": true, + "default": true }, - "temperature": false, - "tool_call": false, - "reasoning": { - "supported": false + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, - "open_weights": false, - "release_date": "2025-09-26", - "last_updated": "2025-09-26", + "open_weights": true, + "release_date": "2026-02-12", + "last_updated": "2026-02-12", "type": "chat" }, { - "id": "ibm-granite/granite-4.2-8b", - "name": "IBM: Granite 4.2 8B", - "display_name": "IBM: Granite 4.2 8B", + "id": "z-ai/glm-5.3-flash", + "name": "GLM-5.3-Flash", + "display_name": "GLM-5.3-Flash", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 117964 + "context": 1000000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -123858,23 +121951,30 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ - "none", "low", - "high" + "high", + "max" ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-08-25", - "last_updated": "2026-08-25", + "release_date": "2026-08-26", + "last_updated": "2026-08-26", "type": "chat" }, { - "id": "ibm-granite/granite-4.0-h-micro", - "name": "IBM: Granite 4.0 Micro", - "display_name": "IBM: Granite 4.0 Micro", + "id": "z-ai/glm-4.7", + "name": "GLM-4.7", + "display_name": "GLM-4.7", "modalities": { "input": [ "text" @@ -123884,37 +121984,48 @@ ] }, "limit": { - "context": 131000, - "output": 117900 + "context": 204800, + "output": 131072 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, - "open_weights": false, - "release_date": "2025-10-20", - "last_updated": "2025-10-20", + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-12-22", + "last_updated": "2025-12-22", "type": "chat" }, { - "id": "inclusionai/ling-3.0-flash-vl", - "name": "inclusionAI: Ling 3.0 Flash VL", - "display_name": "inclusionAI: Ling 3.0 Flash VL", + "id": "z-ai/glm-5.1", + "name": "GLM-5.1", + "display_name": "GLM-5.1", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 200000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -123924,58 +122035,58 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "none", - "high" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-09-10", - "last_updated": "2026-09-10", + "release_date": "2026-04-07", + "last_updated": "2026-04-07", "type": "chat" }, { - "id": "inclusionai/ling-3.1-flash", - "name": "inclusionAI: Ling 3.1 Flash", - "display_name": "inclusionAI: Ling 3.1 Flash", + "id": "orcarouter/auto", + "name": "OrcaRouter Auto", + "display_name": "OrcaRouter Auto", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 235929 + "context": 128000, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": true }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "none", - "high" - ] + "supported": true } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-09-29", - "last_updated": "2026-09-29", + "attachment": true, + "open_weights": false, + "release_date": "2025-01-01", + "last_updated": "2026-05-14", "type": "chat" }, { - "id": "inclusionai/ling-3.0-flash", - "name": "inclusionAI: Ling 3.0 Flash", - "display_name": "inclusionAI: Ling 3.0 Flash", + "id": "orcarouter/fusion-flash", + "name": "OrcaRouter Fusion Flash", + "display_name": "OrcaRouter Fusion Flash", "modalities": { "input": [ "text" @@ -123985,8 +122096,8 @@ ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 200000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -123997,21 +122108,22 @@ "extra_capabilities": { "reasoning": { "effort_options": [ - "none", + "low", + "medium", "high" ] } }, "attachment": false, - "open_weights": true, - "release_date": "2026-07-23", - "last_updated": "2026-07-23", + "open_weights": false, + "release_date": "2026-06-15", + "last_updated": "2026-06-15", "type": "chat" }, { - "id": "sakana/fugu-max", - "name": "Fugu Max", - "display_name": "Fugu Max", + "id": "orcarouter/fusion-mini", + "name": "OrcaRouter Fusion Mini", + "display_name": "OrcaRouter Fusion Mini", "modalities": { "input": [ "text", @@ -124035,64 +122147,55 @@ "extra_capabilities": { "reasoning": { "effort_options": [ - "high", - "xhigh", - "max" + "low", + "medium", + "high" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-09-11", - "last_updated": "2026-09-11", + "release_date": "2026-06-15", + "last_updated": "2026-06-15", "type": "chat" }, { - "id": "sakana/sakana-namazu", - "name": "Sakana Namazu", - "display_name": "Sakana Namazu", + "id": "orcarouter/free", + "name": "OrcaRouter Free", + "display_name": "OrcaRouter Free", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 65536, + "output": 32768 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "high" - ] - } - }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2026-08-03", - "last_updated": "2026-08-03", + "release_date": "2026-08-27", + "last_updated": "2026-08-27", "type": "chat" }, { - "id": "sakana/fugu-ultra", - "name": "Fugu Ultra", - "display_name": "Fugu Ultra", + "id": "orcarouter/fusion", + "name": "OrcaRouter Fusion", + "display_name": "OrcaRouter Fusion", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" @@ -124111,9 +122214,9 @@ "extra_capabilities": { "reasoning": { "effort_options": [ - "high", - "xhigh", - "max" + "low", + "medium", + "high" ] } }, @@ -124124,24 +122227,26 @@ "type": "chat" }, { - "id": "sakana/fugu-ultra-v2", - "name": "Fugu Ultra v2", - "display_name": "Fugu Ultra v2", + "id": "meta/muse-spark-1.2", + "name": "Muse Spark 1.2", + "display_name": "Muse Spark 1.2", "modalities": { "input": [ "text", "image", - "pdf" + "video", + "pdf", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 1048576, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -124149,39 +122254,43 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ + "minimal", + "low", + "medium", "high", - "xhigh", - "max" + "xhigh" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-08-28", - "release_date": "2026-09-11", - "last_updated": "2026-09-11", + "release_date": "2026-08-05", + "last_updated": "2026-08-05", "type": "chat" }, { - "id": "nvidia/nemotron-3.5-content-safety", - "name": "Nemotron 3.5 Content Safety", - "display_name": "Nemotron 3.5 Content Safety", + "id": "meta/muse-spark-1.1", + "name": "Muse Spark 1.1", + "display_name": "Muse Spark 1.1", "modalities": { "input": [ "text", - "image" + "image", + "pdf", + "video" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 117964 + "context": 1048576, + "output": 131072 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, "default": true @@ -124190,32 +122299,36 @@ "reasoning": { "supported": true, "effort_options": [ - "none", - "high" + "minimal", + "low", + "medium", + "high", + "xhigh" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-06-02", - "last_updated": "2026-06-02", + "open_weights": false, + "release_date": "2026-04-08", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "nvidia/nemotron-3-super-120b-a12b:free", - "name": "NVIDIA: Nemotron 3 Super (free)", - "display_name": "NVIDIA: Nemotron 3 Super (free)", + "id": "grok/grok-4.6", + "name": "Grok 4.6", + "display_name": "Grok 4.6", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 235929 + "context": 500000, + "output": 500000 }, "temperature": true, "tool_call": true, @@ -124225,35 +122338,38 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ - "none", "low", - "medium" + "medium", + "high", + "xhigh" ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-06", - "release_date": "2026-03-11", - "last_updated": "2026-03-11", + "attachment": true, + "open_weights": false, + "knowledge": "2026-02-01", + "release_date": "2026-08-12", + "last_updated": "2026-08-12", "type": "chat" }, { - "id": "nvidia/nemotron-3-nano-30b-a3b", - "name": "Nemotron 3 Nano 30B A3B", - "display_name": "Nemotron 3 Nano 30B A3B", + "id": "grok/grok-4.5", + "name": "Grok 4.5", + "display_name": "Grok 4.5", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 235929 + "context": 500000, + "output": 500000 }, "temperature": true, "tool_call": true, @@ -124263,60 +122379,65 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ - "none", + "low", + "medium", "high" ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-06-25", - "release_date": "2025-12-15", - "last_updated": "2025-12-15", + "attachment": true, + "open_weights": false, + "release_date": "2026-07-08", + "last_updated": "2026-07-08", "type": "chat" }, { - "id": "nvidia/nemotron-3.5-content-safety:free", - "name": "NVIDIA: Nemotron 3.5 Content Safety (free)", - "display_name": "NVIDIA: Nemotron 3.5 Content Safety (free)", + "id": "grok/grok-4.3", + "name": "Grok 4.3", + "display_name": "Grok 4.3", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 1000000, + "output": 30000 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ "none", + "low", + "medium", "high" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-06-02", - "last_updated": "2026-06-02", + "open_weights": false, + "release_date": "2026-04-17", + "last_updated": "2026-04-17", "type": "chat" }, { - "id": "nvidia/nemotron-3.5-lightning", - "name": "Nemotron 3.5 Lightning 30B A3B", - "display_name": "Nemotron 3.5 Lightning 30B A3B", + "id": "tencent/hy3", + "name": "Hy3", + "display_name": "Hy3", "modalities": { "input": [ "text" @@ -124326,8 +122447,8 @@ ] }, "limit": { - "context": 262144, - "output": 235929 + "context": 256000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -124340,21 +122461,21 @@ "supported": true, "effort_options": [ "none", + "low", "high" ] } }, "attachment": false, "open_weights": true, - "knowledge": "2025-09", - "release_date": "2026-08-11", - "last_updated": "2026-08-11", + "release_date": "2026-07-06", + "last_updated": "2026-07-06", "type": "chat" }, { - "id": "nvidia/nemotron-3-ultra-550b-a55b", - "name": "Nemotron 3 Ultra 550B A55B", - "display_name": "Nemotron 3 Ultra 550B A55B", + "id": "tencent/hy3-free", + "name": "Hy3 (free)", + "display_name": "Hy3 (free)", "modalities": { "input": [ "text" @@ -124364,8 +122485,8 @@ ] }, "limit": { - "context": 202800, - "output": 182520 + "context": 256000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -124378,37 +122499,36 @@ "supported": true, "effort_options": [ "none", - "medium", + "low", "high" ] } }, "attachment": false, "open_weights": true, - "knowledge": "2025-09", - "release_date": "2026-06-04", - "last_updated": "2026-06-04", + "release_date": "2026-07-06", + "last_updated": "2026-07-06", "type": "chat" }, { - "id": "nvidia/nemotron-3.5-super-vl", - "name": "NVIDIA: Nemotron 3.5 Super VL", - "display_name": "NVIDIA: Nemotron 3.5 Super VL", + "id": "anthropic/claude-fable-5", + "name": "Claude Fable 5", + "display_name": "Claude Fable 5", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 235929 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -124416,25 +122536,46 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", "effort_options": [ - "none", - "high" + "low", + "medium", + "high", + "xhigh", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", + "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", + "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-10-15", - "last_updated": "2026-10-15", + "open_weights": false, + "knowledge": "2026-01-31", + "release_date": "2026-06-09", + "last_updated": "2026-06-09", "type": "chat" }, { - "id": "nvidia/nemotron-3.5-lightning:free", - "name": "NVIDIA: Nemotron 3.5 Lightning (free)", - "display_name": "NVIDIA: Nemotron 3.5 Lightning (free)", + "id": "anthropic/claude-opus-4.6", + "name": "Claude Opus 4.6", + "display_name": "Claude Opus 4.6", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" @@ -124442,113 +122583,167 @@ }, "limit": { "context": 1000000, - "output": 65536 + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", "effort_options": [ - "none", - "high" + "low", + "medium", + "high", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-09", - "release_date": "2026-08-11", - "last_updated": "2026-08-11", + "attachment": true, + "open_weights": false, + "knowledge": "2025-05-31", + "release_date": "2026-02-05", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "nvidia/nemotron-3-super-120b-a12b", - "name": "Nemotron 3 Super 120B A12B", - "display_name": "Nemotron 3 Super 120B A12B", + "id": "anthropic/claude-haiku-4.5", + "name": "Claude Haiku 4.5 (latest)", + "display_name": "Claude Haiku 4.5 (latest)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 235929 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "none", - "low", - "medium" + "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-06", - "release_date": "2026-03-11", - "last_updated": "2026-03-11", + "attachment": true, + "open_weights": false, + "knowledge": "2025-02-28", + "release_date": "2025-10-15", + "last_updated": "2025-10-15", "type": "chat" }, { - "id": "nvidia/nemotron-3-nano-omni-30b-a3b-reasoning:free", - "name": "NVIDIA: Nemotron 3 Nano Omni (free)", - "display_name": "NVIDIA: Nemotron 3 Nano Omni (free)", + "id": "anthropic/claude-opus-4.8", + "name": "Claude Opus 4.8", + "display_name": "Claude Opus 4.8", "modalities": { "input": [ "text", "image", - "video", - "audio" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 65536 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "high", "effort_options": [ - "none", - "high" + "low", + "medium", + "high", + "xhigh", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-04-28", - "last_updated": "2026-04-28", + "open_weights": false, + "knowledge": "2026-01", + "release_date": "2026-05-28", + "last_updated": "2026-05-28", "type": "chat" }, { - "id": "nvidia/nemotron-3-ultra-550b-a55b:free", - "name": "NVIDIA: Nemotron 3 Ultra (free)", - "display_name": "NVIDIA: Nemotron 3 Ultra (free)", + "id": "anthropic/claude-opus-4.7", + "name": "Claude Opus 4.7", + "display_name": "Claude Opus 4.7", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" @@ -124556,39 +122751,56 @@ }, "limit": { "context": 1000000, - "output": 65536 + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "high", "effort_options": [ - "none", + "low", "medium", - "high" + "high", + "xhigh", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-09", - "release_date": "2026-06-04", - "last_updated": "2026-06-04", + "attachment": true, + "open_weights": false, + "knowledge": "2026-01-31", + "release_date": "2026-04-16", + "last_updated": "2026-04-16", "type": "chat" }, { - "id": "nvidia/nemotron-3.5-super-vl:free", - "name": "NVIDIA: Nemotron 3.5 Super VL (free)", - "display_name": "NVIDIA: Nemotron 3.5 Super VL (free)", + "id": "anthropic/claude-sonnet-4.6", + "name": "Claude Sonnet 4.6", + "display_name": "Claude Sonnet 4.6", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" @@ -124596,46 +122808,68 @@ }, "limit": { "context": 1000000, - "output": 131072 + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", "effort_options": [ - "none", - "high" + "low", + "medium", + "high", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-10-15", - "last_updated": "2026-10-15", + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-02-17", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "nex-agi/nex-n2.5-pro", - "name": "Nex AGI: Nex-N2.5-Pro", - "display_name": "Nex AGI: Nex-N2.5-Pro", + "id": "anthropic/claude-opus-5", + "name": "Claude Opus 5", + "display_name": "Claude Opus 5", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 235929 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -124643,8 +122877,9 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ - "none", + "low", "medium", "high" ] @@ -124652,37 +122887,40 @@ }, "attachment": true, "open_weights": false, - "release_date": "2026-09-08", - "last_updated": "2026-09-08", + "knowledge": "2026-05", + "release_date": "2026-07-24", + "last_updated": "2026-07-24", "type": "chat" }, { - "id": "nex-agi/nex-n2.5-mini", - "name": "Nex AGI: Nex-N2.5-Mini", - "display_name": "Nex AGI: Nex-N2.5-Mini", + "id": "anthropic/claude-sonnet-5", + "name": "Claude Sonnet 5", + "display_name": "Claude Sonnet 5", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 235929 + "context": 1000000, + "output": 128000 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ - "none", + "low", "medium", "high" ] @@ -124690,100 +122928,136 @@ }, "attachment": true, "open_weights": false, - "release_date": "2026-09-08", - "last_updated": "2026-09-08", + "knowledge": "2026-01-31", + "release_date": "2026-06-30", + "last_updated": "2026-06-30", "type": "chat" }, { - "id": "recursive/flint-v1.0:free", - "name": "Recursive: Flint (free)", - "display_name": "Recursive: Flint (free)", + "id": "anthropic/claude-opus-4.5", + "name": "Claude Opus 4.5 (latest)", + "display_name": "Claude Opus 4.5 (latest)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 235929 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", "effort_options": [ + "low", + "medium", "high" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." ] } }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-10-21", - "last_updated": "2026-10-21", + "knowledge": "2025-05", + "release_date": "2025-11-24", + "last_updated": "2025-11-24", "type": "chat" }, { - "id": "dots-studio/dots-3-note-preview:free", - "name": "Dots Studio: Dots3-Note Preview (free)", - "display_name": "Dots Studio: Dots3-Note Preview (free)", + "id": "anthropic/claude-sonnet-4.5", + "name": "Claude Sonnet 4.5 (latest)", + "display_name": "Claude Sonnet 4.5 (latest)", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 512000, - "output": 460800 + "context": 1000000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "none", - "high" + "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "knowledge": "2025-07-31", + "release_date": "2025-09-29", + "last_updated": "2025-09-29", "type": "chat" }, { - "id": "google/gemini-3-pro-image", - "name": "Nano Banana Pro", - "display_name": "Nano Banana Pro", + "id": "minimax/minimax-m2.7", + "name": "MiniMax-M2.7", + "display_name": "MiniMax-M2.7", "modalities": { "input": [ - "image", - "text", - "pdf" + "text" ], "output": [ - "text", - "image" + "text" ] }, "limit": { - "context": 65536, - "output": 32768 + "context": 204800, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -124794,113 +123068,109 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "low", - "high" - ], + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-05-28", - "last_updated": "2026-05-28" + "attachment": false, + "open_weights": true, + "release_date": "2026-03-18", + "last_updated": "2026-03-18", + "type": "chat" }, { - "id": "google/gemma-3-27b-it", - "name": "Gemma 3 27B IT", - "display_name": "Gemma 3 27B IT", + "id": "minimax/minimax-m2.7-highspeed", + "name": "MiniMax-M2.7-highspeed", + "display_name": "MiniMax-M2.7-highspeed", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 117964 + "context": 204800, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, "open_weights": true, - "knowledge": "2024-08", - "release_date": "2025-03-12", - "last_updated": "2025-03-12", + "release_date": "2026-03-18", + "last_updated": "2026-03-18", "type": "chat" }, { - "id": "google/gemini-3.1-flash-lite-image", - "name": "Nano Banana 2 Lite", - "display_name": "Nano Banana 2 Lite", + "id": "minimax/minimax-m3", + "name": "MiniMax-M3", + "display_name": "MiniMax-M3", "modalities": { "input": [ - "image", "text", - "pdf" + "image", + "video" ], "output": [ - "text", - "image" + "text" ] }, "limit": { - "context": 65536, - "output": 58982 + "context": 1048576, + "output": 512000 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "effort_options": [ - "none", - "minimal", - "high" - ] + "supported": true } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-06-30", - "last_updated": "2026-06-30" + "open_weights": true, + "release_date": "2026-06-01", + "last_updated": "2026-06-01", + "type": "chat" }, { - "id": "google/gemma-4-31b-it", - "name": "Gemma 4 31B IT", - "display_name": "Gemma 4 31B IT", + "id": "minimax/minimax-m2.5", + "name": "MiniMax-M2.5", + "display_name": "MiniMax-M2.5", "modalities": { "input": [ - "image", - "text", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 235929 + "context": 204800, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -124910,24 +123180,52 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "effort_options": [ - "none", - "high" - ] + "supported": true } }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "release_date": "2026-02-12", + "last_updated": "2026-02-12", "type": "chat" }, { - "id": "google/gemini-4-argon", - "name": "Gemini 4 Argon", - "display_name": "Gemini 4 Argon", + "id": "minimax/minimax-m2.5-highspeed", + "name": "MiniMax-M2.5-highspeed", + "display_name": "MiniMax-M2.5-highspeed", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 204800, + "output": 131072 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": false, + "open_weights": true, + "release_date": "2026-02-13", + "last_updated": "2026-02-13", + "type": "chat" + }, + { + "id": "google/gemini-3.1-pro-preview", + "name": "Gemini 3.1 Pro Preview", + "display_name": "Gemini 3.1 Pro Preview", "modalities": { "input": [ "text", @@ -124942,7 +123240,7 @@ }, "limit": { "context": 1048576, - "output": 943718 + "output": 65536 }, "temperature": true, "tool_call": true, @@ -124952,30 +123250,38 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ "low", - "medium", "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-10-13", - "last_updated": "2026-10-13", + "knowledge": "2025-01", + "release_date": "2026-02-19", + "last_updated": "2026-02-19", "type": "chat" }, { - "id": "google/gemini-2.5-pro", - "name": "Gemini 2.5 Pro", - "display_name": "Gemini 2.5 Pro", + "id": "google/gemini-3-flash-preview", + "name": "Gemini 3 Flash Preview", + "display_name": "Gemini 3 Flash Preview", "modalities": { "input": [ "text", "image", - "audio", "video", + "audio", "pdf" ], "output": [ @@ -124996,14 +123302,14 @@ "reasoning": { "supported": true, "default_enabled": true, - "mode": "budget", - "budget": { - "default": -1, - "min": 128, - "max": 32768, - "auto": -1, - "unit": "tokens" - }, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", + "low", + "medium", + "high" + ], "summaries": true, "visibility": "summary", "continuation": [ @@ -125014,14 +123320,14 @@ "attachment": true, "open_weights": false, "knowledge": "2025-01", - "release_date": "2025-06-17", - "last_updated": "2025-06-17", + "release_date": "2025-12-17", + "last_updated": "2025-12-17", "type": "chat" }, { - "id": "google/gemini-3.5-flash", - "name": "Gemini 3.5 Flash", - "display_name": "Gemini 3.5 Flash", + "id": "google/gemini-3.1-pro-preview-customtools", + "name": "Gemini 3.1 Pro Preview Custom Tools", + "display_name": "Gemini 3.1 Pro Preview Custom Tools", "modalities": { "input": [ "text", @@ -125051,9 +123357,7 @@ "mode": "level", "level": "high", "level_options": [ - "minimal", "low", - "medium", "high" ], "summaries": true, @@ -125066,20 +123370,21 @@ "attachment": true, "open_weights": false, "knowledge": "2025-01", - "release_date": "2026-05-19", - "last_updated": "2026-05-19", + "release_date": "2026-02-19", + "last_updated": "2026-02-19", "type": "chat" }, { - "id": "google/gemini-2.5-pro-preview", - "name": "Gemini 2.5 Pro Preview 06-05", - "display_name": "Gemini 2.5 Pro Preview 06-05", + "id": "google/gemini-2.5-pro", + "name": "Gemini 2.5 Pro", + "display_name": "Gemini 2.5 Pro", "modalities": { "input": [ - "pdf", - "image", "text", - "audio" + "image", + "audio", + "video", + "pdf" ], "output": [ "text" @@ -125116,9 +123421,9 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2025-01-31", - "release_date": "2025-06-05", - "last_updated": "2025-06-05", + "knowledge": "2025-01", + "release_date": "2025-06-17", + "last_updated": "2025-06-17", "type": "chat" }, { @@ -125166,39 +123471,9 @@ "type": "chat" }, { - "id": "google/gemini-2.5-flash-image", - "name": "Nano Banana", - "display_name": "Nano Banana", - "modalities": { - "input": [ - "image", - "text", - "pdf" - ], - "output": [ - "text", - "image" - ] - }, - "limit": { - "context": 32768, - "output": 8192 - }, - "temperature": true, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-06", - "release_date": "2025-08-26", - "last_updated": "2025-08-26" - }, - { - "id": "google/gemini-3.1-pro-preview", - "name": "Gemini 3.1 Pro Preview", - "display_name": "Gemini 3.1 Pro Preview", + "id": "google/gemini-flash-latest", + "name": "Gemini Flash Latest", + "display_name": "Gemini Flash Latest", "modalities": { "input": [ "text", @@ -125223,38 +123498,30 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ + "effort_options": [ "low", + "medium", "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-02-19", - "last_updated": "2026-02-19", + "knowledge": "2026-03", + "release_date": "2026-08-13", + "last_updated": "2026-08-13", "type": "chat" }, { - "id": "google/gemini-2.5-flash", - "name": "Gemini 2.5 Flash", - "display_name": "Gemini 2.5 Flash", + "id": "google/gemini-3.1-flash-lite-preview", + "name": "Gemini 3.1 Flash Lite Preview", + "display_name": "Gemini 3.1 Flash Lite Preview", "modalities": { "input": [ "text", "image", - "audio", "video", + "audio", "pdf" ], "output": [ @@ -125263,7 +123530,7 @@ }, "limit": { "context": 1048576, - "output": 65535 + "output": 65536 }, "temperature": true, "tool_call": true, @@ -125273,93 +123540,69 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "budget", - "budget": { - "default": -1, - "min": 0, - "max": 24576, - "auto": -1, - "off": 0, - "unit": "tokens" - }, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" + "effort_options": [ + "minimal", + "low", + "medium", + "high" ] } }, "attachment": true, "open_weights": false, "knowledge": "2025-01", - "release_date": "2025-06-17", - "last_updated": "2025-06-17", + "release_date": "2026-03-03", + "last_updated": "2026-03-03", "type": "chat" }, { - "id": "google/gemma-3-12b-it", - "name": "Gemma 3 12B IT", - "display_name": "Gemma 3 12B IT", + "id": "google/gemini-3.1-flash-lite", + "name": "Gemini 3.1 Flash Lite", + "display_name": "Gemini 3.1 Flash Lite", "modalities": { "input": [ "text", - "image" + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, - "limit": { - "context": 131072, - "output": 16384 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": true, - "knowledge": "2024-08", - "release_date": "2025-03-12", - "last_updated": "2025-03-12", - "type": "chat" - }, - { - "id": "google/lyria-3-pro-preview", - "name": "Lyria 3 Pro Preview", - "display_name": "Lyria 3 Pro Preview", - "modalities": { - "input": [ - "text", - "image" - ], - "output": [ - "text", - "audio" - ] - }, "limit": { "context": 1048576, "output": 65536 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "minimal", + "low", + "medium", + "high" + ] + } }, "attachment": true, "open_weights": false, - "release_date": "2026-03-25", - "last_updated": "2026-03-25", + "knowledge": "2025-01", + "release_date": "2026-05-07", + "last_updated": "2026-05-07", "type": "chat" }, { - "id": "google/gemini-3.8-flash", - "name": "Gemini 3.8 Flash", - "display_name": "Gemini 3.8 Flash", + "id": "google/gemini-flash-lite-latest", + "name": "Gemini Flash-Lite Latest", + "display_name": "Gemini Flash-Lite Latest", "modalities": { "input": [ "text", @@ -125384,98 +123627,75 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ + "effort_options": [ "minimal", "low", "medium", "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-09-02", - "last_updated": "2026-09-02", + "knowledge": "2026-03", + "release_date": "2026-07-21", + "last_updated": "2026-07-21", "type": "chat" }, { - "id": "google/gemini-3-pro-image-preview", - "name": "Nano Banana Pro Preview", - "display_name": "Nano Banana Pro Preview", + "id": "google/gemini-robotics-er-1.6-preview", + "name": "Gemini Robotics-ER 1.6 Preview", + "display_name": "Gemini Robotics-ER 1.6 Preview", "modalities": { "input": [ - "image", "text", - "pdf" + "image", + "video", + "audio" ], "output": [ - "text", - "image" + "text" ] }, "limit": { - "context": 65536, - "output": 32768 + "context": 131072, + "output": 65536 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "low", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] - } - }, "attachment": true, "open_weights": false, "knowledge": "2025-01", - "release_date": "2025-11-20", - "last_updated": "2025-11-20" + "release_date": "2026-04-14", + "last_updated": "2026-04-14", + "type": "chat" }, { - "id": "google/gemini-3.1-flash-image-preview", - "name": "Nano Banana 2 Preview", - "display_name": "Nano Banana 2 Preview", + "id": "google/gemini-2.5-flash", + "name": "Gemini 2.5 Flash", + "display_name": "Gemini 2.5 Flash", "modalities": { "input": [ "text", "image", + "audio", + "video", "pdf" ], "output": [ - "text", - "image" + "text" ] }, "limit": { - "context": 65536, - "output": 58982 + "context": 1048576, + "output": 65536 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, "default": true @@ -125483,67 +123703,80 @@ "extra_capabilities": { "reasoning": { "supported": true, - "effort_options": [ - "none", - "minimal", - "high" + "default_enabled": true, + "mode": "budget", + "budget": { + "default": -1, + "min": 0, + "max": 24576, + "auto": -1, + "off": 0, + "unit": "tokens" + }, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" ] } }, "attachment": true, "open_weights": false, "knowledge": "2025-01", - "release_date": "2026-02-26", - "last_updated": "2026-02-26" + "release_date": "2025-06-17", + "last_updated": "2025-06-17", + "type": "chat" }, { - "id": "google/lyria-3-clip-preview", - "name": "Lyria 3 Clip Preview", - "display_name": "Lyria 3 Clip Preview", + "id": "google/gemma-4-26b-a4b-it", + "name": "Gemma 4 26B A4B IT", + "display_name": "Gemma 4 26B A4B IT", "modalities": { "input": [ "text", "image" ], "output": [ - "text", - "audio" + "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 262144, + "output": 32768 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": true, - "open_weights": false, - "release_date": "2026-03-25", - "last_updated": "2026-03-25", + "open_weights": true, + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "google/gemini-3.7-flash", - "name": "Gemini 3.7 Flash", - "display_name": "Gemini 3.7 Flash", + "id": "google/gemma-4-31b-it", + "name": "Gemma 4 31B IT", + "display_name": "Gemma 4 31B IT", "modalities": { "input": [ "text", - "image", - "video", - "audio", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 262144, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -125553,28 +123786,14 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", - "low", - "medium", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] + "supported": true } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-08-13", - "last_updated": "2026-08-13", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { @@ -125595,7 +123814,7 @@ }, "limit": { "context": 1048576, - "output": 65535 + "output": 65536 }, "temperature": true, "tool_call": true, @@ -125630,9 +123849,9 @@ "type": "chat" }, { - "id": "google/gemini-3-flash-preview", - "name": "Gemini 3 Flash Preview", - "display_name": "Gemini 3 Flash Preview", + "id": "google/gemini-3.5-flash", + "name": "Gemini 3.5 Flash", + "display_name": "Gemini 3.5 Flash", "modalities": { "input": [ "text", @@ -125677,8 +123896,8 @@ "attachment": true, "open_weights": false, "knowledge": "2025-01", - "release_date": "2025-12-17", - "last_updated": "2025-12-17", + "release_date": "2026-05-19", + "last_updated": "2026-05-19", "type": "chat" }, { @@ -125734,23 +123953,21 @@ "type": "chat" }, { - "id": "google/gemini-3.1-flash-lite-preview", - "name": "Gemini 3.1 Flash Lite Preview", - "display_name": "Gemini 3.1 Flash Lite Preview", + "id": "qwen/qwen3.6-plus", + "name": "Qwen3.6 Plus", + "display_name": "Qwen3.6 Plus", "modalities": { "input": [ "text", "image", - "video", - "audio", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1048576, + "context": 1000000, "output": 65536 }, "temperature": true, @@ -125761,109 +123978,77 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "none", - "minimal", - "low", - "medium", - "high" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-03-03", - "last_updated": "2026-03-03", + "knowledge": "2025-04", + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "google/gemini-3.1-flash-image", - "name": "Nano Banana 2", - "display_name": "Nano Banana 2", + "id": "qwen/qwen3-max", + "name": "Qwen3 Max", + "display_name": "Qwen3 Max", "modalities": { "input": [ - "image", - "text", - "pdf" + "text" ], "output": [ - "text", - "image" + "text" ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 262144, + "output": 65536 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": true }, "extra_capabilities": { "reasoning": { "supported": true, - "effort_options": [ - "none", - "minimal", - "high" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-05-28", - "last_updated": "2026-05-28" - }, - { - "id": "google/gemma-2-27b-it", - "name": "Gemma 2 27B", - "display_name": "Gemma 2 27B", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 8192, - "output": 2048 - }, - "temperature": true, - "tool_call": false, - "reasoning": { - "supported": false - }, "attachment": false, - "open_weights": true, - "knowledge": "2024-06-30", - "release_date": "2024-07-13", - "last_updated": "2024-07-13", + "open_weights": false, + "knowledge": "2025-04", + "release_date": "2025-09-23", + "last_updated": "2025-09-23", "type": "chat" }, { - "id": "google/gemini-3.1-pro-preview-customtools", - "name": "Gemini 3.1 Pro Preview Custom Tools", - "display_name": "Gemini 3.1 Pro Preview Custom Tools", + "id": "qwen/qwen3.5-35b-a3b", + "name": "Qwen3.5 35B-A3B", + "display_name": "Qwen3.5 35B-A3B", "modalities": { "input": [ "text", "image", - "video", - "audio", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1048576, + "context": 262144, "output": 65536 }, "temperature": true, @@ -125875,46 +124060,35 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "low", - "high" - ], + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-02-19", - "last_updated": "2026-02-19", + "open_weights": true, + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" }, { - "id": "google/gemini-3.1-flash-lite", - "name": "Gemini 3.1 Flash Lite", - "display_name": "Gemini 3.1 Flash Lite", + "id": "qwen/qwen3.7-max", + "name": "Qwen3.7 Max", + "display_name": "Qwen3.7 Max", "modalities": { "input": [ - "text", - "image", - "video", - "audio", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -125924,31 +124098,23 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "effort_options": [ - "none", - "minimal", - "low", - "medium", - "high" - ] + "supported": true } }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-05-07", - "last_updated": "2026-05-07", + "release_date": "2026-05-21", + "last_updated": "2026-05-21", "type": "chat" }, { - "id": "google/gemma-4-26b-a4b-it", - "name": "Gemma 4 26B A4B IT", - "display_name": "Gemma 4 26B A4B IT", + "id": "qwen/qwen3.5-plus", + "name": "Qwen3.5 Plus", + "display_name": "Qwen3.5 Plus", "modalities": { "input": [ - "image", "text", + "image", "video" ], "output": [ @@ -125956,8 +124122,8 @@ ] }, "limit": { - "context": 262144, - "output": 235929 + "context": 1000000, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -125968,36 +124134,38 @@ "extra_capabilities": { "reasoning": { "supported": true, - "effort_options": [ - "none", - "high" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "open_weights": false, + "knowledge": "2025-04", + "release_date": "2026-02-16", + "last_updated": "2026-02-16", "type": "chat" }, { - "id": "google/gemini-nano-banana-2.1", - "name": "Nano Banana 2.1", - "display_name": "Nano Banana 2.1", + "id": "qwen/qwen3.7-flash", + "name": "Qwen3.7 Flash", + "display_name": "Qwen3.7 Flash", "modalities": { "input": [ - "image", "text", - "pdf" + "image", + "video" ], "output": [ - "text", - "image" + "text" ] }, "limit": { - "context": 65536, - "output": 58982 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -126007,61 +124175,32 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "none", - "minimal", - "high" - ] + "supported": true } }, "attachment": true, "open_weights": false, - "release_date": "2026-10-06", - "last_updated": "2026-10-06" - }, - { - "id": "google/gemma-3-4b-it", - "name": "Gemma 3 4B IT", - "display_name": "Gemma 3 4B IT", - "modalities": { - "input": [ - "text", - "image" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 131072, - "output": 117964 - }, - "temperature": true, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": true, - "knowledge": "2024-08", - "release_date": "2025-03-12", - "last_updated": "2025-03-12", + "release_date": "2026-07-15", + "last_updated": "2026-07-15", "type": "chat" }, { - "id": "minimax/minimax-m2", - "name": "MiniMax-M2", - "display_name": "MiniMax-M2", + "id": "qwen/qwen3.8-max", + "name": "Qwen3.8 Max", + "display_name": "Qwen3.8 Max", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 204800, + "context": 1000000, "output": 131072 }, "temperature": true, @@ -126072,32 +124211,43 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ - "high" + "low", + "medium", + "xhigh" ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2025-10-27", - "last_updated": "2025-10-27", + "attachment": true, + "open_weights": false, + "release_date": "2026-08-03", + "last_updated": "2026-08-03", "type": "chat" }, { - "id": "minimax/minimax-m2.5", - "name": "MiniMax-M2.5", - "display_name": "MiniMax-M2.5", + "id": "qwen/qwen3.6-flash", + "name": "Qwen3.6 Flash", + "display_name": "Qwen3.6 Flash", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 1000000, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -126108,21 +124258,24 @@ "extra_capabilities": { "reasoning": { "supported": true, - "effort_options": [ - "high" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-02-12", - "last_updated": "2026-02-12", + "attachment": true, + "open_weights": false, + "release_date": "2026-04-27", + "last_updated": "2026-04-27", "type": "chat" }, { - "id": "minimax/minimax-m3.1-flash", - "name": "MiniMax: MiniMax M3.1 Flash", - "display_name": "MiniMax: MiniMax M3.1 Flash", + "id": "qwen/qwen3.6-35b-a3b", + "name": "Qwen3.6 35B-A3B", + "display_name": "Qwen3.6 35B-A3B", "modalities": { "input": [ "text", @@ -126134,8 +124287,8 @@ ] }, "limit": { - "context": 1048576, - "output": 524288 + "context": 262144, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -126145,91 +124298,78 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, "attachment": true, - "open_weights": false, - "release_date": "2026-10-19", - "last_updated": "2026-10-19", + "open_weights": true, + "release_date": "2026-04-17", + "last_updated": "2026-04-17", "type": "chat" }, { - "id": "minimax/minimax-01", - "name": "MiniMax: MiniMax-01", - "display_name": "MiniMax: MiniMax-01", + "id": "qwen/qwen3.5-flash", + "name": "Qwen3.5 Flash", + "display_name": "Qwen3.5 Flash", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000192, - "output": 900172 + "context": 1000000, + "output": 65536 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": false, - "release_date": "2025-01-15", - "last_updated": "2025-01-15", - "type": "chat" - }, - { - "id": "minimax/minimax-m2-her", - "name": "MiniMax-M2 Her", - "display_name": "MiniMax-M2 Her", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 65536, - "output": 2048 + "supported": true, + "default": true }, - "temperature": true, - "tool_call": false, - "reasoning": { - "supported": false + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-01-23", - "last_updated": "2026-01-23", + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" }, { - "id": "minimax/minimax-m2.1", - "name": "MiniMax-M2.1", - "display_name": "MiniMax-M2.1", + "id": "qwen/qwen3-vl-235b-a22b-thinking", + "name": "Qwen3 VL 235B A22B Thinking", + "display_name": "Qwen3 VL 235B A22B Thinking", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 131072, + "output": 40960 }, "temperature": true, "tool_call": true, @@ -126240,32 +124380,38 @@ "extra_capabilities": { "reasoning": { "supported": true, - "effort_options": [ - "high" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2025-12-23", - "last_updated": "2025-12-23", + "knowledge": "2025-03-31", + "release_date": "2025-09-23", + "last_updated": "2025-09-23", "type": "chat" }, { - "id": "minimax/minimax-m1", - "name": "MiniMax: MiniMax M1", - "display_name": "MiniMax: MiniMax M1", + "id": "qwen/qwen3.5-397b-a17b", + "name": "Qwen3.5 397B-A17B", + "display_name": "Qwen3.5 397B-A17B", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 40000 + "context": 262144, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -126275,22 +124421,25 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "none", - "high" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, - "attachment": false, - "open_weights": false, - "release_date": "2025-06-17", - "last_updated": "2025-06-17", + "attachment": true, + "open_weights": true, + "release_date": "2026-02-15", + "last_updated": "2026-02-15", "type": "chat" }, { - "id": "minimax/minimax-m3", - "name": "MiniMax-M3", - "display_name": "MiniMax-M3", + "id": "qwen/qwen3.5-27b", + "name": "Qwen3.5 27B", + "display_name": "Qwen3.5 27B", "modalities": { "input": [ "text", @@ -126302,8 +124451,8 @@ ] }, "limit": { - "context": 524288, - "output": 512000 + "context": 262144, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -126314,33 +124463,37 @@ "extra_capabilities": { "reasoning": { "supported": true, - "effort_options": [ - "none", - "high" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, "attachment": true, "open_weights": true, - "release_date": "2026-06-01", - "last_updated": "2026-06-01", + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" }, { - "id": "minimax/minimax-m2.7", - "name": "MiniMax-M2.7", - "display_name": "MiniMax-M2.7", + "id": "qwen/qwen3.5-122b-a10b", + "name": "Qwen3.5 122B-A10B", + "display_name": "Qwen3.5 122B-A10B", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 262144, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -126356,36 +124509,32 @@ "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "effort_options": [ - "high" ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-03-18", - "last_updated": "2026-03-18", + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" }, { - "id": "perceptron/perceptron-mk1.5", - "name": "Perceptron: Perceptron Mk1.5", - "display_name": "Perceptron: Perceptron Mk1.5", + "id": "qwen/qwen3.7-plus", + "name": "Qwen3.7 Plus", + "display_name": "Qwen3.7 Plus", "modalities": { "input": [ "text", "image", - "video", - "audio" + "video" ], "output": [ "text" ] }, "limit": { - "context": 36864, - "output": 8192 + "context": 1000000, + "output": 64000 }, "temperature": true, "tool_call": true, @@ -126395,25 +124544,20 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "none", - "minimal", - "low", - "medium", - "high" - ] + "supported": true } }, "attachment": true, "open_weights": false, - "release_date": "2026-09-25", - "last_updated": "2026-09-25", + "knowledge": "2025-04", + "release_date": "2026-06-02", + "last_updated": "2026-06-02", "type": "chat" }, { - "id": "perceptron/perceptron-mk1", - "name": "Perceptron: Perceptron Mk1", - "display_name": "Perceptron: Perceptron Mk1", + "id": "qwen/qwen3.8-27b", + "name": "Qwen3.8 27B", + "display_name": "Qwen3.8 27B", "modalities": { "input": [ "text", @@ -126425,11 +124569,11 @@ ] }, "limit": { - "context": 32768, - "output": 8192 + "context": 262144, + "output": 32768 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, "default": true @@ -126438,88 +124582,75 @@ "reasoning": { "effort_options": [ "none", - "high" + "low", + "medium", + "xhigh" ] } }, "attachment": true, - "open_weights": false, - "release_date": "2026-05-12", - "last_updated": "2026-05-12", - "type": "chat" - }, - { - "id": "cohere/command-a", - "name": "Command A", - "display_name": "Command A", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 256000, - "output": 8192 - }, - "temperature": true, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, "open_weights": true, - "knowledge": "2024-08-31", - "release_date": "2025-03-13", - "last_updated": "2025-03-13", + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "cohere/command-r-plus-08-2024", - "name": "Command R+", - "display_name": "Command R+", + "id": "qwen/qwen3-vl-235b-a22b-instruct", + "name": "Qwen3 VL 235B A22B Instruct", + "display_name": "Qwen3 VL 235B A22B Instruct", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 4000 + "context": 131072, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2024-06-01", - "release_date": "2024-08-30", - "last_updated": "2024-08-30", + "knowledge": "2025-03-31", + "release_date": "2025-09-23", + "last_updated": "2025-09-23", "type": "chat" - }, + } + ] + }, + "opper": { + "id": "opper", + "name": "Opper", + "display_name": "Opper", + "api": "https://api.opper.ai/v3/compat", + "doc": "https://opper.ai/models", + "models": [ { - "id": "cohere/command-a-plus", - "name": "Cohere: Command A+", - "display_name": "Cohere: Command A+", + "id": "muse-spark-1.2", + "name": "Muse Spark 1.2", + "display_name": "Muse Spark 1.2", "modalities": { "input": [ "text", - "image" + "image", + "video", + "pdf", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 192000, - "output": 64000 + "context": 1048576, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -126529,90 +124660,156 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ - "none", - "high" + "minimal", + "low", + "medium", + "high", + "xhigh" ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-04-01", - "release_date": "2026-05-20", - "last_updated": "2026-06-09", + "open_weights": false, + "release_date": "2026-08-05", + "last_updated": "2026-08-05", "type": "chat" }, { - "id": "cohere/command-r-08-2024", - "name": "Command R", - "display_name": "Command R", + "id": "claude-sonnet-4-5", + "name": "Claude Sonnet 4.5 (latest)", + "display_name": "Claude Sonnet 4.5 (latest)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 4000 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-06-01", - "release_date": "2024-08-30", - "last_updated": "2024-08-30", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-07-31", + "release_date": "2025-09-29", + "last_updated": "2025-09-29", "type": "chat" }, { - "id": "cohere/command-r7b-12-2024", - "name": "Command R7B", - "display_name": "Command R7B", + "id": "claude-fable-5", + "name": "Claude Fable 5", + "display_name": "Claude Fable 5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 4000 + "context": 1000000, + "output": 128000 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-06-01", - "release_date": "2024-12-13", - "last_updated": "2024-12-13", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", + "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", + "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2026-01-31", + "release_date": "2026-06-09", + "last_updated": "2026-06-09", "type": "chat" }, { - "id": "cohere/north-mini-code:free", - "name": "Cohere: North Mini Code (free)", - "display_name": "Cohere: North Mini Code (free)", + "id": "gemini-3.1-pro-preview", + "name": "Gemini 3.1 Pro Preview", + "display_name": "Gemini 3.1 Pro Preview", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 64000 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -126622,50 +124819,74 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "none", + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "low", "high" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-09-23", - "release_date": "2026-06-09", - "last_updated": "2026-06-09", + "attachment": true, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2026-02-19", + "last_updated": "2026-02-19", "type": "chat" }, { - "id": "moonshotai/kimi-k2-0905", - "name": "Kimi K2 Instruct 0905", - "display_name": "Kimi K2 Instruct 0905", + "id": "grok-build-0.1", + "name": "Grok Build 0.1", + "display_name": "Grok Build 0.1", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 98304 + "context": 256000, + "output": 256000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "release_date": "2025-09-05", - "last_updated": "2025-09-05", + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": true, + "open_weights": false, + "release_date": "2026-04-16", + "last_updated": "2026-04-16", "type": "chat" }, { - "id": "moonshotai/kimi-k2.7-code", - "name": "Kimi K2.7 Code", - "display_name": "Kimi K2.7 Code", + "id": "claude-haiku-4-5", + "name": "Claude Haiku 4.5 (latest)", + "display_name": "Claude Haiku 4.5 (latest)", "modalities": { "input": [ "text", @@ -126676,45 +124897,62 @@ ] }, "limit": { - "context": 262144, - "output": 235929 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "effort_options": [ - "high" + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-06-12", - "last_updated": "2026-06-12", + "open_weights": false, + "knowledge": "2025-02-28", + "release_date": "2025-10-15", + "last_updated": "2025-10-15", "type": "chat" }, { - "id": "moonshotai/kimi-k2-thinking", - "name": "Kimi K2 Thinking", - "display_name": "Kimi K2 Thinking", + "id": "gemini-3-flash-preview", + "name": "Gemini 3 Flash Preview", + "display_name": "Gemini 3 Flash Preview", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 98304 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -126725,28 +124963,34 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", + "low", + "medium", + "high" + ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "effort_options": [ - "high" ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-08", - "release_date": "2025-11-06", - "last_updated": "2025-11-06", + "attachment": true, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2025-12-17", + "last_updated": "2025-12-17", "type": "chat" }, { - "id": "moonshotai/kimi-k2", - "name": "Kimi K2 0711", - "display_name": "Kimi K2 0711", + "id": "qwen3-coder-next", + "name": "Qwen3 Coder Next", + "display_name": "Qwen3 Coder Next", "modalities": { "input": [ "text" @@ -126756,8 +125000,8 @@ ] }, "limit": { - "context": 131072, - "output": 98304 + "context": 262144, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -126766,27 +125010,26 @@ }, "attachment": false, "open_weights": true, - "knowledge": "2024-12-31", - "release_date": "2025-07-11", - "last_updated": "2025-07-11", + "knowledge": "2025-09", + "release_date": "2026-02-03", + "last_updated": "2026-02-03", "type": "chat" }, { - "id": "moonshotai/kimi-k2.6", - "name": "Kimi K2.6", - "display_name": "Kimi K2.6", + "id": "gpt-oss-20b", + "name": "GPT OSS 20B", + "display_name": "GPT OSS 20B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 235929 + "context": 128000, + "output": 8192 }, "temperature": true, "tool_call": true, @@ -126797,38 +125040,40 @@ "extra_capabilities": { "reasoning": { "supported": true, - "effort_options": [ - "none", - "high" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-20", - "last_updated": "2026-04-20", + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "moonshotai/kimi-k3", - "name": "Kimi K3", - "display_name": "Kimi K3", + "id": "gpt-5.6-terra", + "name": "GPT-5.6 Terra", + "display_name": "GPT-5.6 Terra", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 943718 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -126837,39 +125082,55 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ "none", "low", + "medium", "high", + "xhigh", "max" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-16", + "open_weights": false, + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "moonshotai/kimi-k3.1-pro", - "name": "MoonshotAI: Kimi K3.1 Pro", - "display_name": "MoonshotAI: Kimi K3.1 Pro", + "id": "glm-5.2", + "name": "GLM-5.2", + "display_name": "GLM-5.2", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 943718 + "context": 1000000, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -126877,36 +125138,36 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "none", - "low", - "high", - "max" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, - "attachment": true, - "open_weights": false, - "release_date": "2026-10-23", - "last_updated": "2026-10-23", + "attachment": false, + "open_weights": true, + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "moonshotai/kimi-k2.5", - "name": "Kimi K2.5", - "display_name": "Kimi K2.5", + "id": "deepseek-v4-flash", + "name": "DeepSeek V4 Flash", + "display_name": "DeepSeek V4 Flash", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 235929 + "context": 1000000, + "output": 384000 }, "temperature": true, "tool_call": true, @@ -126917,140 +125178,168 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "high", + "max" + ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" ], - "effort_options": [ - "none", - "high" + "notes": [ + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, - "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-01-27", - "last_updated": "2026-01-27", - "type": "chat" - }, - { - "id": "anthracite-org/magnum-v4-72b", - "name": "Magnum v4 72B", - "display_name": "Magnum v4 72B", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 32768, - "output": 4096 - }, - "temperature": true, - "tool_call": false, - "reasoning": { - "supported": false - }, "attachment": false, "open_weights": true, - "knowledge": "2024-06-30", - "release_date": "2024-10-22", - "last_updated": "2024-10-22", + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "liquid/lfm-2.5-2.6b:free", - "name": "LiquidAI: LFM2.5-2.6B (free)", - "display_name": "LiquidAI: LFM2.5-2.6B (free)", + "id": "gpt-5.4", + "name": "GPT-5.4", + "display_name": "GPT-5.4", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 65536, - "output": 8192 + "context": 1050000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", "high" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-08-11", - "last_updated": "2026-08-11", + "knowledge": "2025-08-31", + "release_date": "2026-03-05", + "last_updated": "2026-03-05", "type": "chat" }, { - "id": "liquid/lfm-2.5-24b-a2b", - "name": "LiquidAI: LFM2.5-24B-A2B", - "display_name": "LiquidAI: LFM2.5-24B-A2B", + "id": "claude-sonnet-4-6", + "name": "Claude Sonnet 4.6", + "display_name": "Claude Sonnet 4.6", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 1000000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", "effort_options": [ - "high" + "low", + "medium", + "high", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-10-13", - "last_updated": "2026-10-13", + "knowledge": "2025-08-31", + "release_date": "2026-02-17", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "liquid/lfm-2.5-2.6b", - "name": "LiquidAI: LFM2.5-2.6B", - "display_name": "LiquidAI: LFM2.5-2.6B", + "id": "gpt-5.6-sol", + "name": "GPT-5.6 Sol", + "display_name": "GPT-5.6 Sol", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -127059,49 +125348,99 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", "high" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-08-11", - "last_updated": "2026-08-11", + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "thedrummer/unslopnemo-12b", - "name": "TheDrummer: UnslopNemo 12B", - "display_name": "TheDrummer: UnslopNemo 12B", + "id": "gpt-5.4-mini", + "name": "GPT-5.4 mini", + "display_name": "GPT-5.4 mini", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1024000, - "output": 819200 + "context": 400000, + "output": 128000 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-04-30", - "release_date": "2024-11-08", - "last_updated": "2024-11-08", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-03-17", + "last_updated": "2026-03-17", "type": "chat" }, { - "id": "thedrummer/cydonia-24b-v4.1", - "name": "TheDrummer: Cydonia 24B V4.1", - "display_name": "TheDrummer: Cydonia 24B V4.1", + "id": "minimax-m2.7", + "name": "MiniMax-M2.7", + "display_name": "MiniMax-M2.7", "modalities": { "input": [ "text" @@ -127111,53 +125450,77 @@ ] }, "limit": { - "context": 131072, - "output": 117964 + "context": 196608, + "output": 131072 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, "open_weights": true, - "knowledge": "2024-04-30", - "release_date": "2025-09-27", - "last_updated": "2025-09-27", + "release_date": "2026-03-18", + "last_updated": "2026-03-18", "type": "chat" }, { - "id": "thedrummer/skyfall-36b-v2", - "name": "TheDrummer: Skyfall 36B V2", - "display_name": "TheDrummer: Skyfall 36B V2", + "id": "mistral-small-2603", + "name": "Mistral Small 4", + "display_name": "Mistral Small 4", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 32768, - "output": 29491 + "context": 256000, + "output": 8192 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": true, "open_weights": true, - "knowledge": "2024-06-30", - "release_date": "2025-03-10", - "last_updated": "2025-03-10", + "knowledge": "2025-06", + "release_date": "2026-03-16", + "last_updated": "2026-03-16", "type": "chat" }, { - "id": "reflection/beam-free", - "name": "Reflection: Beam 1.0 (free)", - "display_name": "Reflection: Beam 1.0 (free)", + "id": "sonar-reasoning-pro", + "name": "Sonar Reasoning Pro", + "display_name": "Sonar Reasoning Pro", "modalities": { "input": [ "text" @@ -127167,49 +125530,52 @@ ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 128000, + "output": 4096 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, "attachment": false, "open_weights": false, - "release_date": "2025-08-26", - "last_updated": "2025-08-26", + "knowledge": "2025-09-01", + "release_date": "2024-01-01", + "last_updated": "2025-09-01", "type": "chat" }, { - "id": "reflection/beam-1.0-501b-a23b", - "name": "Reflection: Beam 1.0 501B A23B", - "display_name": "Reflection: Beam 1.0 501B A23B", + "id": "gpt-5.6-luna", + "name": "GPT-5.6 Luna", + "display_name": "GPT-5.6 Luna", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -127217,59 +125583,90 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ + "none", "low", "medium", "high", "xhigh", "max" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2026-06-30", - "release_date": "2026-10-05", - "last_updated": "2026-10-16", + "attachment": true, + "open_weights": false, + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "scaledown/extract", - "name": "ScaleDown: Extract", - "display_name": "ScaleDown: Extract", + "id": "grok-4.6", + "name": "Grok 4.6", + "display_name": "Grok 4.6", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 900000 + "context": 500000, + "output": 500000 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": true, "open_weights": false, - "release_date": "2026-10-13", - "last_updated": "2026-10-13", + "knowledge": "2026-02-01", + "release_date": "2026-08-12", + "last_updated": "2026-08-12", "type": "chat" }, { - "id": "scaledown/summarize", - "name": "ScaleDown: Summarize", - "display_name": "ScaleDown: Summarize", + "id": "gemini-3.5-flash-lite", + "name": "Gemini 3.5 Flash Lite", + "display_name": "Gemini 3.5 Flash Lite", "modalities": { "input": [ "text", "image", + "video", + "audio", "pdf" ], "output": [ @@ -127277,24 +125674,37 @@ ] }, "limit": { - "context": 1000000, - "output": 4000 + "context": 1048576, + "output": 65536 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": true, "open_weights": false, - "release_date": "2026-10-13", - "last_updated": "2026-10-13", + "knowledge": "2026-03", + "release_date": "2026-07-21", + "last_updated": "2026-07-21", "type": "chat" }, { - "id": "openrouter/bodybuilder", - "name": "Body Builder (beta)", - "display_name": "Body Builder (beta)", + "id": "sonar", + "name": "Sonar", + "display_name": "Sonar", "modalities": { "input": [ "text" @@ -127305,60 +125715,81 @@ }, "limit": { "context": 128000, - "output": 32768 + "output": 4096 }, + "temperature": true, "tool_call": false, "reasoning": { "supported": false }, "attachment": false, "open_weights": false, - "release_date": "2026-03-15", - "last_updated": "2026-03-15", + "knowledge": "2025-09-01", + "release_date": "2024-01-01", + "last_updated": "2025-09-01", "type": "chat" }, { - "id": "openrouter/auto", - "name": "Auto Router", - "display_name": "Auto Router", + "id": "claude-opus-4-7", + "name": "Claude Opus 4.7", + "display_name": "Claude Opus 4.7", "modalities": { "input": [ - "audio", - "image", - "pdf", "text", - "video" + "image", + "pdf" ], "output": [ - "image", "text" ] }, "limit": { - "context": 2000000, - "output": 32768 + "context": 1000000, + "output": 64000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." + ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-03-15", - "last_updated": "2026-03-15", + "knowledge": "2026-01-31", + "release_date": "2026-04-16", + "last_updated": "2026-04-16", "type": "chat" }, { - "id": "openrouter/free", - "name": "OpenRouter Free Models Router", - "display_name": "OpenRouter Free Models Router", + "id": "grok-4.5", + "name": "Grok 4.5", + "display_name": "Grok 4.5", "modalities": { "input": [ "text", @@ -127369,8 +125800,8 @@ ] }, "limit": { - "context": 200000, - "output": 32768 + "context": 500000, + "output": 500000 }, "temperature": true, "tool_call": true, @@ -127378,16 +125809,27 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, "attachment": true, "open_weights": false, - "release_date": "2026-02-01", - "last_updated": "2026-02-01", + "release_date": "2026-07-08", + "last_updated": "2026-07-08", "type": "chat" }, { - "id": "openrouter/pareto-code", - "name": "Pareto Code Router", - "display_name": "Pareto Code Router", + "id": "qwen3.8-2.4t-a95b", + "name": "Qwen3.8 2.4T A95B", + "display_name": "Qwen3.8 2.4T A95B", "modalities": { "input": [ "text" @@ -127397,29 +125839,41 @@ ] }, "limit": { - "context": 200000, - "output": 65536 + "context": 262144, + "output": 131072 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, - "open_weights": false, - "release_date": "2026-04-21", - "last_updated": "2026-05-01", + "open_weights": true, + "release_date": "2026-08-12", + "last_updated": "2026-08-12", "type": "chat" }, { - "id": "stepfun/step-5-preview", - "name": "Step 5 Preview", - "display_name": "Step 5 Preview", + "id": "claude-fable-5-1", + "name": "Claude Fable 5.1", + "display_name": "Claude Fable 5.1", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" @@ -127427,9 +125881,9 @@ }, "limit": { "context": 1000000, - "output": 64000 + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -127437,23 +125891,41 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", "effort_options": [ "low", "medium", - "high" + "high", + "xhigh", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", + "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", + "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-09-16", - "last_updated": "2026-09-20", + "open_weights": false, + "knowledge": "2026-06", + "release_date": "2026-09-01", + "last_updated": "2026-09-01", "type": "chat" }, { - "id": "stepfun/step-3.5-flash", - "name": "Step 3.5 Flash", - "display_name": "Step 3.5 Flash", + "id": "glm-5.3", + "name": "GLM-5.3", + "display_name": "GLM-5.3", "modalities": { "input": [ "text" @@ -127463,8 +125935,8 @@ ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -127474,27 +125946,29 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "high" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, "attachment": false, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-01-29", - "last_updated": "2026-02-13", + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "stepfun/step-3.7-flash", - "name": "Step 3.7 Flash", - "display_name": "Step 3.7 Flash", + "id": "mistral-large-2512", + "name": "Mistral Large 3", + "display_name": "Mistral Large 3", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" @@ -127502,62 +125976,80 @@ }, "limit": { "context": 256000, - "output": 230400 + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high" - ] - } + "supported": false }, "attachment": true, "open_weights": true, - "knowledge": "2026-03-01", - "release_date": "2026-05-29", - "last_updated": "2026-05-29", + "knowledge": "2024-11", + "release_date": "2025-12-02", + "last_updated": "2025-12-02", "type": "chat" }, { - "id": "unbiased/pareto-26.10", - "name": "Pareto 26.10", - "display_name": "Pareto 26.10", + "id": "gpt-5.3-codex", + "name": "GPT-5.3 Codex", + "display_name": "GPT-5.3 Codex", "modalities": { "input": [ "text", - "image" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": true, "open_weights": false, - "release_date": "2026-10-15", - "last_updated": "2026-10-15", + "knowledge": "2025-08-31", + "release_date": "2026-02-05", + "last_updated": "2026-02-05", "type": "chat" }, { - "id": "unbiased/pareto-26.9", - "name": "Pareto 26.9", - "display_name": "Pareto 26.9", + "id": "qwen3.8-max", + "name": "Qwen3.8 Max", + "display_name": "Qwen3.8 Max", "modalities": { "input": [ "text", @@ -127568,121 +126060,167 @@ ] }, "limit": { - "context": 262144, + "context": 983616, "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": true, "open_weights": false, - "release_date": "2026-10-13", - "last_updated": "2026-10-13", + "release_date": "2026-08-03", + "last_updated": "2026-08-03", "type": "chat" }, { - "id": "upstage/solar-pro4", - "name": "Upstage: Solar Pro 4", - "display_name": "Upstage: Solar Pro 4", + "id": "claude-opus-4-6", + "name": "Claude Opus 4.6", + "display_name": "Claude Opus 4.6", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 524288, - "output": 131072 + "context": 1000000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", "effort_options": [ - "none", - "minimal", "low", "medium", "high", - "xhigh", "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2026-02", - "release_date": "2026-08-06", - "last_updated": "2026-08-06", + "knowledge": "2025-05-31", + "release_date": "2026-02-05", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "upstage/solar-mini4", - "name": "Upstage: Solar Mini 4", - "display_name": "Upstage: Solar Mini 4", + "id": "claude-opus-4-8", + "name": "Claude Opus 4.8", + "display_name": "Claude Opus 4.8", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 524288, - "output": 131072 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "high", "effort_options": [ - "none", - "minimal", "low", "medium", "high", "xhigh", "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2026-02", - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "knowledge": "2026-01", + "release_date": "2026-05-28", + "last_updated": "2026-05-28", "type": "chat" }, { - "id": "upstage/solar-pro-3", - "name": "Upstage: Solar Pro 3", - "display_name": "Upstage: Solar Pro 3", + "id": "claude-opus-5", + "name": "Claude Opus 5", + "display_name": "Claude Opus 5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 117964 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -127690,54 +126228,66 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "none", - "minimal", - "low", - "medium", - "high" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2025-07", - "release_date": "2026-01-26", - "last_updated": "2026-03-23", + "knowledge": "2026-05", + "release_date": "2026-07-24", + "last_updated": "2026-07-24", "type": "chat" }, { - "id": "nousresearch/hermes-3-llama-3.1-70b", - "name": "Nous: Hermes 3 70B Instruct (retires Nov 2)", - "display_name": "Nous: Hermes 3 70B Instruct (retires Nov 2)", + "id": "qwen3.6-35b-a3b", + "name": "Qwen3.6 35B-A3B", + "display_name": "Qwen3.6 35B-A3B", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 16384 + "context": 262144, + "output": 65536 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": true, "open_weights": true, - "knowledge": "2023-12-31", - "release_date": "2024-08-18", - "last_updated": "2024-08-18", + "release_date": "2026-04-17", + "last_updated": "2026-04-17", "type": "chat" }, { - "id": "nousresearch/hermes-3-llama-3.1-405b", - "name": "Nous: Hermes 3 405B Instruct (retires Nov 2)", - "display_name": "Nous: Hermes 3 405B Instruct (retires Nov 2)", + "id": "gpt-oss-120b", + "name": "GPT OSS 120B", + "display_name": "GPT OSS 120B", "modalities": { "input": [ "text" @@ -127747,107 +126297,154 @@ ] }, "limit": { - "context": 131072, - "output": 16384 + "context": 128000, + "output": 8192 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, "open_weights": true, - "knowledge": "2023-12-31", - "release_date": "2024-08-16", - "last_updated": "2024-08-16", + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "nousresearch/hermes-4-405b", - "name": "Nous: Hermes 4 405B", - "display_name": "Nous: Hermes 4 405B", + "id": "claude-opus-4-5", + "name": "Claude Opus 4.5 (latest)", + "display_name": "Claude Opus 4.5 (latest)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 117964 + "context": 200000, + "output": 64000 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", "effort_options": [ - "none", + "low", + "medium", "high" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-08-31", - "release_date": "2025-08-26", - "last_updated": "2025-08-26", + "attachment": true, + "open_weights": false, + "knowledge": "2025-05", + "release_date": "2025-11-24", + "last_updated": "2025-11-24", "type": "chat" }, { - "id": "x-ai/grok-4.20-multi-agent", - "name": "SpaceXAI: Grok 4.20 Multi-Agent", - "display_name": "SpaceXAI: Grok 4.20 Multi-Agent", + "id": "gpt-5.4-pro", + "name": "GPT-5.4 Pro", + "display_name": "GPT-5.4 Pro", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 2000000, - "output": 1800000 + "context": 1050000, + "output": 128000 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", "effort_options": [ - "low", "medium", "high", "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-03-31", - "last_updated": "2026-03-31", + "knowledge": "2025-08-31", + "release_date": "2026-03-05", + "last_updated": "2026-03-05", "type": "chat" }, { - "id": "x-ai/grok-4.3", - "name": "Grok 4.3", - "display_name": "Grok 4.3", + "id": "minimax-m3", + "name": "MiniMax-M3", + "display_name": "MiniMax-M3", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" @@ -127855,7 +126452,7 @@ }, "limit": { "context": 1000000, - "output": 900000 + "output": 131072 }, "temperature": true, "tool_call": true, @@ -127866,37 +126463,36 @@ "extra_capabilities": { "reasoning": { "supported": true, - "effort_options": [ - "none", - "low", - "medium", - "high" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, "attachment": true, - "open_weights": false, - "release_date": "2026-04-17", - "last_updated": "2026-04-17", + "open_weights": true, + "release_date": "2026-06-01", + "last_updated": "2026-06-01", "type": "chat" }, { - "id": "x-ai/grok-4.5", - "name": "Grok 4.5", - "display_name": "Grok 4.5", + "id": "gemma-4-31b-it", + "name": "Gemma 4 31B IT", + "display_name": "Gemma 4 31B IT", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 500000, - "output": 450000 + "context": 256000, + "output": 8192 }, "temperature": true, "tool_call": true, @@ -127907,74 +126503,68 @@ "extra_capabilities": { "reasoning": { "supported": true, - "effort_options": [ - "low", - "medium", - "high" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, "attachment": true, - "open_weights": false, - "release_date": "2026-07-08", - "last_updated": "2026-07-08", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "x-ai/grok-4.20", - "name": "SpaceXAI: Grok 4.20", - "display_name": "SpaceXAI: Grok 4.20", + "id": "sonar-pro", + "name": "Sonar Pro", + "display_name": "Sonar Pro", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 2000000, - "output": 1800000 + "context": 200000, + "output": 8000 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "high" - ] - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2026-03-31", - "last_updated": "2026-03-31", + "knowledge": "2025-09-01", + "release_date": "2024-01-01", + "last_updated": "2025-09-01", "type": "chat" }, { - "id": "x-ai/grok-4.7", - "name": "Grok 4.7", - "display_name": "Grok 4.7", + "id": "muse-spark-1.3", + "name": "Muse Spark 1.3", + "display_name": "Muse Spark 1.3", "modalities": { "input": [ "text", "image", - "pdf" + "video", + "pdf", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 500000, - "output": 450000 + "context": 1048576, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -127984,25 +126574,33 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ + "minimal", "low", "medium", "high", - "xhigh" + "xhigh", + "max" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-05", - "release_date": "2026-09-21", - "last_updated": "2026-09-21", + "release_date": "2026-09-02", + "last_updated": "2026-09-02", "type": "chat" }, { - "id": "x-ai/grok-build-0.1", - "name": "Grok Build 0.1", - "display_name": "Grok Build 0.1", + "id": "claude-sonnet-5", + "name": "Claude Sonnet 5", + "display_name": "Claude Sonnet 5", "modalities": { "input": [ "text", @@ -128014,10 +126612,10 @@ ] }, "limit": { - "context": 256000, - "output": 230400 + "context": 1000000, + "output": 64000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -128026,34 +126624,36 @@ "extra_capabilities": { "reasoning": { "supported": true, - "effort_options": [ - "high" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-04-16", - "last_updated": "2026-04-16", + "knowledge": "2026-01-31", + "release_date": "2026-06-30", + "last_updated": "2026-06-30", "type": "chat" }, { - "id": "x-ai/grok-4.6", - "name": "Grok 4.6", - "display_name": "Grok 4.6", + "id": "deepseek-v4-pro", + "name": "DeepSeek V4 Pro", + "display_name": "DeepSeek V4 Pro", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 500000, - "output": 450000 + "context": 1000000, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -128064,79 +126664,36 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", "effort_options": [ "low", - "medium", "high", - "xhigh" + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-02-01", - "release_date": "2026-08-12", - "last_updated": "2026-08-12", - "type": "chat" - }, - { - "id": "morph/morph-v3-large", - "name": "Morph: Morph V3 Large", - "display_name": "Morph: Morph V3 Large", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 262144, - "output": 131072 - }, - "temperature": true, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": false, - "release_date": "2025-07-07", - "last_updated": "2025-07-07", - "type": "chat" - }, - { - "id": "morph/morph-v3-fast", - "name": "Morph: Morph V3 Fast", - "display_name": "Morph: Morph V3 Fast", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 262144, - "output": 131072 - }, - "temperature": true, - "tool_call": false, - "reasoning": { - "supported": false - }, "attachment": false, - "open_weights": false, - "release_date": "2025-07-07", - "last_updated": "2025-07-07", + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "prism-ml/ternary-bonsai-2-27b", - "name": "PrismML: Ternary Bonsai 2 27B", - "display_name": "PrismML: Ternary Bonsai 2 27B", + "id": "gpt-5.4-nano", + "name": "GPT-5.4 nano", + "display_name": "GPT-5.4 nano", "modalities": { "input": [ "text", @@ -128146,45 +126703,6 @@ "text" ] }, - "limit": { - "context": 262144, - "output": 32768 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "medium", - "xhigh" - ] - } - }, - "attachment": true, - "open_weights": false, - "release_date": "2026-09-18", - "last_updated": "2026-09-18", - "type": "chat" - }, - { - "id": "openai/gpt-5.2", - "name": "GPT-5.2", - "display_name": "GPT-5.2", - "modalities": { - "input": [ - "pdf", - "image", - "text" - ], - "output": [ - "text" - ] - }, "limit": { "context": 400000, "output": 128000 @@ -128214,24 +126732,31 @@ "medium", "high" ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": true, "open_weights": false, "knowledge": "2025-08-31", - "release_date": "2025-12-11", - "last_updated": "2025-12-11", + "release_date": "2026-03-17", + "last_updated": "2026-03-17", "type": "chat" }, { - "id": "openai/gpt-5.6-luna-pro", - "name": "GPT-5.6 Luna", - "display_name": "GPT-5.6 Luna", + "id": "gemini-3.7-flash", + "name": "Gemini 3.7 Flash", + "display_name": "Gemini 3.7 Flash", "modalities": { "input": [ "text", "image", + "video", + "audio", "pdf" ], "output": [ @@ -128239,10 +126764,10 @@ ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1048576, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -128250,31 +126775,37 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "none", + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", "low", "medium", - "high", - "xhigh", - "max" + "high" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "knowledge": "2026-03", + "release_date": "2026-08-13", + "last_updated": "2026-08-13", "type": "chat" }, { - "id": "openai/gpt-5.4-mini", - "name": "GPT-5.4 mini", - "display_name": "GPT-5.4 mini", + "id": "kimi-k3", + "name": "Kimi K3", + "display_name": "Kimi K3", "modalities": { "input": [ - "pdf", - "image", "text" ], "output": [ @@ -128282,53 +126813,40 @@ ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 1048576, + "output": 131072 }, "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-17", - "last_updated": "2026-03-17", + "attachment": false, + "open_weights": true, + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" }, { - "id": "openai/gpt-5.6-sol", - "name": "GPT-5.6 Sol", - "display_name": "GPT-5.6 Sol", + "id": "gpt-5.5-pro", + "name": "GPT-5.5 Pro", + "display_name": "GPT-5.5 Pro", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" @@ -128347,52 +126865,43 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ - "none", - "low", "medium", "high", - "xhigh", - "max" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "xhigh" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "knowledge": "2025-12-01", + "release_date": "2026-04-23", + "last_updated": "2026-04-23", "type": "chat" }, { - "id": "openai/gpt-5.2-codex", - "name": "GPT-5.2 Codex", - "display_name": "GPT-5.2 Codex", + "id": "qwen3.8-27b", + "name": "Qwen3.8 27B", + "display_name": "Qwen3.8 27B", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 262144, + "output": 32768 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -128401,50 +126910,43 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ "low", "medium", - "high", "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2025-12-11", - "last_updated": "2025-12-11", + "attachment": false, + "open_weights": true, + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "openai/gpt-5.5-pro", - "name": "GPT-5.5 Pro", - "display_name": "GPT-5.5 Pro", + "id": "grok-4.3", + "name": "Grok 4.3", + "display_name": "Grok 4.3", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1000000, + "output": 30000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -128453,55 +126955,24 @@ "extra_capabilities": { "reasoning": { "supported": true, - "effort_options": [ - "medium", - "high", - "xhigh" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-12-01", - "release_date": "2026-04-23", - "last_updated": "2026-04-23", - "type": "chat" - }, - { - "id": "openai/gpt-audio-mini", - "name": "GPT-Audio Mini", - "display_name": "GPT-Audio Mini", - "modalities": { - "input": [ - "text", - "audio", - "pdf" - ], - "output": [ - "text", - "audio" - ] - }, - "limit": { - "context": 128000, - "output": 16384 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": false, - "knowledge": "2023-10-01", - "release_date": "2025-10-06", - "last_updated": "2025-10-06", + "release_date": "2026-04-17", + "last_updated": "2026-04-17", "type": "chat" }, { - "id": "openai/gpt-5-nano", - "name": "GPT-5 Nano", - "display_name": "GPT-5 Nano", + "id": "gpt-5.5", + "name": "GPT-5.5", + "display_name": "GPT-5.5", "modalities": { "input": [ "text", @@ -128513,7 +126984,7 @@ ] }, "limit": { - "context": 400000, + "context": 1050000, "output": 128000 }, "temperature": false, @@ -128529,10 +127000,10 @@ "mode": "effort", "effort": "medium", "effort_options": [ - "minimal", "low", "medium", - "high" + "high", + "xhigh" ], "verbosity": "medium", "verbosity_options": [ @@ -128540,24 +127011,31 @@ "medium", "high" ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2024-05-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "knowledge": "2025-12-01", + "release_date": "2026-04-23", + "last_updated": "2026-04-23", "type": "chat" }, { - "id": "openai/gpt-4o", - "name": "GPT-4o", - "display_name": "GPT-4o", + "id": "gemini-3.5-flash", + "name": "Gemini 3.5 Flash", + "display_name": "Gemini 3.5 Flash", "modalities": { "input": [ "text", "image", + "video", + "audio", "pdf" ], "output": [ @@ -128565,25 +127043,46 @@ ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", + "low", + "medium", + "high" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": true, "open_weights": false, - "knowledge": "2023-09", - "release_date": "2024-05-13", - "last_updated": "2024-08-06", + "knowledge": "2025-01", + "release_date": "2026-05-19", + "last_updated": "2026-05-19", "type": "chat" }, { - "id": "openai/gpt-oss-safeguard-20b", - "name": "GPT OSS Safeguard 20B", - "display_name": "GPT OSS Safeguard 20B", + "id": "glm-5.3-flash", + "name": "GLM-5.3-Flash", + "display_name": "GLM-5.3-Flash", "modalities": { "input": [ "text" @@ -128593,8 +127092,8 @@ ] }, "limit": { - "context": 131072, - "output": 65536 + "context": 1000000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -128604,25 +127103,31 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "high" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, "attachment": false, "open_weights": true, - "release_date": "2025-10-29", - "last_updated": "2025-10-29", + "release_date": "2026-08-26", + "last_updated": "2026-08-26", "type": "chat" }, { - "id": "openai/gpt-5.2-pro", - "name": "GPT-5.2 Pro", - "display_name": "GPT-5.2 Pro", + "id": "gemini-3.8-flash", + "name": "Gemini 3.8 Flash", + "display_name": "Gemini 3.8 Flash", "modalities": { "input": [ - "image", "text", + "image", + "video", + "audio", "pdf" ], "output": [ @@ -128630,8 +127135,8 @@ ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 1048576, + "output": 65536 }, "temperature": false, "tool_call": true, @@ -128643,153 +127148,148 @@ "reasoning": { "supported": true, "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ + "mode": "level", + "level": "high", + "level_options": [ + "minimal", "low", "medium", "high" ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2025-12-11", - "last_updated": "2025-12-11", + "release_date": "2026-09-02", + "last_updated": "2026-09-02", "type": "chat" }, { - "id": "openai/gpt-5.4-nano", - "name": "GPT-5.4 nano", - "display_name": "GPT-5.4 nano", + "id": "gpt-6-astra", + "name": "GPT-6 Astra", + "display_name": "GPT-6 Astra", "modalities": { "input": [ - "pdf", - "image", - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 400000, + "context": 1050000, "output": 128000 }, "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ - "none", "low", "medium", "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "xhigh", + "max" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-17", - "last_updated": "2026-03-17", + "knowledge": "2026-04-30", + "release_date": "2026-09-04", + "last_updated": "2026-09-04", "type": "chat" - }, + } + ] + }, + "vancine": { + "id": "vancine", + "name": "Vancine", + "display_name": "Vancine", + "api": "https://vancine.com/v1", + "doc": "https://vancine.com/docs", + "models": [ { - "id": "openai/gpt-5.4-image-2", - "name": "GPT-5.4 Image 2", - "display_name": "GPT-5.4 Image 2", + "id": "deepseek-v4.1-flash", + "name": "DeepSeek V4.1 Flash", + "display_name": "DeepSeek V4.1 Flash", "modalities": { "input": [ - "image", "text", - "pdf" + "image" ], "output": [ - "image", "text" ] }, "limit": { - "context": 272000, - "output": 128000 + "context": 1000000, + "output": 384000 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ - "none", "low", - "medium", "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "max" + ] } }, "attachment": true, - "open_weights": false, - "release_date": "2026-04-21", - "last_updated": "2026-04-21" + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-09-10", + "last_updated": "2026-09-10", + "type": "chat" }, { - "id": "openai/gpt-5.6-luna", - "name": "GPT-5.6 Luna", - "display_name": "GPT-5.6 Luna", + "id": "glm-5.3", + "name": "GLM-5.3", + "display_name": "GLM-5.3", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1000000, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -128798,41 +127298,28 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", "effort_options": [ - "none", "low", - "medium", "high", - "xhigh", "max" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "attachment": false, + "open_weights": true, + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "openai/gpt-5.1-codex-max", - "name": "GPT-5.1 Codex Max", - "display_name": "GPT-5.1 Codex Max", + "id": "qwen3.8-max", + "name": "Qwen3.8 Max", + "display_name": "Qwen3.8 Max", "modalities": { "input": [ "text", "image", + "video", "pdf" ], "output": [ @@ -128840,61 +127327,54 @@ ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 1000000, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ], - "verbosity": "medium", - "verbosity_options": [ + "effort_options": [ "low", "medium", - "high" - ], - "visibility": "hidden" + "xhigh" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-11-13", - "last_updated": "2025-11-13", + "release_date": "2026-08-03", + "last_updated": "2026-08-03", "type": "chat" }, { - "id": "openai/o3-mini", - "name": "o3-mini", - "display_name": "o3-mini", + "id": "hy4-preview", + "name": "Hy4 preview", + "display_name": "Hy4 preview", "modalities": { "input": [ - "text", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 1024000, + "output": 64000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -128903,41 +127383,76 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", "effort_options": [ - "low", - "medium", + "none", "high" - ], - "visibility": "hidden" + ] + } + }, + "attachment": false, + "open_weights": true, + "release_date": "2026-08-28", + "last_updated": "2026-08-28", + "type": "chat" + }, + { + "id": "MiniMax-M3", + "name": "MiniMax-M3", + "display_name": "MiniMax-M3", + "modalities": { + "input": [ + "text", + "image", + "video" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1048576, + "output": 512000 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2024-05", - "release_date": "2024-12-20", - "last_updated": "2025-01-29", + "open_weights": true, + "release_date": "2026-06-01", + "last_updated": "2026-06-01", "type": "chat" }, { - "id": "openai/gpt-5.6-terra", - "name": "GPT-5.6 Terra", - "display_name": "GPT-5.6 Terra", + "id": "kimi-k3", + "name": "Kimi K3", + "display_name": "Kimi K3", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1048576, + "output": 131072 }, "temperature": false, "tool_call": true, @@ -128948,52 +127463,44 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ - "none", "low", - "medium", "high", - "xhigh", "max" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "open_weights": true, + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" }, { - "id": "openai/o3", - "name": "o3", - "display_name": "o3", + "id": "qwen3.8-flash", + "name": "Qwen3.8 Flash", + "display_name": "Qwen3.8 Flash", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 1000000, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -129002,32 +127509,29 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2024-05", - "release_date": "2025-04-16", - "last_updated": "2025-04-16", + "release_date": "2026-08-26", + "last_updated": "2026-08-26", "type": "chat" }, { - "id": "openai/o1-pro", - "name": "o1-pro", - "display_name": "o1-pro", + "id": "glm-5.3-flash", + "name": "GLM-5.3-Flash", + "display_name": "GLM-5.3-Flash", "modalities": { "input": [ "text", "image", + "video", "pdf" ], "output": [ @@ -129035,11 +127539,11 @@ ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 1000000, + "output": 131072 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": true, "default": true @@ -129047,33 +127551,63 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", "effort_options": [ "low", - "medium", - "high" - ], - "visibility": "hidden" + "high", + "max" + ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2023-09", - "release_date": "2025-03-19", - "last_updated": "2025-03-19", + "open_weights": true, + "release_date": "2026-08-26", + "last_updated": "2026-08-26", + "type": "chat" + } + ] + }, + "wandb": { + "id": "wandb", + "name": "CoreWeave", + "display_name": "CoreWeave", + "api": "https://api.inference.wandb.ai/v1", + "doc": "https://docs.wandb.ai/inference", + "models": [ + { + "id": "meta-llama/Llama-3.1-8B-Instruct", + "name": "Llama 3.1 8B", + "display_name": "Llama 3.1 8B", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 131072, + "output": 131072 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "knowledge": "2023-12", + "release_date": "2024-07-23", + "last_updated": "2024-07-23", "type": "chat" }, { - "id": "openai/gpt-4o-2024-05-13", - "name": "GPT-4o (2024-05-13)", - "display_name": "GPT-4o (2024-05-13)", + "id": "meta-llama/Llama-3.3-70B-Instruct", + "name": "Llama 3.3 70B", + "display_name": "Llama 3.3 70B", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" @@ -129081,39 +127615,38 @@ }, "limit": { "context": 128000, - "output": 4096 + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2023-09", - "release_date": "2024-05-13", - "last_updated": "2024-05-13", + "attachment": false, + "open_weights": true, + "knowledge": "2023-12", + "release_date": "2024-12-06", + "last_updated": "2024-12-06", "type": "chat" }, { - "id": "openai/gpt-5-pro", - "name": "GPT-5 Pro", - "display_name": "GPT-5 Pro", + "id": "moonshotai/Kimi-K2.6", + "name": "Kimi K2.6", + "display_name": "Kimi K2.6", "modalities": { "input": [ - "image", "text", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 262144, + "output": 262144 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -129121,45 +127654,34 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "fixed", - "effort": "high", - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "supported": true } }, "attachment": true, - "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-10-06", - "last_updated": "2025-10-06", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-04-20", + "last_updated": "2026-04-20", "type": "chat" }, { - "id": "openai/gpt-6-sol", - "name": "GPT-6 Sol", - "display_name": "GPT-6 Sol", + "id": "moonshotai/Kimi-K2.7-Code", + "name": "Kimi K2.7 Code", + "display_name": "Kimi K2.7 Code", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 262144, + "output": 262144 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -129167,42 +127689,33 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ] + "supported": true } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-04-20", - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-06-12", + "last_updated": "2026-06-12", "type": "chat" }, { - "id": "openai/gpt-5.6-sol-pro", - "name": "GPT-5.6 Sol", - "display_name": "GPT-5.6 Sol", + "id": "openai/gpt-oss-20b", + "name": "gpt-oss-20b", + "display_name": "gpt-oss-20b", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 131072, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -129210,42 +127723,33 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ] + "supported": true } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "attachment": false, + "open_weights": true, + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "openai/gpt-5.3-codex", - "name": "GPT-5.3 Codex", - "display_name": "GPT-5.3 Codex", + "id": "openai/gpt-oss-120b", + "name": "gpt-oss-120b", + "display_name": "gpt-oss-120b", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 131072, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -129253,126 +127757,79 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "supported": true } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-05", - "last_updated": "2026-02-05", + "attachment": false, + "open_weights": true, + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "openai/o4-mini-high", - "name": "OpenAI: o4 Mini High", - "display_name": "OpenAI: o4 Mini High", + "id": "ibm-granite/granite-4.2-8b", + "name": "Granite 4.2 8B", + "display_name": "Granite 4.2 8B", "modalities": { "input": [ - "image", - "text", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 131072, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } - }, - "attachment": true, - "open_weights": false, - "release_date": "2025-04-16", - "last_updated": "2025-04-16", + "attachment": false, + "open_weights": true, + "release_date": "2026-08-25", + "last_updated": "2026-08-25", "type": "chat" }, { - "id": "openai/gpt-6.1-sol", - "name": "GPT-6.1 Sol", - "display_name": "GPT-6.1 Sol", + "id": "nvidia/NVIDIA-Nemotron-3.5-Lightning-30B-A3B", + "name": "Nemotron 3.5 Lightning", + "display_name": "Nemotron 3.5 Lightning", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 262144, + "output": 262144 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ] - } - }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-04-30", - "release_date": "2026-09-29", - "last_updated": "2026-09-29", + "attachment": false, + "open_weights": true, + "knowledge": "2025-09", + "release_date": "2026-08-11", + "last_updated": "2026-08-11", "type": "chat" }, { - "id": "openai/gpt-6-luna-pro", - "name": "OpenAI: GPT-6 Luna Pro", - "display_name": "OpenAI: GPT-6 Luna Pro", + "id": "nvidia/NVIDIA-Nemotron-3-Ultra-550B-A55B", + "name": "Nemotron 3 Ultra", + "display_name": "Nemotron 3 Ultra", "modalities": { "input": [ - "pdf", - "image", "text" ], "output": [ @@ -129380,155 +127837,132 @@ ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 262144, + "output": 262144 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ] - } - }, - "attachment": true, - "open_weights": false, - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "attachment": false, + "open_weights": true, + "knowledge": "2025-09", + "release_date": "2026-06-04", + "last_updated": "2026-06-04", "type": "chat" }, { - "id": "openai/gpt-audio", - "name": "GPT-Audio", - "display_name": "GPT-Audio", + "id": "nvidia/NVIDIA-Nemotron-3.5-Super-VL-120B-A12B", + "name": "Nemotron 3.5 Super VL", + "display_name": "Nemotron 3.5 Super VL", "modalities": { "input": [ "text", - "audio", - "pdf" + "image" ], "output": [ - "text", - "audio" + "text" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 1048576, + "output": 1048576 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": true, - "open_weights": false, - "knowledge": "2023-10-01", - "release_date": "2025-08-28", - "last_updated": "2025-08-28", + "open_weights": true, + "release_date": "2026-10-15", + "last_updated": "2026-10-15", "type": "chat" }, { - "id": "openai/gpt-5.4", - "name": "GPT-5.4", - "display_name": "GPT-5.4", + "id": "MiniMaxAI/MiniMax-M3", + "name": "MiniMax M3", + "display_name": "MiniMax M3", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 262144, + "output": 262144 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "supported": true } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-05", - "last_updated": "2026-03-05", + "open_weights": true, + "release_date": "2026-06-01", + "last_updated": "2026-06-01", "type": "chat" }, { - "id": "openai/gpt-4o-2024-11-20", - "name": "GPT-4o (2024-11-20)", - "display_name": "GPT-4o (2024-11-20)", + "id": "Qwen/Qwen3.6-35B-A3B", + "name": "Qwen3.6 35B A3B", + "display_name": "Qwen3.6 35B A3B", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": true, - "open_weights": false, - "knowledge": "2023-09", - "release_date": "2024-11-20", - "last_updated": "2024-11-20", + "open_weights": true, + "release_date": "2026-04-17", + "last_updated": "2026-04-17", "type": "chat" }, { - "id": "openai/o3-pro", - "name": "o3-pro", - "display_name": "o3-pro", + "id": "Qwen/Qwen3.8-27B", + "name": "Qwen3.8 27B", + "display_name": "Qwen3.8 27B", "modalities": { "input": [ "text", - "pdf", "image" ], "output": [ @@ -129536,55 +127970,38 @@ ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 262144, + "output": 262144 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } - }, "attachment": true, - "open_weights": false, - "knowledge": "2024-05", - "release_date": "2025-06-10", - "last_updated": "2025-06-10", + "open_weights": true, + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "openai/gpt-5.6-terra-pro", - "name": "GPT-5.6 Terra", - "display_name": "GPT-5.6 Terra", + "id": "reflection/Beam-1.0-501B-A23B", + "name": "Beam 1.0 501B A23B", + "display_name": "Beam 1.0 501B A23B", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1048576, + "output": 1048576 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -129593,7 +128010,7 @@ "extra_capabilities": { "reasoning": { "effort_options": [ - "none", + "minimal", "low", "medium", "high", @@ -129602,87 +128019,68 @@ ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "attachment": false, + "open_weights": true, + "knowledge": "2026-06-30", + "release_date": "2026-10-05", + "last_updated": "2026-10-16", "type": "chat" }, { - "id": "openai/gpt-5.1", - "name": "GPT-5.1", - "display_name": "GPT-5.1", + "id": "zai-org/GLM-5.2", + "name": "GLM 5.2", + "display_name": "GLM 5.2", "modalities": { "input": [ - "image", - "text", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 1048576, + "output": 1048576 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "supported": true } }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-11-13", - "last_updated": "2025-11-13", + "attachment": false, + "open_weights": true, + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "openai/gpt-chat-latest", - "name": "OpenAI: GPT Chat Latest", - "display_name": "OpenAI: GPT Chat Latest", + "id": "zai-org/GLM-5.3-Flash", + "name": "GLM 5.3 Flash", + "display_name": "GLM 5.3 Flash", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 1048576, + "output": 1048576 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { @@ -129690,19 +128088,17 @@ } }, "attachment": true, - "open_weights": false, - "release_date": "2026-05-05", - "last_updated": "2026-05-05", + "open_weights": true, + "release_date": "2026-08-26", + "last_updated": "2026-08-26", "type": "chat" }, { - "id": "openai/gpt-6.1-sol-pro", - "name": "OpenAI: GPT-6.1 Sol Pro", - "display_name": "OpenAI: GPT-6.1 Sol Pro", + "id": "zai-org/GLM-5.3", + "name": "GLM 5.3", + "display_name": "GLM 5.3", "modalities": { "input": [ - "pdf", - "image", "text" ], "output": [ @@ -129710,10 +128106,10 @@ ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1048576, + "output": 1048576 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -129721,100 +128117,98 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ "low", - "medium", "high", - "xhigh", "max" ] } }, - "attachment": true, - "open_weights": false, - "release_date": "2026-09-29", - "last_updated": "2026-09-29", + "attachment": false, + "open_weights": true, + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "openai/gpt-4o-2024-08-06", - "name": "GPT-4o (2024-08-06)", - "display_name": "GPT-4o (2024-08-06)", + "id": "deepseek-ai/DeepSeek-V4-Flash-0731", + "name": "DeepSeek V4 Flash 0731", + "display_name": "DeepSeek V4 Flash 0731", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, - "open_weights": false, - "knowledge": "2023-09", - "release_date": "2024-08-06", - "last_updated": "2024-08-06", + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-07-31", + "last_updated": "2026-07-31", "type": "chat" }, { - "id": "openai/gpt-4.1-mini", - "name": "GPT-4.1 mini", - "display_name": "GPT-4.1 mini", + "id": "deepseek-ai/DeepSeek-V3.1", + "name": "DeepSeek V3.1", + "display_name": "DeepSeek V3.1", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1047576, - "output": 32768 + "context": 161000, + "output": 161000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-04-14", - "last_updated": "2025-04-14", + "attachment": false, + "open_weights": true, + "release_date": "2025-08-21", + "last_updated": "2025-08-21", "type": "chat" }, { - "id": "openai/gpt-6-astra", - "name": "GPT-6 Astra", - "display_name": "GPT-6 Astra", + "id": "deepseek-ai/DeepSeek-V4-Pro-0813", + "name": "DeepSeek V4 Pro 0813", + "display_name": "DeepSeek V4 Pro 0813", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1048576, + "output": 1048576 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -129822,38 +128216,31 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ] + "supported": true } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-04-30", - "release_date": "2026-09-04", - "last_updated": "2026-09-04", + "attachment": false, + "open_weights": true, + "release_date": "2026-08-13", + "last_updated": "2026-08-22", "type": "chat" }, { - "id": "openai/gpt-oss-120b", - "name": "GPT OSS 120B", - "display_name": "GPT OSS 120B", + "id": "deepseek-ai/DeepSeek-V4.1-Flash", + "name": "DeepSeek V4.1 Flash", + "display_name": "DeepSeek V4.1 Flash", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 65536 + "context": 1048576, + "output": 1048576 }, "temperature": true, "tool_call": true, @@ -129863,40 +128250,34 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "effort_options": [ - "low", - "medium", - "high" - ] + "supported": true } }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "knowledge": "2025-05", + "release_date": "2026-09-10", + "last_updated": "2026-09-10", "type": "chat" }, { - "id": "openai/gpt-5.5", - "name": "GPT-5.5", - "display_name": "GPT-5.5", + "id": "google/gemma-4-31B-it", + "name": "Gemma 4 31B", + "display_name": "Gemma 4 31B", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 262144, + "output": 262144 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -129904,183 +128285,120 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "supported": true } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-12-01", - "release_date": "2026-04-23", - "last_updated": "2026-04-23", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "openai/gpt-3.5-turbo-0613", - "name": "OpenAI: GPT-3.5 Turbo (older v0613)", - "display_name": "OpenAI: GPT-3.5 Turbo (older v0613)", + "id": "google/gemma-4-26B-A4B-it", + "name": "Gemma 4 26B A4B", + "display_name": "Gemma 4 26B A4B", "modalities": { "input": [ "text", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 4095, - "output": 3685 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": true, - "open_weights": false, - "release_date": "2024-01-25", - "last_updated": "2024-01-25", + "open_weights": true, + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" - }, + } + ] + }, + "regolo-ai": { + "id": "regolo-ai", + "name": "Regolo AI", + "display_name": "Regolo AI", + "api": "https://api.regolo.ai/v1", + "doc": "https://docs.regolo.ai/", + "models": [ { - "id": "openai/gpt-4o-mini", - "name": "GPT-4o mini", - "display_name": "GPT-4o mini", + "id": "apertus-70b", + "name": "Apertus 70B", + "display_name": "Apertus 70B", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 30000, + "output": 30000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2023-09", - "release_date": "2024-07-18", - "last_updated": "2024-07-18", + "attachment": false, + "open_weights": true, + "knowledge": "2025-09", + "release_date": "2025-09-02", + "last_updated": "2025-09-02", "type": "chat" }, { - "id": "openai/gpt-5-image-mini", - "name": "GPT-5 Image Mini", - "display_name": "GPT-5 Image Mini", + "id": "qwen3-coder-next", + "name": "Qwen3-Coder-Next", + "display_name": "Qwen3-Coder-Next", "modalities": { "input": [ - "pdf", - "image", "text" ], "output": [ - "image", "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 262144, + "output": 16384 }, "temperature": true, - "tool_call": false, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "high" - ] - } - }, - "attachment": true, - "open_weights": false, - "release_date": "2025-10-16", - "last_updated": "2025-10-16" - }, - { - "id": "openai/gpt-5-mini", - "name": "GPT-5 Mini", - "display_name": "GPT-5 Mini", - "modalities": { - "input": [ - "text", - "image", - "pdf" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 400000, - "output": 128000 - }, - "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "minimal", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } - }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-05-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "attachment": false, + "open_weights": true, + "knowledge": "2025-09", + "release_date": "2026-02-03", + "last_updated": "2026-02-03", "type": "chat" }, { - "id": "openai/gpt-oss-20b", - "name": "GPT OSS 20B", - "display_name": "GPT OSS 20B", + "id": "gpt-oss-20b", + "name": "GPT-OSS-20B", + "display_name": "GPT-OSS-20B", "modalities": { "input": [ "text" @@ -130090,8 +128408,8 @@ ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 128000, + "output": 16384 }, "temperature": true, "tool_call": true, @@ -130117,118 +128435,79 @@ "type": "chat" }, { - "id": "openai/gpt-6-sol-pro", - "name": "OpenAI: GPT-6 Sol Pro", - "display_name": "OpenAI: GPT-6 Sol Pro", + "id": "gemma4-31b", + "name": "Gemma 4 31B IT", + "display_name": "Gemma 4 31B IT", "modalities": { "input": [ - "pdf", - "image", - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 100000, + "output": 100000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ] - } - }, "attachment": true, - "open_weights": false, - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "openai/gpt-5", - "name": "GPT-5", - "display_name": "GPT-5", + "id": "faster-whisper-large-v3", + "name": "Faster Whisper Large v3", + "display_name": "Faster Whisper Large v3", "modalities": { "input": [ - "text", - "image", - "pdf" + "audio" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 448, + "output": 4096 }, - "temperature": false, - "tool_call": true, + "temperature": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "minimal", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", - "type": "chat" + "open_weights": true, + "release_date": "2023-11-06", + "last_updated": "2023-11-06" }, { - "id": "openai/gpt-6-luna", - "name": "GPT-6 Luna", - "display_name": "GPT-6 Luna", + "id": "qwen3.5-9b", + "name": "Qwen3.5-9B", + "display_name": "Qwen3.5-9B", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 262144, + "output": 8192 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -130236,234 +128515,188 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-05-18", - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "open_weights": true, + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" }, { - "id": "openai/gpt-4.1", - "name": "GPT-4.1", - "display_name": "GPT-4.1", + "id": "mistral-small-4-119b", + "name": "Mistral Small 4 119B", + "display_name": "Mistral Small 4 119B", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1047576, - "output": 32768 + "context": 256000, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": true, - "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-04-14", - "last_updated": "2025-04-14", + "open_weights": true, + "knowledge": "2025-06", + "release_date": "2026-03-16", + "last_updated": "2026-03-16", "type": "chat" }, { - "id": "openai/gpt-5.1-codex-mini", - "name": "GPT-5.1 Codex mini", - "display_name": "GPT-5.1 Codex mini", + "id": "gpt-oss-120b", + "name": "GPT-OSS-120B", + "display_name": "GPT-OSS-120B", "modalities": { "input": [ - "image", - "text", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 128000, + "output": 16384 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", "effort_options": [ - "none", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ "low", "medium", "high" - ], - "visibility": "hidden" + ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-11-13", - "last_updated": "2025-11-13", + "attachment": false, + "open_weights": true, + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "openai/o1", - "name": "o1", - "display_name": "o1", + "id": "qwen-image", + "name": "Qwen-Image", + "display_name": "Qwen-Image", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ - "text" + "image" ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 8192, + "output": 4096 }, - "temperature": false, - "tool_call": true, + "temperature": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2023-09", - "release_date": "2024-12-05", - "last_updated": "2024-12-05", - "type": "chat" + "release_date": "2026-03-01", + "last_updated": "2026-03-01" }, { - "id": "openai/gpt-5.2-chat", - "name": "OpenAI: GPT-5.2 Chat", - "display_name": "OpenAI: GPT-5.2 Chat", + "id": "brick-v1-beta", + "name": "Brick v1 Beta", + "display_name": "Brick v1 Beta", "modalities": { "input": [ - "pdf", - "image", - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 32000 + "context": 100000, + "output": 15000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2025-12-11", - "last_updated": "2025-12-11", + "release_date": "2026-02-06", + "last_updated": "2026-02-06", "type": "chat" }, { - "id": "openai/gpt-5-image", - "name": "GPT-5 Image", - "display_name": "GPT-5 Image", + "id": "llama-3.3-70b-instruct", + "name": "Llama 3.3 70B Instruct", + "display_name": "Llama 3.3 70B Instruct", "modalities": { "input": [ - "image", - "text", - "pdf" + "text" ], "output": [ - "image", "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 128000, + "output": 16384 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "high" - ] - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-10-01", - "release_date": "2025-10-14", - "last_updated": "2025-10-14" + "attachment": false, + "open_weights": true, + "knowledge": "2023-12", + "release_date": "2024-12-06", + "last_updated": "2024-12-06", + "type": "chat" }, { - "id": "openai/gpt-3.5-turbo-16k", - "name": "OpenAI: GPT-3.5 Turbo 16k", - "display_name": "OpenAI: GPT-3.5 Turbo 16k", + "id": "brick-complexity-pro", + "name": "Brick Complexity Pro", + "display_name": "Brick Complexity Pro", "modalities": { "input": [ "text", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 16385, - "output": 4096 + "context": 100000, + "output": 15000 }, "temperature": true, "tool_call": true, @@ -130472,102 +128705,83 @@ }, "attachment": true, "open_weights": false, - "release_date": "2023-08-28", - "last_updated": "2023-08-28", + "release_date": "2026-02-06", + "last_updated": "2026-02-06", "type": "chat" }, { - "id": "openai/gpt-4.1-nano", - "name": "GPT-4.1 nano", - "display_name": "GPT-4.1 nano", + "id": "deepseek-ocr-2", + "name": "DeepSeek OCR 2", + "display_name": "DeepSeek OCR 2", "modalities": { "input": [ - "image", "text", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1047576, - "output": 942818 + "context": 4000, + "output": 4000 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-04-14", - "last_updated": "2025-04-14", + "open_weights": true, + "release_date": "2026-01-27", + "last_updated": "2026-01-27", "type": "chat" }, { - "id": "openai/o3-mini-high", - "name": "OpenAI: o3 Mini High", - "display_name": "OpenAI: o3 Mini High", + "id": "qwen3-embedding-8b", + "name": "Qwen3-Embedding-8B", + "display_name": "Qwen3-Embedding-8B", "modalities": { "input": [ - "text", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 32768, + "output": 8192 }, "temperature": false, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, - "attachment": true, - "open_weights": false, - "release_date": "2025-02-12", - "last_updated": "2025-02-12", - "type": "chat" + "attachment": false, + "open_weights": true, + "release_date": "2025-06-05", + "last_updated": "2025-06-05", + "type": "embedding" }, { - "id": "openai/gpt-6-astra-pro", - "name": "OpenAI: GPT-6 Astra Pro ($$$$)", - "display_name": "OpenAI: GPT-6 Astra Pro ($$$$)", + "id": "qwen3.5-122b", + "name": "Qwen3.5-122B", + "display_name": "Qwen3.5-122B", "modalities": { "input": [ - "pdf", - "image", - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 262144, + "output": 16384 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -130575,196 +128789,140 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, "attachment": true, - "open_weights": false, - "release_date": "2026-09-04", - "last_updated": "2026-09-04", + "open_weights": true, + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" }, { - "id": "openai/gpt-4", - "name": "GPT-4", - "display_name": "GPT-4", + "id": "qwen3-reranker-4b", + "name": "Qwen3-Reranker-4B", + "display_name": "Qwen3-Reranker-4B", "modalities": { "input": [ - "text", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 8191, - "output": 4096 + "context": 32768, + "output": 8192 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2023-11", - "release_date": "2023-11-06", - "last_updated": "2024-04-09", - "type": "chat" + "attachment": false, + "open_weights": true, + "release_date": "2026-02-01", + "last_updated": "2026-02-01", + "type": "rerank" }, { - "id": "openai/o4-mini", - "name": "o4-mini", - "display_name": "o4-mini", + "id": "qwen3.8-27b", + "name": "Qwen3.8 27B", + "display_name": "Qwen3.8 27B", "modalities": { "input": [ - "image", "text", - "pdf" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 120000, + "output": 120000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } - }, "attachment": true, - "open_weights": false, - "knowledge": "2024-05", - "release_date": "2025-04-16", - "last_updated": "2025-04-16", + "open_weights": true, + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "openai/gpt-5.1-codex", - "name": "GPT-5.1 Codex", - "display_name": "GPT-5.1 Codex", + "id": "glm5.2", + "name": "GLM-5.2", + "display_name": "GLM-5.2", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 96000, + "output": 96000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", "effort_options": [ - "none", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "high", + "max" + ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-11-13", - "last_updated": "2025-11-13", + "attachment": false, + "open_weights": true, + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" - }, + } + ] + }, + "impossibl": { + "id": "impossibl", + "name": "Impossibl", + "display_name": "Impossibl", + "api": "https://api.impossibl.com/v1", + "doc": "https://impossibl.com/docs/models", + "models": [ { - "id": "openai/gpt-4-turbo", - "name": "GPT-4 Turbo", - "display_name": "GPT-4 Turbo", + "id": "groq/gpt-oss-20b", + "name": "GPT OSS 20B", + "display_name": "GPT OSS 20B", "modalities": { "input": [ - "text", - "image", - "pdf" - ], - "output": [ "text" - ] - }, - "limit": { - "context": 128000, - "output": 4096 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": false, - "knowledge": "2023-12", - "release_date": "2023-11-06", - "last_updated": "2024-04-09", - "type": "chat" - }, - { - "id": "openai/gpt-5.4-pro", - "name": "GPT-5.4 Pro", - "display_name": "GPT-5.4 Pro", - "modalities": { - "input": [ - "text", - "image", - "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 131072, + "output": 32768 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -130773,64 +128931,24 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", "effort_options": [ - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ "low", "medium", "high" - ], - "visibility": "hidden" + ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-05", - "last_updated": "2026-03-05", - "type": "chat" - }, - { - "id": "openai/gpt-4o-mini-2024-07-18", - "name": "OpenAI: GPT-4o-mini (2024-07-18)", - "display_name": "OpenAI: GPT-4o-mini (2024-07-18)", - "modalities": { - "input": [ - "text", - "image", - "pdf" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 128000, - "output": 16384 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": false, - "knowledge": "2023-09", - "release_date": "2024-07-18", - "last_updated": "2024-07-18", + "attachment": false, + "open_weights": true, + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "aion-labs/aion-3.5", - "name": "AionLabs: Aion 3.5", - "display_name": "AionLabs: Aion 3.5", + "id": "groq/gpt-oss-120b", + "name": "GPT OSS 120B", + "display_name": "GPT OSS 120B", "modalities": { "input": [ "text" @@ -130840,7 +128958,7 @@ ] }, "limit": { - "context": 262144, + "context": 131072, "output": 32768 }, "temperature": true, @@ -130851,34 +128969,38 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ "low", - "high", - "max" + "medium", + "high" ] } }, "attachment": false, - "open_weights": false, - "release_date": "2026-09-23", - "last_updated": "2026-09-23", + "open_weights": true, + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "aion-labs/aion-3.5-mini", - "name": "AionLabs: Aion 3.5 Mini", - "display_name": "AionLabs: Aion 3.5 Mini", + "id": "xai/grok-build-0.1", + "name": "Grok Build 0.1", + "display_name": "Grok Build 0.1", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 256000, + "output": 256000 }, "temperature": true, "tool_call": true, @@ -130888,97 +129010,90 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "low", - "high", - "max" - ] + "supported": true } }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-09-23", - "last_updated": "2026-09-23", + "release_date": "2026-04-16", + "last_updated": "2026-04-16", "type": "chat" }, { - "id": "aion-labs/aion-rp-llama-3.1-8b", - "name": "AionLabs: Aion-RP 1.0 (8B)", - "display_name": "AionLabs: Aion-RP 1.0 (8B)", + "id": "xai/grok-4.20-0309-reasoning", + "name": "Grok 4.20 (Reasoning)", + "display_name": "Grok 4.20 (Reasoning)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 32768, - "output": 29491 + "context": 1000000, + "output": 30000 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2023-12-31", - "release_date": "2025-02-04", - "last_updated": "2025-02-04", + "attachment": true, + "open_weights": false, + "release_date": "2026-03-09", + "last_updated": "2026-03-09", "type": "chat" }, { - "id": "aion-labs/aion-3.0", - "name": "AionLabs: Aion-3.0", - "display_name": "AionLabs: Aion-3.0", + "id": "xai/grok-4.20-0309-non-reasoning", + "name": "Grok 4.20 (Non-Reasoning)", + "display_name": "Grok 4.20 (Non-Reasoning)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 1000000, + "output": 30000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "high" - ] - } + "supported": false }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-05-05", - "last_updated": "2026-05-05", + "release_date": "2026-03-09", + "last_updated": "2026-03-09", "type": "chat" }, { - "id": "aion-labs/aion-2.0", - "name": "AionLabs: Aion-2.0", - "display_name": "AionLabs: Aion-2.0", + "id": "xai/grok-4.5", + "name": "Grok 4.5", + "display_name": "Grok 4.5", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 500000, + "output": 500000 }, "temperature": true, "tool_call": true, @@ -130988,32 +129103,37 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ + "low", + "medium", "high" ] } }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2025-12-21", - "last_updated": "2025-12-21", + "release_date": "2026-07-08", + "last_updated": "2026-07-08", "type": "chat" }, { - "id": "aion-labs/aion-3.0-mini", - "name": "AionLabs: Aion-3.0-Mini", - "display_name": "AionLabs: Aion-3.0-Mini", + "id": "xai/grok-4.3", + "name": "Grok 4.3", + "display_name": "Grok 4.3", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 1000000, + "output": 30000 }, "temperature": true, "tool_call": true, @@ -131023,21 +129143,25 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ + "none", + "low", + "medium", "high" ] } }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-05-14", - "last_updated": "2026-05-14", + "release_date": "2026-04-17", + "last_updated": "2026-04-17", "type": "chat" }, { - "id": "undi95/remm-slerp-l2-13b", - "name": "ReMM SLERP 13B", - "display_name": "ReMM SLERP 13B", + "id": "zai/glm-5.2", + "name": "GLM-5.2", + "display_name": "GLM-5.2", "modalities": { "input": [ "text" @@ -131047,38 +129171,41 @@ ] }, "limit": { - "context": 6144, - "output": 5529 + "context": 1000000, + "output": 131072 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": false, "open_weights": true, - "knowledge": "2023-06-30", - "release_date": "2023-07-22", - "last_updated": "2023-07-22", + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "qwen/qwen3.8-27b", - "name": "Qwen3.8 27B", - "display_name": "Qwen3.8 27B", + "id": "zai/glm-5-turbo", + "name": "GLM-5-Turbo", + "display_name": "GLM-5-Turbo", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 235929 + "context": 200000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -131088,24 +129215,19 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "xhigh" - ] + "supported": true } }, - "attachment": true, - "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "attachment": false, + "open_weights": false, + "release_date": "2026-03-16", + "last_updated": "2026-03-16", "type": "chat" }, { - "id": "qwen/qwen3-30b-a3b-instruct-2507", - "name": "Qwen: Qwen3 30B A3B Instruct 2507", - "display_name": "Qwen: Qwen3 30B A3B Instruct 2507", + "id": "zai/glm-4.5", + "name": "GLM-4.5", + "display_name": "GLM-4.5", "modalities": { "input": [ "text" @@ -131115,24 +129237,26 @@ ] }, "limit": { - "context": 262144, - "output": 235929 + "context": 131072, + "output": 98304 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": false, "open_weights": true, + "knowledge": "2025-04", "release_date": "2025-07-28", "last_updated": "2025-07-28", "type": "chat" }, { - "id": "qwen/qwen3-next-80b-a3b-instruct", - "name": "Qwen3-Next 80B-A3B Instruct", - "display_name": "Qwen3-Next 80B-A3B Instruct", + "id": "zai/glm-4.6", + "name": "GLM-4.6", + "display_name": "GLM-4.6", "modalities": { "input": [ "text" @@ -131142,25 +129266,31 @@ ] }, "limit": { - "context": 262144, - "output": 16384 + "context": 204800, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": false, "open_weights": true, "knowledge": "2025-04", - "release_date": "2025-09", - "last_updated": "2025-09", + "release_date": "2025-09-30", + "last_updated": "2025-09-30", "type": "chat" }, { - "id": "qwen/qwen3-coder-30b-a3b-instruct", - "name": "Qwen3-Coder 30B-A3B Instruct", - "display_name": "Qwen3-Coder 30B-A3B Instruct", + "id": "zai/glm-4.5-air", + "name": "GLM-4.5-Air", + "display_name": "GLM-4.5-Air", "modalities": { "input": [ "text" @@ -131170,38 +129300,37 @@ ] }, "limit": { - "context": 262144, - "output": 235929 + "context": 131072, + "output": 98304 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": false, "open_weights": true, "knowledge": "2025-04", - "release_date": "2025-07-31", - "last_updated": "2025-07-31", + "release_date": "2025-07-28", + "last_updated": "2025-07-28", "type": "chat" }, { - "id": "qwen/qwen3.5-397b-a17b", - "name": "Qwen3.5 397B-A17B", - "display_name": "Qwen3.5 397B-A17B", + "id": "zai/glm-5", + "name": "GLM-5", + "display_name": "GLM-5", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 235929 + "context": 204800, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -131217,36 +129346,30 @@ "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "effort_options": [ - "none", - "high" ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-02-15", - "last_updated": "2026-02-15", + "release_date": "2026-02-12", + "last_updated": "2026-02-12", "type": "chat" }, { - "id": "qwen/qwen3.6-35b-a3b", - "name": "Qwen3.6 35B-A3B", - "display_name": "Qwen3.6 35B-A3B", + "id": "zai/glm-4.7", + "name": "GLM-4.7", + "display_name": "GLM-4.7", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 235929 + "context": 204800, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -131262,34 +129385,30 @@ "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "effort_options": [ - "none", - "high" ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-04-17", - "last_updated": "2026-04-17", + "knowledge": "2025-04", + "release_date": "2025-12-22", + "last_updated": "2025-12-22", "type": "chat" }, { - "id": "qwen/qwen3.7-plus", - "name": "Qwen3.7 Plus", - "display_name": "Qwen3.7 Plus", + "id": "zai/glm-5.1", + "name": "GLM-5.1", + "display_name": "GLM-5.1", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, + "context": 200000, "output": 131072 }, "temperature": true, @@ -131300,64 +129419,65 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "effort_options": [ - "none", - "high" - ] + "supported": true } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-04", - "release_date": "2026-06-02", - "last_updated": "2026-06-02", + "attachment": false, + "open_weights": true, + "release_date": "2026-04-07", + "last_updated": "2026-04-07", "type": "chat" }, { - "id": "qwen/qwen-2.5-coder-32b-instruct", - "name": "Qwen2.5 Coder 32B Instruct", - "display_name": "Qwen2.5 Coder 32B Instruct", + "id": "moonshotai/kimi-k3", + "name": "Kimi K3", + "display_name": "Kimi K3", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 32768, - "output": 29491 + "context": 1048576, + "output": 131072 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": true, "open_weights": true, - "release_date": "2024-11-12", - "last_updated": "2024-11-12", + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" }, { - "id": "qwen/qwen3.5-35b-a3b", - "name": "Qwen3.5 35B-A3B", - "display_name": "Qwen3.5 35B-A3B", + "id": "deepseek/deepseek-v4-flash", + "name": "DeepSeek V4 Flash", + "display_name": "DeepSeek V4 Flash", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 81920 + "context": 1000000, + "output": 384000 }, "temperature": true, "tool_call": true, @@ -131368,28 +129488,36 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "high", + "max" + ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" ], - "effort_options": [ - "none", - "high" + "notes": [ + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-02-23", - "last_updated": "2026-02-23", + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "qwen/qwen3-235b-a22b-thinking-2507", - "name": "Qwen: Qwen3 235B A22B Thinking 2507", - "display_name": "Qwen: Qwen3 235B A22B Thinking 2507", + "id": "deepseek/deepseek-v4-pro", + "name": "DeepSeek V4 Pro", + "display_name": "DeepSeek V4 Pro", "modalities": { "input": [ "text" @@ -131399,8 +129527,8 @@ ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 1000000, + "output": 384000 }, "temperature": true, "tool_call": true, @@ -131411,27 +129539,36 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "high", + "max" + ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" ], - "effort_options": [ - "high" + "notes": [ + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, "attachment": false, "open_weights": true, - "release_date": "2025-07-25", - "last_updated": "2025-07-25", + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "qwen/qwen3-vl-235b-a22b-instruct", - "name": "Qwen3 VL 235B A22B Instruct", - "display_name": "Qwen3 VL 235B A22B Instruct", + "id": "openai/gpt-4.1-nano", + "name": "GPT-4.1 nano", + "display_name": "GPT-4.1 nano", "modalities": { "input": [ "text", @@ -131442,7 +129579,7 @@ ] }, "limit": { - "context": 131072, + "context": 1047576, "output": 32768 }, "temperature": true, @@ -131451,32 +129588,61 @@ "supported": false }, "attachment": true, - "open_weights": true, - "knowledge": "2025-03-31", - "release_date": "2025-09-23", - "last_updated": "2025-09-23", + "open_weights": false, + "knowledge": "2024-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", "type": "chat" }, { - "id": "qwen/qwen3.5-flash-02-23", - "name": "Qwen: Qwen3.5-Flash", - "display_name": "Qwen: Qwen3.5-Flash", + "id": "openai/gpt-4-turbo", + "name": "GPT-4 Turbo", + "display_name": "GPT-4 Turbo", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 128000, + "output": 4096 }, "temperature": true, "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": false, + "knowledge": "2023-12", + "release_date": "2023-11-06", + "last_updated": "2024-04-09", + "type": "chat" + }, + { + "id": "openai/gpt-5.6-terra", + "name": "GPT-5.6 Terra", + "display_name": "GPT-5.6 Terra", + "modalities": { + "input": [ + "text", + "image", + "pdf" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1050000, + "output": 128000 + }, + "temperature": false, + "tool_call": true, "reasoning": { "supported": true, "default": true @@ -131484,71 +129650,105 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ "none", + "low", + "medium", + "high", + "xhigh", + "max" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", "high" - ] + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "release_date": "2026-02-25", - "last_updated": "2026-02-25", + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "qwen/qwen3-vl-8b-instruct", - "name": "Qwen: Qwen3 VL 8B Instruct", - "display_name": "Qwen: Qwen3 VL 8B Instruct", + "id": "openai/gpt-5.4", + "name": "GPT-5.4", + "display_name": "GPT-5.4", "modalities": { "input": [ + "text", "image", - "text" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 235929 + "context": 1050000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } }, "attachment": true, "open_weights": false, - "release_date": "2025-10-14", - "last_updated": "2025-10-14", + "knowledge": "2025-08-31", + "release_date": "2026-03-05", + "last_updated": "2026-03-05", "type": "chat" }, { - "id": "qwen/qwen3.8-max-prime", - "name": "Qwen 3.8 Max Prime", - "display_name": "Qwen 3.8 Max Prime", + "id": "openai/gpt-5.6-sol", + "name": "GPT-5.6 Sol", + "display_name": "GPT-5.6 Sol", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -131556,25 +129756,38 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ - "minimal", + "none", "low", "medium", "high", - "xhigh" - ] + "xhigh", + "max" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "release_date": "2026-09-23", - "last_updated": "2026-09-23", + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "qwen/qwen3-vl-30b-a3b-thinking", - "name": "Qwen: Qwen3 VL 30B A3B Thinking", - "display_name": "Qwen: Qwen3 VL 30B A3B Thinking", + "id": "openai/gpt-5.4-mini", + "name": "GPT-5.4 mini", + "display_name": "GPT-5.4 mini", "modalities": { "input": [ "text", @@ -131585,49 +129798,60 @@ ] }, "limit": { - "context": 262144, - "output": 235929 + "context": 400000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], + "default_enabled": false, + "mode": "effort", + "effort": "none", "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", "high" - ] + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "release_date": "2025-10-06", - "last_updated": "2025-10-06", + "knowledge": "2025-08-31", + "release_date": "2026-03-17", + "last_updated": "2026-03-17", "type": "chat" }, { - "id": "qwen/qwen3-235b-a22b-2507", - "name": "Qwen: Qwen3 235B A22B Instruct 2507", - "display_name": "Qwen: Qwen3 235B A22B Instruct 2507", + "id": "openai/gpt-4o", + "name": "GPT-4o", + "display_name": "GPT-4o", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, + "context": 128000, "output": 16384 }, "temperature": true, @@ -131635,218 +129859,203 @@ "reasoning": { "supported": false }, - "attachment": false, - "open_weights": true, - "release_date": "2025-07-21", - "last_updated": "2025-07-21", + "attachment": true, + "open_weights": false, + "knowledge": "2023-09", + "release_date": "2024-05-13", + "last_updated": "2024-08-06", "type": "chat" }, { - "id": "qwen/qwen3.5-plus-02-15", - "name": "Qwen: Qwen3.5 Plus 2026-02-15", - "display_name": "Qwen: Qwen3.5 Plus 2026-02-15", + "id": "openai/gpt-5.1-codex-mini", + "name": "GPT-5.1 Codex mini", + "display_name": "GPT-5.1 Codex mini", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], + "default_enabled": false, + "mode": "effort", + "effort": "none", "effort_options": [ "none", + "low", + "medium", "high" - ] + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "release_date": "2026-02-16", - "last_updated": "2026-02-16", + "knowledge": "2024-09-30", + "release_date": "2025-11-13", + "last_updated": "2025-11-13", "type": "chat" }, { - "id": "qwen/qwen3-coder-next", - "name": "Qwen3 Coder Next", - "display_name": "Qwen3 Coder Next", + "id": "openai/gpt-5.6-luna", + "name": "GPT-5.6 Luna", + "display_name": "GPT-5.6 Luna", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 235929 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-09", - "release_date": "2026-02-03", - "last_updated": "2026-02-03", - "type": "chat" - }, - { - "id": "qwen/qwen3.5-27b", - "name": "Qwen3.5 27B", - "display_name": "Qwen3.5 27B", - "modalities": { - "input": [ - "text", - "image", - "video" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 262144, - "output": 65536 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ "none", + "low", + "medium", + "high", + "xhigh", + "max" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", "high" - ] + ], + "visibility": "hidden" } }, "attachment": true, - "open_weights": true, - "release_date": "2026-02-23", - "last_updated": "2026-02-23", + "open_weights": false, + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "qwen/qwen3.7-flash", - "name": "Qwen3.7 Flash", - "display_name": "Qwen3.7 Flash", + "id": "openai/gpt-5.1-codex", + "name": "GPT-5.1 Codex", + "display_name": "GPT-5.1 Codex", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", "effort_options": [ "none", + "low", + "medium", "high" - ] + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "release_date": "2026-07-15", - "last_updated": "2026-07-15", + "knowledge": "2024-09-30", + "release_date": "2025-11-13", + "last_updated": "2025-11-13", "type": "chat" }, { - "id": "qwen/qwen3.5-plus-20260420", - "name": "Qwen: Qwen3.5 Plus 2026-04-20", - "display_name": "Qwen: Qwen3.5 Plus 2026-04-20", + "id": "openai/gpt-4.1", + "name": "GPT-4.1", + "display_name": "GPT-4.1", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 1047576, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "none", - "high" - ] - } + "supported": false }, "attachment": true, "open_weights": false, - "release_date": "2026-04-27", - "last_updated": "2026-04-27", + "knowledge": "2024-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", "type": "chat" }, { - "id": "qwen/qwen3-14b", - "name": "Qwen: Qwen3 14B", - "display_name": "Qwen: Qwen3 14B", + "id": "openai/gpt-3.5-turbo", + "name": "GPT-3.5-turbo", + "display_name": "GPT-3.5-turbo", "modalities": { "input": [ "text" @@ -131856,53 +130065,38 @@ ] }, "limit": { - "context": 40960, - "output": 16384 + "context": 16385, + "output": 4096 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "none", - "high" - ] - } + "supported": false }, "attachment": false, "open_weights": false, - "release_date": "2025-04-28", - "last_updated": "2025-04-28", + "knowledge": "2021-09-01", + "release_date": "2023-03-01", + "last_updated": "2023-11-06", "type": "chat" }, { - "id": "qwen/qwen3.6-plus", - "name": "Qwen3.6 Plus", - "display_name": "Qwen3.6 Plus", + "id": "openai/gpt-5.3-codex", + "name": "GPT-5.3 Codex", + "display_name": "GPT-5.3 Codex", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 400000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -131913,142 +130107,202 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ - "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", "high" - ] + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2025-04", - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "knowledge": "2025-08-31", + "release_date": "2026-02-05", + "last_updated": "2026-02-05", "type": "chat" }, { - "id": "qwen/qwen3.6-flash", - "name": "Qwen3.6 Flash", - "display_name": "Qwen3.6 Flash", + "id": "openai/gpt-5.1", + "name": "GPT-5.1", + "display_name": "GPT-5.1", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 400000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], + "default_enabled": false, + "mode": "effort", + "effort": "none", "effort_options": [ "none", + "low", + "medium", "high" - ] + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "release_date": "2026-04-27", - "last_updated": "2026-04-27", + "knowledge": "2024-09-30", + "release_date": "2025-11-13", + "last_updated": "2025-11-13", "type": "chat" }, { - "id": "qwen/qwen3-coder-flash", - "name": "Qwen3 Coder Flash", - "display_name": "Qwen3 Coder Flash", + "id": "openai/gpt-5-codex", + "name": "GPT-5-Codex", + "display_name": "GPT-5-Codex", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "minimal", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, "open_weights": false, - "knowledge": "2025-04", - "release_date": "2025-07-28", - "last_updated": "2025-07-28", + "knowledge": "2024-09-30", + "release_date": "2025-09-15", + "last_updated": "2025-09-15", "type": "chat" }, { - "id": "qwen/qwen-2.5-7b-instruct", - "name": "Qwen: Qwen2.5 7B Instruct", - "display_name": "Qwen: Qwen2.5 7B Instruct", + "id": "openai/gpt-5-mini", + "name": "GPT-5 Mini", + "display_name": "GPT-5 Mini", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 32768, - "output": 29491 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "minimal", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, "open_weights": false, - "release_date": "2024-10-16", - "last_updated": "2024-10-16", + "knowledge": "2024-05-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "qwen/qwen3.7-max", - "name": "Qwen3.7 Max", - "display_name": "Qwen3.7 Max", + "id": "openai/gpt-5.4-pro", + "name": "GPT-5.4 Pro", + "display_name": "GPT-5.4 Pro", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -132057,35 +130311,48 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", "effort_options": [ - "none", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", "high" - ] + ], + "visibility": "hidden" } }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-05-21", - "last_updated": "2026-05-21", + "knowledge": "2025-08-31", + "release_date": "2026-03-05", + "last_updated": "2026-03-05", "type": "chat" }, { - "id": "qwen/qwen3-32b", - "name": "Qwen3 32B", - "display_name": "Qwen3 32B", + "id": "openai/gpt-5", + "name": "GPT-5", + "display_name": "GPT-5", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 40960, - "output": 16384 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -132094,44 +130361,50 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ - "none", + "minimal", + "low", + "medium", "high" - ] + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-04-28", - "last_updated": "2025-04-28", + "attachment": true, + "open_weights": false, + "knowledge": "2024-09-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "qwen/qwen3.6-27b", - "name": "Qwen3.6 27B", - "display_name": "Qwen3.6 27B", + "id": "openai/gpt-5.2-codex", + "name": "GPT-5.2 Codex", + "display_name": "GPT-5.2 Codex", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 81920 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -132140,125 +130413,147 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ - "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", "high" - ] + ], + "visibility": "hidden" } }, "attachment": true, - "open_weights": true, - "release_date": "2026-04-22", - "last_updated": "2026-04-22", + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2025-12-11", + "last_updated": "2025-12-11", "type": "chat" }, { - "id": "qwen/qwen3-next-80b-a3b-thinking", - "name": "Qwen3-Next 80B-A3B (Thinking)", - "display_name": "Qwen3-Next 80B-A3B (Thinking)", + "id": "openai/gpt-5.2", + "name": "GPT-5.2", + "display_name": "GPT-5.2", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 235929 + "context": 400000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], + "default_enabled": false, + "mode": "effort", + "effort": "none", "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", "high" - ] + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-09", - "last_updated": "2025-09", + "attachment": true, + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2025-12-11", + "last_updated": "2025-12-11", "type": "chat" }, { - "id": "qwen/qwen-plus", - "name": "Qwen Plus", - "display_name": "Qwen Plus", + "id": "openai/gpt-5-pro", + "name": "GPT-5 Pro", + "display_name": "GPT-5 Pro", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 32768 + "context": 400000, + "output": 272000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "default_enabled": true, + "mode": "fixed", + "effort": "high", + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2024-04", - "release_date": "2024-01-25", - "last_updated": "2025-09-11", + "knowledge": "2024-09-30", + "release_date": "2025-10-06", + "last_updated": "2025-10-06", "type": "chat" }, { - "id": "qwen/qwen3.5-9b", - "name": "Qwen3.5 9B", - "display_name": "Qwen3.5 9B", + "id": "openai/o3", + "name": "o3", + "display_name": "o3", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 235929 + "context": 200000, + "output": 100000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -132267,28 +130562,28 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ - "none", + "low", + "medium", "high" - ] + ], + "visibility": "hidden" } }, "attachment": true, - "open_weights": true, - "release_date": "2026-02-23", - "last_updated": "2026-02-23", + "open_weights": false, + "knowledge": "2024-05", + "release_date": "2025-04-16", + "last_updated": "2025-04-16", "type": "chat" }, { - "id": "qwen/qwen3-vl-30b-a3b-instruct", - "name": "Qwen3 VL 30B A3B Instruct", - "display_name": "Qwen3 VL 30B A3B Instruct", + "id": "openai/gpt-5.4-nano", + "name": "GPT-5.4 nano", + "display_name": "GPT-5.4 nano", "modalities": { "input": [ "text", @@ -132299,96 +130594,108 @@ ] }, "limit": { - "context": 262144, - "output": 16384 + "context": 400000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": true, - "release_date": "2025-10-04", - "last_updated": "2025-10-04", - "type": "chat" - }, - { - "id": "qwen/qwen2.5-vl-72b-instruct", - "name": "Qwen: Qwen2.5 VL 72B Instruct", - "display_name": "Qwen: Qwen2.5 VL 72B Instruct", - "modalities": { - "input": [ - "text", - "image" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 128000, - "output": 115200 + "supported": true, + "default": false }, - "temperature": true, - "tool_call": false, - "reasoning": { - "supported": false + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } }, "attachment": true, - "open_weights": true, - "knowledge": "2024-04", - "release_date": "2025-01-26", - "last_updated": "2025-01-26", + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-03-17", + "last_updated": "2026-03-17", "type": "chat" }, { - "id": "qwen/qwen3-coder", - "name": "Qwen: Qwen3 Coder 480B A35B", - "display_name": "Qwen: Qwen3 Coder 480B A35B", + "id": "openai/o1", + "name": "o1", + "display_name": "o1", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 200000, + "output": 100000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-07-22", - "last_updated": "2025-07-22", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2023-09", + "release_date": "2024-12-05", + "last_updated": "2024-12-05", "type": "chat" }, { - "id": "qwen/qwen3.8-max-0902", - "name": "Qwen3.8 Max 0902", - "display_name": "Qwen3.8 Max 0902", + "id": "openai/gpt-5.5-pro", + "name": "GPT-5.5 Pro", + "display_name": "GPT-5.5 Pro", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -132396,9 +130703,8 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ - "minimal", - "low", "medium", "high", "xhigh" @@ -132407,27 +130713,30 @@ }, "attachment": true, "open_weights": false, - "release_date": "2026-09-02", - "last_updated": "2026-09-02", + "knowledge": "2025-12-01", + "release_date": "2026-04-23", + "last_updated": "2026-04-23", "type": "chat" }, { - "id": "qwen/qwen3.8-2.4t-a95b", - "name": "Qwen3.8 2.4T A95B", - "display_name": "Qwen3.8 2.4T A95B", + "id": "openai/gpt-5.5", + "name": "GPT-5.5", + "display_name": "GPT-5.5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1010000, - "output": 909000 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -132436,83 +130745,78 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ "low", "medium", + "high", "xhigh" - ] + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-08-12", - "last_updated": "2026-08-12", + "attachment": true, + "open_weights": false, + "knowledge": "2025-12-01", + "release_date": "2026-04-23", + "last_updated": "2026-04-23", "type": "chat" }, { - "id": "qwen/qwen3.5-122b-a10b", - "name": "Qwen3.5 122B-A10B", - "display_name": "Qwen3.5 122B-A10B", + "id": "openai/gpt-4.1-mini", + "name": "GPT-4.1 mini", + "display_name": "GPT-4.1 mini", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 1047576, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "none", - "high" - ] - } + "supported": false }, "attachment": true, - "open_weights": true, - "release_date": "2026-02-23", - "last_updated": "2026-02-23", + "open_weights": false, + "knowledge": "2024-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", "type": "chat" }, { - "id": "qwen/qwen3.8-flash", - "name": "Qwen3.8 Flash", - "display_name": "Qwen3.8 Flash", + "id": "openai/o3-mini", + "name": "o3-mini", + "display_name": "o3-mini", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 200000, + "output": 100000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -132521,38 +130825,42 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ - "none", + "low", + "medium", "high" - ] + ], + "visibility": "hidden" } }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", + "knowledge": "2024-05", + "release_date": "2024-12-20", + "last_updated": "2025-01-29", "type": "chat" }, { - "id": "qwen/qwen3.8-omni-flash", - "name": "Qwen3.8 Omni Flash", - "display_name": "Qwen3.8 Omni Flash", + "id": "openai/o4-mini", + "name": "o4-mini", + "display_name": "o4-mini", "modalities": { "input": [ "text", - "image", - "audio", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 200000, + "output": 100000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -132560,32 +130868,41 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ - "none", + "low", + "medium", "high" - ] + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "release_date": "2026-09-17", - "last_updated": "2026-09-17", + "knowledge": "2024-05", + "release_date": "2025-04-16", + "last_updated": "2025-04-16", "type": "chat" }, { - "id": "qwen/qwen-2.5-72b-instruct", - "name": "Qwen2.5 72B Instruct", - "display_name": "Qwen2.5 72B Instruct", + "id": "openai/gpt-4o-mini", + "name": "GPT-4o mini", + "display_name": "GPT-4o mini", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 32768, + "context": 128000, "output": 16384 }, "temperature": true, @@ -132593,29 +130910,31 @@ "reasoning": { "supported": false }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2024-09-19", - "last_updated": "2024-09-19", + "knowledge": "2023-09", + "release_date": "2024-07-18", + "last_updated": "2024-07-18", "type": "chat" }, { - "id": "qwen/qwen3-30b-a3b", - "name": "Qwen3 30B A3B", - "display_name": "Qwen3 30B A3B", + "id": "openai/gpt-5-nano", + "name": "GPT-5 Nano", + "display_name": "GPT-5 Nano", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 40960, - "output": 16384 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -132624,39 +130943,49 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ - "none", + "minimal", + "low", + "medium", "high" - ] + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "release_date": "2025-04-28", - "last_updated": "2025-04-28", + "attachment": true, + "open_weights": false, + "knowledge": "2024-05-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "tencent/hy3", - "name": "Hy3", - "display_name": "Hy3", + "id": "xiaomi/mimo-v2.5", + "name": "MiMo-V2.5", + "display_name": "MiMo-V2.5", "modalities": { "input": [ - "text" + "text", + "image", + "audio", + "video" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 128000 + "context": 1048576, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -132664,37 +130993,29 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "none", - "low", - "high" - ] - } - }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-07-06", - "last_updated": "2026-07-06", + "knowledge": "2024-12", + "release_date": "2026-04-22", + "last_updated": "2026-04-22", "type": "chat" }, { - "id": "tencent/hy4-preview", - "name": "Hy4 preview", - "display_name": "Hy4 preview", + "id": "thinkingmachines/inkling", + "name": "Inkling", + "display_name": "Inkling", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 64000 + "context": 65536, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -132704,100 +131025,93 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ "none", + "minimal", "low", - "high" + "medium", + "high", + "xhigh" ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-08-28", - "last_updated": "2026-08-28", - "type": "chat" - }, - { - "id": "tencent/hy-mt2-7b", - "name": "Hy-MT2-7B", - "display_name": "Hy-MT2-7B", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 8192, - "output": 4096 - }, - "temperature": true, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-05-21", - "last_updated": "2026-05-21", + "release_date": "2026-07-15", + "last_updated": "2026-07-15", "type": "chat" }, { - "id": "tencent/hunyuan-a13b-instruct", - "name": "Tencent: Hunyuan A13B Instruct", - "display_name": "Tencent: Hunyuan A13B Instruct", + "id": "anthropic/claude-sonnet-4-5", + "name": "Claude Sonnet 4.5 (latest)", + "display_name": "Claude Sonnet 4.5 (latest)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 117964 + "context": 200000, + "output": 64000 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "none", - "high" - ] - } - }, - "attachment": false, + "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + ] + } + }, + "attachment": true, "open_weights": false, - "release_date": "2025-07-08", - "last_updated": "2025-07-08", + "knowledge": "2025-07-31", + "release_date": "2025-09-29", + "last_updated": "2025-09-29", "type": "chat" }, { - "id": "tencent/hy3-preview", - "name": "Hy3 preview", - "display_name": "Hy3 preview", + "id": "anthropic/claude-fable-5", + "name": "Claude Fable 5", + "display_name": "Claude Fable 5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 235929 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -132805,328 +131119,398 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", "effort_options": [ - "none", "low", - "high" + "medium", + "high", + "xhigh", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", + "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", + "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-04-20", - "last_updated": "2026-04-20", - "type": "chat" - }, - { - "id": "tencent/hy-mt2-30b-a3b", - "name": "Hy-MT2-30B-A3B", - "display_name": "Hy-MT2-30B-A3B", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 8192, - "output": 4096 - }, - "temperature": true, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": true, - "release_date": "2026-05-21", - "last_updated": "2026-05-21", - "type": "chat" - }, - { - "id": "tencent/hy-mt2-1.8b", - "name": "Hy-MT2-1.8B", - "display_name": "Hy-MT2-1.8B", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 8192, - "output": 4096 - }, - "temperature": true, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": true, - "release_date": "2026-05-21", - "last_updated": "2026-05-21", + "attachment": true, + "open_weights": false, + "knowledge": "2026-01-31", + "release_date": "2026-06-09", + "last_updated": "2026-06-09", "type": "chat" }, { - "id": "moondream/moondream3-preview", - "name": "Moondream: Moondream 3 Preview", - "display_name": "Moondream: Moondream 3 Preview", + "id": "anthropic/claude-haiku-4-5", + "name": "Claude Haiku 4.5 (latest)", + "display_name": "Claude Haiku 4.5 (latest)", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 32000, - "output": 4096 + "context": 200000, + "output": 64000 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "none", - "high" + "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-10-15", - "last_updated": "2026-10-15", + "knowledge": "2025-02-28", + "release_date": "2025-10-15", + "last_updated": "2025-10-15", "type": "chat" }, { - "id": "moondream/moondream3.1-9b-a2b", - "name": "Moondream: Moondream 3.1", - "display_name": "Moondream: Moondream 3.1", + "id": "anthropic/claude-sonnet-4-6", + "name": "Claude Sonnet 4.6", + "display_name": "Claude Sonnet 4.6", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 32000, - "output": 4096 + "context": 1000000, + "output": 64000 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", "effort_options": [ - "none", - "high" + "low", + "medium", + "high", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-10-15", - "last_updated": "2026-10-15", + "knowledge": "2025-08-31", + "release_date": "2026-02-17", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "inference-net/schematron-v2-small", - "name": "Inference.net: Schematron V2 Small", - "display_name": "Inference.net: Schematron V2 Small", + "id": "anthropic/claude-opus-4-7", + "name": "Claude Opus 4.7", + "display_name": "Claude Opus 4.7", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 1000000, + "output": 128000 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": false, - "release_date": "2026-04-16", - "last_updated": "2026-04-16", - "type": "chat" - }, - { - "id": "inference-net/schematron-v2-turbo", - "name": "Inference.net: Schematron V2 Turbo", - "display_name": "Inference.net: Schematron V2 Turbo", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 128000, - "output": 8192 + "supported": true, + "default": false }, - "temperature": true, - "tool_call": false, - "reasoning": { - "supported": false + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." + ] + } }, - "attachment": false, + "attachment": true, "open_weights": false, + "knowledge": "2026-01-31", "release_date": "2026-04-16", "last_updated": "2026-04-16", "type": "chat" }, { - "id": "poolside/laguna-s-2.1", - "name": "Poolside: Laguna S 2.1 (retires Oct 31)", - "display_name": "Poolside: Laguna S 2.1 (retires Oct 31)", + "id": "anthropic/claude-opus-4-6", + "name": "Claude Opus 4.6", + "display_name": "Claude Opus 4.6", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 1000000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", "effort_options": [ - "none", - "high" + "low", + "medium", + "high", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-07-21", - "last_updated": "2026-07-21", + "attachment": true, + "open_weights": false, + "knowledge": "2025-05-31", + "release_date": "2026-02-05", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "poolside/laguna-s-2.1:free", - "name": "Poolside: Laguna S 2.1 (free)", - "display_name": "Poolside: Laguna S 2.1 (free)", + "id": "anthropic/claude-opus-4-8", + "name": "Claude Opus 4.8", + "display_name": "Claude Opus 4.8", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "high", "effort_options": [ - "none", - "high" + "low", + "medium", + "high", + "xhigh", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-07-21", - "last_updated": "2026-07-21", + "attachment": true, + "open_weights": false, + "knowledge": "2026-01", + "release_date": "2026-05-28", + "last_updated": "2026-05-28", "type": "chat" }, { - "id": "poolside/laguna-xs-2.1", - "name": "Poolside: Laguna XS 2.1 (retires Oct 31)", - "display_name": "Poolside: Laguna XS 2.1 (retires Oct 31)", + "id": "anthropic/claude-opus-4-5", + "name": "Claude Opus 4.5 (latest)", + "display_name": "Claude Opus 4.5 (latest)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", "effort_options": [ - "none", + "low", + "medium", "high" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-07-02", - "last_updated": "2026-07-02", + "attachment": true, + "open_weights": false, + "knowledge": "2025-05", + "release_date": "2025-11-24", + "last_updated": "2025-11-24", "type": "chat" }, { - "id": "poolside/laguna-xs-2.1:free", - "name": "Poolside: Laguna XS 2.1 (free)", - "display_name": "Poolside: Laguna XS 2.1 (free)", + "id": "anthropic/claude-sonnet-5", + "name": "Claude Sonnet 5", + "display_name": "Claude Sonnet 5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -133134,33 +131518,42 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ - "none", - "high" + "low", + "medium", + "high", + "xhigh", + "max" ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-07-02", - "last_updated": "2026-07-02", + "attachment": true, + "open_weights": false, + "knowledge": "2026-01-31", + "release_date": "2026-06-30", + "last_updated": "2026-06-30", "type": "chat" }, { - "id": "z-ai/glm-5.1", - "name": "GLM-5.1", - "display_name": "GLM-5.1", + "id": "google/gemini-3.1-pro-preview", + "name": "Gemini 3.1 Pro Preview", + "display_name": "Gemini 3.1 Pro Preview", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 202752, - "output": 131072 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -133171,35 +131564,46 @@ "extra_capabilities": { "reasoning": { "supported": true, - "effort_options": [ - "none", + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "low", "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-04-07", - "last_updated": "2026-04-07", + "attachment": true, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2026-02-19", + "last_updated": "2026-02-19", "type": "chat" }, { - "id": "z-ai/glm-5v-turbo", - "name": "GLM-5V-Turbo", - "display_name": "GLM-5V-Turbo", + "id": "google/gemini-2.5-pro", + "name": "Gemini 2.5 Pro", + "display_name": "Gemini 2.5 Pro", "modalities": { "input": [ - "image", "text", - "video" + "image", + "audio", + "video", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 202752, - "output": 131072 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -133209,33 +131613,49 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "none", - "high" + "supported": true, + "default_enabled": true, + "mode": "budget", + "budget": { + "default": -1, + "min": 128, + "max": 32768, + "auto": -1, + "unit": "tokens" + }, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-04-01", - "last_updated": "2026-04-01", + "knowledge": "2025-01", + "release_date": "2025-06-17", + "last_updated": "2025-06-17", "type": "chat" }, { - "id": "z-ai/glm-5", - "name": "GLM-5", - "display_name": "GLM-5", + "id": "google/gemini-3.5-flash-lite", + "name": "Gemini 3.5 Flash Lite", + "display_name": "Gemini 3.5 Flash Lite", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 202752, - "output": 131072 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -133246,39 +131666,40 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ - "none", + "minimal", + "low", + "medium", "high" ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-02-12", - "last_updated": "2026-02-12", + "attachment": true, + "open_weights": false, + "knowledge": "2026-03", + "release_date": "2026-07-21", + "last_updated": "2026-07-21", "type": "chat" }, { - "id": "z-ai/glm-4.6", - "name": "GLM-4.6", - "display_name": "GLM-4.6", + "id": "google/gemini-3.1-flash-lite", + "name": "Gemini 3.1 Flash Lite", + "display_name": "Gemini 3.1 Flash Lite", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -133290,33 +131711,39 @@ "reasoning": { "supported": true, "effort_options": [ - "none", + "minimal", + "low", + "medium", "high" ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-09-30", - "last_updated": "2025-09-30", + "attachment": true, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2026-05-07", + "last_updated": "2026-05-07", "type": "chat" }, { - "id": "z-ai/glm-4.5-air", - "name": "GLM-4.5-Air", - "display_name": "GLM-4.5-Air", + "id": "google/gemini-2.5-flash", + "name": "Gemini 2.5 Flash", + "display_name": "Gemini 2.5 Flash", "modalities": { "input": [ - "text" + "text", + "image", + "audio", + "video", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 98304 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -133326,26 +131753,42 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "none", - "high" + "supported": true, + "default_enabled": true, + "mode": "budget", + "budget": { + "default": -1, + "min": 0, + "max": 24576, + "auto": -1, + "off": 0, + "unit": "tokens" + }, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-07-28", - "last_updated": "2025-07-28", + "attachment": true, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2025-06-17", + "last_updated": "2025-06-17", "type": "chat" }, { - "id": "z-ai/glm-5.3", - "name": "GLM-5.3", - "display_name": "GLM-5.3", + "id": "google/gemini-2.5-flash-lite", + "name": "Gemini 2.5 Flash-Lite", + "display_name": "Gemini 2.5 Flash-Lite", "modalities": { "input": [ - "text" + "text", + "image", + "audio", + "video", + "pdf" ], "output": [ "text" @@ -133353,47 +131796,59 @@ }, "limit": { "context": 1048576, - "output": 943718 + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "effort_options": [ - "low", - "high", - "max" + "default_enabled": false, + "mode": "budget", + "budget": { + "default": -1, + "min": 512, + "max": 24576, + "auto": -1, + "unit": "tokens" + }, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "attachment": true, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2025-06-17", + "last_updated": "2025-06-17", "type": "chat" }, { - "id": "z-ai/glm-4.6v", - "name": "GLM-4.6V", - "display_name": "GLM-4.6V", + "id": "google/gemini-3.5-flash", + "name": "Gemini 3.5 Flash", + "display_name": "Gemini 3.5 Flash", "modalities": { "input": [ "text", "image", - "video" + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -133403,34 +131858,49 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "none", + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", + "low", + "medium", "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-12-08", - "last_updated": "2025-12-08", + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2026-05-19", + "last_updated": "2026-05-19", "type": "chat" }, { - "id": "z-ai/glm-5.3-prime", - "name": "Z.ai: GLM 5.3 Prime", - "display_name": "Z.ai: GLM 5.3 Prime", + "id": "google/gemini-3.6-flash", + "name": "Gemini 3.6 Flash", + "display_name": "Gemini 3.6 Flash", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -133440,23 +131910,34 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", "low", - "high", - "max" + "medium", + "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" ] } }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-09-23", - "last_updated": "2026-09-23", + "knowledge": "2026-03", + "release_date": "2026-07-21", + "last_updated": "2026-07-21", "type": "chat" }, { - "id": "z-ai/glm-5.2", - "name": "GLM-5.2", - "display_name": "GLM-5.2", + "id": "qwen/qwen3.7-max", + "name": "Qwen3.7 Max", + "display_name": "Qwen3.7 Max", "modalities": { "input": [ "text" @@ -133466,8 +131947,8 @@ ] }, "limit": { - "context": 1048576, - "output": 943718 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -133477,24 +131958,19 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "effort_options": [ - "none", - "high", - "xhigh" - ] + "supported": true } }, "attachment": false, - "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "open_weights": false, + "release_date": "2026-05-21", + "last_updated": "2026-05-21", "type": "chat" }, { - "id": "z-ai/glm-5.3-flashx", - "name": "Z.ai: GLM 5.3 FlashX", - "display_name": "Z.ai: GLM 5.3 FlashX", + "id": "qwen/qwen3.6-flash", + "name": "Qwen3.6 Flash", + "display_name": "Qwen3.6 Flash", "modalities": { "input": [ "text", @@ -133506,8 +131982,8 @@ ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 1000000, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -133517,35 +131993,38 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "low", - "high", - "max" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-09-18", - "last_updated": "2026-09-18", + "release_date": "2026-04-27", + "last_updated": "2026-04-27", "type": "chat" }, { - "id": "z-ai/glm-4.5v", - "name": "GLM-4.5V", - "display_name": "GLM-4.5V", + "id": "qwen/qwen3.8-max-preview", + "name": "Qwen3.8 Max Preview", + "display_name": "Qwen3.8 Max Preview", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 65536, - "output": 16384 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -133556,22 +132035,22 @@ "extra_capabilities": { "reasoning": { "effort_options": [ - "none", - "high" + "low", + "medium", + "xhigh" ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-08-11", - "last_updated": "2025-08-11", + "open_weights": false, + "release_date": "2026-07-19", + "last_updated": "2026-07-19", "type": "chat" }, { - "id": "z-ai/glm-5.3-flash", - "name": "GLM-5.3-Flash", - "display_name": "GLM-5.3-Flash", + "id": "qwen/qwen3.7-plus", + "name": "Qwen3.7 Plus", + "display_name": "Qwen3.7 Plus", "modalities": { "input": [ "text", @@ -133583,8 +132062,8 @@ ] }, "limit": { - "context": 1048575, - "output": 943717 + "context": 1000000, + "output": 64000 }, "temperature": true, "tool_call": true, @@ -133594,24 +132073,20 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "effort_options": [ - "low", - "high", - "max" - ] + "supported": true } }, "attachment": true, - "open_weights": true, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", + "open_weights": false, + "knowledge": "2025-04", + "release_date": "2026-06-02", + "last_updated": "2026-06-02", "type": "chat" }, { - "id": "z-ai/glm-5-turbo", - "name": "GLM-5-Turbo", - "display_name": "GLM-5-Turbo", + "id": "fireworks/gpt-oss-20b", + "name": "GPT OSS 20B", + "display_name": "GPT OSS 20B", "modalities": { "input": [ "text" @@ -133621,8 +132096,8 @@ ] }, "limit": { - "context": 202752, - "output": 131072 + "context": 131072, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -133634,21 +132109,23 @@ "reasoning": { "supported": true, "effort_options": [ - "none", + "low", + "medium", "high" ] } }, "attachment": false, - "open_weights": false, - "release_date": "2026-03-16", - "last_updated": "2026-03-16", + "open_weights": true, + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "z-ai/glm-4.7", - "name": "GLM-4.7", - "display_name": "GLM-4.7", + "id": "fireworks/glm-5.2", + "name": "GLM-5.2", + "display_name": "GLM-5.2", "modalities": { "input": [ "text" @@ -133658,7 +132135,7 @@ ] }, "limit": { - "context": 204800, + "context": 1000000, "output": 131072 }, "temperature": true, @@ -133669,30 +132146,19 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "none", - "high" - ] + "supported": true } }, "attachment": false, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-12-22", - "last_updated": "2025-12-22", + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "z-ai/glm-4.5", - "name": "GLM-4.5", - "display_name": "GLM-4.5", + "id": "fireworks/gpt-oss-120b", + "name": "GPT OSS 120B", + "display_name": "GPT OSS 120B", "modalities": { "input": [ "text" @@ -133703,7 +132169,7 @@ }, "limit": { "context": 131072, - "output": 98304 + "output": 32768 }, "temperature": true, "tool_call": true, @@ -133713,23 +132179,25 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ - "none", + "low", + "medium", "high" ] } }, "attachment": false, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-07-28", - "last_updated": "2025-07-28", + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "z-ai/glm-4.7-flash", - "name": "GLM-4.7-Flash", - "display_name": "GLM-4.7-Flash", + "id": "cerebras/gpt-oss-120b", + "name": "GPT OSS 120B", + "display_name": "GPT OSS 120B", "modalities": { "input": [ "text" @@ -133740,7 +132208,7 @@ }, "limit": { "context": 131072, - "output": 117964 + "output": 32768 }, "temperature": true, "tool_call": true, @@ -133752,22 +132220,32 @@ "reasoning": { "supported": true, "effort_options": [ - "none", + "low", + "medium", "high" ] } }, "attachment": false, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2026-01-19", - "last_updated": "2026-01-19", + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" - }, + } + ] + }, + "ebcloud": { + "id": "ebcloud", + "name": "EBCloud", + "display_name": "EBCloud", + "api": "https://maas-api.ebcloud.com/v1", + "doc": "https://docs.ebtech.com/ai/model-api.html", + "models": [ { - "id": "arcee-ai/trinity-large-thinking", - "name": "Trinity Large Thinking", - "display_name": "Trinity Large Thinking", + "id": "Kimi-K2.6", + "name": "Kimi K2.6", + "display_name": "Kimi K2.6", "modalities": { "input": [ "text" @@ -133778,7 +132256,7 @@ }, "limit": { "context": 262144, - "output": 80000 + "output": 262144 }, "temperature": true, "tool_call": true, @@ -133788,21 +132266,26 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "high" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, "attachment": false, "open_weights": true, - "release_date": "2026-04-01", - "last_updated": "2026-05-28", + "knowledge": "2025-01", + "release_date": "2026-04-20", + "last_updated": "2026-04-20", "type": "chat" }, { - "id": "deepseek/deepseek-chat", - "name": "DeepSeek Chat", - "display_name": "DeepSeek Chat", + "id": "GLM-5.1", + "name": "GLM-5.1", + "display_name": "GLM-5.1", "modalities": { "input": [ "text" @@ -133812,25 +132295,36 @@ ] }, "limit": { - "context": 128000, - "output": 16000 + "context": 200000, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, "open_weights": true, - "knowledge": "2025-09", - "release_date": "2025-12-01", - "last_updated": "2026-02-28", + "release_date": "2026-04-07", + "last_updated": "2026-04-07", "type": "chat" }, { - "id": "deepseek/deepseek-v4-flash", - "name": "DeepSeek V4 Flash", - "display_name": "DeepSeek V4 Flash", + "id": "DeepSeek-V4-Pro", + "name": "DeepSeek V4 Pro", + "display_name": "DeepSeek V4 Pro", "modalities": { "input": [ "text" @@ -133840,8 +132334,8 @@ ] }, "limit": { - "context": 1048575, - "output": 943717 + "context": 1000000, + "output": 384000 }, "temperature": true, "tool_call": true, @@ -133879,9 +132373,9 @@ "type": "chat" }, { - "id": "deepseek/deepseek-v3.1-terminus", - "name": "DeepSeek: DeepSeek V3.1 Terminus", - "display_name": "DeepSeek: DeepSeek V3.1 Terminus", + "id": "DeepSeek-V4-Flash", + "name": "DeepSeek V4 Flash", + "display_name": "DeepSeek V4 Flash", "modalities": { "input": [ "text" @@ -133891,8 +132385,8 @@ ] }, "limit": { - "context": 163840, - "output": 147456 + "context": 1000000, + "output": 384000 }, "temperature": true, "tool_call": true, @@ -133902,22 +132396,46 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "none", - "high" + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "high", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, "attachment": false, - "open_weights": false, - "release_date": "2025-09-22", - "last_updated": "2025-09-22", + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" - }, + } + ] + }, + "submodel": { + "id": "submodel", + "name": "submodel", + "display_name": "submodel", + "api": "https://llm.submodel.ai/v1", + "doc": "https://submodel.gitbook.io", + "models": [ { - "id": "deepseek/deepseek-r1-0528", - "name": "DeepSeek R1 0528", - "display_name": "DeepSeek R1 0528", + "id": "openai/gpt-oss-120b", + "name": "GPT OSS 120B", + "display_name": "GPT OSS 120B", "modalities": { "input": [ "text" @@ -133927,7 +132445,7 @@ ] }, "limit": { - "context": 163840, + "context": 131072, "output": 32768 }, "temperature": true, @@ -133938,28 +132456,20 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "high" - ] + "supported": true } }, "attachment": false, "open_weights": true, - "release_date": "2025-05-28", - "last_updated": "2025-05-28", + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "deepseek/deepseek-v4-pro", - "name": "DeepSeek V4 Pro", - "display_name": "DeepSeek V4 Pro", + "id": "Qwen/Qwen3-235B-A22B-Instruct-2507", + "name": "Qwen3 235B A22B Instruct 2507", + "display_name": "Qwen3 235B A22B Instruct 2507", "modalities": { "input": [ "text" @@ -133969,8 +132479,35 @@ ] }, "limit": { - "context": 1024000, - "output": 384000 + "context": 262144, + "output": 131072 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "release_date": "2025-07-21", + "last_updated": "2025-07-21", + "type": "chat" + }, + { + "id": "Qwen/Qwen3-235B-A22B-Thinking-2507", + "name": "Qwen3 235B A22B Thinking 2507", + "display_name": "Qwen3 235B A22B Thinking 2507", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 262144, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -133981,36 +132518,24 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "high", - "max" - ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, "attachment": false, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "release_date": "2025-07-25", + "last_updated": "2025-07-25", "type": "chat" }, { - "id": "deepseek/deepseek-chat-v3.1", - "name": "DeepSeek V3.1", - "display_name": "DeepSeek V3.1", + "id": "Qwen/Qwen3-Coder-480B-A35B-Instruct-FP8", + "name": "Qwen3 Coder 480B A35B Instruct", + "display_name": "Qwen3 Coder 480B A35B Instruct", "modalities": { "input": [ "text" @@ -134020,34 +132545,25 @@ ] }, "limit": { - "context": 163840, - "output": 32768 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "high" - ] - } + "supported": false }, "attachment": false, "open_weights": true, - "knowledge": "2025-03-31", - "release_date": "2025-08-21", - "last_updated": "2025-08-21", + "knowledge": "2025-04", + "release_date": "2025-07-22", + "last_updated": "2025-07-22", "type": "chat" }, { - "id": "deepseek/deepseek-v4-pro-0813", - "name": "DeepSeek V4 Pro 0813", - "display_name": "DeepSeek V4 Pro 0813", + "id": "zai-org/GLM-4.5-FP8", + "name": "GLM 4.5 FP8", + "display_name": "GLM 4.5 FP8", "modalities": { "input": [ "text" @@ -134057,8 +132573,8 @@ ] }, "limit": { - "context": 1048576, - "output": 393216 + "context": 131072, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -134066,39 +132582,83 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "none", - "low", - "high", - "max" - ] - } + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-07-28", + "last_updated": "2025-07-28", + "type": "chat" + }, + { + "id": "zai-org/GLM-4.5-Air", + "name": "GLM 4.5 Air", + "display_name": "GLM 4.5 Air", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 131072, + "output": 131072 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false }, "attachment": false, "open_weights": true, - "release_date": "2026-08-13", - "last_updated": "2026-08-22", + "knowledge": "2025-04", + "release_date": "2025-07-28", + "last_updated": "2025-07-28", "type": "chat" }, { - "id": "deepseek/deepseek-v4-flash-vision-exp", - "name": "DeepSeek V4 Flash Vision Exp", - "display_name": "DeepSeek V4 Flash Vision Exp", + "id": "deepseek-ai/DeepSeek-V3-0324", + "name": "DeepSeek V3 0324", + "display_name": "DeepSeek V3 0324", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 262144 + "context": 75000, + "output": 163840 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "release_date": "2025-03-24", + "last_updated": "2025-03-24", + "type": "chat" + }, + { + "id": "deepseek-ai/DeepSeek-R1-0528", + "name": "DeepSeek R1 0528", + "display_name": "DeepSeek R1 0528", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 75000, + "output": 163840 }, "temperature": true, "tool_call": true, @@ -134109,35 +132669,24 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "high", - "max" - ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-08-21", - "last_updated": "2026-09-01", + "release_date": "2025-05-28", + "last_updated": "2025-05-28", "type": "chat" }, { - "id": "deepseek/deepseek-v3.2-exp", - "name": "DeepSeek: DeepSeek V3.2 Exp", - "display_name": "DeepSeek: DeepSeek V3.2 Exp", + "id": "deepseek-ai/DeepSeek-V3.1", + "name": "DeepSeek V3.1", + "display_name": "DeepSeek V3.1", "modalities": { "input": [ "text" @@ -134147,8 +132696,8 @@ ] }, "limit": { - "context": 163840, - "output": 147456 + "context": 75000, + "output": 163840 }, "temperature": true, "tool_call": true, @@ -134156,22 +132705,23 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "high" - ] - } - }, "attachment": false, - "open_weights": false, - "release_date": "2025-09-29", - "last_updated": "2025-09-29", + "open_weights": true, + "release_date": "2025-08-21", + "last_updated": "2025-08-21", "type": "chat" - }, + } + ] + }, + "alibaba-token-plan-cn": { + "id": "alibaba-token-plan-cn", + "name": "Alibaba Token Plan (China)", + "display_name": "Alibaba Token Plan (China)", + "api": "https://token-plan.cn-beijing.maas.aliyuncs.com/compatible-mode/v1", + "doc": "https://www.alibabacloud.com/help/zh/model-studio/token-plan-overview", + "models": [ { - "id": "deepseek/deepseek-v4-flash-0731", + "id": "deepseek-v4-flash-0731", "name": "DeepSeek V4 Flash 0731", "display_name": "DeepSeek V4 Flash 0731", "modalities": { @@ -134183,8 +132733,8 @@ ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 1000000, + "output": 384000 }, "temperature": true, "tool_call": true, @@ -134195,9 +132745,13 @@ "extra_capabilities": { "reasoning": { "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ - "none", - "low", "high", "max" ] @@ -134211,49 +132765,48 @@ "type": "chat" }, { - "id": "deepseek/deepseek-chat-v3-0324", - "name": "DeepSeek V3 0324", - "display_name": "DeepSeek V3 0324", + "id": "happyhorse-1.1-t2v", + "name": "HappyHorse 1.1 Text-to-Video", + "display_name": "HappyHorse 1.1 Text-to-Video", "modalities": { "input": [ "text" ], "output": [ - "text" + "video" ] }, "limit": { - "context": 128000, - "output": 115200 + "context": 8192, + "output": 8192 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, "attachment": false, - "open_weights": true, - "knowledge": "2024-07-31", - "release_date": "2025-03-24", - "last_updated": "2025-03-24", - "type": "chat" + "open_weights": false, + "release_date": "2026-07-17", + "last_updated": "2026-07-17" }, { - "id": "deepseek/deepseek-v4.1-flash-1017", - "name": "DeepSeek V4.1 Flash 1017", - "display_name": "DeepSeek V4.1 Flash 1017", + "id": "qwen3.6-plus", + "name": "Qwen3.6 Plus", + "display_name": "Qwen3.6 Plus", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 393216 + "context": 1000000, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -134263,37 +132816,37 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "none", - "low", - "high", - "max" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-10-17", - "last_updated": "2026-10-17", + "open_weights": false, + "knowledge": "2025-04", + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "deepseek/deepseek-v4.1-flash", - "name": "DeepSeek V4.1 Flash", - "display_name": "DeepSeek V4.1 Flash", + "id": "glm-5.2", + "name": "GLM-5.2", + "display_name": "GLM-5.2", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 943718 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -134304,63 +132857,54 @@ "extra_capabilities": { "reasoning": { "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ - "none", - "low", "high", "max" ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-09-10", - "last_updated": "2026-09-10", + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "deepseek/deepseek-v3.2", - "name": "DeepSeek V3.2", - "display_name": "DeepSeek V3.2", + "id": "qwen-image-2.0-pro", + "name": "Qwen Image 2.0 Pro", + "display_name": "Qwen Image 2.0 Pro", "modalities": { "input": [ "text" ], "output": [ - "text" + "image" ] }, "limit": { - "context": 131072, - "output": 65536 + "context": 8192, + "output": 8192 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "none", - "high" - ] - } + "supported": false }, "attachment": false, - "open_weights": true, - "knowledge": "2024-07", - "release_date": "2025-12-01", - "last_updated": "2025-12-01", - "type": "chat" + "open_weights": false, + "release_date": "2026-03-03", + "last_updated": "2026-03-03" }, { - "id": "xingchen-agi/xing4.0-29b-a4b:free", - "name": "XingChen: Xing4.0 29B A4B (free)", - "display_name": "XingChen: Xing4.0 29B A4B (free)", + "id": "deepseek-v4-flash", + "name": "DeepSeek V4 Flash", + "display_name": "DeepSeek V4 Flash", "modalities": { "input": [ "text" @@ -134370,8 +132914,8 @@ ] }, "limit": { - "context": 262144, - "output": 235929 + "context": 1000000, + "output": 384000 }, "temperature": true, "tool_call": true, @@ -134381,70 +132925,68 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", "effort_options": [ - "none", - "high" + "low", + "high", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, "attachment": false, - "open_weights": false, - "release_date": "2026-10-16", - "last_updated": "2026-10-16", + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "anthropic/claude-haiku-5.5", - "name": "Claude Haiku 5.5", - "display_name": "Claude Haiku 5.5", + "id": "happyhorse-1.1-r2v", + "name": "HappyHorse 1.1 Reference-to-Video", + "display_name": "HappyHorse 1.1 Reference-to-Video", "modalities": { "input": [ - "text", "image", - "pdf" + "text" ], "output": [ - "text" + "video" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 8192, + "output": 8192 }, - "temperature": false, - "tool_call": true, + "temperature": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ] - } + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-10-07", - "last_updated": "2026-10-07", - "type": "chat" + "release_date": "2026-07-17", + "last_updated": "2026-07-17" }, { - "id": "anthropic/claude-opus-4.7", - "name": "Claude Opus 4.7", - "display_name": "Claude Opus 4.7", + "id": "deepseek-v4.1-flash", + "name": "DeepSeek V4.1 Flash", + "display_name": "DeepSeek V4.1 Flash", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" @@ -134452,211 +132994,154 @@ }, "limit": { "context": 1000000, - "output": 128000 + "output": 384000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], "interleaved": true, "summaries": true, - "visibility": "omitted", + "visibility": "summary", "continuation": [ "thinking_blocks" ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." + "effort_options": [ + "low", + "high", + "max" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-04-16", - "last_updated": "2026-04-16", + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-09-10", + "last_updated": "2026-09-10", "type": "chat" }, { - "id": "anthropic/claude-opus-4.6", - "name": "Claude Opus 4.6", - "display_name": "Claude Opus 4.6", + "id": "MiniMax-M2.5", + "name": "MiniMax-M2.5", + "display_name": "MiniMax-M2.5", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 196608, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "max" - ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-05-31", - "release_date": "2026-02-05", - "last_updated": "2026-03-13", + "attachment": false, + "open_weights": true, + "release_date": "2026-02-12", + "last_updated": "2026-02-12", "type": "chat" }, { - "id": "anthropic/claude-sonnet-5", - "name": "Claude Sonnet 5", - "display_name": "Claude Sonnet 5", + "id": "happyhorse-1.1-i2v", + "name": "HappyHorse 1.1 Image-to-Video", + "display_name": "HappyHorse 1.1 Image-to-Video", "modalities": { "input": [ - "text", "image", - "pdf" + "text" ], "output": [ - "text" + "video" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 8192, + "output": 8192 }, - "temperature": false, - "tool_call": true, + "temperature": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ] - } + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-30", - "last_updated": "2026-06-30", - "type": "chat" + "release_date": "2026-07-17", + "last_updated": "2026-07-17" }, { - "id": "anthropic/claude-haiku-4.5", - "name": "Claude Haiku 4.5 (latest)", - "display_name": "Claude Haiku 4.5 (latest)", + "id": "glm-5.3", + "name": "GLM-5.3", + "display_name": "GLM-5.3", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + "effort_options": [ + "low", + "high", + "max" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-02-28", - "release_date": "2025-10-15", - "last_updated": "2025-10-15", + "attachment": false, + "open_weights": true, + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "anthropic/claude-opus-4.8", - "name": "Claude Opus 4.8", - "display_name": "Claude Opus 4.8", + "id": "qwen3.7-max", + "name": "Qwen3.7 Max", + "display_name": "Qwen3.7 Max", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" @@ -134664,55 +133149,40 @@ }, "limit": { "context": 1000000, - "output": 128000 + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], "interleaved": true, "summaries": true, - "visibility": "omitted", + "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2026-01", - "release_date": "2026-05-28", - "last_updated": "2026-05-28", + "release_date": "2026-05-21", + "last_updated": "2026-05-21", "type": "chat" }, { - "id": "anthropic/claude-opus-5.5", - "name": "Claude Opus 5.5", - "display_name": "Claude Opus 5.5", + "id": "qwen3.8-max", + "name": "Qwen3.8 Max", + "display_name": "Qwen3.8 Max", "modalities": { "input": [ "text", "image", + "video", "pdf" ], "output": [ @@ -134721,9 +133191,9 @@ }, "limit": { "context": 1000000, - "output": 128000 + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -134731,39 +133201,43 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ "low", "medium", - "high", - "xhigh", - "max" + "xhigh" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "release_date": "2026-08-03", + "last_updated": "2026-08-03", "type": "chat" }, { - "id": "anthropic/claude-fable-5.1", - "name": "Claude Fable 5.1", - "display_name": "Claude Fable 5.1", + "id": "kimi-k2.7-code", + "name": "Kimi K2.7 Code", + "display_name": "Kimi K2.7 Code", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 262144, + "output": 262144 }, "temperature": false, "tool_call": true, @@ -134774,199 +133248,137 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], "interleaved": true, "summaries": true, - "visibility": "omitted", + "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", - "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", - "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-09-01", - "last_updated": "2026-09-01", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-06-12", + "last_updated": "2026-06-12", "type": "chat" }, { - "id": "anthropic/claude-opus-4.1", - "name": "Claude Opus 4.1 (latest)", - "display_name": "Claude Opus 4.1 (latest)", + "id": "qwen3.6-flash", + "name": "Qwen3.6 Flash", + "display_name": "Qwen3.6 Flash", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 32000 + "context": 1000000, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-03-31", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "release_date": "2026-04-27", + "last_updated": "2026-04-27", "type": "chat" }, { - "id": "anthropic/claude-opus-5", - "name": "Claude Opus 5", - "display_name": "Claude Opus 5", + "id": "qwen-image-2.0", + "name": "Qwen Image 2.0", + "display_name": "Qwen Image 2.0", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ - "text" + "image" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 8192, + "output": 8192 }, - "temperature": false, - "tool_call": true, + "temperature": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ] - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2026-05", - "release_date": "2026-07-24", - "last_updated": "2026-07-24", - "type": "chat" + "release_date": "2026-03-03", + "last_updated": "2026-03-03" }, { - "id": "anthropic/claude-opus-4.5", - "name": "Claude Opus 4.5 (latest)", - "display_name": "Claude Opus 4.5 (latest)", + "id": "kimi-k2.6", + "name": "Kimi K2.6", + "display_name": "Kimi K2.6", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high" - ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-05", - "release_date": "2025-11-24", - "last_updated": "2025-11-24", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-04-20", + "last_updated": "2026-04-20", "type": "chat" }, { - "id": "anthropic/claude-sonnet-4.6", - "name": "Claude Sonnet 4.6", - "display_name": "Claude Sonnet 4.6", + "id": "deepseek-v4-pro", + "name": "DeepSeek V4 Pro", + "display_name": "DeepSeek V4 Pro", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" @@ -134974,27 +133386,22 @@ }, "limit": { "context": 1000000, - "output": 128000 + "output": 384000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, + "default_enabled": true, + "mode": "effort", "effort": "high", "effort_options": [ "low", - "medium", "high", "max" ], @@ -135005,27 +133412,25 @@ "thinking_blocks" ], "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-17", - "last_updated": "2026-03-13", + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "anthropic/claude-sonnet-4.5", - "name": "Claude Sonnet 4.5 (latest)", - "display_name": "Claude Sonnet 4.5 (latest)", + "id": "deepseek-v4.1-flash-1017", + "name": "DeepSeek V4.1 Flash 1017", + "display_name": "DeepSeek V4.1 Flash 1017", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" @@ -135033,51 +133438,46 @@ }, "limit": { "context": 1000000, - "output": 64000 + "output": 384000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + "effort_options": [ + "low", + "high", + "max" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-07-31", - "release_date": "2025-09-29", - "last_updated": "2025-09-29", + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-10-17", + "last_updated": "2026-10-17", "type": "chat" }, { - "id": "anthropic/claude-sonnet-5.5", - "name": "Claude Sonnet 5.5", - "display_name": "Claude Sonnet 5.5", + "id": "qwen3.8-max-preview", + "name": "Qwen3.8 Max Preview", + "display_name": "Qwen3.8 Max Preview", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" @@ -135085,9 +133485,9 @@ }, "limit": { "context": 1000000, - "output": 128000 + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -135095,41 +133495,43 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ "low", "medium", - "high", - "xhigh", - "max" + "xhigh" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-09-28", - "last_updated": "2026-09-28", + "release_date": "2026-07-19", + "last_updated": "2026-07-19", "type": "chat" }, { - "id": "anthropic/claude-fable-5", - "name": "Claude Fable 5", - "display_name": "Claude Fable 5", + "id": "deepseek-v3.2", + "name": "DeepSeek V3.2", + "display_name": "DeepSeek V3.2", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 131072, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -135137,41 +133539,20 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", - "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", - "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." - ] + "supported": true } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-09", - "last_updated": "2026-06-09", + "attachment": false, + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2025-12-03", + "last_updated": "2025-12-05", "type": "chat" }, { - "id": "gryphe/mythomax-l2-13b", - "name": "MythoMax 13B", - "display_name": "MythoMax 13B", + "id": "glm-5", + "name": "GLM-5", + "display_name": "GLM-5", "modalities": { "input": [ "text" @@ -135181,93 +133562,91 @@ ] }, "limit": { - "context": 4096, - "output": 3686 - }, - "temperature": true, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": true, - "release_date": "2023-08-10", - "last_updated": "2023-08-10", - "type": "chat" - }, - { - "id": "mistralai/codestral-2508", - "name": "Codestral 25.08", - "display_name": "Codestral 25.08", - "modalities": { - "input": [ - "text", - "pdf" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 256000, - "output": 204800 + "context": 202752, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, "open_weights": false, - "release_date": "2025-07-30", - "last_updated": "2025-07-30", + "release_date": "2026-02-12", + "last_updated": "2026-02-12", "type": "chat" }, { - "id": "mistralai/voxtral-small-24b-2507", - "name": "Voxtral Small 24B 2507", - "display_name": "Voxtral Small 24B 2507", + "id": "qwen3.7-plus", + "name": "Qwen3.7 Plus", + "display_name": "Qwen3.7 Plus", "modalities": { "input": [ "text", - "audio", - "pdf" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 32768, - "output": 26214 + "context": 1000000, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": true, - "open_weights": true, - "release_date": "2025-07-15", - "last_updated": "2025-07-15", + "open_weights": false, + "knowledge": "2025-04", + "release_date": "2026-06-02", + "last_updated": "2026-06-02", "type": "chat" }, { - "id": "mistralai/mistral-large-4-0", - "name": "Mistral: Mistral Large 4", - "display_name": "Mistral: Mistral Large 4", + "id": "qwen3.8-flash", + "name": "Qwen3.8 Flash", + "display_name": "Qwen3.8 Flash", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 262144 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -135277,56 +133656,35 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ - "none", - "high" + "low", + "medium", + "xhigh" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-10-06", - "last_updated": "2026-10-06", - "type": "chat" - }, - { - "id": "mistralai/mistral-small-3.1-24b-instruct", - "name": "Mistral Small 3.1 24B", - "display_name": "Mistral Small 3.1 24B", - "modalities": { - "input": [ - "text", - "image" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 128000, - "output": 102400 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": true, - "knowledge": "2023-10-31", - "release_date": "2025-03-17", - "last_updated": "2025-03-17", + "release_date": "2026-08-26", + "last_updated": "2026-08-26", "type": "chat" }, { - "id": "mistralai/mistral-large-2512", - "name": "Mistral Large 3", - "display_name": "Mistral Large 3", + "id": "kimi-k2.5", + "name": "Kimi K2.5", + "display_name": "Kimi K2.5", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" @@ -135334,67 +133692,73 @@ }, "limit": { "context": 262144, - "output": 209715 + "output": 98304 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": true, "open_weights": true, - "knowledge": "2024-11", - "release_date": "2025-12-02", - "last_updated": "2025-12-02", + "knowledge": "2025-01", + "release_date": "2026-01-27", + "last_updated": "2026-01-27", "type": "chat" }, { - "id": "mistralai/mistral-medium-3.1", - "name": "Mistral Medium 3.1", - "display_name": "Mistral Medium 3.1", + "id": "wan2.7-image", + "name": "Wan2.7 Image", + "display_name": "Wan2.7 Image", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ - "text" + "image" ] }, "limit": { - "context": 131072, - "output": 104857 + "context": 8192, + "output": 8192 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-06-30", - "release_date": "2025-08-12", - "last_updated": "2025-08-12", - "type": "chat" + "release_date": "2026-05-29", + "last_updated": "2026-05-29" }, { - "id": "mistralai/mistral-medium-3-5", - "name": "Mistral Medium 3.5", - "display_name": "Mistral Medium 3.5", + "id": "deepseek-v4-pro-0813", + "name": "DeepSeek V4 Pro 0813", + "display_name": "DeepSeek V4 Pro 0813", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 209715 + "context": 1000000, + "output": 384000 }, "temperature": true, "tool_call": true, @@ -135404,108 +133768,103 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ - "none", - "high" + "high", + "max" ] } }, - "attachment": true, - "open_weights": false, - "release_date": "2026-04-30", - "last_updated": "2026-04-30", + "attachment": false, + "open_weights": true, + "release_date": "2026-08-13", + "last_updated": "2026-08-22", "type": "chat" }, { - "id": "mistralai/ministral-3b-2512", - "name": "Ministral 3 3B 2512", - "display_name": "Ministral 3 3B 2512", + "id": "glm-5.1", + "name": "GLM-5.1", + "display_name": "GLM-5.1", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 104857 + "context": 202752, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, "open_weights": true, - "release_date": "2025-12-02", - "last_updated": "2025-12-02", + "release_date": "2026-04-07", + "last_updated": "2026-04-07", "type": "chat" }, { - "id": "mistralai/mistral-medium-3", - "name": "Mistral Medium 3", - "display_name": "Mistral Medium 3", + "id": "wan2.7-image-pro", + "name": "Wan2.7 Image Pro", + "display_name": "Wan2.7 Image Pro", "modalities": { "input": [ - "text", - "image", - "pdf" - ], - "output": [ "text" - ] - }, - "limit": { - "context": 131072, - "output": 104857 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-03-31", - "release_date": "2025-05-07", - "last_updated": "2025-05-07", - "type": "chat" - }, - { - "id": "mistralai/ministral-14b-2512", - "name": "Ministral 3 14B 2512", - "display_name": "Ministral 3 14B 2512", - "modalities": { - "input": [ - "text", - "image" ], "output": [ - "text" + "image" ] }, "limit": { - "context": 262144, - "output": 209715 + "context": 8192, + "output": 8192 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, - "attachment": true, - "open_weights": true, - "release_date": "2025-12-02", - "last_updated": "2025-12-02", - "type": "chat" - }, + "attachment": false, + "open_weights": false, + "release_date": "2026-05-29", + "last_updated": "2026-05-29" + } + ] + }, + "prime": { + "id": "prime", + "name": "Prime Inference", + "display_name": "Prime Inference", + "api": "https://api.pinference.ai/api/v1", + "doc": "https://docs.primeintellect.ai/inference/overview", + "models": [ { - "id": "mistralai/mistral-nemo", - "name": "Mistral Nemo", - "display_name": "Mistral Nemo", + "id": "meta-llama/llama-3.3-70b-instruct", + "name": "Llama 3.3 70B Instruct", + "display_name": "Llama 3.3 70B Instruct", "modalities": { "input": [ "text" @@ -135525,29 +133884,30 @@ }, "attachment": false, "open_weights": true, - "knowledge": "2024-07", - "release_date": "2024-07-18", - "last_updated": "2024-07-18", + "knowledge": "2023-12", + "release_date": "2024-12-06", + "last_updated": "2024-12-06", "type": "chat" }, { - "id": "mistralai/mistral-small-2603", - "name": "Mistral Small 4", - "display_name": "Mistral Small 4", + "id": "moonshotai/kimi-k3.1-pro", + "name": "Kimi K3.1 Pro", + "display_name": "Kimi K3.1 Pro", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 209715 + "context": 1048576, + "output": 943718 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -135557,21 +133917,22 @@ "reasoning": { "effort_options": [ "none", - "high" + "low", + "high", + "max" ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-06", - "release_date": "2026-03-16", - "last_updated": "2026-03-16", + "open_weights": false, + "release_date": "2026-10-23", + "last_updated": "2026-10-23", "type": "chat" }, { - "id": "mistralai/mistral-small-24b-instruct-2501", - "name": "Mistral Small 3", - "display_name": "Mistral Small 3", + "id": "moonshotai/kimi-k2-0905", + "name": "Kimi K2 0905", + "display_name": "Kimi K2 0905", "modalities": { "input": [ "text" @@ -135581,86 +133942,107 @@ ] }, "limit": { - "context": 32768, - "output": 16384 + "context": 262144, + "output": 98304 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, "attachment": false, "open_weights": true, - "knowledge": "2023-10-31", - "release_date": "2025-01-30", - "last_updated": "2025-01-30", + "release_date": "2025-09-05", + "last_updated": "2025-09-05", "type": "chat" }, { - "id": "mistralai/devstral-2512", - "name": "Devstral 2", - "display_name": "Devstral 2", + "id": "moonshotai/kimi-k3", + "name": "Kimi K3", + "display_name": "Kimi K3", "modalities": { "input": [ "text", - "pdf" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 209715 + "context": 1048576, + "output": 943718 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "none", + "low", + "high", + "max" + ] + } }, "attachment": true, "open_weights": true, - "knowledge": "2025-12", - "release_date": "2025-12-09", - "last_updated": "2025-12-09", + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" }, { - "id": "mistralai/mistral-large", - "name": "Mistral Large", - "display_name": "Mistral Large", + "id": "deepseek/deepseek-v4-flash-0731", + "name": "DeepSeek V4 Flash 0731", + "display_name": "DeepSeek V4 Flash 0731", "modalities": { "input": [ - "text", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 102400 + "context": 1048576, + "output": 943718 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-11-30", - "release_date": "2024-02-26", - "last_updated": "2024-02-26", + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "none", + "low", + "high", + "max" + ] + } + }, + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-07-31", + "last_updated": "2026-07-31", "type": "chat" }, { - "id": "mistralai/mistral-small-3.2-24b-instruct", - "name": "Mistral Small 3.2 24B", - "display_name": "Mistral Small 3.2 24B", + "id": "deepseek/deepseek-v4-flash", + "name": "DeepSeek V4 Flash 0423", + "display_name": "DeepSeek V4 Flash 0423", "modalities": { "input": [ - "image", "text" ], "output": [ @@ -135668,83 +134050,140 @@ ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 1048576, + "output": 943717 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "high", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." + ] + } + }, + "attachment": false, "open_weights": true, - "knowledge": "2023-10-31", - "release_date": "2025-06-20", - "last_updated": "2025-06-20", + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "mistralai/mistral-large-2407", - "name": "Mistral Large 2407", - "display_name": "Mistral Large 2407", + "id": "deepseek/deepseek-v4.1-flash", + "name": "DeepSeek V4.1 Flash", + "display_name": "DeepSeek V4.1 Flash", "modalities": { "input": [ "text", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 104857 + "context": 1048576, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "none", + "low", + "high", + "max" + ] + } }, "attachment": true, "open_weights": true, - "knowledge": "2024-03-31", - "release_date": "2024-07-24", - "last_updated": "2024-07-24", + "knowledge": "2025-05", + "release_date": "2026-09-10", + "last_updated": "2026-09-10", "type": "chat" }, { - "id": "mistralai/mixtral-8x22b-instruct", - "name": "Mixtral 8x22B Instruct", - "display_name": "Mixtral 8x22B Instruct", + "id": "deepseek/deepseek-v4-pro", + "name": "DeepSeek V4 Pro 0423", + "display_name": "DeepSeek V4 Pro 0423", "modalities": { "input": [ - "text", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 65536, - "output": 52428 + "context": 1048576, + "output": 384000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "high", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." + ] + } + }, + "attachment": false, "open_weights": true, - "knowledge": "2024-01-31", - "release_date": "2024-04-17", - "last_updated": "2024-04-17", + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "mistralai/ministral-8b-2512", - "name": "Ministral 3 8B 2512", - "display_name": "Ministral 3 8B 2512", + "id": "deepseek/deepseek-v4.1-flash-1017", + "name": "DeepSeek V4.1 Flash 1017", + "display_name": "DeepSeek V4.1 Flash 1017", "modalities": { "input": [ "text", @@ -135755,36 +134194,48 @@ ] }, "limit": { - "context": 262144, - "output": 209715 + "context": 1048576, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "low", + "high", + "max" + ] + } }, "attachment": true, "open_weights": true, - "release_date": "2025-12-02", - "last_updated": "2025-12-02", + "knowledge": "2025-05", + "release_date": "2026-10-17", + "last_updated": "2026-10-17", "type": "chat" }, { - "id": "mistralai/mistral-saba", - "name": "Saba", - "display_name": "Saba", + "id": "openai/gpt-4.1-nano", + "name": "GPT-4.1 Nano", + "display_name": "GPT-4.1 Nano", "modalities": { "input": [ "text", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 32768, - "output": 26214 + "context": 1047576, + "output": 942818 }, "temperature": true, "tool_call": true, @@ -135793,15 +134244,15 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-02-17", - "last_updated": "2025-02-17", + "knowledge": "2024-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", "type": "chat" }, { - "id": "meituan/longcat-2.0", - "name": "Meituan: LongCat 2.0", - "display_name": "Meituan: LongCat 2.0", + "id": "openai/gpt-oss-20b", + "name": "gpt-oss-20b", + "display_name": "gpt-oss-20b", "modalities": { "input": [ "text" @@ -135811,8 +134262,8 @@ ] }, "limit": { - "context": 1048756, - "output": 262144 + "context": 131072, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -135824,23 +134275,26 @@ "reasoning": { "supported": true, "effort_options": [ - "none", + "low", + "medium", "high" ] } }, "attachment": false, "open_weights": true, - "release_date": "2026-06-30", - "last_updated": "2026-06-30", + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "meta-llama/llama-3.3-70b-instruct", - "name": "Llama-3.3-70B-Instruct", - "display_name": "Llama-3.3-70B-Instruct", + "id": "openai/gpt-5.6-terra", + "name": "GPT-5.6 Terra", + "display_name": "GPT-5.6 Terra", "modalities": { "input": [ + "image", "text" ], "output": [ @@ -135848,25 +134302,49 @@ ] }, "limit": { - "context": 131072, - "output": 16384 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2023-12", - "release_date": "2024-12-06", - "last_updated": "2024-12-06", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "meta-llama/llama-4-maverick", - "name": "Meta: Llama 4 Maverick", - "display_name": "Meta: Llama 4 Maverick", + "id": "openai/gpt-5.4", + "name": "GPT-5.4", + "display_name": "GPT-5.4", "modalities": { "input": [ "text", @@ -135877,91 +134355,164 @@ ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } }, "attachment": true, - "open_weights": true, - "knowledge": "2024-08", - "release_date": "2025-04-05", - "last_updated": "2025-04-05", + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-03-05", + "last_updated": "2026-03-05", "type": "chat" }, { - "id": "meta-llama/llama-guard-4-12b", - "name": "Meta: Llama Guard 4 12B", - "display_name": "Meta: Llama Guard 4 12B", + "id": "openai/gpt-5.6-sol", + "name": "GPT-5.6 Sol", + "display_name": "GPT-5.6 Sol", "modalities": { "input": [ - "text", - "image" + "image", + "text" ], "output": [ "text" ] }, "limit": { - "context": 163840, - "output": 16384 + "context": 1050000, + "output": 128000 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } }, "attachment": true, - "open_weights": true, - "release_date": "2025-04-29", - "last_updated": "2025-04-29", + "open_weights": false, + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "meta-llama/llama-3.2-3b-instruct", - "name": "Meta: Llama 3.2 3B Instruct", - "display_name": "Meta: Llama 3.2 3B Instruct", + "id": "openai/gpt-5.4-mini", + "name": "GPT-5.4 Mini", + "display_name": "GPT-5.4 Mini", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 117964 + "context": 400000, + "output": 128000 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false }, - "attachment": false, - "open_weights": true, - "knowledge": "2023-12", - "release_date": "2024-09-25", - "last_updated": "2024-09-25", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-03-17", + "last_updated": "2026-03-17", "type": "chat" }, { - "id": "meta-llama/llama-3.1-70b-instruct", - "name": "Llama-3.1-70B-Instruct", - "display_name": "Llama-3.1-70B-Instruct", + "id": "openai/gpt-4o", + "name": "GPT-4o", + "display_name": "GPT-4o", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 131072, + "context": 128000, "output": 16384 }, "temperature": true, @@ -135969,48 +134520,73 @@ "reasoning": { "supported": false }, - "attachment": false, - "open_weights": true, - "knowledge": "2023-12", - "release_date": "2024-07-23", - "last_updated": "2024-07-23", + "attachment": true, + "open_weights": false, + "knowledge": "2023-09", + "release_date": "2024-05-13", + "last_updated": "2024-08-06", "type": "chat" }, { - "id": "meta-llama/llama-4-scout", - "name": "Meta: Llama 4 Scout", - "display_name": "Meta: Llama 4 Scout", + "id": "openai/gpt-5.6-luna", + "name": "GPT-5.6 Luna", + "display_name": "GPT-5.6 Luna", "modalities": { "input": [ - "text", - "image" + "image", + "text" ], "output": [ "text" ] }, "limit": { - "context": 327680, - "output": 16384 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } }, "attachment": true, - "open_weights": true, - "knowledge": "2024-08", - "release_date": "2025-04-05", - "last_updated": "2025-04-05", + "open_weights": false, + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "meta-llama/llama-3.2-1b-instruct", - "name": "Llama 3.2 1B Instruct", - "display_name": "Llama 3.2 1B Instruct", + "id": "openai/gpt-5.6-luna-pro", + "name": "GPT-5.6 Luna Pro", + "display_name": "GPT-5.6 Luna Pro", "modalities": { "input": [ + "image", "text" ], "output": [ @@ -136018,27 +134594,41 @@ ] }, "limit": { - "context": 60000, - "output": 54000 + "context": 1050000, + "output": 128000 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2023-12", - "release_date": "2024-09-25", - "last_updated": "2024-09-25", + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "meta-llama/llama-3.1-8b-instruct", - "name": "Llama-3.1-8B-Instruct", - "display_name": "Llama-3.1-8B-Instruct", + "id": "openai/gpt-4.1", + "name": "GPT-4.1", + "display_name": "GPT-4.1", "modalities": { "input": [ + "image", "text" ], "output": [ @@ -136046,40 +134636,39 @@ ] }, "limit": { - "context": 131072, - "output": 117964 + "context": 1047576, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, - "open_weights": true, - "knowledge": "2023-12", - "release_date": "2024-07-23", - "last_updated": "2024-07-23", + "attachment": true, + "open_weights": false, + "knowledge": "2024-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", "type": "chat" }, { - "id": "elorian/glimpse", - "name": "Elorian: Glimpse", - "display_name": "Elorian: Glimpse", + "id": "openai/gpt-5.6-sol-pro", + "name": "GPT-5.6 Sol Pro", + "display_name": "GPT-5.6 Sol Pro", "modalities": { "input": [ - "text", "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 256000 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -136089,77 +134678,76 @@ "reasoning": { "effort_options": [ "none", - "high" + "low", + "medium", + "high", + "xhigh", + "max" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-10-17", - "last_updated": "2026-10-17", + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "cognitivecomputations/dolphin-mistral-24b-venice-edition", - "name": "Venice: Uncensored", - "display_name": "Venice: Uncensored", + "id": "openai/gpt-5.3-codex", + "name": "GPT-5.3-Codex", + "display_name": "GPT-5.3-Codex", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 400000, + "output": 128000 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-04-30", - "release_date": "2025-07-09", - "last_updated": "2025-07-09", - "type": "chat" - }, - { - "id": "amazon/nova-pro-v1", - "name": "Amazon: Nova Pro 1.0", - "display_name": "Amazon: Nova Pro 1.0", - "modalities": { - "input": [ - "text", - "image" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 300000, - "output": 5120 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } }, "attachment": true, "open_weights": false, - "knowledge": "2024-10-31", - "release_date": "2024-12-05", - "last_updated": "2024-12-05", + "knowledge": "2025-08-31", + "release_date": "2026-02-05", + "last_updated": "2026-02-05", "type": "chat" }, { - "id": "amazon/nova-lite-v1", - "name": "Amazon: Nova Lite 1.0", - "display_name": "Amazon: Nova Lite 1.0", + "id": "openai/gpt-5.1", + "name": "GPT-5.1", + "display_name": "GPT-5.1", "modalities": { "input": [ "text", @@ -136170,70 +134758,61 @@ ] }, "limit": { - "context": 300000, - "output": 5120 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-10-31", - "release_date": "2024-12-05", - "last_updated": "2024-12-05", - "type": "chat" - }, - { - "id": "amazon/nova-premier-v1", - "name": "Amazon: Nova Premier 1.0", - "display_name": "Amazon: Nova Premier 1.0", - "modalities": { - "input": [ - "text", - "image" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 1000000, - "output": 32000 + "supported": true, + "default": false }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } }, "attachment": true, "open_weights": false, - "knowledge": "2024-10", - "release_date": "2025-04-30", - "last_updated": "2025-04-30", + "knowledge": "2024-09-30", + "release_date": "2025-11-13", + "last_updated": "2025-11-13", "type": "chat" }, { - "id": "amazon/nova-2-lite-v1", - "name": "Amazon: Nova 2 Lite", - "display_name": "Amazon: Nova 2 Lite", + "id": "openai/gpt-6-luna", + "name": "GPT-6 Luna", + "display_name": "GPT-6 Luna", "modalities": { "input": [ - "text", "image", - "video", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 65535 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -136243,64 +134822,39 @@ "reasoning": { "effort_options": [ "none", - "high" + "low", + "medium", + "high", + "xhigh", + "max" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-10", - "release_date": "2025-12-02", - "last_updated": "2025-12-02", - "type": "chat" - }, - { - "id": "amazon/nova-micro-v1", - "name": "Amazon: Nova Micro 1.0", - "display_name": "Amazon: Nova Micro 1.0", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 128000, - "output": 5120 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": false, - "knowledge": "2024-10-31", - "release_date": "2024-12-05", - "last_updated": "2024-12-05", + "knowledge": "2026-05-18", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "thinkingmachines/inkling-small", - "name": "Inkling Small", - "display_name": "Inkling Small", + "id": "openai/gpt-5-mini", + "name": "GPT-5 Mini", + "display_name": "GPT-5 Mini", "modalities": { "input": [ "text", - "image", - "audio" + "image" ], "output": [ "text" ] }, "limit": { - "context": 524288, - "output": 262144 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -136308,41 +134862,50 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ - "none", "minimal", "low", "medium", - "high", - "max" - ] + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, - "open_weights": true, - "release_date": "2026-07-30", - "last_updated": "2026-07-30", + "open_weights": false, + "knowledge": "2024-05-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "thinkingmachines/inkling", - "name": "Inkling", - "display_name": "Inkling", + "id": "openai/gpt-6-sol", + "name": "GPT-6 Sol", + "display_name": "GPT-6 Sol", "modalities": { "input": [ - "text", "image", - "audio" + "text" ], "output": [ "text" ] }, "limit": { - "context": 524288, - "output": 471859 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -136352,52 +134915,25 @@ "reasoning": { "effort_options": [ "none", - "minimal", "low", "medium", "high", + "xhigh", "max" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-07-15", - "last_updated": "2026-07-15", - "type": "chat" - }, - { - "id": "mancer/weaver", - "name": "Mancer: Weaver (alpha)", - "display_name": "Mancer: Weaver (alpha)", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 8000, - "output": 6000 - }, - "temperature": true, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, "open_weights": false, - "knowledge": "2023-06-30", - "release_date": "2023-08-02", - "last_updated": "2023-08-02", + "knowledge": "2026-04-20", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "rekaai/reka-flash-3", - "name": "Reka Flash 3", - "display_name": "Reka Flash 3", + "id": "openai/gpt-oss-120b", + "name": "gpt-oss-120b", + "display_name": "gpt-oss-120b", "modalities": { "input": [ "text" @@ -136407,62 +134943,86 @@ ] }, "limit": { - "context": 65536, - "output": 58982 + "context": 131072, + "output": 65536 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ + "low", + "medium", "high" ] } }, "attachment": false, "open_weights": true, - "knowledge": "2025-01-31", - "release_date": "2025-03-10", - "last_updated": "2025-03-10", + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "rekaai/reka-edge", - "name": "Reka Edge", - "display_name": "Reka Edge", + "id": "openai/gpt-5.4-pro", + "name": "GPT-5.4 Pro", + "display_name": "GPT-5.4 Pro", "modalities": { "input": [ - "image", "text", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 16384, - "output": 14745 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } }, "attachment": true, - "open_weights": true, - "release_date": "2026-03-11", - "last_updated": "2026-03-11", + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-03-05", + "last_updated": "2026-03-05", "type": "chat" }, { - "id": "perplexity/sonar-reasoning-pro", - "name": "Perplexity: Sonar Reasoning Pro", - "display_name": "Perplexity: Sonar Reasoning Pro", + "id": "openai/gpt-5", + "name": "GPT-5", + "display_name": "GPT-5", "modalities": { "input": [ "text", @@ -136473,34 +135033,50 @@ ] }, "limit": { - "context": 128000, - "output": 115200 + "context": 400000, + "output": 128000 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ + "minimal", + "low", + "medium", "high" - ] + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "release_date": "2025-03-07", - "last_updated": "2025-03-07", + "knowledge": "2024-09-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "perplexity/sonar-deep-research", - "name": "Perplexity: Sonar Deep Research", - "display_name": "Perplexity: Sonar Deep Research", + "id": "openai/gpt-6.1-sol", + "name": "GPT-6.1 Sol", + "display_name": "GPT-6.1 Sol", "modalities": { "input": [ + "image", "text" ], "output": [ @@ -136508,11 +135084,11 @@ ] }, "limit": { - "context": 128000, - "output": 115200 + "context": 1050000, + "output": 128000 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { "supported": true, "default": true @@ -136520,76 +135096,25 @@ "extra_capabilities": { "reasoning": { "effort_options": [ - "high" + "low", + "medium", + "high", + "xhigh", + "max" ] } }, - "attachment": false, - "open_weights": false, - "release_date": "2025-03-07", - "last_updated": "2025-03-07", - "type": "chat" - }, - { - "id": "perplexity/sonar-pro", - "name": "Perplexity: Sonar Pro", - "display_name": "Perplexity: Sonar Pro", - "modalities": { - "input": [ - "text", - "image" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 200000, - "output": 8000 - }, - "temperature": true, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": false, - "release_date": "2025-03-07", - "last_updated": "2025-03-07", - "type": "chat" - }, - { - "id": "perplexity/sonar", - "name": "Perplexity: Sonar", - "display_name": "Perplexity: Sonar", - "modalities": { - "input": [ - "text", - "image" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 127072, - "output": 114364 - }, - "temperature": true, - "tool_call": false, - "reasoning": { - "supported": false - }, "attachment": true, "open_weights": false, - "release_date": "2025-01-27", - "last_updated": "2025-01-27", + "knowledge": "2026-04-30", + "release_date": "2026-09-29", + "last_updated": "2026-09-29", "type": "chat" }, { - "id": "perplexity/sonar-pro-search", - "name": "Perplexity: Sonar Pro Search", - "display_name": "Perplexity: Sonar Pro Search", + "id": "openai/gpt-5.2", + "name": "GPT-5.2", + "display_name": "GPT-5.2", "modalities": { "input": [ "text", @@ -136600,59 +135125,48 @@ ] }, "limit": { - "context": 200000, - "output": 8000 + "context": 400000, + "output": 128000 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", "high" - ] + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "release_date": "2025-10-30", - "last_updated": "2025-10-30", - "type": "chat" - }, - { - "id": "microsoft/phi-4", - "name": "Microsoft: Phi 4", - "display_name": "Microsoft: Phi 4", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 16384, - "output": 14745 - }, - "temperature": true, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": false, - "release_date": "2025-01-10", - "last_updated": "2025-01-10", + "knowledge": "2025-08-31", + "release_date": "2025-12-11", + "last_updated": "2025-12-11", "type": "chat" }, { - "id": "kilo-auto/small", - "name": "Auto Small", - "display_name": "Auto Small", + "id": "openai/gpt-5.4-nano", + "name": "GPT-5.4 Nano", + "display_name": "GPT-5.4 Nano", "modalities": { "input": [ "text", @@ -136663,57 +135177,102 @@ ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } }, "attachment": true, "open_weights": false, - "release_date": "1970-01-01", - "last_updated": "1970-01-01", + "knowledge": "2025-08-31", + "release_date": "2026-03-17", + "last_updated": "2026-03-17", "type": "chat" }, { - "id": "kilo-auto/frontier", - "name": "Auto Frontier", - "display_name": "Auto Frontier", + "id": "openai/gpt-5.5", + "name": "GPT-5.5", + "display_name": "GPT-5.5", "modalities": { "input": [ - "text", "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, + "context": 1050000, "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, "attachment": true, "open_weights": false, - "release_date": "1970-01-01", - "last_updated": "1970-01-01", + "knowledge": "2025-12-01", + "release_date": "2026-04-23", + "last_updated": "2026-04-23", "type": "chat" }, { - "id": "kilo-auto/free", - "name": "Auto Free", - "display_name": "Auto Free", + "id": "openai/gpt-4.1-mini", + "name": "GPT-4.1 Mini", + "display_name": "GPT-4.1 Mini", "modalities": { "input": [ + "image", "text" ], "output": [ @@ -136721,25 +135280,25 @@ ] }, "limit": { - "context": 256000, + "context": 1047576, "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "1970-01-01", - "last_updated": "1970-01-01", + "knowledge": "2024-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", "type": "chat" }, { - "id": "kilo-auto/balanced", - "name": "Auto Balanced", - "display_name": "Auto Balanced", + "id": "openai/gpt-4o-mini", + "name": "GPT-4o-mini", + "display_name": "GPT-4o-mini", "modalities": { "input": [ "text", @@ -136750,69 +135309,81 @@ ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 128000, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": true, "open_weights": false, - "release_date": "1970-01-01", - "last_updated": "1970-01-01", + "knowledge": "2023-09", + "release_date": "2024-07-18", + "last_updated": "2024-07-18", "type": "chat" }, { - "id": "kilo-auto/efficient", - "name": "Auto Efficient", - "display_name": "Auto Efficient", + "id": "openai/gpt-6-astra", + "name": "GPT-6 Astra", + "display_name": "GPT-6 Astra", "modalities": { "input": [ - "text", - "image" + "image", + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + }, "attachment": true, "open_weights": false, - "release_date": "1970-01-01", - "last_updated": "1970-01-01", + "knowledge": "2026-04-30", + "release_date": "2026-09-04", + "last_updated": "2026-09-04", "type": "chat" }, { - "id": "bytedance-seed/seed-2.0-code", - "name": "Seed 2.0 Code", - "display_name": "Seed 2.0 Code", + "id": "openai/gpt-5.6-terra-pro", + "name": "GPT-5.6 Terra Pro", + "display_name": "GPT-5.6 Terra Pro", "modalities": { "input": [ - "text", "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 131072 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -136824,35 +135395,37 @@ "none", "low", "medium", - "high" + "high", + "xhigh", + "max" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-02-14", - "last_updated": "2026-02-14", + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "bytedance-seed/seed-2.0-mini", - "name": "Seed 2.0 Mini", - "display_name": "Seed 2.0 Mini", + "id": "openai/gpt-5-nano", + "name": "GPT-5 Nano", + "display_name": "GPT-5 Nano", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 131072 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -136860,38 +135433,47 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ - "none", "minimal", "low", "medium", "high" - ] + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "release_date": "2026-02-14", - "last_updated": "2026-02-14", + "knowledge": "2024-05-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "bytedance-seed/seed-1.6-flash", - "name": "ByteDance Seed: Seed 1.6 Flash (retires Nov 11)", - "display_name": "ByteDance Seed: Seed 1.6 Flash (retires Nov 11)", + "id": "z-ai/glm-5.2", + "name": "GLM 5.2", + "display_name": "GLM 5.2", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 1048576, + "output": 943718 }, "temperature": true, "tool_call": true, @@ -136901,34 +135483,34 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ "none", - "high" + "high", + "xhigh" ] } }, - "attachment": true, - "open_weights": false, - "release_date": "2025-08-28", - "last_updated": "2025-08-28", + "attachment": false, + "open_weights": true, + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "bytedance-seed/seed-2.0-lite", - "name": "Seed 2.0 Lite", - "display_name": "Seed 2.0 Lite", + "id": "z-ai/glm-5.3", + "name": "GLM 5.3", + "display_name": "GLM 5.3", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, + "context": 1048576, "output": 131072 }, "temperature": true, @@ -136939,25 +135521,24 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ - "none", - "minimal", "low", - "medium", - "high" + "high", + "max" ] } }, - "attachment": true, - "open_weights": false, - "release_date": "2026-02-14", - "last_updated": "2026-02-14", + "attachment": false, + "open_weights": true, + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "bytedance-seed/seed-1.6", - "name": "ByteDance Seed: Seed 1.6 (retires Nov 11)", - "display_name": "ByteDance Seed: Seed 1.6 (retires Nov 11)", + "id": "z-ai/glm-5.3-flash", + "name": "GLM 5.3 Flash", + "display_name": "GLM 5.3 Flash", "modalities": { "input": [ "text", @@ -136969,8 +135550,8 @@ ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 1048576, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -136980,35 +135561,38 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ - "none", - "high" + "low", + "high", + "max" ] } }, "attachment": true, - "open_weights": false, - "release_date": "2025-10-15", - "last_updated": "2025-10-15", + "open_weights": true, + "release_date": "2026-08-26", + "last_updated": "2026-08-26", "type": "chat" }, { - "id": "bytedance-seed/seed-2-1-turbo", - "name": "ByteDance Seed: Seed 2.1 Turbo", - "display_name": "ByteDance Seed: Seed 2.1 Turbo", + "id": "meta/muse-spark-open", + "name": "Muse Spark Open", + "display_name": "Muse Spark Open", "modalities": { "input": [ "text", "image", - "video" + "video", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 235929 + "context": 1048576, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -137019,62 +135603,38 @@ "extra_capabilities": { "reasoning": { "effort_options": [ - "none", - "high" + "low", + "medium", + "high", + "xhigh" ] } }, "attachment": true, - "open_weights": false, - "release_date": "2026-06-23", - "last_updated": "2026-06-23", - "type": "chat" - }, - { - "id": "bytedance/ui-tars-1.5-7b", - "name": "ByteDance: UI-TARS 7B ", - "display_name": "ByteDance: UI-TARS 7B ", - "modalities": { - "input": [ - "image", - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 128000, - "output": 2048 - }, - "temperature": true, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": false, - "release_date": "2025-07-22", - "last_updated": "2025-07-22", + "open_weights": true, + "knowledge": "2026-01-04", + "release_date": "2026-10-15", + "last_updated": "2026-10-15", "type": "chat" }, { - "id": "stealth/glyph-cluster", - "name": "Stealth: Glyph Cluster (free)", - "display_name": "Stealth: Glyph Cluster (free)", + "id": "anthropic/claude-opus-5.5", + "name": "Claude Opus 5.5", + "display_name": "Claude Opus 5.5", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 256000 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -137086,25 +135646,26 @@ "low", "medium", "high", - "xhigh" + "xhigh", + "max" ] } }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2025-08-26", - "last_updated": "2025-08-26", + "knowledge": "2026-06", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "stealth/claude-opus-4.7", - "name": "Stealth: Claude Opus 4.7 (20% off)", - "display_name": "Stealth: Claude Opus 4.7 (20% off)", + "id": "anthropic/claude-fable-5", + "name": "Claude Fable 5", + "display_name": "Claude Fable 5", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" @@ -137114,16 +135675,16 @@ "context": 1000000, "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, + "default_enabled": true, "mode": "effort", "effort": "high", "effort_options": [ @@ -137140,27 +135701,27 @@ "thinking_blocks" ], "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." + "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", + "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", + "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." ] } }, "attachment": true, "open_weights": false, - "release_date": "2025-08-26", - "last_updated": "2025-08-26", + "knowledge": "2026-01-31", + "release_date": "2026-06-09", + "last_updated": "2026-06-09", "type": "chat" }, { - "id": "stealth/claude-opus-4.6", - "name": "Stealth: Claude Opus 4.6 (20% off)", - "display_name": "Stealth: Claude Opus 4.6 (20% off)", + "id": "anthropic/claude-opus-4.6", + "name": "Claude Opus 4.6", + "display_name": "Claude Opus 4.6", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" @@ -137206,14 +135767,15 @@ }, "attachment": true, "open_weights": false, - "release_date": "2025-08-26", - "last_updated": "2025-08-26", + "knowledge": "2025-05-31", + "release_date": "2026-02-05", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "stealth/qwen3.6-plus", - "name": "Stealth: Qwen3.6 Plus (50% off)", - "display_name": "Stealth: Qwen3.6 Plus (50% off)", + "id": "anthropic/claude-opus-4.8", + "name": "Claude Opus 4.8", + "display_name": "Claude Opus 4.8", "modalities": { "input": [ "text", @@ -137225,47 +135787,55 @@ }, "limit": { "context": 1000000, - "output": 65536 + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], "interleaved": true, "summaries": true, - "visibility": "summary", + "visibility": "omitted", "continuation": [ "thinking_blocks" ], - "effort_options": [ - "minimal", - "low", - "medium", - "high", - "xhigh" + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, "attachment": true, "open_weights": false, - "release_date": "2025-08-26", - "last_updated": "2025-08-26", + "knowledge": "2026-01", + "release_date": "2026-05-28", + "last_updated": "2026-05-28", "type": "chat" }, { - "id": "stealth/claude-opus-4.8", - "name": "Stealth: Claude Opus 4.8 (20% off)", - "display_name": "Stealth: Claude Opus 4.8 (20% off)", + "id": "anthropic/claude-opus-4.7", + "name": "Claude Opus 4.7", + "display_name": "Claude Opus 4.7", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" @@ -137275,7 +135845,7 @@ "context": 1000000, "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -137309,19 +135879,19 @@ }, "attachment": true, "open_weights": false, - "release_date": "2025-08-26", - "last_updated": "2025-08-26", + "knowledge": "2026-01-31", + "release_date": "2026-04-16", + "last_updated": "2026-04-16", "type": "chat" }, { - "id": "stealth/claude-sonnet-4.6", - "name": "Stealth: Claude Sonnet 4.6 (20% off)", - "display_name": "Stealth: Claude Sonnet 4.6 (20% off)", + "id": "anthropic/claude-sonnet-4.6", + "name": "Claude Sonnet 4.6", + "display_name": "Claude Sonnet 4.6", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" @@ -137329,7 +135899,7 @@ }, "limit": { "context": 1000000, - "output": 64000 + "output": 128000 }, "temperature": true, "tool_call": true, @@ -137367,17 +135937,19 @@ }, "attachment": true, "open_weights": false, - "release_date": "2025-08-26", - "last_updated": "2025-08-26", + "knowledge": "2025-08-31", + "release_date": "2026-02-17", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "inception/mercury-3", - "name": "Inception: Mercury 3", - "display_name": "Inception: Mercury 3", + "id": "anthropic/claude-opus-5", + "name": "Claude Opus 5", + "display_name": "Claude Opus 5", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" @@ -137385,9 +135957,9 @@ }, "limit": { "context": 1000000, - "output": 131072 + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -137395,37 +135967,42 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ "none", "low", "medium", - "high" + "high", + "xhigh", + "max" ] } }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-10-16", - "last_updated": "2026-10-16", + "knowledge": "2026-05", + "release_date": "2026-07-24", + "last_updated": "2026-07-24", "type": "chat" }, { - "id": "inception/mercury-2", - "name": "Inception: Mercury 2", - "display_name": "Inception: Mercury 2", + "id": "anthropic/claude-sonnet-5", + "name": "Claude Sonnet 5", + "display_name": "Claude Sonnet 5", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 50000 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -137433,37 +136010,42 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ "none", "low", "medium", - "high" + "high", + "xhigh", + "max" ] } }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-02-24", - "last_updated": "2026-02-24", + "knowledge": "2026-01-31", + "release_date": "2026-06-30", + "last_updated": "2026-06-30", "type": "chat" }, { - "id": "inception/mercury-2.5", - "name": "Inception: Mercury 2.5", - "display_name": "Inception: Mercury 2.5", + "id": "anthropic/claude-sonnet-5.5", + "name": "Claude Sonnet 5.5", + "display_name": "Claude Sonnet 5.5", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 260000, - "output": 65536 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -137472,39 +136054,39 @@ "extra_capabilities": { "reasoning": { "effort_options": [ - "none", "low", "medium", - "high" + "high", + "xhigh", + "max" ] } }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-09-08", - "last_updated": "2026-09-08", + "knowledge": "2026-06", + "release_date": "2026-09-28", + "last_updated": "2026-09-28", "type": "chat" }, { - "id": "xiaomi/mimo-v2.5", - "name": "MiMo-V2.5", - "display_name": "MiMo-V2.5", + "id": "anthropic/claude-fable-5.1", + "name": "Claude Fable 5.1", + "display_name": "Claude Fable 5.1", "modalities": { "input": [ "text", - "image", - "audio", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 945000 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -137513,82 +136095,80 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], "interleaved": true, "summaries": true, - "visibility": "summary", + "visibility": "omitted", "continuation": [ "thinking_blocks" ], - "effort_options": [ - "none", - "high" + "notes": [ + "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", + "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", + "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2024-12", - "release_date": "2026-04-22", - "last_updated": "2026-04-22", + "open_weights": false, + "knowledge": "2026-06", + "release_date": "2026-09-01", + "last_updated": "2026-09-01", "type": "chat" }, { - "id": "xiaomi/mimo-v2.6-pro", - "name": "MiMo-V2.6-Pro", - "display_name": "MiMo-V2.6-Pro", + "id": "mistralai/mixtral-8x22b-instruct", + "name": "Mixtral 8x22B Instruct", + "display_name": "Mixtral 8x22B Instruct", "modalities": { "input": [ - "text", - "image", - "audio", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 65536, + "output": 52428 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "high" - ] - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "knowledge": "2024-01-31", + "release_date": "2024-04-17", + "last_updated": "2024-04-17", "type": "chat" }, { - "id": "xiaomi/mimo-v2.6-pro-ultraspeed", - "name": "MiMo-V2.6-Pro-UltraSpeed", - "display_name": "MiMo-V2.6-Pro-UltraSpeed", + "id": "mistralai/mistral-small-2603", + "name": "Mistral Small 4", + "display_name": "Mistral Small 4", "modalities": { "input": [ "text", - "image", - "audio", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 262144, + "output": 209715 }, "temperature": true, "tool_call": true, @@ -137606,111 +136186,77 @@ }, "attachment": true, "open_weights": true, - "release_date": "2026-09-21", - "last_updated": "2026-09-21", + "knowledge": "2025-06", + "release_date": "2026-03-16", + "last_updated": "2026-03-16", "type": "chat" }, { - "id": "xiaomi/mimo-v2.5-pro", - "name": "MiMo-V2.5-Pro", - "display_name": "MiMo-V2.5-Pro", + "id": "mistralai/mistral-large-2512", + "name": "Mistral Large 3 2512", + "display_name": "Mistral Large 3 2512", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 945000 + "context": 262144, + "output": 209715 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "none", - "high" - ] - } + "supported": false }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2024-12", - "release_date": "2026-04-22", - "last_updated": "2026-04-22", + "knowledge": "2024-11", + "release_date": "2025-12-02", + "last_updated": "2025-12-02", "type": "chat" }, { - "id": "xiaomi/mimo-v2.6-flash", - "name": "MiMo-V2.6-Flash", - "display_name": "MiMo-V2.6-Flash", + "id": "mistralai/mistral-nemo", + "name": "Mistral Nemo", + "display_name": "Mistral Nemo", "modalities": { "input": [ - "text", - "image", - "audio", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 131072, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "high" - ] - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "knowledge": "2024-07", + "release_date": "2024-07-18", + "last_updated": "2024-07-18", "type": "chat" - } - ] - }, - "claudinio": { - "id": "claudinio", - "name": "Claudinio", - "display_name": "Claudinio", - "api": "https://api.claudin.io/v1", - "doc": "https://claudin.io", - "models": [ + }, { - "id": "claudinio", - "name": "Claudinio", - "display_name": "Claudinio", + "id": "google/gemini-3.1-pro-preview", + "name": "Gemini 3.1 Pro Preview", + "display_name": "Gemini 3.1 Pro Preview", "modalities": { "input": [ - "text", - "image", "audio", + "image", + "text", "video" ], "output": [ @@ -137718,25 +136264,43 @@ ] }, "limit": { - "context": 256000, - "output": 64000 + "context": 1048576, + "output": 65536 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "low", + "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] + } + }, "attachment": true, "open_weights": false, - "knowledge": "2026-05", - "release_date": "2026-05-12", - "last_updated": "2026-06-02", + "knowledge": "2025-01", + "release_date": "2026-02-19", + "last_updated": "2026-02-19", "type": "chat" }, { - "id": "claudius", - "name": "Claudius", - "display_name": "Claudius", + "id": "google/gemini-3-flash-preview", + "name": "Gemini 3 Flash Preview", + "display_name": "Gemini 3 Flash Preview", "modalities": { "input": [ "text", @@ -137749,47 +136313,61 @@ ] }, "limit": { - "context": 256000, - "output": 64000 + "context": 1048576, + "output": 65536 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", + "low", + "medium", + "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] + } + }, "attachment": true, "open_weights": false, - "knowledge": "2026-05", - "release_date": "2026-05-12", - "last_updated": "2026-05-12", + "knowledge": "2025-01", + "release_date": "2025-12-17", + "last_updated": "2025-12-17", "type": "chat" - } - ] - }, - "venice": { - "id": "venice", - "name": "Venice AI", - "display_name": "Venice AI", - "doc": "https://docs.venice.ai", - "models": [ + }, { - "id": "claude-haiku-5-5", - "name": "Claude Haiku 5.5", - "display_name": "Claude Haiku 5.5", + "id": "google/gemini-4-argon", + "name": "Gemini 4 Argon", + "display_name": "Gemini 4 Argon", "modalities": { "input": [ + "audio", + "image", "text", - "image" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 1048576, + "output": 943718 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -137798,38 +136376,37 @@ "extra_capabilities": { "reasoning": { "effort_options": [ - "none", "low", "medium", - "high", - "xhigh", - "max" + "high" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-10-07", - "last_updated": "2026-10-07", + "knowledge": "2026-03", + "release_date": "2026-10-13", + "last_updated": "2026-10-13", "type": "chat" }, { - "id": "deepseek-v4-1-flash", - "name": "DeepSeek V4.1 Flash", - "display_name": "DeepSeek V4.1 Flash", + "id": "google/gemini-3.7-flash", + "name": "Gemini 3.7 Flash", + "display_name": "Gemini 3.7 Flash", "modalities": { "input": [ "text", - "image" + "image", + "video", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -137839,36 +136416,48 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "none", + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", "low", - "high", - "max" + "medium", + "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-09-10", - "last_updated": "2026-09-10", + "open_weights": false, + "knowledge": "2026-03", + "release_date": "2026-08-13", + "last_updated": "2026-08-13", "type": "chat" }, { - "id": "minimax-m27", - "name": "MiniMax M2.7", - "display_name": "MiniMax M2.7", + "id": "google/gemini-3.5-flash", + "name": "Gemini 3.5 Flash", + "display_name": "Gemini 3.5 Flash", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 198000, - "output": 32768 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -137878,38 +136467,50 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "none", + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", "low", "medium", "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-03-18", - "last_updated": "2026-03-18", + "attachment": true, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2026-05-19", + "last_updated": "2026-05-19", "type": "chat" }, { - "id": "openai-gpt-54-pro", - "name": "GPT-5.4 Pro", - "display_name": "GPT-5.4 Pro", + "id": "google/gemini-3.8-flash", + "name": "Gemini 3.8 Flash", + "display_name": "Gemini 3.8 Flash", "modalities": { "input": [ "text", - "image" + "image", + "video", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 1048576, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -137917,109 +136518,113 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "none", + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", + "low", "medium", - "high", - "xhigh" + "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-05", - "last_updated": "2026-03-05", + "release_date": "2026-09-02", + "last_updated": "2026-09-02", "type": "chat" }, { - "id": "qwen3-next-80b", - "name": "Qwen 3 Next 80b", - "display_name": "Qwen 3 Next 80b", + "id": "google/gemma-3-27b-it", + "name": "Gemma 3 27B", + "display_name": "Gemma 3 27B", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 16384 + "context": 131072, + "output": 117964 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-09", - "last_updated": "2025-09", + "knowledge": "2024-08", + "release_date": "2025-03-12", + "last_updated": "2025-03-12", "type": "chat" }, { - "id": "claude-opus-4-7", - "name": "Claude Opus 4.7", - "display_name": "Claude Opus 4.7", + "id": "google/gemini-3.6-flash", + "name": "Gemini 3.6 Flash", + "display_name": "Gemini 3.6 Flash", "modalities": { "input": [ "text", - "image" + "image", + "video", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 1048576, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "high", - "effort_options": [ + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", "low", "medium", - "high", - "xhigh", - "max" + "high" ], - "interleaved": true, "summaries": true, - "visibility": "omitted", + "visibility": "summary", "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." + "thought_signatures" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-04-16", - "last_updated": "2026-04-16", + "knowledge": "2026-03", + "release_date": "2026-07-21", + "last_updated": "2026-07-21", "type": "chat" }, { - "id": "aion-labs-aion-3-0", - "name": "Aion 3.0", - "display_name": "Aion 3.0", + "id": "qwen/qwen3-coder-next", + "name": "Qwen3 Coder Next", + "display_name": "Qwen3 Coder Next", "modalities": { "input": [ "text" @@ -138029,25 +136634,52 @@ ] }, "limit": { - "context": 128000, - "output": 32768 + "context": 262144, + "output": 235929 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2026-05-05", - "last_updated": "2026-05-05", + "open_weights": true, + "knowledge": "2025-09", + "release_date": "2026-02-03", + "last_updated": "2026-02-03", "type": "chat" }, { - "id": "claude-sonnet-4-5", - "name": "Claude Sonnet 4.5", - "display_name": "Claude Sonnet 4.5", + "id": "qwen/qwen3-30b-a3b-instruct-2507", + "name": "Qwen3 30B A3B Instruct 2507", + "display_name": "Qwen3 30B A3B Instruct 2507", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 262144, + "output": 235929 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "release_date": "2025-07-28", + "last_updated": "2025-07-28", + "type": "chat" + }, + { + "id": "qwen/qwen3-vl-30b-a3b-instruct", + "name": "Qwen3 VL 30B A3B Instruct", + "display_name": "Qwen3 VL 30B A3B Instruct", "modalities": { "input": [ "text", @@ -138058,50 +136690,29 @@ ] }, "limit": { - "context": 198000, - "output": 64000 + "context": 262144, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." - ] - } + "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2025-07-31", - "release_date": "2025-09-29", - "last_updated": "2025-09-29", + "open_weights": true, + "release_date": "2025-10-04", + "last_updated": "2025-10-04", "type": "chat" }, { - "id": "mercury-3", - "name": "Mercury 3", - "display_name": "Mercury 3", + "id": "qwen/qwen3.8-27b", + "name": "Qwen3.8 27B", + "display_name": "Qwen3.8 27B", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" @@ -138109,7 +136720,7 @@ }, "limit": { "context": 1000000, - "output": 131072 + "output": 235929 }, "temperature": true, "tool_call": true, @@ -138123,20 +136734,20 @@ "none", "low", "medium", - "high" + "xhigh" ] } }, - "attachment": false, - "open_weights": false, - "release_date": "2026-10-16", - "last_updated": "2026-10-20", + "attachment": true, + "open_weights": true, + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "openai-gpt-56-sol-pro", - "name": "GPT-5.6 Sol Pro", - "display_name": "GPT-5.6 Sol Pro", + "id": "qwen/qwen3-vl-235b-a22b-instruct", + "name": "Qwen3 VL 235B A22B Instruct", + "display_name": "Qwen3 VL 235B A22B Instruct", "modalities": { "input": [ "text", @@ -138147,49 +136758,37 @@ ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 262144, + "output": 32768 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ] - } + "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "open_weights": true, + "knowledge": "2025-03-31", + "release_date": "2025-09-23", + "last_updated": "2025-09-23", "type": "chat" }, { - "id": "deepseek-v4-flash", - "name": "DeepSeek V4 Flash 0423", - "display_name": "DeepSeek V4 Flash 0423", + "id": "x-ai/grok-4.6", + "name": "Grok 4.6", + "display_name": "Grok 4.6", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 32768 + "context": 500000, + "output": 450000 }, "temperature": true, "tool_call": true, @@ -138200,47 +136799,37 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", "effort_options": [ "low", + "medium", "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." + "xhigh" ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "attachment": true, + "open_weights": false, + "knowledge": "2026-02-01", + "release_date": "2026-08-12", + "last_updated": "2026-08-12", "type": "chat" }, { - "id": "openai-gpt-oss-120b", - "name": "OpenAI GPT OSS 120B", - "display_name": "OpenAI GPT OSS 120B", + "id": "x-ai/grok-4.7", + "name": "Grok 4.7", + "display_name": "Grok 4.7", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 500000, + "output": 450000 }, "temperature": true, "tool_call": true, @@ -138251,83 +136840,90 @@ "extra_capabilities": { "reasoning": { "effort_options": [ - "none", "low", "medium", - "high" + "high", + "xhigh" ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "attachment": true, + "open_weights": false, + "knowledge": "2026-05", + "release_date": "2026-09-21", + "last_updated": "2026-09-21", "type": "chat" - }, + } + ] + }, + "siliconflow": { + "id": "siliconflow", + "name": "SiliconFlow", + "display_name": "SiliconFlow", + "api": "https://api.siliconflow.cn/v1", + "doc": "https://cloud.siliconflow.com/models", + "models": [ { - "id": "gemma-4-uncensored", - "name": "Gemma 4 Uncensored", - "display_name": "Gemma 4 Uncensored", + "id": "stepfun-ai/Step-3.5-Flash", + "name": "stepfun-ai/Step-3.5-Flash", + "display_name": "stepfun-ai/Step-3.5-Flash", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 8192 + "context": 262000, + "output": 256000 }, + "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-04-13", - "last_updated": "2026-06-11", + "knowledge": "2025-01", + "release_date": "2026-01-29", + "last_updated": "2026-02-13", "type": "chat" }, { - "id": "gemini-3-6-flash", - "name": "Gemini 3.6 Flash", - "display_name": "Gemini 3.6 Flash", + "id": "PaddlePaddle/PaddleOCR-VL-1.5", + "name": "PaddlePaddle/PaddleOCR-VL-1.5", + "display_name": "PaddlePaddle/PaddleOCR-VL-1.5", "modalities": { "input": [ "text", - "image", - "audio", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 16384, + "output": 6226 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-07-21", - "last_updated": "2026-07-21", + "open_weights": true, + "release_date": "2026-01-29", + "last_updated": "2026-01-29", "type": "chat" }, { - "id": "openai-gpt-6-sol", - "name": "GPT-6 Sol", - "display_name": "GPT-6 Sol", + "id": "Pro/moonshotai/Kimi-K2.6", + "name": "Pro/moonshotai/Kimi-K2.6", + "display_name": "Pro/moonshotai/Kimi-K2.6", "modalities": { "input": [ "text", @@ -138338,10 +136934,10 @@ ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 262000, + "output": 99560 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -138349,69 +136945,38 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-04-20", - "release_date": "2026-09-22", - "last_updated": "2026-09-22", - "type": "chat" - }, - { - "id": "nvidia-nemotron-3-nano-30b-a3b", - "name": "NVIDIA Nemotron 3 Nano 30B", - "display_name": "NVIDIA Nemotron 3 Nano 30B", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 128000, - "output": 16384 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": false, "open_weights": true, - "knowledge": "2025-06-25", - "release_date": "2025-12-15", - "last_updated": "2025-12-15", + "knowledge": "2025-01", + "release_date": "2026-04-20", + "last_updated": "2026-04-20", "type": "chat" }, { - "id": "gemini-3-5-flash", - "name": "Gemini 3.5 Flash", - "display_name": "Gemini 3.5 Flash", + "id": "Pro/moonshotai/Kimi-K2.5", + "name": "Pro/moonshotai/Kimi-K2.5", + "display_name": "Pro/moonshotai/Kimi-K2.5", "modalities": { "input": [ "text", - "image", - "audio", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 262000, + "output": 99560 }, "temperature": true, "tool_call": true, @@ -138421,24 +136986,26 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "low", - "medium", - "high" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, "attachment": true, - "open_weights": false, + "open_weights": true, "knowledge": "2025-01", - "release_date": "2026-05-19", - "last_updated": "2026-05-19", + "release_date": "2026-01-27", + "last_updated": "2026-01-27", "type": "chat" }, { - "id": "hy4-preview", - "name": "Hy4 Preview", - "display_name": "Hy4 Preview", + "id": "Pro/zai-org/GLM-5", + "name": "Pro/zai-org/GLM-5", + "display_name": "Pro/zai-org/GLM-5", "modalities": { "input": [ "text" @@ -138448,8 +137015,8 @@ ] }, "limit": { - "context": 1048576, - "output": 64000 + "context": 205000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -138460,23 +137027,24 @@ "extra_capabilities": { "reasoning": { "supported": true, - "effort_options": [ - "none", - "low", - "high" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, "attachment": false, "open_weights": true, - "release_date": "2026-08-28", - "last_updated": "2026-08-28", + "release_date": "2026-02-12", + "last_updated": "2026-02-12", "type": "chat" }, { - "id": "zai-org-glm-4.6", - "name": "GLM 4.6", - "display_name": "GLM 4.6", + "id": "Pro/zai-org/GLM-5.1", + "name": "Pro/zai-org/GLM-5.1", + "display_name": "Pro/zai-org/GLM-5.1", "modalities": { "input": [ "text" @@ -138486,8 +137054,8 @@ ] }, "limit": { - "context": 198000, - "output": 16384 + "context": 205000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -138503,70 +137071,30 @@ "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "effort_options": [ - "low", - "medium", - "high" ] } }, "attachment": false, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-09-30", - "last_updated": "2025-09-30", + "release_date": "2026-04-07", + "last_updated": "2026-04-07", "type": "chat" }, { - "id": "gemini-3-7-flash", - "name": "Gemini 3.7 Flash", - "display_name": "Gemini 3.7 Flash", + "id": "Pro/deepseek-ai/DeepSeek-V3.1-Terminus", + "name": "Pro/deepseek-ai/DeepSeek-V3.1-Terminus", + "display_name": "Pro/deepseek-ai/DeepSeek-V3.1-Terminus", "modalities": { "input": [ - "text", - "image", - "audio", - "video" - ], - "output": [ "text" - ] - }, - "limit": { - "context": 1000000, - "output": 65536 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-08-13", - "last_updated": "2026-08-13", - "type": "chat" - }, - { - "id": "qwen-3-6-plus", - "name": "Qwen 3.6 Plus Uncensored", - "display_name": "Qwen 3.6 Plus Uncensored", - "modalities": { - "input": [ - "text", - "image", - "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 164000, + "output": 8192 }, "temperature": true, "tool_call": true, @@ -138574,17 +137102,16 @@ "supported": true, "default": true }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-04", - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "attachment": false, + "open_weights": true, + "release_date": "2025-09-29", + "last_updated": "2025-11-25", "type": "chat" }, { - "id": "zai-org-glm-5-2", - "name": "GLM 5.2", - "display_name": "GLM 5.2", + "id": "Pro/deepseek-ai/DeepSeek-V3.2", + "name": "Pro/deepseek-ai/DeepSeek-V3.2", + "display_name": "Pro/deepseek-ai/DeepSeek-V3.2", "modalities": { "input": [ "text" @@ -138594,8 +137121,8 @@ ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 164000, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -138605,54 +137132,47 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "none", - "high", - "max" - ] + "supported": true } }, "attachment": false, "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "knowledge": "2024-07", + "release_date": "2025-12-01", + "last_updated": "2025-12-01", "type": "chat" }, { - "id": "qwen-3-7-plus", - "name": "Qwen 3.7 Plus", - "display_name": "Qwen 3.7 Plus", + "id": "Pro/deepseek-ai/DeepSeek-V3", + "name": "Pro/deepseek-ai/DeepSeek-V3", + "display_name": "Pro/deepseek-ai/DeepSeek-V3", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 164000, + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-04", - "release_date": "2026-06-02", - "last_updated": "2026-06-02", + "attachment": false, + "open_weights": true, + "release_date": "2025-03-24", + "last_updated": "2025-03-24", "type": "chat" }, { - "id": "zai-org-glm-5-1", - "name": "GLM 5.1", - "display_name": "GLM 5.1", + "id": "Pro/deepseek-ai/DeepSeek-R1", + "name": "Pro/deepseek-ai/DeepSeek-R1", + "display_name": "Pro/deepseek-ai/DeepSeek-R1", "modalities": { "input": [ "text" @@ -138662,8 +137182,8 @@ ] }, "limit": { - "context": 200000, - "output": 80000 + "context": 164000, + "output": 8192 }, "temperature": true, "tool_call": true, @@ -138679,36 +137199,32 @@ "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "effort_options": [ - "none", - "low", - "medium", - "high" ] } }, "attachment": false, "open_weights": true, - "release_date": "2026-04-07", - "last_updated": "2026-04-07", + "release_date": "2025-05-28", + "last_updated": "2025-05-28", "type": "chat" }, { - "id": "zai-org-glm-4.7", - "name": "GLM 4.7", - "display_name": "GLM 4.7", + "id": "Qwen/Qwen3.5-122B-A10B", + "name": "Qwen/Qwen3.5-122B-A10B", + "display_name": "Qwen/Qwen3.5-122B-A10B", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 198000, - "output": 16384 + "context": 262144, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -138724,42 +137240,38 @@ "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "effort_options": [ - "low", - "medium", - "high" ] } }, - "attachment": false, + "attachment": true, "open_weights": true, "knowledge": "2025-04", - "release_date": "2025-12-22", - "last_updated": "2025-12-22", + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" }, { - "id": "qwen3-235b-a22b-thinking-2507", - "name": "Qwen 3 235B A22B Thinking 2507", - "display_name": "Qwen 3 235B A22B Thinking 2507", + "id": "Qwen/Qwen3.6-35B-A3B", + "name": "Qwen/Qwen3.6-35B-A3B", + "display_name": "Qwen/Qwen3.6-35B-A3B", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 262144, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": true }, "extra_capabilities": { "reasoning": { @@ -138769,24 +137281,47 @@ "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "effort_options": [ - "low", - "medium", - "high" ] } }, + "attachment": true, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2026-04-17", + "last_updated": "2026-04-17", + "type": "chat" + }, + { + "id": "Qwen/Qwen2.5-7B-Instruct", + "name": "Qwen/Qwen2.5-7B-Instruct", + "display_name": "Qwen/Qwen2.5-7B-Instruct", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 33000, + "output": 4000 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, "attachment": false, "open_weights": true, - "release_date": "2025-07-25", - "last_updated": "2025-07-25", + "release_date": "2024-09-19", + "last_updated": "2024-09-19", "type": "chat" }, { - "id": "aion-labs-aion-3-0-mini", - "name": "Aion 3.0 Mini", - "display_name": "Aion 3.0 Mini", + "id": "Qwen/Qwen3-14B", + "name": "Qwen/Qwen3-14B", + "display_name": "Qwen/Qwen3-14B", "modalities": { "input": [ "text" @@ -138796,28 +137331,40 @@ ] }, "limit": { - "context": 128000, + "context": 131000, "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, - "open_weights": false, - "release_date": "2026-05-14", - "last_updated": "2026-05-14", + "open_weights": true, + "release_date": "2025-04-30", + "last_updated": "2025-11-25", "type": "chat" }, { - "id": "qwen-3-8-2-4t-a95b", - "name": "Qwen 3.8 2.4T", - "display_name": "Qwen 3.8 2.4T", + "id": "Qwen/Qwen3.5-9B", + "name": "Qwen/Qwen3.5-9B", + "display_name": "Qwen/Qwen3.5-9B", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" @@ -138833,16 +137380,28 @@ "supported": true, "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": true, "open_weights": true, - "release_date": "2026-08-12", - "last_updated": "2026-08-12", + "knowledge": "2025-04", + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" }, { - "id": "z-ai-glm-5-3", - "name": "GLM 5.3", - "display_name": "GLM 5.3", + "id": "Qwen/Qwen3-Coder-30B-A3B-Instruct", + "name": "Qwen/Qwen3-Coder-30B-A3B-Instruct", + "display_name": "Qwen/Qwen3-Coder-30B-A3B-Instruct", "modalities": { "input": [ "text" @@ -138852,80 +137411,68 @@ ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 262000, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", - "type": "chat" + "knowledge": "2025-04", + "release_date": "2025-07-31", + "last_updated": "2025-07-31" }, { - "id": "claude-sonnet-5-5", - "name": "Claude Sonnet 5.5", - "display_name": "Claude Sonnet 5.5", + "id": "Qwen/Qwen3-VL-32B-Instruct", + "name": "Qwen/Qwen3-VL-32B-Instruct", + "display_name": "Qwen/Qwen3-VL-32B-Instruct", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 262000, + "output": 32768 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ] - } + "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-09-28", - "last_updated": "2026-09-28", + "open_weights": true, + "release_date": "2025-10-21", + "last_updated": "2025-11-25", "type": "chat" }, { - "id": "openai-gpt-61-sol", - "name": "GPT-6.1 Sol", - "display_name": "GPT-6.1 Sol", + "id": "Qwen/Qwen3-VL-30B-A3B-Thinking", + "name": "Qwen/Qwen3-VL-30B-A3B-Thinking", + "display_name": "Qwen/Qwen3-VL-30B-A3B-Thinking", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 262000, + "output": 32768 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -138933,31 +137480,29 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-04-30", - "release_date": "2026-09-29", - "last_updated": "2026-09-29", + "open_weights": true, + "release_date": "2025-10-11", + "last_updated": "2025-11-25", "type": "chat" }, { - "id": "gemini-4-argon", - "name": "Gemini 4 Argon", - "display_name": "Gemini 4 Argon", + "id": "Qwen/Qwen3-VL-8B-Instruct", + "name": "Qwen/Qwen3-VL-8B-Instruct", + "display_name": "Qwen/Qwen3-VL-8B-Instruct", "modalities": { "input": [ "text", "image", - "audio", "video" ], "output": [ @@ -138965,26 +137510,24 @@ ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 262000, + "output": 32768 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-10-13", - "last_updated": "2026-10-13", + "open_weights": true, + "release_date": "2025-10-15", + "last_updated": "2025-11-25", "type": "chat" }, { - "id": "deepseek-v4-pro", - "name": "DeepSeek V4 Pro", - "display_name": "DeepSeek V4 Pro", + "id": "Qwen/Qwen3-32B", + "name": "Qwen/Qwen3-32B", + "display_name": "Qwen/Qwen3-32B", "modalities": { "input": [ "text" @@ -138994,62 +137537,51 @@ ] }, "limit": { - "context": 1000000, + "context": 131000, "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "high", - "max" - ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, "attachment": false, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "knowledge": "2025-04", + "release_date": "2025-04-28", + "last_updated": "2025-04-28", "type": "chat" }, { - "id": "claude-fable-5-1", - "name": "Claude Fable 5.1", - "display_name": "Claude Fable 5.1", + "id": "Qwen/Qwen3-VL-32B-Thinking", + "name": "Qwen/Qwen3-VL-32B-Thinking", + "display_name": "Qwen/Qwen3-VL-32B-Thinking", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 262000, + "output": 32768 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -139058,40 +137590,51 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], "interleaved": true, "summaries": true, - "visibility": "omitted", + "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", - "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", - "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-09-01", - "last_updated": "2026-09-01", + "open_weights": true, + "release_date": "2025-10-21", + "last_updated": "2025-11-25", "type": "chat" }, { - "id": "google-gemma-4-26b-a4b-it", - "name": "Google Gemma 4 26B A4B Instruct", - "display_name": "Google Gemma 4 26B A4B Instruct", + "id": "Qwen/Qwen2.5-72B-Instruct", + "name": "Qwen/Qwen2.5-72B-Instruct", + "display_name": "Qwen/Qwen2.5-72B-Instruct", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 33000, + "output": 4000 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "release_date": "2024-09-18", + "last_updated": "2025-11-25", + "type": "chat" + }, + { + "id": "Qwen/Qwen3-VL-30B-A3B-Instruct", + "name": "Qwen/Qwen3-VL-30B-A3B-Instruct", + "display_name": "Qwen/Qwen3-VL-30B-A3B-Instruct", "modalities": { "input": [ "text", @@ -139103,35 +137646,51 @@ ] }, "limit": { - "context": 256000, - "output": 8192 + "context": 262000, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "high" - ] - } + "supported": false }, "attachment": true, "open_weights": true, - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "release_date": "2025-10-04", + "last_updated": "2025-10-04", "type": "chat" }, { - "id": "google-gemma-4-31b-it", - "name": "Google Gemma 4 31B Instruct", - "display_name": "Google Gemma 4 31B Instruct", + "id": "Qwen/Qwen3-30B-A3B-Instruct-2507", + "name": "Qwen/Qwen3-30B-A3B-Instruct-2507", + "display_name": "Qwen/Qwen3-30B-A3B-Instruct-2507", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 262000, + "output": 32768 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "release_date": "2025-07-28", + "last_updated": "2025-07-28", + "type": "chat" + }, + { + "id": "Qwen/Qwen3.5-27B", + "name": "Qwen/Qwen3.5-27B", + "display_name": "Qwen/Qwen3.5-27B", "modalities": { "input": [ "text", @@ -139143,8 +137702,8 @@ ] }, "limit": { - "context": 256000, - "output": 8192 + "context": 262144, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -139154,25 +137713,26 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "high" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, "attachment": true, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "knowledge": "2025-04", + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" }, { - "id": "nvidia-nemotron-3-ultra-550b-a55b", - "name": "NVIDIA Nemotron 3 Ultra", - "display_name": "NVIDIA Nemotron 3 Ultra", + "id": "Qwen/Qwen3-8B", + "name": "Qwen/Qwen3-8B", + "display_name": "Qwen/Qwen3-8B", "modalities": { "input": [ "text" @@ -139182,48 +137742,48 @@ ] }, "limit": { - "context": 256000, + "context": 131000, "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": true }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "high" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, "attachment": false, "open_weights": true, - "knowledge": "2025-09", - "release_date": "2026-06-04", - "last_updated": "2026-06-04", + "release_date": "2025-04-29", + "last_updated": "2025-04-29", "type": "chat" }, { - "id": "grok-4-6", - "name": "Grok 4.6", - "display_name": "Grok 4.6", + "id": "Qwen/Qwen3.5-35B-A3B", + "name": "Qwen/Qwen3.5-35B-A3B", + "display_name": "Qwen/Qwen3.5-35B-A3B", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 500000, - "output": 200000 + "context": 262144, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -139233,39 +137793,41 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "xhigh" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-02-01", - "release_date": "2026-08-12", - "last_updated": "2026-08-12", + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" }, { - "id": "claude-sonnet-5", - "name": "Claude Sonnet 5", - "display_name": "Claude Sonnet 5", + "id": "Qwen/Qwen3.5-4B", + "name": "Qwen/Qwen3.5-4B", + "display_name": "Qwen/Qwen3.5-4B", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 64000 + "context": 262144, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -139274,55 +137836,52 @@ "extra_capabilities": { "reasoning": { "supported": true, - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-30", - "last_updated": "2026-06-30", + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2026-03-02", + "last_updated": "2026-03-02", "type": "chat" }, { - "id": "openai-gpt-4o-2024-11-20", - "name": "GPT-4o", - "display_name": "GPT-4o", + "id": "tencent/Hunyuan-A13B-Instruct", + "name": "tencent/Hunyuan-A13B-Instruct", + "display_name": "tencent/Hunyuan-A13B-Instruct", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 131000, + "output": 117964 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2023-09", - "release_date": "2024-11-20", - "last_updated": "2024-11-20", + "attachment": false, + "open_weights": true, + "release_date": "2025-06-30", + "last_updated": "2025-11-25", "type": "chat" }, { - "id": "deepseek-v4-pro-0813", - "name": "DeepSeek V4 Pro 0813", - "display_name": "DeepSeek V4 Pro 0813", + "id": "zai-org/GLM-5.2", + "name": "GLM-5.2", + "display_name": "GLM-5.2", "modalities": { "input": [ "text" @@ -139332,8 +137891,8 @@ ] }, "limit": { - "context": 1000000, - "output": 32768 + "context": 1049000, + "output": 262000 }, "temperature": true, "tool_call": true, @@ -139344,9 +137903,13 @@ "extra_capabilities": { "reasoning": { "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ - "none", - "low", "high", "max" ] @@ -139354,42 +137917,14 @@ }, "attachment": false, "open_weights": true, - "release_date": "2026-08-13", - "last_updated": "2026-08-22", - "type": "chat" - }, - { - "id": "grok-4-20-multi-agent", - "name": "Grok 4.20 Multi-Agent", - "display_name": "Grok 4.20 Multi-Agent", - "modalities": { - "input": [ - "text", - "image" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 2000000, - "output": 128000 - }, - "tool_call": false, - "reasoning": { - "supported": true, - "default": true - }, - "attachment": true, - "open_weights": false, - "release_date": "2026-03-12", - "last_updated": "2026-06-11", + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "hermes-3-llama-3.1-405b", - "name": "Hermes 3 Llama 3.1 405b", - "display_name": "Hermes 3 Llama 3.1 405b", + "id": "zai-org/GLM-4.5-Air", + "name": "zai-org/GLM-4.5-Air", + "display_name": "zai-org/GLM-4.5-Air", "modalities": { "input": [ "text" @@ -139399,38 +137934,36 @@ ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 131000, + "output": 98304 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, "attachment": false, "open_weights": true, - "knowledge": "2023-12-31", - "release_date": "2024-08-16", - "last_updated": "2024-08-16", + "knowledge": "2025-04", + "release_date": "2025-07-28", + "last_updated": "2025-07-28", "type": "chat" }, { - "id": "qwen3-6-27b", - "name": "Qwen 3.6 27B", - "display_name": "Qwen 3.6 27B", + "id": "deepseek-ai/DeepSeek-V3.1-Terminus", + "name": "deepseek-ai/DeepSeek-V3.1-Terminus", + "display_name": "deepseek-ai/DeepSeek-V3.1-Terminus", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 65536 + "context": 164000, + "output": 8192 }, "temperature": true, "tool_call": true, @@ -139438,26 +137971,16 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "high" - ] - } - }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-04-22", - "last_updated": "2026-04-22", + "release_date": "2025-09-29", + "last_updated": "2025-11-25", "type": "chat" }, { - "id": "aion-labs-aion-3-5", - "name": "Aion 3.5", - "display_name": "Aion 3.5", + "id": "deepseek-ai/DeepSeek-V3.2", + "name": "deepseek-ai/DeepSeek-V3.2", + "display_name": "deepseek-ai/DeepSeek-V3.2", "modalities": { "input": [ "text" @@ -139467,65 +137990,59 @@ ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 164000, + "output": 65536 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, "attachment": false, - "open_weights": false, - "release_date": "2026-09-23", - "last_updated": "2026-09-23", + "open_weights": true, + "knowledge": "2024-07", + "release_date": "2025-12-01", + "last_updated": "2025-12-01", "type": "chat" }, { - "id": "muse-wonder", - "name": "Muse Wonder", - "display_name": "Muse Wonder", + "id": "deepseek-ai/DeepSeek-OCR", + "name": "deepseek-ai/DeepSeek-OCR", + "display_name": "deepseek-ai/DeepSeek-OCR", "modalities": { "input": [ "text", "image", - "audio", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 8192, + "output": 3113 }, - "tool_call": true, + "temperature": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "high", - "max" - ] - } + "supported": false }, "attachment": true, - "open_weights": false, - "release_date": "2026-10-12", - "last_updated": "2026-10-15", - "type": "chat" + "open_weights": true, + "release_date": "2025-10-20", + "last_updated": "2025-10-20" }, { - "id": "zai-org-glm-5", - "name": "GLM 5", - "display_name": "GLM 5", + "id": "deepseek-ai/DeepSeek-V4-Pro", + "name": "deepseek-ai/DeepSeek-V4-Pro", + "display_name": "deepseek-ai/DeepSeek-V4-Pro", "modalities": { "input": [ "text" @@ -139535,8 +138052,8 @@ ] }, "limit": { - "context": 198000, - "output": 32000 + "context": 1049000, + "output": 393000 }, "temperature": true, "tool_call": true, @@ -139547,70 +138064,74 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "high", + "max" + ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" ], - "effort_options": [ - "none", - "low", - "medium", - "high" + "notes": [ + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, "attachment": false, "open_weights": true, - "release_date": "2026-02-12", - "last_updated": "2026-02-12", + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "abliteration-abliterated-model-large-flash", - "name": "Abliterated Large Flash", - "display_name": "Abliterated Large Flash", + "id": "deepseek-ai/DeepSeek-V3", + "name": "deepseek-ai/DeepSeek-V3", + "display_name": "deepseek-ai/DeepSeek-V3", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 164000, + "output": 8192 }, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": true, - "open_weights": false, - "release_date": "2026-10-23", - "last_updated": "2026-10-23", + "attachment": false, + "open_weights": true, + "release_date": "2025-03-24", + "last_updated": "2025-03-24", "type": "chat" }, { - "id": "openai-gpt-53-codex", - "name": "GPT-5.3 Codex", - "display_name": "GPT-5.3 Codex", + "id": "deepseek-ai/DeepSeek-V4-Flash", + "name": "DeepSeek V4 Flash", + "display_name": "DeepSeek V4 Flash", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 1000000, + "output": 384000 }, "temperature": true, "tool_call": true, @@ -139620,38 +138141,48 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", "effort_options": [ - "none", "low", - "medium", "high", - "xhigh" + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-05", - "last_updated": "2026-02-05", + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "openai-gpt-54", - "name": "GPT-5.4", - "display_name": "GPT-5.4", + "id": "deepseek-ai/DeepSeek-R1", + "name": "deepseek-ai/DeepSeek-R1", + "display_name": "deepseek-ai/DeepSeek-R1", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 164000, + "output": 8192 }, "temperature": true, "tool_call": true, @@ -139661,330 +138192,215 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-05", - "last_updated": "2026-03-05", + "attachment": false, + "open_weights": true, + "release_date": "2025-05-28", + "last_updated": "2025-05-28", "type": "chat" }, { - "id": "openai-gpt-61-sol-ultrafast", - "name": "GPT-6.1 Sol Ultrafast", - "display_name": "GPT-6.1 Sol Ultrafast", + "id": "ByteDance-Seed/Seed-OSS-36B-Instruct", + "name": "ByteDance-Seed/Seed-OSS-36B-Instruct", + "display_name": "ByteDance-Seed/Seed-OSS-36B-Instruct", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 262000, + "output": 99560 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": true }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ] + "supported": true } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-04-30", - "release_date": "2026-09-29", - "last_updated": "2026-09-29", + "attachment": false, + "open_weights": true, + "release_date": "2025-09-04", + "last_updated": "2025-11-25", "type": "chat" }, { - "id": "openai-gpt-54-mini", - "name": "GPT-5.4 Mini", - "display_name": "GPT-5.4 Mini", + "id": "inclusionAI/Ling-flash-2.0", + "name": "inclusionAI/Ling-flash-2.0", + "display_name": "inclusionAI/Ling-flash-2.0", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 131000, + "output": 49780 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ] - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-17", - "last_updated": "2026-03-17", + "attachment": false, + "open_weights": true, + "release_date": "2025-09-18", + "last_updated": "2025-11-25", "type": "chat" }, { - "id": "qwen3-5-397b-a17b", - "name": "Qwen 3.5 397B", - "display_name": "Qwen 3.5 397B", + "id": "deepseek-ai/DeepSeek-V3.2-Exp", + "name": "deepseek-ai/DeepSeek-V3.2-Exp", + "display_name": "deepseek-ai/DeepSeek-V3.2-Exp", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 32768 + "context": 131072, + "output": 8192 }, - "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "high" - ] - } + "supported": false }, - "attachment": true, - "open_weights": true, - "release_date": "2026-02-15", - "last_updated": "2026-02-15", "type": "chat" }, { - "id": "claude-opus-5-fast", - "name": "Claude Opus 5 Fast", - "display_name": "Claude Opus 5 Fast", + "id": "Pro/deepseek-ai/DeepSeek-V3.2-Exp", + "name": "Pro/deepseek-ai/DeepSeek-V3.2-Exp", + "display_name": "Pro/deepseek-ai/DeepSeek-V3.2-Exp", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 131072, + "output": 8192 }, - "temperature": false, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ] - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-05", - "release_date": "2026-07-24", - "last_updated": "2026-07-24", "type": "chat" }, { - "id": "claude-opus-4-8-fast", - "name": "Claude Opus 4.8 Fast", - "display_name": "Claude Opus 4.8 Fast", + "id": "inclusionAI/Ring-1T", + "name": "inclusionAI/Ring-1T", + "display_name": "inclusionAI/Ring-1T", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 131072, + "output": 8192 }, - "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." - ] + "supported": true } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-01", - "release_date": "2026-05-28", - "last_updated": "2026-05-28", "type": "chat" }, { - "id": "claude-opus-5-5", - "name": "Claude Opus 5.5", - "display_name": "Claude Opus 5.5", + "id": "inclusionAI/Ling-1T", + "name": "inclusionAI/Ling-1T", + "display_name": "inclusionAI/Ling-1T", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 131072, + "output": 8192 }, - "temperature": false, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ] - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-09-22", - "last_updated": "2026-09-22", "type": "chat" }, { - "id": "z-ai-glm-5-3-flash", - "name": "GLM 5.3 Flash", - "display_name": "GLM 5.3 Flash", + "id": "zai-org/GLM-4.6", + "name": "zai-org/GLM-4.6", + "display_name": "zai-org/GLM-4.6", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 131072, + "output": 8192 }, - "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, - "attachment": true, - "open_weights": true, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", "type": "chat" }, { - "id": "claude-opus-5-5-fast", - "name": "Claude Opus 5.5 Fast", - "display_name": "Claude Opus 5.5 Fast", - "modalities": { - "input": [ - "text", - "image" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 1000000, - "output": 128000 + "id": "Qwen/Qwen3-VL-235B-A22B-Instruct", + "name": "Qwen/Qwen3-VL-235B-A22B-Instruct", + "display_name": "Qwen/Qwen3-VL-235B-A22B-Instruct", + "tool_call": true, + "reasoning": { + "supported": false }, - "temperature": false, + "type": "chat" + }, + { + "id": "Qwen/Qwen3-VL-235B-A22B-Thinking", + "name": "Qwen/Qwen3-VL-235B-A22B-Thinking", + "display_name": "Qwen/Qwen3-VL-235B-A22B-Thinking", "tool_call": true, "reasoning": { "supported": true, @@ -139992,70 +138408,55 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-09-22", - "last_updated": "2026-09-22", "type": "chat" }, { - "id": "qwen-3-8-max", - "name": "Qwen 3.8 Max", - "display_name": "Qwen 3.8 Max", + "id": "Qwen/Qwen3-Omni-30B-A3B-Instruct", + "name": "Qwen/Qwen3-Omni-30B-A3B-Instruct", + "display_name": "Qwen/Qwen3-Omni-30B-A3B-Instruct", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 131072, + "output": 8192 }, - "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": true, - "open_weights": false, - "release_date": "2026-07-19", - "last_updated": "2026-07-19", "type": "chat" }, { - "id": "openai-gpt-56-terra", - "name": "GPT-5.6 Terra", - "display_name": "GPT-5.6 Terra", + "id": "Qwen/Qwen3-Omni-30B-A3B-Thinking", + "name": "Qwen/Qwen3-Omni-30B-A3B-Thinking", + "display_name": "Qwen/Qwen3-Omni-30B-A3B-Thinking", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 131072, + "output": 8192 }, - "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -140063,68 +138464,45 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", "type": "chat" }, { - "id": "deepseek-v4-1-flash-uncensored", - "name": "DeepSeek V4.1 Flash Uncensored", - "display_name": "DeepSeek V4.1 Flash Uncensored", + "id": "Qwen/Qwen3-Omni-30B-A3B-Captioner", + "name": "Qwen/Qwen3-Omni-30B-A3B-Captioner", + "display_name": "Qwen/Qwen3-Omni-30B-A3B-Captioner", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 131072, + "output": 8192 }, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "low", - "high", - "max" - ] - } + "supported": false }, - "attachment": true, - "open_weights": true, - "release_date": "2026-10-23", - "last_updated": "2026-10-23", "type": "chat" }, { - "id": "mistral-small-3-2-24b-instruct", - "name": "Mistral Small 3.2 24B Instruct", - "display_name": "Mistral Small 3.2 24B Instruct", + "id": "moonshotai/Kimi-K2-Instruct-0905", + "name": "moonshotai/Kimi-K2-Instruct-0905", + "display_name": "moonshotai/Kimi-K2-Instruct-0905", "modalities": { "input": [ - "image", "text" ], "output": [ @@ -140132,109 +138510,75 @@ ] }, "limit": { - "context": 256000, - "output": 16384 + "context": 131072, + "output": 8192 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": true, - "open_weights": true, - "knowledge": "2023-10-31", - "release_date": "2025-06-20", - "last_updated": "2025-06-20", "type": "chat" }, { - "id": "google-gemma-3-27b-it", - "name": "Google Gemma 3 27B Instruct", - "display_name": "Google Gemma 3 27B Instruct", + "id": "Pro/moonshotai/Kimi-K2-Instruct-0905", + "name": "Pro/moonshotai/Kimi-K2-Instruct-0905", + "display_name": "Pro/moonshotai/Kimi-K2-Instruct-0905", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 198000, - "output": 16384 + "context": 131072, + "output": 8192 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": true, - "open_weights": true, - "knowledge": "2024-08", - "release_date": "2025-03-12", - "last_updated": "2025-03-12", "type": "chat" }, { - "id": "openai-gpt-6-astra-pro", - "name": "GPT-6 Astra Pro", - "display_name": "GPT-6 Astra Pro", + "id": "Qwen/Qwen3-Next-80B-A3B-Instruct", + "name": "Qwen/Qwen3-Next-80B-A3B-Instruct", + "display_name": "Qwen/Qwen3-Next-80B-A3B-Instruct", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 131072, + "output": 8192 }, - "temperature": false, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ] - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-04-30", - "release_date": "2026-09-04", - "last_updated": "2026-09-04", "type": "chat" }, { - "id": "openai-gpt-6-astra", - "name": "GPT-6 Astra", - "display_name": "GPT-6 Astra", + "id": "Qwen/Qwen3-Next-80B-A3B-Thinking", + "name": "Qwen/Qwen3-Next-80B-A3B-Thinking", + "display_name": "Qwen/Qwen3-Next-80B-A3B-Thinking", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 131072, + "output": 8192 }, - "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -140242,40 +138586,33 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-04-30", - "release_date": "2026-09-04", - "last_updated": "2026-09-04", "type": "chat" }, { - "id": "muse-spark-open", - "name": "Muse Spark Open", - "display_name": "Muse Spark Open", + "id": "inclusionAI/Ring-flash-2.0", + "name": "inclusionAI/Ring-flash-2.0", + "display_name": "inclusionAI/Ring-flash-2.0", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 131072, + "output": 8192 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -140283,25 +138620,15 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ] + "supported": true } }, - "attachment": true, - "open_weights": true, - "knowledge": "2026-01-04", - "release_date": "2026-10-15", - "last_updated": "2026-10-15", "type": "chat" }, { - "id": "deepseek-v4-flash-0731", - "name": "DeepSeek V4 Flash 0731", - "display_name": "DeepSeek V4 Flash 0731", + "id": "inclusionAI/Ling-mini-2.0", + "name": "inclusionAI/Ling-mini-2.0", + "display_name": "inclusionAI/Ling-mini-2.0", "modalities": { "input": [ "text" @@ -140311,476 +138638,241 @@ ] }, "limit": { - "context": 1000000, - "output": 32768 + "context": 131072, + "output": 8192 }, - "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "none", - "low", - "high", - "max" - ] - } + "supported": false }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-07-31", - "last_updated": "2026-07-31", "type": "chat" }, { - "id": "openai-gpt-52", - "name": "GPT-5.2", - "display_name": "GPT-5.2", + "id": "Qwen/Qwen-Image-Edit-2509", + "name": "Qwen/Qwen-Image-Edit-2509", + "display_name": "Qwen/Qwen-Image-Edit-2509", "modalities": { "input": [ + "image", "text" ], "output": [ - "text" + "image" ] }, - "limit": { - "context": 256000, - "output": 65536 - }, - "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ] - } - }, - "attachment": false, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2025-12-11", - "last_updated": "2025-12-11", - "type": "chat" + "supported": false + } }, { - "id": "aion-labs-aion-3-5-mini", - "name": "Aion 3.5 Mini", - "display_name": "Aion 3.5 Mini", + "id": "Qwen/Qwen-Image-Edit", + "name": "Qwen/Qwen-Image-Edit", + "display_name": "Qwen/Qwen-Image-Edit", "modalities": { "input": [ + "image", "text" ], "output": [ - "text" + "image" ] }, - "limit": { - "context": 262144, - "output": 32768 - }, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "attachment": false, - "open_weights": false, - "release_date": "2026-09-23", - "last_updated": "2026-09-23", - "type": "chat" + "supported": false + } }, { - "id": "minimax-m25", - "name": "MiniMax M2.5", - "display_name": "MiniMax M2.5", + "id": "Qwen/Qwen-Image", + "name": "Qwen/Qwen-Image", + "display_name": "Qwen/Qwen-Image", "modalities": { "input": [ "text" ], "output": [ - "text" + "image" ] }, - "limit": { - "context": 198000, - "output": 32768 - }, - "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "low", - "medium", - "high" - ] - } - }, - "attachment": false, - "open_weights": true, - "release_date": "2026-02-12", - "last_updated": "2026-02-12", - "type": "chat" + "supported": false + } }, { - "id": "claude-opus-4-5", - "name": "Claude Opus 4.5", - "display_name": "Claude Opus 4.5", + "id": "tencent/Hunyuan-MT-7B", + "name": "tencent/Hunyuan-MT-7B", + "display_name": "tencent/Hunyuan-MT-7B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 198000, - "output": 32768 + "context": 131072, + "output": 8192 }, - "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." - ] - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-05", - "release_date": "2025-11-24", - "last_updated": "2025-11-24", "type": "chat" }, { - "id": "openai-gpt-56-sol", - "name": "GPT-5.6 Sol", - "display_name": "GPT-5.6 Sol", + "id": "Wan-AI/Wan2.2-I2V-A14B", + "name": "Wan-AI/Wan2.2-I2V-A14B", + "display_name": "Wan-AI/Wan2.2-I2V-A14B", "modalities": { "input": [ - "text", - "image" + "image", + "text" ], "output": [ - "text" + "video" ] }, - "limit": { - "context": 1000000, - "output": 128000 - }, - "temperature": false, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ] - } - }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", - "type": "chat" + "supported": false + } }, { - "id": "grok-4-5", - "name": "Grok 4.5", - "display_name": "Grok 4.5", + "id": "Wan-AI/Wan2.2-T2V-A14B", + "name": "Wan-AI/Wan2.2-T2V-A14B", + "display_name": "Wan-AI/Wan2.2-T2V-A14B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ - "text" + "video" ] }, - "limit": { - "context": 500000, - "output": 32000 - }, - "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high" - ] - } - }, - "attachment": true, - "open_weights": false, - "release_date": "2026-07-08", - "last_updated": "2026-07-08", - "type": "chat" + "supported": false + } }, { - "id": "openai-gpt-4o-mini-2024-07-18", - "name": "GPT-4o Mini", - "display_name": "GPT-4o Mini", + "id": "zai-org/GLM-4.5V", + "name": "zai-org/GLM-4.5V", + "display_name": "zai-org/GLM-4.5V", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 131072, + "output": 8192 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2023-09", - "release_date": "2024-07-18", - "last_updated": "2024-07-18", "type": "chat" }, { - "id": "nvidia-nemotron-3-5-super-vl-120b-a12b", - "name": "NVIDIA Nemotron 3.5 Super VL 120B", - "display_name": "NVIDIA Nemotron 3.5 Super VL 120B", + "id": "zai-org/GLM-4.5", + "name": "zai-org/GLM-4.5", + "display_name": "zai-org/GLM-4.5", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 131072, + "output": 8192 }, - "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "high" - ] - } + "supported": false }, - "attachment": true, - "open_weights": true, - "release_date": "2026-10-15", - "last_updated": "2026-10-15", "type": "chat" }, { - "id": "venice-uncensored-1-2", - "name": "Venice Uncensored 1.2", - "display_name": "Venice Uncensored 1.2", + "id": "stepfun-ai/step3", + "name": "stepfun-ai/step3", + "display_name": "stepfun-ai/step3", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 128000, + "context": 131072, "output": 8192 }, "tool_call": true, "reasoning": { "supported": false }, - "attachment": true, - "open_weights": true, - "release_date": "2026-04-01", - "last_updated": "2026-06-11", "type": "chat" }, { - "id": "kimi-k3", - "name": "Kimi K3", - "display_name": "Kimi K3", + "id": "TeleAI/TeleSpeechASR", + "name": "TeleAI/TeleSpeechASR", + "display_name": "TeleAI/TeleSpeechASR", "modalities": { "input": [ - "text", - "image" + "audio" ], "output": [ "text" ] }, - "limit": { - "context": 1000000, - "output": 131072 - }, - "temperature": false, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "none", - "low", - "high", - "max" - ] - } - }, - "attachment": true, - "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-16", - "type": "chat" + "supported": false + } }, { - "id": "openai-gpt-56-luna-pro", - "name": "GPT-5.6 Luna Pro", - "display_name": "GPT-5.6 Luna Pro", + "id": "Qwen/Qwen3-Coder-480B-A35B-Instruct", + "name": "Qwen/Qwen3-Coder-480B-A35B-Instruct", + "display_name": "Qwen/Qwen3-Coder-480B-A35B-Instruct", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, - "limit": { - "context": 1000000, - "output": 128000 - }, - "temperature": false, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ] - } - }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", - "type": "chat" + "supported": false + } }, { - "id": "openai-gpt-55-pro", - "name": "GPT-5.5 Pro", - "display_name": "GPT-5.5 Pro", + "id": "Qwen/Qwen3-30B-A3B-Thinking-2507", + "name": "Qwen/Qwen3-30B-A3B-Thinking-2507", + "display_name": "Qwen/Qwen3-30B-A3B-Thinking-2507", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 131072, + "output": 8192 }, - "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -140788,38 +138880,29 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "medium", - "high", - "xhigh" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-12-01", - "release_date": "2026-04-23", - "last_updated": "2026-04-23", "type": "chat" }, { - "id": "kimi-k2-5", - "name": "Kimi K2.5", - "display_name": "Kimi K2.5", + "id": "Qwen/Qwen3-235B-A22B-Thinking-2507", + "name": "Qwen/Qwen3-235B-A22B-Thinking-2507", + "display_name": "Qwen/Qwen3-235B-A22B-Thinking-2507", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, - "limit": { - "context": 256000, - "output": 65536 - }, - "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -140833,26 +138916,15 @@ "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "effort_options": [ - "none", - "low", - "medium", - "high" ] } }, - "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-01-27", - "last_updated": "2026-01-27", "type": "chat" }, { - "id": "mercury-2", - "name": "Mercury 2", - "display_name": "Mercury 2", + "id": "Qwen/Qwen3-235B-A22B-Instruct-2507", + "name": "Qwen/Qwen3-235B-A22B-Instruct-2507", + "display_name": "Qwen/Qwen3-235B-A22B-Instruct-2507", "modalities": { "input": [ "text" @@ -140862,566 +138934,426 @@ ] }, "limit": { - "context": 128000, - "output": 50000 + "context": 131072, + "output": 8192 }, - "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "high" - ] - } + "supported": false }, - "attachment": false, - "open_weights": false, - "release_date": "2026-02-24", - "last_updated": "2026-02-24", "type": "chat" }, { - "id": "openai-gpt-6-luna", - "name": "GPT-6 Luna", - "display_name": "GPT-6 Luna", + "id": "THUDM/GLM-4.1V-9B-Thinking", + "name": "THUDM/GLM-4.1V-9B-Thinking", + "display_name": "THUDM/GLM-4.1V-9B-Thinking", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 131072, + "output": 8192 }, - "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ] - } - }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-05-18", - "release_date": "2026-09-22", - "last_updated": "2026-09-22", "type": "chat" }, { - "id": "deepseek-v4-1-flash-1017", - "name": "DeepSeek v4.1 Flash (1017)", - "display_name": "DeepSeek v4.1 Flash (1017)", + "id": "Pro/THUDM/GLM-4.1V-9B-Thinking", + "name": "Pro/THUDM/GLM-4.1V-9B-Thinking", + "display_name": "Pro/THUDM/GLM-4.1V-9B-Thinking", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 131072, + "output": 8192 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "low", - "high", - "max" - ] - } + "type": "chat" + }, + { + "id": "baidu/ERNIE-4.5-300B-A47B", + "name": "baidu/ERNIE-4.5-300B-A47B", + "display_name": "baidu/ERNIE-4.5-300B-A47B", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "tool_call": true, + "reasoning": { + "supported": false }, - "attachment": true, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-10-17", - "last_updated": "2026-10-17", "type": "chat" }, { - "id": "grok-4-20", - "name": "Grok 4.20", - "display_name": "Grok 4.20", + "id": "moonshotai/Kimi-Dev-72B", + "name": "moonshotai/Kimi-Dev-72B", + "display_name": "moonshotai/Kimi-Dev-72B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 2000000, - "output": 128000 + "context": 131072, + "output": 8192 }, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": true, - "open_weights": false, - "release_date": "2026-03-12", - "last_updated": "2026-06-11", "type": "chat" }, { - "id": "kimi-k3-1-pro-highspeed", - "name": "Kimi K3.1 Pro Highspeed", - "display_name": "Kimi K3.1 Pro Highspeed", + "id": "MiniMaxAI/MiniMax-M1-80k", + "name": "MiniMaxAI/MiniMax-M1-80k", + "display_name": "MiniMaxAI/MiniMax-M1-80k", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 131072, + "output": 8192 }, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "low", - "high", - "max" - ] - } + "supported": false }, - "attachment": true, - "open_weights": false, - "release_date": "2026-10-23", - "last_updated": "2026-10-23", "type": "chat" }, { - "id": "minimax-m3-1-flash", - "name": "MiniMax M3.1 Flash", - "display_name": "MiniMax M3.1 Flash", + "id": "Tongyi-Zhiwen/QwenLong-L1-32B", + "name": "Tongyi-Zhiwen/QwenLong-L1-32B", + "display_name": "Tongyi-Zhiwen/QwenLong-L1-32B", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 131072, + "output": 8192 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ] - } - }, - "attachment": true, - "open_weights": false, - "release_date": "2026-10-19", - "last_updated": "2026-10-19", "type": "chat" }, { - "id": "claude-opus-5", - "name": "Claude Opus 5", - "display_name": "Claude Opus 5", + "id": "deepseek-ai/DeepSeek-R1-0528-Qwen3-8B", + "name": "deepseek-ai/DeepSeek-R1-0528-Qwen3-8B", + "display_name": "deepseek-ai/DeepSeek-R1-0528-Qwen3-8B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 131072, + "output": 8192 }, - "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ] - } - }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-05", - "release_date": "2026-07-24", - "last_updated": "2026-07-24", "type": "chat" }, { - "id": "qwen-3-8-27b", - "name": "Qwen 3.8 27B", - "display_name": "Qwen 3.8 27B", + "id": "Qwen/Qwen3-30B-A3B", + "name": "Qwen/Qwen3-30B-A3B", + "display_name": "Qwen/Qwen3-30B-A3B", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 131072, + "output": 8192 }, - "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": true }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "xhigh" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, - "attachment": true, - "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", "type": "chat" }, { - "id": "gemini-3-8-flash", - "name": "Gemini 3.8 Flash", - "display_name": "Gemini 3.8 Flash", + "id": "Qwen/Qwen3-Reranker-8B", + "name": "Qwen/Qwen3-Reranker-8B", + "display_name": "Qwen/Qwen3-Reranker-8B", "modalities": { "input": [ - "text", - "image", - "audio", - "video" + "text" ], "output": [ - "text" + "score" ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 8192, + "output": 2048 }, - "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": true, - "open_weights": false, - "release_date": "2026-09-02", - "last_updated": "2026-09-02", - "type": "chat" + "type": "rerank" }, { - "id": "openai-gpt-56-luna", - "name": "GPT-5.6 Luna", - "display_name": "GPT-5.6 Luna", + "id": "Qwen/Qwen3-Embedding-8B", + "name": "Qwen/Qwen3-Embedding-8B", + "display_name": "Qwen/Qwen3-Embedding-8B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ - "text" + "embedding" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 8192, + "output": 2048 }, - "temperature": false, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ] - } + "type": "embedding" + }, + { + "id": "Qwen/Qwen3-Reranker-4B", + "name": "Qwen/Qwen3-Reranker-4B", + "display_name": "Qwen/Qwen3-Reranker-4B", + "modalities": { + "input": [ + "text" + ], + "output": [ + "score" + ] }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", - "type": "chat" + "limit": { + "context": 8192, + "output": 2048 + }, + "tool_call": false, + "reasoning": { + "supported": false + }, + "type": "rerank" }, { - "id": "claude-sonnet-4-6", - "name": "Claude Sonnet 4.6", - "display_name": "Claude Sonnet 4.6", + "id": "Qwen/Qwen3-Embedding-4B", + "name": "Qwen/Qwen3-Embedding-4B", + "display_name": "Qwen/Qwen3-Embedding-4B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ + "embedding" + ] + }, + "limit": { + "context": 8192, + "output": 2048 + }, + "tool_call": false, + "reasoning": { + "supported": false + }, + "type": "embedding" + }, + { + "id": "Qwen/Qwen3-Reranker-0.6B", + "name": "Qwen/Qwen3-Reranker-0.6B", + "display_name": "Qwen/Qwen3-Reranker-0.6B", + "modalities": { + "input": [ "text" + ], + "output": [ + "score" ] }, "limit": { - "context": 1000000, - "output": 64000 + "context": 8192, + "output": 2048 }, - "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": false + "supported": false }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." - ] - } + "type": "rerank" + }, + { + "id": "Qwen/Qwen3-Embedding-0.6B", + "name": "Qwen/Qwen3-Embedding-0.6B", + "display_name": "Qwen/Qwen3-Embedding-0.6B", + "modalities": { + "input": [ + "text" + ], + "output": [ + "embedding" + ] }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-17", - "last_updated": "2026-03-13", - "type": "chat" + "limit": { + "context": 8192, + "output": 2048 + }, + "tool_call": false, + "reasoning": { + "supported": false + }, + "type": "embedding" }, { - "id": "openai-gpt-55", - "name": "GPT-5.5", - "display_name": "GPT-5.5", + "id": "ascend-tribe/pangu-pro-moe", + "name": "ascend-tribe/pangu-pro-moe", + "display_name": "ascend-tribe/pangu-pro-moe", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 131072, + "output": 8192 }, - "temperature": false, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ] - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-12-01", - "release_date": "2026-04-23", - "last_updated": "2026-04-23", "type": "chat" }, { - "id": "qwen-3-7-max", - "name": "Qwen 3.7 Max", - "display_name": "Qwen 3.7 Max", + "id": "THUDM/GLM-Z1-32B-0414", + "name": "THUDM/GLM-Z1-32B-0414", + "display_name": "THUDM/GLM-Z1-32B-0414", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 131072, + "output": 8192 }, - "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": true, - "open_weights": false, - "release_date": "2026-05-21", - "last_updated": "2026-05-21", "type": "chat" }, { - "id": "minimax-m3-preview", - "name": "MiniMax M3 Preview", - "display_name": "MiniMax M3 Preview", + "id": "THUDM/GLM-4-32B-0414", + "name": "THUDM/GLM-4-32B-0414", + "display_name": "THUDM/GLM-4-32B-0414", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 524288, - "output": 65536 + "context": 131072, + "output": 8192 }, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": true, - "open_weights": true, - "release_date": "2026-06-12", - "last_updated": "2026-06-13", "type": "chat" }, { - "id": "grok-build-0-1", - "name": "Grok Build 0.1", - "display_name": "Grok Build 0.1", + "id": "THUDM/GLM-Z1-9B-0414", + "name": "THUDM/GLM-Z1-9B-0414", + "display_name": "THUDM/GLM-Z1-9B-0414", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 65536 + "context": 131072, + "output": 8192 }, - "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": true, - "open_weights": false, - "release_date": "2026-04-16", - "last_updated": "2026-04-16", "type": "chat" }, { - "id": "llama-3.2-3b", - "name": "Llama 3.2 3B", - "display_name": "Llama 3.2 3B", + "id": "THUDM/GLM-4-9B-0414", + "name": "THUDM/GLM-4-9B-0414", + "display_name": "THUDM/GLM-4-9B-0414", "modalities": { "input": [ "text" @@ -141431,77 +139363,52 @@ ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 131072, + "output": 8192 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, - "open_weights": true, - "knowledge": "2023-12", - "release_date": "2024-09-25", - "last_updated": "2024-09-25", "type": "chat" }, { - "id": "grok-4-7", - "name": "Grok 4.7", - "display_name": "Grok 4.7", + "id": "Qwen/Qwen2.5-VL-32B-Instruct", + "name": "Qwen/Qwen2.5-VL-32B-Instruct", + "display_name": "Qwen/Qwen2.5-VL-32B-Instruct", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 500000, - "output": 200000 + "context": 131072, + "output": 8192 }, - "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ] - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-05", - "release_date": "2026-09-21", - "last_updated": "2026-09-21", "type": "chat" }, { - "id": "qwen3-vl-235b-a22b", - "name": "Qwen3 VL 235B", - "display_name": "Qwen3 VL 235B", + "id": "Qwen/Qwen3-235B-A22B", + "name": "Qwen/Qwen3-235B-A22B", + "display_name": "Qwen/Qwen3-235B-A22B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 131072, + "output": 8192 }, "tool_call": true, "reasoning": { @@ -141518,63 +139425,27 @@ ] } }, - "attachment": true, - "open_weights": true, - "release_date": "2026-01-16", - "last_updated": "2026-06-11", "type": "chat" }, { - "id": "qwen3-6-35b-a3b", - "name": "Qwen 3.6 35B A3B", - "display_name": "Qwen 3.6 35B A3B", + "id": "Qwen/QwQ-32B", + "name": "Qwen/QwQ-32B", + "display_name": "Qwen/QwQ-32B", "modalities": { "input": [ - "text", - "image" - ], - "output": [ "text" - ] - }, - "limit": { - "context": 256000, - "output": 65536 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "attachment": true, - "open_weights": true, - "release_date": "2026-04-17", - "last_updated": "2026-04-17", - "type": "chat" - }, - { - "id": "kimi-k2-6", - "name": "Kimi K2.6", - "display_name": "Kimi K2.6", - "modalities": { - "input": [ - "text", - "image" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 65536 + "context": 131072, + "output": 8192 }, - "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": true }, "extra_capabilities": { "reasoning": { @@ -141584,53 +139455,37 @@ "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "effort_options": [ - "none", - "low", - "medium", - "high" ] } }, - "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-20", - "last_updated": "2026-04-20", "type": "chat" }, { - "id": "venice-uncensored-role-play", - "name": "Venice Role Play Uncensored", - "display_name": "Venice Role Play Uncensored", + "id": "Qwen/Qwen2.5-VL-72B-Instruct", + "name": "Qwen/Qwen2.5-VL-72B-Instruct", + "display_name": "Qwen/Qwen2.5-VL-72B-Instruct", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 131072, + "output": 8192 }, "tool_call": true, "reasoning": { "supported": false }, - "attachment": true, - "open_weights": true, - "release_date": "2026-02-20", - "last_updated": "2026-06-11", "type": "chat" }, { - "id": "qwen3-coder-480b-a35b-instruct-turbo", - "name": "Qwen 3 Coder 480B Turbo", - "display_name": "Qwen 3 Coder 480B Turbo", + "id": "Pro/Qwen/Qwen2.5-VL-7B-Instruct", + "name": "Pro/Qwen/Qwen2.5-VL-7B-Instruct", + "display_name": "Pro/Qwen/Qwen2.5-VL-7B-Instruct", "modalities": { "input": [ "text" @@ -141640,63 +139495,42 @@ ] }, "limit": { - "context": 256000, - "output": 65536 + "context": 131072, + "output": 8192 }, "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, - "open_weights": true, - "release_date": "2026-01-27", - "last_updated": "2026-06-11", "type": "chat" }, { - "id": "inkling", - "name": "Inkling", - "display_name": "Inkling", + "id": "deepseek-ai/DeepSeek-R1-Distill-Qwen-32B", + "name": "deepseek-ai/DeepSeek-R1-Distill-Qwen-32B", + "display_name": "deepseek-ai/DeepSeek-R1-Distill-Qwen-32B", "modalities": { "input": [ - "text", - "image", - "audio" + "text" ], "output": [ "text" ] }, "limit": { - "context": 524288, - "output": 65536 + "context": 131072, + "output": 8192 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "high" - ] - } - }, - "attachment": true, - "open_weights": true, - "release_date": "2026-07-15", - "last_updated": "2026-07-15", "type": "chat" }, { - "id": "deepseek-v4-flash-0731-fast", - "name": "DeepSeek V4 Flash 0731 Fast", - "display_name": "DeepSeek V4 Flash 0731 Fast", + "id": "deepseek-ai/DeepSeek-R1-Distill-Qwen-14B", + "name": "deepseek-ai/DeepSeek-R1-Distill-Qwen-14B", + "display_name": "deepseek-ai/DeepSeek-R1-Distill-Qwen-14B", "modalities": { "input": [ "text" @@ -141706,257 +139540,156 @@ ] }, "limit": { - "context": 1000000, - "output": 32768 + "context": 131072, + "output": 8192 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "none", - "low", - "high", - "max" - ] - } - }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-07-31", - "last_updated": "2026-07-31", "type": "chat" }, { - "id": "grok-4-3", - "name": "Grok 4.3", - "display_name": "Grok 4.3", + "id": "deepseek-ai/DeepSeek-R1-Distill-Qwen-7B", + "name": "deepseek-ai/DeepSeek-R1-Distill-Qwen-7B", + "display_name": "deepseek-ai/DeepSeek-R1-Distill-Qwen-7B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 32000 + "context": 131072, + "output": 8192 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "high" - ] - } - }, - "attachment": true, - "open_weights": false, - "release_date": "2026-04-17", - "last_updated": "2026-04-17", "type": "chat" }, { - "id": "claude-opus-4-6", - "name": "Claude Opus 4.6", - "display_name": "Claude Opus 4.6", + "id": "Qwen/QVQ-72B-Preview", + "name": "Qwen/QVQ-72B-Preview", + "display_name": "Qwen/QVQ-72B-Preview", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 131072, + "output": 8192 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." - ] - } + "default": true }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-05-31", - "release_date": "2026-02-05", - "last_updated": "2026-03-13", "type": "chat" }, { - "id": "gemini-3-flash-preview", - "name": "Gemini 3 Flash Preview", - "display_name": "Gemini 3 Flash Preview", + "id": "deepseek-ai/DeepSeek-V2.5", + "name": "deepseek-ai/DeepSeek-V2.5", + "display_name": "deepseek-ai/DeepSeek-V2.5", "modalities": { "input": [ - "text", - "image", - "video", - "audio", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 65536 + "context": 131072, + "output": 8192 }, - "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", - "low", - "medium", - "high" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-12-17", - "last_updated": "2025-12-17", "type": "chat" }, { - "id": "z-ai-glm-5-turbo", - "name": "GLM 5 Turbo", - "display_name": "GLM 5 Turbo", + "id": "fnlp/MOSS-TTSD-v0.5", + "name": "fnlp/MOSS-TTSD-v0.5", + "display_name": "fnlp/MOSS-TTSD-v0.5", "modalities": { "input": [ "text" ], "output": [ - "text" + "audio" ] }, - "limit": { - "context": 200000, - "output": 32768 - }, - "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "high" - ] - } + "supported": false + } + }, + { + "id": "FunAudioLLM/CosyVoice2-0.5B", + "name": "FunAudioLLM/CosyVoice2-0.5B", + "display_name": "FunAudioLLM/CosyVoice2-0.5B", + "modalities": { + "input": [ + "text" + ], + "output": [ + "audio" + ] }, - "attachment": false, - "open_weights": false, - "release_date": "2026-03-16", - "last_updated": "2026-03-16", - "type": "chat" + "tool_call": false, + "reasoning": { + "supported": false + } }, { - "id": "gemini-3-5-flash-lite", - "name": "Gemini 3.5 Flash-Lite", - "display_name": "Gemini 3.5 Flash-Lite", + "id": "FunAudioLLM/SenseVoiceSmall", + "name": "FunAudioLLM/SenseVoiceSmall", + "display_name": "FunAudioLLM/SenseVoiceSmall", "modalities": { "input": [ - "text", - "image", - "audio", - "video" + "audio" ], "output": [ "text" ] }, - "limit": { - "context": 1000000, - "output": 65536 - }, - "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false + } + }, + { + "id": "IndexTeam/IndexTTS-2", + "name": "IndexTeam/IndexTTS-2", + "display_name": "IndexTeam/IndexTTS-2", + "modalities": { + "input": [ + "text" + ], + "output": [ + "audio" + ] }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-07-21", - "last_updated": "2026-07-21", - "type": "chat" + "tool_call": false, + "reasoning": { + "supported": false + } }, { - "id": "abliteration-abliterated-model-large-v2", - "name": "Abliterated Large V2", - "display_name": "Abliterated Large V2", + "id": "BAAI/bge-m3", + "name": "BAAI/bge-m3", + "display_name": "BAAI/bge-m3", "modalities": { "input": [ "text" @@ -141966,200 +139699,144 @@ ] }, "limit": { - "context": 1000000, - "output": 32768 + "context": 131072, + "output": 8192 }, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": false, - "open_weights": false, - "release_date": "2026-10-01", - "last_updated": "2026-10-01", - "type": "chat" + "type": "embedding" }, { - "id": "deepseek-v3.2", - "name": "DeepSeek V3.2", - "display_name": "DeepSeek V3.2", + "id": "BAAI/bge-reranker-v2-m3", + "name": "BAAI/bge-reranker-v2-m3", + "display_name": "BAAI/bge-reranker-v2-m3", "modalities": { "input": [ "text" ], "output": [ - "text" + "score" ] }, "limit": { - "context": 160000, - "output": 32768 + "context": 8192, + "output": 2048 }, - "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "none", - "low", - "medium", - "high" - ] - } + "supported": false }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-07", - "release_date": "2025-12-01", - "last_updated": "2025-12-01", - "type": "chat" + "type": "rerank" }, { - "id": "llama-3.3-70b", - "name": "Llama 3.3 70B", - "display_name": "Llama 3.3 70B", + "id": "netease-youdao/bce-embedding-base_v1", + "name": "netease-youdao/bce-embedding-base_v1", + "display_name": "netease-youdao/bce-embedding-base_v1", "modalities": { "input": [ "text" ], "output": [ - "text" + "embedding" ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 8192, + "output": 2048 }, - "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, - "attachment": false, - "open_weights": true, - "knowledge": "2023-12", - "release_date": "2024-12-06", - "last_updated": "2024-12-06", - "type": "chat" + "type": "embedding" }, { - "id": "qwen3-235b-a22b-instruct-2507", - "name": "Qwen 3 235B A22B Instruct 2507", - "display_name": "Qwen 3 235B A22B Instruct 2507", + "id": "netease-youdao/bce-reranker-base_v1", + "name": "netease-youdao/bce-reranker-base_v1", + "display_name": "netease-youdao/bce-reranker-base_v1", "modalities": { "input": [ "text" ], "output": [ - "text" + "score" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 8192, + "output": 2048 }, - "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false - }, - "attachment": false, - "open_weights": true, - "release_date": "2025-07-21", - "last_updated": "2025-07-21", - "type": "chat" + } }, { - "id": "xiaomi-mimo-v2-5", - "name": "MiMo-V2.5", - "display_name": "MiMo-V2.5", + "id": "Qwen/Qwen2.5-Coder-32B-Instruct", + "name": "Qwen/Qwen2.5-Coder-32B-Instruct", + "display_name": "Qwen/Qwen2.5-Coder-32B-Instruct", "modalities": { "input": [ - "text", - "image", - "audio", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 131072, + "output": 8192 }, - "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "high" - ] - } - }, - "attachment": true, - "open_weights": true, - "knowledge": "2024-12", - "release_date": "2026-04-22", - "last_updated": "2026-04-22", - "type": "chat" + "supported": false + } }, { - "id": "kimi-k3-fast-api", - "name": "Kimi K3 Fast", - "display_name": "Kimi K3 Fast", + "id": "Kwai-Kolors/Kolors", + "name": "Kwai-Kolors/Kolors", + "display_name": "Kwai-Kolors/Kolors", "modalities": { "input": [ - "text", + "text" + ], + "output": [ "image" + ] + }, + "tool_call": false, + "reasoning": { + "supported": false + } + }, + { + "id": "Qwen/Qwen2-VL-72B-Instruct", + "name": "Qwen/Qwen2-VL-72B-Instruct", + "display_name": "Qwen/Qwen2-VL-72B-Instruct", + "modalities": { + "input": [ + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 131072, + "output": 8192 }, - "temperature": false, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "low", - "high", - "max" - ] - } + "supported": false }, - "attachment": true, - "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-16", "type": "chat" }, { - "id": "mercury-2-5", - "name": "Mercury 2.5", - "display_name": "Mercury 2.5", + "id": "Qwen/Qwen2.5-72B-Instruct-128K", + "name": "Qwen/Qwen2.5-72B-Instruct-128K", + "display_name": "Qwen/Qwen2.5-72B-Instruct-128K", "modalities": { "input": [ "text" @@ -142169,457 +139846,238 @@ ] }, "limit": { - "context": 260000, - "output": 65536 + "context": 131072, + "output": 8192 }, - "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "high" - ] - } + "supported": false }, - "attachment": false, - "open_weights": false, - "release_date": "2026-09-08", - "last_updated": "2026-09-08", "type": "chat" }, { - "id": "seed-2-1-turbo", - "name": "Seed 2.1 Turbo", - "display_name": "Seed 2.1 Turbo", + "id": "deepseek-ai/deepseek-vl2", + "name": "deepseek-ai/deepseek-vl2", + "display_name": "deepseek-ai/deepseek-vl2", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 65536 + "context": 131072, + "output": 8192 }, - "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": true, - "open_weights": false, - "release_date": "2026-06-23", - "last_updated": "2026-06-23", "type": "chat" }, { - "id": "claude-opus-4-8", - "name": "Claude Opus 4.8", - "display_name": "Claude Opus 4.8", + "id": "Qwen/Qwen2.5-32B-Instruct", + "name": "Qwen/Qwen2.5-32B-Instruct", + "display_name": "Qwen/Qwen2.5-32B-Instruct", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 131072, + "output": 8192 }, - "temperature": false, "tool_call": true, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." - ] - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-01", - "release_date": "2026-05-28", - "last_updated": "2026-05-28", "type": "chat" }, { - "id": "kimi-k3-1-pro", - "name": "Kimi K3.1 Pro", - "display_name": "Kimi K3.1 Pro", + "id": "Qwen/Qwen2.5-14B-Instruct", + "name": "Qwen/Qwen2.5-14B-Instruct", + "display_name": "Qwen/Qwen2.5-14B-Instruct", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 131072, + "output": 8192 }, - "temperature": false, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "low", - "high", - "max" - ] - } + "supported": false }, - "attachment": true, - "open_weights": false, - "release_date": "2026-10-23", - "last_updated": "2026-10-23", "type": "chat" }, { - "id": "openai-gpt-56-terra-pro", - "name": "GPT-5.6 Terra Pro", - "display_name": "GPT-5.6 Terra Pro", + "id": "Qwen/Qwen2.5-Coder-7B-Instruct", + "name": "Qwen/Qwen2.5-Coder-7B-Instruct", + "display_name": "Qwen/Qwen2.5-Coder-7B-Instruct", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 131072, + "output": 8192 }, - "temperature": false, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ] - } - }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", - "type": "chat" + "supported": false + } }, { - "id": "kimi-k2-7-code", - "name": "Kimi K2.7 Code", - "display_name": "Kimi K2.7 Code", + "id": "internlm/internlm2_5-7b-chat", + "name": "internlm/internlm2_5-7b-chat", + "display_name": "internlm/internlm2_5-7b-chat", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 65536 - }, - "temperature": false, + "context": 131072, + "output": 8192 + }, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high" - ] - } + "supported": false }, - "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-06-12", - "last_updated": "2026-06-12", "type": "chat" }, { - "id": "gemini-3-1-pro-preview", - "name": "Gemini 3.1 Pro Preview", - "display_name": "Gemini 3.1 Pro Preview", + "id": "Qwen/Qwen2-7B-Instruct", + "name": "Qwen/Qwen2-7B-Instruct", + "display_name": "Qwen/Qwen2-7B-Instruct", "modalities": { "input": [ - "text", - "image", - "audio", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 32768 + "context": 131072, + "output": 8192 }, - "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high" - ] - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-02-19", - "last_updated": "2026-02-19", "type": "chat" }, { - "id": "qwen3-5-35b-a3b", - "name": "Qwen 3.5 35B A3B", - "display_name": "Qwen 3.5 35B A3B", + "id": "THUDM/glm-4-9b-chat", + "name": "THUDM/glm-4-9b-chat", + "display_name": "THUDM/glm-4-9b-chat", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 16384 + "context": 131072, + "output": 8192 }, - "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "high" - ] - } + "supported": false }, - "attachment": true, - "open_weights": true, - "release_date": "2026-02-23", - "last_updated": "2026-02-23", "type": "chat" }, { - "id": "claude-fable-5", - "name": "Claude Fable 5", - "display_name": "Claude Fable 5", + "id": "BAAI/bge-large-en-v1.5", + "name": "BAAI/bge-large-en-v1.5", + "display_name": "BAAI/bge-large-en-v1.5", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 131072, + "output": 8192 }, - "temperature": false, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", - "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", - "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." - ] - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-09", - "last_updated": "2026-06-09", - "type": "chat" + "type": "embedding" }, { - "id": "z-ai-glm-5v-turbo", - "name": "GLM 5V Turbo", - "display_name": "GLM 5V Turbo", + "id": "BAAI/bge-large-zh-v1.5", + "name": "BAAI/bge-large-zh-v1.5", + "display_name": "BAAI/bge-large-zh-v1.5", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 32768 + "context": 131072, + "output": 8192 }, - "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "high" - ] - } + "supported": false }, - "attachment": true, - "open_weights": false, - "release_date": "2026-04-01", - "last_updated": "2026-04-01", - "type": "chat" + "type": "embedding" }, { - "id": "xiaomi-mimo-v2-6-flash", - "name": "MiMo-V2.6-Flash", - "display_name": "MiMo-V2.6-Flash", + "id": "LoRA/Qwen/Qwen2.5-32B-Instruct", + "name": "LoRA/Qwen/Qwen2.5-32B-Instruct", + "display_name": "LoRA/Qwen/Qwen2.5-32B-Instruct", "modalities": { "input": [ - "text", - "image", - "audio", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 131072, + "output": 8192 }, - "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "high" - ] - } + "supported": false }, - "attachment": true, - "open_weights": true, - "release_date": "2026-09-22", - "last_updated": "2026-09-22", "type": "chat" }, { - "id": "olafangensan-glm-4.7-flash-heretic", - "name": "GLM 4.7 Flash Heretic", - "display_name": "GLM 4.7 Flash Heretic", + "id": "LoRA/Qwen/Qwen2.5-14B-Instruct", + "name": "LoRA/Qwen/Qwen2.5-14B-Instruct", + "display_name": "LoRA/Qwen/Qwen2.5-14B-Instruct", "modalities": { "input": [ "text" @@ -142629,500 +140087,444 @@ ] }, "limit": { - "context": 200000, - "output": 24000 + "context": 131072, + "output": 8192 }, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "high" - ] - } + "supported": false }, - "attachment": false, - "open_weights": true, - "release_date": "2026-02-04", - "last_updated": "2026-06-11", "type": "chat" }, { - "id": "qwen-3-8-flash", - "name": "Qwen 3.8 Flash", - "display_name": "Qwen 3.8 Flash", + "id": "Pro/deepseek-ai/DeepSeek-R1-Distill-Qwen-7B", + "name": "Pro/deepseek-ai/DeepSeek-R1-Distill-Qwen-7B", + "display_name": "Pro/deepseek-ai/DeepSeek-R1-Distill-Qwen-7B", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 131072, + "output": 8192 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": true, - "open_weights": false, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", "type": "chat" - } - ] - }, - "aixy": { - "id": "aixy", - "name": "Aixy", - "display_name": "Aixy", - "api": "https://api.aixy-gateway.com/v1", - "doc": "https://docs.aixy-gateway.com/integrations/overview", - "models": [ + }, { - "id": "gemini/gemini-4-argon", - "name": "Gemini 4 Argon", - "display_name": "Gemini 4 Argon", + "id": "Pro/Qwen/Qwen2.5-Coder-7B-Instruct", + "name": "Pro/Qwen/Qwen2.5-Coder-7B-Instruct", + "display_name": "Pro/Qwen/Qwen2.5-Coder-7B-Instruct", "modalities": { "input": [ - "text", - "image", - "audio" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 32768 + "context": 131072, + "output": 8192 }, - "temperature": false, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false + } + }, + { + "id": "Pro/BAAI/bge-m3", + "name": "Pro/BAAI/bge-m3", + "display_name": "Pro/BAAI/bge-m3", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high" - ] - } + "limit": { + "context": 131072, + "output": 8192 }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-10-13", - "last_updated": "2026-10-13", - "type": "chat" + "tool_call": true, + "reasoning": { + "supported": false + }, + "type": "embedding" }, { - "id": "gemini/gemini-3.8-flash", - "name": "Gemini 3.8 Flash", - "display_name": "Gemini 3.8 Flash", + "id": "Pro/Qwen/Qwen2.5-7B-Instruct", + "name": "Pro/Qwen/Qwen2.5-7B-Instruct", + "display_name": "Pro/Qwen/Qwen2.5-7B-Instruct", "modalities": { "input": [ - "text", - "image", - "audio" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 131072, + "output": 8192 }, - "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", - "low", - "medium", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] - } + "supported": false }, - "attachment": true, - "open_weights": false, - "release_date": "2026-09-02", - "last_updated": "2026-09-02", "type": "chat" }, { - "id": "openai/gpt-5.6-sol", - "name": "GPT-5.6 Sol", - "display_name": "GPT-5.6 Sol", + "id": "Pro/BAAI/bge-reranker-v2-m3", + "name": "Pro/BAAI/bge-reranker-v2-m3", + "display_name": "Pro/BAAI/bge-reranker-v2-m3", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" + ], + "output": [ + "score" + ] + }, + "limit": { + "context": 8192, + "output": 2048 + }, + "tool_call": false, + "reasoning": { + "supported": false + }, + "type": "rerank" + }, + { + "id": "LoRA/Qwen/Qwen2.5-72B-Instruct", + "name": "LoRA/Qwen/Qwen2.5-72B-Instruct", + "display_name": "LoRA/Qwen/Qwen2.5-72B-Instruct", + "modalities": { + "input": [ + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 131072, + "output": 8192 }, - "temperature": false, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", "type": "chat" }, { - "id": "openai/gpt-5.6-luna", - "name": "GPT-5.6 Luna", - "display_name": "GPT-5.6 Luna", + "id": "Pro/Qwen/Qwen2-7B-Instruct", + "name": "Pro/Qwen/Qwen2-7B-Instruct", + "display_name": "Pro/Qwen/Qwen2-7B-Instruct", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 131072, + "output": 8192 }, - "temperature": false, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", "type": "chat" }, { - "id": "openai/gpt-5.6-terra", - "name": "GPT-5.6 Terra", - "display_name": "GPT-5.6 Terra", + "id": "LoRA/Qwen/Qwen2.5-7B-Instruct", + "name": "LoRA/Qwen/Qwen2.5-7B-Instruct", + "display_name": "LoRA/Qwen/Qwen2.5-7B-Instruct", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 131072, + "output": 8192 }, - "temperature": false, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", "type": "chat" }, { - "id": "openai/gpt-6-sol", - "name": "GPT-6 Sol", - "display_name": "GPT-6 Sol", + "id": "Pro/THUDM/glm-4-9b-chat", + "name": "Pro/THUDM/glm-4-9b-chat", + "display_name": "Pro/THUDM/glm-4-9b-chat", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 131072, + "output": 8192 }, - "temperature": false, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ] - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-04-20", - "release_date": "2026-09-22", - "last_updated": "2026-09-22", "type": "chat" }, { - "id": "openai/gpt-6.1-sol", - "name": "GPT-6.1 Sol", - "display_name": "GPT-6.1 Sol", + "id": "THUDM/GLM-Z1-Rumination-32B-0414", + "name": "THUDM/GLM-Z1-Rumination-32B-0414", + "display_name": "THUDM/GLM-Z1-Rumination-32B-0414", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 131072, + "output": 8192 }, - "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ] - } - }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-04-30", - "release_date": "2026-09-29", - "last_updated": "2026-09-29", "type": "chat" }, { - "id": "openai/gpt-6-astra", - "name": "GPT-6 Astra", - "display_name": "GPT-6 Astra", + "id": "stabilityai/stable-diffusion-xl-base-1.0", + "name": "stabilityai/stable-diffusion-xl-base-1.0", + "display_name": "stabilityai/stable-diffusion-xl-base-1.0", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ + "image" + ] + }, + "tool_call": false, + "reasoning": { + "supported": false + } + }, + { + "id": "black-forest-labs/FLUX.1-schnell", + "name": "black-forest-labs/FLUX.1-schnell", + "display_name": "black-forest-labs/FLUX.1-schnell", + "modalities": { + "input": [ "text" + ], + "output": [ + "image" ] }, - "limit": { - "context": 1050000, - "output": 128000 + "tool_call": false, + "reasoning": { + "supported": false + } + }, + { + "id": "black-forest-labs/FLUX.1-dev", + "name": "black-forest-labs/FLUX.1-dev", + "display_name": "black-forest-labs/FLUX.1-dev", + "modalities": { + "input": [ + "text" + ], + "output": [ + "image" + ] }, - "temperature": false, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false + } + }, + { + "id": "Pro/black-forest-labs/FLUX.1-schnell", + "name": "Pro/black-forest-labs/FLUX.1-schnell", + "display_name": "Pro/black-forest-labs/FLUX.1-schnell", + "modalities": { + "input": [ + "text" + ], + "output": [ + "image" + ] }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ] - } + "tool_call": false, + "reasoning": { + "supported": false + } + }, + { + "id": "stabilityai/stable-diffusion-3-5-large", + "name": "stabilityai/stable-diffusion-3-5-large", + "display_name": "stabilityai/stable-diffusion-3-5-large", + "modalities": { + "input": [ + "text" + ], + "output": [ + "image" + ] }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-04-30", - "release_date": "2026-09-04", - "last_updated": "2026-09-04", - "type": "chat" + "tool_call": false, + "reasoning": { + "supported": false + } }, { - "id": "openai/gpt-6-luna", - "name": "GPT-6 Luna", - "display_name": "GPT-6 Luna", + "id": "fishaudio/fish-speech-1.4", + "name": "fishaudio/fish-speech-1.4", + "display_name": "fishaudio/fish-speech-1.4", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" + ], + "output": [ + "audio" + ] + }, + "tool_call": false, + "reasoning": { + "supported": false + } + }, + { + "id": "RVC-Boss/GPT-SoVITS", + "name": "RVC-Boss/GPT-SoVITS", + "display_name": "RVC-Boss/GPT-SoVITS", + "modalities": { + "input": [ + "text" + ], + "output": [ + "audio" + ] + }, + "tool_call": false, + "reasoning": { + "supported": false + } + }, + { + "id": "fishaudio/fish-speech-1.5", + "name": "fishaudio/fish-speech-1.5", + "display_name": "fishaudio/fish-speech-1.5", + "modalities": { + "input": [ + "text" + ], + "output": [ + "audio" + ] + }, + "tool_call": false, + "reasoning": { + "supported": false + } + }, + { + "id": "black-forest-labs/FLUX.1-pro", + "name": "black-forest-labs/FLUX.1-pro", + "display_name": "black-forest-labs/FLUX.1-pro", + "modalities": { + "input": [ + "text" + ], + "output": [ + "image" + ] + }, + "tool_call": false, + "reasoning": { + "supported": false + } + }, + { + "id": "LoRA/black-forest-labs/FLUX.1-dev", + "name": "LoRA/black-forest-labs/FLUX.1-dev", + "display_name": "LoRA/black-forest-labs/FLUX.1-dev", + "modalities": { + "input": [ + "text" + ], + "output": [ + "image" + ] + }, + "tool_call": false, + "reasoning": { + "supported": false + } + }, + { + "id": "SeedLLM/Seed-Rice-7B", + "name": "SeedLLM/Seed-Rice-7B", + "display_name": "SeedLLM/Seed-Rice-7B", + "modalities": { + "input": [ + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 131072, + "output": 8192 }, - "temperature": false, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ] - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-05-18", - "release_date": "2026-09-22", - "last_updated": "2026-09-22", "type": "chat" - }, + } + ] + }, + "zhipuai-coding-plan": { + "id": "zhipuai-coding-plan", + "name": "Zhipu AI Coding Plan", + "display_name": "Zhipu AI Coding Plan", + "api": "https://open.bigmodel.cn/api/coding/paas/v4", + "doc": "https://docs.bigmodel.cn/cn/coding-plan/overview", + "models": [ { - "id": "anthropic/claude-haiku-5-5", - "name": "Claude Haiku 5.5", - "display_name": "Claude Haiku 5.5", + "id": "glm-5.3", + "name": "GLM-5.3", + "display_name": "GLM-5.3", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" @@ -143130,9 +140532,9 @@ }, "limit": { "context": 1000000, - "output": 128000 + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -143140,31 +140542,33 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ "low", - "medium", "high", - "xhigh", "max" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-10-07", - "last_updated": "2026-10-07", + "attachment": false, + "open_weights": true, + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "anthropic/claude-sonnet-5-5", - "name": "Claude Sonnet 5.5", - "display_name": "Claude Sonnet 5.5", + "id": "glm-5.3-highspeed", + "name": "GLM-5.3 Highspeed", + "display_name": "GLM-5.3 Highspeed", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" @@ -143172,9 +140576,9 @@ }, "limit": { "context": 1000000, - "output": 128000 + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -143182,41 +140586,45 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ "low", - "medium", "high", - "xhigh", "max" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-09-28", - "last_updated": "2026-09-28", + "attachment": false, + "open_weights": true, + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "anthropic/claude-fable-5-1", - "name": "Claude Fable 5.1", - "display_name": "Claude Fable 5.1", + "id": "glm-4.6v", + "name": "GLM-4.6V", + "display_name": "GLM-4.6V", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 128000, + "output": 32768 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -143225,44 +140633,30 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], "interleaved": true, "summaries": true, - "visibility": "omitted", + "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", - "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", - "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-09-01", - "last_updated": "2026-09-01", + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-12-08", + "last_updated": "2025-12-08", "type": "chat" }, { - "id": "anthropic/claude-opus-5-5", - "name": "Claude Opus 5.5", - "display_name": "Claude Opus 5.5", + "id": "glm-5.3-flash", + "name": "GLM-5.3-Flash", + "display_name": "GLM-5.3-Flash", "modalities": { "input": [ "text", "image", + "video", "pdf" ], "output": [ @@ -143271,9 +140665,9 @@ }, "limit": { "context": 1000000, - "output": 128000 + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -143281,46 +140675,52 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ "low", - "medium", "high", - "xhigh", "max" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "open_weights": true, + "release_date": "2026-08-26", + "last_updated": "2026-08-26", "type": "chat" } ] }, - "tensorx": { - "id": "tensorx", - "name": "TensorX", - "display_name": "TensorX", - "api": "https://api.tensorx.ai/v1", - "doc": "https://docs.tensorx.ai/", + "pareto": { + "id": "pareto", + "name": "Pareto Inference", + "display_name": "Pareto Inference", + "api": "https://api.paretoinference.com/v1", + "doc": "https://docs.paretoinference.com/", "models": [ { - "id": "minimax/minimax-m2.5", - "name": "MiniMax-M2.5", - "display_name": "MiniMax-M2.5", + "id": "z-ai/glm-5.3-flash", + "name": "GLM-5.3-Flash", + "display_name": "GLM-5.3-Flash", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 196608, - "output": 65536 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -143331,26 +140731,38 @@ "extra_capabilities": { "reasoning": { "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ - "minimal", "low", - "medium", "high", - "xhigh", "max" ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-02-12", - "last_updated": "2026-02-12", + "release_date": "2026-08-26", + "last_updated": "2026-08-26", "type": "chat" - }, + } + ] + }, + "moonshot": { + "id": "moonshot", + "name": "Moonshot AI (China)", + "display_name": "Moonshot AI (China)", + "api": "https://api.moonshot.cn/v1", + "doc": "https://platform.moonshot.cn/docs/api/chat", + "models": [ { - "id": "minimax/minimax-m3", - "name": "MiniMax-M3", - "display_name": "MiniMax-M3", + "id": "kimi-k2.7-code-highspeed", + "name": "Kimi K2.7 Code Highspeed", + "display_name": "Kimi K2.7 Code Highspeed", "modalities": { "input": [ "text", @@ -143362,8 +140774,8 @@ ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, @@ -143373,21 +140785,30 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": true, + "mode": "fixed", + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": true, "open_weights": true, - "release_date": "2026-06-01", - "last_updated": "2026-06-01", + "knowledge": "2025-01", + "release_date": "2026-04-21", + "last_updated": "2026-04-21", "type": "chat" }, { - "id": "moonshotai/kimi-k2.7-code", - "name": "Kimi K2.7 Code", - "display_name": "Kimi K2.7 Code", - "modalities": { - "input": [ + "id": "kimi-k3.1-pro", + "name": "Kimi K3.1 Pro", + "display_name": "Kimi K3.1 Pro", + "modalities": { + "input": [ "text", "image", "video" @@ -143397,8 +140818,8 @@ ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1048576, + "output": 1048576 }, "temperature": false, "tool_call": true, @@ -143408,20 +140829,30 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "low", + "high", + "max" + ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-06-12", - "last_updated": "2026-06-12", + "open_weights": false, + "release_date": "2026-10-23", + "last_updated": "2026-10-23", "type": "chat" }, { - "id": "moonshotai/kimi-k2.6", - "name": "Kimi K2.6", - "display_name": "Kimi K2.6", + "id": "kimi-k2.7-code", + "name": "Kimi K2.7 Code", + "display_name": "Kimi K2.7 Code", "modalities": { "input": [ "text", @@ -143444,20 +140875,28 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": true, + "mode": "fixed", + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": true, "open_weights": true, "knowledge": "2025-01", - "release_date": "2026-04-20", - "last_updated": "2026-04-20", + "release_date": "2026-04-21", + "last_updated": "2026-04-21", "type": "chat" }, { - "id": "moonshotai/kimi-k3", - "name": "Kimi K3", - "display_name": "Kimi K3", + "id": "kimi-k2.6", + "name": "Kimi K2.6", + "display_name": "Kimi K2.6", "modalities": { "input": [ "text", @@ -143469,8 +140908,8 @@ ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 262144, + "output": 262144 }, "temperature": false, "tool_call": true, @@ -143480,19 +140919,26 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": true, "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-16", + "knowledge": "2025-01", + "release_date": "2026-04-20", + "last_updated": "2026-04-20", "type": "chat" }, { - "id": "moonshotai/kimi-k2.5", - "name": "Kimi K2.5", - "display_name": "Kimi K2.5", + "id": "kimi-k3.1-pro-highspeed", + "name": "Kimi K3.1 Pro Highspeed", + "display_name": "Kimi K3.1 Pro Highspeed", "modalities": { "input": [ "text", @@ -143504,8 +140950,8 @@ ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1048576, + "output": 1048576 }, "temperature": false, "tool_call": true, @@ -143521,20 +140967,24 @@ "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "effort_options": [ + "low", + "high", + "max" ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-01-27", - "last_updated": "2026-01-27", + "open_weights": false, + "release_date": "2026-10-23", + "last_updated": "2026-10-23", "type": "chat" }, { - "id": "qwen/qwen3.8-27b", - "name": "Qwen3.8 27B", - "display_name": "Qwen3.8 27B", + "id": "kimi-k3", + "name": "Kimi K3", + "display_name": "Kimi K3", "modalities": { "input": [ "text", @@ -143546,10 +140996,10 @@ ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 1048576, + "output": 1048576 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -143557,28 +141007,42 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ "low", - "medium", - "xhigh" + "high", + "max" ] } }, "attachment": true, "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" - }, + } + ] + }, + "aki-io": { + "id": "aki-io", + "name": "AKI.IO", + "display_name": "AKI.IO", + "api": "https://aki.io/v1", + "doc": "https://aki.io/docs/", + "models": [ { - "id": "qwen/qwen3.8-flash-next", - "name": "Qwen3.8 Flash Next", - "display_name": "Qwen3.8 Flash Next", + "id": "mistral4-119b", + "name": "Mistral Small 4", + "display_name": "Mistral Small 4", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" @@ -143586,7 +141050,7 @@ }, "limit": { "context": 262144, - "output": 64000 + "output": 81920 }, "temperature": true, "tool_call": true, @@ -143597,63 +141061,33 @@ "extra_capabilities": { "reasoning": { "effort_options": [ - "low", - "medium", - "xhigh" + "none", + "high" ] } }, - "attachment": true, - "open_weights": true, - "release_date": "2026-08-27", - "last_updated": "2026-08-27", - "type": "chat" - }, - { - "id": "qwen/qwen3-235b-a22b-2507", - "name": "Qwen3 235B-A22B-2507", - "display_name": "Qwen3 235B-A22B-2507", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 131000, - "output": 262144 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, "attachment": false, "open_weights": true, - "knowledge": "2025-06-30", - "release_date": "2025-07-21", - "last_updated": "2025-07-21", + "knowledge": "2025-06", + "release_date": "2026-03-16", + "last_updated": "2026-03-16", "type": "chat" }, { - "id": "qwen/qwen3.5-9b", - "name": "Qwen3.5 9B", - "display_name": "Qwen3.5 9B", + "id": "gpt-oss-120b", + "name": "GPT OSS 120B", + "display_name": "GPT OSS 120B", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 128000, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -143664,33 +141098,24 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ - "none", - "minimal", "low", "medium", - "high", - "xhigh", - "max" + "high" ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-02-23", - "last_updated": "2026-02-23", + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "qwen/qwen3.8-2.4t-a95b", - "name": "Qwen3.8 2.4T A95B", - "display_name": "Qwen3.8 2.4T A95B", + "id": "deepseek-v4.1-flash-552b", + "name": "DeepSeek V4.1 Flash", + "display_name": "DeepSeek V4.1 Flash", "modalities": { "input": [ "text" @@ -143700,8 +141125,8 @@ ] }, "limit": { - "context": 262144, - "output": 64000 + "context": 1048576, + "output": 81920 }, "temperature": true, "tool_call": true, @@ -143711,37 +141136,37 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ + "none", "low", "medium", - "xhigh" + "high", + "max" ] } }, "attachment": false, "open_weights": true, - "release_date": "2026-08-12", - "last_updated": "2026-08-12", + "knowledge": "2025-05", + "release_date": "2026-09-10", + "last_updated": "2026-09-10", "type": "chat" }, { - "id": "qwen/qwen3.5-122b-a10b", - "name": "Qwen3.5 122B-A10B", - "display_name": "Qwen3.5 122B-A10B", + "id": "qwen3.6-35b", + "name": "Qwen3.6 35B-A3B", + "display_name": "Qwen3.6 35B-A3B", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 256000, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -143760,25 +141185,20 @@ ], "effort_options": [ "none", - "minimal", - "low", - "medium", - "high", - "xhigh", - "max" + "high" ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-02-23", - "last_updated": "2026-02-23", + "release_date": "2026-04-17", + "last_updated": "2026-04-17", "type": "chat" }, { - "id": "z-ai/glm-5.1", - "name": "GLM-5.1", - "display_name": "GLM-5.1", + "id": "gemma4-26b", + "name": "Gemma 4 26B A4B IT", + "display_name": "Gemma 4 26B A4B IT", "modalities": { "input": [ "text" @@ -143788,8 +141208,8 @@ ] }, "limit": { - "context": 202752, - "output": 202752 + "context": 256000, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -143799,33 +141219,33 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "effort_options": [ + "none", + "high" + ] } }, "attachment": false, "open_weights": true, - "release_date": "2026-04-07", - "last_updated": "2026-04-07", + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "z-ai/glm-5v-turbo", - "name": "GLM-5V-Turbo", - "display_name": "GLM-5V-Turbo", + "id": "glm5.3-754b", + "name": "GLM-5.3", + "display_name": "GLM-5.3", "modalities": { "input": [ - "text", - "image", - "video", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 202752, - "output": 131072 + "context": 524288, + "output": 81920 }, "temperature": true, "tool_call": true, @@ -143836,26 +141256,22 @@ "extra_capabilities": { "reasoning": { "effort_options": [ - "none", - "minimal", "low", - "medium", "high", - "xhigh", "max" ] } }, - "attachment": true, - "open_weights": false, - "release_date": "2026-04-01", - "last_updated": "2026-04-01", + "attachment": false, + "open_weights": true, + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "z-ai/glm-5", - "name": "GLM-5", - "display_name": "GLM-5", + "id": "qwen3.8-27b", + "name": "Qwen3.8 27B", + "display_name": "Qwen3.8 27B", "modalities": { "input": [ "text" @@ -143865,8 +141281,8 @@ ] }, "limit": { - "context": 202752, - "output": 202752 + "context": 262144, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -143876,34 +141292,33 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ "none", - "minimal", "low", "medium", - "high", - "xhigh", - "max" + "xhigh" ] } }, "attachment": false, "open_weights": true, - "release_date": "2026-02-12", - "last_updated": "2026-02-12", + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" - }, + } + ] + }, + "klokintegration": { + "id": "klokintegration", + "name": "klokintegration.se", + "display_name": "klokintegration.se", + "api": "https://api-gw.klok.ipaas.se/proxy/kloker-key/v1", + "doc": "https://klokintegration.se/docs/ai-api", + "models": [ { - "id": "z-ai/glm-5.3", - "name": "GLM-5.3", - "display_name": "GLM-5.3", + "id": "Kloker-Integration-Architect", + "name": "Kloker Integration Architect", + "display_name": "Kloker Integration Architect", "modalities": { "input": [ "text" @@ -143913,35 +141328,51 @@ ] }, "limit": { - "context": 1048576, - "output": 64000 + "context": 200000, + "output": 50000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "low", - "high", - "max" - ] - } + "attachment": false, + "open_weights": false, + "release_date": "2026-08-29", + "last_updated": "2026-08-29", + "type": "chat" + }, + { + "id": "Kloker-Integration-Developer", + "name": "Kloker Integration Developer", + "display_name": "Kloker Integration Developer", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 200000, + "output": 50000 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false }, "attachment": false, - "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "open_weights": false, + "release_date": "2026-08-29", + "last_updated": "2026-08-29", "type": "chat" }, { - "id": "z-ai/glm-5.2", - "name": "GLM-5.2", - "display_name": "GLM-5.2", + "id": "Kloker", + "name": "Kloker", + "display_name": "Kloker", "modalities": { "input": [ "text" @@ -143951,8 +141382,44 @@ ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 200000, + "output": 50000 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": false, + "release_date": "2026-08-29", + "last_updated": "2026-08-29", + "type": "chat" + } + ] + }, + "zenifra": { + "id": "zenifra", + "name": "Zenifra", + "display_name": "Zenifra", + "api": "https://ai.zenifra.com/v1", + "doc": "https://docs.zenifra.com", + "models": [ + { + "id": "alibaba/qwen3.6-35b-a3b", + "name": "Qwen3.6 35B-A3B", + "display_name": "Qwen3.6 35B-A3B", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 262144, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -143963,36 +141430,46 @@ "extra_capabilities": { "reasoning": { "supported": true, - "effort_options": [ - "high", - "max" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, "attachment": false, "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "release_date": "2026-04-17", + "last_updated": "2026-04-17", "type": "chat" - }, + } + ] + }, + "alibaba-coding-plan": { + "id": "alibaba-coding-plan", + "name": "Alibaba Coding Plan", + "display_name": "Alibaba Coding Plan", + "api": "https://coding-intl.dashscope.aliyuncs.com/v1", + "doc": "https://www.alibabacloud.com/help/en/model-studio/coding-plan", + "models": [ { - "id": "z-ai/glm-5.3-flash", - "name": "GLM-5.3-Flash", - "display_name": "GLM-5.3-Flash", + "id": "qwen3.6-plus", + "name": "Qwen3.6 Plus", + "display_name": "Qwen3.6 Plus", "modalities": { "input": [ "text", "image", - "video", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 64000 + "context": 1000000, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -144003,23 +141480,25 @@ "extra_capabilities": { "reasoning": { "supported": true, - "effort_options": [ - "low", - "high", - "max" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", + "open_weights": false, + "knowledge": "2025-04", + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "z-ai/glm-5-turbo", - "name": "GLM-5-Turbo", - "display_name": "GLM-5-Turbo", + "id": "qwen3-coder-next", + "name": "Qwen3 Coder Next", + "display_name": "Qwen3 Coder Next", "modalities": { "input": [ "text" @@ -144029,30 +141508,24 @@ ] }, "limit": { - "context": 202752, - "output": 131072 + "context": 262144, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2026-03-16", - "last_updated": "2026-03-16", + "open_weights": true, + "release_date": "2026-02-03", + "last_updated": "2026-02-03", "type": "chat" }, { - "id": "deepseek/deepseek-r1-0528", - "name": "DeepSeek R1-0528", - "display_name": "DeepSeek R1-0528", + "id": "MiniMax-M2.5", + "name": "MiniMax-M2.5", + "display_name": "MiniMax-M2.5", "modalities": { "input": [ "text" @@ -144062,8 +141535,8 @@ ] }, "limit": { - "context": 164000, - "output": 8192 + "context": 196608, + "output": 24576 }, "temperature": true, "tool_call": true, @@ -144079,39 +141552,32 @@ "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "effort_options": [ - "minimal", - "low", - "medium", - "high", - "xhigh", - "max" ] } }, "attachment": false, "open_weights": true, - "knowledge": "2024-07", - "release_date": "2025-05-28", - "last_updated": "2025-05-28", + "release_date": "2026-02-12", + "last_updated": "2026-02-12", "type": "chat" }, { - "id": "deepseek/deepseek-v4-pro", - "name": "DeepSeek V4 Pro", - "display_name": "DeepSeek V4 Pro", + "id": "qwen3.5-plus", + "name": "Qwen3.5 Plus", + "display_name": "Qwen3.5 Plus", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 384000 + "context": 1000000, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -144122,36 +141588,25 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "high", - "max" - ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "attachment": true, + "open_weights": false, + "knowledge": "2025-04", + "release_date": "2026-02-16", + "last_updated": "2026-02-16", "type": "chat" }, { - "id": "deepseek/deepseek-v4-pro-0813", - "name": "DeepSeek V4 Pro 0813", - "display_name": "DeepSeek V4 Pro 0813", + "id": "qwen3-coder-plus", + "name": "Qwen3 Coder Plus", + "display_name": "Qwen3 Coder Plus", "modalities": { "input": [ "text" @@ -144161,34 +141616,25 @@ ] }, "limit": { - "context": 1048576, - "output": 64000 + "context": 1000000, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "high", - "max" - ] - } + "supported": false }, "attachment": false, "open_weights": true, - "release_date": "2026-08-13", - "last_updated": "2026-08-22", + "knowledge": "2025-04", + "release_date": "2025-07-23", + "last_updated": "2025-07-23", "type": "chat" }, { - "id": "deepseek/deepseek-v4-flash-0731", - "name": "DeepSeek V4 Flash 0731", - "display_name": "DeepSeek V4 Flash 0731", + "id": "qwen3-max-2026-01-23", + "name": "Qwen3 Max", + "display_name": "Qwen3 Max", "modalities": { "input": [ "text" @@ -144198,47 +141644,47 @@ ] }, "limit": { - "context": 1048576, - "output": 384000 + "context": 262144, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": true }, "extra_capabilities": { "reasoning": { "supported": true, - "effort_options": [ - "high", - "max" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-07-31", - "last_updated": "2026-07-31", + "open_weights": false, + "knowledge": "2025-04", + "release_date": "2026-01-23", + "last_updated": "2026-01-23", "type": "chat" }, { - "id": "deepseek/deepseek-v4.1-flash", - "name": "DeepSeek V4.1 Flash", - "display_name": "DeepSeek V4.1 Flash", + "id": "glm-5", + "name": "GLM-5", + "display_name": "GLM-5", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 384000 + "context": 202752, + "output": 16384 }, "temperature": true, "tool_call": true, @@ -144249,34 +141695,37 @@ "extra_capabilities": { "reasoning": { "supported": true, - "effort_options": [ - "high", - "max" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, - "attachment": true, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-09-10", - "last_updated": "2026-09-10", + "attachment": false, + "open_weights": false, + "release_date": "2026-02-11", + "last_updated": "2026-02-11", "type": "chat" }, { - "id": "deepseek/deepseek-v3.2", - "name": "DeepSeek V3.2", - "display_name": "DeepSeek V3.2", + "id": "qwen3.7-plus", + "name": "Qwen3.7 Plus", + "display_name": "Qwen3.7 Plus", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 163840, - "output": 163840 + "context": 1000000, + "output": 64000 }, "temperature": true, "tool_call": true, @@ -144286,50 +141735,33 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "effort_options": [ - "none", - "minimal", - "low", - "medium", - "high", - "xhigh", - "max" - ] + "supported": true } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2025-12-01", - "last_updated": "2025-12-01", + "attachment": true, + "open_weights": false, + "knowledge": "2025-04", + "release_date": "2026-06-02", + "last_updated": "2026-06-02", "type": "chat" - } - ] - }, - "umans-ai": { - "id": "umans-ai", - "name": "Umans AI", - "display_name": "Umans AI", - "api": "https://api.code.umans.ai/v1", - "doc": "https://app.umans.ai/offers/code/docs/orgs", - "models": [ + }, { - "id": "umans-deepseek-v4.1-flash", - "name": "DeepSeek V4.1 Flash", - "display_name": "DeepSeek V4.1 Flash", + "id": "kimi-k2.5", + "name": "Kimi K2.5", + "display_name": "Kimi K2.5", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 393215 + "context": 262144, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -144345,40 +141777,33 @@ "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "effort_options": [ - "low", - "high", - "max" ] } }, "attachment": true, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-10-17", - "last_updated": "2026-10-17", + "knowledge": "2025-01", + "release_date": "2026-01-27", + "last_updated": "2026-01-27", "type": "chat" }, { - "id": "umans-coder", - "name": "Umans Coder", - "display_name": "Umans Coder", + "id": "glm-4.7", + "name": "GLM-4.7", + "display_name": "GLM-4.7", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131071 + "context": 202752, + "output": 16384 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -144392,28 +141817,35 @@ "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "effort_options": [ - "low", - "high", - "max" ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", + "knowledge": "2025-04", + "release_date": "2025-12-22", + "last_updated": "2025-12-22", "type": "chat" - }, + } + ] + }, + "xiaomi": { + "id": "xiaomi", + "name": "Xiaomi", + "display_name": "Xiaomi", + "api": "https://api.xiaomimimo.com/v1", + "doc": "https://platform.xiaomimimo.com/#/docs", + "models": [ { - "id": "umans-deepseek-v4.1-flash-1017", - "name": "DeepSeek V4.1 Flash 1017", - "display_name": "DeepSeek V4.1 Flash 1017", + "id": "mimo-v2.6-pro", + "name": "MiMo-V2.6-Pro", + "display_name": "MiMo-V2.6-Pro", "modalities": { "input": [ "text", - "image" + "image", + "audio", + "video" ], "output": [ "text" @@ -144421,7 +141853,7 @@ }, "limit": { "context": 1048576, - "output": 393215 + "output": 131072 }, "temperature": true, "tool_call": true, @@ -144437,30 +141869,22 @@ "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "effort_options": [ - "low", - "high", - "max" ] } }, "attachment": true, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-10-17", - "last_updated": "2026-10-17", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "umans-glm-5.3-flash", - "name": "GLM 5.3 Flash", - "display_name": "GLM 5.3 Flash", + "id": "mimo-v2.5-pro", + "name": "MiMo-V2.5-Pro", + "display_name": "MiMo-V2.5-Pro", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" @@ -144468,7 +141892,7 @@ }, "limit": { "context": 1048576, - "output": 131071 + "output": 131072 }, "temperature": true, "tool_call": true, @@ -144484,28 +141908,26 @@ "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "effort_options": [ - "low", - "high", - "max" ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", + "knowledge": "2024-12", + "release_date": "2026-04-22", + "last_updated": "2026-04-22", "type": "chat" }, { - "id": "umans-kimi-k3", - "name": "Kimi K3", - "display_name": "Kimi K3", + "id": "mimo-v2.5", + "name": "MiMo-V2.5", + "display_name": "MiMo-V2.5", "modalities": { "input": [ "text", - "image" + "image", + "audio", + "video" ], "output": [ "text" @@ -144515,7 +141937,7 @@ "context": 1048576, "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -144529,38 +141951,33 @@ "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "effort_options": [ - "low", - "high", - "max" ] } }, "attachment": true, "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-16", + "knowledge": "2024-12", + "release_date": "2026-04-22", + "last_updated": "2026-04-22", "type": "chat" }, { - "id": "umans-flash", - "name": "Umans Flash", - "display_name": "Umans Flash", + "id": "mimo-v2.5-pro-ultraspeed", + "name": "MiMo-V2.5-Pro-UltraSpeed", + "display_name": "MiMo-V2.5-Pro-UltraSpeed", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 1048576, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -144574,27 +141991,26 @@ "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "effort_options": [ - "low", - "medium", - "high" ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-04-17", - "last_updated": "2026-04-17", + "knowledge": "2024-12", + "release_date": "2026-06-08", + "last_updated": "2026-06-09", "type": "chat" }, { - "id": "umans-deepseek-v4-flash-0731", - "name": "DeepSeek V4 Flash", - "display_name": "DeepSeek V4 Flash", + "id": "mimo-v2.6-flash", + "name": "MiMo-V2.6-Flash", + "display_name": "MiMo-V2.6-Flash", "modalities": { "input": [ - "text" + "text", + "image", + "audio", + "video" ], "output": [ "text" @@ -144602,7 +142018,7 @@ }, "limit": { "context": 1048576, - "output": 393215 + "output": 131072 }, "temperature": true, "tool_call": true, @@ -144618,28 +142034,25 @@ "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "effort_options": [ - "low", - "high", - "max" ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-07-31", - "last_updated": "2026-07-31", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "umans-glm-5.3", - "name": "GLM 5.3", - "display_name": "GLM 5.3", + "id": "mimo-v2.6-pro-ultraspeed", + "name": "MiMo-V2.6-Pro-UltraSpeed", + "display_name": "MiMo-V2.6-Pro-UltraSpeed", "modalities": { "input": [ - "text" + "text", + "image", + "audio", + "video" ], "output": [ "text" @@ -144647,7 +142060,7 @@ }, "limit": { "context": 1048576, - "output": 131071 + "output": 131072 }, "temperature": true, "tool_call": true, @@ -144663,72 +142076,85 @@ "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "effort_options": [ - "low", - "high", - "max" ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "release_date": "2026-09-21", + "last_updated": "2026-09-21", "type": "chat" } ] }, - "alibaba-token-plan": { - "id": "alibaba-token-plan", - "name": "Alibaba Token Plan", - "display_name": "Alibaba Token Plan", - "api": "https://token-plan.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1", - "doc": "https://www.alibabacloud.com/help/en/model-studio/token-plan-overview", + "oci": { + "id": "oci", + "name": "OCI Generative AI", + "display_name": "OCI Generative AI", + "api": "https://inference.generativeai.us-chicago-1.oci.oraclecloud.com/openai/v1", + "doc": "https://docs.oracle.com/en-us/iaas/Content/generative-ai/pretrained-models.htm", "models": [ { - "id": "glm-5.1", - "name": "GLM-5.1", - "display_name": "GLM-5.1", + "id": "meta.llama-4-scout-17b-16e-instruct", + "name": "Llama 4 Scout 17B Instruct", + "display_name": "Llama 4 Scout 17B Instruct", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 202752, - "output": 128000 + "context": 192000, + "output": 16384 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "attachment": true, + "open_weights": true, + "knowledge": "2024-08", + "release_date": "2025-04-05", + "last_updated": "2025-04-05", + "type": "chat" + }, + { + "id": "meta.llama-3.3-70b-instruct", + "name": "Llama-3.3-70B-Instruct", + "display_name": "Llama-3.3-70B-Instruct", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 128000, + "output": 4096 + }, + "temperature": true, + "tool_call": false, + "reasoning": { + "supported": false }, "attachment": false, "open_weights": true, - "release_date": "2026-04-07", - "last_updated": "2026-04-07", + "knowledge": "2023-12", + "release_date": "2024-12-06", + "last_updated": "2024-12-06", "type": "chat" }, { - "id": "glm-5", - "name": "GLM-5", - "display_name": "GLM-5", + "id": "openai.gpt-oss-20b", + "name": "GPT OSS 20B", + "display_name": "GPT OSS 20B", "modalities": { "input": [ "text" @@ -144738,7 +142164,7 @@ ] }, "limit": { - "context": 202752, + "context": 128000, "output": 16384 }, "temperature": true, @@ -144755,30 +142181,37 @@ "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "effort_options": [ + "low", + "medium", + "high" ] } }, "attachment": false, - "open_weights": false, - "release_date": "2026-02-12", - "last_updated": "2026-02-12", + "open_weights": true, + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "deepseek-v4-flash", - "name": "DeepSeek V4 Flash", - "display_name": "DeepSeek V4 Flash", + "id": "xai.grok-4.6", + "name": "Grok 4.6", + "display_name": "Grok 4.6", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 500000, + "output": 500000 }, "temperature": true, "tool_call": true, @@ -144788,42 +142221,58 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", "effort_options": [ "low", + "medium", "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." + "xhigh" ] } }, - "attachment": false, + "attachment": true, + "open_weights": false, + "knowledge": "2026-02-01", + "release_date": "2026-08-12", + "last_updated": "2026-08-12", + "type": "chat" + }, + { + "id": "meta.llama-4-maverick-17b-128e-instruct-fp8", + "name": "Llama 4 Maverick 17B Instruct", + "display_name": "Llama 4 Maverick 17B Instruct", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 512000, + "output": 16384 + }, + "temperature": true, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": true, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "knowledge": "2024-08", + "release_date": "2025-04-05", + "last_updated": "2025-04-05", "type": "chat" }, { - "id": "qwen3.7-plus", - "name": "Qwen3.7 Plus", - "display_name": "Qwen3.7 Plus", + "id": "xai.grok-4.3", + "name": "Grok 4.3", + "display_name": "Grok 4.3", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" @@ -144831,7 +142280,7 @@ }, "limit": { "context": 1000000, - "output": 65536 + "output": 30000 }, "temperature": true, "tool_call": true, @@ -144841,39 +142290,35 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "none", + "low", + "medium", + "high" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-04", - "release_date": "2026-06-02", - "last_updated": "2026-06-02", + "release_date": "2026-04-17", + "last_updated": "2026-04-17", "type": "chat" }, { - "id": "qwen3.8-max-preview", - "name": "Qwen3.8 Max Preview", - "display_name": "Qwen3.8 Max Preview", + "id": "openai.gpt-oss-120b", + "name": "GPT OSS 120B", + "display_name": "GPT OSS 120B", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 128000, + "output": 16384 }, "temperature": true, "tool_call": true, @@ -144893,95 +142338,91 @@ "effort_options": [ "low", "medium", - "xhigh" + "high" ] } }, - "attachment": true, - "open_weights": false, - "release_date": "2026-07-19", - "last_updated": "2026-07-19", + "attachment": false, + "open_weights": true, + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "happyhorse-1.1-i2v", - "name": "HappyHorse 1.1 Image-to-Video", - "display_name": "HappyHorse 1.1 Image-to-Video", + "id": "xai.grok-4.20-non-reasoning", + "name": "Grok 4.20 (Non-Reasoning)", + "display_name": "Grok 4.20 (Non-Reasoning)", "modalities": { "input": [ - "image", - "text" + "text", + "image" ], "output": [ - "video" + "text" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 1000000, + "output": 30000 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, "attachment": true, "open_weights": false, - "release_date": "2026-07-17", - "last_updated": "2026-07-17" + "release_date": "2026-03-09", + "last_updated": "2026-03-09", + "type": "chat" }, { - "id": "kimi-k2.7-code", - "name": "Kimi K2.7 Code", - "display_name": "Kimi K2.7 Code", + "id": "xai.grok-4.20-reasoning", + "name": "Grok 4.20 (Reasoning)", + "display_name": "Grok 4.20 (Reasoning)", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1000000, + "output": 30000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-06-12", - "last_updated": "2026-06-12", + "open_weights": false, + "release_date": "2026-03-09", + "last_updated": "2026-03-09", "type": "chat" - }, + } + ] + }, + "zeldoc": { + "id": "zeldoc", + "name": "Zeldoc", + "display_name": "Zeldoc", + "api": "https://api.zeldoc.ai/v1", + "doc": "https://docs.zeldoc.ai", + "models": [ { - "id": "qwen3.8-max", - "name": "Qwen3.8 Max", - "display_name": "Qwen3.8 Max", + "id": "zdev", + "name": "ZDev", + "display_name": "ZDev", "modalities": { "input": [ "text", - "image", - "video", - "pdf" + "image" ], "output": [ "text" @@ -145008,21 +142449,30 @@ ], "effort_options": [ "low", - "medium", - "xhigh" + "high", + "max" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-08-03", - "last_updated": "2026-08-03", + "release_date": "2026-08-26", + "last_updated": "2026-08-26", "type": "chat" - }, + } + ] + }, + "scaleway": { + "id": "scaleway", + "name": "Scaleway", + "display_name": "Scaleway", + "api": "https://api.scaleway.ai/v1", + "doc": "https://www.scaleway.com/en/docs/generative-apis/", + "models": [ { - "id": "deepseek-v4-pro", - "name": "DeepSeek V4 Pro", - "display_name": "DeepSeek V4 Pro", + "id": "deepseek-v4-flash-0731", + "name": "DeepSeek V4 Flash 0731", + "display_name": "DeepSeek V4 Flash 0731", "modalities": { "input": [ "text" @@ -145032,8 +142482,8 @@ ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 256000, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -145044,47 +142494,38 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", + "interleaved": true, "effort_options": [ + "none", "low", "high", "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, "attachment": false, "open_weights": true, "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "release_date": "2026-07-31", + "last_updated": "2026-07-31", "type": "chat" }, { - "id": "deepseek-v4-pro-0813", - "name": "DeepSeek V4 Pro 0813", - "display_name": "DeepSeek V4 Pro 0813", + "id": "mistral-medium-3.5-128b", + "name": "Mistral Medium 3.5 128B", + "display_name": "Mistral Medium 3.5 128B", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 256000, + "output": 16384 }, "temperature": true, "tool_call": true, @@ -145094,94 +142535,73 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ - "high", - "max" + "none", + "high" ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-08-13", - "last_updated": "2026-08-22", + "release_date": "2026-04-29", + "last_updated": "2026-04-29", "type": "chat" }, { - "id": "qwen-image-2.0-pro", - "name": "Qwen Image 2.0 Pro", - "display_name": "Qwen Image 2.0 Pro", + "id": "glm-5.2", + "name": "GLM-5.2", + "display_name": "GLM-5.2", "modalities": { "input": [ "text" ], "output": [ - "image" - ] - }, - "limit": { - "context": 8192, - "output": 8192 - }, - "temperature": true, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": false, - "release_date": "2026-03-03", - "last_updated": "2026-03-03" - }, - { - "id": "happyhorse-1.1-t2v", - "name": "HappyHorse 1.1 Text-to-Video", - "display_name": "HappyHorse 1.1 Text-to-Video", - "modalities": { - "input": [ "text" - ], - "output": [ - "video" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 256000, + "output": 16384 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "none", + "low", + "medium", + "high" + ] + } }, "attachment": false, - "open_weights": false, - "release_date": "2026-07-17", - "last_updated": "2026-07-17" + "open_weights": true, + "release_date": "2026-06-13", + "last_updated": "2026-06-13", + "type": "chat" }, { - "id": "qwen3.6-plus", - "name": "Qwen3.6 Plus", - "display_name": "Qwen3.6 Plus", + "id": "deepseek-v4.1-flash", + "name": "DeepSeek V4.1 Flash", + "display_name": "DeepSeek V4.1 Flash", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 256000, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -145193,86 +142613,75 @@ "reasoning": { "supported": true, "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "none", + "low", + "high", + "max" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-04", - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-09-10", + "last_updated": "2026-09-10", "type": "chat" }, { - "id": "wan2.7-image", - "name": "Wan2.7 Image", - "display_name": "Wan2.7 Image", + "id": "lightonocr-3-0.8b", + "name": "LightOnOCR-3 0.8B", + "display_name": "LightOnOCR-3 0.8B", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ - "image" + "text" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 262144, + "output": 16384 }, "temperature": true, "tool_call": false, "reasoning": { "supported": false }, - "attachment": false, - "open_weights": false, - "release_date": "2026-05-29", - "last_updated": "2026-05-29" + "attachment": true, + "open_weights": true, + "release_date": "2026-10-08", + "last_updated": "2026-10-14", + "type": "chat" }, { - "id": "qwen3.6-flash", - "name": "Qwen3.6 Flash", - "display_name": "Qwen3.6 Flash", + "id": "whisper-large-v3", + "name": "Whisper Large v3", + "display_name": "Whisper Large v3", "modalities": { "input": [ - "text", - "image", - "video" + "audio" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 8192, + "output": 8192 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": true, - "open_weights": false, - "release_date": "2026-04-27", - "last_updated": "2026-04-27", - "type": "chat" + "open_weights": true, + "knowledge": "2023-09", + "release_date": "2023-09-01", + "last_updated": "2026-03-17" }, { "id": "glm-5.3", @@ -145287,8 +142696,8 @@ ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 256000, + "output": 16384 }, "temperature": true, "tool_call": true, @@ -145299,12 +142708,6 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ "low", "high", @@ -145319,9 +142722,9 @@ "type": "chat" }, { - "id": "deepseek-v4-flash-0731", - "name": "DeepSeek V4 Flash 0731", - "display_name": "DeepSeek V4 Flash 0731", + "id": "bge-multilingual-gemma2", + "name": "BGE Multilingual Gemma2", + "display_name": "BGE Multilingual Gemma2", "modalities": { "input": [ "text" @@ -145331,8 +142734,36 @@ ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 8191, + "output": 8192 + }, + "temperature": false, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "release_date": "2024-07-25", + "last_updated": "2024-07-25", + "type": "embedding" + }, + { + "id": "qwen3.6-35b-a3b", + "name": "Qwen3.6 35B A3B", + "display_name": "Qwen3.6 35B A3B", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 128000, + "output": 16384 }, "temperature": true, "tool_call": true, @@ -145350,22 +142781,24 @@ "thinking_blocks" ], "effort_options": [ - "high", - "max" + "none", + "low", + "medium", + "high" ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-07-31", - "last_updated": "2026-07-31", + "knowledge": "2025-04", + "release_date": "2026-04-17", + "last_updated": "2026-04-17", "type": "chat" }, { - "id": "qwen3.7-max", - "name": "Qwen3.7 Max", - "display_name": "Qwen3.7 Max", + "id": "gpt-oss-120b", + "name": "GPT-OSS 120B", + "display_name": "GPT-OSS 120B", "modalities": { "input": [ "text" @@ -145375,8 +142808,8 @@ ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 128000, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -145387,37 +142820,36 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "low", + "medium", + "high" ] } }, "attachment": false, - "open_weights": false, - "release_date": "2026-05-21", - "last_updated": "2026-05-21", + "open_weights": true, + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "kimi-k2.6", - "name": "Kimi K2.6", - "display_name": "Kimi K2.6", + "id": "gemma-4-26b-a4b-it", + "name": "Gemma 4 26B A4B IT", + "display_name": "Gemma 4 26B A4B IT", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 256000, + "output": 16384 }, "temperature": true, "tool_call": true, @@ -145428,25 +142860,25 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "none", + "low", + "medium", + "high" ] } }, "attachment": true, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-20", - "last_updated": "2026-04-20", + "knowledge": "2025-04", + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "kimi-k2.5", - "name": "Kimi K2.5", - "display_name": "Kimi K2.5", + "id": "qwen3.5-397b-a17b", + "name": "Qwen3.5 397B A17B", + "display_name": "Qwen3.5 397B A17B", "modalities": { "input": [ "text", @@ -145458,8 +142890,8 @@ ] }, "limit": { - "context": 262144, - "output": 98304 + "context": 256000, + "output": 16384 }, "temperature": true, "tool_call": true, @@ -145475,66 +142907,54 @@ "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "effort_options": [ + "none", + "low", + "medium", + "high" ] } }, "attachment": true, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-01-27", - "last_updated": "2026-01-27", + "knowledge": "2025-04", + "release_date": "2026-02-15", + "last_updated": "2026-02-15", "type": "chat" }, { - "id": "deepseek-v4.1-flash-1017", - "name": "DeepSeek V4.1 Flash 1017", - "display_name": "DeepSeek V4.1 Flash 1017", + "id": "llama-3.3-70b-instruct", + "name": "Llama-3.3-70B-Instruct", + "display_name": "Llama-3.3-70B-Instruct", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 100000, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "low", - "high", - "max" - ] - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-10-17", - "last_updated": "2026-10-17", + "knowledge": "2023-12", + "release_date": "2024-12-06", + "last_updated": "2024-12-06", "type": "chat" }, { - "id": "glm-5.2", - "name": "GLM-5.2", - "display_name": "GLM-5.2", + "id": "qwen3-embedding-8b", + "name": "Qwen3 Embedding 8B", + "display_name": "Qwen3 Embedding 8B", "modalities": { "input": [ "text" @@ -145544,78 +142964,65 @@ ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 32768, + "output": 8192 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "high", - "max" - ] - } + "supported": false }, "attachment": false, "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", - "type": "chat" + "release_date": "2025-06-05", + "last_updated": "2025-06-05", + "type": "embedding" }, { - "id": "wan2.7-image-pro", - "name": "Wan2.7 Image Pro", - "display_name": "Wan2.7 Image Pro", + "id": "qwen3-235b-a22b-instruct-2507", + "name": "Qwen3 235B A22B Instruct 2507", + "display_name": "Qwen3 235B A22B Instruct 2507", "modalities": { "input": [ "text" ], "output": [ - "image" + "text" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 260000, + "output": 16384 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2026-05-29", - "last_updated": "2026-05-29" + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-07-21", + "last_updated": "2025-07-21", + "type": "chat" }, { - "id": "deepseek-v4.1-flash", - "name": "DeepSeek V4.1 Flash", - "display_name": "DeepSeek V4.1 Flash", + "id": "qwen3.8-27b", + "name": "Qwen3.8 27B", + "display_name": "Qwen3.8 27B", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 262144, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -145625,69 +143032,75 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ + "none", "low", - "high", - "max" + "medium", + "xhigh" ] } }, "attachment": true, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-09-10", - "last_updated": "2026-09-10", + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "happyhorse-1.1-r2v", - "name": "HappyHorse 1.1 Reference-to-Video", - "display_name": "HappyHorse 1.1 Reference-to-Video", + "id": "mistral-small-3.2-24b-instruct-2506", + "name": "Mistral Small 3.2 24B Instruct (2506)", + "display_name": "Mistral Small 3.2 24B Instruct (2506)", "modalities": { "input": [ - "image", - "text" + "text", + "image" ], "output": [ - "video" + "text" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 128000, + "output": 32768 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, "attachment": true, - "open_weights": false, - "release_date": "2026-07-17", - "last_updated": "2026-07-17" - }, + "open_weights": true, + "knowledge": "2025-03", + "release_date": "2025-06-20", + "last_updated": "2025-06-20", + "type": "chat" + } + ] + }, + "chutes": { + "id": "chutes", + "name": "Chutes", + "display_name": "Chutes", + "api": "https://llm.chutes.ai/v1", + "doc": "https://llm.chutes.ai/v1/models", + "models": [ { - "id": "deepseek-v3.2", - "name": "DeepSeek V3.2", - "display_name": "DeepSeek V3.2", + "id": "moonshotai/Kimi-K3-TEE", + "name": "Kimi K3 TEE", + "display_name": "Kimi K3 TEE", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 65536 + "context": 1048576, + "output": 65535 }, "temperature": true, "tool_call": true, @@ -145695,28 +143108,22 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2025-12-03", - "last_updated": "2025-12-05", + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" }, { - "id": "qwen-image-2.0", - "name": "Qwen Image 2.0", - "display_name": "Qwen Image 2.0", + "id": "moonshotai/Kimi-K2.7-Code", + "name": "Kimi K2.7 Code", + "display_name": "Kimi K2.7 Code", "modalities": { "input": [ "text" ], "output": [ - "image" + "text" ] }, "limit": { @@ -145726,28 +143133,36 @@ "temperature": true, "tool_call": false, "reasoning": { - "supported": false + "supported": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": false, - "open_weights": false, - "release_date": "2026-03-03", - "last_updated": "2026-03-03" + "open_weights": true, + "release_date": "2026-10-26", + "last_updated": "2026-10-26", + "type": "chat" }, { - "id": "MiniMax-M2.5", - "name": "MiniMax-M2.5", - "display_name": "MiniMax-M2.5", + "id": "moonshotai/Kimi-K2.6-TEE", + "name": "Kimi K2.6 TEE", + "display_name": "Kimi K2.6 TEE", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 196608, - "output": 32768 + "context": 262144, + "output": 65535 }, "temperature": true, "tool_call": true, @@ -145766,29 +143181,56 @@ ] } }, + "attachment": true, + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-04-20", + "last_updated": "2026-04-20", + "type": "chat" + }, + { + "id": "Qwen/Qwen3.8-Max-0902", + "name": "Qwen3.8 Max 0902", + "display_name": "Qwen3.8 Max 0902", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 8192, + "output": 8192 + }, + "temperature": true, + "tool_call": false, + "reasoning": { + "supported": false + }, "attachment": false, "open_weights": true, - "release_date": "2026-02-12", - "last_updated": "2026-02-12", + "release_date": "2026-10-20", + "last_updated": "2026-10-25", "type": "chat" }, { - "id": "qwen3.8-flash", - "name": "Qwen3.8 Flash", - "display_name": "Qwen3.8 Flash", + "id": "Qwen/Qwen3.6-27B-TEE", + "name": "Qwen3.6 27B TEE", + "display_name": "Qwen3.6 27B TEE", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 262144, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -145804,33 +143246,19 @@ "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "effort_options": [ - "low", - "medium", - "xhigh" ] } }, "attachment": true, - "open_weights": false, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", + "open_weights": true, + "release_date": "2026-04-22", + "last_updated": "2026-04-22", "type": "chat" - } - ] - }, - "kuae-cloud-coding-plan": { - "id": "kuae-cloud-coding-plan", - "name": "KUAE Cloud Coding Plan", - "display_name": "KUAE Cloud Coding Plan", - "api": "https://coding-plan-endpoint.kuaecloud.net/v1", - "doc": "https://docs.mthreads.com/kuaecloud/kuaecloud-doc-online/coding_plan/", - "models": [ + }, { - "id": "GLM-4.7", - "name": "GLM-4.7", - "display_name": "GLM-4.7", + "id": "Qwen/Qwen3.8-2.4T-A95B", + "name": "Qwen3.8 2.4T A95B", + "display_name": "Qwen3.8 2.4T A95B", "modalities": { "input": [ "text" @@ -145840,8 +143268,41 @@ ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 8192, + "output": 8192 + }, + "temperature": true, + "tool_call": false, + "reasoning": { + "supported": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": false, + "open_weights": true, + "release_date": "2026-10-26", + "last_updated": "2026-10-26", + "type": "chat" + }, + { + "id": "Qwen/Qwen3.5-397B-A17B-TEE", + "name": "Qwen3.5 397B A17B TEE", + "display_name": "Qwen3.5 397B A17B TEE", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 262144, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -145860,29 +143321,20 @@ ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-12-22", - "last_updated": "2025-12-22", + "release_date": "2026-02-15", + "last_updated": "2026-02-15", "type": "chat" - } - ] - }, - "echo": { - "id": "echo", - "name": "Echo", - "display_name": "Echo", - "api": "https://echo.tracerml.ai/v1", - "doc": "https://echo.tracerml.ai/docs/api", - "models": [ + }, { - "id": "echo", - "name": "Echo", - "display_name": "Echo", + "id": "Qwen/Qwen3.8-27B-TEE", + "name": "Qwen3.8 27B TEE", + "display_name": "Qwen3.8 27B TEE", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" @@ -145898,35 +143350,16 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "high" - ] - } - }, - "attachment": false, - "open_weights": false, - "release_date": "2026-07-19", - "last_updated": "2026-08-16", + "attachment": true, + "open_weights": true, + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" - } - ] - }, - "morph": { - "id": "morph", - "name": "Morph", - "display_name": "Morph", - "api": "https://api.morphllm.com/v1", - "doc": "https://docs.morphllm.com/api-reference/introduction", - "models": [ + }, { - "id": "morph-v3-large", - "name": "Morph V3 Large", - "display_name": "Morph V3 Large", + "id": "zai-org/GLM-5.1-TEE", + "name": "GLM 5.1 TEE", + "display_name": "GLM 5.1 TEE", "modalities": { "input": [ "text" @@ -145936,24 +143369,36 @@ ] }, "limit": { - "context": 262144, - "output": 131072 + "context": 202752, + "output": 65535 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, - "open_weights": false, - "release_date": "2025-07-07", - "last_updated": "2025-07-07", + "open_weights": true, + "release_date": "2026-04-07", + "last_updated": "2026-04-07", "type": "chat" }, { - "id": "morph-v3-fast", - "name": "Morph V3 Fast", - "display_name": "Morph V3 Fast", + "id": "zai-org/GLM-5.2-Fast", + "name": "GLM 5.2 Fast", + "display_name": "GLM 5.2 Fast", "modalities": { "input": [ "text" @@ -145963,8 +143408,8 @@ ] }, "limit": { - "context": 262144, - "output": 131072 + "context": 8192, + "output": 8192 }, "temperature": true, "tool_call": false, @@ -145972,15 +143417,15 @@ "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2025-07-07", - "last_updated": "2025-07-07", + "open_weights": true, + "release_date": "2026-10-26", + "last_updated": "2026-10-26", "type": "chat" }, { - "id": "auto", - "name": "Auto", - "display_name": "Auto", + "id": "zai-org/GLM-5.3", + "name": "GLM 5.3", + "display_name": "GLM 5.3", "modalities": { "input": [ "text" @@ -145990,10 +143435,10 @@ ] }, "limit": { - "context": 32000, - "output": 32000 + "context": 8192, + "output": 8192 }, - "temperature": false, + "temperature": true, "tool_call": false, "reasoning": { "supported": true @@ -146004,20 +143449,18 @@ } }, "attachment": false, - "open_weights": false, - "release_date": "2024-06-01", - "last_updated": "2024-06-01", + "open_weights": true, + "release_date": "2026-10-26", + "last_updated": "2026-10-26", "type": "chat" }, { - "id": "morph-glm53flash", - "name": "GLM-5.3-Flash", - "display_name": "GLM-5.3-Flash", + "id": "zai-org/GLM-5.2-TEE", + "name": "GLM 5.2 TEE", + "display_name": "GLM 5.2 TEE", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" @@ -146025,7 +143468,7 @@ }, "limit": { "context": 1048576, - "output": 1048576 + "output": 65535 }, "temperature": true, "tool_call": true, @@ -146041,25 +143484,19 @@ "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "effort_options": [ - "none", - "low", - "high", - "max" ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "morph-glm53-744b", - "name": "GLM-5.3", - "display_name": "GLM-5.3", + "id": "deepseek-ai/DeepSeek-V4-Flash-0731-TEE", + "name": "DeepSeek V4 Flash 0731 TEE", + "display_name": "DeepSeek V4 Flash 0731 TEE", "modalities": { "input": [ "text" @@ -146070,7 +143507,7 @@ }, "limit": { "context": 1048576, - "output": 1048576 + "output": 131072 }, "temperature": true, "tool_call": true, @@ -146078,45 +143515,28 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "none", - "low", - "high", - "max" - ] - } - }, "attachment": false, "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "knowledge": "2025-05", + "release_date": "2026-07-31", + "last_updated": "2026-07-31", "type": "chat" }, { - "id": "morph-dsv41flash-1017", - "name": "DeepSeek V4.1 Flash 1017", - "display_name": "DeepSeek V4.1 Flash 1017", + "id": "deepseek-ai/DeepSeek-V3.2-TEE", + "name": "DeepSeek V3.2 TEE", + "display_name": "DeepSeek V3.2 TEE", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 1048576 + "context": 131072, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -146132,27 +143552,20 @@ "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "effort_options": [ - "none", - "low", - "high", - "xhigh", - "max" ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-10-17", - "last_updated": "2026-10-17", + "knowledge": "2024-07", + "release_date": "2025-12-01", + "last_updated": "2025-12-01", "type": "chat" }, { - "id": "morph-dsv4flash", - "name": "DeepSeek V4 Flash 0731", - "display_name": "DeepSeek V4 Flash 0731", + "id": "deepseek-ai/DeepSeek-V4.1-Flash-1017", + "name": "DeepSeek V4.1 Flash 1017", + "display_name": "DeepSeek V4.1 Flash 1017", "modalities": { "input": [ "text" @@ -146162,43 +143575,24 @@ ] }, "limit": { - "context": 1048576, - "output": 1048576 + "context": 8192, + "output": 8192 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "none", - "low", - "high", - "max" - ] - } + "supported": false }, "attachment": false, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-07-31", - "last_updated": "2026-07-31", + "release_date": "2026-10-26", + "last_updated": "2026-10-26", "type": "chat" }, { - "id": "morph-glm52-744b", - "name": "GLM-5.2", - "display_name": "GLM-5.2", + "id": "deepseek-ai/DeepSeek-V4-Pro-0813", + "name": "DeepSeek V4 Pro 0813", + "display_name": "DeepSeek V4 Pro 0813", "modalities": { "input": [ "text" @@ -146208,41 +143602,29 @@ ] }, "limit": { - "context": 1048576, - "output": 1048576 + "context": 8192, + "output": 8192 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "none", - "high", - "max" - ] + "supported": true } }, "attachment": false, "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "release_date": "2026-10-20", + "last_updated": "2026-10-25", "type": "chat" }, { - "id": "morph-kimik3-fast", - "name": "Kimi K3 Fast", - "display_name": "Kimi K3 Fast", + "id": "google/gemma-4-31B-turbo-TEE", + "name": "gemma 4 31B turbo TEE", + "display_name": "gemma 4 31B turbo TEE", "modalities": { "input": [ "text", @@ -146253,144 +143635,88 @@ ] }, "limit": { - "context": 1048576, - "output": 1048576 + "context": 131072, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "none", - "low", - "high" - ] - } - }, "attachment": true, "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-16", + "knowledge": "2025-01", + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" - }, + } + ] + }, + "nano-gpt": { + "id": "nano-gpt", + "name": "NanoGPT", + "display_name": "NanoGPT", + "api": "https://nano-gpt.com/api/v1", + "doc": "https://docs.nano-gpt.com", + "models": [ { - "id": "morph-kimik3", - "name": "Kimi K3", - "display_name": "Kimi K3", + "id": "venice-uncensored", + "name": "Venice Uncensored", + "display_name": "Venice Uncensored", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 1048576 + "context": 128000, + "output": 8192 }, - "temperature": false, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "none", - "low", - "high", - "max" - ] - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-16", + "release_date": "2025-10-01", + "last_updated": "2025-02-24", "type": "chat" }, { - "id": "morph-dsv41flash", - "name": "DeepSeek V4.1 Flash", - "display_name": "DeepSeek V4.1 Flash", + "id": "deepseek-chat-cheaper", + "name": "DeepSeek V3/Chat Cheaper", + "display_name": "DeepSeek V3/Chat Cheaper", "modalities": { "input": [ "text", - "image" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 1048576 + "context": 128000, + "output": 8192 }, - "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "none", - "low", - "high", - "xhigh", - "max" - ] - } + "supported": false }, "attachment": true, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-09-10", - "last_updated": "2026-09-10", + "release_date": "2025-04-15", + "last_updated": "2025-04-15", "type": "chat" - } - ] - }, - "scnet-token-plan": { - "id": "scnet-token-plan", - "name": "SCNet Token Plan", - "display_name": "SCNet Token Plan", - "api": "https://api.scnet.cn/api/llm/v1", - "doc": "https://www.scnet.cn/ac/openapi/doc/2.0/moduleapi/plans/token-plan.html", - "models": [ + }, { - "id": "Kimi-K2.6", - "name": "Kimi K2.6", - "display_name": "Kimi K2.6", + "id": "gemma-4-26b-a4b-it-shadowsiren", + "name": "Shadow Siren", + "display_name": "Shadow Siren", "modalities": { "input": [ "text", @@ -146402,75 +143728,23 @@ }, "limit": { "context": 262144, - "output": 262144 + "output": 32768 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, "attachment": true, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-20", - "last_updated": "2026-04-20", - "type": "chat" - }, - { - "id": "GLM-5", - "name": "GLM-5", - "display_name": "GLM-5", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 204800, - "output": 131072 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, - "attachment": false, - "open_weights": true, - "release_date": "2026-02-12", - "last_updated": "2026-02-12", + "release_date": "2026-07-29", + "last_updated": "2026-07-29", "type": "chat" }, { - "id": "DeepSeek-V4-Pro-0813", - "name": "DeepSeek V4 Pro 0813", - "display_name": "DeepSeek V4 Pro 0813", + "id": "synth-2.5-flash", + "name": "Synth 2.5 Flash Preview", + "display_name": "Synth 2.5 Flash Preview", "modalities": { "input": [ "text" @@ -146480,224 +143754,149 @@ ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 30000, + "output": 30000 }, - "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "high", - "max" - ] - } + "supported": false }, "attachment": false, - "open_weights": true, - "release_date": "2026-08-13", - "last_updated": "2026-08-22", + "open_weights": false, + "release_date": "2026-09-05", + "last_updated": "2026-09-05", "type": "chat" }, { - "id": "DeepSeek-V4-Flash", - "name": "DeepSeek V4 Flash", - "display_name": "DeepSeek V4 Flash", + "id": "gemma-4-26b-a4b-it-musica", + "name": "Musica", + "display_name": "Musica", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 262144, + "output": 32768 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." - ] - } - }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "release_date": "2026-07-29", + "last_updated": "2026-07-29", "type": "chat" }, { - "id": "MiniMax-M2.7", - "name": "MiniMax-M2.7", - "display_name": "MiniMax-M2.7", + "id": "deepseek-chat", + "name": "DeepSeek V3/Deepseek Chat", + "display_name": "DeepSeek V3/Deepseek Chat", "modalities": { "input": [ - "text" + "text", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 128000, + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-03-18", - "last_updated": "2026-03-18", + "knowledge": "2025-09", + "release_date": "2025-12-01", + "last_updated": "2026-02-28", "type": "chat" }, { - "id": "Kimi-K3", - "name": "Kimi K3", - "display_name": "Kimi K3", + "id": "gemma-4-12b-it-semancer", + "name": "Gemma 4 12B Semancer", + "display_name": "Gemma 4 12B Semancer", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 131072, + "output": 32768 }, - "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-16", + "release_date": "2026-09-09", + "last_updated": "2026-09-09", "type": "chat" }, { - "id": "Qwen3.8-Max", - "name": "Qwen3.8 Max", - "display_name": "Qwen3.8 Max", + "id": "gemma-4-31b-it-gembrain", + "name": "Gembrain", + "display_name": "Gembrain", "modalities": { "input": [ "text", - "image", - "video", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 262144, + "output": 32768 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, "attachment": true, - "open_weights": false, - "release_date": "2026-08-03", - "last_updated": "2026-08-03", + "open_weights": true, + "release_date": "2026-07-29", + "last_updated": "2026-07-29", "type": "chat" }, { - "id": "DeepSeek-V4-Pro", - "name": "DeepSeek V4 Pro", - "display_name": "DeepSeek V4 Pro", + "id": "Gemma-4-31B-Gembrain-uncensored-heretic", + "name": "Gemma 4 31B Gembrain Uncensored Heretic", + "display_name": "Gemma 4 31B Gembrain Uncensored Heretic", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 262144, + "output": 262144 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -146705,40 +143904,26 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", "effort_options": [ - "low", - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." + "none", + "high" ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "release_date": "2026-05-15", + "last_updated": "2026-05-15", "type": "chat" }, { - "id": "Kimi-K2.7-Code", - "name": "Kimi K2.7 Code", - "display_name": "Kimi K2.7 Code", + "id": "gemma-4-31b-it-garnet", + "name": "Garnet", + "display_name": "Garnet", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" @@ -146746,50 +143931,39 @@ }, "limit": { "context": 262144, - "output": 262144 + "output": 32768 }, - "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-06-12", - "last_updated": "2026-06-12", + "release_date": "2026-07-29", + "last_updated": "2026-07-29", "type": "chat" }, { - "id": "Kimi-K2.5", - "name": "Kimi K2.5", - "display_name": "Kimi K2.5", + "id": "gemini-2.5-pro", + "name": "Gemini 2.5 Pro", + "display_name": "Gemini 2.5 Pro", "modalities": { "input": [ "text", - "image" + "image", + "video", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1048576, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -146798,25 +143972,33 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": true, + "mode": "budget", + "budget": { + "default": -1, + "min": 128, + "max": 32768, + "auto": -1, + "unit": "tokens" + }, "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" + "thought_signatures" ] } }, "attachment": true, - "open_weights": true, + "open_weights": false, "knowledge": "2025-01", - "release_date": "2026-01-27", - "last_updated": "2026-01-27", + "release_date": "2025-06-17", + "last_updated": "2025-06-17", "type": "chat" }, { - "id": "DeepSeek-V4-Flash-0731", - "name": "DeepSeek V4 Flash 0731", - "display_name": "DeepSeek V4 Flash 0731", + "id": "phi-4-mini-instruct", + "name": "Phi 4 Mini", + "display_name": "Phi 4 Mini", "modalities": { "input": [ "text" @@ -146826,85 +144008,56 @@ ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 128000, + "output": 16384 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "high", - "max" - ] - } + "supported": false }, "attachment": false, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-07-31", - "last_updated": "2026-07-31", + "knowledge": "2024-06", + "release_date": "2025-02-26", + "last_updated": "2025-02-26", "type": "chat" }, { - "id": "GLM-5.1", - "name": "GLM-5.1", - "display_name": "GLM-5.1", + "id": "gemma-4-12b-it-station-keeper", + "name": "Gemma 4 12B StationKeeper", + "display_name": "Gemma 4 12B StationKeeper", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 131072 + "context": 131072, + "output": 32768 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-04-07", - "last_updated": "2026-04-07", + "release_date": "2026-09-09", + "last_updated": "2026-09-09", "type": "chat" }, { - "id": "Qwen3.8-Flash", - "name": "Qwen3.8 Flash", - "display_name": "Qwen3.8 Flash", + "id": "glm-4-long", + "name": "GLM-4 Long", + "display_name": "GLM-4 Long", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" @@ -146912,35 +144065,22 @@ }, "limit": { "context": 1000000, - "output": 131072 + "output": 4095 }, - "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", + "release_date": "2024-01-01", + "last_updated": "2024-08-01", "type": "chat" }, { - "id": "GLM-5.3", - "name": "GLM-5.3", - "display_name": "GLM-5.3", + "id": "auto-model-standard", + "name": "Auto model (Standard)", + "display_name": "Auto model (Standard)", "modalities": { "input": [ "text" @@ -146951,35 +144091,22 @@ }, "limit": { "context": 1000000, - "output": 131072 + "output": 1000000 }, - "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": false, - "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "open_weights": false, + "release_date": "2025-04-16", + "last_updated": "2024-06-01", "type": "chat" }, { - "id": "DeepSeek-V4.1-Flash", - "name": "DeepSeek V4.1 Flash", - "display_name": "DeepSeek V4.1 Flash", + "id": "universal-summarizer", + "name": "Universal Summarizer", + "display_name": "Universal Summarizer", "modalities": { "input": [ "text" @@ -146989,41 +144116,23 @@ ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 32768, + "output": 32768 }, - "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "high", - "max" - ] - } + "supported": false }, "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-09-10", - "last_updated": "2026-09-10", + "open_weights": false, + "release_date": "2025-12-23", + "last_updated": "2024-01-01", "type": "chat" }, { - "id": "GLM-5.2", - "name": "GLM-5.2", - "display_name": "GLM-5.2", + "id": "doubao-seed-2-0-code-preview-260215", + "name": "Doubao Seed 2.0 Code Preview", + "display_name": "Doubao Seed 2.0 Code Preview", "modalities": { "input": [ "text" @@ -147033,53 +144142,39 @@ ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 256000, + "output": 128000 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": false, - "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "open_weights": false, + "release_date": "2026-02-14", + "last_updated": "2026-02-14", "type": "chat" }, { - "id": "GLM-5.3-Flash", - "name": "GLM-5.3-Flash", - "display_name": "GLM-5.3-Flash", + "id": "gemini-2.5-pro-exp-03-25", + "name": "Gemini 2.5 Pro Experimental 0325", + "display_name": "Gemini 2.5 Pro Experimental 0325", "modalities": { "input": [ "text", "image", - "video", - "pdf" + "audio" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 1048576, + "output": 65536 }, - "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true @@ -147087,27 +144182,38 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": true, + "mode": "budget", + "budget": { + "default": -1, + "min": 128, + "max": 32768, + "auto": -1, + "unit": "tokens" + }, "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" + "thought_signatures" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", + "open_weights": false, + "release_date": "2025-03-25", + "last_updated": "2025-03-25", "type": "chat" }, { - "id": "MiniMax-M3", - "name": "MiniMax-M3", - "display_name": "MiniMax-M3", + "id": "gemini-2.5-flash-lite-preview-09-2025", + "name": "Gemini 2.5 Flash Lite Preview (09/2025)", + "display_name": "Gemini 2.5 Flash Lite Preview (09/2025)", "modalities": { "input": [ - "text" + "text", + "image", + "audio", + "pdf" ], "output": [ "text" @@ -147115,35 +144221,44 @@ }, "limit": { "context": 1048576, - "output": 512000 + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "default": -1, + "min": 512, + "max": 24576, + "auto": -1, + "unit": "tokens" + }, "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" + "thought_signatures" ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-06-01", - "last_updated": "2026-06-01", + "attachment": true, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2025-09-25", + "last_updated": "2025-09-25", "type": "chat" }, { - "id": "MiniMax-M2.5", - "name": "MiniMax-M2.5", - "display_name": "MiniMax-M2.5", + "id": "auto-model", + "name": "Auto model", + "display_name": "Auto model", "modalities": { "input": [ "text" @@ -147153,99 +144268,49 @@ ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 1000000, + "output": 1000000 }, - "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": false, - "open_weights": true, - "release_date": "2026-02-12", - "last_updated": "2026-02-12", + "open_weights": false, + "release_date": "2025-04-16", + "last_updated": "2024-06-01", "type": "chat" - } - ] - }, - "ainetcafe": { - "id": "ainetcafe", - "name": "ainetcafe", - "display_name": "ainetcafe", - "api": "https://microquickjs.com/v1", - "doc": "https://ainetcafe.com/k3/guides/", - "models": [ + }, { - "id": "Kimi-K3", - "name": "Kimi K3", - "display_name": "Kimi K3", + "id": "fastgpt", + "name": "Web Answer", + "display_name": "Web Answer", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, + "context": 32768, "output": 32768 }, - "temperature": false, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "low", - "high", - "max" - ] - } + "supported": false }, - "attachment": true, - "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-16", + "attachment": false, + "open_weights": false, + "release_date": "2025-12-23", + "last_updated": "2024-01-01", "type": "chat" - } - ] - }, - "alibaba": { - "id": "alibaba", - "name": "alibaba", - "display_name": "alibaba", - "api": "https://dashscope-intl.aliyuncs.com/compatible-mode/v1", - "doc": "https://www.alibabacloud.com/help/en/model-studio/models", - "models": [ + }, { - "id": "qwen3-next-80b-a3b-instruct", - "name": "Qwen3 Next 80B A3B Instruct", - "display_name": "Qwen3 Next 80B A3B Instruct", + "id": "mistral-code-latest", + "name": "Mistral Code Latest", + "display_name": "Mistral Code Latest", "modalities": { "input": [ "text" @@ -147255,25 +144320,23 @@ ] }, "limit": { - "context": 131072, + "context": 256000, "output": 32768 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": false }, "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-09", - "last_updated": "2025-09", + "open_weights": false, + "release_date": "2026-06-02", + "last_updated": "2026-06-02", "type": "chat" }, { - "id": "qwen3-coder-30b-a3b-instruct", - "name": "Qwen3-Coder 30B-A3B Instruct", - "display_name": "Qwen3-Coder 30B-A3B Instruct", + "id": "doubao-seed-2-0-mini-260215", + "name": "Doubao Seed 2.0 Mini", + "display_name": "Doubao Seed 2.0 Mini", "modalities": { "input": [ "text" @@ -147283,41 +144346,40 @@ ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 256000, + "output": 32000 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-04", - "last_updated": "2025-04", + "open_weights": false, + "release_date": "2026-02-14", + "last_updated": "2026-02-14", "type": "chat" }, { - "id": "qwen3.5-397b-a17b", - "name": "Qwen3.5 397B-A17B", - "display_name": "Qwen3.5 397B-A17B", + "id": "gemini-2.5-pro-preview-06-05", + "name": "Gemini 2.5 Pro Preview 0605", + "display_name": "Gemini 2.5 Pro Preview 0605", "modalities": { "input": [ "text", "image", - "video" + "audio" ], "output": [ "text" ] }, "limit": { - "context": 262144, + "context": 1048576, "output": 65536 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true @@ -147325,37 +144387,44 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "default_enabled": true, + "mode": "budget", + "budget": { + "default": -1, + "min": 128, + "max": 32768, + "auto": -1, + "unit": "tokens" + }, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-02-15", - "last_updated": "2026-02-15", + "open_weights": false, + "knowledge": "2025-01-31", + "release_date": "2025-06-05", + "last_updated": "2025-06-05", "type": "chat" }, { - "id": "qwen3.6-35b-a3b", - "name": "Qwen3.6 35B-A3B", - "display_name": "Qwen3.6 35B-A3B", + "id": "sarvam-105b", + "name": "Sarvam 105B", + "display_name": "Sarvam 105B", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 131072, + "output": 4096 }, "temperature": true, "tool_call": true, @@ -147365,67 +144434,107 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "low", + "medium", + "high" ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-04-17", - "last_updated": "2026-04-17", + "release_date": "2026-02-18", + "last_updated": "2026-02-18", "type": "chat" }, { - "id": "qwen3.7-plus", - "name": "Qwen3.7 Plus", - "display_name": "Qwen3.7 Plus", + "id": "command-a-reasoning-08-2025", + "name": "Cohere Command A (08/2025)", + "display_name": "Cohere Command A (08/2025)", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 256000, + "output": 8192 }, "temperature": true, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "knowledge": "2024-06-01", + "release_date": "2025-08-21", + "last_updated": "2025-08-21", + "type": "chat" + }, + { + "id": "holo3-35b-a3b:thinking", + "name": "Holo3-35B-A3B Thinking", + "display_name": "Holo3-35B-A3B Thinking", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 65536, + "output": 8192 + }, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "attachment": true, + "open_weights": true, + "release_date": "2024-01-01", + "last_updated": "2024-01-01", + "type": "chat" + }, + { + "id": "kimi-k2-instruct-fast", + "name": "Kimi K2 0711 Fast", + "display_name": "Kimi K2 0711 Fast", + "modalities": { + "input": [ + "text", + "pdf" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 131072, + "output": 16384 + }, + "temperature": true, + "tool_call": false, + "reasoning": { + "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2025-04", - "release_date": "2026-06-02", - "last_updated": "2026-06-04", + "open_weights": true, + "release_date": "2025-07-11", + "last_updated": "2025-07-11", "type": "chat" }, { - "id": "qwen-max", - "name": "Qwen Max", - "display_name": "Qwen Max", + "id": "mercury-2", + "name": "Mercury 2", + "display_name": "Mercury 2", "modalities": { "input": [ "text" @@ -147435,31 +144544,25 @@ ] }, "limit": { - "context": 32768, - "output": 8192 + "context": 128000, + "output": 50000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false - }, - "search": { "supported": true, - "default": false, - "forced_search": false, - "search_strategy": "turbo" + "default": true }, "attachment": false, "open_weights": false, - "knowledge": "2024-04", - "release_date": "2024-04-03", - "last_updated": "2025-01-25", + "release_date": "2026-02-24", + "last_updated": "2026-02-24", "type": "chat" }, { - "id": "qwen-mt-turbo", - "name": "Qwen Mt Turbo", - "display_name": "Qwen Mt Turbo", + "id": "doubao-seed-2-0-pro-260215", + "name": "Doubao Seed 2.0 Pro", + "display_name": "Doubao Seed 2.0 Pro", "modalities": { "input": [ "text" @@ -147469,30 +144572,28 @@ ] }, "limit": { - "context": 16384, - "output": 8192 + "context": 256000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": false, "reasoning": { "supported": false }, "attachment": false, "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-01", - "last_updated": "2025-01", + "release_date": "2026-02-14", + "last_updated": "2026-02-14", "type": "chat" }, { - "id": "qwen3.5-35b-a3b", - "name": "Qwen3.5 35B-A3B", - "display_name": "Qwen3.5 35B-A3B", + "id": "Qwen3.5-27B-Blossom-V6.4-Derestricted", + "name": "Qwen3.5 27B Blossom V6.4 Derestricted", + "display_name": "Qwen3.5 27B Blossom V6.4 Derestricted", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" @@ -147500,9 +144601,8 @@ }, "limit": { "context": 262144, - "output": 65536 + "output": 262144 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -147516,19 +144616,23 @@ "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "effort_options": [ + "none", + "high" ] } }, "attachment": true, "open_weights": true, - "release_date": "2026-02-23", - "last_updated": "2026-02-23", + "release_date": "2026-05-15", + "last_updated": "2026-05-15", "type": "chat" }, { - "id": "qwen-vl-ocr", - "name": "Qwen Vl Ocr", - "display_name": "Qwen Vl Ocr", + "id": "Gemma-4-31B-Dark-Gemistry", + "name": "Gemma 4 31B Dark Gemistry", + "display_name": "Gemma 4 31B Dark Gemistry", "modalities": { "input": [ "text", @@ -147539,25 +144643,32 @@ ] }, "limit": { - "context": 34096, - "output": 4096 + "context": 262144, + "output": 262144 }, - "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": false, - "knowledge": "2024-04", - "release_date": "2024-10-28", - "last_updated": "2025-04-13", + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "high" + ] + } + }, + "attachment": true, + "open_weights": true, + "release_date": "2026-05-15", + "last_updated": "2026-05-15", "type": "chat" }, { - "id": "qwen3.6-max-preview", - "name": "Qwen3.6 Max Preview", - "display_name": "Qwen3.6 Max Preview", + "id": "claw-medium", + "name": "Claw Medium", + "display_name": "Claw Medium", "modalities": { "input": [ "text" @@ -147567,10 +144678,9 @@ ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 1048576, + "output": 131072 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -147578,42 +144688,36 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "low", + "high", + "max" ] } }, "attachment": false, "open_weights": false, - "knowledge": "2025-04", - "release_date": "2026-04-20", - "last_updated": "2026-04-20", + "release_date": "2026-05-11", + "last_updated": "2026-05-11", "type": "chat" }, { - "id": "qwen3.8-max", - "name": "Qwen3.8 Max", - "display_name": "Qwen3.8 Max", + "id": "Gemma-4-31B-GarnetV2", + "name": "Gemma 4 31B Garnet V2", + "display_name": "Gemma 4 31B Garnet V2", "modalities": { "input": [ "text", - "image", - "video", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 262144, + "output": 16384 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -147621,74 +144725,50 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "budget": { - "min": 0, - "max": 262144, - "unit": "tokens" - }, - "effort": "xhigh", "effort_options": [ "none", - "low", - "medium", - "xhigh" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Prefer reasoning_effort; thinking_budget is an alternative, not an additional control.", - "Omitting both controls differs from explicitly selecting xhigh, which maps to 262144 budget tokens." - ], - "budget_exclusive_with_effort": true + "high" + ] } }, "attachment": true, - "open_weights": false, - "release_date": "2026-08-03", - "last_updated": "2026-08-03", + "open_weights": true, + "release_date": "2026-05-01", + "last_updated": "2026-05-01", "type": "chat" }, { - "id": "qvq-max", - "name": "QVQ Max", - "display_name": "QVQ Max", + "id": "gemini-exp-1206", + "name": "Gemini 2.0 Pro 1206", + "display_name": "Gemini 2.0 Pro 1206", "modalities": { "input": [ "text", - "image" + "image", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 131072, + "context": 2097152, "output": 8192 }, - "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-03-25", - "last_updated": "2025-03-25", + "release_date": "2024-12-06", + "last_updated": "2024-12-06", "type": "chat" }, { - "id": "qwen3-235b-a22b", - "name": "Qwen3 235B A22B", - "display_name": "Qwen3 235B A22B", + "id": "asi1-mini", + "name": "ASI1 Mini", + "display_name": "ASI1 Mini", "modalities": { "input": [ "text" @@ -147698,44 +144778,26 @@ ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 128000, + "output": 16384 }, - "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": false, - "budget": { - "default": 81920, - "min": 0, - "max": 81920 - } - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-04", - "last_updated": "2025-04", + "open_weights": false, + "release_date": "2025-03-25", + "last_updated": "2025-03-25", "type": "chat" }, { - "id": "qwen3-asr-flash", - "name": "Qwen3-ASR Flash", - "display_name": "Qwen3-ASR Flash", + "id": "gemini-2.0-pro-reasoner", + "name": "Gemini 2.0 Pro Reasoner", + "display_name": "Gemini 2.0 Pro Reasoner", "modalities": { "input": [ + "text", "audio" ], "output": [ @@ -147743,53 +144805,59 @@ ] }, "limit": { - "context": 53248, - "output": 4096 + "context": 128000, + "output": 65536 }, - "temperature": false, "tool_call": false, "reasoning": { "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-09-08", - "last_updated": "2025-09-08" + "release_date": "2024-01-01", + "last_updated": "2025-02-05", + "type": "chat" }, { - "id": "qwen-vl-plus", - "name": "Qwen-VL Plus", - "display_name": "Qwen-VL Plus", + "id": "hermes-high", + "name": "Hermes High", + "display_name": "Hermes High", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 1048576, + "output": 131072 }, - "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "high", + "max" + ] + } + }, + "attachment": false, "open_weights": false, - "knowledge": "2024-04", - "release_date": "2024-01-25", - "last_updated": "2025-08-15", + "release_date": "2026-05-11", + "last_updated": "2026-05-11", "type": "chat" }, { - "id": "qwen3-coder-480b-a35b-instruct", - "name": "Qwen3-Coder 480B-A35B Instruct", - "display_name": "Qwen3-Coder 480B-A35B Instruct", + "id": "synth-2.5-pro", + "name": "Synth 2.5 Pro Preview", + "display_name": "Synth 2.5 Pro Preview", "modalities": { "input": [ "text" @@ -147799,39 +144867,35 @@ ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 30000, + "output": 30000 }, - "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-04", - "last_updated": "2025-04", + "open_weights": false, + "release_date": "2026-09-05", + "last_updated": "2026-09-05", "type": "chat" }, { - "id": "qwen3-vl-30b-a3b", - "name": "Qwen3-VL 30B-A3B", - "display_name": "Qwen3-VL 30B-A3B", + "id": "claw-low", + "name": "Claw Low", + "display_name": "Claw Low", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 1048576, + "output": 131072 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -147839,31 +144903,27 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "low", + "high", + "max" ] } }, - "attachment": true, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-04", - "last_updated": "2025-04", + "attachment": false, + "open_weights": false, + "release_date": "2026-05-11", + "last_updated": "2026-05-11", "type": "chat" }, { - "id": "qwen3.5-27b", - "name": "Qwen3.5 27B", - "display_name": "Qwen3.5 27B", + "id": "Gemma-4-31B-Agares-v1", + "name": "Gemma 4 31B Agares v1", + "display_name": "Gemma 4 31B Agares v1", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" @@ -147871,9 +144931,8 @@ }, "limit": { "context": 262144, - "output": 65536 + "output": 262144 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -147881,41 +144940,37 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "none", + "high" ] } }, "attachment": true, "open_weights": true, - "release_date": "2026-02-23", - "last_updated": "2026-02-23", + "release_date": "2026-05-15", + "last_updated": "2026-05-15", "type": "chat" }, { - "id": "qwen3.5-plus", - "name": "Qwen3.5 Plus", - "display_name": "Qwen3.5 Plus", + "id": "gemini-2.5-flash-preview-04-17:thinking", + "name": "Gemini 2.5 Flash Preview Thinking", + "display_name": "Gemini 2.5 Flash Preview Thinking", "modalities": { "input": [ "text", "image", - "video" + "audio" ], "output": [ "text" ] }, "limit": { - "context": 1000000, + "context": 1048576, "output": 65536 }, - "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true @@ -147923,138 +144978,121 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": true, + "mode": "budget", + "budget": { + "default": -1, + "min": 0, + "max": 24576, + "auto": -1, + "off": 0, + "unit": "tokens" + }, "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" + "thought_signatures" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-04", - "release_date": "2026-02-16", - "last_updated": "2026-02-16", + "release_date": "2025-04-17", + "last_updated": "2025-04-17", "type": "chat" }, { - "id": "qwen3.5-flash", - "name": "Qwen3.5 Flash", - "display_name": "Qwen3.5 Flash", + "id": "doubao-seed-2-0-lite-260215", + "name": "Doubao Seed 2.0 Lite", + "display_name": "Doubao Seed 2.0 Lite", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 256000, + "output": 32000 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2026-02-23", - "last_updated": "2026-02-23", + "release_date": "2026-02-14", + "last_updated": "2026-02-14", "type": "chat" }, { - "id": "qwen3-livetranslate-flash-realtime", - "name": "Qwen3-LiveTranslate Flash Realtime", - "display_name": "Qwen3-LiveTranslate Flash Realtime", + "id": "longcat-2.0:thinking", + "name": "LongCat 2.0 Thinking", + "display_name": "LongCat 2.0 Thinking", "modalities": { "input": [ - "text", - "image", - "audio", - "video" + "text" ], "output": [ - "text", - "audio" + "text" ] }, "limit": { - "context": 53248, - "output": 4096 + "context": 1000000, + "output": 131072 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-09-22", - "last_updated": "2025-09-22" + "attachment": false, + "open_weights": true, + "release_date": "2026-06-30", + "last_updated": "2026-06-30", + "type": "chat" }, { - "id": "qwen3.7-flash", - "name": "Qwen3.7 Flash", - "display_name": "Qwen3.7 Flash", + "id": "Gemma-4-26B-A4B-MeroMero:thinking", + "name": "Gemma 4 26B A4B MeroMero Thinking", + "display_name": "Gemma 4 26B A4B MeroMero Thinking", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 262144, + "output": 32768 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, "attachment": true, - "open_weights": false, - "release_date": "2026-07-15", - "last_updated": "2026-07-15", + "open_weights": true, + "release_date": "2026-07-29", + "last_updated": "2026-08-26", "type": "chat" }, { - "id": "qwen3-14b", - "name": "Qwen3 14B", - "display_name": "Qwen3 14B", + "id": "deepseek-v3-0324", + "name": "DeepSeek Chat 0324", + "display_name": "DeepSeek Chat 0324", "modalities": { "input": [ "text" @@ -148064,57 +145102,37 @@ ] }, "limit": { - "context": 131072, + "context": 128000, "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true, - "budget": { - "default": 38912, - "min": 0, - "max": 38912 - } - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": false, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-04", - "last_updated": "2025-04", + "release_date": "2025-03-24", + "last_updated": "2025-03-24", "type": "chat" }, { - "id": "qwen3.6-plus", - "name": "Qwen3.6 Plus", - "display_name": "Qwen3.6 Plus", + "id": "Qwen3.5-27B-Queen-Derestricted", + "name": "Qwen3.5 27B Queen Derestricted", + "display_name": "Qwen3.5 27B Queen Derestricted", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 262144, + "output": 16384 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -148128,36 +145146,38 @@ "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "effort_options": [ + "none", + "high" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-04", - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "open_weights": true, + "release_date": "2026-04-30", + "last_updated": "2026-04-30", "type": "chat" }, { - "id": "qwen3.6-flash", - "name": "Qwen3.6 Flash", - "display_name": "Qwen3.6 Flash", + "id": "gemini-2.5-pro-preview-03-25", + "name": "Gemini 2.5 Pro Preview 0325", + "display_name": "Gemini 2.5 Pro Preview 0325", "modalities": { "input": [ "text", "image", - "video" + "audio" ], "output": [ "text" ] }, "limit": { - "context": 1000000, + "context": 1048576, "output": 65536 }, - "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true @@ -148165,42 +145185,47 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": true, + "mode": "budget", + "budget": { + "default": -1, + "min": 128, + "max": 32768, + "auto": -1, + "unit": "tokens" + }, "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" + "thought_signatures" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-04-27", - "last_updated": "2026-04-27", + "release_date": "2025-03-25", + "last_updated": "2025-03-25", "type": "chat" }, { - "id": "qwen3-omni-flash", - "name": "Qwen3-Omni Flash", - "display_name": "Qwen3-Omni Flash", + "id": "gemini-2.5-flash-preview-04-17", + "name": "Gemini 2.5 Flash Preview", + "display_name": "Gemini 2.5 Flash Preview", "modalities": { "input": [ "text", "image", - "audio", - "video" + "audio" ], "output": [ - "text", - "audio" + "text" ] }, "limit": { - "context": 65536, - "output": 16384 + "context": 1048576, + "output": 65536 }, - "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true @@ -148208,25 +145233,33 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": true, + "mode": "budget", + "budget": { + "default": -1, + "min": 0, + "max": 24576, + "auto": -1, + "off": 0, + "unit": "tokens" + }, "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" + "thought_signatures" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-09-15", - "last_updated": "2025-09-15", + "release_date": "2025-04-17", + "last_updated": "2025-04-17", "type": "chat" }, { - "id": "qwen3-coder-flash", - "name": "Qwen3 Coder Flash", - "display_name": "Qwen3 Coder Flash", + "id": "GLM-4.6-Derestricted-v5", + "name": "GLM 4.6 Derestricted v5", + "display_name": "GLM 4.6 Derestricted v5", "modalities": { "input": [ "text" @@ -148236,76 +145269,88 @@ ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 131072, + "output": 8192 }, - "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "high" + ] + } }, "attachment": false, - "open_weights": false, - "knowledge": "2025-04", - "release_date": "2025-07-28", - "last_updated": "2025-07-28", + "open_weights": true, + "release_date": "2025-12-23", + "last_updated": "2025-12-23", "type": "chat" }, { - "id": "qwen-turbo", - "name": "Qwen Turbo", - "display_name": "Qwen Turbo", + "id": "gemma-4-26b-a4b-it-chimeraxheretic", + "name": "Gemma 4 26B A4B Chimera X Heretic", + "display_name": "Gemma 4 26B A4B Chimera X Heretic", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 16384 + "context": 262144, + "output": 32768 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false, - "budget": { - "default": 38912, - "min": 0, - "max": 38912 - } + "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "attachment": true, + "open_weights": true, + "release_date": "2026-10-08", + "last_updated": "2026-10-08", + "type": "chat" + }, + { + "id": "gemma-4-31b-it-fabled", + "name": "Fabled", + "display_name": "Fabled", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] }, - "search": { + "limit": { + "context": 262144, + "output": 32768 + }, + "tool_call": true, + "reasoning": { "supported": true, - "default": false, - "forced_search": false, - "search_strategy": "turbo" + "default": true }, - "attachment": false, - "open_weights": false, - "knowledge": "2024-04", - "release_date": "2024-11-01", - "last_updated": "2025-04-28", + "attachment": true, + "open_weights": true, + "release_date": "2026-07-29", + "last_updated": "2026-07-29", "type": "chat" }, { - "id": "qwen3-max", - "name": "Qwen3 Max", - "display_name": "Qwen3 Max", + "id": "hermes-medium", + "name": "Hermes Medium", + "display_name": "Hermes Medium", "modalities": { "input": [ "text" @@ -148315,49 +145360,46 @@ ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 1048576, + "output": 131072 }, - "temperature": true, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "low", + "high", + "max" ] } }, "attachment": false, "open_weights": false, - "knowledge": "2025-04", - "release_date": "2025-09-23", - "last_updated": "2025-09-23", + "release_date": "2026-05-11", + "last_updated": "2026-05-11", "type": "chat" }, { - "id": "deepseek-v4-flash-0731", - "name": "DeepSeek V4 Flash 0731", - "display_name": "DeepSeek V4 Flash 0731", + "id": "Gemma-4-31B-Gembrain-X-Core", + "name": "Gemma 4 31B Gembrain X Core", + "display_name": "Gemma 4 31B Gembrain X Core", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 262144, + "output": 262144 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -148365,31 +145407,22 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ - "low", - "high", - "max" + "none", + "high" ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-07-31", - "last_updated": "2026-07-31", + "release_date": "2026-05-15", + "last_updated": "2026-05-15", "type": "chat" }, { - "id": "qwen-plus-character-ja", - "name": "Qwen Plus Character (Japanese)", - "display_name": "Qwen Plus Character (Japanese)", + "id": "auto-model-premium", + "name": "Auto model (Premium)", + "display_name": "Auto model (Premium)", "modalities": { "input": [ "text" @@ -148399,58 +145432,50 @@ ] }, "limit": { - "context": 8192, - "output": 512 + "context": 1000000, + "output": 1000000 }, - "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, "attachment": false, "open_weights": false, - "knowledge": "2024-04", - "release_date": "2024-01", - "last_updated": "2024-01", + "release_date": "2025-04-16", + "last_updated": "2024-06-01", "type": "chat" }, { - "id": "qwen3.7-max", - "name": "Qwen3.7 Max", - "display_name": "Qwen3.7 Max", + "id": "gemma-4-26b-a4b-it-luminous", + "name": "Luminous Mirror", + "display_name": "Luminous Mirror", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 262144, + "output": 32768 }, - "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, - "attachment": false, - "open_weights": false, - "release_date": "2026-05-21", - "last_updated": "2026-05-21", + "attachment": true, + "open_weights": true, + "release_date": "2026-07-29", + "last_updated": "2026-07-29", "type": "chat" }, { - "id": "qwen3-32b", - "name": "Qwen3 32B", - "display_name": "Qwen3 32B", + "id": "phi-4-multimodal-instruct", + "name": "Phi 4 Multimodal", + "display_name": "Phi 4 Multimodal", "modalities": { "input": [ "text" @@ -148460,45 +145485,29 @@ ] }, "limit": { - "context": 131072, + "context": 128000, "output": 16384 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true, - "budget": { - "default": 38912, - "min": 0, - "max": 38912 - } - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": false, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-04", - "last_updated": "2025-04", + "knowledge": "2024-06", + "release_date": "2025-02-26", + "last_updated": "2025-02-26", "type": "chat" }, { - "id": "qwq-plus", - "name": "QwQ Plus", - "display_name": "QwQ Plus", + "id": "gemma-4-12b-it-starry-ocean", + "name": "Gemma 4 12B Starry Ocean", + "display_name": "Gemma 4 12B Starry Ocean", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" @@ -148506,47 +145515,31 @@ }, "limit": { "context": 131072, - "output": 8192 + "output": 131072 }, - "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, - "default": true, - "budget": { - "default": 32768, - "min": 0, - "max": 32768 - } + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "none", + "high" ] } }, - "search": { - "supported": true, - "default": false, - "forced_search": false, - "search_strategy": "turbo" - }, - "attachment": false, - "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-03-05", - "last_updated": "2025-03-05", + "attachment": true, + "open_weights": true, + "release_date": "2026-10-15", + "last_updated": "2026-10-15", "type": "chat" }, { - "id": "kimi-k3", - "name": "Kimi K3", - "display_name": "Kimi K3", + "id": "Gemma-4-31B-Isometry-RP", + "name": "Gemma 4 31B Isometry RP", + "display_name": "Gemma 4 31B Isometry RP", "modalities": { "input": [ "text", @@ -148557,10 +145550,9 @@ ] }, "limit": { - "context": 1048576, - "output": 1048576 + "context": 262144, + "output": 262144 }, - "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -148568,35 +145560,52 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ - "low", - "high", - "max" + "none", + "high" ] } }, "attachment": true, "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-16", + "release_date": "2026-05-15", + "last_updated": "2026-05-15", "type": "chat" }, { - "id": "qwen3.6-27b", - "name": "Qwen3.6 27B", - "display_name": "Qwen3.6 27B", + "id": "auto-model-basic", + "name": "Auto model (Basic)", + "display_name": "Auto model (Basic)", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1000000, + "output": 1000000 + }, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": false, + "release_date": "2025-04-16", + "last_updated": "2024-06-01", + "type": "chat" + }, + { + "id": "Gemma-4-31B-K1-v5", + "name": "Gemma 4 31B K1 v5", + "display_name": "Gemma 4 31B K1 v5", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" @@ -148604,9 +145613,8 @@ }, "limit": { "context": 262144, - "output": 65536 + "output": 262144 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -148614,25 +145622,22 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "none", + "high" ] } }, "attachment": true, "open_weights": true, - "release_date": "2026-04-22", - "last_updated": "2026-04-22", + "release_date": "2026-05-02", + "last_updated": "2026-05-02", "type": "chat" }, { - "id": "qwen3-vl-plus", - "name": "Qwen3 VL Plus", - "display_name": "Qwen3 VL Plus", + "id": "Gemma-4-31B-Cognitive-Unshackled", + "name": "Gemma 4 31B Cognitive Unshackled", + "display_name": "Gemma 4 31B Cognitive Unshackled", "modalities": { "input": [ "text", @@ -148644,41 +145649,31 @@ }, "limit": { "context": 262144, - "output": 32768 + "output": 16384 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false, - "budget": { - "default": 81920, - "min": 0, - "max": 81920 - } + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "none", + "high" ] } }, - "attachment": false, - "open_weights": false, - "knowledge": "2025-04", - "release_date": "2025-09-23", - "last_updated": "2025-09-23", + "attachment": true, + "open_weights": true, + "release_date": "2026-05-01", + "last_updated": "2026-05-01", "type": "chat" }, { - "id": "qwen3-vl-235b-a22b", - "name": "Qwen3-VL 235B-A22B", - "display_name": "Qwen3-VL 235B-A22B", + "id": "Gemma-4-31B-MeroMero-v2:thinking", + "name": "Gemma 4 31B MeroMero v2 Thinking", + "display_name": "Gemma 4 31B MeroMero v2 Thinking", "modalities": { "input": [ "text", @@ -148689,118 +145684,104 @@ ] }, "limit": { - "context": 131072, + "context": 262144, "output": 32768 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, "attachment": true, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-04", - "last_updated": "2025-04", + "release_date": "2026-07-29", + "last_updated": "2026-08-24", "type": "chat" }, { - "id": "qwen-omni-turbo-realtime", - "name": "Qwen-Omni Turbo Realtime", - "display_name": "Qwen-Omni Turbo Realtime", + "id": "gemma-4-31b-it-darkidol", + "name": "DarkIdol", + "display_name": "DarkIdol", "modalities": { "input": [ "text", - "image", - "audio" + "image" ], "output": [ - "text", - "audio" + "text" ] }, "limit": { - "context": 32768, - "output": 2048 + "context": 262144, + "output": 32768 }, - "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": true, - "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-05-08", - "last_updated": "2025-05-08" + "open_weights": true, + "release_date": "2026-07-29", + "last_updated": "2026-07-29", + "type": "chat" }, { - "id": "qwen-flash", - "name": "Qwen Flash", - "display_name": "Qwen Flash", + "id": "gemini-2.5-flash", + "name": "Gemini 2.5 Flash", + "display_name": "Gemini 2.5 Flash", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 32768 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false, - "budget": { - "default": 81920, - "min": 0, - "max": 81920 - } + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": true, + "mode": "budget", + "budget": { + "default": -1, + "min": 0, + "max": 24576, + "auto": -1, + "off": 0, + "unit": "tokens" + }, "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" + "thought_signatures" ] } }, - "search": { - "supported": true, - "default": false, - "forced_search": false, - "search_strategy": "turbo" - }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-07-28", - "last_updated": "2025-07-28", + "knowledge": "2025-01", + "release_date": "2025-06-17", + "last_updated": "2025-06-17", "type": "chat" }, { - "id": "qwen-mt-plus", - "name": "Qwen Mt Plus", - "display_name": "Qwen Mt Plus", + "id": "pokee-isaac", + "name": "Pokee-Isaac 28B", + "display_name": "Pokee-Isaac 28B", "modalities": { "input": [ "text" @@ -148810,47 +145791,69 @@ ] }, "limit": { - "context": 16384, - "output": 8192 + "context": 10000000, + "output": 60000 }, - "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": false, "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-01", - "last_updated": "2025-01", + "release_date": "2026-08-04", + "last_updated": "2026-08-04", "type": "chat" }, { - "id": "qwen3-next-80b-a3b-thinking", - "name": "Qwen3 Next 80B A3B Thinking", - "display_name": "Qwen3 Next 80B A3B Thinking", + "id": "gemma-4-26b-a4b-it-opusdistill", + "name": "Opus Distill", + "display_name": "Opus Distill", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 131072, + "context": 262144, "output": 32768 }, - "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, - "default": true, - "budget": { - "default": 81920, - "min": 0, - "max": 81920 - } + "default": true + }, + "attachment": true, + "open_weights": true, + "release_date": "2026-07-29", + "last_updated": "2026-07-29", + "type": "chat" + }, + { + "id": "Qwen3.5-27B-Claude-4.6-Opus-Reasoning-Distilled-Derestricted-Lite", + "name": "Qwen3.5 27B Claude 4.6 Opus Reasoning Distilled Derestricted Lite", + "display_name": "Qwen3.5 27B Claude 4.6 Opus Reasoning Distilled Derestricted Lite", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 262144, + "output": 262144 + }, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { @@ -148860,84 +145863,72 @@ "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "effort_options": [ + "none", + "high" ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-09", - "last_updated": "2025-09", + "release_date": "2026-05-15", + "last_updated": "2026-05-15", "type": "chat" }, { - "id": "qwen-plus", - "name": "Qwen Plus", - "display_name": "Qwen Plus", + "id": "Gemma-4-31B-Claude-4.6-Opus-Reasoning-Distilled", + "name": "Gemma 4 31B Claude 4.6 Opus Reasoning Distilled", + "display_name": "Gemma 4 31B Claude 4.6 Opus Reasoning Distilled", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 32768 + "context": 262144, + "output": 16384 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false, - "budget": { - "default": 81920, - "min": 0, - "max": 81920 - } + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "none", + "high" ] } }, - "search": { - "supported": true, - "default": false, - "forced_search": false, - "search_strategy": "turbo" - }, - "attachment": false, - "open_weights": false, - "knowledge": "2024-04", - "release_date": "2024-01-25", - "last_updated": "2025-09-11", + "attachment": true, + "open_weights": true, + "release_date": "2026-05-01", + "last_updated": "2026-05-01", "type": "chat" }, { - "id": "glm-5.2", - "name": "GLM-5.2", - "display_name": "GLM-5.2", + "id": "Gemma-4-31B-DarkIdol", + "name": "Gemma 4 31B DarkIdol", + "display_name": "Gemma 4 31B DarkIdol", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 262144, + "output": 16384 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -148945,98 +145936,83 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ - "high", - "max" + "none", + "high" ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "release_date": "2026-05-01", + "last_updated": "2026-05-01", "type": "chat" }, { - "id": "qwen-omni-turbo", - "name": "Qwen-Omni Turbo", - "display_name": "Qwen-Omni Turbo", + "id": "qwen3-vl-235b-a22b-instruct-original", + "name": "Qwen3 VL 235B A22B Instruct Original", + "display_name": "Qwen3 VL 235B A22B Instruct Original", "modalities": { "input": [ "text", - "image", - "audio", - "video" + "image" ], "output": [ - "text", - "audio" + "text" ] }, "limit": { "context": 32768, - "output": 2048 + "output": 32768 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-01-19", - "last_updated": "2025-03-26", + "open_weights": true, + "knowledge": "2025-03-31", + "release_date": "2025-09-23", + "last_updated": "2025-09-23", "type": "chat" }, { - "id": "qwen2-5-omni-7b", - "name": "Qwen2.5-Omni 7B", - "display_name": "Qwen2.5-Omni 7B", + "id": "gemma-4-26b-a4b-it-darksoul", + "name": "Dark Soul", + "display_name": "Dark Soul", "modalities": { "input": [ "text", - "image", - "audio", - "video" + "image" ], "output": [ - "text", - "audio" + "text" ] }, "limit": { - "context": 32768, - "output": 2048 + "context": 262144, + "output": 32768 }, - "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": true, "open_weights": true, - "knowledge": "2024-04", - "release_date": "2024-12", - "last_updated": "2024-12", + "release_date": "2026-07-29", + "last_updated": "2026-07-29", "type": "chat" }, { - "id": "qwen3.5-122b-a10b", - "name": "Qwen3.5 122B-A10B", - "display_name": "Qwen3.5 122B-A10B", + "id": "gemma-4-31b-it-isometry", + "name": "Isometry", + "display_name": "Isometry", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" @@ -149044,35 +146020,23 @@ }, "limit": { "context": 262144, - "output": 65536 + "output": 32768 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, "attachment": true, "open_weights": true, - "release_date": "2026-02-23", - "last_updated": "2026-02-23", + "release_date": "2026-07-29", + "last_updated": "2026-07-29", "type": "chat" }, { - "id": "qwen3-8b", - "name": "Qwen3 8B", - "display_name": "Qwen3 8B", + "id": "celeris-1", + "name": "Celeris 1", + "display_name": "Celeris 1", "modalities": { "input": [ "text" @@ -149082,114 +146046,90 @@ ] }, "limit": { - "context": 131072, + "context": 8192, "output": 8192 }, - "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true, - "budget": { - "default": 38912, - "min": 0, - "max": 38912 - } - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-04", - "last_updated": "2025-04", + "open_weights": false, + "release_date": "2026-07-25", + "last_updated": "2026-07-25", "type": "chat" }, { - "id": "qwen3-coder-plus", - "name": "Qwen3 Coder Plus", - "display_name": "Qwen3 Coder Plus", + "id": "Gemma-4-26B-A4B-MeroMero", + "name": "Gemma 4 26B A4B MeroMero", + "display_name": "Gemma 4 26B A4B MeroMero", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 262144, + "output": 32768 }, - "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-07-23", - "last_updated": "2025-07-23", + "release_date": "2026-07-29", + "last_updated": "2026-08-26", "type": "chat" }, { - "id": "qwen-vl-max", - "name": "Qwen-VL Max", - "display_name": "Qwen-VL Max", + "id": "mistral-code-agent-latest", + "name": "Mistral Code Agent Latest", + "display_name": "Mistral Code Agent Latest", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 262144, + "output": 32768 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-04", - "release_date": "2024-04-08", - "last_updated": "2025-08-13", + "attachment": false, + "open_weights": true, + "release_date": "2026-06-02", + "last_updated": "2026-06-02", "type": "chat" }, { - "id": "qwen3.8-flash", - "name": "Qwen3.8 Flash", - "display_name": "Qwen3.8 Flash", + "id": "Gemma-4-31B-AssGuard", + "name": "Gemma 4 31B AssGuard", + "display_name": "Gemma 4 31B AssGuard", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 262144, + "output": 262144 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -149197,92 +146137,63 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "budget": { - "min": 0, - "max": 262144, - "unit": "tokens" - }, - "effort": "xhigh", "effort_options": [ "none", - "low", - "medium", - "xhigh" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Prefer reasoning_effort; thinking_budget is an alternative, not an additional control.", - "Omitting both controls differs from explicitly selecting xhigh, which maps to 262144 budget tokens." - ], - "budget_exclusive_with_effort": true + "high" + ] } }, "attachment": true, - "open_weights": false, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", + "open_weights": true, + "release_date": "2026-05-15", + "last_updated": "2026-05-15", "type": "chat" }, { - "id": "qwen3-omni-flash-realtime", - "name": "Qwen3-Omni Flash Realtime", - "display_name": "Qwen3-Omni Flash Realtime", + "id": "nano-gpt-help", + "name": "NanoGPT Help", + "display_name": "NanoGPT Help", "modalities": { "input": [ - "text", - "image", - "audio", - "video" + "text" ], "output": [ - "text", - "audio" + "text" ] }, "limit": { - "context": 65536, - "output": 16384 + "context": 6000, + "output": 512 }, - "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-09-15", - "last_updated": "2025-09-15" + "release_date": "2026-06-06", + "last_updated": "2026-06-06", + "type": "chat" }, { - "id": "qwen3.8-omni-flash", - "name": "Qwen3.8 Omni Flash", - "display_name": "Qwen3.8 Omni Flash", + "id": "gemini-2.5-flash-preview-05-20", + "name": "Gemini 2.5 Flash 0520", + "display_name": "Gemini 2.5 Flash 0520", "modalities": { "input": [ "text", - "image", - "audio", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 1048000, + "output": 65536 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true @@ -149291,56 +146202,61 @@ "reasoning": { "supported": true, "default_enabled": true, - "mode": "effort", - "effort": "xhigh", - "effort_options": [ - "none", - "low", - "medium", - "xhigh" - ], - "interleaved": true, + "mode": "budget", + "budget": { + "default": -1, + "min": 0, + "max": 24576, + "auto": -1, + "off": 0, + "unit": "tokens" + }, "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" + "thought_signatures" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-09-17", - "last_updated": "2026-09-17", + "knowledge": "2025-01", + "release_date": "2025-05-20", + "last_updated": "2025-05-20", "type": "chat" }, { - "id": "qwen3-coder-plus-2025-09-23", - "name": "Qwen3 Coder Plus 2025 09 23", - "display_name": "Qwen3 Coder Plus 2025 09 23", + "id": "gemini-2.0-pro-exp-02-05", + "name": "Gemini 2.0 Pro 0205", + "display_name": "Gemini 2.0 Pro 0205", "modalities": { "input": [ - "text" + "text", + "image", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 2097152, + "output": 8192 }, - "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, - "attachment": false, + "attachment": true, + "open_weights": false, + "release_date": "2025-02-05", + "last_updated": "2025-02-05", "type": "chat" }, { - "id": "qwen3-coder-plus-2025-07-22", - "name": "Qwen3 Coder Plus 2025 07 22", - "display_name": "Qwen3 Coder Plus 2025 07 22", + "id": "claw-high", + "name": "Claw High", + "display_name": "Claw High", "modalities": { "input": [ "text" @@ -149350,21 +146266,33 @@ ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 1048576, + "output": 131072 }, - "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "high", + "max" + ] + } }, "attachment": false, + "open_weights": false, + "release_date": "2026-05-11", + "last_updated": "2026-05-11", "type": "chat" }, { - "id": "qwen-vl-ocr-latest", - "name": "Qwen Vl Ocr Latest", - "display_name": "Qwen Vl Ocr Latest", + "id": "holo3-35b-a3b", + "name": "Holo3-35B-A3B", + "display_name": "Holo3-35B-A3B", "modalities": { "input": [ "text", @@ -149375,21 +146303,24 @@ ] }, "limit": { - "context": 34096, - "output": 4096 + "context": 65536, + "output": 8192 }, - "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "attachment": true, + "open_weights": true, + "release_date": "2024-01-01", + "last_updated": "2024-01-01", "type": "chat" }, { - "id": "qvq-max-2025-05-15", - "name": "Qvq Max 2025 05 15", - "display_name": "Qvq Max 2025 05 15", + "id": "gemma-4-26b-a4b-it-chimerax", + "name": "Chimera X", + "display_name": "Chimera X", "modalities": { "input": [ "text", @@ -149400,27 +146331,24 @@ ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 262144, + "output": 32768 }, - "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, - "default": false, - "budget": { - "default": 16384, - "min": 0, - "max": 16384 - } + "default": true }, - "attachment": false, + "attachment": true, + "open_weights": true, + "release_date": "2026-07-29", + "last_updated": "2026-07-29", "type": "chat" }, { - "id": "qwen-long", - "name": "Qwen Long", - "display_name": "Qwen Long", + "id": "longcat-2.0", + "name": "LongCat 2.0", + "display_name": "LongCat 2.0", "modalities": { "input": [ "text" @@ -149431,185 +146359,163 @@ }, "limit": { "context": 1000000, - "output": 8192 + "output": 131072 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": false, + "open_weights": true, + "release_date": "2026-06-30", + "last_updated": "2026-06-30", "type": "chat" }, { - "id": "qwen-turbo-latest", - "name": "Qwen Turbo Latest", - "display_name": "Qwen Turbo Latest", + "id": "Gemma-4-31B-SDFT-Heretic-RP", + "name": "Gemma 4 31B SDFT Heretic RP", + "display_name": "Gemma 4 31B SDFT Heretic RP", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 16384 + "context": 262144, + "output": 262144 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false, - "budget": { - "default": 38912, - "min": 0, - "max": 38912 - } + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "none", + "high" ] } }, - "search": { - "supported": true, - "default": false, - "forced_search": false, - "search_strategy": "turbo" - }, - "attachment": false, - "type": "chat" - }, - { - "id": "qwen-turbo-2024-09-19", - "name": "Qwen Turbo 2024 09 19", - "display_name": "Qwen Turbo 2024 09 19", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 131072, - "output": 8192 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": false, + "attachment": true, + "open_weights": true, + "release_date": "2026-05-15", + "last_updated": "2026-05-15", "type": "chat" }, { - "id": "qwen-flash-2025-07-28", - "name": "Qwen Flash 2025 07 28", - "display_name": "Qwen Flash 2025 07 28", + "id": "gemini-2.5-flash-nothinking", + "name": "Gemini 2.5 Flash (No Thinking)", + "display_name": "Gemini 2.5 Flash (No Thinking)", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 32768 + "context": 1048576, + "output": 65536 }, - "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, - "default": false, - "budget": { - "default": 81920, - "min": 0, - "max": 81920 - } + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": true, + "mode": "budget", + "budget": { + "default": -1, + "min": 0, + "max": 24576, + "auto": -1, + "off": 0, + "unit": "tokens" + }, "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" + "thought_signatures" ] } }, - "search": { - "supported": true, - "default": false, - "forced_search": false, - "search_strategy": "turbo" - }, - "attachment": false, + "attachment": true, + "open_weights": false, + "release_date": "2025-06-05", + "last_updated": "2025-06-05", "type": "chat" }, { - "id": "qwen-plus-latest", - "name": "Qwen Plus Latest", - "display_name": "Qwen Plus Latest", + "id": "gemini-2.5-pro-preview-05-06", + "name": "Gemini 2.5 Pro Preview 0506", + "display_name": "Gemini 2.5 Pro Preview 0506", "modalities": { "input": [ - "text" + "text", + "image", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 32768 + "context": 1048576, + "output": 65536 }, - "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, - "default": false, - "budget": { - "default": 81920, - "min": 0, - "max": 81920 - } + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": true, + "mode": "budget", + "budget": { + "default": -1, + "min": 128, + "max": 32768, + "auto": -1, + "unit": "tokens" + }, "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" + "thought_signatures" ] } }, - "search": { - "supported": true, - "default": false, - "forced_search": false, - "search_strategy": "turbo" - }, - "attachment": false, + "attachment": true, + "open_weights": false, + "release_date": "2025-05-06", + "last_updated": "2025-05-06", "type": "chat" }, { - "id": "qwen-plus-2024-09-19", - "name": "Qwen Plus 2024 09 19", - "display_name": "Qwen Plus 2024 09 19", + "id": "mercury-coder-small", + "name": "Mercury Coder Small", + "display_name": "Mercury Coder Small", "modalities": { "input": [ "text" @@ -149619,90 +146525,76 @@ ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 32768, + "output": 16384 }, - "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, "attachment": false, + "open_weights": false, + "release_date": "2024-01-01", + "last_updated": "2024-01-01", "type": "chat" }, { - "id": "qwen-plus-2025-07-14", - "name": "Qwen Plus 2025 07 14", - "display_name": "Qwen Plus 2025 07 14", + "id": "Gemma-4-31B-Novelist", + "name": "Gemma 4 31B Novelist (ArliAI)", + "display_name": "Gemma 4 31B Novelist (ArliAI)", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 16384 + "context": 262144, + "output": 262144 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false, - "budget": { - "default": 38912, - "min": 0, - "max": 38912 - } + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "none", + "high" ] } }, - "search": { - "supported": true, - "default": false, - "forced_search": false, - "search_strategy": "turbo" - }, - "attachment": false, + "attachment": true, + "open_weights": true, + "release_date": "2026-05-15", + "last_updated": "2026-05-15", "type": "chat" }, { - "id": "qwen-plus-2025-09-11", - "name": "Qwen Plus 2025 09 11", - "display_name": "Qwen Plus 2025 09 11", + "id": "Qwen3.5-27B-BlueStar-v3-Derestricted", + "name": "Qwen3.5 27B BlueStar v3 Derestricted", + "display_name": "Qwen3.5 27B BlueStar v3 Derestricted", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 32768 + "context": 262144, + "output": 16384 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false, - "budget": { - "default": 81920, - "min": 0, - "max": 81920 - } + "default": true }, "extra_capabilities": { "reasoning": { @@ -149712,133 +146604,77 @@ "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "effort_options": [ + "none", + "high" ] } }, - "search": { - "supported": true, - "default": false, - "forced_search": false, - "search_strategy": "turbo" - }, - "attachment": false, - "type": "chat" - }, - { - "id": "qwen-max-latest", - "name": "Qwen Max Latest", - "display_name": "Qwen Max Latest", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 131072, - "output": 8192 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, - "search": { - "supported": true, - "default": false, - "forced_search": false, - "search_strategy": "turbo" - }, - "attachment": false, + "attachment": true, + "open_weights": true, + "release_date": "2026-04-30", + "last_updated": "2026-04-30", "type": "chat" }, { - "id": "qwen-max-2024-09-19", - "name": "Qwen Max 2024 09 19", - "display_name": "Qwen Max 2024 09 19", + "id": "gemini-2.5-flash-preview-09-2025-thinking", + "name": "Gemini 2.5 Flash Preview (09/2025) – Thinking", + "display_name": "Gemini 2.5 Flash Preview (09/2025) – Thinking", "modalities": { "input": [ - "text" + "text", + "image", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 32768, - "output": 8192 + "context": 1048576, + "output": 65536 }, - "temperature": true, "tool_call": true, "reasoning": { - "supported": false - }, - "search": { "supported": true, - "default": false, - "forced_search": false, - "search_strategy": "turbo" - }, - "attachment": false, - "type": "chat" - }, - { - "id": "qwen-max-2024-04-28", - "name": "Qwen Max 2024 04 28", - "display_name": "Qwen Max 2024 04 28", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 8000, - "output": 2000 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": false, - "type": "chat" - }, - { - "id": "qwen-max-2024-04-03", - "name": "Qwen Max 2024 04 03", - "display_name": "Qwen Max 2024 04 03", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 8000, - "output": 2000 + "default": true }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "budget", + "budget": { + "default": -1, + "min": 0, + "max": 24576, + "auto": -1, + "off": 0, + "unit": "tokens" + }, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] + } }, - "attachment": false, + "attachment": true, + "open_weights": false, + "release_date": "2025-09-25", + "last_updated": "2025-09-25", "type": "chat" }, { - "id": "qwen-max-2025-01-25", - "name": "Qwen Max 2025 01 25", - "display_name": "Qwen Max 2025 01 25", + "id": "gemma-4-12b-it", + "name": "Gemma 4 12B Instruct", + "display_name": "Gemma 4 12B Instruct", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" @@ -149846,391 +146682,418 @@ }, "limit": { "context": 131072, - "output": 8192 + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "search": { - "supported": true, - "default": false, - "forced_search": false, - "search_strategy": "turbo" - }, - "attachment": false, + "attachment": true, + "open_weights": true, + "release_date": "2026-06-09", + "last_updated": "2026-06-09", "type": "chat" }, { - "id": "qwen3-max-2025-09-23", - "name": "Qwen3 Max 20250923", - "display_name": "Qwen3 Max 20250923", + "id": "gemini-2.5-flash-preview-09-2025", + "name": "Gemini 2.5 Flash Preview (09/2025)", + "display_name": "Gemini 2.5 Flash Preview (09/2025)", "modalities": { "input": [ - "text" + "text", + "image", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, + "context": 1048576, "output": 65536 }, - "temperature": true, "tool_call": true, "reasoning": { - "supported": false - }, - "search": { "supported": true, - "default": false, - "forced_search": false, - "search_strategy": "turbo" + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "budget", + "budget": { + "default": -1, + "min": 0, + "max": 24576, + "auto": -1, + "off": 0, + "unit": "tokens" + }, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] + } + }, + "attachment": true, + "open_weights": false, + "release_date": "2025-09-25", + "last_updated": "2025-09-25", "type": "chat" }, { - "id": "qwen3-max-preview", - "name": "Qwen3 Max Preview", - "display_name": "Qwen3 Max Preview", + "id": "gemini-2.5-flash-preview-05-20:thinking", + "name": "Gemini 2.5 Flash 0520 Thinking", + "display_name": "Gemini 2.5 Flash 0520 Thinking", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, + "context": 1048000, "output": 65536 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": true, + "mode": "budget", + "budget": { + "default": -1, + "min": 0, + "max": 24576, + "auto": -1, + "off": 0, + "unit": "tokens" + }, "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" + "thought_signatures" ] } }, - "search": { - "supported": true, - "default": false, - "forced_search": false, - "search_strategy": "turbo" - }, - "attachment": false, + "attachment": true, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2025-05-20", + "last_updated": "2025-05-20", "type": "chat" }, { - "id": "qwen3-235b-a22b-thinking-2507", - "name": "Qwen3 235B A22B Thinking 2507", - "display_name": "Qwen3 235B A22B Thinking 2507", + "id": "gemini-3-pro-image-preview", + "name": "Gemini 3 Pro Image", + "display_name": "Gemini 3 Pro Image", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 131072, + "context": 65536, "output": 32768 }, "temperature": true, "tool_call": false, "reasoning": { "supported": true, - "default": true, - "budget": { - "default": 81920, - "min": 0, - "max": 81920 - } + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "low", + "high" + ], "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" + "thought_signatures" ] } }, - "attachment": false, + "attachment": true, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2025-11-20", + "last_updated": "2025-11-20", "type": "chat" }, { - "id": "qwen3-235b-a22b-instruct-2507", - "name": "Qwen3 235B A22B Instruct 2507", - "display_name": "Qwen3 235B A22B Instruct 2507", + "id": "gemma-4-31b-it-novelist", + "name": "Novelist", + "display_name": "Novelist", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 131072, + "context": 262144, "output": 32768 }, - "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "attachment": true, + "open_weights": true, + "release_date": "2026-07-29", + "last_updated": "2026-07-29", "type": "chat" }, { - "id": "qwen3-30b-a3b-instruct-2507", - "name": "Qwen3 30B A3B Instruct 2507", - "display_name": "Qwen3 30B A3B Instruct 2507", + "id": "Gemma-4-31B-Queen", + "name": "Gemma 4 31B Queen", + "display_name": "Gemma 4 31B Queen", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 262144, + "output": 16384 }, - "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "high" + ] + } + }, + "attachment": true, + "open_weights": true, + "release_date": "2026-05-01", + "last_updated": "2026-05-01", "type": "chat" }, { - "id": "qwen3-30b-a3b-thinking-2507", - "name": "Qwen3 30B A3B Thinking 2507", - "display_name": "Qwen3 30B A3B Thinking 2507", + "id": "agnes-3.0-flash", + "name": "Agnes 3.0 Flash", + "display_name": "Agnes 3.0 Flash", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 524288, + "output": 65536 }, - "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, - "default": true, - "budget": { - "default": 81920, - "min": 0, - "max": 81920 - } + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, - "attachment": false, + "attachment": true, + "open_weights": false, + "release_date": "2026-09-09", + "last_updated": "2026-09-09", "type": "chat" }, { - "id": "qwen3-30b-a3b", - "name": "Qwen3 30B A3B", - "display_name": "Qwen3 30B A3B", + "id": "gemini-2.5-flash-lite", + "name": "Gemini 2.5 Flash Lite", + "display_name": "Gemini 2.5 Flash Lite", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false, - "budget": { - "default": 81920, - "min": 0, - "max": 81920 - } + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "default": -1, + "min": 512, + "max": 24576, + "auto": -1, + "unit": "tokens" + }, "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" + "thought_signatures" ] } }, - "attachment": false, + "attachment": true, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2025-06-17", + "last_updated": "2025-06-17", "type": "chat" }, { - "id": "qwen3-4b", - "name": "Qwen3 4B", - "display_name": "Qwen3 4B", + "id": "Gemma-4-31B-MeroMero", + "name": "Gemma 4 31B MeroMero", + "display_name": "Gemma 4 31B MeroMero", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 262144, + "output": 262144 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true, - "budget": { - "default": 38912, - "min": 0, - "max": 38912 - } + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "none", + "high" ] } }, - "attachment": false, + "attachment": true, + "open_weights": true, + "release_date": "2026-05-02", + "last_updated": "2026-05-02", "type": "chat" }, { - "id": "qwen3-1.7b", - "name": "Qwen3 1.7B", - "display_name": "Qwen3 1.7B", + "id": "Gemma-4-31B-StyleTune", + "name": "Gemma 4 31B StyleTune", + "display_name": "Gemma 4 31B StyleTune", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 32768, - "output": 8192 + "context": 262144, + "output": 262144 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true, - "budget": { - "default": 30720, - "min": 0, - "max": 30720 - } + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "none", + "high" ] } }, - "attachment": false, + "attachment": true, + "open_weights": true, + "release_date": "2026-05-15", + "last_updated": "2026-05-15", "type": "chat" }, { - "id": "qwen3-0.6b", - "name": "Qwen3 0.6B", - "display_name": "Qwen3 0.6B", + "id": "gemma-4-31b-it-scarlet", + "name": "Gemma 4 31B Scarlet", + "display_name": "Gemma 4 31B Scarlet", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 32768, - "output": 8192 + "context": 262144, + "output": 32768 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true, - "budget": { - "default": 30720, - "min": 0, - "max": 30720 - } - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "default": true }, - "attachment": false, + "attachment": true, + "open_weights": true, + "release_date": "2026-10-08", + "last_updated": "2026-10-08", "type": "chat" }, { - "id": "qwen3-vl-plus-2025-09-23", - "name": "Qwen3 VL Plus 2025 09 23", - "display_name": "Qwen3 VL Plus 2025 09 23", + "id": "Gemma-4-31B-Fabled", + "name": "Gemma 4 31B Fabled (ArliAI)", + "display_name": "Gemma 4 31B Fabled (ArliAI)", "modalities": { "input": [ "text", @@ -150242,37 +147105,31 @@ }, "limit": { "context": 262144, - "output": 32768 + "output": 262144 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false, - "budget": { - "default": 81920, - "min": 0, - "max": 81920 - } + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "none", + "high" ] } }, - "attachment": false, + "attachment": true, + "open_weights": true, + "release_date": "2026-05-02", + "last_updated": "2026-05-02", "type": "chat" }, { - "id": "qwq-plus-latest", - "name": "QwQ Plus Latest", - "display_name": "QwQ Plus Latest", + "id": "ernie-5.1:thinking", + "name": "ERNIE 5.1 Thinking", + "display_name": "ERNIE 5.1 Thinking", "modalities": { "input": [ "text" @@ -150282,49 +147139,24 @@ ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 119000, + "output": 64000 }, - "temperature": true, "tool_call": false, "reasoning": { "supported": true, - "default": true, - "budget": { - "default": 32768, - "min": 0, - "max": 32768 - } - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, - "search": { - "supported": false + "default": true }, "attachment": false, + "open_weights": false, + "release_date": "2026-05-10", + "last_updated": "2026-05-10", "type": "chat" - } - ] - }, - "openai": { - "id": "openai", - "name": "OpenAI", - "display_name": "OpenAI", - "doc": "https://platform.openai.com/docs/models", - "models": [ + }, { - "id": "gpt-5.2", - "name": "GPT-5.2", - "display_name": "GPT-5.2", + "id": "Gemma-4-31B-Animus-V14.1", + "name": "Gemma 4 31B Animus V14.1", + "display_name": "Gemma 4 31B Animus V14.1", "modalities": { "input": [ "text", @@ -150335,48 +147167,32 @@ ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 262144, + "output": 262144 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", "effort_options": [ "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", "high" - ], - "visibility": "hidden" + ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2025-12-11", - "last_updated": "2025-12-11", + "open_weights": true, + "release_date": "2026-05-15", + "last_updated": "2026-05-15", "type": "chat" }, { - "id": "gpt-5.4-mini", - "name": "GPT-5.4 mini", - "display_name": "GPT-5.4 mini", + "id": "gemma-4-26b-a4b-it-moonlight", + "name": "Moonlight Dusk", + "display_name": "Moonlight Dusk", "modalities": { "input": [ "text", @@ -150387,52 +147203,29 @@ ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 262144, + "output": 32768 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "default": true }, "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-17", - "last_updated": "2026-03-17", + "open_weights": true, + "release_date": "2026-07-29", + "last_updated": "2026-07-29", "type": "chat" }, { - "id": "gpt-5.6-sol", - "name": "GPT-5.6 Sol", - "display_name": "GPT-5.6 Sol", + "id": "gemini-2.5-flash-lite-preview-09-2025-thinking", + "name": "Gemini 2.5 Flash Lite Preview (09/2025) – Thinking", + "display_name": "Gemini 2.5 Flash Lite Preview (09/2025) – Thinking", "modalities": { "input": [ "text", "image", + "audio", "pdf" ], "output": [ @@ -150440,77 +147233,45 @@ ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1048576, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "default_enabled": false, + "mode": "budget", + "budget": { + "default": -1, + "min": 512, + "max": 24576, + "auto": -1, + "unit": "tokens" + }, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "knowledge": "2025-01", + "release_date": "2025-09-25", + "last_updated": "2025-09-25", "type": "chat" }, { - "id": "gpt-image-1-mini", - "name": "gpt-image-1-mini", - "display_name": "gpt-image-1-mini", - "modalities": { - "input": [ - "text", - "image" - ], - "output": [ - "text", - "image" - ] - }, - "limit": { - "context": 8192, - "output": 8192 - }, - "temperature": false, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": false, - "release_date": "2025-09-26", - "last_updated": "2025-09-26" - }, - { - "id": "text-embedding-3-large", - "name": "text-embedding-3-large", - "display_name": "text-embedding-3-large", + "id": "hermes-low", + "name": "Hermes Low", + "display_name": "Hermes Low", "modalities": { "input": [ "text" @@ -150520,39 +147281,9 @@ ] }, "limit": { - "context": 8191, - "output": 3072 - }, - "temperature": false, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": false, - "knowledge": "2024-01", - "release_date": "2024-01-25", - "last_updated": "2024-01-25", - "type": "embedding" - }, - { - "id": "gpt-daybreak-red-latest", - "name": "Daybreak Red", - "display_name": "Daybreak Red", - "modalities": { - "input": [ - "text", - "image" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 400000, - "output": 128000 + "context": 1048576, + "output": 131072 }, - "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -150561,41 +147292,35 @@ "extra_capabilities": { "reasoning": { "effort_options": [ - "none", "low", - "medium", "high", - "xhigh", "max" ] } }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-08-07", - "last_updated": "2026-08-07", + "release_date": "2026-05-11", + "last_updated": "2026-05-11", "type": "chat" }, { - "id": "gpt-5.5-pro", - "name": "GPT-5.5 Pro", - "display_name": "GPT-5.5 Pro", + "id": "Qwen3.5-27B-Claude-4.6-Opus-Reasoning-Distilled-Derestricted", + "name": "Qwen3.5 27B Claude 4.6 Opus Reasoning Distilled Derestricted", + "display_name": "Qwen3.5 27B Claude 4.6 Opus Reasoning Distilled Derestricted", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 262144, + "output": 262144 }, - "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -150604,108 +147329,90 @@ "extra_capabilities": { "reasoning": { "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ - "medium", - "high", - "xhigh" + "none", + "high" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-12-01", - "release_date": "2026-04-23", - "last_updated": "2026-04-23", + "open_weights": true, + "release_date": "2026-05-15", + "last_updated": "2026-05-15", "type": "chat" }, { - "id": "chatgpt-image-latest", - "name": "chatgpt-image-latest", - "display_name": "chatgpt-image-latest", + "id": "gemma-4-31b-it-gemsicle", + "name": "Gemsicle", + "display_name": "Gemsicle", "modalities": { "input": [ "text", "image" ], "output": [ - "text", - "image" + "text" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 262144, + "output": 32768 }, - "temperature": false, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": true, - "open_weights": false, - "release_date": "2025-12-16", - "last_updated": "2025-12-16" + "open_weights": true, + "release_date": "2026-07-29", + "last_updated": "2026-07-29", + "type": "chat" }, { - "id": "gpt-5-nano", - "name": "GPT-5 Nano", - "display_name": "GPT-5 Nano", + "id": "ernie-5.1", + "name": "ERNIE 5.1", + "display_name": "ERNIE 5.1", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 119000, + "output": 64000 }, - "temperature": false, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "minimal", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "supported": true } }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2024-05-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "release_date": "2026-05-10", + "last_updated": "2026-05-10", "type": "chat" }, { - "id": "gpt-4o", - "name": "GPT-4o", - "display_name": "GPT-4o", + "id": "Meta-Llama-3-1-8B-Instruct-FP8", + "name": "Llama 3.1 8B (decentralized)", + "display_name": "Llama 3.1 8B (decentralized)", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" @@ -150715,72 +147422,70 @@ "context": 128000, "output": 16384 }, - "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2023-09", - "release_date": "2024-05-13", - "last_updated": "2024-08-06", + "attachment": false, + "open_weights": true, + "release_date": "2024-01-01", + "last_updated": "2024-07-23", "type": "chat" }, { - "id": "gpt-5.2-pro", - "name": "GPT-5.2 Pro", - "display_name": "GPT-5.2 Pro", + "id": "gemini-2.5-flash-lite-preview-06-17", + "name": "Gemini 2.5 Flash Lite Preview", + "display_name": "Gemini 2.5 Flash Lite Preview", "modalities": { "input": [ "text", - "image" + "image", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 1048576, + "output": 65536 }, - "temperature": false, - "tool_call": true, + "temperature": true, + "tool_call": false, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "default_enabled": false, + "mode": "budget", + "budget": { + "default": -1, + "min": 512, + "max": 24576, + "auto": -1, + "unit": "tokens" + }, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2025-12-11", - "last_updated": "2025-12-11", + "knowledge": "2025-01", + "release_date": "2025-06-17", + "last_updated": "2025-06-17", "type": "chat" }, { - "id": "gpt-5.4-nano", - "name": "GPT-5.4 nano", - "display_name": "GPT-5.4 nano", + "id": "ernie-5.0-thinking-preview", + "name": "Ernie 5.0 Thinking Preview", + "display_name": "Ernie 5.0 Thinking Preview", "modalities": { "input": [ "text", @@ -150791,182 +147496,109 @@ ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 128000, + "output": 16384 }, - "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "supported": true } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-17", - "last_updated": "2026-03-17", + "release_date": "2025-11-18", + "last_updated": "2025-11-18", "type": "chat" }, { - "id": "gpt-3.5-turbo", - "name": "GPT-3.5-turbo", - "display_name": "GPT-3.5-turbo", + "id": "Gemma-4-31B-MeroMero-v2", + "name": "Gemma 4 31B MeroMero v2", + "display_name": "Gemma 4 31B MeroMero v2", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 16385, - "output": 4096 + "context": 262144, + "output": 32768 }, - "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": false, - "knowledge": "2021-09-01", - "release_date": "2023-03-01", - "last_updated": "2023-11-06", + "attachment": true, + "open_weights": true, + "release_date": "2026-07-29", + "last_updated": "2026-08-23", "type": "chat" }, { - "id": "gpt-5.6-luna", - "name": "GPT-5.6 Luna", - "display_name": "GPT-5.6 Luna", + "id": "MiniMax-M1", + "name": "MiniMax M1", + "display_name": "MiniMax M1", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1000000, + "output": 131072 }, - "temperature": false, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "attachment": false, + "open_weights": true, + "release_date": "2025-01-08", + "last_updated": "2025-06-16", "type": "chat" }, { - "id": "gpt-5.3-codex-spark", - "name": "GPT-5.3 Codex Spark", - "display_name": "GPT-5.3 Codex Spark", + "id": "LatitudeGames/Wayfarer-Large-70B-Llama-3.3", + "name": "Llama 3.3 70B Wayfarer", + "display_name": "Llama 3.3 70B Wayfarer", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 32000 + "context": 32768, + "output": 16384 }, - "temperature": false, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-05", - "last_updated": "2026-02-05", + "attachment": false, + "open_weights": true, + "release_date": "2025-02-20", + "last_updated": "2025-02-20", "type": "chat" }, { - "id": "o3-mini", - "name": "o3-mini", - "display_name": "o3-mini", + "id": "baseten/Kimi-K2-Instruct-FP4", + "name": "Kimi K2 0711 Instruct FP4", + "display_name": "Kimi K2 0711 Instruct FP4", "modalities": { "input": [ "text" @@ -150976,281 +147608,207 @@ ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 131072, + "output": 131072 }, - "temperature": false, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, "attachment": false, - "open_weights": false, - "knowledge": "2024-05", - "release_date": "2024-12-20", - "last_updated": "2025-01-29", + "open_weights": true, + "release_date": "2024-01-01", + "last_updated": "2025-07-11", "type": "chat" }, { - "id": "gpt-5.6-terra", - "name": "GPT-5.6 Terra", - "display_name": "GPT-5.6 Terra", + "id": "stepfun-ai/step-3.5-flash-2603", + "name": "Step 3.5 Flash 2603", + "display_name": "Step 3.5 Flash 2603", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 262144, + "output": 65536 }, - "temperature": false, - "tool_call": true, + "temperature": true, + "tool_call": false, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ], - "verbosity": "medium", - "verbosity_options": [ "low", "medium", "high" - ], - "visibility": "hidden" + ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "attachment": false, + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "o3", - "name": "o3", - "display_name": "o3", + "id": "stepfun-ai/step-3.5-flash", + "name": "Step 3.5 Flash", + "display_name": "Step 3.5 Flash", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 262144, + "output": 65536 }, - "temperature": false, - "tool_call": true, + "temperature": true, + "tool_call": false, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", "effort_options": [ "low", "medium", "high" - ], - "visibility": "hidden" + ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-05", - "release_date": "2025-04-16", - "last_updated": "2025-04-16", + "attachment": false, + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-01-29", + "last_updated": "2026-02-13", "type": "chat" }, { - "id": "gpt-realtime-2.1", - "name": "GPT-Realtime-2.1", - "display_name": "GPT-Realtime-2.1", + "id": "LLM360/K2-Think", + "name": "K2-Think", + "display_name": "K2-Think", "modalities": { "input": [ - "text", - "audio", - "image" + "text" ], "output": [ - "text", - "audio" + "text" ] }, "limit": { "context": 128000, - "output": 32000 + "output": 32768 }, - "temperature": false, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "minimal", - "low", - "medium", - "high", - "xhigh" - ] - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2026-07-06", - "last_updated": "2026-07-06" + "attachment": false, + "open_weights": true, + "release_date": "2025-07-26", + "last_updated": "2025-07-26", + "type": "chat" }, { - "id": "o1-pro", - "name": "o1-pro", - "display_name": "o1-pro", + "id": "Sao10K/L3.3-70B-Euryale-v2.3", + "name": "Llama 3.3 70B Euryale", + "display_name": "Llama 3.3 70B Euryale", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 20480, + "output": 16384 }, - "temperature": false, - "tool_call": true, + "temperature": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2023-09", - "release_date": "2025-03-19", - "last_updated": "2025-03-19", + "attachment": false, + "open_weights": true, + "knowledge": "2023-12-31", + "release_date": "2024-12-18", + "last_updated": "2024-12-18", "type": "chat" }, { - "id": "gpt-image-1", - "name": "gpt-image-1", - "display_name": "gpt-image-1", + "id": "Sao10K/L3-8B-Stheno-v3.2", + "name": "Sao10K Stheno 8b", + "display_name": "Sao10K Stheno 8b", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ - "image" + "text" ] }, "limit": { - "context": 8192, + "context": 16384, "output": 8192 }, - "temperature": false, "tool_call": false, "reasoning": { "supported": false }, - "attachment": true, - "open_weights": false, - "release_date": "2025-04-24", - "last_updated": "2025-04-24" + "attachment": false, + "open_weights": true, + "release_date": "2024-01-01", + "last_updated": "2024-11-29", + "type": "chat" }, { - "id": "gpt-4o-2024-05-13", - "name": "GPT-4o (2024-05-13)", - "display_name": "GPT-4o (2024-05-13)", + "id": "Sao10K/L3.1-70B-Euryale-v2.2", + "name": "Llama 3.1 70B Euryale", + "display_name": "Llama 3.1 70B Euryale", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 20480, + "output": 16384 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2023-09", - "release_date": "2024-05-13", - "last_updated": "2024-05-13", + "attachment": false, + "open_weights": true, + "knowledge": "2023-12-31", + "release_date": "2024-08-28", + "last_updated": "2024-08-28", "type": "chat" }, { - "id": "text-embedding-ada-002", - "name": "text-embedding-ada-002", - "display_name": "text-embedding-ada-002", + "id": "Sao10K/L3.1-70B-Hanami-x1", + "name": "Llama 3.1 70B Hanami", + "display_name": "Llama 3.1 70B Hanami", "modalities": { "input": [ "text" @@ -151260,239 +147818,169 @@ ] }, "limit": { - "context": 8192, - "output": 1536 + "context": 32768, + "output": 16384 }, - "temperature": false, "tool_call": false, "reasoning": { "supported": false }, "attachment": false, - "open_weights": false, - "knowledge": "2022-12", - "release_date": "2022-12-15", - "last_updated": "2022-12-15", - "type": "embedding" + "open_weights": true, + "release_date": "2024-01-01", + "last_updated": "2024-07-23", + "type": "chat" }, { - "id": "gpt-5-pro", - "name": "GPT-5 Pro", - "display_name": "GPT-5 Pro", + "id": "meta-llama/llama-3.2-3b-instruct", + "name": "Llama 3.2 3b Instruct", + "display_name": "Llama 3.2 3b Instruct", "modalities": { "input": [ "text", - "image" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 272000 + "context": 131072, + "output": 8192 }, - "temperature": false, - "tool_call": true, + "temperature": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "fixed", - "effort": "high", - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-10-06", - "last_updated": "2025-10-06", + "open_weights": true, + "knowledge": "2023-12", + "release_date": "2024-09-25", + "last_updated": "2024-09-25", "type": "chat" }, { - "id": "gpt-6-sol", - "name": "GPT-6 Sol", - "display_name": "GPT-6 Sol", + "id": "meta-llama/llama-3.1-8b-instruct", + "name": "Llama 3.1 8b Instruct", + "display_name": "Llama 3.1 8b Instruct", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 131072, + "output": 16384 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ] - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-04-20", - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "attachment": false, + "open_weights": true, + "knowledge": "2023-12", + "release_date": "2024-07-23", + "last_updated": "2024-07-23", "type": "chat" }, { - "id": "gpt-5.3-codex", - "name": "GPT-5.3 Codex", - "display_name": "GPT-5.3 Codex", + "id": "meta-llama/llama-4-scout", + "name": "Llama 4 Scout", + "display_name": "Llama 4 Scout", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 328000, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-05", - "last_updated": "2026-02-05", + "open_weights": true, + "knowledge": "2024-08", + "release_date": "2025-04-05", + "last_updated": "2025-04-05", "type": "chat" }, { - "id": "gpt-6.1-sol", - "name": "GPT-6.1 Sol", - "display_name": "GPT-6.1 Sol", + "id": "meta-llama/llama-3.3-70b-instruct", + "name": "Llama 3.3 70b Instruct", + "display_name": "Llama 3.3 70b Instruct", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 131072, + "output": 16384 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ] - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-04-30", - "release_date": "2026-09-29", - "last_updated": "2026-09-29", + "attachment": false, + "open_weights": true, + "knowledge": "2023-12", + "release_date": "2024-12-06", + "last_updated": "2024-12-06", "type": "chat" }, { - "id": "gpt-image-2", - "name": "gpt-image-2", - "display_name": "gpt-image-2", + "id": "meta-llama/llama-4-maverick", + "name": "Llama 4 Maverick", + "display_name": "Llama 4 Maverick", "modalities": { "input": [ "text", "image" ], "output": [ - "image" + "text" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 1048576, + "output": 65536 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": false }, "attachment": true, - "open_weights": false, - "release_date": "2026-04-21", - "last_updated": "2026-04-21", - "type": "imageGeneration" + "open_weights": true, + "knowledge": "2024-08", + "release_date": "2025-04-05", + "last_updated": "2025-04-05", + "type": "chat" }, { - "id": "gpt-5.4", - "name": "GPT-5.4", - "display_name": "GPT-5.4", + "id": "microsoft/wizardlm-2-8x22b", + "name": "WizardLM-2 8x22B", + "display_name": "WizardLM-2 8x22B", "modalities": { "input": [ "text", - "image", "pdf" ], "output": [ @@ -151500,63 +147988,37 @@ ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 65536, + "output": 8192 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-05", - "last_updated": "2026-03-05", + "open_weights": true, + "release_date": "2024-04-15", + "last_updated": "2024-04-15", "type": "chat" }, { - "id": "gpt-daybreak-blue-latest", - "name": "Daybreak Blue", - "display_name": "Daybreak Blue", + "id": "TEE/glm-5.2", + "name": "GLM 5.2 TEE", + "display_name": "GLM 5.2 TEE", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1048576, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -151564,27 +148026,19 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ] + "supported": true } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-08-07", - "last_updated": "2026-08-07", + "attachment": false, + "open_weights": true, + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "gpt-4o-2024-11-20", - "name": "GPT-4o (2024-11-20)", - "display_name": "GPT-4o (2024-11-20)", + "id": "TEE/qwen2.5-vl-72b-instruct", + "name": "Qwen2.5 VL 72B TEE", + "display_name": "Qwen2.5 VL 72B TEE", "modalities": { "input": [ "text", @@ -151595,25 +148049,25 @@ ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 65536, + "output": 8192 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2023-09", - "release_date": "2024-11-20", - "last_updated": "2024-11-20", + "open_weights": true, + "knowledge": "2024-04", + "release_date": "2025-01-26", + "last_updated": "2025-01-26", "type": "chat" }, { - "id": "o3-pro", - "name": "o3-pro", - "display_name": "o3-pro", + "id": "TEE/deepseek-v4.1-flash", + "name": "DeepSeek V4.1 Flash TEE", + "display_name": "DeepSeek V4.1 Flash TEE", "modalities": { "input": [ "text", @@ -151624,10 +148078,10 @@ ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 1048576, + "output": 384000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -151636,28 +148090,26 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", "effort_options": [ + "none", "low", "medium", - "high" - ], - "visibility": "hidden" + "high", + "max" + ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2024-05", - "release_date": "2025-06-10", - "last_updated": "2025-06-10", + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-09-10", + "last_updated": "2026-09-10", "type": "chat" }, { - "id": "gpt-5.1", - "name": "GPT-5.1", - "display_name": "GPT-5.1", + "id": "TEE/gemma4-31b:thinking", + "name": "Gemma 4 31B Thinking TEE", + "display_name": "Gemma 4 31B Thinking TEE", "modalities": { "input": [ "text", @@ -151668,47 +148120,26 @@ ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 262144, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "default": true }, "attachment": true, - "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-11-13", - "last_updated": "2025-11-13", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "gpt-4o-2024-08-06", - "name": "GPT-4o (2024-08-06)", - "display_name": "GPT-4o (2024-08-06)", + "id": "TEE/gemma4-31b", + "name": "Gemma 4 31B", + "display_name": "Gemma 4 31B", "modalities": { "input": [ "text", @@ -151719,8 +148150,8 @@ ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 262144, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -151728,61 +148159,69 @@ "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2023-09", - "release_date": "2024-08-06", - "last_updated": "2024-08-06", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "gpt-4.1-mini", - "name": "GPT-4.1 mini", - "display_name": "GPT-4.1 mini", + "id": "TEE/qwen3.6-27b", + "name": "Qwen3.6 27B TEE", + "display_name": "Qwen3.6 27B TEE", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1047576, - "output": 32768 + "context": 262144, + "output": 65536 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": true, - "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-04-14", - "last_updated": "2025-04-14", + "open_weights": true, + "release_date": "2026-04-22", + "last_updated": "2026-04-22", "type": "chat" }, { - "id": "gpt-6-astra", - "name": "GPT-6 Astra", - "display_name": "GPT-6 Astra", + "id": "TEE/glm-5.3", + "name": "GLM 5.3 TEE", + "display_name": "GLM 5.3 TEE", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1048576, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -151793,37 +148232,33 @@ "supported": true, "effort_options": [ "low", - "medium", "high", - "xhigh", "max" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-04-30", - "release_date": "2026-09-04", - "last_updated": "2026-09-04", + "attachment": false, + "open_weights": true, + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "gpt-5.5", - "name": "GPT-5.5", - "display_name": "GPT-5.5", + "id": "TEE/kimi-k2.7-code", + "name": "Kimi K2.7 Code TEE", + "display_name": "Kimi K2.7 Code TEE", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 262144, + "output": 65536 }, "temperature": false, "tool_call": true, @@ -151833,117 +148268,91 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "supported": true } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-12-01", - "release_date": "2026-04-23", - "last_updated": "2026-04-23", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-06-12", + "last_updated": "2026-06-12", "type": "chat" }, { - "id": "gpt-4o-mini", - "name": "GPT-4o mini", - "display_name": "GPT-4o mini", + "id": "TEE/qwen3.6-35b-a3b", + "name": "Qwen3.6 35B A3B TEE", + "display_name": "Qwen3.6 35B A3B TEE", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 262144, + "output": 262144 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": false + "supported": true }, - "attachment": true, - "open_weights": false, - "knowledge": "2023-09", - "release_date": "2024-07-18", - "last_updated": "2024-07-18", + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, + "open_weights": true, + "release_date": "2026-04-17", + "last_updated": "2026-04-17", "type": "chat" }, { - "id": "gpt-5-mini", - "name": "GPT-5 Mini", - "display_name": "GPT-5 Mini", + "id": "TEE/gpt-oss-120b", + "name": "GPT-OSS 120B TEE", + "display_name": "GPT-OSS 120B TEE", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 131072, + "output": 16384 }, - "temperature": false, - "tool_call": true, + "temperature": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "minimal", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "supported": true } }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-05-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "attachment": false, + "open_weights": true, + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "gpt-5", - "name": "GPT-5", - "display_name": "GPT-5", + "id": "TEE/kimi-k2.6", + "name": "Kimi K2.6 TEE", + "display_name": "Kimi K2.6 TEE", "modalities": { "input": [ "text", @@ -151954,62 +148363,43 @@ ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 262144, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "minimal", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "supported": true } }, "attachment": true, - "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-04-20", + "last_updated": "2026-04-20", "type": "chat" }, { - "id": "gpt-6-luna", - "name": "GPT-6 Luna", - "display_name": "GPT-6 Luna", + "id": "TEE/nemotron-3.5-lightning", + "name": "Nvidia Nemotron 3.5 Lightning TEE", + "display_name": "Nvidia Nemotron 3.5 Lightning TEE", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 262144, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -152017,72 +148407,39 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ "none", "low", "medium", - "high", - "xhigh", - "max" + "high" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-05-18", - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "attachment": false, + "open_weights": true, + "knowledge": "2025-09", + "release_date": "2026-08-11", + "last_updated": "2026-08-11", "type": "chat" }, { - "id": "gpt-4.1", - "name": "GPT-4.1", - "display_name": "GPT-4.1", - "modalities": { - "input": [ - "text", - "image", - "pdf" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 1047576, - "output": 32768 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-04-14", - "last_updated": "2025-04-14", - "type": "chat" - }, - { - "id": "o1", - "name": "o1", - "display_name": "o1", + "id": "TEE/gemma-4-31b-it", + "name": "Gemma 4 31B IT TEE", + "display_name": "Gemma 4 31B IT TEE", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 262144, + "output": 262144 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -152090,58 +148447,58 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "supported": true } }, - "attachment": true, - "open_weights": false, - "knowledge": "2023-09", - "release_date": "2024-12-05", - "last_updated": "2024-12-05", + "attachment": false, + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "gpt-4.1-nano", - "name": "GPT-4.1 nano", - "display_name": "GPT-4.1 nano", + "id": "TEE/qwen3.5-397b-a17b", + "name": "Qwen3.5 397B A17B TEE", + "display_name": "Qwen3.5 397B A17B TEE", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1047576, - "output": 32768 + "context": 262144, + "output": 65536 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": false + "supported": true }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-04-14", - "last_updated": "2025-04-14", + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, + "open_weights": true, + "release_date": "2026-02-15", + "last_updated": "2026-02-15", "type": "chat" }, { - "id": "gpt-4", - "name": "GPT-4", - "display_name": "GPT-4", + "id": "TEE/glm-5.1-thinking", + "name": "GLM 5.1 Thinking TEE", + "display_name": "GLM 5.1 Thinking TEE", "modalities": { "input": [ "text" @@ -152151,69 +148508,73 @@ ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 202752, + "output": 65535 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "high" + ] + } }, "attachment": false, - "open_weights": false, - "knowledge": "2023-11", - "release_date": "2023-11-06", - "last_updated": "2024-04-09", + "open_weights": true, + "release_date": "2026-04-07", + "last_updated": "2026-04-07", "type": "chat" }, { - "id": "o4-mini", - "name": "o4-mini", - "display_name": "o4-mini", + "id": "TEE/qwen3.5-27b", + "name": "Qwen3.5 27B TEE", + "display_name": "Qwen3.5 27B TEE", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 262144, + "output": 65536 }, - "temperature": false, - "tool_call": true, + "temperature": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2024-05", - "release_date": "2025-04-16", - "last_updated": "2025-04-16", + "open_weights": true, + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" }, { - "id": "text-embedding-3-small", - "name": "text-embedding-3-small", - "display_name": "text-embedding-3-small", + "id": "TEE/glm-5.2:thinking", + "name": "GLM 5.2 Thinking TEE", + "display_name": "GLM 5.2 Thinking TEE", "modalities": { "input": [ "text" @@ -152223,40 +148584,10 @@ ] }, "limit": { - "context": 8191, - "output": 1536 - }, - "temperature": false, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": false, - "knowledge": "2024-01", - "release_date": "2024-01-25", - "last_updated": "2024-01-25", - "type": "embedding" - }, - { - "id": "gpt-5.6", - "name": "GPT-5.6", - "display_name": "GPT-5.6", - "modalities": { - "input": [ - "text", - "image", - "pdf" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 1050000, - "output": 128000 + "context": 1048576, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -152264,67 +148595,58 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", "effort_options": [ - "none", "low", "medium", "high", "xhigh", "max" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "attachment": false, + "open_weights": true, + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "gpt-4-turbo", - "name": "GPT-4 Turbo", - "display_name": "GPT-4 Turbo", + "id": "TEE/deepseek-v3.2", + "name": "DeepSeek V3.2 TEE", + "display_name": "DeepSeek V3.2 TEE", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 164000, + "output": 65536 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": false + "supported": true }, - "attachment": true, - "open_weights": false, - "knowledge": "2023-12", - "release_date": "2023-11-06", - "last_updated": "2024-04-09", + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": false, + "open_weights": true, + "knowledge": "2024-07", + "release_date": "2025-12-01", + "last_updated": "2025-12-01", "type": "chat" }, { - "id": "gpt-5.4-pro", - "name": "GPT-5.4 Pro", - "display_name": "GPT-5.4 Pro", + "id": "TEE/kimi-k3", + "name": "Kimi K3 TEE", + "display_name": "Kimi K3 TEE", "modalities": { "input": [ "text", @@ -152335,8 +148657,8 @@ ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1048576, + "output": 65535 }, "temperature": false, "tool_call": true, @@ -152347,82 +148669,65 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", "effort_options": [ - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ "low", - "medium", - "high" - ], - "visibility": "hidden" + "high", + "max" + ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-05", - "last_updated": "2026-03-05", + "open_weights": true, + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" }, { - "id": "gpt-image-1.5", - "name": "gpt-image-1.5", - "display_name": "gpt-image-1.5", + "id": "TEE/qwen3.8-27b", + "name": "Qwen3.8 27B TEE", + "display_name": "Qwen3.8 27B TEE", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ - "text", - "image" + "text" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 262144, + "output": 262144 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": true, - "open_weights": false, - "release_date": "2025-11-25", - "last_updated": "2025-11-25" - } - ] - }, - "lmstudio": { - "id": "lmstudio", - "name": "LMStudio", - "display_name": "LMStudio", - "api": "http://127.0.0.1:1234/v1", - "doc": "https://lmstudio.ai/models", - "models": [ + "open_weights": true, + "release_date": "2026-08-14", + "last_updated": "2026-08-14", + "type": "chat" + }, { - "id": "openai/gpt-oss-20b", - "name": "GPT OSS 20B", - "display_name": "GPT OSS 20B", + "id": "TEE/glm-5.3-flash", + "name": "GLM 5.3 Flash TEE", + "display_name": "GLM 5.3 Flash TEE", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 1048576, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -152435,22 +148740,21 @@ "supported": true, "effort_options": [ "low", - "medium", - "high" + "high", + "max" ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "release_date": "2026-08-26", + "last_updated": "2026-08-26", "type": "chat" }, { - "id": "qwen/qwen3-30b-a3b-2507", - "name": "Qwen3 30B A3B 2507", - "display_name": "Qwen3 30B A3B 2507", + "id": "TEE/llama3-3-70b", + "name": "Llama 3.3 70B", + "display_name": "Llama 3.3 70B", "modalities": { "input": [ "text" @@ -152460,25 +148764,25 @@ ] }, "limit": { - "context": 262144, + "context": 128000, "output": 16384 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, "attachment": false, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-07-28", - "last_updated": "2025-07-28", + "knowledge": "2023-12", + "release_date": "2024-12-06", + "last_updated": "2024-12-06", "type": "chat" }, { - "id": "qwen/qwen3-coder-30b", - "name": "Qwen3 Coder 30B", - "display_name": "Qwen3 Coder 30B", + "id": "TEE/gemma-4-26b-a4b-uncensored", + "name": "Gemma 4 26B A4B Uncensored TEE", + "display_name": "Gemma 4 26B A4B Uncensored TEE", "modalities": { "input": [ "text" @@ -152488,34 +148792,23 @@ ] }, "limit": { - "context": 262144, + "context": 65536, "output": 65536 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": false }, "attachment": false, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-07-31", - "last_updated": "2025-07-31", + "release_date": "2026-05-23", + "last_updated": "2026-05-23", "type": "chat" - } - ] - }, - "submodel": { - "id": "submodel", - "name": "submodel", - "display_name": "submodel", - "api": "https://llm.submodel.ai/v1", - "doc": "https://submodel.gitbook.io", - "models": [ + }, { - "id": "Qwen/Qwen3-235B-A22B-Thinking-2507", - "name": "Qwen3 235B A22B Thinking 2507", - "display_name": "Qwen3 235B A22B Thinking 2507", + "id": "TEE/glm-5.1", + "name": "GLM 5.1 TEE", + "display_name": "GLM 5.1 TEE", "modalities": { "input": [ "text" @@ -152525,8 +148818,8 @@ ] }, "limit": { - "context": 262144, - "output": 131072 + "context": 202752, + "output": 65535 }, "temperature": true, "tool_call": true, @@ -152537,52 +148830,51 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "none", + "high" ] } }, "attachment": false, "open_weights": true, - "release_date": "2025-07-25", - "last_updated": "2025-07-25", + "release_date": "2026-04-07", + "last_updated": "2026-04-07", "type": "chat" }, { - "id": "Qwen/Qwen3-Coder-480B-A35B-Instruct-FP8", - "name": "Qwen3 Coder 480B A35B Instruct", - "display_name": "Qwen3 Coder 480B A35B Instruct", + "id": "anthracite-org/magnum-v4-72b", + "name": "Magnum v4 72B", + "display_name": "Magnum v4 72B", "modalities": { "input": [ - "text" + "text", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 16384, + "output": 8192 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-07-22", - "last_updated": "2025-07-22", + "knowledge": "2024-06-30", + "release_date": "2024-10-22", + "last_updated": "2024-10-22", "type": "chat" }, { - "id": "Qwen/Qwen3-235B-A22B-Instruct-2507", - "name": "Qwen3 235B A22B Instruct 2507", - "display_name": "Qwen3 235B A22B Instruct 2507", + "id": "anthracite-org/magnum-v2-72b", + "name": "Magnum V2 72B", + "display_name": "Magnum V2 72B", "modalities": { "input": [ "text" @@ -152592,24 +148884,23 @@ ] }, "limit": { - "context": 262144, - "output": 131072 + "context": 16384, + "output": 8192 }, - "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, "attachment": false, "open_weights": true, - "release_date": "2025-07-21", - "last_updated": "2025-07-21", + "release_date": "2024-01-01", + "last_updated": "2024-07-01", "type": "chat" }, { - "id": "openai/gpt-oss-120b", - "name": "GPT OSS 120B", - "display_name": "GPT OSS 120B", + "id": "liquid/lfm-2.5-24b-a2b", + "name": "LFM2.5 24B A2B", + "display_name": "LFM2.5 24B A2B", "modalities": { "input": [ "text" @@ -152619,31 +148910,24 @@ ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 128000, + "output": 8192 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, "attachment": false, - "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "open_weights": false, + "release_date": "2026-10-14", + "last_updated": "2026-10-14", "type": "chat" }, { - "id": "zai-org/GLM-4.5-FP8", - "name": "GLM 4.5 FP8", - "display_name": "GLM 4.5 FP8", + "id": "liquid/lfm-2.5-2.6b", + "name": "LFM2.5 2.6B", + "display_name": "LFM2.5 2.6B", "modalities": { "input": [ "text" @@ -152653,26 +148937,36 @@ ] }, "limit": { - "context": 131072, - "output": 131072 + "context": 128000, + "output": 32768 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] + } + }, "attachment": false, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-07-28", - "last_updated": "2025-07-28", + "release_date": "2026-08-12", + "last_updated": "2026-08-12", "type": "chat" }, { - "id": "zai-org/GLM-4.5-Air", - "name": "GLM 4.5 Air", - "display_name": "GLM 4.5 Air", + "id": "MarinaraSpaghetti/NemoMix-Unleashed-12B", + "name": "NemoMix 12B Unleashed", + "display_name": "NemoMix 12B Unleashed", "modalities": { "input": [ "text" @@ -152682,25 +148976,23 @@ ] }, "limit": { - "context": 131072, - "output": 131072 + "context": 32768, + "output": 8192 }, - "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, "attachment": false, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-07-28", - "last_updated": "2025-07-28", + "release_date": "2024-01-01", + "last_updated": "2024-07-01", "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-V3.1", - "name": "DeepSeek V3.1", - "display_name": "DeepSeek V3.1", + "id": "deepcogito/cogito-v1-preview-qwen-32B", + "name": "Cogito v1 Preview Qwen 32B", + "display_name": "Cogito v1 Preview Qwen 32B", "modalities": { "input": [ "text" @@ -152710,25 +149002,23 @@ ] }, "limit": { - "context": 75000, - "output": 163840 + "context": 128000, + "output": 32768 }, - "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, "open_weights": true, - "release_date": "2025-08-21", - "last_updated": "2025-08-21", + "release_date": "2025-05-10", + "last_updated": "2025-05-10", "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-R1-0528", - "name": "DeepSeek R1 0528", - "display_name": "DeepSeek R1 0528", + "id": "moonshotai/kimi-k2-instruct-0711", + "name": "Kimi K2 0711", + "display_name": "Kimi K2 0711", "modalities": { "input": [ "text" @@ -152738,72 +149028,59 @@ ] }, "limit": { - "context": 75000, - "output": 163840 + "context": 128000, + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": false, "open_weights": true, - "release_date": "2025-05-28", - "last_updated": "2025-05-28", + "release_date": "2025-07-11", + "last_updated": "2025-07-11", "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-V3-0324", - "name": "DeepSeek V3 0324", - "display_name": "DeepSeek V3 0324", + "id": "moonshotai/kimi-k2.7-code-highspeed", + "name": "Kimi K2.7 Code High-Speed", + "display_name": "Kimi K2.7 Code High-Speed", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 75000, - "output": 163840 + "context": 262144, + "output": 65536 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": true, "open_weights": true, - "release_date": "2025-03-24", - "last_updated": "2025-03-24", + "knowledge": "2025-01", + "release_date": "2026-06-12", + "last_updated": "2026-06-12", "type": "chat" - } - ] - }, - "alibaba-token-plan-cn": { - "id": "alibaba-token-plan-cn", - "name": "Alibaba Token Plan (China)", - "display_name": "Alibaba Token Plan (China)", - "api": "https://token-plan.cn-beijing.maas.aliyuncs.com/compatible-mode/v1", - "doc": "https://www.alibabacloud.com/help/zh/model-studio/token-plan-overview", - "models": [ + }, { - "id": "glm-5.1", - "name": "GLM-5.1", - "display_name": "GLM-5.1", + "id": "moonshotai/kimi-k2-thinking", + "name": "Kimi K2 Thinking", + "display_name": "Kimi K2 Thinking", "modalities": { "input": [ "text" @@ -152813,8 +149090,8 @@ ] }, "limit": { - "context": 202752, - "output": 128000 + "context": 262144, + "output": 98304 }, "temperature": true, "tool_call": true, @@ -152835,27 +149112,30 @@ }, "attachment": false, "open_weights": true, - "release_date": "2026-04-07", - "last_updated": "2026-04-07", + "knowledge": "2024-08", + "release_date": "2025-11-06", + "last_updated": "2025-11-06", "type": "chat" }, { - "id": "glm-5", - "name": "GLM-5", - "display_name": "GLM-5", + "id": "moonshotai/kimi-k3.1-pro", + "name": "Kimi K3.1 Pro", + "display_name": "Kimi K3.1 Pro", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 202752, - "output": 16384 + "context": 1048576, + "output": 1048576 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -152863,38 +149143,37 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "low", + "high", + "max" ] } }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-02-12", - "last_updated": "2026-02-12", + "release_date": "2026-10-23", + "last_updated": "2026-10-23", "type": "chat" }, { - "id": "deepseek-v4-flash", - "name": "DeepSeek V4 Flash", - "display_name": "DeepSeek V4 Flash", + "id": "moonshotai/kimi-k2.7-code", + "name": "Kimi K2.7 Code", + "display_name": "Kimi K2.7 Code", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 262144, + "output": 65536 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -152902,79 +149181,54 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." - ] + "supported": true } }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "knowledge": "2025-01", + "release_date": "2026-06-12", + "last_updated": "2026-06-12", "type": "chat" }, { - "id": "qwen3.7-plus", - "name": "Qwen3.7 Plus", - "display_name": "Qwen3.7 Plus", + "id": "moonshotai/kimi-k2.6", + "name": "Kimi K2.6", + "display_name": "Kimi K2.6", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, + "context": 262144, "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-04", - "release_date": "2026-06-02", - "last_updated": "2026-06-02", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-04-20", + "last_updated": "2026-04-20", "type": "chat" }, { - "id": "qwen3.8-max-preview", - "name": "Qwen3.8 Max Preview", - "display_name": "Qwen3.8 Max Preview", + "id": "moonshotai/kimi-k3.1-pro-highspeed", + "name": "Kimi K3.1 Pro Highspeed", + "display_name": "Kimi K3.1 Pro Highspeed", "modalities": { "input": [ "text", @@ -152986,10 +149240,9 @@ ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 1048576, + "output": 1048576 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -152997,62 +149250,27 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ "low", - "medium", - "xhigh" + "high", + "max" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-07-19", - "last_updated": "2026-07-19", + "release_date": "2026-10-24", + "last_updated": "2026-10-24", "type": "chat" }, { - "id": "happyhorse-1.1-i2v", - "name": "HappyHorse 1.1 Image-to-Video", - "display_name": "HappyHorse 1.1 Image-to-Video", - "modalities": { - "input": [ - "image", - "text" - ], - "output": [ - "video" - ] - }, - "limit": { - "context": 8192, - "output": 8192 - }, - "temperature": true, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": false, - "release_date": "2026-07-17", - "last_updated": "2026-07-17" - }, - { - "id": "kimi-k2.7-code", - "name": "Kimi K2.7 Code", - "display_name": "Kimi K2.7 Code", + "id": "moonshotai/kimi-k2.5:thinking", + "name": "Kimi K2.5 Thinking", + "display_name": "Kimi K2.5 Thinking", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" @@ -153060,7 +149278,7 @@ }, "limit": { "context": 262144, - "output": 262144 + "output": 65536 }, "temperature": false, "tool_call": true, @@ -153068,42 +149286,29 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, "attachment": true, "open_weights": true, "knowledge": "2025-01", - "release_date": "2026-06-12", - "last_updated": "2026-06-12", + "release_date": "2026-01-27", + "last_updated": "2026-01-27", "type": "chat" }, { - "id": "qwen3.8-max", - "name": "Qwen3.8 Max", - "display_name": "Qwen3.8 Max", + "id": "moonshotai/kimi-k2.6:thinking", + "name": "Kimi K2.6 Thinking", + "display_name": "Kimi K2.6 Thinking", "modalities": { "input": [ "text", - "image", - "video", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 262144, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -153111,45 +149316,32 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "low", - "medium", - "xhigh" - ] - } - }, "attachment": true, - "open_weights": false, - "release_date": "2026-08-03", - "last_updated": "2026-08-03", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-04-20", + "last_updated": "2026-04-20", "type": "chat" }, { - "id": "deepseek-v4-pro", - "name": "DeepSeek V4 Pro", - "display_name": "DeepSeek V4 Pro", + "id": "moonshotai/kimi-k3", + "name": "Kimi K3", + "display_name": "Kimi K3", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 1048576, + "output": 943718 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -153158,53 +149350,40 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", "effort_options": [ "low", "high", "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" }, { - "id": "deepseek-v4-pro-0813", - "name": "DeepSeek V4 Pro 0813", - "display_name": "DeepSeek V4 Pro 0813", + "id": "moonshotai/kimi-k2.5", + "name": "Kimi K2.5", + "display_name": "Kimi K2.5", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 262144, + "output": 65536 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": true }, "extra_capabilities": { "reasoning": { @@ -153214,75 +149393,74 @@ "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "effort_options": [ - "high", - "max" ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-08-13", - "last_updated": "2026-08-22", + "knowledge": "2025-01", + "release_date": "2026-01-27", + "last_updated": "2026-01-27", "type": "chat" }, { - "id": "qwen-image-2.0-pro", - "name": "Qwen Image 2.0 Pro", - "display_name": "Qwen Image 2.0 Pro", + "id": "moonshotai/Kimi-K2-Instruct-0905", + "name": "Kimi K2 0905", + "display_name": "Kimi K2 0905", "modalities": { "input": [ "text" ], "output": [ - "image" + "text" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 262144, + "output": 100352 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2026-03-03", - "last_updated": "2026-03-03" + "open_weights": true, + "release_date": "2025-09-05", + "last_updated": "2025-09-05", + "type": "chat" }, { - "id": "happyhorse-1.1-t2v", - "name": "HappyHorse 1.1 Text-to-Video", - "display_name": "HappyHorse 1.1 Text-to-Video", + "id": "moonshotai/kimi-k2-instruct", + "name": "Kimi K2 Instruct", + "display_name": "Kimi K2 Instruct", "modalities": { "input": [ "text" ], "output": [ - "video" + "text" ] }, "limit": { - "context": 8192, + "context": 256000, "output": 8192 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2026-07-17", - "last_updated": "2026-07-17" + "open_weights": true, + "release_date": "2025-07-11", + "last_updated": "2025-07-11", + "type": "chat" }, { - "id": "qwen3.6-plus", - "name": "Qwen3.6 Plus", - "display_name": "Qwen3.6 Plus", + "id": "moonshotai/kimi-latest", + "name": "Kimi Latest", + "display_name": "Kimi Latest", "modalities": { "input": [ "text", @@ -153294,10 +149472,9 @@ ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 1048576, + "output": 943718 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -153305,65 +149482,74 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "low", + "high", + "max" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-04", - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "release_date": "2026-05-03", + "last_updated": "2026-05-03", "type": "chat" }, { - "id": "wan2.7-image", - "name": "Wan2.7 Image", - "display_name": "Wan2.7 Image", + "id": "deepseek/deepseek-v4-flash-0731", + "name": "DeepSeek V4 Flash 0731", + "display_name": "DeepSeek V4 Flash 0731", "modalities": { "input": [ "text" ], "output": [ - "image" + "text" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 1048576, + "output": 131072 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "none", + "low", + "high", + "max" + ] + } }, "attachment": false, - "open_weights": false, - "release_date": "2026-05-29", - "last_updated": "2026-05-29" - }, - { - "id": "qwen3.6-flash", - "name": "Qwen3.6 Flash", - "display_name": "Qwen3.6 Flash", + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-07-31", + "last_updated": "2026-07-31", + "type": "chat" + }, + { + "id": "deepseek/deepseek-v4-flash", + "name": "DeepSeek V4 Flash", + "display_name": "DeepSeek V4 Flash", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 1048576, + "output": 384000 }, "temperature": true, "tool_call": true, @@ -153374,27 +149560,40 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "high", + "max" + ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "notes": [ + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, - "attachment": true, - "open_weights": false, - "release_date": "2026-04-27", - "last_updated": "2026-04-27", + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "glm-5.3", - "name": "GLM-5.3", - "display_name": "GLM-5.3", + "id": "deepseek/deepseek-v4.1-flash", + "name": "DeepSeek V4.1 Flash", + "display_name": "DeepSeek V4.1 Flash", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" @@ -153402,7 +149601,7 @@ }, "limit": { "context": 1000000, - "output": 131072 + "output": 384000 }, "temperature": true, "tool_call": true, @@ -153413,42 +149612,38 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ + "none", "low", "high", "max" ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "knowledge": "2025-05", + "release_date": "2026-09-10", + "last_updated": "2026-09-10", "type": "chat" }, { - "id": "deepseek-v4-flash-0731", - "name": "DeepSeek V4 Flash 0731", - "display_name": "DeepSeek V4 Flash 0731", + "id": "deepseek/deepseek-v4-flash-latest", + "name": "DeepSeek V4 Flash Latest", + "display_name": "DeepSeek V4 Flash Latest", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 1048576, + "output": 393216 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -153456,30 +149651,24 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ + "none", + "low", "high", "max" ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-07-31", - "last_updated": "2026-07-31", + "release_date": "2026-08-02", + "last_updated": "2026-08-02", "type": "chat" }, { - "id": "qwen3.7-max", - "name": "Qwen3.7 Max", - "display_name": "Qwen3.7 Max", + "id": "deepseek/deepseek-v4-flash:thinking", + "name": "DeepSeek V4 Flash (Thinking)", + "display_name": "DeepSeek V4 Flash (Thinking)", "modalities": { "input": [ "text" @@ -153489,8 +149678,8 @@ ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 1048576, + "output": 384000 }, "temperature": true, "tool_call": true, @@ -153500,38 +149689,35 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "none", + "high", + "max" ] } }, "attachment": false, - "open_weights": false, - "release_date": "2026-05-21", - "last_updated": "2026-05-21", + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "kimi-k2.6", - "name": "Kimi K2.6", - "display_name": "Kimi K2.6", + "id": "deepseek/deepseek-v4-pro:thinking", + "name": "DeepSeek V4 Pro (Thinking)", + "display_name": "DeepSeek V4 Pro (Thinking)", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1048576, + "output": 384000 }, "temperature": true, "tool_call": true, @@ -153541,41 +149727,36 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "none", + "high", + "max" ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-20", - "last_updated": "2026-04-20", + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "kimi-k2.5", - "name": "Kimi K2.5", - "display_name": "Kimi K2.5", + "id": "deepseek/deepseek-latest", + "name": "DeepSeek Latest", + "display_name": "DeepSeek Latest", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 98304 + "context": 1048576, + "output": 384000 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -153583,40 +149764,36 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "none", + "low", + "high", + "max" ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-01-27", - "last_updated": "2026-01-27", + "release_date": "2026-05-03", + "last_updated": "2026-05-03", "type": "chat" }, { - "id": "deepseek-v4.1-flash-1017", - "name": "DeepSeek V4.1 Flash 1017", - "display_name": "DeepSeek V4.1 Flash 1017", + "id": "deepseek/deepseek-v4.1-flash-1017-uncensored", + "name": "DeepSeek V4.1 Flash 1017 Uncensored", + "display_name": "DeepSeek V4.1 Flash 1017 Uncensored", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 1048576, + "output": 393216 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -153624,42 +149801,36 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ + "none", "low", "high", "max" ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-10-17", - "last_updated": "2026-10-17", + "release_date": "2026-10-27", + "last_updated": "2026-10-27", "type": "chat" }, { - "id": "glm-5.2", - "name": "GLM-5.2", - "display_name": "GLM-5.2", + "id": "deepseek/deepseek-v4.1-flash-1017:thinking", + "name": "DeepSeek V4.1 Flash 1017 Thinking", + "display_name": "DeepSeek V4.1 Flash 1017 Thinking", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 1048576, + "output": 393216 }, "temperature": true, "tool_call": true, @@ -153669,67 +149840,73 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ + "none", + "low", "high", "max" ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "knowledge": "2025-05", + "release_date": "2026-10-17", + "last_updated": "2026-10-17", "type": "chat" }, { - "id": "wan2.7-image-pro", - "name": "Wan2.7 Image Pro", - "display_name": "Wan2.7 Image Pro", + "id": "deepseek/deepseek-v4.1-flash-uncensored:thinking", + "name": "DeepSeek V4.1 Flash Uncensored Thinking", + "display_name": "DeepSeek V4.1 Flash Uncensored Thinking", "modalities": { "input": [ "text" ], "output": [ - "image" + "text" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 1048576, + "output": 393216 }, - "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "low", + "medium", + "high" + ] + } }, "attachment": false, - "open_weights": false, - "release_date": "2026-05-29", - "last_updated": "2026-05-29" + "open_weights": true, + "release_date": "2026-10-01", + "last_updated": "2026-10-01", + "type": "chat" }, { - "id": "deepseek-v4.1-flash", - "name": "DeepSeek V4.1 Flash", - "display_name": "DeepSeek V4.1 Flash", + "id": "deepseek/deepseek-v4-flash-0731:thinking", + "name": "DeepSeek V4 Flash 0731 (Thinking)", + "display_name": "DeepSeek V4 Flash 0731 (Thinking)", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 1048576, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -153739,58 +149916,25 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ + "none", "low", "high", "max" ] } }, - "attachment": true, + "attachment": false, "open_weights": true, "knowledge": "2025-05", - "release_date": "2026-09-10", - "last_updated": "2026-09-10", + "release_date": "2026-07-31", + "last_updated": "2026-07-31", "type": "chat" }, { - "id": "happyhorse-1.1-r2v", - "name": "HappyHorse 1.1 Reference-to-Video", - "display_name": "HappyHorse 1.1 Reference-to-Video", - "modalities": { - "input": [ - "image", - "text" - ], - "output": [ - "video" - ] - }, - "limit": { - "context": 8192, - "output": 8192 - }, - "temperature": true, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": false, - "release_date": "2026-07-17", - "last_updated": "2026-07-17" - }, - { - "id": "deepseek-v3.2", - "name": "DeepSeek V3.2", - "display_name": "DeepSeek V3.2", + "id": "deepseek/deepseek-v4.1-flash-uncensored", + "name": "DeepSeek V4.1 Flash Uncensored", + "display_name": "DeepSeek V4.1 Flash Uncensored", "modalities": { "input": [ "text" @@ -153800,10 +149944,9 @@ ] }, "limit": { - "context": 131072, - "output": 65536 + "context": 1048576, + "output": 393216 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -153811,57 +149954,36 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "effort_options": [ + "none", + "low", + "medium", + "high" + ] } }, "attachment": false, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2025-12-03", - "last_updated": "2025-12-05", + "release_date": "2026-10-01", + "last_updated": "2026-10-01", "type": "chat" }, { - "id": "qwen-image-2.0", - "name": "Qwen Image 2.0", - "display_name": "Qwen Image 2.0", + "id": "deepseek/deepseek-v4.1-flash:thinking", + "name": "DeepSeek V4.1 Flash Thinking", + "display_name": "DeepSeek V4.1 Flash Thinking", "modalities": { "input": [ - "text" - ], - "output": [ + "text", "image" - ] - }, - "limit": { - "context": 8192, - "output": 8192 - }, - "temperature": true, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": false, - "release_date": "2026-03-03", - "last_updated": "2026-03-03" - }, - { - "id": "MiniMax-M2.5", - "name": "MiniMax-M2.5", - "display_name": "MiniMax-M2.5", - "modalities": { - "input": [ - "text" ], "output": [ "text" ] }, "limit": { - "context": 196608, - "output": 32768 + "context": 1000000, + "output": 384000 }, "temperature": true, "tool_call": true, @@ -153871,38 +149993,37 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "none", + "low", + "high", + "max" ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-02-12", - "last_updated": "2026-02-12", + "knowledge": "2025-05", + "release_date": "2026-09-10", + "last_updated": "2026-09-10", "type": "chat" }, { - "id": "qwen3.8-flash", - "name": "Qwen3.8 Flash", - "display_name": "Qwen3.8 Flash", + "id": "deepseek/deepseek-v4-flash-vision-exp", + "name": "DeepSeek V4 Flash Vision Exp", + "display_name": "DeepSeek V4 Flash Vision Exp", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 1048576, + "output": 384000 }, "temperature": true, "tool_call": true, @@ -153913,37 +150034,35 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "high", + "max" + ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" ], - "effort_options": [ - "low", - "medium", - "xhigh" + "notes": [ + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, "attachment": true, - "open_weights": false, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", + "open_weights": true, + "release_date": "2026-08-21", + "last_updated": "2026-09-01", "type": "chat" - } - ] - }, - "mistral": { - "id": "mistral", - "name": "Mistral", - "display_name": "Mistral", - "doc": "https://docs.mistral.ai/getting-started/models/", - "models": [ + }, { - "id": "codestral-2508", - "name": "Codestral 25.08", - "display_name": "Codestral 25.08", + "id": "deepseek/deepseek-v3.2:thinking", + "name": "DeepSeek V3.2 Thinking", + "display_name": "DeepSeek V3.2 Thinking", "modalities": { "input": [ "text", @@ -153954,29 +150073,29 @@ ] }, "limit": { - "context": 256000, - "output": 8192 + "context": 163000, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": true, - "open_weights": false, - "release_date": "2025-07-30", - "last_updated": "2025-07-30", + "open_weights": true, + "knowledge": "2024-07", + "release_date": "2025-12-01", + "last_updated": "2025-12-01", "type": "chat" }, { - "id": "mistral-large-4", - "name": "Mistral Large 4", - "display_name": "Mistral Large 4", + "id": "deepseek/deepseek-v4-flash-0423", + "name": "DeepSeek V4 Flash 0423", + "display_name": "DeepSeek V4 Flash 0423", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" @@ -153984,7 +150103,7 @@ }, "limit": { "context": 1048576, - "output": 262144 + "output": 384000 }, "temperature": true, "tool_call": true, @@ -153996,33 +150115,34 @@ "reasoning": { "effort_options": [ "none", - "high" + "low", + "high", + "max" ] } }, - "attachment": true, - "open_weights": false, - "release_date": "2026-10-06", - "last_updated": "2026-10-06", + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-04-23", + "last_updated": "2026-04-23", "type": "chat" }, { - "id": "mistral-small-latest", - "name": "Mistral Small (latest)", - "display_name": "Mistral Small (latest)", + "id": "deepseek/deepseek-v4-pro", + "name": "DeepSeek V4 Pro", + "display_name": "DeepSeek V4 Pro", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 256000 + "context": 1048576, + "output": 384000 }, "temperature": true, "tool_call": true, @@ -154032,23 +150152,37 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", "effort_options": [ - "none", - "high" + "low", + "high", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2025-06", - "release_date": "2026-03-16", - "last_updated": "2026-03-16", + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "labs-leanstral-1-5-1", - "name": "Leanstral 1.5", - "display_name": "Leanstral 1.5", + "id": "deepseek/deepseek-v4.1-flash-1017", + "name": "DeepSeek V4.1 Flash 1017", + "display_name": "DeepSeek V4.1 Flash 1017", "modalities": { "input": [ "text", @@ -154059,8 +150193,8 @@ ] }, "limit": { - "context": 262144, - "output": 128000 + "context": 1048576, + "output": 393216 }, "temperature": true, "tool_call": true, @@ -154072,121 +150206,146 @@ "reasoning": { "effort_options": [ "none", - "high" + "low", + "high", + "max" ] } }, "attachment": true, "open_weights": true, - "release_date": "2026-06-30", - "last_updated": "2026-06-30", + "knowledge": "2025-05", + "release_date": "2026-10-17", + "last_updated": "2026-10-17", "type": "chat" }, { - "id": "mistral-large-2512", - "name": "Mistral Large 3", - "display_name": "Mistral Large 3", + "id": "deepseek/deepseek-v4-pro-0813:thinking", + "name": "DeepSeek V4 Pro 0813 Thinking", + "display_name": "DeepSeek V4 Pro 0813 Thinking", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1048576, + "output": 384000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "low", + "high", + "max" + ] + } + }, + "attachment": false, "open_weights": true, - "knowledge": "2024-11", - "release_date": "2024-11-01", - "last_updated": "2025-12-02", + "release_date": "2026-08-13", + "last_updated": "2026-08-22", "type": "chat" }, { - "id": "mistral-embed", - "name": "Mistral Embed", - "display_name": "Mistral Embed", + "id": "deepseek/deepseek-v3.2", + "name": "DeepSeek V3.2", + "display_name": "DeepSeek V3.2", "modalities": { "input": [ - "text" + "text", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 8000, - "output": 3072 + "context": 163000, + "output": 65536 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true }, - "attachment": false, - "open_weights": false, - "release_date": "2023-12-11", - "last_updated": "2023-12-11", - "type": "embedding" + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": true, + "open_weights": true, + "knowledge": "2024-07", + "release_date": "2025-12-01", + "last_updated": "2025-12-01", + "type": "chat" }, { - "id": "ministral-3b-2512", - "name": "Ministral 3 3B", - "display_name": "Ministral 3 3B", + "id": "deepseek/deepseek-v4-flash-0423:thinking", + "name": "DeepSeek V4 Flash 0423 (Thinking)", + "display_name": "DeepSeek V4 Flash 0423 (Thinking)", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 262144 + "context": 1048576, + "output": 384000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "low", + "high", + "max" + ] + } + }, + "attachment": false, "open_weights": true, - "release_date": "2025-12-02", - "last_updated": "2025-12-02", + "knowledge": "2025-05", + "release_date": "2026-04-23", + "last_updated": "2026-04-23", "type": "chat" }, { - "id": "mistral-medium-latest", - "name": "Mistral Medium (latest)", - "display_name": "Mistral Medium (latest)", + "id": "deepseek/deepseek-v4.1-flash-0910-uncensored", + "name": "DeepSeek V4.1 Flash 0910 Uncensored", + "display_name": "DeepSeek V4.1 Flash 0910 Uncensored", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 524288, + "output": 32768 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -154196,49 +150355,59 @@ "reasoning": { "effort_options": [ "none", - "high" + "low", + "high", + "max" ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-04-29", - "last_updated": "2026-04-29", + "release_date": "2026-10-27", + "last_updated": "2026-10-27", "type": "chat" }, { - "id": "ministral-14b-2512", - "name": "Ministral 3 14B", - "display_name": "Ministral 3 14B", + "id": "deepseek/deepseek-v4.1-flash-0910-uncensored:thinking", + "name": "DeepSeek V4.1 Flash 0910 Uncensored Thinking", + "display_name": "DeepSeek V4.1 Flash 0910 Uncensored Thinking", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 524288, + "output": 32768 }, - "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "low", + "high", + "max" + ] + } + }, + "attachment": false, "open_weights": true, - "release_date": "2025-12-02", - "last_updated": "2025-12-02", + "release_date": "2026-10-27", + "last_updated": "2026-10-27", "type": "chat" }, { - "id": "glm-5-2", - "name": "GLM-5.2", - "display_name": "GLM-5.2", + "id": "deepseek/deepseek-v4-pro-0813", + "name": "DeepSeek V4 Pro 0813", + "display_name": "DeepSeek V4 Pro 0813", "modalities": { "input": [ "text" @@ -154249,7 +150418,7 @@ }, "limit": { "context": 1048576, - "output": 131072 + "output": 384000 }, "temperature": true, "tool_call": true, @@ -154259,8 +150428,10 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ "none", + "low", "high", "max" ] @@ -154268,48 +150439,54 @@ }, "attachment": false, "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "release_date": "2026-08-13", + "last_updated": "2026-08-22", "type": "chat" }, { - "id": "voxtral-small-2507", - "name": "Voxtral Small", - "display_name": "Voxtral Small", + "id": "deepseek/deepseek-v4.1-flash-1017-uncensored:thinking", + "name": "DeepSeek V4.1 Flash 1017 Uncensored Thinking", + "display_name": "DeepSeek V4.1 Flash 1017 Uncensored Thinking", "modalities": { "input": [ - "text", - "audio", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 32768, - "output": 32000 + "context": 1048576, + "output": 393216 }, - "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "low", + "high", + "max" + ] + } + }, + "attachment": false, "open_weights": true, - "release_date": "2025-07-15", - "last_updated": "2025-07-15", + "release_date": "2026-10-27", + "last_updated": "2026-10-27", "type": "chat" }, { - "id": "voxtral-small-latest", - "name": "Voxtral Small (latest)", - "display_name": "Voxtral Small (latest)", + "id": "EVA-UNIT-01/EVA-LLaMA-3.33-70B-v0.1", + "name": "EVA-LLaMA-3.33-70B-v0.1", + "display_name": "EVA-LLaMA-3.33-70B-v0.1", "modalities": { "input": [ - "text", - "audio", - "pdf" + "text" ], "output": [ "text" @@ -154317,49 +150494,48 @@ }, "limit": { "context": 32768, - "output": 32000 + "output": 16384 }, - "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2025-07-15", - "last_updated": "2025-07-15", + "release_date": "2025-09-25", + "last_updated": "2025-09-25", "type": "chat" }, { - "id": "voxtral-mini-tts-latest", - "name": "Voxtral Mini TTS (latest)", - "display_name": "Voxtral Mini TTS (latest)", + "id": "EVA-UNIT-01/EVA-Qwen2.5-32B-v0.2", + "name": "EVA-Qwen2.5-32B-v0.2", + "display_name": "EVA-Qwen2.5-32B-v0.2", "modalities": { "input": [ "text" ], "output": [ - "audio" + "text" ] }, "limit": { - "context": 8192, + "context": 16384, "output": 8192 }, - "temperature": false, "tool_call": false, "reasoning": { "supported": false }, "attachment": false, "open_weights": true, - "release_date": "2026-03-23", - "last_updated": "2026-03-23" + "release_date": "2025-07-26", + "last_updated": "2025-07-26", + "type": "chat" }, { - "id": "devstral-latest", - "name": "Devstral 2", - "display_name": "Devstral 2", + "id": "EVA-UNIT-01/EVA-LLaMA-3.33-70B-v0.0", + "name": "EVA Llama 3.33 70B", + "display_name": "EVA Llama 3.33 70B", "modalities": { "input": [ "text" @@ -154369,124 +150545,107 @@ ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 32768, + "output": 16384 }, - "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, "attachment": false, "open_weights": true, - "knowledge": "2025-12", - "release_date": "2025-12-09", - "last_updated": "2025-12-09", + "release_date": "2025-07-26", + "last_updated": "2025-07-26", "type": "chat" }, { - "id": "mistral-medium-2505", - "name": "Mistral Medium 3", - "display_name": "Mistral Medium 3", + "id": "EVA-UNIT-01/EVA-Qwen2.5-72B-v0.2", + "name": "EVA-Qwen2.5-72B-v0.2", + "display_name": "EVA-Qwen2.5-72B-v0.2", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 131072 + "context": 16384, + "output": 8192 }, - "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-05", - "release_date": "2025-05-07", - "last_updated": "2025-05-07", + "attachment": false, + "open_weights": true, + "release_date": "2025-09-25", + "last_updated": "2025-09-25", "type": "chat" }, { - "id": "mistral-medium-2604", - "name": "Mistral Medium 3.5", - "display_name": "Mistral Medium 3.5", + "id": "inference-net/schematron-v2-turbo", + "name": "Schematron V2 Turbo", + "display_name": "Schematron V2 Turbo", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 128000, + "output": 8192 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "high" - ] - } + "supported": false }, - "attachment": true, - "open_weights": true, - "release_date": "2026-04-29", - "last_updated": "2026-04-29", + "attachment": false, + "open_weights": false, + "release_date": "2026-04-16", + "last_updated": "2026-04-16", "type": "chat" }, { - "id": "labs-devstral-small-2512", - "name": "Devstral Small 2", - "display_name": "Devstral Small 2", + "id": "inference-net/schematron-v2-small", + "name": "Schematron V2 Small", + "display_name": "Schematron V2 Small", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 256000 + "context": 128000, + "output": 4096 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, - "attachment": true, - "open_weights": true, - "knowledge": "2025-12", - "release_date": "2025-12-09", - "last_updated": "2025-12-09", + "attachment": false, + "open_weights": false, + "release_date": "2026-04-16", + "last_updated": "2026-04-16", "type": "chat" }, { - "id": "codestral-latest", - "name": "Codestral (latest)", - "display_name": "Codestral (latest)", + "id": "openai/gpt-4.1-nano", + "name": "GPT 4.1 Nano", + "display_name": "GPT 4.1 Nano", "modalities": { "input": [ "text", + "image", "pdf" ], "output": [ @@ -154494,25 +150653,25 @@ ] }, "limit": { - "context": 256000, - "output": 4096 + "context": 1047576, + "output": 32768 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, "attachment": true, - "open_weights": true, - "knowledge": "2024-10", - "release_date": "2024-05-29", - "last_updated": "2025-01-04", + "open_weights": false, + "knowledge": "2024-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", "type": "chat" }, { - "id": "mistral-small-2603", - "name": "Mistral Small 4", - "display_name": "Mistral Small 4", + "id": "openai/gpt-6.1-terra", + "name": "GPT 6.1 Terra", + "display_name": "GPT 6.1 Terra", "modalities": { "input": [ "text", @@ -154524,10 +150683,10 @@ ] }, "limit": { - "context": 262144, - "output": 256000 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -154537,61 +150696,54 @@ "reasoning": { "effort_options": [ "none", - "high" + "low", + "medium", + "high", + "xhigh", + "max" ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-06", - "release_date": "2026-03-16", - "last_updated": "2026-03-16", + "open_weights": false, + "knowledge": "2026-06-01", + "release_date": "2026-10-26", + "last_updated": "2026-10-26", "type": "chat" }, { - "id": "zai-glm-5-3-flash", - "name": "GLM-5.3-Flash", - "display_name": "GLM-5.3-Flash", + "id": "openai/gpt-4-turbo", + "name": "GPT-4 Turbo", + "display_name": "GPT-4 Turbo", "modalities": { "input": [ "text", - "image", - "video", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 128000, + "output": 4096 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "high", - "max" - ] - } + "supported": false }, "attachment": true, - "open_weights": true, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", + "open_weights": false, + "knowledge": "2023-12", + "release_date": "2023-11-06", + "last_updated": "2024-04-09", "type": "chat" }, { - "id": "zai-glm-5-3", - "name": "GLM-5.3", - "display_name": "GLM-5.3", + "id": "openai/gpt-oss-20b", + "name": "GPT OSS 20B", + "display_name": "GPT OSS 20B", "modalities": { "input": [ "text" @@ -154601,8 +150753,8 @@ ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 131072, + "output": 16384 }, "temperature": true, "tool_call": true, @@ -154612,157 +150764,192 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ "low", - "high", - "max" + "medium", + "high" ] } }, "attachment": false, "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "voxtral-mini-latest", - "name": "Voxtral Mini (latest)", - "display_name": "Voxtral Mini (latest)", + "id": "openai/gpt-5.6-terra", + "name": "GPT 5.6 Terra", + "display_name": "GPT 5.6 Terra", "modalities": { "input": [ - "audio" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 1050000, + "output": 128000 }, "temperature": false, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": false, - "release_date": "2026-02-04", - "last_updated": "2026-02-04" - }, - { - "id": "devstral-2512", - "name": "Devstral 2", - "display_name": "Devstral 2", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 262144, - "output": 262144 - }, - "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-12", - "release_date": "2025-12-09", - "last_updated": "2025-12-09", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "mistral-small-2506", - "name": "Mistral Small 3.2", - "display_name": "Mistral Small 3.2", + "id": "openai/o1-pro", + "name": "OpenAI o1 Pro", + "display_name": "OpenAI o1 Pro", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 200000, + "output": 100000 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-03", - "release_date": "2025-06-20", - "last_updated": "2025-06-20", + "open_weights": false, + "knowledge": "2023-09", + "release_date": "2025-03-19", + "last_updated": "2025-03-19", "type": "chat" }, { - "id": "zai-glm-5-2", - "name": "GLM-5.2", - "display_name": "GLM-5.2", + "id": "openai/gpt-5.4", + "name": "GPT 5.4", + "display_name": "GPT 5.4", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 1050000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", "effort_options": [ "none", + "low", + "medium", "high", - "max" - ] + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "attachment": true, + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-03-05", + "last_updated": "2026-03-05", "type": "chat" }, { - "id": "magistral-medium-latest", - "name": "Magistral Medium (latest)", - "display_name": "Magistral Medium (latest)", + "id": "openai/gpt-5.6-sol", + "name": "GPT 5.6 Sol", + "display_name": "GPT 5.6 Sol", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 16384 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -154770,55 +150957,95 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ "none", + "low", + "medium", + "high", + "xhigh", + "max" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", "high" - ] + ], + "visibility": "hidden" } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-06", - "release_date": "2025-03-17", - "last_updated": "2025-03-20", + "open_weights": false, + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "pixtral-12b", - "name": "Pixtral 12B", - "display_name": "Pixtral 12B", + "id": "openai/gpt-5.4-mini", + "name": "GPT 5.4 Mini", + "display_name": "GPT 5.4 Mini", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, + "context": 400000, "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } }, "attachment": true, - "open_weights": true, - "knowledge": "2024-09", - "release_date": "2024-09-01", - "last_updated": "2024-09-01", + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-03-17", + "last_updated": "2026-03-17", "type": "chat" }, { - "id": "open-mistral-nemo", - "name": "Open Mistral Nemo", - "display_name": "Open Mistral Nemo", + "id": "openai/gpt-4o", + "name": "GPT-4o", + "display_name": "GPT-4o", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" @@ -154826,24 +151053,24 @@ }, "limit": { "context": 128000, - "output": 128000 + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-07", - "release_date": "2024-07-01", - "last_updated": "2024-07-01", + "attachment": true, + "open_weights": false, + "knowledge": "2023-09", + "release_date": "2024-05-13", + "last_updated": "2024-08-06", "type": "chat" }, { - "id": "mistral-medium-2508", - "name": "Mistral Medium 3.1", - "display_name": "Mistral Medium 3.1", + "id": "openai/gpt-5.1-codex-mini", + "name": "GPT 5.1 Codex Mini", + "display_name": "GPT 5.1 Codex Mini", "modalities": { "input": [ "text", @@ -154854,53 +151081,101 @@ ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 400000, + "output": 128000 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { - "supported": false + "supported": true, + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } }, "attachment": true, "open_weights": false, - "knowledge": "2025-05", - "release_date": "2025-08-12", - "last_updated": "2025-08-12", + "knowledge": "2024-09-30", + "release_date": "2025-11-13", + "last_updated": "2025-11-13", "type": "chat" }, { - "id": "devstral-medium-latest", - "name": "Devstral 2 (latest)", - "display_name": "Devstral 2 (latest)", + "id": "openai/gpt-5.6-luna", + "name": "GPT 5.6 Luna", + "display_name": "GPT 5.6 Luna", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-12", - "release_date": "2025-12-02", - "last_updated": "2025-12-02", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "ministral-3b-latest", - "name": "Ministral 3B (latest)", - "display_name": "Ministral 3B (latest)", + "id": "openai/gpt-5.6-luna-pro", + "name": "GPT 5.6 Luna Pro", + "display_name": "GPT 5.6 Luna Pro", "modalities": { "input": [ "text", @@ -154912,54 +151187,89 @@ ] }, "limit": { - "context": 131072, + "context": 1050000, "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ] + } }, "attachment": true, - "open_weights": true, - "knowledge": "2024-10", - "release_date": "2024-10-01", - "last_updated": "2024-10-04", + "open_weights": false, + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "ministral-8b-2512", - "name": "Ministral 3 8B", - "display_name": "Ministral 3 8B", + "id": "openai/gpt-5.1-codex", + "name": "GPT 5.1 Codex", + "display_name": "GPT 5.1 Codex", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 400000, + "output": 128000 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { - "supported": false + "supported": true, + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } }, "attachment": true, - "open_weights": true, - "release_date": "2025-12-02", - "last_updated": "2025-12-02", + "open_weights": false, + "knowledge": "2024-09-30", + "release_date": "2025-11-13", + "last_updated": "2025-11-13", "type": "chat" }, { - "id": "mistral-large-latest", - "name": "Mistral Large (latest)", - "display_name": "Mistral Large (latest)", + "id": "openai/gpt-4.1", + "name": "GPT 4.1", + "display_name": "GPT 4.1", "modalities": { "input": [ "text", @@ -154971,8 +151281,8 @@ ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1047576, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -154980,29 +151290,28 @@ "supported": false }, "attachment": true, - "open_weights": true, - "knowledge": "2024-11", - "release_date": "2024-11-01", - "last_updated": "2025-12-02", + "open_weights": false, + "knowledge": "2024-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", "type": "chat" }, { - "id": "ministral-8b-latest", - "name": "Ministral 8B (latest)", - "display_name": "Ministral 8B (latest)", + "id": "openai/gpt-4o-2024-08-06", + "name": "GPT-4o (2024-08-06)", + "display_name": "GPT-4o (2024-08-06)", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 128000 + "context": 128000, + "output": 16384 }, "temperature": true, "tool_call": true, @@ -155010,74 +151319,73 @@ "supported": false }, "attachment": true, - "open_weights": true, - "knowledge": "2024-10", - "release_date": "2024-10-01", - "last_updated": "2024-10-04", + "open_weights": false, + "knowledge": "2023-09", + "release_date": "2024-08-06", + "last_updated": "2024-08-06", "type": "chat" - } - ] - }, - "vultr": { - "id": "vultr", - "name": "Vultr", - "display_name": "Vultr", - "api": "https://api.vultrinference.com/v1", - "doc": "https://api.vultrinference.com/", - "models": [ + }, { - "id": "nemotron-3.5-content-safety", - "name": "Nemotron 3.5 Content Safety", - "display_name": "Nemotron 3.5 Content Safety", + "id": "openai/gpt-5.6-sol-pro", + "name": "GPT 5.6 Sol Pro", + "display_name": "GPT 5.6 Sol Pro", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 1050000, + "output": 128000 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { - "supported": true + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-06-02", - "last_updated": "2026-06-02", + "open_weights": false, + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "qwen3.8-27b", - "name": "Qwen3.8 27B", - "display_name": "Qwen3.8 27B", + "id": "openai/gpt-astra-latest", + "name": "GPT Astra Latest", + "display_name": "GPT Astra Latest", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 1050000, + "output": 128000 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -155088,20 +151396,22 @@ "effort_options": [ "low", "medium", - "xhigh" + "high", + "xhigh", + "max" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "open_weights": false, + "release_date": "2026-09-11", + "last_updated": "2026-09-11", "type": "chat" }, { - "id": "laguna-s-2.1", - "name": "Laguna S 2.1", - "display_name": "Laguna S 2.1", + "id": "openai/o3-mini-high", + "name": "OpenAI o3-mini (High)", + "display_name": "OpenAI o3-mini (High)", "modalities": { "input": [ "text" @@ -155111,10 +151421,10 @@ ] }, "limit": { - "context": 1048576, - "output": 32768 + "context": 200000, + "output": 100000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -155122,35 +151432,43 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": false, - "open_weights": true, - "release_date": "2026-07-21", - "last_updated": "2026-07-21", + "open_weights": false, + "knowledge": "2024-05", + "release_date": "2024-12-20", + "last_updated": "2025-01-29", "type": "chat" }, { - "id": "nemotron-3-nano-omni-30b-a3b-reasoning", - "name": "Nemotron 3 Nano Omni 30B A3B Reasoning", - "display_name": "Nemotron 3 Nano Omni 30B A3B Reasoning", + "id": "openai/gpt-6.1-sol-pro", + "name": "GPT 6.1 Sol Pro", + "display_name": "GPT 6.1 Sol Pro", "modalities": { "input": [ "text", "image", - "video", - "audio" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 1050000, + "output": 128000 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -155158,32 +151476,38 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-04-28", - "last_updated": "2026-04-28", + "open_weights": false, + "release_date": "2026-09-29", + "last_updated": "2026-09-29", "type": "chat" }, { - "id": "qwen3.8-flash-next", - "name": "Qwen3.8 Flash Next", - "display_name": "Qwen3.8 Flash Next", + "id": "openai/gpt-5.3-codex", + "name": "GPT 5.3 Codex", + "display_name": "GPT 5.3 Codex", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 131072 + "context": 400000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -155193,105 +151517,142 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ "low", "medium", + "high", "xhigh" - ] + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, - "open_weights": true, - "release_date": "2026-08-27", - "last_updated": "2026-08-27", + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-02-05", + "last_updated": "2026-02-05", "type": "chat" }, { - "id": "mimo-v2.6-flash-rl", - "name": "MiMo-V2.6-Flash", - "display_name": "MiMo-V2.6-Flash", + "id": "openai/gpt-6-astra-pro", + "name": "GPT 6 Astra Pro", + "display_name": "GPT 6 Astra Pro", "modalities": { "input": [ "text", "image", - "audio", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 1050000, + "output": 128000 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + }, "attachment": true, - "open_weights": true, - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "open_weights": false, + "release_date": "2026-09-04", + "last_updated": "2026-09-04", "type": "chat" }, { - "id": "glm-5.3", - "name": "GLM-5.3", - "display_name": "GLM-5.3", + "id": "openai/gpt-5.1", + "name": "GPT 5.1", + "display_name": "GPT 5.1", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 400000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", "effort_options": [ + "none", "low", - "high", - "max" - ] + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "attachment": true, + "open_weights": false, + "knowledge": "2024-09-30", + "release_date": "2025-11-13", + "last_updated": "2025-11-13", "type": "chat" }, { - "id": "deepseek-v4-flash-0731", - "name": "DeepSeek V4 Flash 0731", - "display_name": "DeepSeek V4 Flash 0731", + "id": "openai/gpt-chat-latest", + "name": "GPT Chat Latest", + "display_name": "GPT Chat Latest", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 384000 + "context": 1050000, + "output": 128000 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -155302,94 +151663,104 @@ "supported": true, "effort_options": [ "low", + "medium", "high", + "xhigh", "max" ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-07-31", - "last_updated": "2026-07-31", + "attachment": true, + "open_weights": false, + "release_date": "2026-05-03", + "last_updated": "2026-05-03", "type": "chat" }, { - "id": "mimo-v2.6-pro-rl", - "name": "MiMo-V2.6-Pro", - "display_name": "MiMo-V2.6-Pro", + "id": "openai/gpt-oss-safeguard-20b", + "name": "GPT OSS Safeguard 20B", + "display_name": "GPT OSS Safeguard 20B", "modalities": { "input": [ - "text", - "image", - "audio", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 128000, + "output": 16384 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true }, - "attachment": true, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "high" + ] + } + }, + "attachment": false, "open_weights": true, - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "release_date": "2025-10-29", + "last_updated": "2025-10-29", "type": "chat" }, { - "id": "glm-5.x-menthol", - "name": "GLM-5", - "display_name": "GLM-5", + "id": "openai/gpt-4o-2024-11-20", + "name": "GPT-4o (2024-11-20)", + "display_name": "GPT-4o (2024-11-20)", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 202752, - "output": 131072 + "context": 128000, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": false, - "open_weights": true, - "release_date": "2026-02-12", - "last_updated": "2026-02-12", + "attachment": true, + "open_weights": false, + "knowledge": "2023-09", + "release_date": "2024-11-20", + "last_updated": "2024-11-20", "type": "chat" }, { - "id": "glm-5.2", - "name": "GLM-5.2", - "display_name": "GLM-5.2", + "id": "openai/gpt-6-luna", + "name": "GPT 6 Luna", + "display_name": "GPT 6 Luna", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -155397,38 +151768,40 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ "none", + "low", + "medium", "high", + "xhigh", "max" ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "attachment": true, + "open_weights": false, + "knowledge": "2026-05-18", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "deepseek-v4.1-flash", - "name": "DeepSeek V4.1 Flash", - "display_name": "DeepSeek V4.1 Flash", + "id": "openai/o3-pro-2025-06-10", + "name": "OpenAI o3-pro (2025-06-10)", + "display_name": "OpenAI o3-pro (2025-06-10)", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 384000 + "context": 200000, + "output": 100000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -155437,39 +151810,42 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ "low", - "high", - "max" - ] + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": true, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-09-10", - "last_updated": "2026-09-10", + "attachment": false, + "open_weights": false, + "knowledge": "2024-05", + "release_date": "2025-06-10", + "last_updated": "2025-06-10", "type": "chat" }, { - "id": "minimax-m3", - "name": "MiniMax-M3", - "display_name": "MiniMax-M3", + "id": "openai/gpt-terra-latest", + "name": "GPT Terra Latest", + "display_name": "GPT Terra Latest", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 524288, - "output": 512000 + "context": 1050000, + "output": 128000 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -155477,34 +151853,40 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-06-01", - "last_updated": "2026-06-01", + "open_weights": false, + "release_date": "2026-09-11", + "last_updated": "2026-09-11", "type": "chat" }, { - "id": "glm-5.3-flash", - "name": "GLM-5.3-Flash", - "display_name": "GLM-5.3-Flash", + "id": "openai/gpt-luna-latest", + "name": "GPT Luna Latest", + "display_name": "GPT Luna Latest", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 1050000, + "output": 128000 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -155512,87 +151894,91 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ + "none", "low", + "medium", "high", + "xhigh", "max" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", + "open_weights": false, + "release_date": "2026-09-11", + "last_updated": "2026-09-11", "type": "chat" }, { - "id": "muse-glimmer-30b", - "name": "Muse Glimmer 30B", - "display_name": "Muse Glimmer 30B", + "id": "openai/gpt-5-mini", + "name": "GPT 5 Mini", + "display_name": "GPT 5 Mini", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 131072 + "context": 400000, + "output": 128000 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ + "minimal", "low", "medium", - "high", - "xhigh" - ] + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, - "open_weights": true, - "knowledge": "2026-01-04", - "release_date": "2026-08-10", - "last_updated": "2026-08-10", + "open_weights": false, + "knowledge": "2024-05-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" - } - ] - }, - "modal": { - "id": "modal", - "name": "Modal", - "display_name": "Modal", - "api": "https://inference.us-west.modal.direct/v1", - "doc": "https://modal.com/docs/guide/endpoints", - "models": [ + }, { - "id": "Qwen/Qwen3.8-2.4T-A95B", - "name": "Qwen3.8-Max", - "display_name": "Qwen3.8-Max", + "id": "openai/gpt-6.1-terra-pro", + "name": "GPT 6.1 Terra Pro", + "display_name": "GPT 6.1 Terra Pro", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1010000, - "output": 131072 + "context": 1050000, + "output": 128000 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -155600,45 +151986,40 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ "low", "medium", - "xhigh" + "high", + "xhigh", + "max" ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-08-12", - "last_updated": "2026-08-12", + "attachment": true, + "open_weights": false, + "release_date": "2026-10-27", + "last_updated": "2026-10-27", "type": "chat" }, { - "id": "nvidia/GLM-5.3-Flash-NVFP4", - "name": "GLM-5.3-Flash", - "display_name": "GLM-5.3-Flash", + "id": "openai/gpt-6-sol", + "name": "GPT 6 Sol", + "display_name": "GPT 6 Sol", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -155646,44 +152027,40 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ + "none", "low", + "medium", "high", + "xhigh", "max" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", + "open_weights": false, + "knowledge": "2026-04-20", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "moonshotai/Kimi-K3", - "name": "Kimi K3", - "display_name": "Kimi K3", + "id": "openai/gpt-oss-120b", + "name": "GPT OSS 120B", + "display_name": "GPT OSS 120B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 128000, + "output": 16384 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -155692,40 +152069,37 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "low", + "medium", + "high" ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-16", + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "meta-models/Muse-Spark-Open-816B-A42B", - "name": "Muse Spark Open", - "display_name": "Muse Spark Open", + "id": "openai/o4-mini-high", + "name": "OpenAI o4-mini high", + "display_name": "OpenAI o4-mini high", "modalities": { "input": [ - "text", - "image", - "video", - "audio" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 200000, + "output": 100000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -155734,90 +152108,94 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ "low", "medium", - "high", - "xhigh" - ] + "high" + ], + "visibility": "hidden" } }, - "attachment": true, - "open_weights": true, - "knowledge": "2026-01-04", - "release_date": "2026-10-15", - "last_updated": "2026-10-15", + "attachment": false, + "open_weights": false, + "knowledge": "2024-05", + "release_date": "2025-04-16", + "last_updated": "2025-04-16", "type": "chat" }, { - "id": "zai-org/GLM-5.3", - "name": "GLM-5.3", - "display_name": "GLM-5.3", + "id": "openai/gpt-5.1-codex-max", + "name": "GPT 5.1 Codex Max", + "display_name": "GPT 5.1 Codex Max", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], + "default_enabled": false, + "mode": "effort", + "effort": "none", "effort_options": [ + "none", "low", - "high", - "max" - ] + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "attachment": true, + "open_weights": false, + "knowledge": "2024-09-30", + "release_date": "2025-11-13", + "last_updated": "2025-11-13", "type": "chat" }, { - "id": "zai-org/GLM-5.3-Flash", - "name": "GLM 5.3 Flash", - "display_name": "GLM 5.3 Flash", + "id": "openai/gpt-6-sol-pro", + "name": "GPT 6 Sol Pro", + "display_name": "GPT 6 Sol Pro", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 1050000, + "output": 128000 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -155825,44 +152203,40 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ "low", + "medium", "high", + "xhigh", "max" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", + "open_weights": false, + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-V4.1-Flash", - "name": "DeepSeek V4.1 Flash", - "display_name": "DeepSeek V4.1 Flash", + "id": "openai/gpt-5", + "name": "GPT 5", + "display_name": "GPT 5", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -155871,45 +152245,50 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ + "minimal", "low", - "high", - "max" - ] + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-09-10", - "last_updated": "2026-09-10", + "open_weights": false, + "knowledge": "2024-09-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "thinkingmachines/Inkling-NVFP4", - "name": "Inkling", - "display_name": "Inkling", + "id": "openai/gpt-6.1-sol", + "name": "GPT 6.1 Sol", + "display_name": "GPT 6.1 Sol", "modalities": { "input": [ "text", "image", - "audio" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 262144 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -155917,77 +152296,41 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-07-15", - "last_updated": "2026-07-15", - "type": "chat" - } - ] - }, - "crusoe": { - "id": "crusoe", - "name": "Crusoe", - "display_name": "Crusoe", - "api": "https://api.inference.crusoecloud.com/v1", - "doc": "https://docs.crusoecloud.com/managed-inference/overview", - "models": [ - { - "id": "Qwen/Qwen3-235B-A22B-Instruct-2507", - "name": "Qwen3 235B-A22B Instruct 2507", - "display_name": "Qwen3 235B-A22B Instruct 2507", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 262144, - "output": 16384 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": true, - "release_date": "2025-07-21", - "last_updated": "2025-07-21", + "open_weights": false, + "knowledge": "2026-04-30", + "release_date": "2026-09-29", + "last_updated": "2026-09-29", "type": "chat" }, { - "id": "nvidia/Nemotron-3-Nano-Omni-Reasoning-30B-A3B", - "name": "Nemotron 3 Nano Omni 30B A3B Reasoning", - "display_name": "Nemotron 3 Nano Omni 30B A3B Reasoning", + "id": "openai/gpt-5.2-codex", + "name": "GPT 5.2 Codex", + "display_name": "GPT 5.2 Codex", "modalities": { "input": [ "text", "image", - "video", - "audio" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 65536 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -155996,19 +152339,35 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, - "open_weights": true, - "release_date": "2026-04-28", - "last_updated": "2026-04-28", + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2025-12-11", + "last_updated": "2025-12-11", "type": "chat" }, { - "id": "nvidia/NVIDIA-Nemotron-3-Super-120B-A12B", - "name": "Nemotron 3 Super 120B A12B", - "display_name": "Nemotron 3 Super 120B A12B", + "id": "openai/gpt-5.1-2025-11-13", + "name": "GPT-5.1 (2025-11-13)", + "display_name": "GPT-5.1 (2025-11-13)", "modalities": { "input": [ "text" @@ -156018,60 +152377,100 @@ ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 400000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": false, - "open_weights": true, - "knowledge": "2025-06", - "release_date": "2026-03-11", - "last_updated": "2026-03-11", + "open_weights": false, + "knowledge": "2024-09-30", + "release_date": "2025-11-13", + "last_updated": "2025-11-13", "type": "chat" }, { - "id": "nvidia/NVIDIA-Nemotron-3-Nano-30B-A3B", - "name": "Nemotron 3 Nano 30B A3B", - "display_name": "Nemotron 3 Nano 30B A3B", + "id": "openai/gpt-5.2", + "name": "GPT 5.2", + "display_name": "GPT 5.2", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 400000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-06-25", - "release_date": "2025-12-15", - "last_updated": "2025-12-15", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2025-12-11", + "last_updated": "2025-12-11", "type": "chat" }, { - "id": "google/gemma-4-31b-it", - "name": "Gemma 4 31B IT", - "display_name": "Gemma 4 31B IT", + "id": "openai/gpt-5-pro", + "name": "GPT 5 Pro", + "display_name": "GPT 5 Pro", "modalities": { "input": [ "text", @@ -156082,46 +152481,55 @@ ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 400000, + "output": 128000 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": true, + "mode": "fixed", + "effort": "high", + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "open_weights": false, + "knowledge": "2024-09-30", + "release_date": "2025-10-06", + "last_updated": "2025-10-06", "type": "chat" }, { - "id": "moonshotai/Kimi-K2.6", - "name": "Kimi K2.6", - "display_name": "Kimi K2.6", + "id": "openai/gpt-latest", + "name": "GPT Latest", + "display_name": "GPT Latest", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1050000, + "output": 128000 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -156129,21 +152537,25 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-20", - "last_updated": "2026-04-20", + "open_weights": false, + "release_date": "2026-03-29", + "last_updated": "2026-03-29", "type": "chat" }, { - "id": "openai/gpt-oss-120b", - "name": "GPT OSS 120B", - "display_name": "GPT OSS 120B", + "id": "openai/o3", + "name": "OpenAI o3", + "display_name": "OpenAI o3", "modalities": { "input": [ "text" @@ -156153,11 +152565,11 @@ ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 200000, + "output": 100000 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { "supported": true, "default": true @@ -156165,86 +152577,81 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ "low", "medium", "high" - ] + ], + "visibility": "hidden" } }, "attachment": false, - "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", - "type": "chat" - }, - { - "id": "deepseek-ai/DeepSeek-V3-0324", - "name": "DeepSeek V3 0324", - "display_name": "DeepSeek V3 0324", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 163840, - "output": 163840 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": true, - "release_date": "2025-03-24", - "last_updated": "2025-03-24", + "open_weights": false, + "knowledge": "2024-05", + "release_date": "2025-04-16", + "last_updated": "2025-04-16", "type": "chat" }, { - "id": "zai/GLM-5.1", - "name": "GLM-5.1", - "display_name": "GLM-5.1", + "id": "openai/gpt-5.4-nano", + "name": "GPT 5.4 Nano", + "display_name": "GPT 5.4 Nano", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 131072 + "context": 400000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-04-07", - "last_updated": "2026-04-07", + "attachment": true, + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-03-17", + "last_updated": "2026-03-17", "type": "chat" }, { - "id": "zai/GLM-5.2", - "name": "GLM-5.2", - "display_name": "GLM-5.2", + "id": "openai/o3-mini-low", + "name": "OpenAI o3-mini (Low)", + "display_name": "OpenAI o3-mini (Low)", "modalities": { "input": [ "text" @@ -156254,10 +152661,10 @@ ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 200000, + "output": 100000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -156266,19 +152673,28 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": false, - "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "open_weights": false, + "knowledge": "2024-05", + "release_date": "2024-12-20", + "last_updated": "2025-01-29", "type": "chat" }, { - "id": "meta-llama/Llama-3.3-70B-Instruct", - "name": "Llama-3.3-70B-Instruct", - "display_name": "Llama-3.3-70B-Instruct", + "id": "openai/o1", + "name": "OpenAI o1", + "display_name": "OpenAI o1", "modalities": { "input": [ "text" @@ -156288,51 +152704,11 @@ ] }, "limit": { - "context": 128000, - "output": 4096 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": true, - "knowledge": "2023-12", - "release_date": "2024-12-06", - "last_updated": "2024-12-06", - "type": "chat" - } - ] - }, - "opencode-go": { - "id": "opencode-go", - "name": "OpenCode Go", - "display_name": "OpenCode Go", - "api": "https://opencode.ai/inference/go/openai/v1", - "doc": "https://opencode.ai/v2/docs/console/go/", - "models": [ - { - "id": "mimo-v2.5", - "name": "MiMo V2.5", - "display_name": "MiMo V2.5", - "modalities": { - "input": [ - "text", - "image", - "audio", - "video" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 1000000, - "output": 128000 + "context": 200000, + "output": 100000 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { "supported": true, "default": true @@ -156340,25 +152716,28 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": true, - "open_weights": true, - "knowledge": "2024-12", - "release_date": "2026-04-22", - "last_updated": "2026-04-22", + "attachment": false, + "open_weights": false, + "knowledge": "2023-09", + "release_date": "2024-12-05", + "last_updated": "2024-12-05", "type": "chat" }, { - "id": "claude-haiku-5-5", - "name": "Claude Haiku 5.5", - "display_name": "Claude Haiku 5.5", + "id": "openai/gpt-6-luna-pro", + "name": "GPT 6 Luna Pro", + "display_name": "GPT 6 Luna Pro", "modalities": { "input": [ "text", @@ -156370,10 +152749,9 @@ ] }, "limit": { - "context": 1000000, + "context": 1050000, "output": 128000 }, - "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -156392,31 +152770,29 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-10-07", - "last_updated": "2026-10-07", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "mimo-v2.6-pro", - "name": "MiMo-V2.6-Pro", - "display_name": "MiMo-V2.6-Pro", + "id": "openai/gpt-5.5", + "name": "GPT 5.5", + "display_name": "GPT 5.5", "modalities": { "input": [ "text", "image", - "audio", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -156425,41 +152801,49 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, - "open_weights": true, - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "open_weights": false, + "knowledge": "2025-12-01", + "release_date": "2026-04-23", + "last_updated": "2026-04-23", "type": "chat" }, { - "id": "muse-spark-1.3-contributor", - "name": "Muse Spark 1.3 Contributor", - "display_name": "Muse Spark 1.3 Contributor", + "id": "openai/gpt-sol-latest", + "name": "GPT Sol Latest", + "display_name": "GPT Sol Latest", "modalities": { "input": [ "text", "image", - "video", - "pdf", - "audio" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 1050000, + "output": 128000 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -156468,70 +152852,53 @@ "extra_capabilities": { "reasoning": { "effort_options": [ - "minimal", "low", "medium", "high", - "xhigh" + "xhigh", + "max" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-09-02", - "last_updated": "2026-09-02", + "release_date": "2026-09-11", + "last_updated": "2026-09-11", "type": "chat" }, { - "id": "step-5-preview", - "name": "Step 5 Preview", - "display_name": "Step 5 Preview", + "id": "openai/gpt-4.1-mini", + "name": "GPT 4.1 Mini", + "display_name": "GPT 4.1 Mini", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 1047576, + "output": 32768 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "low", - "medium", - "high" - ] - } + "supported": false }, "attachment": true, - "open_weights": true, - "release_date": "2026-09-16", - "last_updated": "2026-09-20", + "open_weights": false, + "knowledge": "2024-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", "type": "chat" }, { - "id": "hy3", - "name": "Hy3", - "display_name": "Hy3", + "id": "openai/o3-mini", + "name": "OpenAI o3-mini", + "display_name": "OpenAI o3-mini", "modalities": { "input": [ "text" @@ -156541,10 +152908,10 @@ ] }, "limit": { - "context": 256000, - "output": 128000 + "context": 200000, + "output": 100000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -156553,23 +152920,28 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ - "none", "low", + "medium", "high" - ] + ], + "visibility": "hidden" } }, "attachment": false, - "open_weights": true, - "release_date": "2026-07-06", - "last_updated": "2026-07-06", + "open_weights": false, + "knowledge": "2024-05", + "release_date": "2024-12-20", + "last_updated": "2025-01-29", "type": "chat" }, { - "id": "cat-jam-free", - "name": "Cat Jam Free", - "display_name": "Cat Jam Free", + "id": "openai/o4-mini", + "name": "OpenAI o4-mini", + "display_name": "OpenAI o4-mini", "modalities": { "input": [ "text" @@ -156579,10 +152951,10 @@ ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 200000, + "output": 100000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -156591,80 +152963,72 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ "low", "medium", - "high", - "xhigh", - "max" - ] + "high" + ], + "visibility": "hidden" } }, "attachment": false, "open_weights": false, - "release_date": "2026-10-12", - "last_updated": "2026-10-12", + "knowledge": "2024-05", + "release_date": "2025-04-16", + "last_updated": "2025-04-16", "type": "chat" }, { - "id": "qwen3.7-plus", - "name": "Qwen3.7 Plus", - "display_name": "Qwen3.7 Plus", + "id": "openai/gpt-4o-mini", + "name": "GPT-4o mini", + "display_name": "GPT-4o mini", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 128000, + "output": 16384 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2025-04", - "release_date": "2026-06-02", - "last_updated": "2026-06-02", + "knowledge": "2023-09", + "release_date": "2024-07-18", + "last_updated": "2024-07-18", "type": "chat" }, { - "id": "hy4-preview", - "name": "Hy4 preview", - "display_name": "Hy4 preview", + "id": "openai/gpt-6-astra", + "name": "GPT 6 Astra", + "display_name": "GPT 6 Astra", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1024000, - "output": 64000 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -156674,34 +153038,38 @@ "reasoning": { "supported": true, "effort_options": [ - "none", - "high" + "low", + "medium", + "high", + "xhigh", + "max" ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-08-28", - "last_updated": "2026-08-28", + "attachment": true, + "open_weights": false, + "knowledge": "2026-04-30", + "release_date": "2026-09-04", + "last_updated": "2026-09-04", "type": "chat" }, { - "id": "kimi-k2.7-code", - "name": "Kimi K2.7 Code", - "display_name": "Kimi K2.7 Code", + "id": "openai/gpt-5.6-terra-pro", + "name": "GPT 5.6 Terra Pro", + "display_name": "GPT 5.6 Terra Pro", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1050000, + "output": 128000 }, "temperature": false, "tool_call": true, @@ -156711,42 +153079,42 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-06-12", - "last_updated": "2026-06-12", + "open_weights": false, + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "gpt-5.6-luna", - "name": "GPT-5.6 Luna", - "display_name": "GPT-5.6 Luna", + "id": "openai/gpt-5-nano", + "name": "GPT 5 Nano", + "display_name": "GPT 5 Nano", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1050000, + "context": 400000, "output": 128000 }, "temperature": false, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true @@ -156758,12 +153126,10 @@ "mode": "effort", "effort": "medium", "effort_options": [ - "none", + "minimal", "low", "medium", - "high", - "xhigh", - "max" + "high" ], "verbosity": "medium", "verbosity_options": [ @@ -156776,28 +153142,26 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "knowledge": "2024-05-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "qwen3.8-max", - "name": "Qwen3.8 Max", - "display_name": "Qwen3.8 Max", + "id": "ibm-granite/granite-4.2-8b", + "name": "Granite 4.2 8B", + "display_name": "Granite 4.2 8B", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 131072, + "output": 117964 }, "temperature": true, "tool_call": true, @@ -156807,66 +153171,76 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ + "none", "low", - "medium", - "xhigh" + "high" ] } }, - "attachment": true, - "open_weights": false, - "release_date": "2026-08-03", - "last_updated": "2026-08-03", + "attachment": false, + "open_weights": true, + "release_date": "2026-08-25", + "last_updated": "2026-08-25", "type": "chat" }, { - "id": "gemini-4-argon", - "name": "Gemini 4 Argon", - "display_name": "Gemini 4 Argon", + "id": "GalrionSoftworks/MN-LooseCannon-12B-v1", + "name": "MN-LooseCannon-12B-v1", + "display_name": "MN-LooseCannon-12B-v1", "modalities": { "input": [ - "text", - "image", - "video", - "audio", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, + "context": 16384, + "output": 8192 + }, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "release_date": "2024-01-01", + "last_updated": "2024-07-01", + "type": "chat" + }, + { + "id": "pamanseau/OpenReasoning-Nemotron-32B", + "name": "OpenReasoning Nemotron 32B", + "display_name": "OpenReasoning Nemotron 32B", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 32768, "output": 65536 }, - "temperature": false, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high" - ] - } - }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-10-13", - "last_updated": "2026-10-13", + "attachment": false, + "open_weights": true, + "release_date": "2025-08-21", + "last_updated": "2025-08-21", "type": "chat" }, { - "id": "deepseek-v4-pro", - "name": "DeepSeek V4 Pro (New)", - "display_name": "DeepSeek V4 Pro (New)", + "id": "aleph-alpha/kolibri-1", + "name": "Kolibri 1", + "display_name": "Kolibri 1", "modalities": { "input": [ "text" @@ -156876,8 +153250,8 @@ ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 1048576, + "output": 943718 }, "temperature": true, "tool_call": true, @@ -156887,37 +153261,25 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", "effort_options": [ + "none", "low", - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." + "medium", + "high" ] } }, "attachment": false, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "knowledge": "2026-06-18", + "release_date": "2026-10-03", + "last_updated": "2026-10-03", "type": "chat" }, { - "id": "longcat-2.0", - "name": "LongCat-2.0", - "display_name": "LongCat-2.0", + "id": "inception/mercury-2.5-preview", + "name": "Mercury 2.5 Preview", + "display_name": "Mercury 2.5 Preview", "modalities": { "input": [ "text" @@ -156927,10 +153289,9 @@ ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 260000, + "output": 65536 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -156939,29 +153300,27 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "none", + "low", + "medium", + "high" ] } }, "attachment": false, - "open_weights": true, - "release_date": "2026-06-30", - "last_updated": "2026-06-30", + "open_weights": false, + "release_date": "2026-09-01", + "last_updated": "2026-09-01", "type": "chat" }, { - "id": "minimax-m3.1-flash", - "name": "MiniMax M3.1 Flash", - "display_name": "MiniMax M3.1 Flash", + "id": "inception/mercury-3", + "name": "Mercury 3", + "display_name": "Mercury 3", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" @@ -156969,7 +153328,7 @@ }, "limit": { "context": 1000000, - "output": 512000 + "output": 131072 }, "temperature": true, "tool_call": true, @@ -156979,130 +153338,90 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ + "none", "low", "medium", - "high", - "xhigh", - "max" + "high" ] } }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2026-10-19", - "last_updated": "2026-10-19", + "release_date": "2026-10-16", + "last_updated": "2026-10-20", "type": "chat" }, { - "id": "gemini-4-argon-contributor", - "name": "Gemini 4 Argon Contributor", - "display_name": "Gemini 4 Argon Contributor", + "id": "failspy/Meta-Llama-3-70B-Instruct-abliterated-v3.5", + "name": "Llama 3 70B abliterated", + "display_name": "Llama 3 70B abliterated", "modalities": { "input": [ - "text", - "image", - "video", - "audio", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 8192, + "output": 8192 }, - "temperature": false, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high" - ] - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-10-13", - "last_updated": "2026-10-13", + "attachment": false, + "open_weights": true, + "release_date": "2025-07-26", + "last_updated": "2025-07-26", "type": "chat" }, { - "id": "muse-spark-1.2-contributor", - "name": "Muse Spark 1.2 Contributor", - "display_name": "Muse Spark 1.2 Contributor", + "id": "nvidia/Llama-3.1-Nemotron-70B-Instruct-HF", + "name": "Nvidia Nemotron 70b", + "display_name": "Nvidia Nemotron 70b", "modalities": { "input": [ - "text", - "image", - "video", - "pdf", - "audio" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 16384, + "output": 8192 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "minimal", - "low", - "medium", - "high", - "xhigh" - ] - } + "supported": false }, - "attachment": true, - "open_weights": false, - "release_date": "2026-08-05", - "last_updated": "2026-08-05", + "attachment": false, + "open_weights": true, + "release_date": "2025-04-15", + "last_updated": "2025-04-15", "type": "chat" }, { - "id": "grok-4.7", - "name": "Grok 4.7", - "display_name": "Grok 4.7", + "id": "nvidia/nemotron-3.5-super-vl", + "name": "Nvidia Nemotron 3.5 Super VL", + "display_name": "Nvidia Nemotron 3.5 Super VL", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 500000, - "output": 500000 + "context": 262144, + "output": 16384 }, "temperature": true, "tool_call": true, @@ -157113,64 +153432,51 @@ "extra_capabilities": { "reasoning": { "effort_options": [ - "low", + "none", "medium", - "high", - "xhigh" + "high" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-05", - "release_date": "2026-09-21", - "last_updated": "2026-09-21", + "open_weights": true, + "release_date": "2026-10-15", + "last_updated": "2026-10-15", "type": "chat" }, { - "id": "longcat-2.5-preview-free", - "name": "LongCat 2.5 Preview Free", - "display_name": "LongCat 2.5 Preview Free", + "id": "nvidia/nemotron-3-super-120b-a12b", + "name": "Nvidia Nemotron 3 Super 120B", + "display_name": "Nvidia Nemotron 3 Super 120B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 262144, + "output": 16384 }, - "temperature": false, - "tool_call": true, + "temperature": true, + "tool_call": false, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, - "attachment": true, - "open_weights": false, - "release_date": "2026-09-25", - "last_updated": "2026-09-25", + "attachment": false, + "open_weights": true, + "knowledge": "2025-06", + "release_date": "2026-03-11", + "last_updated": "2026-03-11", "type": "chat" }, { - "id": "glm-5.3", - "name": "GLM-5.3", - "display_name": "GLM-5.3", + "id": "nvidia/nemotron-3.5-lightning", + "name": "Nvidia Nemotron 3.5 Lightning", + "display_name": "Nvidia Nemotron 3.5 Lightning", "modalities": { "input": [ "text" @@ -157181,7 +153487,7 @@ }, "limit": { "context": 1000000, - "output": 131072 + "output": 65536 }, "temperature": true, "tool_call": true, @@ -157192,29 +153498,23 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ - "low", - "high", - "max" + "none", + "high" ] } }, "attachment": false, "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "knowledge": "2025-09", + "release_date": "2026-08-11", + "last_updated": "2026-08-11", "type": "chat" }, { - "id": "beam-free", - "name": "Beam Free", - "display_name": "Beam Free", + "id": "nvidia/nemotron-3.5-content-safety", + "name": "Nemotron 3.5 Content Safety", + "display_name": "Nemotron 3.5 Content Safety", "modalities": { "input": [ "text" @@ -157224,106 +153524,71 @@ ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 131072, + "output": 32768 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ] + "supported": true } }, "attachment": false, "open_weights": true, - "knowledge": "2026-06-30", - "release_date": "2026-10-05", - "last_updated": "2026-10-16", + "release_date": "2026-06-02", + "last_updated": "2026-06-02", "type": "chat" }, { - "id": "space-bunny", - "name": "Space Bunny", - "display_name": "Space Bunny", + "id": "nvidia/nemotron-3-nano-30b-a3b", + "name": "Nvidia Nemotron 3 Nano 30B", + "display_name": "Nvidia Nemotron 3 Nano 30B", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 524288 + "context": 262144, + "output": 235929 }, - "tool_call": true, + "temperature": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ] - } + "supported": false }, - "attachment": true, - "open_weights": false, - "release_date": "2026-09-23", - "last_updated": "2026-09-23", + "attachment": false, + "open_weights": true, + "knowledge": "2025-06-25", + "release_date": "2025-12-15", + "last_updated": "2025-12-15", "type": "chat" }, { - "id": "kimi-k3", - "name": "Kimi K3", - "display_name": "Kimi K3", + "id": "nvidia/nemotron-3.5-lightning:thinking", + "name": "Nvidia Nemotron 3.5 Lightning Thinking", + "display_name": "Nvidia Nemotron 3.5 Lightning Thinking", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 1000000, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -157331,74 +153596,52 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ - "max" + "none", + "high" ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-16", + "knowledge": "2025-09", + "release_date": "2026-08-11", + "last_updated": "2026-08-11", "type": "chat" }, { - "id": "kimi-k3.1-pro", - "name": "Kimi K3.1 Pro", - "display_name": "Kimi K3.1 Pro", + "id": "nvidia/nemotron-3-super-120b-a12b:thinking", + "name": "Nvidia Nemotron 3 Super 120B Thinking", + "display_name": "Nvidia Nemotron 3 Super 120B Thinking", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 262144, + "output": 16384 }, - "temperature": false, - "tool_call": true, + "temperature": true, + "tool_call": false, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "low", - "high", - "max" - ] - } - }, - "attachment": true, - "open_weights": false, - "release_date": "2026-10-23", - "last_updated": "2026-10-23", + "attachment": false, + "open_weights": true, + "knowledge": "2025-06", + "release_date": "2026-03-11", + "last_updated": "2026-03-11", "type": "chat" }, { - "id": "mimo-v2.5-pro", - "name": "MiMo V2.5 Pro", - "display_name": "MiMo V2.5 Pro", + "id": "nvidia/nemotron-3-ultra-550b-a55b:thinking", + "name": "Nvidia Nemotron 3 Ultra 550B Thinking", + "display_name": "Nvidia Nemotron 3 Ultra 550B Thinking", "modalities": { "input": [ "text" @@ -157408,8 +153651,8 @@ ] }, "limit": { - "context": 1048576, - "output": 128000 + "context": 1000000, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -157417,28 +153660,17 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, "attachment": false, "open_weights": true, - "knowledge": "2024-12", - "release_date": "2026-04-22", - "last_updated": "2026-04-22", + "knowledge": "2025-09", + "release_date": "2026-06-04", + "last_updated": "2026-06-04", "type": "chat" }, { - "id": "iceman-contributor-free", - "name": "Iceman Contributor Free", - "display_name": "Iceman Contributor Free", + "id": "nvidia/Llama-3.3-Nemotron-Super-49B-v1", + "name": "Nvidia Nemotron Super 49B", + "display_name": "Nvidia Nemotron Super 49B", "modalities": { "input": [ "text" @@ -157448,37 +153680,35 @@ ] }, "limit": { - "context": 262144, - "output": 131072 + "context": 128000, + "output": 16384 }, - "tool_call": true, + "temperature": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2026-10-24", - "last_updated": "2026-10-24", + "open_weights": true, + "release_date": "2025-03-18", + "last_updated": "2025-03-18", "type": "chat" }, { - "id": "minimax-m3.1-flash-free", - "name": "MiniMax M3.1 Flash Free", - "display_name": "MiniMax M3.1 Flash Free", + "id": "nvidia/nemotron-3-ultra-550b-a55b", + "name": "Nvidia Nemotron 3 Ultra 550B", + "display_name": "Nvidia Nemotron 3 Ultra 550B", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 512000 + "context": 512288, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -157488,87 +153718,64 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ] + "supported": true } }, - "attachment": true, - "open_weights": false, - "release_date": "2026-10-19", - "last_updated": "2026-10-19", + "attachment": false, + "open_weights": true, + "knowledge": "2025-09", + "release_date": "2026-06-04", + "last_updated": "2026-06-04", "type": "chat" }, { - "id": "glm-5.2", - "name": "GLM-5.2", - "display_name": "GLM-5.2", + "id": "perceptron/perceptron-mk1", + "name": "Perceptron Mk1", + "display_name": "Perceptron Mk1", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 32768, + "output": 8192 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "high", - "max" - ] - } - }, - "attachment": false, - "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "attachment": true, + "open_weights": false, + "release_date": "2026-05-12", + "last_updated": "2026-05-12", "type": "chat" }, { - "id": "deepseek-v4.1-flash", - "name": "DeepSeek V4.1 Flash", - "display_name": "DeepSeek V4.1 Flash", + "id": "perceptron/perceptron-mk1.5", + "name": "Perceptron Mk1.5", + "display_name": "Perceptron Mk1.5", "modalities": { "input": [ "text", - "image" + "image", + "video", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 36864, + "output": 8192 }, "temperature": true, "tool_call": true, @@ -157578,46 +153785,64 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ + "none", + "minimal", "low", - "high", - "max" + "medium", + "high" ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-09-10", - "last_updated": "2026-09-10", + "open_weights": false, + "release_date": "2026-09-25", + "last_updated": "2026-09-25", "type": "chat" }, { - "id": "minimax-m3", - "name": "MiniMax-M3", - "display_name": "MiniMax-M3", + "id": "Gryphe/MythoMax-L2-13b", + "name": "MythoMax 13B", + "display_name": "MythoMax 13B", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 4096, + "output": 3686 }, "temperature": true, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "release_date": "2023-08-10", + "last_updated": "2023-08-10", + "type": "chat" + }, + { + "id": "heabsy/cyberheabsy", + "name": "CyberHeabsy", + "display_name": "CyberHeabsy", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1048576, + "output": 65536 + }, "tool_call": true, "reasoning": { "supported": true, @@ -157625,35 +153850,37 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "effort_options": [ + "none", + "low", + "medium", + "high" + ] } }, - "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-06-01", - "last_updated": "2026-06-01", + "attachment": false, + "open_weights": false, + "release_date": "2026-09-27", + "last_updated": "2026-09-27", "type": "chat" }, { - "id": "step-5-preview-free", - "name": "Step 5 Preview Free", - "display_name": "Step 5 Preview Free", + "id": "heabsy/qwen3.8-27b-uncensored-fast", + "name": "Qwen 3.8 27B Uncensored Fast by Heabsy", + "display_name": "Qwen 3.8 27B Uncensored Fast by Heabsy", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 524288, + "output": 235929 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -157661,45 +153888,35 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ - "low", - "medium", + "none", "high" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-09-16", - "last_updated": "2026-09-20", + "open_weights": false, + "release_date": "2026-10-16", + "last_updated": "2026-10-16", "type": "chat" }, { - "id": "glm-5.3-flash", - "name": "GLM-5.3-Flash", - "display_name": "GLM-5.3-Flash", + "id": "particle-ai/particle-1", + "name": "Particle-1", + "display_name": "Particle-1", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, + "context": 1048576, "output": 131072 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -157707,30 +153924,27 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ + "none", + "minimal", "low", + "medium", "high", + "xhigh", "max" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", + "open_weights": false, + "release_date": "2026-10-29", + "last_updated": "2026-10-29", "type": "chat" }, { - "id": "minimax-m2.7", - "name": "MiniMax-M2.7", - "display_name": "MiniMax-M2.7", + "id": "NeverSleep/Lumimaid-v0.2-70B", + "name": "Lumimaid v0.2", + "display_name": "Lumimaid v0.2", "modalities": { "input": [ "text" @@ -157740,52 +153954,35 @@ ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 16384, + "output": 8192 }, - "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": false, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-03-18", - "last_updated": "2026-03-18", + "release_date": "2024-01-01", + "last_updated": "2024-07-01", "type": "chat" }, { - "id": "gpt-6-luna", - "name": "GPT-6 Luna", - "display_name": "GPT-6 Luna", + "id": "abliteration-ai/abliterated-model-large", + "name": "Abliterated Model Large", + "display_name": "Abliterated Model Large", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1000000, + "output": 999990 }, - "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -157795,6 +153992,7 @@ "reasoning": { "effort_options": [ "none", + "minimal", "low", "medium", "high", @@ -157803,74 +154001,70 @@ ] } }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2026-05-18", - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "release_date": "2026-08-27", + "last_updated": "2026-08-27", "type": "chat" }, { - "id": "mimo-v2.6-flash", - "name": "MiMo-V2.6-Flash", - "display_name": "MiMo-V2.6-Flash", + "id": "abliteration-ai/abliterated-model", + "name": "Abliterated Model", + "display_name": "Abliterated Model", "modalities": { "input": [ "text", - "image", - "audio", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 262144, + "output": 262134 }, - "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "none", + "minimal", + "low", + "medium", + "high", + "xhigh", + "max" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "open_weights": false, + "release_date": "2026-08-27", + "last_updated": "2026-08-27", "type": "chat" }, { - "id": "qwen3.8-flash", - "name": "Qwen3.8 Flash", - "display_name": "Qwen3.8 Flash", + "id": "abliteration-ai/abliterated-model-large-flash", + "name": "Abliterated Large Flash", + "display_name": "Abliterated Large Flash", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 1048576, + "output": 262144 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -157878,33 +154072,27 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ + "none", + "minimal", "low", "medium", - "xhigh" + "high", + "xhigh", + "max" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", + "release_date": "2026-10-23", + "last_updated": "2026-10-23", "type": "chat" - } - ] - }, - "hpc-ai": { - "id": "hpc-ai", - "name": "HPC-AI", - "display_name": "HPC-AI", - "api": "https://api.hpc-ai.com/inference/v1", - "doc": "https://www.hpc-ai.com/doc/docs/quickstart/", - "models": [ + }, { - "id": "minimax/minimax-m2.5", - "name": "MiniMax-M2.5", - "display_name": "MiniMax-M2.5", + "id": "abliteration-ai/abliterated-model-large-v2", + "name": "Abliterated Model Large V2", + "display_name": "Abliterated Model Large V2", "modalities": { "input": [ "text" @@ -157914,10 +154102,9 @@ ] }, "limit": { - "context": 196000, - "output": 195000 + "context": 1048576, + "output": 999990 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -157925,31 +154112,34 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "effort_options": [ + "low", + "high", + "max" + ] } }, "attachment": false, - "open_weights": true, - "release_date": "2026-02-12", - "last_updated": "2026-02-12", + "open_weights": false, + "release_date": "2026-08-31", + "last_updated": "2026-08-31", "type": "chat" }, { - "id": "moonshotai/kimi-k2.7-code", - "name": "Kimi K2.7 Code", - "display_name": "Kimi K2.7 Code", + "id": "z-ai/glm-5.3:thinking", + "name": "GLM 5.3 Thinking", + "display_name": "GLM 5.3 Thinking", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 256000 + "context": 1048576, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -157959,32 +154149,33 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "effort_options": [ + "high", + "max" + ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-06-12", - "last_updated": "2026-06-12", + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "moonshotai/kimi-k2.5", - "name": "Kimi K2.5", - "display_name": "Kimi K2.5", + "id": "z-ai/glm-5.2", + "name": "GLM 5.2", + "display_name": "GLM 5.2", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 256000 + "context": 1048576, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -157995,39 +154186,35 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "none", + "high", + "max" ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-01-27", - "last_updated": "2026-01-27", + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "openai/gpt-5.5", - "name": "GPT-5.5", - "display_name": "GPT-5.5", + "id": "z-ai/glm-5.3-uncensored", + "name": "GLM 5.3 Uncensored", + "display_name": "GLM 5.3 Uncensored", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1048576, + "output": 131072 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -158035,36 +154222,23 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", "effort_options": [ "low", - "medium", "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "max" + ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-12-01", - "release_date": "2026-04-23", - "last_updated": "2026-04-23", + "attachment": false, + "open_weights": true, + "release_date": "2026-09-26", + "last_updated": "2026-09-26", "type": "chat" }, { - "id": "zai-org/glm-5.1", - "name": "GLM 5.1", - "display_name": "GLM 5.1", + "id": "z-ai/GLM-4.6-turbo:thinking", + "name": "GLM 4.6 Turbo (Thinking)", + "display_name": "GLM 4.6 Turbo (Thinking)", "modalities": { "input": [ "text" @@ -158074,36 +154248,24 @@ ] }, "limit": { - "context": 202000, - "output": 202000 + "context": 204800, + "output": 131072 }, - "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, "attachment": false, "open_weights": true, - "release_date": "2026-04-07", - "last_updated": "2026-04-07", + "release_date": "2025-10-02", + "last_updated": "2025-10-02", "type": "chat" }, { - "id": "zai-org/glm-5.2", - "name": "GLM-5.2", - "display_name": "GLM-5.2", + "id": "z-ai/GLM-4.5:thinking", + "name": "GLM 4.5 (Thinking)", + "display_name": "GLM 4.5 (Thinking)", "modalities": { "input": [ "text" @@ -158113,43 +154275,30 @@ ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 128000, + "output": 65536 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "high", - "max" - ] - } - }, "attachment": false, "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "knowledge": "2025-04", + "release_date": "2025-07-28", + "last_updated": "2025-07-28", "type": "chat" }, { - "id": "deepseek/deepseek-v4-flash", - "name": "DeepSeek V4 Flash", - "display_name": "DeepSeek V4 Flash", + "id": "z-ai/glm-5.3-flash-uncensored", + "name": "GLM 5.3 Flash Uncensored", + "display_name": "GLM 5.3 Flash Uncensored", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" @@ -158157,9 +154306,8 @@ }, "limit": { "context": 1048576, - "output": 128000 + "output": 32768 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -158167,181 +154315,117 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", "effort_options": [ "low", - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." + "high" ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "release_date": "2026-07-29", + "last_updated": "2026-08-27", "type": "chat" }, { - "id": "deepseek/deepseek-v4-pro", - "name": "DeepSeek V4 Pro", - "display_name": "DeepSeek V4 Pro", + "id": "z-ai/glm-5v-turbo", + "name": "GLM 5V Turbo", + "display_name": "GLM 5V Turbo", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1002000, - "output": 128000 + "context": 202800, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." - ] - } - }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "attachment": true, + "open_weights": false, + "release_date": "2026-04-01", + "last_updated": "2026-04-01", "type": "chat" }, { - "id": "anthropic/claude-opus-4.7", - "name": "Claude Opus 4.7", - "display_name": "Claude Opus 4.7", + "id": "z-ai/glm-4.6:thinking", + "name": "GLM 4.6 Thinking", + "display_name": "GLM 4.6 Thinking", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 200000, + "output": 65535 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "high", "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." + "none", + "high" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-04-16", - "last_updated": "2026-04-16", + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-09-30", + "last_updated": "2025-09-30", "type": "chat" - } - ] - }, - "vercel": { - "id": "vercel", - "name": "Vercel AI Gateway", - "display_name": "Vercel AI Gateway", - "doc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", - "models": [ + }, { - "id": "meta/llama-4-maverick", - "name": "Llama-4-Maverick-17B-128E-Instruct-FP8", - "display_name": "Llama-4-Maverick-17B-128E-Instruct-FP8", + "id": "z-ai/glm-4.6-original", + "name": "GLM 4.6 Original", + "display_name": "GLM 4.6 Original", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 256000, + "output": 65535 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2024-08", - "release_date": "2025-04-05", - "last_updated": "2025-04-05", + "knowledge": "2025-04", + "release_date": "2025-09-30", + "last_updated": "2025-09-30", "type": "chat" }, { - "id": "meta/llama-3.1-70b", - "name": "Llama 3.1 70B Instruct", - "display_name": "Llama 3.1 70B Instruct", + "id": "z-ai/glm-5.3", + "name": "GLM 5.3", + "display_name": "GLM 5.3", "modalities": { "input": [ "text" @@ -158351,66 +154435,67 @@ ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 1048576, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "low", + "high", + "max" + ] + } }, "attachment": false, "open_weights": true, - "knowledge": "2023-12", - "release_date": "2024-07-23", - "last_updated": "2024-07-23", + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "meta/muse-spark-1.3-contributor", - "name": "Muse Spark 1.3 Contributor", - "display_name": "Muse Spark 1.3 Contributor", + "id": "z-ai/glm-5-turbo", + "name": "GLM 5 Turbo", + "display_name": "GLM 5 Turbo", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 1048576 + "context": 202800, + "output": 131072 }, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": true }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "minimal", - "low", - "medium", - "high", - "xhigh", - "max" - ] + "supported": true } }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2026-09-02", - "last_updated": "2026-09-02", + "release_date": "2026-03-16", + "last_updated": "2026-03-16", "type": "chat" }, { - "id": "meta/llama-3.1-8b", - "name": "Llama 3.1 8B Instruct", - "display_name": "Llama 3.1 8B Instruct", + "id": "z-ai/glm-4.5", + "name": "GLM 4.5", + "display_name": "GLM 4.5", "modalities": { "input": [ "text" @@ -158421,38 +154506,37 @@ }, "limit": { "context": 128000, - "output": 8192 + "output": 65536 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, "attachment": false, "open_weights": true, - "knowledge": "2023-12", - "release_date": "2024-07-23", - "last_updated": "2024-07-23", + "knowledge": "2025-04", + "release_date": "2025-07-28", + "last_updated": "2025-07-28", "type": "chat" }, { - "id": "meta/muse-spark-1.2-contributor", - "name": "Muse Spark 1.2 Contributor", - "display_name": "Muse Spark 1.2 Contributor", + "id": "z-ai/glm-5.1:thinking", + "name": "GLM 5.1 Thinking", + "display_name": "GLM 5.1 Thinking", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 1048576 + "context": 200000, + "output": 131072 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -158461,24 +154545,21 @@ "extra_capabilities": { "reasoning": { "effort_options": [ - "minimal", - "low", - "medium", - "high", - "xhigh" + "none", + "high" ] } }, - "attachment": true, - "open_weights": false, - "release_date": "2026-08-05", - "last_updated": "2026-08-05", + "attachment": false, + "open_weights": true, + "release_date": "2026-04-07", + "last_updated": "2026-04-07", "type": "chat" }, { - "id": "meta/muse-spark-open", - "name": "Muse Spark Open", - "display_name": "Muse Spark Open", + "id": "z-ai/glm-5.3-flash-apex", + "name": "Apex Flash 1", + "display_name": "Apex Flash 1", "modalities": { "input": [ "text", @@ -158490,9 +154571,8 @@ }, "limit": { "context": 1048576, - "output": 1048576 + "output": 32768 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -158502,137 +154582,108 @@ "reasoning": { "effort_options": [ "low", - "medium", "high", - "xhigh" + "max" ] } }, "attachment": true, "open_weights": true, - "knowledge": "2026-01-04", - "release_date": "2026-10-15", - "last_updated": "2026-10-15", + "release_date": "2026-10-05", + "last_updated": "2026-10-05", "type": "chat" }, { - "id": "meta/llama-4-scout", - "name": "Llama-4-Scout-17B-16E-Instruct-FP8", - "display_name": "Llama-4-Scout-17B-16E-Instruct-FP8", + "id": "z-ai/glm-5-original:thinking", + "name": "GLM 5 Original Thinking", + "display_name": "GLM 5 Original Thinking", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 200000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2024-08", - "release_date": "2025-04-05", - "last_updated": "2025-04-05", + "release_date": "2026-02-12", + "last_updated": "2026-02-12", "type": "chat" }, { - "id": "meta/muse-spark-1.3", - "name": "Muse Spark 1.3", - "display_name": "Muse Spark 1.3", + "id": "z-ai/glm-4.6v", + "name": "GLM 4.6V", + "display_name": "GLM 4.6V", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 1048576 + "context": 128000, + "output": 24000 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "minimal", - "low", - "medium", - "high", - "xhigh", - "max" - ] - } + "supported": false }, "attachment": true, - "open_weights": false, - "release_date": "2026-09-02", - "last_updated": "2026-09-02", + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-12-08", + "last_updated": "2025-12-08", "type": "chat" }, { - "id": "meta/muse-wonder-1.0", - "name": "Muse Wonder", - "display_name": "Muse Wonder", + "id": "z-ai/glm-4.6v-original", + "name": "GLM 4.6V Original", + "display_name": "GLM 4.6V Original", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 1048576 + "context": 128000, + "output": 24000 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "minimal", - "low", - "medium", - "high", - "xhigh", - "max" - ] - } + "supported": false }, "attachment": true, - "open_weights": false, - "release_date": "2026-10-12", - "last_updated": "2026-10-12", + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-12-08", + "last_updated": "2025-12-08", "type": "chat" }, { - "id": "meta/llama-3.3-70b", - "name": "Llama-3.3-70B-Instruct", - "display_name": "Llama-3.3-70B-Instruct", + "id": "z-ai/glm-4.7-original", + "name": "GLM 4.7 Original", + "display_name": "GLM 4.7 Original", "modalities": { "input": [ "text" @@ -158642,65 +154693,67 @@ ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 200000, + "output": 65535 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": false, "open_weights": true, - "knowledge": "2023-12", - "release_date": "2024-12-06", - "last_updated": "2024-12-06", + "knowledge": "2025-04", + "release_date": "2025-12-22", + "last_updated": "2025-12-22", "type": "chat" }, { - "id": "meta/muse-image-1.0", - "name": "Muse Image 1.0", - "display_name": "Muse Image 1.0", + "id": "z-ai/glm-4.5v:thinking", + "name": "GLM 4.5V Thinking", + "display_name": "GLM 4.5V Thinking", "modalities": { "input": [ "text", "image" ], "output": [ - "image" + "text" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 65536, + "output": 16384 }, - "temperature": false, + "temperature": true, "tool_call": false, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": true, - "open_weights": false, - "release_date": "2026-07-07", - "last_updated": "2026-07-07" + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-08-11", + "last_updated": "2025-08-11", + "type": "chat" }, { - "id": "meta/muse-spark-1.2", - "name": "Muse Spark 1.2", - "display_name": "Muse Spark 1.2", + "id": "z-ai/glm-5-original", + "name": "GLM 5 Original", + "display_name": "GLM 5 Original", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 1048576 + "context": 200000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -158708,41 +154761,27 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "minimal", - "low", - "medium", - "high", - "xhigh" - ] - } - }, - "attachment": true, - "open_weights": false, - "release_date": "2026-08-05", - "last_updated": "2026-08-05", + "attachment": false, + "open_weights": true, + "release_date": "2026-02-12", + "last_updated": "2026-02-12", "type": "chat" }, { - "id": "meta/muse-spark-1.1", - "name": "Muse Spark 1.1", - "display_name": "Muse Spark 1.1", + "id": "z-ai/glm-4.7-flash", + "name": "GLM 4.7 Flash", + "display_name": "GLM 4.7 Flash", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 1048576 + "context": 200000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -158752,78 +154791,59 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "effort_options": [ - "minimal", - "low", - "medium", - "high", - "xhigh" - ] + "supported": true } }, - "attachment": true, - "open_weights": false, - "release_date": "2026-04-08", - "last_updated": "2026-07-09", + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2026-01-19", + "last_updated": "2026-01-19", "type": "chat" }, { - "id": "meta/muse-glimmer-30b", - "name": "Muse Glimmer 30B", - "display_name": "Muse Glimmer 30B", + "id": "z-ai/GLM-4.5-Air", + "name": "GLM 4.5 Air", + "display_name": "GLM 4.5 Air", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 131072 + "context": 128000, + "output": 98304 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "high" - ] - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2026-01-04", - "release_date": "2026-08-10", - "last_updated": "2026-08-10", + "knowledge": "2025-04", + "release_date": "2025-07-28", + "last_updated": "2025-07-28", "type": "chat" }, { - "id": "fireworks/ember-1", - "name": "Ember-1", - "display_name": "Ember-1", + "id": "z-ai/glm-4.6", + "name": "GLM 4.6", + "display_name": "GLM 4.6", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 1048576 + "context": 200000, + "output": 65535 }, "temperature": true, "tool_call": true, @@ -158833,23 +154853,24 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ - "low", - "medium", + "none", "high" ] } }, - "attachment": true, - "open_weights": false, - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-09-30", + "last_updated": "2025-09-30", "type": "chat" }, { - "id": "inclusionai/ling-3.0-flash-vl", - "name": "Ling 3.0 Flash VL", - "display_name": "Ling 3.0 Flash VL", + "id": "z-ai/glm-4.5v", + "name": "GLM 4.5V", + "display_name": "GLM 4.5V", "modalities": { "input": [ "text", @@ -158860,36 +154881,39 @@ ] }, "limit": { - "context": 256000, - "output": 32000 + "context": 65536, + "output": 16384 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true }, "attachment": true, "open_weights": true, - "release_date": "2026-09-10", - "last_updated": "2026-09-10", + "knowledge": "2025-04", + "release_date": "2025-08-11", + "last_updated": "2025-08-11", "type": "chat" }, { - "id": "inclusionai/ling-3.0-flash-fin", - "name": "Ling 3.0 Flash Fin", - "display_name": "Ling 3.0 Flash Fin", + "id": "z-ai/glm-5v-turbo:thinking", + "name": "GLM 5V Turbo Thinking", + "display_name": "GLM 5V Turbo Thinking", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 32000 + "context": 202800, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -158897,16 +154921,16 @@ "supported": true, "default": true }, - "attachment": false, - "open_weights": true, - "release_date": "2026-08-27", - "last_updated": "2026-09-03", + "attachment": true, + "open_weights": false, + "release_date": "2026-04-01", + "last_updated": "2026-04-01", "type": "chat" }, { - "id": "inclusionai/ling-3.1-flash", - "name": "Ling 3.1 Flash", - "display_name": "Ling 3.1 Flash", + "id": "z-ai/glm-4.7-original:thinking", + "name": "GLM 4.7 Original Thinking", + "display_name": "GLM 4.7 Original Thinking", "modalities": { "input": [ "text" @@ -158916,8 +154940,8 @@ ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 200000, + "output": 65535 }, "temperature": true, "tool_call": true, @@ -158925,26 +154949,17 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "high" - ] - } - }, "attachment": false, "open_weights": true, - "release_date": "2026-09-29", - "last_updated": "2026-09-29", + "knowledge": "2025-04", + "release_date": "2025-12-22", + "last_updated": "2025-12-22", "type": "chat" }, { - "id": "inclusionai/ling-3.0-flash", - "name": "Ling 3.0 Flash", - "display_name": "Ling 3.0 Flash", + "id": "z-ai/glm-5.2:thinking", + "name": "GLM 5.2 Thinking", + "display_name": "GLM 5.2 Thinking", "modalities": { "input": [ "text" @@ -158954,8 +154969,8 @@ ] }, "limit": { - "context": 256000, - "output": 32000 + "context": 1048576, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -158963,16 +154978,24 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "high", + "max" + ] + } + }, "attachment": false, "open_weights": true, - "release_date": "2026-07-23", - "last_updated": "2026-07-23", + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "inclusionai/ling-3.0-flash-sante", - "name": "Ling 3.0 Flash Sante", - "display_name": "Ling 3.0 Flash Sante", + "id": "z-ai/glm-5", + "name": "GLM 5", + "display_name": "GLM 5", "modalities": { "input": [ "text" @@ -158982,8 +155005,8 @@ ] }, "limit": { - "context": 256000, - "output": 32000 + "context": 200000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -158993,37 +155016,36 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "high" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, "attachment": false, - "open_weights": false, - "release_date": "2026-09-04", - "last_updated": "2026-09-04", + "open_weights": true, + "release_date": "2026-02-12", + "last_updated": "2026-02-12", "type": "chat" }, { - "id": "sakana/namazu", - "name": "Sakana Namazu", - "display_name": "Sakana Namazu", + "id": "z-ai/glm-5:thinking", + "name": "GLM 5 Thinking", + "display_name": "GLM 5 Thinking", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 256000 + "context": 200000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -159031,79 +155053,56 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "minimal", - "low", - "medium", - "high", - "xhigh", - "max" - ] - } - }, - "attachment": true, - "open_weights": false, - "release_date": "2026-08-03", - "last_updated": "2026-08-03", + "attachment": false, + "open_weights": true, + "release_date": "2026-02-12", + "last_updated": "2026-02-12", "type": "chat" }, { - "id": "sakana/fugu-max", - "name": "Fugu Max", - "display_name": "Fugu Max", + "id": "z-ai/GLM-4.5-Air:thinking", + "name": "GLM 4.5 Air (Thinking)", + "display_name": "GLM 4.5 Air (Thinking)", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 1000000 + "context": 128000, + "output": 98304 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "high", - "xhigh", - "max" - ] - } - }, - "attachment": true, - "open_weights": false, - "release_date": "2026-09-11", - "last_updated": "2026-09-11", + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-07-28", + "last_updated": "2025-07-28", "type": "chat" }, { - "id": "sakana/fugu-ultra", - "name": "Fugu Ultra", - "display_name": "Fugu Ultra", + "id": "z-ai/glm-4.7:thinking", + "name": "GLM 4.7 Thinking", + "display_name": "GLM 4.7 Thinking", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 1000000 + "context": 200000, + "output": 65535 }, "temperature": true, "tool_call": true, @@ -159111,25 +155110,17 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "high", - "xhigh", - "max" - ] - } - }, - "attachment": true, - "open_weights": false, - "release_date": "2026-06-15", - "last_updated": "2026-06-15", + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-12-22", + "last_updated": "2025-12-22", "type": "chat" }, { - "id": "sakana/fugu-ultra-v2", - "name": "Fugu Ultra v2", - "display_name": "Fugu Ultra v2", + "id": "z-ai/glm-5.3-flash-apex-abliterated", + "name": "Apex Flash 1 Abliterated", + "display_name": "Apex Flash 1 Abliterated", "modalities": { "input": [ "text", @@ -159140,10 +155131,9 @@ ] }, "limit": { - "context": 1000000, - "output": 1000000 + "context": 1048576, + "output": 32768 }, - "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -159152,37 +155142,37 @@ "extra_capabilities": { "reasoning": { "effort_options": [ + "low", "high", - "xhigh", "max" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-08-28", - "release_date": "2026-09-11", - "last_updated": "2026-09-11", + "open_weights": true, + "release_date": "2026-10-05", + "last_updated": "2026-10-05", "type": "chat" }, { - "id": "spacexai/grok-4.20-multi-agent", - "name": "Grok 4.20 Multi-Agent", - "display_name": "Grok 4.20 Multi-Agent", + "id": "z-ai/glm-5.3-flash", + "name": "GLM 5.3 Flash", + "display_name": "GLM 5.3 Flash", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 2000000, - "output": 2000000 + "context": 1048576, + "output": 131072 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -159190,37 +155180,35 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ - "none", "low", - "medium", - "high" + "high", + "max" ] } }, "attachment": true, - "open_weights": false, - "release_date": "2026-03-10", - "last_updated": "2026-03-10", + "open_weights": true, + "release_date": "2026-08-26", + "last_updated": "2026-08-26", "type": "chat" }, { - "id": "spacexai/grok-4.3", - "name": "Grok 4.3", - "display_name": "Grok 4.3", + "id": "z-ai/glm-4.7", + "name": "GLM 4.7", + "display_name": "GLM 4.7", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 1000000 + "context": 200000, + "output": 65535 }, "temperature": true, "tool_call": true, @@ -159231,36 +155219,36 @@ "extra_capabilities": { "reasoning": { "supported": true, - "effort_options": [ - "low", - "medium", - "high" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, - "attachment": true, - "open_weights": false, - "release_date": "2026-04-17", - "last_updated": "2026-04-17", + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-12-22", + "last_updated": "2025-12-22", "type": "chat" }, { - "id": "spacexai/grok-4.5", - "name": "Grok 4.5", - "display_name": "Grok 4.5", + "id": "z-ai/glm-4.7-flash:thinking", + "name": "GLM 4.7 Flash Thinking", + "display_name": "GLM 4.7 Flash Thinking", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 500000, - "output": 500000 + "context": 200000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -159268,104 +155256,107 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "low", - "medium", - "high" - ] - } - }, - "attachment": true, - "open_weights": false, - "release_date": "2026-07-08", - "last_updated": "2026-07-08", + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2026-01-19", + "last_updated": "2026-01-19", "type": "chat" }, { - "id": "spacexai/grok-imagine-image-2.0", - "name": "Grok Imagine Image 2.0", - "display_name": "Grok Imagine Image 2.0", + "id": "z-ai/GLM-4.6-turbo", + "name": "GLM 4.6 Turbo", + "display_name": "GLM 4.6 Turbo", "modalities": { "input": [ "text" ], "output": [ - "image" + "text" ] }, "limit": { - "context": 64000, - "output": 8192 + "context": 204800, + "output": 131072 }, - "temperature": false, "tool_call": false, "reasoning": { "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2026-08-07", - "last_updated": "2026-08-07" + "open_weights": true, + "release_date": "2025-10-02", + "last_updated": "2025-10-02", + "type": "chat" }, { - "id": "spacexai/grok-imagine-image", - "name": "Grok Imagine Image", - "display_name": "Grok Imagine Image", + "id": "z-ai/glm-latest", + "name": "GLM Latest", + "display_name": "GLM Latest", "modalities": { "input": [ "text" ], "output": [ - "image" + "text" ] }, "limit": { - "context": 16000, - "output": 8192 + "context": 1048576, + "output": 131072 }, - "temperature": false, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": false, - "open_weights": false, - "release_date": "2026-01-28", - "last_updated": "2026-01-28" + "open_weights": true, + "release_date": "2026-05-03", + "last_updated": "2026-05-03", + "type": "chat" }, { - "id": "spacexai/grok-imagine-video-1.5-lite", - "name": "Grok Imagine Video 1.5 Lite", - "display_name": "Grok Imagine Video 1.5 Lite", + "id": "z-ai/glm-5.1", + "name": "GLM 5.1", + "display_name": "GLM 5.1", "modalities": { "input": [ "text" ], "output": [ - "video" + "text" ] }, "limit": { - "context": 1024, - "output": 8192 + "context": 200000, + "output": 131072 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "none", + "high" + ] + } }, "attachment": false, - "open_weights": false, - "release_date": "2026-10-01", - "last_updated": "2026-10-01" + "open_weights": true, + "release_date": "2026-04-07", + "last_updated": "2026-04-07", + "type": "chat" }, { - "id": "spacexai/grok-4.7", - "name": "Grok 4.7", - "display_name": "Grok 4.7", + "id": "z-ai/glm-5.3-flash-cybersecurity", + "name": "GLM 5.3 Flash Cybersecurity", + "display_name": "GLM 5.3 Flash Cybersecurity", "modalities": { "input": [ "text", @@ -159376,10 +155367,9 @@ ] }, "limit": { - "context": 500000, - "output": 500000 + "context": 1048576, + "output": 32768 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -159389,23 +155379,21 @@ "reasoning": { "effort_options": [ "low", - "medium", "high", - "xhigh" + "max" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-05", - "release_date": "2026-09-21", - "last_updated": "2026-09-21", + "open_weights": true, + "release_date": "2026-09-19", + "last_updated": "2026-09-19", "type": "chat" }, { - "id": "spacexai/grok-imagine-video", - "name": "Grok Imagine", - "display_name": "Grok Imagine", + "id": "bytedance-seed/seed-2.0-lite", + "name": "ByteDance Seed 2.0 Lite", + "display_name": "ByteDance Seed 2.0 Lite", "modalities": { "input": [ "text", @@ -159413,69 +155401,73 @@ "video" ], "output": [ - "video" + "text" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 262144, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": false, "reasoning": { "supported": false }, "attachment": true, "open_weights": false, - "release_date": "2026-01-28", - "last_updated": "2026-01-28" + "release_date": "2026-02-14", + "last_updated": "2026-02-14", + "type": "chat" }, { - "id": "spacexai/grok-4.20-non-reasoning-beta", - "name": "Grok 4.20 Beta Non-Reasoning", - "display_name": "Grok 4.20 Beta Non-Reasoning", + "id": "bytedance-seed/seed-2-1-turbo", + "name": "ByteDance Seed 2.1 Turbo", + "display_name": "ByteDance Seed 2.1 Turbo", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 2000000, - "output": 2000000 + "context": 262144, + "output": 235929 }, + "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": true, "open_weights": false, - "release_date": "2026-03-11", - "last_updated": "2026-03-11", + "release_date": "2026-06-23", + "last_updated": "2026-06-23", "type": "chat" }, { - "id": "spacexai/grok-4.20-reasoning-beta", - "name": "Grok 4.20 Beta Reasoning", - "display_name": "Grok 4.20 Beta Reasoning", + "id": "bytedance-seed/seed-2.0-code", + "name": "ByteDance Seed 2.0 Code", + "display_name": "ByteDance Seed 2.0 Code", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 2000000, - "output": 2000000 + "context": 262144, + "output": 131072 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -159493,280 +155485,513 @@ }, "attachment": true, "open_weights": false, - "release_date": "2026-03-11", - "last_updated": "2026-03-11", + "release_date": "2026-02-14", + "last_updated": "2026-02-14", "type": "chat" }, { - "id": "spacexai/grok-4.20-non-reasoning", - "name": "Grok 4.20 Non-Reasoning", - "display_name": "Grok 4.20 Non-Reasoning", + "id": "nanogpt/coding-router", + "name": "Coding Router", + "display_name": "Coding Router", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 2000000, - "output": 2000000 + "context": 1000000, + "output": 128000 }, - "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2026-03-09", - "last_updated": "2026-03-09", + "release_date": "2026-05-12", + "last_updated": "2026-05-12", "type": "chat" }, { - "id": "spacexai/grok-4.20-reasoning", - "name": "Grok 4.20 Reasoning", - "display_name": "Grok 4.20 Reasoning", + "id": "nanogpt/coding-router:max", + "name": "Coding Router Max", + "display_name": "Coding Router Max", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 2000000, - "output": 2000000 + "context": 1000000, + "output": 128000 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "high" - ] - } + "attachment": false, + "open_weights": false, + "release_date": "2026-05-12", + "last_updated": "2026-05-12", + "type": "chat" + }, + { + "id": "nanogpt/coding-router:medium", + "name": "Coding Router Medium", + "display_name": "Coding Router Medium", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] }, - "attachment": true, + "limit": { + "context": 1000000, + "output": 128000 + }, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "attachment": false, "open_weights": false, - "release_date": "2026-03-09", - "last_updated": "2026-03-09", + "release_date": "2026-05-12", + "last_updated": "2026-05-12", "type": "chat" }, { - "id": "spacexai/grok-build-0.1", - "name": "Grok Build 0.1", - "display_name": "Grok Build 0.1", + "id": "nanogpt/coding-router:low", + "name": "Coding Router Low", + "display_name": "Coding Router Low", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 256000 + "context": 1000000, + "output": 128000 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "none", - "low", - "medium", - "high" - ] - } + "attachment": false, + "open_weights": false, + "release_date": "2026-05-12", + "last_updated": "2026-05-12", + "type": "chat" + }, + { + "id": "nanogpt/coding-router:high", + "name": "Coding Router High", + "display_name": "Coding Router High", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] }, - "attachment": true, + "limit": { + "context": 1000000, + "output": 128000 + }, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "attachment": false, "open_weights": false, - "release_date": "2026-04-16", - "last_updated": "2026-04-16", + "release_date": "2026-05-12", + "last_updated": "2026-05-12", "type": "chat" }, { - "id": "spacexai/grok-imagine-video-1.5", - "name": "Grok Imagine Video 1.5", - "display_name": "Grok Imagine Video 1.5", + "id": "soob3123/GrayLine-Qwen3-8B", + "name": "Grayline Qwen3 8B", + "display_name": "Grayline Qwen3 8B", "modalities": { "input": [ "text" ], "output": [ - "video" + "text" ] }, "limit": { - "context": 1024, + "context": 32768, + "output": 32768 + }, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "release_date": "2025-09-25", + "last_updated": "2025-09-25", + "type": "chat" + }, + { + "id": "soob3123/amoral-gemma3-27B-v2", + "name": "Amoral Gemma3 27B v2", + "display_name": "Amoral Gemma3 27B v2", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 32768, "output": 8192 }, - "temperature": false, "tool_call": false, "reasoning": { "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2026-05-30", - "last_updated": "2026-05-30" + "open_weights": true, + "release_date": "2025-05-23", + "last_updated": "2025-05-23", + "type": "chat" }, { - "id": "spacexai/grok-tts", - "name": "Grok TTS", - "display_name": "Grok TTS", + "id": "soob3123/Veiled-Calla-12B", + "name": "Veiled Calla 12B", + "display_name": "Veiled Calla 12B", "modalities": { "input": [ "text" ], "output": [ - "audio" + "text" ] }, "limit": { - "context": 15000, - "output": 15000 + "context": 32768, + "output": 8192 }, - "temperature": false, "tool_call": false, "reasoning": { "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2026-03-16", - "last_updated": "2026-03-16" + "open_weights": true, + "release_date": "2025-04-13", + "last_updated": "2025-04-13", + "type": "chat" }, { - "id": "spacexai/grok-voice-think-fast-2.0", - "name": "Grok Voice Think Fast 2.0", - "display_name": "Grok Voice Think Fast 2.0", + "id": "meituan/longcat-2.5-preview", + "name": "LongCat 2.5 Preview", + "display_name": "LongCat 2.5 Preview", "modalities": { "input": [ "text", - "audio" + "image" ], "output": [ - "text", - "audio" + "text" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 1000000, + "output": 131072 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": true, "open_weights": false, - "release_date": "2026-07-29", - "last_updated": "2026-07-29" + "release_date": "2026-09-25", + "last_updated": "2026-09-25", + "type": "chat" }, { - "id": "spacexai/grok-stt", - "name": "Grok STT", - "display_name": "Grok STT", + "id": "shisa-ai/shisa-v2.1-llama3.3-70b", + "name": "Shisa V2.1 Llama 3.3 70B", + "display_name": "Shisa V2.1 Llama 3.3 70B", "modalities": { "input": [ - "audio" + "text" ], "output": [ "text" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 32768, + "output": 4096 }, - "temperature": false, "tool_call": false, "reasoning": { "supported": false }, - "attachment": true, + "attachment": false, + "open_weights": true, + "release_date": "2024-01-01", + "last_updated": "2024-12-06", + "type": "chat" + }, + { + "id": "shisa-ai/shisa-v2-llama3.3-70b", + "name": "Shisa V2 Llama 3.3 70B", + "display_name": "Shisa V2 Llama 3.3 70B", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 128000, + "output": 16384 + }, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "release_date": "2025-07-26", + "last_updated": "2025-07-26", + "type": "chat" + }, + { + "id": "Salesforce/Llama-xLAM-2-70b-fc-r", + "name": "Llama-xLAM-2 70B fc-r", + "display_name": "Llama-xLAM-2 70B fc-r", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 128000, + "output": 16384 + }, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "release_date": "2025-04-13", + "last_updated": "2025-04-13", + "type": "chat" + }, + { + "id": "aion-labs/aion-rp-llama-3.1-8b", + "name": "Llama 3.1 8b (uncensored)", + "display_name": "Llama 3.1 8b (uncensored)", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 32768, + "output": 16384 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "knowledge": "2023-12-31", + "release_date": "2025-02-04", + "last_updated": "2025-02-04", + "type": "chat" + }, + { + "id": "aion-labs/aion-3.0", + "name": "AionLabs: Aion 3.0", + "display_name": "AionLabs: Aion 3.0", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 131072, + "output": 32768 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "attachment": false, "open_weights": false, - "release_date": "2026-03-16", - "last_updated": "2026-03-16" + "release_date": "2026-05-05", + "last_updated": "2026-05-05", + "type": "chat" }, { - "id": "spacexai/grok-4.20-multi-agent-beta", - "name": "Grok 4.20 Multi Agent Beta", - "display_name": "Grok 4.20 Multi Agent Beta", + "id": "aion-labs/aion-3.0-mini", + "name": "AionLabs: Aion 3.0 Mini", + "display_name": "AionLabs: Aion 3.0 Mini", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 2000000, - "output": 2000000 + "context": 131072, + "output": 32768 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "high" - ] - } + "attachment": false, + "open_weights": false, + "release_date": "2026-05-14", + "last_updated": "2026-05-14", + "type": "chat" + }, + { + "id": "aion-labs/aion-3.5", + "name": "AionLabs: Aion 3.5", + "display_name": "AionLabs: Aion 3.5", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] }, - "attachment": true, + "limit": { + "context": 262144, + "output": 32768 + }, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "attachment": false, "open_weights": false, - "release_date": "2026-03-11", - "last_updated": "2026-03-11", + "release_date": "2026-09-23", + "last_updated": "2026-09-23", "type": "chat" }, { - "id": "spacexai/grok-4.6", - "name": "Grok 4.6", - "display_name": "Grok 4.6", + "id": "aion-labs/aion-3.5-mini", + "name": "AionLabs: Aion 3.5 Mini", + "display_name": "AionLabs: Aion 3.5 Mini", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 262144, + "output": 32768 + }, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "attachment": false, + "open_weights": false, + "release_date": "2026-09-23", + "last_updated": "2026-09-23", + "type": "chat" + }, + { + "id": "aion-labs/aion-2.0", + "name": "AionLabs: Aion-2.0", + "display_name": "AionLabs: Aion-2.0", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 131072, + "output": 32768 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": false, + "release_date": "2025-12-21", + "last_updated": "2025-12-21", + "type": "chat" + }, + { + "id": "xiaomi/mimo-v2.5:thinking", + "name": "MiMo V2.5 Thinking", + "display_name": "MiMo V2.5 Thinking", "modalities": { "input": [ "text", - "image" + "image", + "audio", + "video" ], "output": [ "text" ] }, "limit": { - "context": 500000, - "output": 500000 + "context": 1048576, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -159776,40 +156001,37 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ - "low", - "medium", - "high", - "xhigh" + "none", + "high" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-02-01", - "release_date": "2026-08-12", - "last_updated": "2026-08-12", + "open_weights": true, + "knowledge": "2024-12", + "release_date": "2026-04-22", + "last_updated": "2026-04-22", "type": "chat" }, { - "id": "nvidia/nemotron-3-nano-30b-a3b", - "name": "Nemotron 3 Nano 30B A3B", - "display_name": "Nemotron 3 Nano 30B A3B", + "id": "xiaomi/mimo-v2.6-flash-uncensored:thinking", + "name": "MiMo V2.6 Flash Uncensored Thinking", + "display_name": "MiMo V2.6 Flash Uncensored Thinking", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1048576, + "output": 65536 }, - "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, "default": true @@ -159817,34 +156039,33 @@ "extra_capabilities": { "reasoning": { "effort_options": [ - "none", - "low", - "medium", - "high" + "max" ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2025-06-25", - "release_date": "2025-12-15", - "last_updated": "2025-12-15", + "release_date": "2026-09-26", + "last_updated": "2026-09-26", "type": "chat" }, { - "id": "nvidia/nemotron-nano-9b-v2", - "name": "Nvidia Nemotron Nano 9B V2", - "display_name": "Nvidia Nemotron Nano 9B V2", + "id": "xiaomi/mimo-v2.6-pro", + "name": "MiMo V2.6 Pro", + "display_name": "MiMo V2.6 Pro", "modalities": { "input": [ - "text" + "text", + "image", + "audio", + "video" ], "output": [ "text" ] }, "limit": { - "context": 131072, + "context": 1048576, "output": 131072 }, "temperature": true, @@ -159857,34 +156078,30 @@ "reasoning": { "effort_options": [ "none", - "low", - "medium", "high" ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2024-09", - "release_date": "2025-08-18", - "last_updated": "2025-08-18", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "nvidia/nemotron-nano-12b-v2-vl", - "name": "Nvidia Nemotron Nano 12B V2 VL", - "display_name": "Nvidia Nemotron Nano 12B V2 VL", + "id": "xiaomi/mimo-v2.5-pro", + "name": "MiMo V2.5 Pro", + "display_name": "MiMo V2.5 Pro", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 131072, + "context": 1048576, "output": 131072 }, "temperature": true, @@ -159897,32 +156114,34 @@ "reasoning": { "effort_options": [ "none", - "low", - "medium", "high" ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2025-10-28", - "last_updated": "2025-10-28", + "knowledge": "2024-12", + "release_date": "2026-04-22", + "last_updated": "2026-04-22", "type": "chat" }, { - "id": "nvidia/nemotron-3.5-lightning", - "name": "Nemotron 3.5 Lightning 30B", - "display_name": "Nemotron 3.5 Lightning 30B", + "id": "xiaomi/mimo-v2.5", + "name": "MiMo V2.5", + "display_name": "MiMo V2.5", "modalities": { "input": [ - "text" + "text", + "image", + "audio", + "video" ], "output": [ "text" ] }, "limit": { - "context": 262144, + "context": 1048576, "output": 131072 }, "temperature": true, @@ -159933,39 +156152,36 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ "none", - "low", - "medium", "high" ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2025-09", - "release_date": "2026-08-11", - "last_updated": "2026-08-11", + "knowledge": "2024-12", + "release_date": "2026-04-22", + "last_updated": "2026-04-22", "type": "chat" }, { - "id": "nvidia/nemotron-3-ultra-550b-a55b", - "name": "Nemotron 3 Ultra", - "display_name": "Nemotron 3 Ultra", + "id": "xiaomi/mimo-v2.6-flash-abliterated", + "name": "MiMo V2.6 Flash Abliterated", + "display_name": "MiMo V2.6 Flash Abliterated", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 65000 + "context": 1048576, + "output": 65536 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -159973,26 +156189,22 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ "none", - "low", - "medium", "high" ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2025-09", - "release_date": "2026-06-04", - "last_updated": "2026-06-04", + "release_date": "2026-09-25", + "last_updated": "2026-09-25", "type": "chat" }, { - "id": "nvidia/nemotron-3.5-super-vl", - "name": "NVIDIA Nemotron 3.5 Super VL", - "display_name": "NVIDIA Nemotron 3.5 Super VL", + "id": "xiaomi/mimo-v2.6-flash-uncensored", + "name": "MiMo V2.6 Flash Uncensored", + "display_name": "MiMo V2.6 Flash Uncensored", "modalities": { "input": [ "text", @@ -160004,9 +156216,8 @@ }, "limit": { "context": 1048576, - "output": 1048576 + "output": 65536 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -160024,25 +156235,28 @@ }, "attachment": true, "open_weights": true, - "release_date": "2026-10-15", - "last_updated": "2026-10-15", + "release_date": "2026-09-25", + "last_updated": "2026-09-25", "type": "chat" }, { - "id": "nvidia/nemotron-3.5-lightning-free", - "name": "Nemotron 3.5 Lightning Free", - "display_name": "Nemotron 3.5 Lightning Free", + "id": "xiaomi/mimo-v2.6-flash", + "name": "MiMo V2.6 Flash", + "display_name": "MiMo V2.6 Flash", "modalities": { "input": [ - "text" + "text", + "image", + "audio", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 65000 + "context": 1048576, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -160052,26 +156266,22 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ "none", - "low", - "medium", "high" ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2025-09", - "release_date": "2026-08-11", - "last_updated": "2026-08-11", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "nvidia/nemotron-3-super-120b-a12b", - "name": "NVIDIA Nemotron 3 Super 120B A12B", - "display_name": "NVIDIA Nemotron 3 Super 120B A12B", + "id": "xiaomi/mimo-v2.5-pro:thinking", + "name": "MiMo V2.5 Pro Thinking", + "display_name": "MiMo V2.5 Pro Thinking", "modalities": { "input": [ "text" @@ -160081,11 +156291,11 @@ ] }, "limit": { - "context": 256000, - "output": 32000 + "context": 1048576, + "output": 131072 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, "default": true @@ -160094,296 +156304,293 @@ "reasoning": { "effort_options": [ "none", - "low", - "medium", "high" ] } }, "attachment": false, "open_weights": true, - "knowledge": "2025-06", - "release_date": "2026-03-11", - "last_updated": "2026-03-11", + "knowledge": "2024-12", + "release_date": "2026-04-22", + "last_updated": "2026-04-22", "type": "chat" }, { - "id": "google/gemini-3-pro-image", - "name": "Nano Banana Pro", - "display_name": "Nano Banana Pro", + "id": "xiaomi/mimo-v2.6-pro-ultraspeed", + "name": "MiMo V2.6 Pro UltraSpeed", + "display_name": "MiMo V2.6 Pro UltraSpeed", "modalities": { "input": [ "text", - "image" + "image", + "audio", + "video" ], "output": [ - "text", - "image" + "text" ] }, "limit": { - "context": 65536, - "output": 32768 + "context": 1048576, + "output": 131072 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "low", + "effort_options": [ + "none", "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-05-28", - "last_updated": "2026-05-28" + "open_weights": true, + "release_date": "2026-09-21", + "last_updated": "2026-09-21", + "type": "chat" }, { - "id": "google/gemini-3.8-live", - "name": "Gemini 3.8 Live", - "display_name": "Gemini 3.8 Live", + "id": "inflatebot/MN-12B-Mag-Mell-R1", + "name": "Mag Mell R1", + "display_name": "Mag Mell R1", "modalities": { "input": [ - "text", - "audio" + "text" ], "output": [ - "text", - "audio" + "text" ] }, "limit": { - "context": 131072, - "output": 65536 + "context": 16384, + "output": 8192 }, - "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, - "attachment": true, - "open_weights": false, - "release_date": "2026-09-15", - "last_updated": "2026-09-15" + "attachment": false, + "open_weights": true, + "release_date": "2024-01-01", + "last_updated": "2024-07-01", + "type": "chat" }, { - "id": "google/veo-3.1-fast-generate-001", - "name": "Veo 3.1 Fast Generate", - "display_name": "Veo 3.1 Fast Generate", + "id": "featherless-ai/Qwerky-72B", + "name": "Qwerky 72B", + "display_name": "Qwerky 72B", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ - "video" + "text" ] }, "limit": { - "context": 8192, + "context": 32000, "output": 8192 }, - "temperature": false, "tool_call": false, "reasoning": { "supported": false }, - "attachment": true, - "open_weights": false, - "release_date": "2025-10-15", - "last_updated": "2026-06-08" + "attachment": false, + "open_weights": true, + "release_date": "2024-01-01", + "last_updated": "2025-03-20", + "type": "chat" }, { - "id": "google/gemini-3.5-transcribe-live", - "name": "Gemini 3.5 Transcribe Live", - "display_name": "Gemini 3.5 Transcribe Live", + "id": "ReadyArt/MS3.2-The-Omega-Directive-24B-Unslop-v2.0", + "name": "Omega Directive 24B Unslop v2.0", + "display_name": "Omega Directive 24B Unslop v2.0", "modalities": { "input": [ - "audio" + "text" ], "output": [ "text" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 32768, + "output": 32768 }, - "temperature": false, "tool_call": false, "reasoning": { "supported": false }, - "attachment": true, - "open_weights": false, - "release_date": "2026-08-26", - "last_updated": "2026-08-26" + "attachment": false, + "open_weights": true, + "release_date": "2025-12-08", + "last_updated": "2025-12-08", + "type": "chat" }, { - "id": "google/veo-3.0-generate-001", - "name": "Veo 3.0", - "display_name": "Veo 3.0", + "id": "sakana/fugu-max", + "name": "Fugu Max", + "display_name": "Fugu Max", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ - "video" + "text" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 1000000, + "output": 128000 }, "temperature": false, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "high", + "xhigh", + "max" + ] + } }, "attachment": true, "open_weights": false, - "release_date": "2025-05-20", - "last_updated": "2026-06-08" + "release_date": "2026-09-11", + "last_updated": "2026-09-11", + "type": "chat" }, { - "id": "google/gemini-3.1-flash-lite-image", - "name": "Gemini 3.1 Flash Lite Image (Nano Banana 2 Lite)", - "display_name": "Gemini 3.1 Flash Lite Image (Nano Banana 2 Lite)", + "id": "sakana/fugu-ultra-v1.1", + "name": "Fugu Ultra v1.1", + "display_name": "Fugu Ultra v1.1", "modalities": { "input": [ "text", "image" ], "output": [ - "text", - "image" + "text" ] }, "limit": { - "context": 65536, - "output": 4096 + "context": 1000000, + "output": 16384 }, - "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ - "low", - "high" + "high", + "xhigh", + "max" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-06-30", - "last_updated": "2026-06-30" + "release_date": "2026-07-24", + "last_updated": "2026-07-24", + "type": "chat" }, { - "id": "google/veo-3.1-generate-001", - "name": "Veo 3.1", - "display_name": "Veo 3.1", + "id": "sakana/fugu-ultra", + "name": "Fugu Ultra", + "display_name": "Fugu Ultra", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ - "video" + "text" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 1000000, + "output": 16384 }, "temperature": false, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "high", + "xhigh", + "max" + ] + } }, "attachment": true, "open_weights": false, - "release_date": "2025-10-15", - "last_updated": "2026-06-08" + "release_date": "2026-06-15", + "last_updated": "2026-06-15", + "type": "chat" }, { - "id": "google/gemma-4-31b-it", - "name": "Gemma 4 31B IT", - "display_name": "Gemma 4 31B IT", + "id": "poolside/laguna-s-2.1:thinking", + "name": "Laguna S 2.1 Thinking", + "display_name": "Laguna S 2.1 Thinking", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, + "context": 1048576, "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": true, + "default": true }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "release_date": "2026-07-21", + "last_updated": "2026-07-21", "type": "chat" }, { - "id": "google/gemini-4-argon", - "name": "Gemini 4 Argon", - "display_name": "Gemini 4 Argon", + "id": "poolside/laguna-s-2.1", + "name": "Laguna S 2.1", + "display_name": "Laguna S 2.1", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 1000000 + "context": 1048576, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -160391,39 +156598,32 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "low", - "medium", - "high" - ] + "supported": true } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-10-13", - "last_updated": "2026-10-13", + "attachment": false, + "open_weights": true, + "release_date": "2026-07-21", + "last_updated": "2026-07-21", "type": "chat" }, { - "id": "google/gemini-2.5-pro", - "name": "Gemini 2.5 Pro", - "display_name": "Gemini 2.5 Pro", + "id": "nex-agi/nex-n2.5-pro", + "name": "Nex N2.5 Pro", + "display_name": "Nex N2.5 Pro", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65535 + "context": 262144, + "output": 262144 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -160431,110 +156631,86 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "budget", - "budget": { - "default": -1, - "min": 128, - "max": 32768, - "auto": -1, - "unit": "tokens" - }, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" + "effort_options": [ + "none", + "medium", + "high" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-06-17", - "last_updated": "2025-06-17", + "open_weights": true, + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "google/gemini-3.5-flash", - "name": "Gemini 3.5 Flash", - "display_name": "Gemini 3.5 Flash", + "id": "nex-agi/nex-n2.5-mini", + "name": "Nex N2.5 Mini", + "display_name": "Nex N2.5 Mini", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 64000 + "context": 262144, + "output": 262144 }, - "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", - "low", + "effort_options": [ + "none", "medium", "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-05-19", - "last_updated": "2026-05-19", + "open_weights": true, + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "google/gemini-3.5-transcribe", - "name": "Gemini 3.5 Transcribe", - "display_name": "Gemini 3.5 Transcribe", + "id": "huihui-ai/Qwen2.5-32B-Instruct-abliterated", + "name": "Qwen 2.5 32B Abliterated", + "display_name": "Qwen 2.5 32B Abliterated", "modalities": { "input": [ - "audio" + "text" ], "output": [ "text" ] }, "limit": { - "context": 98304, - "output": 32768 + "context": 32768, + "output": 8192 }, - "temperature": false, "tool_call": false, "reasoning": { "supported": false }, - "attachment": true, - "open_weights": false, - "release_date": "2026-08-26", - "last_updated": "2026-08-26" + "attachment": false, + "open_weights": true, + "release_date": "2025-01-06", + "last_updated": "2025-01-06", + "type": "chat" }, { - "id": "google/gemini-embedding-001", - "name": "Gemini Embedding 001", - "display_name": "Gemini Embedding 001", + "id": "huihui-ai/DeepSeek-R1-Distill-Qwen-32B-abliterated", + "name": "DeepSeek R1 Qwen Abliterated", + "display_name": "DeepSeek R1 Qwen Abliterated", "modalities": { "input": [ "text" @@ -160544,133 +156720,143 @@ ] }, "limit": { - "context": 2048, - "output": 1 + "context": 16384, + "output": 8192 }, - "temperature": false, "tool_call": false, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": false, - "open_weights": false, - "knowledge": "2025-05", - "release_date": "2025-05-20", - "last_updated": "2025-05-20", - "type": "embedding" + "open_weights": true, + "release_date": "2024-01-01", + "last_updated": "2025-01-20", + "type": "chat" }, { - "id": "google/gemini-3.5-flash-lite", - "name": "Gemini 3.5 Flash Lite", - "display_name": "Gemini 3.5 Flash Lite", + "id": "huihui-ai/Llama-3.3-70B-Instruct-abliterated", + "name": "Llama 3.3 70B Instruct abliterated", + "display_name": "Llama 3.3 70B Instruct abliterated", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 65000 + "context": 32768, + "output": 16384 }, - "temperature": true, - "tool_call": true, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "release_date": "2025-08-08", + "last_updated": "2025-08-08", + "type": "chat" + }, + { + "id": "huihui-ai/DeepSeek-R1-Distill-Llama-70B-abliterated", + "name": "DeepSeek R1 Llama 70B Abliterated", + "display_name": "DeepSeek R1 Llama 70B Abliterated", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 16384, + "output": 8192 + }, + "tool_call": false, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "low", - "high" - ] - } - }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-07-21", - "last_updated": "2026-07-21", + "attachment": false, + "open_weights": true, + "release_date": "2024-01-01", + "last_updated": "2025-01-20", "type": "chat" }, { - "id": "google/gemini-2.5-flash-image", - "name": "Nano Banana (Gemini 2.5 Flash Image)", - "display_name": "Nano Banana (Gemini 2.5 Flash Image)", + "id": "MiniMaxAI/MiniMax-M1-80k", + "name": "MiniMax M1 80K", + "display_name": "MiniMax M1 80K", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ - "text", - "image" + "text" ] }, "limit": { - "context": 32768, - "output": 65535 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": false, "reasoning": { "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-06", - "release_date": "2025-08-26", - "last_updated": "2025-08-26" + "attachment": false, + "open_weights": true, + "release_date": "2025-06-17", + "last_updated": "2025-06-17", + "type": "chat" }, { - "id": "google/gemini-3.8-flash-lite-tts", - "name": "Gemini 3.8 Flash-Lite TTS", - "display_name": "Gemini 3.8 Flash-Lite TTS", + "id": "abacusai/Dracarys-72B-Instruct", + "name": "Llama 3.1 70B Dracarys 2", + "display_name": "Llama 3.1 70B Dracarys 2", "modalities": { "input": [ "text" ], "output": [ - "audio" + "text" ] }, "limit": { - "context": 8192, - "output": 16384 + "context": 32768, + "output": 8192 }, - "temperature": false, "tool_call": false, "reasoning": { "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2026-09-22", - "last_updated": "2026-09-22" + "open_weights": true, + "release_date": "2025-08-02", + "last_updated": "2025-08-02", + "type": "chat" }, { - "id": "google/gemini-3.1-pro-preview", - "name": "Gemini 3.1 Pro Preview", - "display_name": "Gemini 3.1 Pro Preview", + "id": "stepfun/step-3.7-flash:thinking", + "name": "Step 3.7 Flash Thinking", + "display_name": "Step 3.7 Flash Thinking", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 64000 + "context": 262144, + "output": 256000 }, "temperature": true, "tool_call": true, @@ -160680,37 +156866,30 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ + "effort_options": [ + "none", "low", + "medium", "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-02-19", - "last_updated": "2026-02-19", + "open_weights": true, + "knowledge": "2026-03-01", + "release_date": "2026-05-29", + "last_updated": "2026-05-29", "type": "chat" }, { - "id": "google/gemini-2.5-flash", - "name": "Gemini 2.5 Flash", - "display_name": "Gemini 2.5 Flash", + "id": "stepfun/step-5-preview", + "name": "Step 5 Preview", + "display_name": "Step 5 Preview", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" @@ -160718,7 +156897,7 @@ }, "limit": { "context": 1000000, - "output": 65535 + "output": 65536 }, "temperature": true, "tool_call": true, @@ -160728,40 +156907,30 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "budget", - "budget": { - "default": -1, - "min": 0, - "max": 24576, - "auto": -1, - "off": 0, - "unit": "tokens" - }, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" + "effort_options": [ + "low", + "medium", + "high" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-06-17", - "last_updated": "2025-06-17", + "open_weights": true, + "release_date": "2026-09-16", + "last_updated": "2026-09-20", "type": "chat" }, { - "id": "google/gemini-3.8-flash", - "name": "Gemini 3.8 Flash", - "display_name": "Gemini 3.8 Flash", + "id": "meta/muse-spark-1.2", + "name": "Muse Spark 1.2", + "display_name": "Muse Spark 1.2", "modalities": { "input": [ "text", "image", - "pdf" + "video", + "pdf", + "audio" ], "output": [ "text" @@ -160769,7 +156938,7 @@ }, "limit": { "context": 1000000, - "output": 65535 + "output": 65536 }, "temperature": true, "tool_call": true, @@ -160780,185 +156949,72 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ + "effort_options": [ "minimal", "low", "medium", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" + "high", + "xhigh" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-09-02", - "last_updated": "2026-09-02", + "release_date": "2026-08-05", + "last_updated": "2026-08-05", "type": "chat" }, { - "id": "google/gemini-3.8-live-extended-thinking", - "name": "Gemini 3.8 Live Extended Thinking", - "display_name": "Gemini 3.8 Live Extended Thinking", - "modalities": { - "input": [ - "text", - "audio" - ], - "output": [ - "text", - "audio" - ] - }, - "limit": { - "context": 131072, - "output": 65536 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": false, - "release_date": "2026-09-15", - "last_updated": "2026-09-15" - }, - { - "id": "google/veo-3.1-lite-generate-001", - "name": "Veo 3.1 Lite Generate", - "display_name": "Veo 3.1 Lite Generate", - "modalities": { - "input": [ - "text", - "image", - "video" - ], - "output": [ - "video" - ] - }, - "limit": { - "context": 8192, - "output": 8192 - }, - "temperature": false, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": false, - "release_date": "2026-04-02", - "last_updated": "2026-04-02" - }, - { - "id": "google/veo-3.0-fast-generate-001", - "name": "Veo 3.0 Fast Generate", - "display_name": "Veo 3.0 Fast Generate", + "id": "meta/muse-glimmer-30b", + "name": "Muse Glimmer 30B", + "display_name": "Muse Glimmer 30B", "modalities": { "input": [ "text", "image" ], - "output": [ - "video" - ] - }, - "limit": { - "context": 8192, - "output": 8192 - }, - "temperature": false, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": false, - "release_date": "2025-07-31", - "last_updated": "2026-06-08" - }, - { - "id": "google/text-embedding-005", - "name": "Text Embedding 005", - "display_name": "Text Embedding 005", - "modalities": { - "input": [ - "text" - ], "output": [ "text" ] }, - "limit": { - "context": 8192, - "output": 8192 - }, - "temperature": false, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": false, - "release_date": "2024-08-01", - "last_updated": "2024-08", - "type": "embedding" - }, - { - "id": "google/gemini-3.1-flash-image-preview", - "name": "Gemini 3.1 Flash Image Preview (Nano Banana 2)", - "display_name": "Gemini 3.1 Flash Image Preview (Nano Banana 2)", - "modalities": { - "input": [ - "text", - "image" - ], - "output": [ - "text", - "image" - ] - }, "limit": { "context": 131072, - "output": 32768 + "output": 117964 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ + "minimal", "low", - "high" + "medium", + "high", + "xhigh" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-02-26", - "last_updated": "2026-02-26" + "open_weights": true, + "knowledge": "2026-01-04", + "release_date": "2026-08-10", + "last_updated": "2026-08-10", + "type": "chat" }, { - "id": "google/gemini-3.7-flash", - "name": "Gemini 3.7 Flash", - "display_name": "Gemini 3.7 Flash", + "id": "meta/muse-spark-1.2-contributor", + "name": "Muse Spark 1.2 Contributor (Data Used for Training)", + "display_name": "Muse Spark 1.2 Contributor (Data Used for Training)", "modalities": { "input": [ "text", "image", + "video", + "audio", "pdf" ], "output": [ @@ -160967,9 +157023,8 @@ }, "limit": { "context": 1000000, - "output": 65535 + "output": 65536 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -160977,100 +157032,83 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ + "effort_options": [ "minimal", "low", "medium", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" + "high", + "xhigh" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-08-13", - "last_updated": "2026-08-13", + "release_date": "2026-08-05", + "last_updated": "2026-08-05", "type": "chat" }, { - "id": "google/gemini-2.5-flash-lite", - "name": "Gemini 2.5 Flash Lite", - "display_name": "Gemini 2.5 Flash Lite", + "id": "meta/muse-spark-1.1", + "name": "Muse Spark 1.1", + "display_name": "Muse Spark 1.1", "modalities": { "input": [ "text", "image", - "pdf" + "video", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65535 + "context": 1000000, + "output": 65536 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "default": -1, - "min": 512, - "max": 24576, - "auto": -1, - "unit": "tokens" - }, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" + "effort_options": [ + "minimal", + "low", + "medium", + "high", + "xhigh" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-06-17", - "last_updated": "2025-06-17", + "release_date": "2026-04-08", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "google/gemini-omni-flash-preview", - "name": "Gemini Omni Flash Preview", - "display_name": "Gemini Omni Flash Preview", + "id": "meta/muse-spark-open", + "name": "Muse Spark Open", + "display_name": "Muse Spark Open", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 57920 + "context": 1048576, + "output": 131072 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, "default": true @@ -161078,26 +157116,30 @@ "extra_capabilities": { "reasoning": { "effort_options": [ - "none", "low", "medium", - "high" + "high", + "xhigh" ] } }, "attachment": true, - "open_weights": false, - "release_date": "2026-06-30", - "last_updated": "2026-06-30" + "open_weights": true, + "knowledge": "2026-01-04", + "release_date": "2026-10-15", + "last_updated": "2026-10-15", + "type": "chat" }, { - "id": "google/gemini-3.6-flash", - "name": "Gemini 3.6 Flash", - "display_name": "Gemini 3.6 Flash", + "id": "meta/muse-spark-1.3-contributor", + "name": "Muse Spark 1.3 Contributor", + "display_name": "Muse Spark 1.3 Contributor", "modalities": { "input": [ "text", "image", + "video", + "audio", "pdf" ], "output": [ @@ -161105,10 +157147,9 @@ ] }, "limit": { - "context": 1000000, - "output": 64000 + "context": 1048576, + "output": 943718 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -161116,50 +157157,43 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ + "effort_options": [ "minimal", "low", "medium", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" + "high", + "xhigh" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-07-21", - "last_updated": "2026-07-21", + "release_date": "2026-09-02", + "last_updated": "2026-09-02", "type": "chat" }, { - "id": "google/gemini-3.1-flash-image", - "name": "Nano Banana 2", - "display_name": "Nano Banana 2", + "id": "meta/muse-spark-1.3", + "name": "Muse Spark 1.3", + "display_name": "Muse Spark 1.3", "modalities": { "input": [ "text", - "image" + "image", + "video", + "pdf", + "audio" ], "output": [ - "text", - "image" + "text" ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 1048576, + "output": 943718 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, "default": true @@ -161168,25 +157202,30 @@ "reasoning": { "supported": true, "effort_options": [ + "minimal", "low", - "high" + "medium", + "high", + "xhigh" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-05-28", - "last_updated": "2026-05-28" + "release_date": "2026-09-02", + "last_updated": "2026-09-02", + "type": "chat" }, { - "id": "google/gemini-3-flash", - "name": "Gemini 3 Flash", - "display_name": "Gemini 3 Flash", + "id": "meta/muse-wonder", + "name": "Muse Wonder", + "display_name": "Muse Wonder", "modalities": { "input": [ "text", "image", + "video", + "audio", "pdf" ], "output": [ @@ -161194,10 +157233,9 @@ ] }, "limit": { - "context": 1000000, - "output": 65000 + "context": 1048576, + "output": 1048576 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -161205,38 +157243,29 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ + "effort_options": [ "minimal", "low", "medium", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" + "high", + "xhigh", + "max" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-03", - "release_date": "2025-12-17", - "last_updated": "2025-12-17", + "release_date": "2026-10-12", + "last_updated": "2026-10-12", "type": "chat" }, { - "id": "google/gemini-3.1-flash-lite", - "name": "Gemini 3.1 Flash Lite", - "display_name": "Gemini 3.1 Flash Lite", + "id": "unsloth/gemma-3-12b-it", + "name": "Gemma 3 12B IT", + "display_name": "Gemma 3 12B IT", "modalities": { "input": [ "text", - "image", "pdf" ], "output": [ @@ -161244,39 +157273,28 @@ ] }, "limit": { - "context": 1000000, - "output": 65000 + "context": 131072, + "output": 16384 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "low", - "high" - ] - } + "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-05-07", - "last_updated": "2026-05-07", + "open_weights": true, + "knowledge": "2024-08", + "release_date": "2025-03-12", + "last_updated": "2025-03-12", "type": "chat" }, { - "id": "google/gemma-4-26b-a4b-it", - "name": "Gemma 4 26B A4B IT", - "display_name": "Gemma 4 26B A4B IT", + "id": "unsloth/gemma-3-4b-it", + "name": "Gemma 3 4B IT", + "display_name": "Gemma 3 4B IT", "modalities": { "input": [ "text", - "image", "pdf" ], "output": [ @@ -161284,149 +157302,138 @@ ] }, "limit": { - "context": 262144, - "output": 131072 + "context": 128000, + "output": 8192 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, "attachment": true, "open_weights": true, - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "knowledge": "2024-08", + "release_date": "2025-03-12", + "last_updated": "2025-03-12", "type": "chat" }, { - "id": "google/gemini-3.8-flash-tts", - "name": "Gemini 3.8 Flash TTS", - "display_name": "Gemini 3.8 Flash TTS", + "id": "unsloth/gemma-3-27b-it", + "name": "Gemma 3 27B IT", + "display_name": "Gemma 3 27B IT", "modalities": { "input": [ - "text" + "text", + "pdf" ], "output": [ - "audio" + "text" ] }, "limit": { - "context": 8192, - "output": 16384 + "context": 128000, + "output": 96000 }, - "temperature": false, + "temperature": true, "tool_call": false, "reasoning": { "supported": false }, - "attachment": false, - "open_weights": false, - "release_date": "2026-09-22", - "last_updated": "2026-09-22" + "attachment": true, + "open_weights": true, + "knowledge": "2024-08", + "release_date": "2025-03-12", + "last_updated": "2025-03-12", + "type": "chat" }, { - "id": "google/text-multilingual-embedding-002", - "name": "Text Multilingual Embedding 002", - "display_name": "Text Multilingual Embedding 002", + "id": "ornith-ai/ornith-1.5-122b", + "name": "Ornith 1.5 122B", + "display_name": "Ornith 1.5 122B", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 262144, + "output": 32768 }, - "temperature": false, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": false, - "release_date": "2024-03-01", - "last_updated": "2024-03", - "type": "embedding" + "attachment": true, + "open_weights": true, + "release_date": "2026-10-20", + "last_updated": "2026-10-20", + "type": "chat" }, { - "id": "google/gemini-nano-banana-2.1", - "name": "Gemini Nano Banana 2.1", - "display_name": "Gemini Nano Banana 2.1", + "id": "ornith-ai/ornith-1.5-35b-a3b", + "name": "Ornith 1.5 35B", + "display_name": "Ornith 1.5 35B", "modalities": { "input": [ "text", "image" ], "output": [ - "text", - "image" + "text" ] }, "limit": { - "context": 131072, + "context": 262144, "output": 32768 }, - "temperature": false, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "minimal", - "medium", - "high" - ] - } - }, "attachment": true, - "open_weights": false, - "release_date": "2026-10-06", - "last_updated": "2026-10-06" + "open_weights": true, + "release_date": "2026-07-29", + "last_updated": "2026-08-20", + "type": "chat" }, { - "id": "google/gemini-embedding-2", - "name": "Gemini Embedding 2", - "display_name": "Gemini Embedding 2", + "id": "ornith-ai/ornith-1.5-35b-a3b:thinking", + "name": "Ornith 1.5 35B Thinking", + "display_name": "Ornith 1.5 35B Thinking", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 8192, - "output": 3072 + "context": 262144, + "output": 32768 }, - "temperature": false, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": false, - "knowledge": "2025-11", - "release_date": "2026-04-22", - "last_updated": "2026-04-22", - "type": "embedding" + "attachment": true, + "open_weights": true, + "release_date": "2026-07-29", + "last_updated": "2026-08-20", + "type": "chat" }, { - "id": "minimax/minimax-m2", - "name": "MiniMax M2", - "display_name": "MiniMax M2", + "id": "tencent/hy3", + "name": "Tencent Hy3", + "display_name": "Tencent Hy3", "modalities": { "input": [ "text" @@ -161436,8 +157443,8 @@ ] }, "limit": { - "context": 205000, - "output": 196608 + "context": 262144, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -161448,19 +157455,23 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true + "effort_options": [ + "none", + "low", + "high" + ] } }, "attachment": false, "open_weights": true, - "release_date": "2025-10-27", - "last_updated": "2025-10-27", + "release_date": "2026-07-06", + "last_updated": "2026-07-06", "type": "chat" }, { - "id": "minimax/minimax-m2.5", - "name": "MiniMax M2.5", - "display_name": "MiniMax M2.5", + "id": "tencent/hy4-preview", + "name": "Tencent Hy4 Preview", + "display_name": "Tencent Hy4 Preview", "modalities": { "input": [ "text" @@ -161470,8 +157481,8 @@ ] }, "limit": { - "context": 204800, - "output": 131000 + "context": 1048576, + "output": 64000 }, "temperature": true, "tool_call": true, @@ -161481,52 +157492,51 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "effort_options": [ + "none", + "low", + "high" + ] } }, "attachment": false, "open_weights": true, - "release_date": "2026-02-12", - "last_updated": "2026-02-12", + "release_date": "2026-08-28", + "last_updated": "2026-08-28", "type": "chat" }, { - "id": "minimax/minimax-m2.5-highspeed", - "name": "MiniMax M2.5 High Speed", - "display_name": "MiniMax M2.5 High Speed", + "id": "unbiased/pareto-26.9", + "name": "Pareto 26.9", + "display_name": "Pareto 26.9", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 204800, - "output": 131000 + "context": 262144, + "output": 131072 }, - "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, - "attachment": false, - "open_weights": true, - "release_date": "2026-02-13", - "last_updated": "2026-02-13", + "attachment": true, + "open_weights": false, + "release_date": "2026-09-18", + "last_updated": "2026-09-18", "type": "chat" }, { - "id": "minimax/minimax-m3.1-flash", - "name": "MiniMax-M3.1-Flash", - "display_name": "MiniMax-M3.1-Flash", + "id": "unbiased/pareto-26.10", + "name": "Pareto 26.10", + "display_name": "Pareto 26.10", "modalities": { "input": [ "text", @@ -161538,35 +157548,22 @@ }, "limit": { "context": 1048576, - "output": 1048576 + "output": 131072 }, - "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ] - } + "supported": false }, "attachment": true, "open_weights": false, - "release_date": "2026-10-19", - "last_updated": "2026-10-19", + "release_date": "2026-10-01", + "last_updated": "2026-10-01", "type": "chat" }, { - "id": "minimax/minimax-m2.1", - "name": "MiniMax M2.1", - "display_name": "MiniMax M2.1", + "id": "mlabonne/NeuralDaredevil-8B-abliterated", + "name": "Neural Daredevil 8B abliterated", + "display_name": "Neural Daredevil 8B abliterated", "modalities": { "input": [ "text" @@ -161576,31 +157573,23 @@ ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 8192, + "output": 8192 }, - "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true - } + "supported": false }, "attachment": false, "open_weights": true, - "release_date": "2025-12-23", - "last_updated": "2025-12-23", + "release_date": "2024-01-01", + "last_updated": "2024-12-01", "type": "chat" }, { - "id": "minimax/minimax-m2.1-lightning", - "name": "MiniMax M2.1 Lightning", - "display_name": "MiniMax M2.1 Lightning", + "id": "reka/reka-flash-3", + "name": "Reka Flash 3", + "display_name": "Reka Flash 3", "modalities": { "input": [ "text" @@ -161610,66 +157599,67 @@ ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 65536, + "output": 65536 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true }, "attachment": false, - "open_weights": false, - "knowledge": "2024-10", - "release_date": "2025-12-23", - "last_updated": "2025-10-27", + "open_weights": true, + "knowledge": "2025-01-31", + "release_date": "2025-03-10", + "last_updated": "2025-03-10", "type": "chat" }, { - "id": "minimax/minimax-h3", - "name": "MiniMax H3", - "display_name": "MiniMax H3", + "id": "reka/reka-edge-2603", + "name": "Reka Edge 2603", + "display_name": "Reka Edge 2603", "modalities": { "input": [ "text", "image" ], "output": [ - "video" + "text" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 16384, + "output": 16384 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": false }, "attachment": true, "open_weights": true, - "release_date": "2026-07-31", - "last_updated": "2026-10-04" + "release_date": "2026-03-11", + "last_updated": "2026-03-11", + "type": "chat" }, { - "id": "minimax/minimax-m3", - "name": "MiniMax M3", - "display_name": "MiniMax M3", + "id": "thinkingmachines/inkling:thinking", + "name": "Inkling Thinking", + "display_name": "Inkling Thinking", "modalities": { "input": [ "text", "image", - "pdf" + "audio" ], "output": [ "text" ] }, "limit": { - "context": 512000, - "output": 512000 + "context": 1040000, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -161679,30 +157669,38 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "effort_options": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "attachment": true, "open_weights": true, - "release_date": "2026-06-01", - "last_updated": "2026-06-01", + "release_date": "2026-07-15", + "last_updated": "2026-07-15", "type": "chat" }, { - "id": "minimax/minimax-m2.7", - "name": "Minimax M2.7", - "display_name": "Minimax M2.7", + "id": "thinkingmachines/Inkling-Small:thinking", + "name": "Inkling Small Thinking", + "display_name": "Inkling Small Thinking", "modalities": { "input": [ - "text" + "text", + "image", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 204800, - "output": 131000 + "context": 524288, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -161712,561 +157710,306 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "minimal", + "low", + "medium", + "high", + "max" ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-03-18", - "last_updated": "2026-03-18", + "release_date": "2026-07-30", + "last_updated": "2026-07-30", "type": "chat" }, { - "id": "minimax/minimax-m2.7-highspeed", - "name": "MiniMax M2.7 High Speed", - "display_name": "MiniMax M2.7 High Speed", + "id": "thinkingmachines/inkling", + "name": "Inkling", + "display_name": "Inkling", "modalities": { "input": [ - "text" + "text", + "image", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 204800, - "output": 131100 + "context": 1048000, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-03-18", - "last_updated": "2026-03-18", + "release_date": "2026-07-15", + "last_updated": "2026-07-15", "type": "chat" }, { - "id": "minimax/minimax-h3-max", - "name": "MiniMax H3 Max", - "display_name": "MiniMax H3 Max", + "id": "thinkingmachines/Inkling-Small", + "name": "Inkling Small", + "display_name": "Inkling Small", "modalities": { "input": [ "text", - "image" + "image", + "audio" ], "output": [ - "video" + "text" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 524288, + "output": 32768 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": false }, "attachment": true, - "open_weights": false, - "release_date": "2026-08-26", - "last_updated": "2026-08-26" + "open_weights": true, + "release_date": "2026-07-30", + "last_updated": "2026-07-30", + "type": "chat" }, { - "id": "bfl/flux-3-image", - "name": "FLUX 3 Image", - "display_name": "FLUX 3 Image", + "id": "xingchen-agi/xing4.0-29b-a4b", + "name": "Xing 4.0 29B A4B", + "display_name": "Xing 4.0 29B A4B", "modalities": { "input": [ "text" ], "output": [ - "image" + "text" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 262144, + "output": 262144 }, - "temperature": false, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "minimal", + "low", + "medium", + "high", + "xhigh", + "max" + ] + } }, "attachment": false, - "open_weights": false, - "release_date": "2026-10-05", - "last_updated": "2026-10-05" + "open_weights": true, + "release_date": "2026-10-24", + "last_updated": "2026-10-24", + "type": "chat" }, { - "id": "bfl/flux-2-flex", - "name": "FLUX.2 [flex]", - "display_name": "FLUX.2 [flex]", + "id": "Doctor-Shotgun/MS3.2-24B-Magnum-Diamond", + "name": "MS3.2 24B Magnum Diamond", + "display_name": "MS3.2 24B Magnum Diamond", "modalities": { "input": [ "text" ], "output": [ - "image" - ] - }, - "limit": { - "context": 8192, - "output": 8192 - }, - "temperature": false, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": false, - "release_date": "2025-11-25", - "last_updated": "2026-06-08" - }, - { - "id": "bfl/flux-2-max", - "name": "FLUX.2 [max]", - "display_name": "FLUX.2 [max]", - "modalities": { - "input": [ "text" - ], - "output": [ - "image" ] }, "limit": { - "context": 67300, - "output": 67300 + "context": 32768, + "output": 32768 }, - "temperature": false, "tool_call": false, "reasoning": { "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2025-12-16", - "last_updated": "2026-06-08" - }, - { - "id": "bfl/flux-3-video", - "name": "Flux 3", - "display_name": "Flux 3", - "modalities": { - "input": [ - "text", - "image", - "video" - ], - "output": [ - "video" - ] - }, - "limit": { - "context": 8192, - "output": 8192 - }, - "temperature": false, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": false, - "release_date": "2026-08-04", - "last_updated": "2026-08-04" + "open_weights": true, + "release_date": "2025-11-24", + "last_updated": "2025-11-24", + "type": "chat" }, { - "id": "bfl/flux-2-klein-9b", - "name": "FLUX.2 [klein] 9B", - "display_name": "FLUX.2 [klein] 9B", + "id": "reflection/beam-1.0", + "name": "Beam 1.0 501B A23B", + "display_name": "Beam 1.0 501B A23B", "modalities": { "input": [ "text" ], "output": [ - "image" - ] - }, - "limit": { - "context": 8192, - "output": 8192 - }, - "temperature": false, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": false, - "release_date": "2026-01-15", - "last_updated": "2026-06-08" - }, - { - "id": "bfl/flux-kontext-pro", - "name": "FLUX.1 Kontext Pro", - "display_name": "FLUX.1 Kontext Pro", - "modalities": { - "input": [ "text" - ], - "output": [ - "image" ] }, "limit": { - "context": 512, - "output": 8192 + "context": 1048576, + "output": 131072 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": false, - "release_date": "2025-05-29", - "last_updated": "2025-06" - }, - { - "id": "bfl/flux-pro-1.1", - "name": "FLUX1.1 [pro]", - "display_name": "FLUX1.1 [pro]", - "modalities": { - "input": [ - "text" - ], - "output": [ - "image" - ] - }, - "limit": { - "context": 512, - "output": 8192 + "supported": true, + "default": true }, - "temperature": false, - "tool_call": false, - "reasoning": { - "supported": false + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } }, "attachment": false, - "open_weights": false, - "release_date": "2024-10-02", - "last_updated": "2024-10" + "open_weights": true, + "knowledge": "2026-06-30", + "release_date": "2026-10-05", + "last_updated": "2026-10-16", + "type": "chat" }, { - "id": "bfl/flux-kontext-max", - "name": "FLUX.1 Kontext Max", - "display_name": "FLUX.1 Kontext Max", + "id": "bytedance/doubao-seed-character", + "name": "Doubao Seed Character", + "display_name": "Doubao Seed Character", "modalities": { "input": [ - "text" - ], - "output": [ + "text", "image" - ] - }, - "limit": { - "context": 512, - "output": 8192 - }, - "temperature": false, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": false, - "release_date": "2025-05-29", - "last_updated": "2025-06" - }, - { - "id": "bfl/flux-2-klein-4b", - "name": "FLUX.2 [klein] 4B", - "display_name": "FLUX.2 [klein] 4B", - "modalities": { - "input": [ - "text" ], "output": [ - "image" - ] - }, - "limit": { - "context": 8192, - "output": 8192 - }, - "temperature": false, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": false, - "release_date": "2026-01-15", - "last_updated": "2026-06-08" - }, - { - "id": "bfl/flux-pro-1.0-fill", - "name": "FLUX.1 Fill [pro]", - "display_name": "FLUX.1 Fill [pro]", - "modalities": { - "input": [ "text" - ], - "output": [ - "image" ] }, "limit": { - "context": 512, - "output": 8192 + "context": 128000, + "output": 32768 }, - "temperature": false, + "temperature": true, "tool_call": false, "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": false, - "release_date": "2024-10-01", - "last_updated": "2024-10" - }, - { - "id": "bfl/flux-2-pro", - "name": "FLUX.2 [pro]", - "display_name": "FLUX.2 [pro]", - "modalities": { - "input": [ - "text" - ], - "output": [ - "image" - ] - }, - "limit": { - "context": 67300, - "output": 67300 + "supported": true, + "default": true }, - "temperature": false, - "tool_call": false, - "reasoning": { - "supported": false + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "high" + ] + } }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2025-11-25", - "last_updated": "2026-06-08" + "release_date": "2026-06-23", + "last_updated": "2026-06-23", + "type": "chat" }, { - "id": "bfl/flux-3-image-klein", - "name": "FLUX 3 Image Klein", - "display_name": "FLUX 3 Image Klein", + "id": "bytedance/doubao-seed-2.1-turbo", + "name": "Doubao Seed 2.1 Turbo", + "display_name": "Doubao Seed 2.1 Turbo", "modalities": { "input": [ "text" ], "output": [ - "image" - ] - }, - "limit": { - "context": 8192, - "output": 8192 - }, - "temperature": false, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": false, - "release_date": "2026-10-15", - "last_updated": "2026-10-15" - }, - { - "id": "bfl/flux-pro-1.1-ultra", - "name": "FLUX1.1 [pro] Ultra", - "display_name": "FLUX1.1 [pro] Ultra", - "modalities": { - "input": [ "text" - ], - "output": [ - "image" ] }, "limit": { - "context": 512, - "output": 8192 + "context": 256000, + "output": 128000 }, - "temperature": false, + "temperature": true, "tool_call": false, "reasoning": { "supported": false }, "attachment": false, "open_weights": false, - "release_date": "2024-11-01", - "last_updated": "2024-11" + "release_date": "2026-06-23", + "last_updated": "2026-06-23", + "type": "chat" }, { - "id": "fish-audio/s2-pro", - "name": "S2 Pro", - "display_name": "S2 Pro", + "id": "bytedance/doubao-seed-2.1-pro", + "name": "Doubao Seed 2.1 Pro", + "display_name": "Doubao Seed 2.1 Pro", "modalities": { "input": [ "text" ], "output": [ - "audio" - ] - }, - "limit": { - "context": 8192, - "output": 8192 - }, - "temperature": false, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": false, - "release_date": "2026-03-09", - "last_updated": "2026-03-09" - }, - { - "id": "fish-audio/s2.1-pro", - "name": "S2.1 Pro", - "display_name": "S2.1 Pro", - "modalities": { - "input": [ "text" - ], - "output": [ - "audio" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 256000, + "output": 128000 }, - "temperature": false, + "temperature": true, "tool_call": false, "reasoning": { "supported": false }, "attachment": false, "open_weights": false, - "release_date": "2026-07-28", - "last_updated": "2026-07-28" - }, - { - "id": "fish-audio/transcribe-1", - "name": "Transcribe-1", - "display_name": "Transcribe-1", - "modalities": { - "input": [ - "audio" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 8192, - "output": 8192 - }, - "temperature": false, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": false, - "release_date": "2026-03-01", - "last_updated": "2026-03-01" + "release_date": "2026-06-23", + "last_updated": "2026-06-23", + "type": "chat" }, { - "id": "fish-audio/drama-3", - "name": "Drama 3", - "display_name": "Drama 3", + "id": "Steelskull/L3.3-Nevoria-R1-70b", + "name": "Steelskull Nevoria R1 70b", + "display_name": "Steelskull Nevoria R1 70b", "modalities": { "input": [ "text" ], "output": [ - "audio" - ] - }, - "limit": { - "context": 8192, - "output": 8192 - }, - "temperature": false, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": false, - "release_date": "2026-10-13", - "last_updated": "2026-10-13" - }, - { - "id": "fish-audio/s1", - "name": "S1", - "display_name": "S1", - "modalities": { - "input": [ "text" - ], - "output": [ - "audio" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 32768, + "output": 16384 }, - "temperature": false, "tool_call": false, "reasoning": { "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2025-10-20", - "last_updated": "2025-10-20" + "open_weights": true, + "release_date": "2024-01-01", + "last_updated": "2024-12-06", + "type": "chat" }, { - "id": "cohere/command-a", - "name": "Command A", - "display_name": "Command A", + "id": "Steelskull/L3.3-Electra-R1-70b", + "name": "Steelskull Electra R1 70b", + "display_name": "Steelskull Electra R1 70b", "modalities": { "input": [ "text" @@ -162276,25 +158019,23 @@ ] }, "limit": { - "context": 256000, - "output": 8000 + "context": 32768, + "output": 16384 }, - "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, "attachment": false, "open_weights": true, - "knowledge": "2024-08-31", - "release_date": "2025-03-13", - "last_updated": "2025-03-13", + "release_date": "2024-01-01", + "last_updated": "2024-12-06", "type": "chat" }, { - "id": "cohere/embed-v4.0", - "name": "Embed v4.0", - "display_name": "Embed v4.0", + "id": "Steelskull/L3.3-Cu-Mai-R1-70b", + "name": "Llama 3.3 70B Cu Mai", + "display_name": "Llama 3.3 70B Cu Mai", "modalities": { "input": [ "text" @@ -162304,24 +158045,23 @@ ] }, "limit": { - "context": 128000, - "output": 1536 + "context": 32768, + "output": 16384 }, - "temperature": false, "tool_call": false, "reasoning": { "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2025-04-15", - "last_updated": "2025-04-15", - "type": "embedding" + "open_weights": true, + "release_date": "2024-01-01", + "last_updated": "2024-12-06", + "type": "chat" }, { - "id": "cohere/rerank-v4-fast", - "name": "Cohere Rerank 4 Fast", - "display_name": "Cohere Rerank 4 Fast", + "id": "Steelskull/L3.3-MS-Nevoria-70b", + "name": "Steelskull Nevoria 70b", + "display_name": "Steelskull Nevoria 70b", "modalities": { "input": [ "text" @@ -162331,23 +158071,23 @@ ] }, "limit": { - "context": 32000, - "output": 8192 + "context": 32768, + "output": 16384 }, - "temperature": false, "tool_call": false, "reasoning": { "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2025-12-11", - "last_updated": "2025-12-11" + "open_weights": true, + "release_date": "2024-01-01", + "last_updated": "2024-12-06", + "type": "chat" }, { - "id": "cohere/rerank-v5-fast", - "name": "Cohere Rerank 5 Fast", - "display_name": "Cohere Rerank 5 Fast", + "id": "amazon/nova-lite-v1", + "name": "Amazon Nova Lite 1.0", + "display_name": "Amazon Nova Lite 1.0", "modalities": { "input": [ "text" @@ -162357,23 +158097,25 @@ ] }, "limit": { - "context": 32768, - "output": 8192 + "context": 300000, + "output": 5120 }, - "temperature": false, + "temperature": true, "tool_call": false, "reasoning": { "supported": false }, "attachment": false, "open_weights": false, - "release_date": "2026-10-21", - "last_updated": "2026-10-21" + "knowledge": "2024-10-31", + "release_date": "2024-12-05", + "last_updated": "2024-12-05", + "type": "chat" }, { - "id": "cohere/rerank-v4-pro", - "name": "Cohere Rerank 4 Pro", - "display_name": "Cohere Rerank 4 Pro", + "id": "amazon/nova-pro-v1", + "name": "Amazon Nova Pro 1.0", + "display_name": "Amazon Nova Pro 1.0", "modalities": { "input": [ "text" @@ -162383,23 +158125,25 @@ ] }, "limit": { - "context": 32000, - "output": 8192 + "context": 300000, + "output": 32000 }, - "temperature": false, + "temperature": true, "tool_call": false, "reasoning": { "supported": false }, "attachment": false, "open_weights": false, - "release_date": "2025-12-11", - "last_updated": "2025-12-11" + "knowledge": "2024-10-31", + "release_date": "2024-12-05", + "last_updated": "2024-12-05", + "type": "chat" }, { - "id": "cohere/rerank-v5-pro", - "name": "Cohere Rerank 5 Pro", - "display_name": "Cohere Rerank 5 Pro", + "id": "amazon/nova-2-lite-v1", + "name": "Amazon Nova 2 Lite", + "display_name": "Amazon Nova 2 Lite", "modalities": { "input": [ "text" @@ -162409,23 +158153,25 @@ ] }, "limit": { - "context": 32768, - "output": 8192 + "context": 1000000, + "output": 65535 }, - "temperature": false, + "temperature": true, "tool_call": false, "reasoning": { "supported": false }, "attachment": false, "open_weights": false, - "release_date": "2026-10-21", - "last_updated": "2026-10-21" + "knowledge": "2025-10", + "release_date": "2025-12-02", + "last_updated": "2025-12-02", + "type": "chat" }, { - "id": "cohere/embed-v5.0-fast", - "name": "Embed 5 Fast", - "display_name": "Embed 5 Fast", + "id": "speakleash/bielik-11b-v3.0-instruct", + "name": "Bielik 11B v3.0", + "display_name": "Bielik 11B v3.0", "modalities": { "input": [ "text" @@ -162435,77 +158181,94 @@ ] }, "limit": { - "context": 128000, - "output": 2048 + "context": 32768, + "output": 32768 }, - "temperature": false, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2026-09-30", - "last_updated": "2026-09-30", - "type": "embedding" + "open_weights": true, + "release_date": "2026-10-15", + "last_updated": "2026-10-15", + "type": "chat" }, { - "id": "cohere/embed-v5.0-pro", - "name": "Embed 5 Pro", - "display_name": "Embed 5 Pro", + "id": "elorian/glimpse", + "name": "Elorian Glimpse", + "display_name": "Elorian Glimpse", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 2048 + "context": 262144, + "output": 256000 }, - "temperature": false, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-09-30", - "last_updated": "2026-09-30", - "type": "embedding" + "release_date": "2026-10-17", + "last_updated": "2026-10-17", + "type": "chat" }, { - "id": "cohere/rerank-v3.5", - "name": "Cohere Rerank 3.5", - "display_name": "Cohere Rerank 3.5", + "id": "anthropic/claude-opus-5.5", + "name": "Claude Opus 5.5", + "display_name": "Claude Opus 5.5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 4096, - "output": 8192 + "context": 1000000, + "output": 128000 }, "temperature": false, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + }, + "attachment": true, "open_weights": false, - "release_date": "2024-12-02", - "last_updated": "2024-12-02" + "knowledge": "2026-06", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", + "type": "chat" }, { - "id": "moonshotai/kimi-k2.7-code", - "name": "Kimi K2.7 Code", - "display_name": "Kimi K2.7 Code", + "id": "anthropic/claude-fable-5", + "name": "Claude Fable 5", + "display_name": "Claude Fable 5", "modalities": { "input": [ "text", @@ -162517,10 +158280,10 @@ ] }, "limit": { - "context": 256000, - "output": 32768 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -162529,88 +158292,151 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", "effort_options": [ - "none", "low", "medium", - "high" + "high", + "xhigh", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", + "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", + "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-06-12", - "last_updated": "2026-06-12", + "open_weights": false, + "knowledge": "2026-01-31", + "release_date": "2026-06-09", + "last_updated": "2026-06-09", "type": "chat" }, { - "id": "moonshotai/kimi-k2", - "name": "Kimi K2 Instruct", - "display_name": "Kimi K2 Instruct", + "id": "anthropic/claude-opus-4.6", + "name": "Claude 4.6 Opus", + "display_name": "Claude 4.6 Opus", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 131072 + "context": 1000000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-12-31", - "release_date": "2025-07-11", - "last_updated": "2025-07-11", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-05-31", + "release_date": "2026-02-05", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "moonshotai/kimi-k2.6", - "name": "Kimi K2.6", - "display_name": "Kimi K2.6", + "id": "anthropic/claude-haiku-4.5", + "name": "Claude Haiku 4.5", + "display_name": "Claude Haiku 4.5", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262000, - "output": 262000 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-20", - "last_updated": "2026-04-20", + "open_weights": false, + "knowledge": "2025-02-28", + "release_date": "2025-10-15", + "last_updated": "2025-10-15", "type": "chat" }, { - "id": "moonshotai/kimi-k3", - "name": "Kimi K3", - "display_name": "Kimi K3", + "id": "anthropic/claude-opus-4.8", + "name": "Claude Opus 4.8", + "display_name": "Claude Opus 4.8", "modalities": { "input": [ "text", @@ -162623,47 +158449,66 @@ }, "limit": { "context": 1000000, - "output": 131072 + "output": 128000 }, "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "high", "effort_options": [ "low", + "medium", "high", + "xhigh", "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-16", + "open_weights": false, + "knowledge": "2026-01", + "release_date": "2026-05-28", + "last_updated": "2026-05-28", "type": "chat" }, { - "id": "moonshotai/kimi-k3.1-pro-highspeed", - "name": "Kimi K3.1 Pro Highspeed", - "display_name": "Kimi K3.1 Pro Highspeed", + "id": "anthropic/claude-haiku-5.5", + "name": "Claude Haiku 5.5", + "display_name": "Claude Haiku 5.5", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 1048576 + "context": 1000000, + "output": 128000 }, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -162673,35 +158518,38 @@ "reasoning": { "effort_options": [ "low", + "medium", "high", + "xhigh", "max" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-10-23", - "last_updated": "2026-10-23", + "knowledge": "2026-06", + "release_date": "2026-10-07", + "last_updated": "2026-10-07", "type": "chat" }, { - "id": "moonshotai/kimi-k3.1-pro", - "name": "Kimi K3.1 Pro", - "display_name": "Kimi K3.1 Pro", + "id": "anthropic/claude-opus-latest", + "name": "Claude Opus Latest", + "display_name": "Claude Opus Latest", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 1048576 + "context": 1000000, + "output": 128000 }, - "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -162711,21 +158559,23 @@ "reasoning": { "effort_options": [ "low", + "medium", "high", + "xhigh", "max" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-10-23", - "last_updated": "2026-10-23", + "release_date": "2026-03-29", + "last_updated": "2026-03-29", "type": "chat" }, { - "id": "moonshotai/kimi-k2.7-code-highspeed", - "name": "Kimi K2.7 Code High Speed", - "display_name": "Kimi K2.7 Code High Speed", + "id": "anthropic/claude-haiku-4.5:thinking", + "name": "Claude Haiku 4.5 Thinking", + "display_name": "Claude Haiku 4.5 Thinking", "modalities": { "input": [ "text", @@ -162737,8 +158587,8 @@ ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, @@ -162749,37 +158599,48 @@ "extra_capabilities": { "reasoning": { "supported": true, - "effort_options": [ - "none", - "low", - "medium", - "high" + "default_enabled": true, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-06-12", - "last_updated": "2026-06-12", + "open_weights": false, + "knowledge": "2025-02-28", + "release_date": "2025-10-15", + "last_updated": "2025-10-15", "type": "chat" }, { - "id": "moonshotai/kimi-k2.5", - "name": "Kimi K2.5", - "display_name": "Kimi K2.5", + "id": "anthropic/claude-opus-4.1:thinking:8192", + "name": "Claude 4.1 Opus Thinking (8K)", + "display_name": "Claude 4.1 Opus Thinking (8K)", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 256000 + "context": 200000, + "output": 32000 }, "temperature": true, "tool_call": true, @@ -162790,31 +158651,35 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" ], - "effort_options": [ - "none", - "low", - "medium", - "high" + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-01-27", - "last_updated": "2026-01-27", + "open_weights": false, + "knowledge": "2025-03-31", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "moonshotai/kimi-k3-fast", - "name": "Kimi K3 Fast", - "display_name": "Kimi K3 Fast", + "id": "anthropic/claude-fable-latest", + "name": "Claude Fable Latest", + "display_name": "Claude Fable Latest", "modalities": { "input": [ "text", @@ -162827,9 +158692,8 @@ }, "limit": { "context": 1000000, - "output": 131072 + "output": 128000 }, - "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -162837,75 +158701,110 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", "effort_options": [ - "none", "low", "medium", "high", + "xhigh", "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", + "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", + "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-16", + "open_weights": false, + "release_date": "2026-06-09", + "last_updated": "2026-06-09", "type": "chat" }, { - "id": "liquid/lfm2.5-24b-a2b", - "name": "LFM2.5-24B-A2B", - "display_name": "LFM2.5-24B-A2B", + "id": "anthropic/claude-opus-4.7", + "name": "Claude 4.7 Opus", + "display_name": "Claude 4.7 Opus", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 8200 + "context": 1000000, + "output": 128000 }, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "high", "effort_options": [ - "minimal", "low", "medium", "high", "xhigh", "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-10-13", - "last_updated": "2026-10-13", + "knowledge": "2026-01-31", + "release_date": "2026-04-16", + "last_updated": "2026-04-16", "type": "chat" }, { - "id": "reflection/beam-free", - "name": "Beam 1.0 (Free)", - "display_name": "Beam 1.0 (Free)", + "id": "anthropic/claude-opus-4.6:thinking:max", + "name": "Claude 4.6 Opus Thinking Max", + "display_name": "Claude 4.6 Opus Thinking Max", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 1000000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -162915,39 +158814,57 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", "effort_options": [ "low", "medium", "high", - "xhigh", "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2026-06-30", - "release_date": "2026-10-05", - "last_updated": "2026-10-16", + "attachment": true, + "open_weights": false, + "knowledge": "2025-05-31", + "release_date": "2026-02-05", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "reflection/beam", - "name": "Beam 1.0", - "display_name": "Beam 1.0", + "id": "anthropic/claude-sonnet-latest", + "name": "Claude Sonnet Latest", + "display_name": "Claude Sonnet Latest", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 1000000, + "output": 128000 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -162964,2719 +158881,16 @@ ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2026-06-30", - "release_date": "2026-10-05", - "last_updated": "2026-10-16", - "type": "chat" - }, - { - "id": "scaledown/scaledown-extract-1", - "name": "Extract-1", - "display_name": "Extract-1", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 1000000, - "output": 1000000 - }, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": false, - "release_date": "2026-10-20", - "last_updated": "2026-10-20", - "type": "chat" - }, - { - "id": "scaledown/scaledown-summarize-1", - "name": "Summarize-1", - "display_name": "Summarize-1", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 1000000, - "output": 1000 - }, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": false, - "release_date": "2026-10-20", - "last_updated": "2026-10-20", - "type": "chat" - }, - { - "id": "klingai/kling-v2.6-motion-control", - "name": "Kling v2.6 Motion Control", - "display_name": "Kling v2.6 Motion Control", - "modalities": { - "input": [ - "text", - "image", - "video" - ], - "output": [ - "video" - ] - }, - "limit": { - "context": 8192, - "output": 8192 - }, - "temperature": false, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": false, - "release_date": "2025-12-18", - "last_updated": "2025-12-21" - }, - { - "id": "klingai/kling-v3.0-motion-control", - "name": "Kling v3.0 Motion Control", - "display_name": "Kling v3.0 Motion Control", - "modalities": { - "input": [ - "text", - "image", - "video" - ], - "output": [ - "video" - ] - }, - "limit": { - "context": 8192, - "output": 8192 - }, - "temperature": false, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": false, - "release_date": "2026-03-04", - "last_updated": "2026-03-04" - }, - { - "id": "klingai/kling-v2.5-turbo-i2v", - "name": "Kling v2.5 Turbo Image-to-Video", - "display_name": "Kling v2.5 Turbo Image-to-Video", - "modalities": { - "input": [ - "text", - "image" - ], - "output": [ - "video" - ] - }, - "limit": { - "context": 8192, - "output": 8192 - }, - "temperature": false, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": false, - "release_date": "2025-09-23", - "last_updated": "2025-09-23" - }, - { - "id": "klingai/kling-v3.0-i2v", - "name": "Kling v3.0 Image-to-Video", - "display_name": "Kling v3.0 Image-to-Video", - "modalities": { - "input": [ - "text", - "image" - ], - "output": [ - "video" - ] - }, - "limit": { - "context": 8192, - "output": 8192 - }, - "temperature": false, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": false, - "release_date": "2026-02-05", - "last_updated": "2026-02-05" - }, - { - "id": "klingai/kling-v3.0-t2v", - "name": "Kling v3.0 Text-to-Video", - "display_name": "Kling v3.0 Text-to-Video", - "modalities": { - "input": [ - "text" - ], - "output": [ - "video" - ] - }, - "limit": { - "context": 8192, - "output": 8192 - }, - "temperature": false, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": false, - "release_date": "2026-02-05", - "last_updated": "2026-02-05" - }, - { - "id": "klingai/kling-v2.5-turbo-t2v", - "name": "Kling v2.5 Turbo Text-to-Video", - "display_name": "Kling v2.5 Turbo Text-to-Video", - "modalities": { - "input": [ - "text" - ], - "output": [ - "video" - ] - }, - "limit": { - "context": 8192, - "output": 8192 - }, - "temperature": false, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": false, - "release_date": "2025-09-23", - "last_updated": "2025-09-23" - }, - { - "id": "klingai/kling-v2.6-i2v", - "name": "Kling v2.6 Image-to-Video", - "display_name": "Kling v2.6 Image-to-Video", - "modalities": { - "input": [ - "text", - "image" - ], - "output": [ - "video" - ] - }, - "limit": { - "context": 8192, - "output": 8192 - }, - "temperature": false, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": false, - "release_date": "2025-12-03", - "last_updated": "2025-12-21" - }, - { - "id": "klingai/kling-v2.6-t2v", - "name": "Kling v2.6 Text-to-Video", - "display_name": "Kling v2.6 Text-to-Video", - "modalities": { - "input": [ - "text" - ], - "output": [ - "video" - ] - }, - "limit": { - "context": 8192, - "output": 8192 - }, - "temperature": false, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": false, - "release_date": "2025-12-03", - "last_updated": "2025-12-21" - }, - { - "id": "stepfun/step-5-preview", - "name": "Step 5 Preview", - "display_name": "Step 5 Preview", - "modalities": { - "input": [ - "text", - "image" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 1048576, - "output": 1048576 - }, - "temperature": true, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": true, - "release_date": "2026-09-16", - "last_updated": "2026-09-20", - "type": "chat" - }, - { - "id": "stepfun/step-3.7-flash", - "name": "Step 3.7 Flash", - "display_name": "Step 3.7 Flash", - "modalities": { - "input": [ - "text", - "image" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 256000, - "output": 256000 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high" - ] - } - }, - "attachment": true, - "open_weights": true, - "knowledge": "2026-03-01", - "release_date": "2026-05-29", - "last_updated": "2026-05-29", - "type": "chat" - }, - { - "id": "recraft/recraft-v4.1-pro", - "name": "Recraft V4.1 Pro", - "display_name": "Recraft V4.1 Pro", - "modalities": { - "input": [ - "text" - ], - "output": [ - "image" - ] - }, - "limit": { - "context": 8192, - "output": 8192 - }, - "temperature": false, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": false, - "release_date": "2026-05-14", - "last_updated": "2026-05-14" - }, - { - "id": "recraft/recraft-v4.1", - "name": "Recraft V4.1", - "display_name": "Recraft V4.1", - "modalities": { - "input": [ - "text" - ], - "output": [ - "image" - ] - }, - "limit": { - "context": 8192, - "output": 8192 - }, - "temperature": false, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": false, - "release_date": "2026-05-14", - "last_updated": "2026-05-14" - }, - { - "id": "recraft/recraft-v4.1-utility", - "name": "Recraft V4.1 Utility", - "display_name": "Recraft V4.1 Utility", - "modalities": { - "input": [ - "text" - ], - "output": [ - "image" - ] - }, - "limit": { - "context": 8192, - "output": 8192 - }, - "temperature": false, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": false, - "release_date": "2026-05-14", - "last_updated": "2026-05-14" - }, - { - "id": "recraft/recraft-v4.1-utility-pro", - "name": "Recraft V4.1 Utility Pro", - "display_name": "Recraft V4.1 Utility Pro", - "modalities": { - "input": [ - "text" - ], - "output": [ - "image" - ] - }, - "limit": { - "context": 8192, - "output": 8192 - }, - "temperature": false, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": false, - "release_date": "2026-05-14", - "last_updated": "2026-05-14" - }, - { - "id": "recraft/recraft-v4-pro", - "name": "Recraft V4 Pro", - "display_name": "Recraft V4 Pro", - "modalities": { - "input": [ - "text" - ], - "output": [ - "image" - ] - }, - "limit": { - "context": 8192, - "output": 8192 - }, - "temperature": false, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": false, - "release_date": "2026-02-17", - "last_updated": "2026-02-17" - }, - { - "id": "recraft/recraft-v4", - "name": "Recraft V4", - "display_name": "Recraft V4", - "modalities": { - "input": [ - "text" - ], - "output": [ - "image" - ] - }, - "limit": { - "context": 8192, - "output": 8192 - }, - "temperature": false, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": false, - "release_date": "2026-02-17", - "last_updated": "2026-02-17" - }, - { - "id": "recraft/recraft-v3", - "name": "Recraft V3", - "display_name": "Recraft V3", - "modalities": { - "input": [ - "text" - ], - "output": [ - "image" - ] - }, - "limit": { - "context": 512, - "output": 8192 - }, - "temperature": false, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": false, - "release_date": "2024-10-30", - "last_updated": "2024-10" - }, - { - "id": "recraft/recraft-v2", - "name": "Recraft V2", - "display_name": "Recraft V2", - "modalities": { - "input": [ - "text" - ], - "output": [ - "image" - ] - }, - "limit": { - "context": 512, - "output": 8192 - }, - "temperature": false, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": false, - "release_date": "2024-03-13", - "last_updated": "2024-03" - }, - { - "id": "recraft/recraft-v4.1-flash", - "name": "Recraft V4.1 Flash", - "display_name": "Recraft V4.1 Flash", - "modalities": { - "input": [ - "text" - ], - "output": [ - "image" - ] - }, - "limit": { - "context": 8192, - "output": 8192 - }, - "temperature": false, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": false, - "release_date": "2026-09-23", - "last_updated": "2026-09-23" - }, - { - "id": "morph/morph-v3-fast", - "name": "Morph V3 Fast", - "display_name": "Morph V3 Fast", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 262144, - "output": 131072 - }, - "temperature": true, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": false, - "release_date": "2025-07-07", - "last_updated": "2025-07-07", - "type": "chat" - }, - { - "id": "morph/morph-v3-large", - "name": "Morph V3 Large", - "display_name": "Morph V3 Large", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 262144, - "output": 131072 - }, - "temperature": true, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": false, - "release_date": "2025-07-07", - "last_updated": "2025-07-07", - "type": "chat" - }, - { - "id": "alibaba/qwen3.8-27b", - "name": "Qwen3.8 27B", - "display_name": "Qwen3.8 27B", - "modalities": { - "input": [ - "text", - "image", - "pdf" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 1000000, - "output": 131072 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "xhigh" - ] - } - }, - "attachment": true, - "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", - "type": "chat" - }, - { - "id": "alibaba/qwen-3-14b", - "name": "Qwen3-14B", - "display_name": "Qwen3-14B", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 40960, - "output": 16384 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "attachment": false, - "open_weights": false, - "knowledge": "2025-04", - "release_date": "2025-04-28", - "last_updated": "2025-04", - "type": "chat" - }, - { - "id": "alibaba/qwen-3-30b", - "name": "Qwen3-30B-A3B", - "display_name": "Qwen3-30B-A3B", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 40960, - "output": 16384 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "attachment": false, - "open_weights": true, - "release_date": "2025-04-28", - "last_updated": "2025-04-28", - "type": "chat" - }, - { - "id": "alibaba/qwen-3-235b", - "name": "Qwen3 235B A22B Instruct 2507", - "display_name": "Qwen3 235B A22B Instruct 2507", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 262144, - "output": 16384 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "high" - ] - } - }, - "attachment": false, - "open_weights": true, - "release_date": "2025-07-21", - "last_updated": "2025-07-21", - "type": "chat" - }, - { - "id": "alibaba/qwen3-max-thinking", - "name": "Qwen 3 Max Thinking", - "display_name": "Qwen 3 Max Thinking", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 256000, - "output": 65536 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-01-23", - "last_updated": "2025-01", - "type": "chat" - }, - { - "id": "alibaba/qwen3-next-80b-a3b-instruct", - "name": "Qwen3 Next 80B A3B Instruct", - "display_name": "Qwen3 Next 80B A3B Instruct", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 262114, - "output": 262114 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-09", - "last_updated": "2025-09", - "type": "chat" - }, - { - "id": "alibaba/qwen3.7-plus", - "name": "Qwen 3.7 Plus", - "display_name": "Qwen 3.7 Plus", - "modalities": { - "input": [ - "text", - "image", - "pdf" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 1000000, - "output": 64000 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "none", - "minimal", - "low", - "medium", - "high", - "xhigh", - "max" - ] - } - }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-04", - "release_date": "2026-06-02", - "last_updated": "2026-06-02", - "type": "chat" - }, - { - "id": "alibaba/wan-v2.6-i2v-flash", - "name": "Wan v2.6 Image-to-Video Flash", - "display_name": "Wan v2.6 Image-to-Video Flash", - "modalities": { - "input": [ - "text", - "image", - "audio" - ], - "output": [ - "video" - ] - }, - "limit": { - "context": 8192, - "output": 8192 - }, - "temperature": false, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": false, - "release_date": "2025-12-16", - "last_updated": "2025-12-16" - }, - { - "id": "alibaba/qwen3-embedding-4b", - "name": "Qwen3 Embedding 4B", - "display_name": "Qwen3 Embedding 4B", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 32768, - "output": 8192 - }, - "temperature": false, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": true, - "release_date": "2025-06-05", - "last_updated": "2025-06-05", - "type": "embedding" - }, - { - "id": "alibaba/qwen3.8-max", - "name": "Qwen 3.8 Max", - "display_name": "Qwen 3.8 Max", - "modalities": { - "input": [ - "text", - "image" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 262144, - "output": 128000 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "low", - "medium", - "xhigh" - ] - } - }, - "attachment": true, - "open_weights": false, - "release_date": "2026-07-19", - "last_updated": "2026-07-19", - "type": "chat" - }, - { - "id": "alibaba/qwen3.8-max-prime", - "name": "Qwen 3.8 Max Prime", - "display_name": "Qwen 3.8 Max Prime", - "modalities": { - "input": [ - "text", - "image" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 1000000, - "output": 131072 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "xhigh" - ] - } - }, - "attachment": true, - "open_weights": false, - "release_date": "2026-09-23", - "last_updated": "2026-09-23", - "type": "chat" - }, - { - "id": "alibaba/qwen3-embedding-0.6b", - "name": "Qwen3 Embedding 0.6B", - "display_name": "Qwen3 Embedding 0.6B", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 32768, - "output": 8192 - }, - "temperature": false, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": true, - "release_date": "2025-06-05", - "last_updated": "2025-06-05", - "type": "embedding" - }, - { - "id": "alibaba/qwen3-coder-next", - "name": "Qwen3 Coder Next", - "display_name": "Qwen3 Coder Next", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 256000, - "output": 256000 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-09", - "release_date": "2026-02-03", - "last_updated": "2026-02-03", - "type": "chat" - }, - { - "id": "alibaba/qwen3.5-plus", - "name": "Qwen 3.5 Plus", - "display_name": "Qwen 3.5 Plus", - "modalities": { - "input": [ - "text", - "image", - "pdf" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 1000000, - "output": 64000 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "none", - "minimal", - "low", - "medium", - "high", - "xhigh", - "max" - ] - } - }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-04", - "release_date": "2026-02-16", - "last_updated": "2026-02-16", - "type": "chat" - }, - { - "id": "alibaba/wan-v2.6-t2v", - "name": "Wan v2.6 Text-to-Video", - "display_name": "Wan v2.6 Text-to-Video", - "modalities": { - "input": [ - "text", - "audio" - ], - "output": [ - "video" - ] - }, - "limit": { - "context": 8192, - "output": 8192 - }, - "temperature": false, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": false, - "release_date": "2025-12-16", - "last_updated": "2025-12-16" - }, - { - "id": "alibaba/wan-v2.7-r2v", - "name": "Wan v2.7 Reference-to-Video", - "display_name": "Wan v2.7 Reference-to-Video", - "modalities": { - "input": [ - "text", - "image", - "video", - "audio" - ], - "output": [ - "video" - ] - }, - "limit": { - "context": 8192, - "output": 8192 - }, - "temperature": false, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": false, - "release_date": "2026-04-07", - "last_updated": "2026-04-07" - }, - { - "id": "alibaba/qwen3.5-flash", - "name": "Qwen 3.5 Flash", - "display_name": "Qwen 3.5 Flash", - "modalities": { - "input": [ - "text", - "image", - "pdf" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 1000000, - "output": 64000 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "none", - "minimal", - "low", - "medium", - "high", - "xhigh", - "max" - ] - } - }, - "attachment": true, - "open_weights": false, - "release_date": "2026-02-23", - "last_updated": "2026-02-23", - "type": "chat" - }, - { - "id": "alibaba/qwen3.7-flash", - "name": "Qwen 3.7 Flash", - "display_name": "Qwen 3.7 Flash", - "modalities": { - "input": [ - "text", - "image", - "pdf" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 991000, - "output": 64000 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "none", - "minimal", - "low", - "medium", - "high", - "xhigh", - "max" - ] - } - }, - "attachment": true, - "open_weights": false, - "release_date": "2026-07-15", - "last_updated": "2026-07-15", - "type": "chat" - }, - { - "id": "alibaba/qwen3.6-plus", - "name": "Qwen 3.6 Plus", - "display_name": "Qwen 3.6 Plus", - "modalities": { - "input": [ - "text", - "image", - "pdf" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 1000000, - "output": 64000 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "none", - "minimal", - "low", - "medium", - "high", - "xhigh", - "max" - ] - } - }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-04", - "release_date": "2026-04-02", - "last_updated": "2026-04-02", - "type": "chat" - }, - { - "id": "alibaba/wan-v2.6-r2v-flash", - "name": "Wan v2.6 Reference-to-Video Flash", - "display_name": "Wan v2.6 Reference-to-Video Flash", - "modalities": { - "input": [ - "text", - "image", - "video" - ], - "output": [ - "video" - ] - }, - "limit": { - "context": 8192, - "output": 8192 - }, - "temperature": false, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": false, - "release_date": "2025-12-16", - "last_updated": "2025-12-16" - }, - { - "id": "alibaba/qwen3-coder-30b-a3b", - "name": "Qwen 3 Coder 30B A3B Instruct", - "display_name": "Qwen 3 Coder 30B A3B Instruct", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 262144, - "output": 8192 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-07-31", - "last_updated": "2025-07-31", - "type": "chat" - }, - { - "id": "alibaba/qwen3.7-max", - "name": "Qwen 3.7 Max", - "display_name": "Qwen 3.7 Max", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 991000, - "output": 64000 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "none", - "minimal", - "low", - "medium", - "high", - "xhigh", - "max" - ] - } - }, - "attachment": false, - "open_weights": false, - "release_date": "2026-05-21", - "last_updated": "2026-05-21", - "type": "chat" - }, - { - "id": "alibaba/wan-v2.6-i2v", - "name": "Wan v2.6 Image-to-Video", - "display_name": "Wan v2.6 Image-to-Video", - "modalities": { - "input": [ - "text", - "image", - "audio" - ], - "output": [ - "video" - ] - }, - "limit": { - "context": 8192, - "output": 8192 - }, - "temperature": false, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": false, - "release_date": "2025-12-16", - "last_updated": "2025-12-16" - }, - { - "id": "alibaba/wan-v3.0-video-prime", - "name": "Wan v3.0 Video Prime", - "display_name": "Wan v3.0 Video Prime", - "modalities": { - "input": [ - "text", - "image", - "video", - "audio" - ], - "output": [ - "video" - ] - }, - "limit": { - "context": 8192, - "output": 8192 - }, - "temperature": false, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": false, - "release_date": "2026-08-28", - "last_updated": "2026-08-28" - }, - { - "id": "alibaba/qwen3.6-27b", - "name": "Qwen 3.6 27B", - "display_name": "Qwen 3.6 27B", - "modalities": { - "input": [ - "text", - "image", - "pdf" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 256000, - "output": 65536 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, - "attachment": true, - "open_weights": true, - "release_date": "2026-04-22", - "last_updated": "2026-04-22", - "type": "chat" - }, - { - "id": "alibaba/qwen3-vl-instruct", - "name": "Qwen3 VL Instruct", - "display_name": "Qwen3 VL Instruct", - "modalities": { - "input": [ - "text", - "image" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 262144, - "output": 262144 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-09-23", - "last_updated": "2025-09-24", - "type": "chat" - }, - { - "id": "alibaba/wan-v3.0-video", - "name": "Wan v3.0 Video", - "display_name": "Wan v3.0 Video", - "modalities": { - "input": [ - "text", - "image", - "video", - "audio" - ], - "output": [ - "video" - ] - }, - "limit": { - "context": 8192, - "output": 8192 - }, - "temperature": false, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": false, - "release_date": "2026-08-23", - "last_updated": "2026-08-23" - }, - { - "id": "alibaba/qwen-3-32b", - "name": "Qwen 3.32B", - "display_name": "Qwen 3.32B", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 128000, - "output": 8192 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "high" - ] - } - }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-04-28", - "last_updated": "2025-04-28", - "type": "chat" - }, - { - "id": "alibaba/qwen3-next-80b-a3b-thinking", - "name": "Qwen3 Next 80B A3B Thinking", - "display_name": "Qwen3 Next 80B A3B Thinking", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 262144, - "output": 262144 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-09", - "last_updated": "2025-09", - "type": "chat" - }, - { - "id": "alibaba/wan-v2.7-t2v", - "name": "Wan v2.7 Text-to-Video", - "display_name": "Wan v2.7 Text-to-Video", - "modalities": { - "input": [ - "text", - "audio" - ], - "output": [ - "video" - ] - }, - "limit": { - "context": 8192, - "output": 8192 - }, - "temperature": false, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": false, - "release_date": "2026-04-07", - "last_updated": "2026-04-07" - }, - { - "id": "alibaba/wan-v2.6-r2v", - "name": "Wan v2.6 Reference-to-Video", - "display_name": "Wan v2.6 Reference-to-Video", - "modalities": { - "input": [ - "text", - "image", - "video" - ], - "output": [ - "video" - ] - }, - "limit": { - "context": 8192, - "output": 8192 - }, - "temperature": false, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": false, - "release_date": "2025-12-16", - "last_updated": "2025-12-16" - }, - { - "id": "alibaba/qwen3-coder", - "name": "Qwen3 Coder 480B A35B Instruct", - "display_name": "Qwen3 Coder 480B A35B Instruct", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 262144, - "output": 32768 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-07-22", - "last_updated": "2025-07-22", - "type": "chat" - }, - { - "id": "alibaba/qwen3.8-max-0902", - "name": "Qwen3.8 Max 0902", - "display_name": "Qwen3.8 Max 0902", - "modalities": { - "input": [ - "text", - "image", - "pdf" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 991000, - "output": 128000 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "xhigh" - ] - } - }, - "attachment": true, - "open_weights": false, - "release_date": "2026-09-02", - "last_updated": "2026-09-02", - "type": "chat" - }, - { - "id": "alibaba/qwen3.8-2.4t-a95b", - "name": "Qwen3.8 2.4T A95B", - "display_name": "Qwen3.8 2.4T A95B", - "modalities": { - "input": [ - "text", - "image" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 262144, - "output": 128000 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "low", - "medium", - "xhigh" - ] - } - }, - "attachment": true, - "open_weights": true, - "release_date": "2026-08-12", - "last_updated": "2026-08-12", - "type": "chat" - }, - { - "id": "alibaba/wan-v2.5-t2v-preview", - "name": "Wan v2.5 Text-to-Video Preview", - "display_name": "Wan v2.5 Text-to-Video Preview", - "modalities": { - "input": [ - "text", - "audio" - ], - "output": [ - "video" - ] - }, - "limit": { - "context": 8192, - "output": 8192 - }, - "temperature": false, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": false, - "release_date": "2025-09-24", - "last_updated": "2025-09-24" - }, - { - "id": "alibaba/qwen3.8-flash", - "name": "Qwen 3.8 Flash", - "display_name": "Qwen 3.8 Flash", - "modalities": { - "input": [ - "text", - "image", - "pdf" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 991000, - "output": 128000 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "low", - "medium", - "xhigh" - ] - } - }, - "attachment": true, - "open_weights": false, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", - "type": "chat" - }, - { - "id": "alibaba/qwen3.8-omni-flash", - "name": "Qwen 3.8 Omni Flash", - "display_name": "Qwen 3.8 Omni Flash", - "modalities": { - "input": [ - "text", - "image" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 1000000, - "output": 131072 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "xhigh" - ] - } - }, - "attachment": true, - "open_weights": false, - "release_date": "2026-09-17", - "last_updated": "2026-09-17", - "type": "chat" - }, - { - "id": "alibaba/qwen3-embedding-8b", - "name": "Qwen3 Embedding 8B", - "display_name": "Qwen3 Embedding 8B", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 32768, - "output": 8192 - }, - "temperature": false, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": true, - "release_date": "2025-06-05", - "last_updated": "2025-06-05", - "type": "embedding" - }, - { - "id": "openai/gpt-image-2.5-flare", - "name": "GPT Image 2.5 Flare", - "display_name": "GPT Image 2.5 Flare", - "modalities": { - "input": [ - "text" - ], - "output": [ - "image" - ] - }, - "limit": { - "context": 8192, - "output": 8192 - }, - "temperature": false, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": false, - "release_date": "2026-09-08", - "last_updated": "2026-09-08" - }, - { - "id": "openai/tts-1-hd", - "name": "TTS-1 HD", - "display_name": "TTS-1 HD", - "modalities": { - "input": [ - "text" - ], - "output": [ - "audio" - ] - }, - "limit": { - "context": 8192, - "output": 8192 - }, - "temperature": false, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": false, - "release_date": "2023-11-06", - "last_updated": "2023-11-06", - "type": "tts" - }, - { - "id": "openai/gpt-5.2", - "name": "GPT-5.2", - "display_name": "GPT-5.2", - "modalities": { - "input": [ - "text", - "image", - "pdf" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 400000, - "output": 128000 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } - }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2025-12-11", - "last_updated": "2025-12-11", - "type": "chat" - }, - { - "id": "openai/gpt-4o-mini-fast", - "name": "GPT-4o mini (Fast)", - "display_name": "GPT-4o mini (Fast)", - "modalities": { - "input": [ - "text", - "image", - "pdf" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 128000, - "output": 16384 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": false, - "knowledge": "2023-09", - "release_date": "2024-07-18", - "last_updated": "2024-07-18", - "type": "chat" - }, - { - "id": "openai/gpt-5.4-mini", - "name": "GPT 5.4 Mini", - "display_name": "GPT 5.4 Mini", - "modalities": { - "input": [ - "text", - "image", - "pdf" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 400000, - "output": 128000 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } - }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-17", - "last_updated": "2026-03-17", - "type": "chat" - }, - { - "id": "openai/gpt-5.6-sol", - "name": "GPT 5.6 Sol", - "display_name": "GPT 5.6 Sol", - "modalities": { - "input": [ - "text", - "image", - "pdf" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 1050000, - "output": 128000 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } - }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", - "type": "chat" - }, - { - "id": "openai/gpt-image-1-mini", - "name": "GPT Image 1 Mini", - "display_name": "GPT Image 1 Mini", - "modalities": { - "input": [ - "text" - ], - "output": [ - "image" - ] - }, - "limit": { - "context": 8192, - "output": 8192 - }, - "temperature": false, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": false, - "release_date": "2025-10-06", - "last_updated": "2025-10-06" - }, - { - "id": "openai/gpt-5.2-codex", - "name": "GPT-5.2-Codex", - "display_name": "GPT-5.2-Codex", - "modalities": { - "input": [ - "text", - "image", - "pdf" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 400000, - "output": 128000 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } - }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2025-12-11", - "last_updated": "2025-12-11", - "type": "chat" - }, - { - "id": "openai/text-embedding-3-large", - "name": "text-embedding-3-large", - "display_name": "text-embedding-3-large", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 8192, - "output": 8192 - }, - "temperature": false, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": false, - "release_date": "2024-01-25", - "last_updated": "2024-01-25", - "type": "embedding" - }, - { - "id": "openai/gpt-5.5-pro", - "name": "GPT 5.5 Pro", - "display_name": "GPT 5.5 Pro", - "modalities": { - "input": [ - "text", - "image", - "pdf" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 1000000, - "output": 128000 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "medium", - "high", - "xhigh" - ] - } - }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-12-01", - "release_date": "2026-04-23", - "last_updated": "2026-04-23", - "type": "chat" - }, - { - "id": "openai/gpt-realtime-2", - "name": "gpt-realtime-2", - "display_name": "gpt-realtime-2", - "modalities": { - "input": [ - "text", - "audio" - ], - "output": [ - "text", - "audio" - ] - }, - "limit": { - "context": 128000, - "output": 32000 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2026-05-07", - "last_updated": "2026-05-07" - }, - { - "id": "openai/gpt-5.5-fast", - "name": "GPT 5.5 (Fast)", - "display_name": "GPT 5.5 (Fast)", - "modalities": { - "input": [ - "text", - "image", - "pdf" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 1000000, - "output": 128000 - }, - "temperature": false, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "minimal", - "low", - "medium", - "high", - "xhigh" - ] - } - }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-12-01", - "release_date": "2026-04-23", - "last_updated": "2026-04-23", - "type": "chat" - }, - { - "id": "openai/gpt-realtime-mini", - "name": "GPT-Realtime mini", - "display_name": "GPT-Realtime mini", - "modalities": { - "input": [ - "text", - "audio" - ], - "output": [ - "text", - "audio" - ] - }, - "limit": { - "context": 32000, - "output": 4096 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": false, - "knowledge": "2023-10-01", - "release_date": "2025-10-06", - "last_updated": "2025-10-06" - }, - { - "id": "openai/gpt-5-nano", - "name": "GPT-5 Nano", - "display_name": "GPT-5 Nano", - "modalities": { - "input": [ - "text", - "image", - "pdf" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 400000, - "output": 128000 - }, - "temperature": false, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "minimal", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } - }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-05-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", - "type": "chat" - }, - { - "id": "openai/gpt-4o-fast", - "name": "GPT-4o (Fast)", - "display_name": "GPT-4o (Fast)", - "modalities": { - "input": [ - "text", - "image", - "pdf" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 128000, - "output": 16384 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": false, - "knowledge": "2023-09", - "release_date": "2024-05-13", - "last_updated": "2024-08-06", - "type": "chat" - }, - { - "id": "openai/gpt-realtime-1.5", - "name": "GPT-Realtime-1.5", - "display_name": "GPT-Realtime-1.5", - "modalities": { - "input": [ - "text", - "audio" - ], - "output": [ - "text", - "audio" - ] - }, - "limit": { - "context": 32000, - "output": 4096 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2026-02-23", - "last_updated": "2026-02-23" - }, - { - "id": "openai/gpt-5.6-terra-fast", - "name": "GPT 5.6 Terra (Fast)", - "display_name": "GPT 5.6 Terra (Fast)", - "modalities": { - "input": [ - "text", - "image", - "pdf" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 1050000, - "output": 128000 - }, - "temperature": false, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "minimal", - "low", - "medium", - "high", - "xhigh", - "max" - ] - } - }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", - "type": "chat" - }, - { - "id": "openai/gpt-4o", - "name": "GPT-4o", - "display_name": "GPT-4o", - "modalities": { - "input": [ - "text", - "image", - "pdf" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 128000, - "output": 16384 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": false, - "knowledge": "2023-09", - "release_date": "2024-05-13", - "last_updated": "2024-08-06", - "type": "chat" - }, - { - "id": "openai/gpt-oss-safeguard-20b", - "name": "gpt-oss-safeguard-20b", - "display_name": "gpt-oss-safeguard-20b", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 128000, - "output": 16000 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high" - ] - } - }, - "attachment": false, - "open_weights": true, - "release_date": "2025-10-29", - "last_updated": "2025-10-29", - "type": "chat" - }, - { - "id": "openai/gpt-5.2-pro", - "name": "GPT 5.2 ", - "display_name": "GPT 5.2 ", - "modalities": { - "input": [ - "text", - "image", - "pdf" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 400000, - "output": 128000 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } - }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2025-12-11", - "last_updated": "2025-12-11", + "release_date": "2026-03-01", + "last_updated": "2026-03-01", "type": "chat" }, { - "id": "openai/gpt-5.4-nano", - "name": "GPT 5.4 Nano", - "display_name": "GPT 5.4 Nano", + "id": "anthropic/claude-opus-4.1", + "name": "Claude 4.1 Opus", + "display_name": "Claude 4.1 Opus", "modalities": { "input": [ "text", @@ -165688,8 +158902,8 @@ ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 200000, + "output": 32000 }, "temperature": true, "tool_call": true, @@ -165701,35 +158915,34 @@ "reasoning": { "supported": true, "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ], - "visibility": "hidden" + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-17", - "last_updated": "2026-03-17", + "knowledge": "2025-03-31", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "openai/gpt-5.6-luna", - "name": "GPT 5.6 Luna", - "display_name": "GPT 5.6 Luna", + "id": "anthropic/claude-opus-4.7:thinking", + "name": "Claude 4.7 Opus Thinking", + "display_name": "Claude 4.7 Opus Thinking", "modalities": { "input": [ "text", @@ -165741,10 +158954,10 @@ ] }, "limit": { - "context": 1050000, + "context": 1000000, "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -165755,35 +158968,38 @@ "supported": true, "default_enabled": true, "mode": "effort", - "effort": "medium", + "effort": "high", "effort_options": [ - "none", "low", "medium", "high", "xhigh", "max" ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" ], - "visibility": "hidden" + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "knowledge": "2026-01-31", + "release_date": "2026-04-16", + "last_updated": "2026-04-16", "type": "chat" }, { - "id": "openai/gpt-5.2-fast", - "name": "GPT 5.2 (Fast)", - "display_name": "GPT 5.2 (Fast)", + "id": "anthropic/claude-sonnet-4.5:thinking", + "name": "Claude Sonnet 4.5 Thinking", + "display_name": "Claude Sonnet 4.5 Thinking", "modalities": { "input": [ "text", @@ -165795,48 +159011,47 @@ ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" + "default_enabled": true, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ], - "visibility": "hidden" + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2025-12-11", - "last_updated": "2025-12-11", + "knowledge": "2025-07-31", + "release_date": "2025-09-29", + "last_updated": "2025-09-29", "type": "chat" }, { - "id": "openai/gpt-5.1-codex-max", - "name": "GPT 5.1 Codex Max", - "display_name": "GPT 5.1 Codex Max", + "id": "anthropic/claude-sonnet-4.6", + "name": "Claude Sonnet 4.6", + "display_name": "Claude Sonnet 4.6", "modalities": { "input": [ "text", @@ -165848,7 +159063,7 @@ ] }, "limit": { - "context": 400000, + "context": 1000000, "output": 128000 }, "temperature": true, @@ -165861,118 +159076,41 @@ "reasoning": { "supported": true, "default_enabled": false, - "mode": "effort", - "effort": "none", + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", "effort_options": [ - "none", "low", "medium", - "high" + "high", + "max" ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ], - "visibility": "hidden" - } - }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-11-13", - "last_updated": "2025-11-13", - "type": "chat" - }, - { - "id": "openai/gpt-5-fast", - "name": "GPT-5 (Fast)", - "display_name": "GPT-5 (Fast)", - "modalities": { - "input": [ - "text", - "image", - "pdf" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 400000, - "output": 128000 - }, - "temperature": false, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "minimal", - "low", - "medium", - "high" + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", - "type": "chat" - }, - { - "id": "openai/o3-mini", - "name": "o3-mini", - "display_name": "o3-mini", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 200000, - "output": 100000 - }, - "temperature": false, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } - }, - "attachment": false, - "open_weights": false, - "knowledge": "2024-05", - "release_date": "2024-12-20", - "last_updated": "2025-01-29", + "knowledge": "2025-08-31", + "release_date": "2026-02-17", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "openai/gpt-5.6-terra", - "name": "GPT 5.6 Terra", - "display_name": "GPT 5.6 Terra", + "id": "anthropic/claude-sonnet-5:thinking", + "name": "Claude Sonnet 5 Thinking", + "display_name": "Claude Sonnet 5 Thinking", "modalities": { "input": [ "text", @@ -165984,10 +159122,10 @@ ] }, "limit": { - "context": 1050000, + "context": 1000000, "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -165997,152 +159135,26 @@ "reasoning": { "supported": true, "default_enabled": true, - "mode": "effort", - "effort": "medium", "effort_options": [ - "none", "low", "medium", "high", "xhigh", "max" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } - }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", - "type": "chat" - }, - { - "id": "openai/gpt-4.1-mini-fast", - "name": "GPT-4.1 mini (Fast)", - "display_name": "GPT-4.1 mini (Fast)", - "modalities": { - "input": [ - "text", - "image", - "pdf" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 1047576, - "output": 32768 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-04-14", - "last_updated": "2025-04-14", - "type": "chat" - }, - { - "id": "openai/o3", - "name": "o3", - "display_name": "o3", - "modalities": { - "input": [ - "text", - "image", - "pdf" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 200000, - "output": 100000 - }, - "temperature": false, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } - }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-05", - "release_date": "2025-04-16", - "last_updated": "2025-04-16", - "type": "chat" - }, - { - "id": "openai/gpt-realtime-2.1", - "name": "gpt-realtime-2.1", - "display_name": "gpt-realtime-2.1", - "modalities": { - "input": [ - "text", - "audio" - ], - "output": [ - "text", - "audio" - ] - }, - "limit": { - "context": 128000, - "output": 32000 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "minimal", - "low", - "medium", - "high", - "xhigh" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2026-07-06", - "last_updated": "2026-07-06" + "knowledge": "2026-01-31", + "release_date": "2026-06-30", + "last_updated": "2026-06-30", + "type": "chat" }, { - "id": "openai/gpt-5.6-luna-fast", - "name": "GPT 5.6 Luna (Fast)", - "display_name": "GPT 5.6 Luna (Fast)", + "id": "anthropic/claude-opus-5", + "name": "Claude Opus 5", + "display_name": "Claude Opus 5", "modalities": { "input": [ "text", @@ -166154,7 +159166,7 @@ ] }, "limit": { - "context": 1050000, + "context": 1000000, "output": 128000 }, "temperature": false, @@ -166165,8 +159177,8 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ - "none", "low", "medium", "high", @@ -166177,121 +159189,15 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", - "type": "chat" - }, - { - "id": "openai/text-embedding-ada-002", - "name": "text-embedding-ada-002", - "display_name": "text-embedding-ada-002", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 8192, - "output": 8192 - }, - "temperature": false, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": false, - "release_date": "2022-12-15", - "last_updated": "2022-12-15", - "type": "embedding" - }, - { - "id": "openai/gpt-image-2.5-sunburst", - "name": "GPT Image 2.5 Sunburst", - "display_name": "GPT Image 2.5 Sunburst", - "modalities": { - "input": [ - "text" - ], - "output": [ - "image" - ] - }, - "limit": { - "context": 8192, - "output": 8192 - }, - "temperature": false, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": false, - "release_date": "2026-09-08", - "last_updated": "2026-09-08" - }, - { - "id": "openai/gpt-5.4-mini-fast", - "name": "GPT 5.4 Mini (Fast)", - "display_name": "GPT 5.4 Mini (Fast)", - "modalities": { - "input": [ - "text", - "image", - "pdf" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 400000, - "output": 128000 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } - }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-17", - "last_updated": "2026-03-17", + "knowledge": "2026-05", + "release_date": "2026-07-24", + "last_updated": "2026-07-24", "type": "chat" }, { - "id": "openai/gpt-5.3-codex-fast", - "name": "GPT 5.3 Codex (Fast)", - "display_name": "GPT 5.3 Codex (Fast)", + "id": "anthropic/claude-opus-4.6:thinking:medium", + "name": "Claude 4.6 Opus Thinking Medium", + "display_name": "Claude 4.6 Opus Thinking Medium", "modalities": { "input": [ "text", @@ -166303,7 +159209,7 @@ ] }, "limit": { - "context": 400000, + "context": 1000000, "output": 128000 }, "temperature": true, @@ -166316,34 +159222,41 @@ "reasoning": { "supported": true, "default_enabled": true, - "mode": "effort", - "effort": "medium", + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", "effort_options": [ "low", "medium", "high", - "xhigh" + "max" ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ], - "visibility": "hidden" + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", + "knowledge": "2025-05-31", "release_date": "2026-02-05", - "last_updated": "2026-02-05", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "openai/gpt-5-pro", - "name": "GPT-5 pro", - "display_name": "GPT-5 pro", + "id": "anthropic/claude-opus-4.1:thinking", + "name": "Claude 4.1 Opus Thinking", + "display_name": "Claude 4.1 Opus Thinking", "modalities": { "input": [ "text", @@ -166355,8 +159268,8 @@ ] }, "limit": { - "context": 400000, - "output": 272000 + "context": 200000, + "output": 32000 }, "temperature": true, "tool_call": true, @@ -166368,71 +159281,34 @@ "reasoning": { "supported": true, "default_enabled": true, - "mode": "fixed", - "effort": "high", - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ], - "visibility": "hidden" - } - }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-10-06", - "last_updated": "2025-10-06", - "type": "chat" - }, - { - "id": "openai/gpt-6-sol", - "name": "GPT-6 Sol", - "display_name": "GPT-6 Sol", - "modalities": { - "input": [ - "text", - "image", - "pdf" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 1050000, - "output": 128000 - }, - "temperature": false, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-04-20", - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "knowledge": "2025-03-31", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "openai/gpt-5.3-codex", - "name": "GPT 5.3 Codex", - "display_name": "GPT 5.3 Codex", + "id": "anthropic/claude-sonnet-4.6:thinking", + "name": "Claude Sonnet 4.6 Thinking", + "display_name": "Claude Sonnet 4.6 Thinking", "modalities": { "input": [ "text", @@ -166444,7 +159320,7 @@ ] }, "limit": { - "context": 400000, + "context": 1000000, "output": 128000 }, "temperature": true, @@ -166457,314 +159333,41 @@ "reasoning": { "supported": true, "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } - }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-05", - "last_updated": "2026-02-05", - "type": "chat" - }, - { - "id": "openai/gpt-4o-mini-transcribe", - "name": "GPT-4o mini Transcribe", - "display_name": "GPT-4o mini Transcribe", - "modalities": { - "input": [ - "audio" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 16000, - "output": 2000 - }, - "temperature": false, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-06-01", - "release_date": "2025-03-20", - "last_updated": "2025-03-20" - }, - { - "id": "openai/gpt-6.1-sol", - "name": "GPT-6.1 Sol", - "display_name": "GPT-6.1 Sol", - "modalities": { - "input": [ - "text", - "image", - "pdf" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 1050000, - "output": 128000 - }, - "temperature": false, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", "effort_options": [ "low", "medium", "high", - "xhigh", "max" - ] - } - }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-04-30", - "release_date": "2026-09-29", - "last_updated": "2026-09-29", - "type": "chat" - }, - { - "id": "openai/gpt-oss-safeguard-120b", - "name": "GPT OSS Safeguard 120B", - "display_name": "GPT OSS Safeguard 120B", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 128000, - "output": 16000 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high" - ] - } - }, - "attachment": false, - "open_weights": true, - "release_date": "2025-10-29", - "last_updated": "2025-10-29", - "type": "chat" - }, - { - "id": "openai/gpt-image-2", - "name": "GPT Image 2", - "display_name": "GPT Image 2", - "modalities": { - "input": [ - "text" - ], - "output": [ - "image" - ] - }, - "limit": { - "context": 8192, - "output": 8192 - }, - "temperature": false, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": false, - "release_date": "2026-04-21", - "last_updated": "2026-04-21" - }, - { - "id": "openai/gpt-5.4", - "name": "GPT 5.4", - "display_name": "GPT 5.4", - "modalities": { - "input": [ - "text", - "image", - "pdf" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 1050000, - "output": 128000 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ], - "visibility": "hidden" - } - }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-05", - "last_updated": "2026-03-05", - "type": "chat" - }, - { - "id": "openai/gpt-6-luna-fast", - "name": "GPT-6 Luna (Fast)", - "display_name": "GPT-6 Luna (Fast)", - "modalities": { - "input": [ - "text", - "image", - "pdf" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 1050000, - "output": 128000 - }, - "temperature": false, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-05-18", - "release_date": "2026-09-22", - "last_updated": "2026-09-22", - "type": "chat" - }, - { - "id": "openai/gpt-5-codex", - "name": "GPT-5-Codex", - "display_name": "GPT-5-Codex", - "modalities": { - "input": [ - "text", - "image", - "pdf" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 400000, - "output": 128000 - }, - "temperature": false, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "minimal", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } - }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-09-15", - "last_updated": "2025-09-15", + "knowledge": "2025-08-31", + "release_date": "2026-02-17", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "openai/o3-pro", - "name": "o3 Pro", - "display_name": "o3 Pro", + "id": "anthropic/claude-sonnet-5.5:thinking", + "name": "Claude Sonnet 5.5 Thinking", + "display_name": "Claude Sonnet 5.5 Thinking", "modalities": { "input": [ "text", @@ -166776,10 +159379,10 @@ ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -166789,56 +159392,78 @@ "reasoning": { "supported": true, "default_enabled": true, - "mode": "effort", - "effort": "medium", "effort_options": [ "low", "medium", - "high" - ], - "visibility": "hidden" + "high", + "xhigh", + "max" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2024-05", - "release_date": "2025-06-10", - "last_updated": "2025-06-10", + "knowledge": "2026-06", + "release_date": "2026-09-28", + "last_updated": "2026-09-28", "type": "chat" }, { - "id": "openai/gpt-live-1", - "name": "GPT-Live 1", - "display_name": "GPT-Live 1", + "id": "anthropic/claude-opus-4.1:thinking:32768", + "name": "Claude 4.1 Opus Thinking (32K)", + "display_name": "Claude 4.1 Opus Thinking (32K)", "modalities": { "input": [ "text", - "audio" + "image", + "pdf" ], "output": [ - "text", - "audio" + "text" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 200000, + "output": 32000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + ] + } }, "attachment": true, "open_weights": false, - "knowledge": "2025-07-31", - "release_date": "2026-09-10", - "last_updated": "2026-09-10" + "knowledge": "2025-03-31", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", + "type": "chat" }, { - "id": "openai/gpt-5-mini-fast", - "name": "GPT-5 mini (Fast)", - "display_name": "GPT-5 mini (Fast)", + "id": "anthropic/claude-opus-4.8:thinking", + "name": "Claude Opus 4.8 Thinking", + "display_name": "Claude Opus 4.8 Thinking", "modalities": { "input": [ "text", @@ -166850,7 +159475,7 @@ ] }, "limit": { - "context": 400000, + "context": 1000000, "output": 128000 }, "temperature": false, @@ -166861,25 +159486,41 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", "effort_options": [ - "minimal", "low", "medium", - "high" + "high", + "xhigh", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2024-05-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "knowledge": "2026-01", + "release_date": "2026-05-28", + "last_updated": "2026-05-28", "type": "chat" }, { - "id": "openai/gpt-4.1-fast", - "name": "GPT-4.1 (Fast)", - "display_name": "GPT-4.1 (Fast)", + "id": "anthropic/claude-opus-4.1:thinking:1024", + "name": "Claude 4.1 Opus Thinking (1K)", + "display_name": "Claude 4.1 Opus Thinking (1K)", "modalities": { "input": [ "text", @@ -166891,25 +159532,47 @@ ] }, "limit": { - "context": 1047576, - "output": 32768 + "context": 200000, + "output": 32000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + ] + } }, "attachment": true, "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-04-14", - "last_updated": "2025-04-14", + "knowledge": "2025-03-31", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "openai/o3-fast", - "name": "o3 (Fast)", - "display_name": "o3 (Fast)", + "id": "anthropic/claude-haiku-latest", + "name": "Claude Haiku Latest", + "display_name": "Claude Haiku Latest", "modalities": { "input": [ "text", @@ -166921,10 +159584,9 @@ ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 1000000, + "output": 128000 }, - "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -166932,29 +159594,25 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", "effort_options": [ "low", "medium", - "high" - ], - "visibility": "hidden" + "high", + "xhigh", + "max" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2024-05", - "release_date": "2025-04-16", - "last_updated": "2025-04-16", + "release_date": "2026-03-29", + "last_updated": "2026-03-29", "type": "chat" }, { - "id": "openai/gpt-6.1-sol-fast", - "name": "GPT-6.1 Sol (Fast)", - "display_name": "GPT-6.1 Sol (Fast)", + "id": "anthropic/claude-sonnet-5", + "name": "Claude Sonnet 5", + "display_name": "Claude Sonnet 5", "modalities": { "input": [ "text", @@ -166966,37 +159624,30 @@ ] }, "limit": { - "context": 1050000, + "context": 1000000, "output": 128000 }, "temperature": false, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": true }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ] + "supported": true } }, "attachment": true, "open_weights": false, - "knowledge": "2026-04-30", - "release_date": "2026-09-29", - "last_updated": "2026-09-29", + "knowledge": "2026-01-31", + "release_date": "2026-06-30", + "last_updated": "2026-06-30", "type": "chat" }, { - "id": "openai/gpt-5.1-thinking-fast", - "name": "GPT 5.1 Thinking (Fast)", - "display_name": "GPT 5.1 Thinking (Fast)", + "id": "anthropic/claude-opus-4.6:thinking:low", + "name": "Claude 4.6 Opus Thinking Low", + "display_name": "Claude 4.6 Opus Thinking Low", "modalities": { "input": [ "text", @@ -167008,45 +159659,54 @@ ] }, "limit": { - "context": 400000, + "context": 1000000, "output": 128000 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", + "default_enabled": true, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", "effort_options": [ - "none", "low", "medium", - "high" + "high", + "max" ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ], - "visibility": "hidden" + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." + ] } }, "attachment": true, "open_weights": false, - "release_date": "2025-11-12", - "last_updated": "2025-11-12", + "knowledge": "2025-05-31", + "release_date": "2026-02-05", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "openai/gpt-4.1-mini", - "name": "GPT-4.1 mini", - "display_name": "GPT-4.1 mini", + "id": "anthropic/claude-sonnet-5.5", + "name": "Claude Sonnet 5.5", + "display_name": "Claude Sonnet 5.5", "modalities": { "input": [ "text", @@ -167058,25 +159718,35 @@ ] }, "limit": { - "context": 1047576, - "output": 32768 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "high" + ] + } }, "attachment": true, "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-04-14", - "last_updated": "2025-04-14", + "knowledge": "2026-06", + "release_date": "2026-09-28", + "last_updated": "2026-09-28", "type": "chat" }, { - "id": "openai/gpt-6-astra", - "name": "GPT-6 Astra", - "display_name": "GPT-6 Astra", + "id": "anthropic/claude-fable-5.1", + "name": "Claude Fable 5.1", + "display_name": "Claude Fable 5.1", "modalities": { "input": [ "text", @@ -167088,7 +159758,7 @@ ] }, "limit": { - "context": 1050000, + "context": 1000000, "output": 128000 }, "temperature": false, @@ -167100,26 +159770,40 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", "effort_options": [ "low", "medium", "high", "xhigh", "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", + "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", + "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-04-30", - "release_date": "2026-09-04", - "last_updated": "2026-09-04", + "knowledge": "2026-06", + "release_date": "2026-09-01", + "last_updated": "2026-09-01", "type": "chat" }, { - "id": "openai/gpt-5.4-fast", - "name": "GPT 5.4 (Fast)", - "display_name": "GPT 5.4 (Fast)", + "id": "anthropic/claude-opus-4.5:thinking", + "name": "Claude 4.5 Opus Thinking", + "display_name": "Claude 4.5 Opus Thinking", "modalities": { "input": [ "text", @@ -167131,113 +159815,111 @@ ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", + "default_enabled": true, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ "low", "medium", "high" ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-05", - "last_updated": "2026-03-05", + "knowledge": "2025-05", + "release_date": "2025-11-24", + "last_updated": "2025-11-24", "type": "chat" }, { - "id": "openai/gpt-realtime-whisper", - "name": "gpt-realtime-whisper", - "display_name": "gpt-realtime-whisper", - "modalities": { - "input": [ - "audio" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 16000, - "output": 2000 - }, - "temperature": false, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": false, - "release_date": "2026-05-07", - "last_updated": "2026-05-07" - }, - { - "id": "openai/gpt-oss-120b", - "name": "GPT OSS 120B", - "display_name": "GPT OSS 120B", + "id": "anthropic/claude-opus-4.5", + "name": "Claude 4.5 Opus", + "display_name": "Claude 4.5 Opus", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 131072 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", "effort_options": [ "low", "medium", "high" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "attachment": true, + "open_weights": false, + "knowledge": "2025-05", + "release_date": "2025-11-24", + "last_updated": "2025-11-24", "type": "chat" }, { - "id": "openai/gpt-5.1-thinking", - "name": "GPT 5.1 Thinking", - "display_name": "GPT 5.1 Thinking", + "id": "anthropic/claude-opus-4.6:thinking", + "name": "Claude 4.6 Opus Thinking", + "display_name": "Claude 4.6 Opus Thinking", "modalities": { "input": [ "text", @@ -167249,47 +159931,54 @@ ] }, "limit": { - "context": 400000, + "context": 1000000, "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", + "default_enabled": true, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", "effort_options": [ - "none", "low", "medium", - "high" + "high", + "max" ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ], - "visibility": "hidden" + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2024-10", - "release_date": "2025-11-12", - "last_updated": "2025-08-07", + "knowledge": "2025-05-31", + "release_date": "2026-02-05", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "openai/gpt-5.5", - "name": "GPT 5.5", - "display_name": "GPT 5.5", + "id": "anthropic/claude-sonnet-4.5", + "name": "Claude Sonnet 4.5", + "display_name": "Claude Sonnet 4.5", "modalities": { "input": [ "text", @@ -167301,52 +159990,50 @@ ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ], - "visibility": "hidden" + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-12-01", - "release_date": "2026-04-23", - "last_updated": "2026-04-23", + "knowledge": "2025-07-31", + "release_date": "2025-09-29", + "last_updated": "2025-09-29", "type": "chat" }, { - "id": "openai/gpt-4o-mini", - "name": "GPT-4o mini", - "display_name": "GPT-4o mini", + "id": "deepseek-ai/DeepSeek-V3.1-Terminus", + "name": "DeepSeek V3.1 Terminus", + "display_name": "DeepSeek V3.1 Terminus", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" @@ -167354,39 +160041,35 @@ }, "limit": { "context": 128000, - "output": 16384 + "output": 65536 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2023-09", - "release_date": "2024-07-18", - "last_updated": "2024-07-18", + "attachment": false, + "open_weights": true, + "release_date": "2025-08-02", + "last_updated": "2025-08-02", "type": "chat" }, { - "id": "openai/gpt-5-mini", - "name": "GPT-5 Mini", - "display_name": "GPT-5 Mini", + "id": "deepseek-ai/DeepSeek-R1-0528", + "name": "DeepSeek R1 0528", + "display_name": "DeepSeek R1 0528", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 163840, + "output": 32768 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -167395,35 +160078,24 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "minimal", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-05-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "attachment": false, + "open_weights": true, + "release_date": "2025-05-28", + "last_updated": "2025-05-28", "type": "chat" }, { - "id": "openai/gpt-oss-20b", - "name": "GPT OSS 20B", - "display_name": "GPT OSS 20B", + "id": "deepseek-ai/DeepSeek-V3.1:thinking", + "name": "DeepSeek V3.1 Thinking", + "display_name": "DeepSeek V3.1 Thinking", "modalities": { "input": [ "text" @@ -167433,67 +160105,80 @@ ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 128000, + "output": 65536 }, "temperature": true, "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "release_date": "2025-08-21", + "last_updated": "2025-08-21", + "type": "chat" + }, + { + "id": "deepseek-ai/deepseek-v3.2-exp-thinking", + "name": "DeepSeek V3.2 Exp Thinking", + "display_name": "DeepSeek V3.2 Exp Thinking", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 163840, + "output": 65536 + }, + "tool_call": false, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "low", - "medium", - "high" - ] - } - }, "attachment": false, "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "release_date": "2024-01-01", + "last_updated": "2025-09-29", "type": "chat" }, { - "id": "openai/gpt-4o-transcribe", - "name": "GPT-4o Transcribe", - "display_name": "GPT-4o Transcribe", + "id": "deepseek-ai/deepseek-v3.2-exp", + "name": "DeepSeek V3.2 Exp", + "display_name": "DeepSeek V3.2 Exp", "modalities": { "input": [ - "audio" + "text" ], "output": [ "text" ] }, "limit": { - "context": 16000, - "output": 2000 + "context": 163840, + "output": 65536 }, - "temperature": false, "tool_call": false, "reasoning": { "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-06-01", - "release_date": "2025-03-20", - "last_updated": "2025-03-20" + "attachment": false, + "open_weights": true, + "release_date": "2024-01-01", + "last_updated": "2025-09-29", + "type": "chat" }, { - "id": "openai/gpt-5", - "name": "GPT-5", - "display_name": "GPT-5", + "id": "deepseek-ai/DeepSeek-V3.1", + "name": "DeepSeek V3.1", + "display_name": "DeepSeek V3.1", "modalities": { "input": [ "text", - "image", "pdf" ], "output": [ @@ -167501,94 +160186,53 @@ ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 128000, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "minimal", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "open_weights": true, + "release_date": "2025-08-21", + "last_updated": "2025-08-21", "type": "chat" }, { - "id": "openai/gpt-6-luna", - "name": "GPT-6 Luna", - "display_name": "GPT-6 Luna", + "id": "deepseek-ai/DeepSeek-V3.1-Terminus:thinking", + "name": "DeepSeek V3.1 Terminus (Thinking)", + "display_name": "DeepSeek V3.1 Terminus (Thinking)", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 128000, + "output": 65536 }, - "temperature": false, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ] - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-05-18", - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "attachment": false, + "open_weights": true, + "release_date": "2024-01-01", + "last_updated": "2025-09-22", "type": "chat" }, { - "id": "openai/gpt-4.1", - "name": "GPT-4.1", - "display_name": "GPT-4.1", + "id": "undi95/remm-slerp-l2-13b", + "name": "ReMM SLERP 13B", + "display_name": "ReMM SLERP 13B", "modalities": { "input": [ "text", - "image", "pdf" ], "output": [ @@ -167596,152 +160240,106 @@ ] }, "limit": { - "context": 1047576, - "output": 32768 + "context": 6144, + "output": 4096 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-04-14", - "last_updated": "2025-04-14", + "open_weights": true, + "knowledge": "2023-06-30", + "release_date": "2023-07-22", + "last_updated": "2023-07-22", "type": "chat" }, { - "id": "openai/whisper-1", - "name": "Whisper", - "display_name": "Whisper", + "id": "TheDrummer/Anubis-70B-v1.1", + "name": "Anubis 70B v1.1", + "display_name": "Anubis 70B v1.1", "modalities": { "input": [ - "audio" + "text" ], "output": [ "text" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 32000, + "output": 16384 }, - "temperature": false, "tool_call": false, "reasoning": { "supported": false }, - "attachment": true, - "open_weights": false, - "release_date": "2023-03-01", - "last_updated": "2023-03-01" + "attachment": false, + "open_weights": true, + "release_date": "2024-01-01", + "last_updated": "2024-01-01", + "type": "chat" }, { - "id": "openai/gpt-5.1-codex-mini", - "name": "GPT-5.1 Codex mini", - "display_name": "GPT-5.1 Codex mini", + "id": "TheDrummer/Magidonia-24B-v4.3", + "name": "The Drummer Magidonia 24B v4.3", + "display_name": "The Drummer Magidonia 24B v4.3", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 32768, + "output": 32768 }, - "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-11-13", - "last_updated": "2025-11-13", + "attachment": false, + "open_weights": true, + "release_date": "2025-12-25", + "last_updated": "2025-12-25", "type": "chat" }, { - "id": "openai/o1", - "name": "o1", - "display_name": "o1", + "id": "TheDrummer/Cydonia-24B-v4", + "name": "The Drummer Cydonia 24B v4", + "display_name": "The Drummer Cydonia 24B v4", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 32768, + "output": 32768 }, - "temperature": false, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2023-09", - "release_date": "2024-12-05", - "last_updated": "2024-12-05", + "attachment": false, + "open_weights": true, + "release_date": "2025-07-22", + "last_updated": "2025-07-22", "type": "chat" }, { - "id": "openai/gpt-6-sol-fast", - "name": "GPT-6 Sol (Fast)", - "display_name": "GPT-6 Sol (Fast)", + "id": "TheDrummer/skyfall-36b-v2", + "name": "TheDrummer Skyfall 36B V2", + "display_name": "TheDrummer Skyfall 36B V2", "modalities": { "input": [ "text", - "image", "pdf" ], "output": [ @@ -167749,143 +160347,134 @@ ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 32768, + "output": 29491 }, - "temperature": false, - "tool_call": true, + "temperature": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ] - } + "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2026-04-20", - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "open_weights": true, + "knowledge": "2024-06-30", + "release_date": "2025-03-10", + "last_updated": "2025-03-10", "type": "chat" }, { - "id": "openai/gpt-5.6-sol-fast", - "name": "GPT 5.6 Sol (Fast)", - "display_name": "GPT 5.6 Sol (Fast)", + "id": "TheDrummer/Anubis-70B-v1", + "name": "Anubis 70B v1", + "display_name": "Anubis 70B v1", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 65536, + "output": 16384 }, - "temperature": false, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "minimal", - "low", - "medium", - "high", - "xhigh", - "max" - ] - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "attachment": false, + "open_weights": true, + "release_date": "2024-01-01", + "last_updated": "2024-01-01", "type": "chat" }, { - "id": "openai/gpt-4.1-nano", - "name": "GPT-4.1 nano", - "display_name": "GPT-4.1 nano", + "id": "TheDrummer/Cydonia-24B-v4.3", + "name": "The Drummer Cydonia 24B v4.3", + "display_name": "The Drummer Cydonia 24B v4.3", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1047576, + "context": 131072, "output": 32768 }, - "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-04-14", - "last_updated": "2025-04-14", + "attachment": false, + "open_weights": true, + "release_date": "2025-12-25", + "last_updated": "2025-12-25", "type": "chat" }, { - "id": "openai/tts-1", - "name": "TTS-1", - "display_name": "TTS-1", + "id": "TheDrummer/Cydonia-24B-v2", + "name": "The Drummer Cydonia 24B v2", + "display_name": "The Drummer Cydonia 24B v2", "modalities": { "input": [ "text" ], "output": [ - "audio" + "text" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 32768, + "output": 32768 }, - "temperature": false, "tool_call": false, "reasoning": { "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2023-11-06", - "last_updated": "2023-11-06", - "type": "tts" + "open_weights": true, + "release_date": "2025-02-17", + "last_updated": "2025-02-17", + "type": "chat" + }, + { + "id": "TheDrummer/Artemis-v1.1", + "name": "TheDrummer/Artemis v1.1", + "display_name": "TheDrummer/Artemis v1.1", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 262144, + "output": 32768 + }, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "attachment": true, + "open_weights": true, + "release_date": "2026-09-06", + "last_updated": "2026-09-06", + "type": "chat" }, { - "id": "openai/o4-mini", - "name": "o4-mini", - "display_name": "o4-mini", + "id": "TheDrummer/UnslopNemo-12B-v4.1", + "name": "UnslopNemo 12b v4", + "display_name": "UnslopNemo 12b v4", "modalities": { "input": [ "text", - "image", "pdf" ], "output": [ @@ -167893,40 +160482,23 @@ ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 8192, + "output": 26214 }, - "temperature": false, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2024-05", - "release_date": "2025-04-16", - "last_updated": "2025-04-16", + "open_weights": true, + "release_date": "2024-01-01", + "last_updated": "2024-01-01", "type": "chat" }, { - "id": "openai/text-embedding-3-small", - "name": "text-embedding-3-small", - "display_name": "text-embedding-3-small", + "id": "TheDrummer/Cydonia-24B-v4.1", + "name": "The Drummer Cydonia 24B v4.1", + "display_name": "The Drummer Cydonia 24B v4.1", "modalities": { "input": [ "text" @@ -167936,89 +160508,63 @@ ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 131072, + "output": 117964 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2024-01-25", - "last_updated": "2024-01-25", - "type": "embedding" + "open_weights": true, + "knowledge": "2024-04-30", + "release_date": "2025-09-27", + "last_updated": "2025-09-27", + "type": "chat" }, { - "id": "openai/gpt-5.1-codex", - "name": "GPT-5.1-Codex", - "display_name": "GPT-5.1-Codex", + "id": "TheDrummer/Rocinante-12B-v1.1", + "name": "Rocinante 12b", + "display_name": "Rocinante 12b", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 16384, + "output": 8192 }, - "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-11-13", - "last_updated": "2025-11-13", + "attachment": false, + "open_weights": true, + "release_date": "2024-01-01", + "last_updated": "2024-01-01", "type": "chat" }, { - "id": "openai/gpt-5.4-pro", - "name": "GPT 5.4 Pro", - "display_name": "GPT 5.4 Pro", + "id": "minimax/minimax-m3:thinking", + "name": "MiniMax M3 Thinking", + "display_name": "MiniMax M3 Thinking", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 512000, + "output": 80000 }, "temperature": true, "tool_call": true, @@ -168026,52 +160572,29 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } - }, "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-05", - "last_updated": "2026-03-05", + "open_weights": true, + "release_date": "2026-06-01", + "last_updated": "2026-06-01", "type": "chat" }, { - "id": "openai/gpt-6-astra-fast", - "name": "GPT-6 Astra (Fast)", - "display_name": "GPT-6 Astra (Fast)", + "id": "minimax/minimax-m2.7", + "name": "MiniMax M2.7", + "display_name": "MiniMax M2.7", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 204800, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -168079,170 +160602,180 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, - "attachment": true, - "open_weights": false, - "release_date": "2026-09-04", - "last_updated": "2026-09-04", + "attachment": false, + "open_weights": true, + "release_date": "2026-03-18", + "last_updated": "2026-03-18", "type": "chat" }, { - "id": "openai/gpt-image-1.5", - "name": "GPT Image 1.5", - "display_name": "GPT Image 1.5", + "id": "minimax/minimax-m2-her", + "name": "MiniMax M2-her", + "display_name": "MiniMax M2-her", "modalities": { "input": [ "text" ], "output": [ - "image" + "text" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 65532, + "output": 2048 }, - "temperature": false, + "temperature": true, "tool_call": false, "reasoning": { "supported": false }, "attachment": false, "open_weights": false, - "release_date": "2025-11-25", - "last_updated": "2025-11-25" + "release_date": "2026-01-23", + "last_updated": "2026-01-23", + "type": "chat" }, { - "id": "mistral/voxtral-mini-transcribe-3", - "name": "Voxtral Mini Transcribe 3", - "display_name": "Voxtral Mini Transcribe 3", + "id": "minimax/minimax-01", + "name": "MiniMax 01", + "display_name": "MiniMax 01", "modalities": { "input": [ - "audio" + "text", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 1000192, + "output": 16384 }, - "temperature": false, "tool_call": false, "reasoning": { "supported": false }, "attachment": true, "open_weights": false, - "release_date": "2026-10-20", - "last_updated": "2026-10-20" + "release_date": "2024-01-01", + "last_updated": "2025-01-15", + "type": "chat" }, { - "id": "mistral/mistral-large-4", - "name": "Mistral Large 4", - "display_name": "Mistral Large 4", + "id": "minimax/minimax-m2.7-turbo", + "name": "MiniMax M2.7 Turbo", + "display_name": "MiniMax M2.7 Turbo", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 524288, - "output": 262144 + "context": 204800, + "output": 131072 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "high" - ] - } - }, - "attachment": true, - "open_weights": false, - "release_date": "2026-10-06", - "last_updated": "2026-10-06", + "attachment": false, + "open_weights": true, + "release_date": "2026-03-18", + "last_updated": "2026-03-18", "type": "chat" }, { - "id": "mistral/ministral-14b", - "name": "Ministral 14B", - "display_name": "Ministral 14B", + "id": "minimax/minimax-m3", + "name": "MiniMax M3", + "display_name": "MiniMax M3", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 256000 + "context": 512000, + "output": 80000 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": true, "open_weights": true, - "release_date": "2025-12-02", - "last_updated": "2025-12-02", + "release_date": "2026-06-01", + "last_updated": "2026-06-01", "type": "chat" }, { - "id": "mistral/mistral-embed", - "name": "Mistral Embed", - "display_name": "Mistral Embed", + "id": "minimax/minimax-m3.1-flash", + "name": "MiniMax M3.1 Flash", + "display_name": "MiniMax M3.1 Flash", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 8000, - "output": 3072 + "context": 1048576, + "output": 524288 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + }, + "attachment": true, "open_weights": false, - "release_date": "2023-12-11", - "last_updated": "2023-12-11", - "type": "embedding" + "release_date": "2026-10-19", + "last_updated": "2026-10-19", + "type": "chat" }, { - "id": "mistral/codestral-embed", - "name": "Codestral Embed", - "display_name": "Codestral Embed", + "id": "minimax/minimax-m2.5", + "name": "MiniMax M2.5", + "display_name": "MiniMax M2.5", "modalities": { "input": [ "text" @@ -168252,24 +160785,30 @@ ] }, "limit": { - "context": 8192, - "output": 3072 + "context": 204800, + "output": 131072 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": false, - "open_weights": false, - "release_date": "2025-05-28", - "last_updated": "2025-05-28", - "type": "embedding" + "open_weights": true, + "release_date": "2026-02-12", + "last_updated": "2026-02-12", + "type": "chat" }, { - "id": "mistral/ministral-3b", - "name": "Ministral 3B (latest)", - "display_name": "Ministral 3B (latest)", + "id": "minimax/minimax-latest", + "name": "MiniMax Latest", + "display_name": "MiniMax Latest", "modalities": { "input": [ "text", @@ -168280,80 +160819,85 @@ ] }, "limit": { - "context": 131072, - "output": 4000 + "context": 512000, + "output": 80000 }, - "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": true, "open_weights": true, - "knowledge": "2024-10", - "release_date": "2024-10-16", - "last_updated": "2024-10-04", + "release_date": "2026-05-03", + "last_updated": "2026-05-03", "type": "chat" }, { - "id": "mistral/mistral-large-3", - "name": "Mistral Large 3", - "display_name": "Mistral Large 3", + "id": "minimax/minimax-m2.1", + "name": "MiniMax M2.1", + "display_name": "MiniMax M2.1", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 256000 + "context": 200000, + "output": 131072 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": false, "open_weights": true, - "knowledge": "2024-11", - "release_date": "2025-12-02", - "last_updated": "2025-12-02", + "release_date": "2025-12-23", + "last_updated": "2025-12-23", "type": "chat" }, { - "id": "mistral/voxtral-mini-tts-3", - "name": "Voxtral TTS 3", - "display_name": "Voxtral TTS 3", + "id": "minimax/minimax-m2", + "name": "MiniMax M2", + "display_name": "MiniMax M2", "modalities": { "input": [ "text" ], "output": [ - "audio" + "text" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 200000, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": false, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": false, - "open_weights": false, - "release_date": "2026-10-20", - "last_updated": "2026-10-20" + "open_weights": true, + "release_date": "2025-10-27", + "last_updated": "2025-10-27", + "type": "chat" }, { - "id": "mistral/mistral-nemo", - "name": "Mistral Nemo", - "display_name": "Mistral Nemo", + "id": "upstage/solar-pro4", + "name": "Solar Pro 4", + "display_name": "Solar Pro 4", "modalities": { "input": [ "text" @@ -168363,7 +160907,7 @@ ] }, "limit": { - "context": 131072, + "context": 524288, "output": 131072 }, "temperature": true, @@ -168372,16 +160916,16 @@ "supported": false }, "attachment": false, - "open_weights": true, - "knowledge": "2024-07", - "release_date": "2024-07-18", - "last_updated": "2024-07-18", + "open_weights": false, + "knowledge": "2026-02", + "release_date": "2026-08-06", + "last_updated": "2026-08-06", "type": "chat" }, { - "id": "mistral/codestral", - "name": "Codestral (latest)", - "display_name": "Codestral (latest)", + "id": "upstage/solar-pro4:thinking", + "name": "Solar Pro 4 Thinking", + "display_name": "Solar Pro 4 Thinking", "modalities": { "input": [ "text" @@ -168391,37 +160935,47 @@ ] }, "limit": { - "context": 128000, - "output": 4000 + "context": 524288, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "low", + "medium", + "high" + ] + } }, "attachment": false, - "open_weights": true, - "knowledge": "2024-10", - "release_date": "2024-05-29", - "last_updated": "2025-01-04", + "open_weights": false, + "knowledge": "2026-02", + "release_date": "2026-08-06", + "last_updated": "2026-08-06", "type": "chat" }, { - "id": "mistral/mistral-medium-3.5", - "name": "Mistral Medium Latest", - "display_name": "Mistral Medium Latest", + "id": "upstage/solar-mini4:thinking", + "name": "Solar Mini 4 Thinking", + "display_name": "Solar Mini 4 Thinking", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 256000 + "context": 524288, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -168433,104 +160987,107 @@ "reasoning": { "effort_options": [ "none", + "low", + "medium", "high" ] } }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2026-04-30", - "last_updated": "2026-04-30", + "knowledge": "2026-02", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "mistral/mistral-small", - "name": "Mistral Small (latest)", - "display_name": "Mistral Small (latest)", + "id": "upstage/solar-mini4", + "name": "Solar Mini 4", + "display_name": "Solar Mini 4", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 4000 + "context": 524288, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": true, - "open_weights": true, - "knowledge": "2025-06", - "release_date": "2026-03-16", - "last_updated": "2026-03-16", + "attachment": false, + "open_weights": false, + "knowledge": "2026-02", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "mistral/voxtral-small-transcribe-3", - "name": "Voxtral Small Transcribe 3", - "display_name": "Voxtral Small Transcribe 3", + "id": "upstage/solar-pro-3", + "name": "Solar Pro 3", + "display_name": "Solar Pro 3", "modalities": { "input": [ - "audio" + "text" ], "output": [ "text" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 131072, + "output": 117964 }, - "temperature": false, + "temperature": true, "tool_call": false, "reasoning": { "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2026-10-20", - "last_updated": "2026-10-20" + "knowledge": "2025-07", + "release_date": "2026-01-26", + "last_updated": "2026-03-23", + "type": "chat" }, { - "id": "mistral/ministral-8b", - "name": "Ministral 8B (latest)", - "display_name": "Ministral 8B (latest)", + "id": "cohere/command-r-plus-08-2024", + "name": "Cohere: Command R+", + "display_name": "Cohere: Command R+", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 4000 + "context": 128000, + "output": 4096 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2024-10", - "release_date": "2024-10-16", - "last_updated": "2024-10-04", + "knowledge": "2024-06-01", + "release_date": "2024-08-30", + "last_updated": "2024-08-30", "type": "chat" }, { - "id": "voyage/voyage-law-2", - "name": "voyage-law-2", - "display_name": "voyage-law-2", + "id": "aisingapore/qwen-sea-lion-v4-32b-it", + "name": "Qwen SEA-LION v4 32B", + "display_name": "Qwen SEA-LION v4 32B", "modalities": { "input": [ "text" @@ -168540,24 +161097,23 @@ ] }, "limit": { - "context": 16000, - "output": 8192 + "context": 131072, + "output": 131072 }, - "temperature": false, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2024-04-15", - "last_updated": "2024-03", - "type": "embedding" + "open_weights": true, + "release_date": "2026-10-15", + "last_updated": "2026-10-15", + "type": "chat" }, { - "id": "voyage/voyage-code-3", - "name": "voyage-code-3", - "display_name": "voyage-code-3", + "id": "aisingapore/gemma-sea-lion-v4-27b-it", + "name": "Gemma SEA-LION v4 27B", + "display_name": "Gemma SEA-LION v4 27B", "modalities": { "input": [ "text" @@ -168567,24 +161123,24 @@ ] }, "limit": { - "context": 32000, - "output": 8192 + "context": 131072, + "output": 128000 }, - "temperature": false, + "temperature": true, "tool_call": false, "reasoning": { "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2024-12-04", - "last_updated": "2024-09", - "type": "embedding" + "open_weights": true, + "release_date": "2025-09-23", + "last_updated": "2025-09-23", + "type": "chat" }, { - "id": "voyage/rerank-3-lite", - "name": "Voyage Rerank 3 Lite", - "display_name": "Voyage Rerank 3 Lite", + "id": "prism-ml/ternary-bonsai-2-9b", + "name": "Ternary Bonsai2 9B", + "display_name": "Ternary Bonsai2 9B", "modalities": { "input": [ "text" @@ -168594,80 +161150,91 @@ ] }, "limit": { - "context": 32000, - "output": 8192 + "context": 262144, + "output": 65536 }, - "temperature": false, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": false, - "open_weights": false, - "release_date": "2026-09-30", - "last_updated": "2026-09-30" + "open_weights": true, + "release_date": "2026-10-23", + "last_updated": "2026-10-23", + "type": "chat" }, { - "id": "voyage/voyage-3.5-lite", - "name": "voyage-3.5-lite", - "display_name": "voyage-3.5-lite", + "id": "prism-ml/ternary-bonsai-2-27b", + "name": "Ternary Bonsai 2 27B", + "display_name": "Ternary Bonsai 2 27B", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 32000, - "output": 8192 + "context": 262144, + "output": 32768 }, - "temperature": false, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": false, - "release_date": "2025-05-20", - "last_updated": "2025-05-20", - "type": "embedding" + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "medium", + "xhigh" + ] + } + }, + "attachment": true, + "open_weights": true, + "release_date": "2026-09-18", + "last_updated": "2026-09-18", + "type": "chat" }, { - "id": "voyage/voyage-4", - "name": "voyage-4", - "display_name": "voyage-4", + "id": "lightonai/LightOnOCR-2-1B", + "name": "LightOnOCR 2", + "display_name": "LightOnOCR 2", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 32000, + "context": 32768, "output": 8192 }, - "temperature": false, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, - "open_weights": false, - "release_date": "2026-01-15", - "last_updated": "2026-01-15", - "type": "embedding" + "attachment": true, + "open_weights": true, + "release_date": "2026-09-10", + "last_updated": "2026-09-10", + "type": "chat" }, { - "id": "voyage/voyage-4-lite", - "name": "voyage-4-lite", - "display_name": "voyage-4-lite", + "id": "moondream/moondream3-preview", + "name": "Moondream 3 Preview", + "display_name": "Moondream 3 Preview", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" @@ -168675,26 +161242,27 @@ }, "limit": { "context": 32000, - "output": 8192 + "output": 4096 }, - "temperature": false, "tool_call": false, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-01-15", - "last_updated": "2026-01-15", - "type": "embedding" + "release_date": "2026-10-16", + "last_updated": "2026-10-16", + "type": "chat" }, { - "id": "voyage/voyage-finance-2", - "name": "voyage-finance-2", - "display_name": "voyage-finance-2", + "id": "moondream/moondream3.1-9b-a2b", + "name": "Moondream 3.1 9B A2B", + "display_name": "Moondream 3.1 9B A2B", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" @@ -168702,23 +161270,23 @@ }, "limit": { "context": 32000, - "output": 8192 + "output": 4096 }, - "temperature": false, "tool_call": false, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2024-06-03", - "last_updated": "2024-03", - "type": "embedding" + "release_date": "2026-10-16", + "last_updated": "2026-10-16", + "type": "chat" }, { - "id": "voyage/voyage-3-large", - "name": "voyage-3-large", - "display_name": "voyage-3-large", + "id": "VongolaChouko/Starcannon-Unleashed-12B-v1.0", + "name": "Mistral Nemo Starcannon 12b v1", + "display_name": "Mistral Nemo Starcannon 12b v1", "modalities": { "input": [ "text" @@ -168728,24 +161296,23 @@ ] }, "limit": { - "context": 32000, + "context": 16384, "output": 8192 }, - "temperature": false, "tool_call": false, "reasoning": { "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2025-01-07", - "last_updated": "2024-09", - "type": "embedding" + "open_weights": true, + "release_date": "2024-01-01", + "last_updated": "2024-07-01", + "type": "chat" }, { - "id": "voyage/rerank-2.5-lite", - "name": "Voyage Rerank 2.5 Lite", - "display_name": "Voyage Rerank 2.5 Lite", + "id": "mistralai/mistral-small-24b-instruct-2501", + "name": "Mistral Small 24B", + "display_name": "Mistral Small 24B", "modalities": { "input": [ "text" @@ -168755,23 +161322,25 @@ ] }, "limit": { - "context": 32000, + "context": 32768, "output": 8192 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2025-08-11", - "last_updated": "2025-08-11" + "open_weights": true, + "knowledge": "2023-10-31", + "release_date": "2025-01-30", + "last_updated": "2025-01-30", + "type": "chat" }, { - "id": "voyage/voyage-code-2", - "name": "voyage-code-2", - "display_name": "voyage-code-2", + "id": "mistralai/mixtral-8x22b-instruct-v0.1", + "name": "Mixtral 8x22B", + "display_name": "Mixtral 8x22B", "modalities": { "input": [ "text" @@ -168781,77 +161350,97 @@ ] }, "limit": { - "context": 16000, - "output": 8192 + "context": 65536, + "output": 52428 }, - "temperature": false, + "temperature": true, "tool_call": false, "reasoning": { "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2024-01-01", - "last_updated": "2024-01", - "type": "embedding" + "open_weights": true, + "knowledge": "2024-01-31", + "release_date": "2024-04-17", + "last_updated": "2024-04-17", + "type": "chat" }, { - "id": "voyage/voyage-3.5", - "name": "voyage-3.5", - "display_name": "voyage-3.5", + "id": "mistralai/mistral-medium-3.5", + "name": "Mistral Medium 3.5", + "display_name": "Mistral Medium 3.5", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 32000, - "output": 8192 + "context": 256000, + "output": 32768 }, - "temperature": false, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": false, - "release_date": "2025-05-20", - "last_updated": "2025-05-20", - "type": "embedding" + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "high" + ] + } + }, + "attachment": true, + "open_weights": true, + "release_date": "2026-04-29", + "last_updated": "2026-04-29", + "type": "chat" }, { - "id": "voyage/rerank-3", - "name": "Voyage Rerank 3", - "display_name": "Voyage Rerank 3", + "id": "mistralai/mistral-medium-3.5:thinking", + "name": "Mistral Medium 3.5 Thinking", + "display_name": "Mistral Medium 3.5 Thinking", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 32000, - "output": 8192 + "context": 256000, + "output": 32768 }, - "temperature": false, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": false, - "release_date": "2026-09-30", - "last_updated": "2026-09-30" + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "high" + ] + } + }, + "attachment": true, + "open_weights": true, + "release_date": "2026-04-30", + "last_updated": "2026-04-30", + "type": "chat" }, { - "id": "voyage/rerank-2.5", - "name": "Voyage Rerank 2.5", - "display_name": "Voyage Rerank 2.5", + "id": "mistralai/devstral-2-123b-instruct-2512", + "name": "Devstral 2 123B", + "display_name": "Devstral 2 123B", "modalities": { "input": [ "text" @@ -168861,23 +161450,25 @@ ] }, "limit": { - "context": 32000, - "output": 8192 + "context": 262144, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": false, "reasoning": { "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2025-08-11", - "last_updated": "2025-08-11" + "open_weights": true, + "knowledge": "2025-12", + "release_date": "2025-12-09", + "last_updated": "2025-12-09", + "type": "chat" }, { - "id": "voyage/voyage-4-large", - "name": "voyage-4-large", - "display_name": "voyage-4-large", + "id": "mistralai/ministral-3b-2512", + "name": "Ministral 3B", + "display_name": "Ministral 3B", "modalities": { "input": [ "text" @@ -168887,50 +161478,83 @@ ] }, "limit": { - "context": 32000, - "output": 8192 + "context": 131072, + "output": 32768 }, - "temperature": false, + "temperature": true, "tool_call": false, "reasoning": { "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2026-01-15", - "last_updated": "2026-01-15", - "type": "embedding" + "open_weights": true, + "release_date": "2025-12-02", + "last_updated": "2025-12-02", + "type": "chat" }, { - "id": "tencent/hy-mt2-pro", - "name": "Tencent Hy-MT2-Pro", - "display_name": "Tencent Hy-MT2-Pro", + "id": "mistralai/mistral-small-4-119b-2603", + "name": "Mistral Small 4 119B", + "display_name": "Mistral Small 4 119B", "modalities": { "input": [ + "text", + "image" + ], + "output": [ "text" + ] + }, + "limit": { + "context": 262144, + "output": 16384 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "attachment": true, + "open_weights": true, + "knowledge": "2025-06", + "release_date": "2026-03-16", + "last_updated": "2026-03-16", + "type": "chat" + }, + { + "id": "mistralai/mistral-medium-3", + "name": "Mistral Medium 3", + "display_name": "Mistral Medium 3", + "modalities": { + "input": [ + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 8000, - "output": 4000 + "context": 131072, + "output": 32768 }, + "temperature": true, "tool_call": false, "reasoning": { "supported": false }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-05-21", - "last_updated": "2026-05-21", + "knowledge": "2025-03-31", + "release_date": "2025-05-07", + "last_updated": "2025-05-07", "type": "chat" }, { - "id": "tencent/hy3", - "name": "Hy3", - "display_name": "Hy3", + "id": "mistralai/ministral-14b-2512", + "name": "Ministral 14B", + "display_name": "Ministral 14B", "modalities": { "input": [ "text" @@ -168941,45 +161565,35 @@ }, "limit": { "context": 262144, - "output": 262144 + "output": 32768 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "none", - "low", - "high" - ] - } + "supported": false }, "attachment": false, "open_weights": true, - "release_date": "2026-07-06", - "last_updated": "2026-07-06", + "release_date": "2025-12-02", + "last_updated": "2025-12-02", "type": "chat" }, { - "id": "tencent/hy4-preview", - "name": "Tencent Hy4 Preview", - "display_name": "Tencent Hy4 Preview", + "id": "mistralai/mistral-large-4", + "name": "Mistral Large 4", + "display_name": "Mistral Large 4", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1024000, - "output": 64000 + "context": 524288, + "output": 262144 }, "temperature": true, "tool_call": true, @@ -168989,49 +161603,50 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ "none", "high" ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-08-28", - "last_updated": "2026-08-28", + "attachment": true, + "open_weights": false, + "release_date": "2026-10-06", + "last_updated": "2026-10-06", "type": "chat" }, { - "id": "tencent/hy-mt2-lite", - "name": "Tencent Hy-MT2-Lite", - "display_name": "Tencent Hy-MT2-Lite", + "id": "mistralai/ministral-14b-instruct-2512", + "name": "Ministral 3 14B", + "display_name": "Ministral 3 14B", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 8000, - "output": 4000 + "context": 262144, + "output": 32768 }, + "temperature": true, "tool_call": false, "reasoning": { "supported": false - }, - "attachment": false, - "open_weights": false, - "release_date": "2026-06-12", - "last_updated": "2026-06-12", + }, + "attachment": true, + "open_weights": true, + "release_date": "2025-12-02", + "last_updated": "2025-12-02", "type": "chat" }, { - "id": "tencent/hy-mt2-plus", - "name": "Tencent Hy-MT2-Plus", - "display_name": "Tencent Hy-MT2-Plus", + "id": "mistralai/mistral-medium-3.1", + "name": "Mistral Medium 3.1", + "display_name": "Mistral Medium 3.1", "modalities": { "input": [ "text" @@ -169041,23 +161656,25 @@ ] }, "limit": { - "context": 8000, - "output": 4000 + "context": 131072, + "output": 32768 }, + "temperature": true, "tool_call": false, "reasoning": { "supported": false }, "attachment": false, "open_weights": false, - "release_date": "2026-06-12", - "last_updated": "2026-06-12", + "knowledge": "2025-06-30", + "release_date": "2025-08-12", + "last_updated": "2025-08-12", "type": "chat" }, { - "id": "mixedbread/toast-1", - "name": "Toast 1", - "display_name": "Toast 1", + "id": "mistralai/devstral-small-2505", + "name": "Mistral Devstral Small 2505", + "display_name": "Mistral Devstral Small 2505", "modalities": { "input": [ "text" @@ -169067,24 +161684,23 @@ ] }, "limit": { - "context": 131000, - "output": 4000 + "context": 32768, + "output": 8192 }, - "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2026-08-13", - "last_updated": "2026-08-13", + "open_weights": true, + "release_date": "2025-08-02", + "last_updated": "2025-08-02", "type": "chat" }, { - "id": "inference-net/schematron-v2-small", - "name": "Schematron V2 Small", - "display_name": "Schematron V2 Small", + "id": "mistralai/mistral-nemo-instruct-2407", + "name": "Mistral Nemo", + "display_name": "Mistral Nemo", "modalities": { "input": [ "text" @@ -169094,8 +161710,8 @@ ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 16384, + "output": 8192 }, "temperature": true, "tool_call": false, @@ -169103,15 +161719,16 @@ "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2026-04-16", - "last_updated": "2026-04-16", + "open_weights": true, + "knowledge": "2024-07", + "release_date": "2024-07-18", + "last_updated": "2024-07-18", "type": "chat" }, { - "id": "inference-net/schematron-v2-turbo", - "name": "Schematron V2 Turbo", - "display_name": "Schematron V2 Turbo", + "id": "mistralai/mistral-small-3.2-24b-instruct", + "name": "Mistral Small 3.2 24B (2506)", + "display_name": "Mistral Small 3.2 24B (2506)", "modalities": { "input": [ "text" @@ -169122,7 +161739,7 @@ }, "limit": { "context": 128000, - "output": 8192 + "output": 16384 }, "temperature": true, "tool_call": false, @@ -169130,59 +161747,57 @@ "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2026-04-16", - "last_updated": "2026-04-16", + "open_weights": true, + "knowledge": "2023-10-31", + "release_date": "2025-06-20", + "last_updated": "2025-06-20", "type": "chat" }, { - "id": "poolside/laguna-s-2.1", - "name": "Laguna S 2.1", - "display_name": "Laguna S 2.1", + "id": "mistralai/mistral-small-3.1-24b-instruct", + "name": "Mistral Small 3.1 24B (2503)", + "display_name": "Mistral Small 3.1 24B (2503)", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 128000, + "output": 102400 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-07-21", - "last_updated": "2026-07-21", + "knowledge": "2023-10-31", + "release_date": "2025-03-17", + "last_updated": "2025-03-17", "type": "chat" }, { - "id": "poolside/laguna-s-2.1-free", - "name": "Laguna S 2.1 Free", - "display_name": "Laguna S 2.1 Free", + "id": "mistralai/mistral-small-4-119b-2603:thinking", + "name": "Mistral Small 4 119B Thinking", + "display_name": "Mistral Small 4 119B Thinking", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 32768 + "context": 262144, + "output": 16384 }, "temperature": true, "tool_call": true, @@ -169192,74 +161807,79 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "effort_options": [ + "none", + "high" + ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-07-21", - "last_updated": "2026-07-21", + "knowledge": "2025-06", + "release_date": "2026-03-16", + "last_updated": "2026-03-16", "type": "chat" }, { - "id": "prodia/flux-fast-schnell", - "name": "Flux Schnell", - "display_name": "Flux Schnell", + "id": "mistralai/mistral-saba", + "name": "Mistral Saba", + "display_name": "Mistral Saba", "modalities": { "input": [ "text" ], "output": [ - "image" + "text" ] }, "limit": { - "context": 512, - "output": 8192 + "context": 32768, + "output": 26214 }, - "temperature": false, + "temperature": true, "tool_call": false, "reasoning": { "supported": false }, "attachment": false, "open_weights": false, - "release_date": "2024-08-02", - "last_updated": "2026-06-08" + "knowledge": "2024-09-30", + "release_date": "2025-02-17", + "last_updated": "2025-02-17", + "type": "chat" }, { - "id": "heygen/heygen-video-1", - "name": "HeyGen Video", - "display_name": "HeyGen Video", + "id": "mistralai/mistral-large", + "name": "Mistral Large 2411", + "display_name": "Mistral Large 2411", "modalities": { "input": [ - "text", - "image", - "video", - "audio" + "text" ], "output": [ - "video" + "text" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 128000, + "output": 102400 }, - "temperature": false, + "temperature": true, "tool_call": false, "reasoning": { "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2026-10-09", - "last_updated": "2026-10-09" + "knowledge": "2024-11-30", + "release_date": "2024-02-26", + "last_updated": "2024-02-26", + "type": "chat" }, { - "id": "arcee-ai/trinity-large-thinking", - "name": "Trinity Large Thinking", - "display_name": "Trinity Large Thinking", + "id": "mistralai/ministral-8b-2512", + "name": "Ministral 8B", + "display_name": "Ministral 8B", "modalities": { "input": [ "text" @@ -169269,35 +161889,24 @@ ] }, "limit": { - "context": 262100, - "output": 80000 + "context": 262144, + "output": 32768 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "high" - ] - } + "supported": false }, "attachment": false, "open_weights": true, - "release_date": "2026-04-01", - "last_updated": "2026-05-28", + "release_date": "2025-12-02", + "last_updated": "2025-12-02", "type": "chat" }, { - "id": "deepseek/deepseek-v3.2-thinking", - "name": "DeepSeek V3.2 Thinking", - "display_name": "DeepSeek V3.2 Thinking", + "id": "mistralai/codestral-2508", + "name": "Codestral 2508", + "display_name": "Codestral 2508", "modalities": { "input": [ "text" @@ -169307,78 +161916,50 @@ ] }, "limit": { - "context": 128000, - "output": 8000 + "context": 256000, + "output": 32768 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "effort_options": [ - "none", - "low", - "medium", - "high" - ] - } + "supported": false }, "attachment": false, - "open_weights": true, - "knowledge": "2024-07", - "release_date": "2025-12-01", - "last_updated": "2025-12-01", + "open_weights": false, + "release_date": "2025-07-30", + "last_updated": "2025-07-30", "type": "chat" }, { - "id": "deepseek/deepseek-v4.1-flash-fast", - "name": "DeepSeek V4.1 Flash Fast", - "display_name": "DeepSeek V4.1 Flash Fast", + "id": "Envoid/Llama-3.05-Nemotron-Tenyxchat-Storybreaker-70B", + "name": "Nemotron Tenyxchat Storybreaker 70b", + "display_name": "Nemotron Tenyxchat Storybreaker 70b", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 32768 + "context": 16384, + "output": 8192 }, - "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "high" - ] - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-09-10", - "last_updated": "2026-09-10", + "release_date": "2024-01-01", + "last_updated": "2024-12-01", "type": "chat" }, { - "id": "deepseek/deepseek-v4-flash", - "name": "DeepSeek V4 Flash", - "display_name": "DeepSeek V4 Flash", + "id": "Envoid/Llama-3.05-NT-Storybreaker-Ministral-70B", + "name": "Llama 3.05 Storybreaker Ministral 70b", + "display_name": "Llama 3.05 Storybreaker Ministral 70b", "modalities": { "input": [ "text" @@ -169388,59 +161969,37 @@ ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 16384, + "output": 8192 }, - "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." - ] - } + "supported": false }, "attachment": false, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "release_date": "2024-01-01", + "last_updated": "2024-12-01", "type": "chat" }, { - "id": "deepseek/deepseek-v3.1", - "name": "DeepSeek-V3.1", - "display_name": "DeepSeek-V3.1", + "id": "google/gemini-3.1-pro-preview", + "name": "Gemini 3.1 Pro (Preview)", + "display_name": "Gemini 3.1 Pro (Preview)", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 163840, - "output": 128000 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -169450,35 +162009,46 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "none", + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ "low", - "medium", "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2025-08-21", - "last_updated": "2025-08-21", + "attachment": true, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2026-02-19", + "last_updated": "2026-02-19", "type": "chat" }, { - "id": "deepseek/deepseek-v4-pro", - "name": "DeepSeek V4 Pro", - "display_name": "DeepSeek V4 Pro", + "id": "google/gemini-3-flash-preview", + "name": "Gemini 3 Flash (Preview)", + "display_name": "Gemini 3 Flash (Preview)", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -169490,46 +162060,46 @@ "reasoning": { "supported": true, "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ + "mode": "level", + "level": "high", + "level_options": [ + "minimal", "low", - "high", - "max" + "medium", + "high" ], - "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" - ], - "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." + "thought_signatures" ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "attachment": true, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2025-12-17", + "last_updated": "2025-12-17", "type": "chat" }, { - "id": "deepseek/deepseek-v4-pro-0813", - "name": "DeepSeek V4 Pro 0813", - "display_name": "DeepSeek V4 Pro 0813", + "id": "google/gemini-3.1-pro-preview-customtools", + "name": "Gemini 3.1 Pro (Preview Custom Tools)", + "display_name": "Gemini 3.1 Pro (Preview Custom Tools)", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -169540,28 +162110,37 @@ "extra_capabilities": { "reasoning": { "supported": true, - "effort_options": [ - "none", + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ "low", - "high", - "max" + "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-08-13", - "last_updated": "2026-08-22", + "attachment": true, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2026-02-19", + "last_updated": "2026-02-19", "type": "chat" }, { - "id": "deepseek/deepseek-v4-flash-vision-exp", - "name": "DeepSeek V4 Flash Vision Exp", - "display_name": "DeepSeek V4 Flash Vision Exp", + "id": "google/gemini-3.1-pro-preview-high", + "name": "Gemini 3.1 Pro (Preview High)", + "display_name": "Gemini 3.1 Pro (Preview High)", "modalities": { "input": [ "text", - "image" + "image", + "video", + "audio" ], "output": [ "text" @@ -169569,7 +162148,7 @@ }, "limit": { "context": 1048576, - "output": 1048576 + "output": 65536 }, "temperature": true, "tool_call": true, @@ -169581,45 +162160,45 @@ "reasoning": { "supported": true, "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ + "mode": "level", + "level": "high", + "level_options": [ "low", - "high", - "max" + "high" ], - "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" - ], - "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." + "thought_signatures" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-08-21", - "last_updated": "2026-09-01", + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2026-02-19", + "last_updated": "2026-02-19", "type": "chat" }, { - "id": "deepseek/deepseek-v4-flash-0731", - "name": "DeepSeek V4 Flash 0731", - "display_name": "DeepSeek V4 Flash 0731", + "id": "google/gemini-3.5-flash-lite", + "name": "Gemini 3.5 Flash Lite", + "display_name": "Gemini 3.5 Flash Lite", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -169631,28 +162210,31 @@ "reasoning": { "supported": true, "effort_options": [ - "none", + "minimal", "low", "medium", "high" ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-07-31", - "last_updated": "2026-07-31", + "attachment": true, + "open_weights": false, + "knowledge": "2026-03", + "release_date": "2026-07-21", + "last_updated": "2026-07-21", "type": "chat" }, { - "id": "deepseek/deepseek-v4.1-flash-1017", - "name": "DeepSeek V4.1 Flash 1017", - "display_name": "DeepSeek V4.1 Flash 1017", + "id": "google/gemini-flash-latest", + "name": "Gemini Flash Latest", + "display_name": "Gemini Flash Latest", "modalities": { "input": [ "text", - "image" + "image", + "video", + "audio", + "pdf" ], "output": [ "text" @@ -169660,7 +162242,7 @@ }, "limit": { "context": 1048576, - "output": 1048576 + "output": 65536 }, "temperature": true, "tool_call": true, @@ -169671,29 +162253,30 @@ "extra_capabilities": { "reasoning": { "effort_options": [ - "none", + "minimal", "low", - "high", - "max" + "medium", + "high" ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-10-17", - "last_updated": "2026-10-17", + "open_weights": false, + "knowledge": "2026-03", + "release_date": "2026-08-13", + "last_updated": "2026-08-13", "type": "chat" }, { - "id": "deepseek/deepseek-v4.1-flash", - "name": "DeepSeek V4.1 Flash", - "display_name": "DeepSeek V4.1 Flash", + "id": "google/gemini-pro-latest", + "name": "Gemini Pro Latest", + "display_name": "Gemini Pro Latest", "modalities": { "input": [ "text", "image", - "pdf" + "video", + "audio" ], "output": [ "text" @@ -169701,9 +162284,8 @@ }, "limit": { "context": 1048576, - "output": 32768 + "output": 65536 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -169711,63 +162293,81 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ - "none", "low", - "high", - "max" + "medium", + "high" ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-09-10", - "last_updated": "2026-09-10", + "open_weights": false, + "release_date": "2026-03-29", + "last_updated": "2026-03-29", "type": "chat" }, { - "id": "deepseek/deepseek-v3.2", - "name": "DeepSeek V3.2", - "display_name": "DeepSeek V3.2", + "id": "google/gemini-3-flash-preview-thinking", + "name": "Gemini 3 Flash Thinking", + "display_name": "Gemini 3 Flash Thinking", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 8000 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": false, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", + "low", + "medium", + "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-07", - "release_date": "2025-12-01", - "last_updated": "2025-12-01", + "attachment": true, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2025-12-17", + "last_updated": "2025-12-17", "type": "chat" }, { - "id": "deepseek/deepseek-v4.1-flash-1017-fast", - "name": "DeepSeek V4.1 Flash 1017 Fast", - "display_name": "DeepSeek V4.1 Flash 1017 Fast", + "id": "google/gemini-3.1-flash-lite", + "name": "Gemini 3.1 Flash Lite", + "display_name": "Gemini 3.1 Flash Lite", "modalities": { "input": [ "text", - "image" + "image", + "video", + "audio", + "pdf" ], "output": [ "text" @@ -169775,7 +162375,7 @@ }, "limit": { "context": 1048576, - "output": 262144 + "output": 65536 }, "temperature": true, "tool_call": true, @@ -169785,8 +162385,9 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ - "none", + "minimal", "low", "medium", "high" @@ -169794,30 +162395,32 @@ } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-10-17", - "last_updated": "2026-10-17", + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2026-05-07", + "last_updated": "2026-05-07", "type": "chat" }, { - "id": "deepseek/deepseek-r1", - "name": "DeepSeek-R1", - "display_name": "DeepSeek-R1", + "id": "google/gemini-3.1-pro-preview-low", + "name": "Gemini 3.1 Pro (Preview Low)", + "display_name": "Gemini 3.1 Pro (Preview Low)", "modalities": { "input": [ - "text" + "text", + "image", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 32768 + "context": 1048576, + "output": 65536 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, "default": true @@ -169825,107 +162428,37 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "low", + "high" + ], "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" + "thought_signatures" ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-07", - "release_date": "2025-01-20", - "last_updated": "2025-05-29", - "type": "chat" - }, - { - "id": "topaz/starlight-precise-2.6", - "name": "Starlight Precise 2.6", - "display_name": "Starlight Precise 2.6", - "modalities": { - "input": [ - "text" - ], - "output": [ - "video" - ] - }, - "limit": { - "context": 8192, - "output": 8192 - }, - "temperature": false, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": false, - "release_date": "2026-10-06", - "last_updated": "2026-10-06" - }, - { - "id": "topaz/wonder-3.5", - "name": "Wonder 3.5", - "display_name": "Wonder 3.5", - "modalities": { - "input": [ - "text" - ], - "output": [ - "image" - ] - }, - "limit": { - "context": 8192, - "output": 8192 - }, - "temperature": false, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": false, - "release_date": "2026-10-06", - "last_updated": "2026-10-06" - }, - { - "id": "topaz/proteus", - "name": "Proteus", - "display_name": "Proteus", - "modalities": { - "input": [ - "text" - ], - "output": [ - "video" - ] - }, - "limit": { - "context": 8192, - "output": 8192 - }, - "temperature": false, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-10-06", - "last_updated": "2026-10-06" + "knowledge": "2025-01", + "release_date": "2026-02-19", + "last_updated": "2026-02-19", + "type": "chat" }, { - "id": "anthropic/claude-haiku-5.5", - "name": "Claude Haiku 5.5", - "display_name": "Claude Haiku 5.5", + "id": "google/gemini-flash-lite-latest", + "name": "Gemini Flash Lite Latest", + "display_name": "Gemini Flash Lite Latest", "modalities": { "input": [ "text", "image", + "video", + "audio", "pdf" ], "output": [ @@ -169933,10 +162466,10 @@ ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 1048576, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -169945,157 +162478,121 @@ "extra_capabilities": { "reasoning": { "effort_options": [ - "none", + "minimal", "low", "medium", - "high", - "xhigh", - "max" + "high" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-10-07", - "last_updated": "2026-10-07", + "knowledge": "2026-03", + "release_date": "2026-07-21", + "last_updated": "2026-07-21", "type": "chat" }, { - "id": "anthropic/claude-opus-4.7", - "name": "Claude Opus 4.7", - "display_name": "Claude Opus 4.7", + "id": "google/gemini-3.5-flash-thinking", + "name": "Gemini 3.5 Flash Thinking", + "display_name": "Gemini 3.5 Flash Thinking", "modalities": { "input": [ "text", "image", - "pdf" + "video", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 1048576, + "output": 65536 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "high", - "effort_options": [ + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", "low", "medium", - "high", - "xhigh", - "max" + "high" ], - "interleaved": true, "summaries": true, - "visibility": "omitted", + "visibility": "summary", "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." + "thought_signatures" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-04-16", - "last_updated": "2026-04-16", + "knowledge": "2025-01", + "release_date": "2026-05-19", + "last_updated": "2026-05-19", "type": "chat" }, { - "id": "anthropic/claude-opus-4.6", - "name": "Claude Opus 4.6", - "display_name": "Claude Opus 4.6", + "id": "google/gemma-4-31b-it:thinking", + "name": "Gemma 4 31B Thinking", + "display_name": "Gemma 4 31B Thinking", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 262144, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." - ] - } + "default": true }, "attachment": true, - "open_weights": false, - "knowledge": "2025-05-31", - "release_date": "2026-02-05", - "last_updated": "2026-03-13", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "anthropic/claude-sonnet-5", - "name": "Claude Sonnet 5", - "display_name": "Claude Sonnet 5", + "id": "google/gemma-4-26b-a4b-it", + "name": "Gemma 4 26B A4B", + "display_name": "Gemma 4 26B A4B", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 262144, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -170103,44 +162600,33 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ] + "supported": true } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-30", - "last_updated": "2026-06-30", + "open_weights": true, + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "anthropic/claude-opus-5-fast", - "name": "Claude Opus 5 (Fast)", - "display_name": "Claude Opus 5 (Fast)", + "id": "google/diffusiongemma", + "name": "DiffusionGemma", + "display_name": "DiffusionGemma", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 262144, + "output": 32768 }, - "temperature": false, - "tool_call": true, + "temperature": true, + "tool_call": false, "reasoning": { "supported": true, "default": true @@ -170149,138 +162635,119 @@ "reasoning": { "effort_options": [ "none", - "low", - "medium", - "high", - "xhigh", - "max" + "xhigh" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-05", - "release_date": "2026-07-24", - "last_updated": "2026-07-24", + "attachment": false, + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-06-09", + "last_updated": "2026-07-15", "type": "chat" }, { - "id": "anthropic/claude-haiku-4.5", - "name": "Claude Haiku 4.5", - "display_name": "Claude Haiku 4.5", + "id": "google/gemma-4-31b-it", + "name": "Gemma 4 31B", + "display_name": "Gemma 4 31B", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 262144, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." - ] + "supported": true } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-02-28", - "release_date": "2025-10-15", - "last_updated": "2025-10-15", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "anthropic/claude-opus-4.8", - "name": "Claude Opus 4.8", - "display_name": "Claude Opus 4.8", + "id": "google/gemma-4-26b-a4b-it:thinking", + "name": "Gemma 4 26B A4B Thinking", + "display_name": "Gemma 4 26B A4B Thinking", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 262144, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." - ] - } + "default": true }, "attachment": true, - "open_weights": false, - "knowledge": "2026-01", - "release_date": "2026-05-28", - "last_updated": "2026-05-28", + "open_weights": true, + "release_date": "2026-04-02", + "last_updated": "2026-04-02", + "type": "chat" + }, + { + "id": "google/gemma4-31b-splituntied", + "name": "Gemma 4 31B Split-Untied", + "display_name": "Gemma 4 31B Split-Untied", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 262144, + "output": 32768 + }, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "release_date": "2026-09-17", + "last_updated": "2026-09-17", "type": "chat" }, { - "id": "anthropic/claude-opus-5.5", - "name": "Claude Opus 5.5", - "display_name": "Claude Opus 5.5", + "id": "google/gemini-4-argon", + "name": "Gemini 4 Argon", + "display_name": "Gemini 4 Argon", "modalities": { "input": [ "text", "image", + "video", + "audio", "pdf" ], "output": [ @@ -170288,8 +162755,8 @@ ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 1048576, + "output": 65536 }, "temperature": false, "tool_call": true, @@ -170302,27 +162769,27 @@ "effort_options": [ "low", "medium", - "high", - "xhigh", - "max" + "high" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "knowledge": "2026-03", + "release_date": "2026-10-13", + "last_updated": "2026-10-13", "type": "chat" }, { - "id": "anthropic/claude-opus-4.8-fast", - "name": "Claude Opus 4.8 (Fast)", - "display_name": "Claude Opus 4.8 (Fast)", + "id": "google/gemini-3.7-flash", + "name": "Gemini 3.7 Flash", + "display_name": "Gemini 3.7 Flash", "modalities": { "input": [ "text", "image", + "video", + "audio", "pdf" ], "output": [ @@ -170330,67 +162797,61 @@ ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "high", - "effort_options": [ + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", "low", "medium", - "high", - "xhigh", - "max" + "high" ], - "interleaved": true, "summaries": true, - "visibility": "omitted", + "visibility": "summary", "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." + "thought_signatures" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-01", - "release_date": "2026-05-28", - "last_updated": "2026-05-28", + "knowledge": "2026-03", + "release_date": "2026-08-13", + "last_updated": "2026-08-13", "type": "chat" }, { - "id": "anthropic/claude-fable-5.1", - "name": "Claude Fable 5.1", - "display_name": "Claude Fable 5.1", + "id": "google/gemini-3.5-flash", + "name": "Gemini 3.5 Flash", + "display_name": "Gemini 3.5 Flash", "modalities": { "input": [ "text", "image", - "pdf" + "video", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 1048576, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -170400,87 +162861,66 @@ "reasoning": { "supported": true, "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ + "mode": "level", + "level": "high", + "level_options": [ + "minimal", "low", "medium", - "high", - "xhigh", - "max" + "high" ], - "interleaved": true, "summaries": true, - "visibility": "omitted", + "visibility": "summary", "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", - "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", - "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." + "thought_signatures" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-09-01", - "last_updated": "2026-09-01", + "knowledge": "2025-01", + "release_date": "2026-05-19", + "last_updated": "2026-05-19", "type": "chat" }, { - "id": "anthropic/claude-opus-5", - "name": "Claude Opus 5", - "display_name": "Claude Opus 5", + "id": "google/gemma-4-26b-a4b-it-cybersecurity", + "name": "Gemma 4 26B A4B Cybersecurity", + "display_name": "Gemma 4 26B A4B Cybersecurity", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 262144, + "output": 32768 }, - "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ] - } - }, "attachment": true, - "open_weights": false, - "knowledge": "2026-05", - "release_date": "2026-07-24", - "last_updated": "2026-07-24", + "open_weights": true, + "release_date": "2026-09-19", + "last_updated": "2026-09-19", "type": "chat" }, { - "id": "anthropic/claude-opus-4.5", - "name": "Claude Opus 4.5", - "display_name": "Claude Opus 4.5", + "id": "google/gemini-3.8-flash", + "name": "Gemini 3.8 Flash", + "display_name": "Gemini 3.8 Flash", "modalities": { "input": [ "text", "image", + "video", + "audio", "pdf" ], "output": [ @@ -170488,57 +162928,50 @@ ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", - "effort_options": [ + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", "low", "medium", "high" ], - "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." + "thought_signatures" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-05", - "release_date": "2025-11-24", - "last_updated": "2025-11-24", + "release_date": "2026-09-02", + "last_updated": "2026-09-02", "type": "chat" }, { - "id": "anthropic/claude-sonnet-4.6", - "name": "Claude Sonnet 4.6", - "display_name": "Claude Sonnet 4.6", + "id": "google/gemini-3.6-flash", + "name": "Gemini 3.6 Flash", + "display_name": "Gemini 3.6 Flash", "modalities": { "input": [ "text", "image", + "video", + "audio", "pdf" ], "output": [ @@ -170546,121 +162979,96 @@ ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", - "effort_options": [ + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", "low", "medium", - "high", - "max" + "high" ], - "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." + "thought_signatures" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-17", - "last_updated": "2026-03-13", + "knowledge": "2026-03", + "release_date": "2026-07-21", + "last_updated": "2026-07-21", "type": "chat" }, { - "id": "anthropic/claude-sonnet-4.5", - "name": "Claude Sonnet 4.5", - "display_name": "Claude Sonnet 4.5", + "id": "inclusionai/ling-3.1-flash", + "name": "Ling 3.1 Flash", + "display_name": "Ling 3.1 Flash", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 64000 + "context": 262144, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + "effort_options": [ + "none", + "low", + "medium", + "high" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-07-31", - "release_date": "2025-09-29", - "last_updated": "2025-09-29", + "attachment": false, + "open_weights": true, + "release_date": "2026-09-29", + "last_updated": "2026-09-29", "type": "chat" }, { - "id": "anthropic/claude-sonnet-5.5", - "name": "Claude Sonnet 5.5", - "display_name": "Claude Sonnet 5.5", + "id": "inclusionai/ling-3.0-flash:thinking", + "name": "Ling 3.0 Flash Thinking", + "display_name": "Ling 3.0 Flash Thinking", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 262144, + "output": 32768 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -170669,82 +163077,67 @@ "extra_capabilities": { "reasoning": { "effort_options": [ + "none", + "minimal", "low", "medium", "high", - "xhigh", - "max" + "xhigh" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-09-28", - "last_updated": "2026-09-28", + "attachment": false, + "open_weights": true, + "release_date": "2026-07-23", + "last_updated": "2026-07-23", "type": "chat" }, { - "id": "anthropic/claude-opus-5.5-fast", - "name": "Claude Opus 5.5 (Fast)", - "display_name": "Claude Opus 5.5 (Fast)", + "id": "inclusionai/ling-3.0-flash", + "name": "Ling 3.0 Flash", + "display_name": "Ling 3.0 Flash", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 262144, + "output": 32768 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ] - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "attachment": false, + "open_weights": true, + "release_date": "2026-07-23", + "last_updated": "2026-07-23", "type": "chat" }, { - "id": "anthropic/claude-fable-5", - "name": "Claude Fable 5", - "display_name": "Claude Fable 5", + "id": "inclusionai/ling-3.0-flash-vl", + "name": "Ling 3.0 Flash VL", + "display_name": "Ling 3.0 Flash VL", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 262144, + "output": 32768 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -170752,41 +163145,24 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", "effort_options": [ + "none", "low", "medium", - "high", - "xhigh", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", - "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", - "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." + "high" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-09", - "last_updated": "2026-06-09", + "open_weights": true, + "release_date": "2026-09-10", + "last_updated": "2026-09-10", "type": "chat" }, { - "id": "zai/glm-5.1", - "name": "GLM 5.1", - "display_name": "GLM 5.1", + "id": "NousResearch/hermes-4-405b:thinking", + "name": "Hermes 4 Large (Thinking)", + "display_name": "Hermes 4 Large (Thinking)", "modalities": { "input": [ "text" @@ -170796,36 +163172,25 @@ ] }, "limit": { - "context": 202800, - "output": 64000 + "context": 128000, + "output": 8192 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "none", - "low", - "medium", - "high" - ] - } + "supported": false }, "attachment": false, "open_weights": true, - "release_date": "2026-04-07", - "last_updated": "2026-04-07", + "knowledge": "2024-08-31", + "release_date": "2025-08-26", + "last_updated": "2025-08-26", "type": "chat" }, { - "id": "zai/glm-5.2-fast", - "name": "GLM 5.2 Fast", - "display_name": "GLM 5.2 Fast", + "id": "NousResearch/hermes-3-llama-3.1-70b", + "name": "Hermes 3 70B", + "display_name": "Hermes 3 70B", "modalities": { "input": [ "text" @@ -170835,75 +163200,79 @@ ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 65536, + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "high" - ] - } + "supported": false }, "attachment": false, "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "knowledge": "2023-12-31", + "release_date": "2024-08-18", + "last_updated": "2024-08-18", "type": "chat" }, { - "id": "zai/glm-5v-turbo", - "name": "GLM 5V Turbo", - "display_name": "GLM 5V Turbo", + "id": "NousResearch/hermes-4-405b", + "name": "Hermes 4 Large", + "display_name": "Hermes 4 Large", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 128000 + "context": 128000, + "output": 8192 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "high" - ] - } + "attachment": false, + "open_weights": true, + "knowledge": "2024-08-31", + "release_date": "2025-08-26", + "last_updated": "2025-08-26", + "type": "chat" + }, + { + "id": "meganova-ai/manta-flash-1.0", + "name": "Manta Flash 1.0", + "display_name": "Manta Flash 1.0", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] }, - "attachment": true, + "limit": { + "context": 16384, + "output": 16384 + }, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, "open_weights": false, - "release_date": "2026-04-01", - "last_updated": "2026-04-01", + "release_date": "2025-09-20", + "last_updated": "2025-12-20", "type": "chat" }, { - "id": "zai/glm-5", - "name": "GLM-5", - "display_name": "GLM-5", + "id": "meganova-ai/manta-pro-1.0", + "name": "Manta Pro 1.0", + "display_name": "Manta Pro 1.0", "modalities": { "input": [ "text" @@ -170913,42 +163282,23 @@ ] }, "limit": { - "context": 202800, - "output": 131100 + "context": 65536, + "output": 32768 }, - "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "none", - "low", - "medium", - "high" - ] - } + "supported": false }, "attachment": false, - "open_weights": true, - "release_date": "2026-02-12", - "last_updated": "2026-02-12", + "open_weights": false, + "release_date": "2025-09-20", + "last_updated": "2025-12-20", "type": "chat" }, { - "id": "zai/glm-4.6", - "name": "GLM 4.6", - "display_name": "GLM 4.6", + "id": "meganova-ai/manta-mini-1.0", + "name": "Manta Mini 1.0", + "display_name": "Manta Mini 1.0", "modalities": { "input": [ "text" @@ -170958,8 +163308,36 @@ ] }, "limit": { - "context": 200000, - "output": 96000 + "context": 8192, + "output": 8192 + }, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": false, + "release_date": "2025-09-20", + "last_updated": "2025-12-20", + "type": "chat" + }, + { + "id": "qwen/qwen3.6-35b-a3b:thinking", + "name": "Qwen3.6 35B A3B Thinking", + "display_name": "Qwen3.6 35B A3B Thinking", + "modalities": { + "input": [ + "text", + "image", + "video" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1048576, + "output": 16384 }, "temperature": true, "tool_call": true, @@ -170970,58 +163348,65 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-09-30", - "last_updated": "2025-09-30", + "release_date": "2026-04-17", + "last_updated": "2026-04-17", "type": "chat" }, { - "id": "zai/glm-5.3-fast", - "name": "GLM 5.3 Fast", - "display_name": "GLM 5.3 Fast", + "id": "qwen/qwen3.6-plus", + "name": "Qwen 3.6 Plus", + "display_name": "Qwen 3.6 Plus", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 262144 + "context": 991808, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": true }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "high" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "attachment": true, + "open_weights": false, + "knowledge": "2025-04", + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "zai/glm-4.5-air", - "name": "GLM 4.5 Air", - "display_name": "GLM 4.5 Air", + "id": "qwen/qwen3-coder-next", + "name": "Qwen3 Coder Next", + "display_name": "Qwen3 Coder Next", "modalities": { "input": [ "text" @@ -171031,102 +163416,80 @@ ] }, "limit": { - "context": 128000, - "output": 96000 + "context": 262144, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-07-28", - "last_updated": "2025-07-28", + "knowledge": "2025-09", + "release_date": "2026-02-03", + "last_updated": "2026-02-03", "type": "chat" }, { - "id": "zai/glm-5.3", - "name": "GLM 5.3", - "display_name": "GLM 5.3", + "id": "qwen/qwen2.5-vl-72b-instruct", + "name": "Qwen25 VL 72b", + "display_name": "Qwen25 VL 72b", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 1000000 + "context": 32000, + "output": 32000 }, - "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "low", - "high", - "max" - ] - } + "supported": false }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "release_date": "2025-05-10", + "last_updated": "2025-05-10", "type": "chat" }, { - "id": "zai/glm-5.2", - "name": "GLM 5.2", - "display_name": "GLM 5.2", + "id": "qwen/qwen3.8-27b-kiwen", + "name": "Qwen 3.8 27B Kiwen", + "display_name": "Qwen 3.8 27B Kiwen", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 262144, + "output": 32768 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "none", - "high", - "max" - ] - } - }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "release_date": "2026-10-05", + "last_updated": "2026-10-05", "type": "chat" }, { - "id": "zai/glm-4.7-flashx", - "name": "GLM 4.7 FlashX", - "display_name": "GLM 4.7 FlashX", + "id": "qwen/qwen3.5-122b-a10b:thinking", + "name": "Qwen3.5 122B A10B Thinking", + "display_name": "Qwen3.5 122B A10B Thinking", "modalities": { "input": [ "text" @@ -171136,8 +163499,8 @@ ] }, "limit": { - "context": 200000, - "output": 128000 + "context": 262144, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -171149,97 +163512,81 @@ "reasoning": { "supported": true, "interleaved": true, - "effort_options": [ - "none", - "low", - "medium", - "high" + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, "attachment": false, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2026-01-19", - "last_updated": "2026-01-19", + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" }, { - "id": "zai/glm-5.3-flashx", - "name": "GLM 5.3 FlashX", - "display_name": "GLM 5.3 FlashX", + "id": "qwen/qwen3.8-27b-synthia", + "name": "Qwen 3.8 27B Synthia", + "display_name": "Qwen 3.8 27B Synthia", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 262144, + "output": 32768 }, - "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "high", - "max" - ] - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", + "release_date": "2026-10-05", + "last_updated": "2026-10-05", "type": "chat" }, { - "id": "zai/glm-4.5v", - "name": "GLM 4.5V", - "display_name": "GLM 4.5V", + "id": "qwen/qwen3-30b-a3b-instruct-2507", + "name": "Qwen3 30B A3B Instruct 2507", + "display_name": "Qwen3 30B A3B Instruct 2507", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 66000, - "output": 16000 + "context": 256000, + "output": 32768 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-08-11", - "last_updated": "2025-08-11", + "release_date": "2025-07-28", + "last_updated": "2025-07-28", "type": "chat" }, { - "id": "zai/glm-5.3-flash", - "name": "GLM 5.3 Flash", - "display_name": "GLM 5.3 Flash", + "id": "qwen/qwen3.8-max-prime", + "name": "Qwen3.8 Max Prime", + "display_name": "Qwen3.8 Max Prime", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" @@ -171247,7 +163594,7 @@ }, "limit": { "context": 1000000, - "output": 131000 + "output": 131072 }, "temperature": true, "tool_call": true, @@ -171257,35 +163604,38 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ + "minimal", "low", + "medium", "high", - "max" + "xhigh" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", + "open_weights": false, + "release_date": "2026-09-23", + "last_updated": "2026-09-23", "type": "chat" }, { - "id": "zai/glm-5-turbo", - "name": "GLM 5 Turbo", - "display_name": "GLM 5 Turbo", + "id": "qwen/qwen3.5-35b-a3b:thinking", + "name": "Qwen3.5 35B A3B Thinking", + "display_name": "Qwen3.5 35B A3B Thinking", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 202800, - "output": 131072 + "context": 260096, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -171296,41 +163646,42 @@ "extra_capabilities": { "reasoning": { "supported": true, - "effort_options": [ - "none", - "low", - "medium", - "high" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, - "attachment": false, - "open_weights": false, - "release_date": "2026-03-16", - "last_updated": "2026-03-16", + "attachment": true, + "open_weights": true, + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" }, { - "id": "zai/glm-4.7", - "name": "GLM 4.7", - "display_name": "GLM 4.7", + "id": "qwen/qwen3.5-35b-a3b", + "name": "Qwen3.5 35B A3B", + "display_name": "Qwen3.5 35B A3B", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 120000 + "context": 260096, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": true }, "extra_capabilities": { "reasoning": { @@ -171340,26 +163691,19 @@ "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "effort_options": [ - "none", - "low", - "medium", - "high" ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-12-22", - "last_updated": "2025-12-22", + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" }, { - "id": "zai/glm-4.5", - "name": "GLM 4.5", - "display_name": "GLM 4.5", + "id": "qwen/qwen3-8b", + "name": "Qwen 3 8B", + "display_name": "Qwen 3 8B", "modalities": { "input": [ "text" @@ -171369,256 +163713,277 @@ ] }, "limit": { - "context": 128000, - "output": 96000 + "context": 41000, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": true }, "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": false, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-07-28", - "last_updated": "2025-07-28", + "release_date": "2025-04-29", + "last_updated": "2025-04-29", "type": "chat" }, { - "id": "zai/glm-4.7-flash", - "name": "GLM 4.7 Flash", - "display_name": "GLM 4.7 Flash", + "id": "qwen/qwen3.6-27b", + "name": "Qwen3.6 27B", + "display_name": "Qwen3.6 27B", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 131000 + "context": 262144, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": true }, "extra_capabilities": { "reasoning": { "supported": true, - "effort_options": [ - "none", - "low", - "medium", - "high" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2026-01-19", - "last_updated": "2026-01-19", + "release_date": "2026-04-22", + "last_updated": "2026-04-22", "type": "chat" }, { - "id": "callstack/apex", - "name": "Apex", - "display_name": "Apex", + "id": "qwen/qwen3.5-omni-plus", + "name": "Qwen3.5 Omni Plus", + "display_name": "Qwen3.5 Omni Plus", "modalities": { "input": [ "text", - "image" + "image", + "video", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 131072 + "context": 983616, + "output": 65536 }, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "xhigh" - ] - } + "supported": false }, "attachment": true, "open_weights": false, - "release_date": "2026-10-08", - "last_updated": "2026-10-08", + "release_date": "2026-03-30", + "last_updated": "2026-03-30", "type": "chat" }, { - "id": "quiverai/arrow-2", - "name": "Arrow 2", - "display_name": "Arrow 2", + "id": "qwen/qwen-2.5-72b-instruct", + "name": "Qwen2.5 72B", + "display_name": "Qwen2.5 72B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ + "text" + ] + }, + "limit": { + "context": 131072, + "output": 8192 + }, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "release_date": "2025-07-03", + "last_updated": "2025-07-03", + "type": "chat" + }, + { + "id": "qwen/qwen3.8-27b-cybersecurity", + "name": "Qwen 3.8 27B Cybersecurity", + "display_name": "Qwen 3.8 27B Cybersecurity", + "modalities": { + "input": [ "text", "image" + ], + "output": [ + "text" ] }, "limit": { - "context": 131072, - "output": 65536 + "context": 262144, + "output": 32768 }, - "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ] - } - }, - "attachment": true, - "open_weights": false, - "release_date": "2026-09-16", - "last_updated": "2026-09-16", + "attachment": true, + "open_weights": true, + "release_date": "2026-09-19", + "last_updated": "2026-09-19", "type": "chat" }, { - "id": "quiverai/arrow-2-telos", - "name": "Arrow 2 Telos", - "display_name": "Arrow 2 Telos", + "id": "qwen/qwen3.5-plus:thinking", + "name": "Qwen3.5 Plus Thinking", + "display_name": "Qwen3.5 Plus Thinking", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ - "text", - "image" + "text" ] }, "limit": { - "context": 131072, + "context": 983616, "output": 65536 }, - "temperature": false, - "tool_call": true, + "temperature": true, + "tool_call": false, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "xhigh" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-09-16", - "last_updated": "2026-09-16", + "knowledge": "2025-04", + "release_date": "2026-02-16", + "last_updated": "2026-02-16", "type": "chat" }, { - "id": "meituan/longcat-2.5-preview", - "name": "LongCat 2.5 Preview", - "display_name": "LongCat 2.5 Preview", + "id": "qwen/qwen3-14b", + "name": "Qwen 3 14b", + "display_name": "Qwen 3 14b", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 41000, + "output": 32768 }, - "temperature": false, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": true }, - "attachment": true, - "open_weights": false, - "release_date": "2026-09-25", - "last_updated": "2026-09-25", + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, + "open_weights": true, + "release_date": "2024-01-01", + "last_updated": "2024-01-01", "type": "chat" }, { - "id": "elorian/glimpse", - "name": "Glimpse", - "display_name": "Glimpse", + "id": "qwen/qwen3-235b-a22b", + "name": "Qwen 3 235b A22B", + "display_name": "Qwen 3 235b A22B", "modalities": { "input": [ "text", - "image" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 220000, - "output": 4096 + "context": 262144, + "output": 16384 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": true }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "low", - "medium", - "xhigh" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, "attachment": true, - "open_weights": false, - "release_date": "2026-10-16", - "last_updated": "2026-10-16", + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-04-28", + "last_updated": "2025-04-28", "type": "chat" }, { - "id": "amazon/titan-embed-text-v2", - "name": "Titan Text Embeddings V2", - "display_name": "Titan Text Embeddings V2", + "id": "qwen/qwen3.7-max", + "name": "Qwen3.7 Max", + "display_name": "Qwen3.7 Max", "modalities": { "input": [ "text" @@ -171628,40 +163993,50 @@ ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 1000000, + "output": 65536 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "none", + "high" + ] + } }, "attachment": false, "open_weights": false, - "release_date": "2024-04-30", - "last_updated": "2024-04", - "type": "embedding" + "release_date": "2026-05-21", + "last_updated": "2026-05-21", + "type": "chat" }, { - "id": "amazon/nova-2-lite", - "name": "Nova 2 Lite", - "display_name": "Nova 2 Lite", + "id": "qwen/qwen3.7-flash:thinking", + "name": "Qwen3.7 Flash Thinking", + "display_name": "Qwen3.7 Flash Thinking", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 65535 + "context": 983616, + "output": 65536 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, "default": true @@ -171670,126 +164045,141 @@ "reasoning": { "effort_options": [ "none", - "low", - "medium", "high" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-10", - "release_date": "2025-12-02", - "last_updated": "2025-12-01", + "release_date": "2026-07-15", + "last_updated": "2026-07-15", "type": "chat" }, { - "id": "amazon/nova-lite", - "name": "Nova Lite", - "display_name": "Nova Lite", + "id": "qwen/qwen3-235b-a22b-thinking-2507", + "name": "Qwen 3 235b A22B 2507 Thinking", + "display_name": "Qwen 3 235b A22B 2507 Thinking", "modalities": { "input": [ - "text", - "image", - "video", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 300000, - "output": 10000 + "context": 131072, + "output": 81920 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-10", - "release_date": "2024-12-03", - "last_updated": "2024-12-03", + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, + "open_weights": true, + "release_date": "2025-07-25", + "last_updated": "2025-07-25", "type": "chat" }, { - "id": "amazon/nova-pro", - "name": "Nova Pro", - "display_name": "Nova Pro", + "id": "qwen/qwen3.5-omni-flash", + "name": "Qwen3.5 Omni Flash", + "display_name": "Qwen3.5 Omni Flash", "modalities": { "input": [ "text", "image", "video", - "pdf" + "audio" ], "output": [ "text" ] }, "limit": { - "context": 300000, - "output": 10000 + "context": 49152, + "output": 16384 }, - "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2024-10", - "release_date": "2024-12-03", - "last_updated": "2024-12-03", + "release_date": "2026-03-30", + "last_updated": "2026-03-30", "type": "chat" }, { - "id": "amazon/nova-micro", - "name": "Nova Micro", - "display_name": "Nova Micro", + "id": "qwen/qwen3.5-plus", + "name": "Qwen3.5 Plus", + "display_name": "Qwen3.5 Plus", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 10000 + "context": 983616, + "output": 65536 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": false + "supported": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": true, "open_weights": false, - "knowledge": "2024-10", - "release_date": "2024-12-03", - "last_updated": "2024-12-03", + "knowledge": "2025-04", + "release_date": "2026-02-16", + "last_updated": "2026-02-16", "type": "chat" }, { - "id": "thinkingmachines/inkling-small", - "name": "Inkling Small", - "display_name": "Inkling Small", + "id": "qwen/qwen3.5-9b", + "name": "Qwen3.5 9B", + "display_name": "Qwen3.5 9B", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 1000000 + "context": 262144, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -171799,109 +164189,91 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "none", - "minimal", - "low", - "medium", - "high", - "xhigh", - "max" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, "attachment": true, "open_weights": true, - "release_date": "2026-07-30", - "last_updated": "2026-07-30", + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" }, { - "id": "thinkingmachines/inkling", - "name": "Inkling", - "display_name": "Inkling", + "id": "qwen/qwen2.5-coder-32b-instruct", + "name": "Qwen 2.5 Coder 32b", + "display_name": "Qwen 2.5 Coder 32b", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 256000 + "context": 32000, + "output": 8192 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "minimal", - "low", - "medium", - "high", - "xhigh", - "max" - ] - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-07-15", - "last_updated": "2026-07-15", + "release_date": "2024-11-12", + "last_updated": "2024-11-12", "type": "chat" }, { - "id": "interfaze/interfaze-beta", - "name": "Interfaze Beta", - "display_name": "Interfaze Beta", + "id": "qwen/qwen3.7-flash", + "name": "Qwen3.7 Flash", + "display_name": "Qwen3.7 Flash", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 32000 + "context": 991808, + "output": 65536 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ - "low", - "medium", + "none", "high" ] } }, "attachment": true, "open_weights": false, - "release_date": "2025-10-07", - "last_updated": "2026-04-29", + "release_date": "2026-07-15", + "last_updated": "2026-07-15", "type": "chat" }, { - "id": "perplexity/pplx-embed-v1-4b", - "name": "Embed v1 4b", - "display_name": "Embed v1 4b", + "id": "qwen/qwen-plus", + "name": "Qwen Plus", + "display_name": "Qwen Plus", "modalities": { "input": [ "text" @@ -171911,24 +164283,37 @@ ] }, "limit": { - "context": 32000, - "output": 8192 + "context": 995904, + "output": 32768 }, - "temperature": false, + "temperature": true, "tool_call": false, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, "open_weights": false, - "release_date": "2026-02-26", - "last_updated": "2026-02-26", - "type": "embedding" + "knowledge": "2024-04", + "release_date": "2024-01-25", + "last_updated": "2025-09-11", + "type": "chat" }, { - "id": "perplexity/sonar", - "name": "Sonar", - "display_name": "Sonar", + "id": "qwen/qwen3.8-27b-fable", + "name": "Qwen 3.8 27B Fable", + "display_name": "Qwen 3.8 27B Fable", "modalities": { "input": [ "text", @@ -171939,395 +164324,514 @@ ] }, "limit": { - "context": 127000, - "output": 8000 + "context": 524288, + "output": 32768 }, - "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": true, - "open_weights": false, - "knowledge": "2025-02", - "release_date": "2025-02-19", - "last_updated": "2025-02-19", + "open_weights": true, + "release_date": "2026-07-29", + "last_updated": "2026-08-28", "type": "chat" }, { - "id": "perplexity/pplx-embed-v1-0.6b", - "name": "Embed v1 0.6b", - "display_name": "Embed v1 0.6b", + "id": "qwen/qwen3.8-max", + "name": "Qwen3.8 Max", + "display_name": "Qwen3.8 Max", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 32000, - "output": 8192 + "context": 991000, + "output": 65536 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": true, "open_weights": false, - "release_date": "2026-02-26", - "last_updated": "2026-02-26", - "type": "embedding" + "release_date": "2026-08-03", + "last_updated": "2026-08-03", + "type": "chat" }, { - "id": "microsoft/mai-image-2.6-flash", - "name": "MAI-Image-2.6-Flash", - "display_name": "MAI-Image-2.6-Flash", + "id": "qwen/qwen3.5-397b-a17b:thinking", + "name": "Qwen3.5 397B A17B Thinking", + "display_name": "Qwen3.5 397B A17B Thinking", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ - "image" + "text" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 262144, + "output": 65536 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": false, - "release_date": "2026-10-13", - "last_updated": "2026-10-13" + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": true, + "open_weights": true, + "release_date": "2026-02-15", + "last_updated": "2026-02-15", + "type": "chat" }, { - "id": "microsoft/mai-voice-2", - "name": "MAI-Voice-2", - "display_name": "MAI-Voice-2", + "id": "qwen/qwen-max", + "name": "Qwen 2.5 Max", + "display_name": "Qwen 2.5 Max", "modalities": { "input": [ "text" ], "output": [ - "audio" + "text" ] }, "limit": { - "context": 8192, + "context": 32000, "output": 8192 }, - "temperature": false, + "temperature": true, "tool_call": false, "reasoning": { "supported": false }, "attachment": false, "open_weights": false, - "release_date": "2026-06-02", - "last_updated": "2026-06-02" + "knowledge": "2024-04", + "release_date": "2024-04-03", + "last_updated": "2025-01-25", + "type": "chat" }, { - "id": "microsoft/mai-transcribe-2-streaming", - "name": "MAI-Transcribe-2-Streaming", - "display_name": "MAI-Transcribe-2-Streaming", + "id": "qwen/qwen3.8-27b-uncensored", + "name": "Qwen 3.8 27B Uncensored", + "display_name": "Qwen 3.8 27B Uncensored", "modalities": { "input": [ - "audio" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 1048576, + "output": 65536 }, - "temperature": false, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": true, - "open_weights": false, - "release_date": "2026-10-01", - "last_updated": "2026-10-01" + "open_weights": true, + "release_date": "2026-07-29", + "last_updated": "2026-08-21", + "type": "chat" }, { - "id": "microsoft/mai-voice-2.1", - "name": "MAI-Voice-2.1", - "display_name": "MAI-Voice-2.1", + "id": "qwen/qwen3.8-27b-uncensored:thinking", + "name": "Qwen 3.8 27B Uncensored Thinking", + "display_name": "Qwen 3.8 27B Uncensored Thinking", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ - "audio" + "text" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 1048576, + "output": 65536 }, - "temperature": false, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": false, - "release_date": "2026-10-01", - "last_updated": "2026-10-01" + "attachment": true, + "open_weights": true, + "release_date": "2026-07-29", + "last_updated": "2026-08-25", + "type": "chat" }, { - "id": "microsoft/mai-voice-2.1-flash", - "name": "MAI-Voice-2.1-Flash", - "display_name": "MAI-Voice-2.1-Flash", + "id": "qwen/qwen3-next-80b-a3b-instruct", + "name": "Qwen3 Next 80B A3B (Instruct)", + "display_name": "Qwen3 Next 80B A3B (Instruct)", "modalities": { "input": [ "text" ], "output": [ - "audio" + "text" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 262144, + "output": 32768 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2026-10-01", - "last_updated": "2026-10-01" + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-09", + "last_updated": "2025-09", + "type": "chat" }, { - "id": "microsoft/mai-transcribe-2", - "name": "MAI-Transcribe 2", - "display_name": "MAI-Transcribe 2", + "id": "qwen/qwen3.6-flash", + "name": "Qwen3.6 Flash", + "display_name": "Qwen3.6 Flash", "modalities": { "input": [ - "audio" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 991808, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": false, "reasoning": { - "supported": false + "supported": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": true, "open_weights": false, - "release_date": "2026-09-03", - "last_updated": "2026-09-03" + "release_date": "2026-04-27", + "last_updated": "2026-04-27", + "type": "chat" }, { - "id": "microsoft/mai-voice-2-flash", - "name": "MAI-Voice-2-Flash", - "display_name": "MAI-Voice-2-Flash", + "id": "qwen/qwen3.7-max:thinking", + "name": "Qwen3.7 Max Thinking", + "display_name": "Qwen3.7 Max Thinking", "modalities": { "input": [ "text" ], "output": [ - "audio" + "text" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 1000000, + "output": 65536 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "high" + ] + } }, "attachment": false, "open_weights": false, - "release_date": "2026-07-23", - "last_updated": "2026-07-23" + "release_date": "2026-05-21", + "last_updated": "2026-05-21", + "type": "chat" }, { - "id": "microsoft/mai-image-2.6", - "name": "MAI-Image-2.6", - "display_name": "MAI-Image-2.6", + "id": "qwen/qwen3.6-35b-a3b", + "name": "Qwen3.6 35B A3B", + "display_name": "Qwen3.6 35B A3B", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ - "image" + "text" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 1048576, + "output": 16384 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true }, - "attachment": false, - "open_weights": false, - "release_date": "2026-10-13", - "last_updated": "2026-10-13" + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": true, + "open_weights": true, + "release_date": "2026-04-17", + "last_updated": "2026-04-17", + "type": "chat" }, { - "id": "bytedance/seedream-5.0-pro", - "name": "Seedream 5.0 Pro", - "display_name": "Seedream 5.0 Pro", + "id": "qwen/qwen3.6-27b:thinking", + "name": "Qwen3.6 27B Thinking", + "display_name": "Qwen3.6 27B Thinking", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ - "image" + "text" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 262144, + "output": 65536 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": false, - "release_date": "2026-07-11", - "last_updated": "2026-07-11" + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": true, + "open_weights": true, + "release_date": "2026-04-22", + "last_updated": "2026-04-22", + "type": "chat" }, { - "id": "bytedance/seedance-v1.5-pro", - "name": "Seedance v1.5 Pro", - "display_name": "Seedance v1.5 Pro", + "id": "qwen/qwen3.8-omni-flash", + "name": "Qwen3.8 Omni Flash", + "display_name": "Qwen3.8 Omni Flash", "modalities": { "input": [ "text", - "image" + "image", + "audio", + "video" ], "output": [ - "video" + "text" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 991808, + "output": 131072 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "high" + ] + } }, "attachment": true, "open_weights": false, - "release_date": "2025-12-16", - "last_updated": "2025-12-16" + "release_date": "2026-09-17", + "last_updated": "2026-09-17", + "type": "chat" }, { - "id": "bytedance/seedance-2.0-fast", - "name": "Seedance 2.0 Fast", - "display_name": "Seedance 2.0 Fast", + "id": "qwen/qwen3.7-plus:thinking", + "name": "Qwen3.7 Plus Thinking", + "display_name": "Qwen3.7 Plus Thinking", "modalities": { "input": [ "text", "image", - "video", - "audio" + "video" ], "output": [ - "video" + "text" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 983616, + "output": 65536 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "high" + ] + } }, "attachment": true, "open_weights": false, - "release_date": "2026-04-14", - "last_updated": "2026-04-14" + "knowledge": "2025-04", + "release_date": "2026-06-02", + "last_updated": "2026-06-02", + "type": "chat" }, { - "id": "bytedance/seedream-4.5", - "name": "Seedream 4.5", - "display_name": "Seedream 4.5", + "id": "qwen/qwen3-next-80b-a3b-thinking", + "name": "Qwen3 Next 80B A3B (Thinking)", + "display_name": "Qwen3 Next 80B A3B (Thinking)", "modalities": { "input": [ "text" ], "output": [ - "image" + "text" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 256000, + "output": 32768 }, - "temperature": false, + "temperature": true, "tool_call": false, "reasoning": { - "supported": false + "supported": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, - "open_weights": false, - "release_date": "2025-12-03", - "last_updated": "2025-11-28" + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-09", + "last_updated": "2025-09", + "type": "chat" }, { - "id": "bytedance/seedance-2.0", - "name": "Seedance 2.0", - "display_name": "Seedance 2.0", + "id": "qwen/qwen3-coder-30b-a3b-instruct", + "name": "Qwen3 Coder 30B A3B Instruct", + "display_name": "Qwen3 Coder 30B A3B Instruct", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ - "video" + "text" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 128000, + "output": 65536 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": false }, - "attachment": true, - "open_weights": false, - "release_date": "2026-02-12", - "last_updated": "2026-10-04" + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-07-31", + "last_updated": "2025-07-31", + "type": "chat" }, { - "id": "bytedance/seed-1.8", - "name": "Seed 1.8", - "display_name": "Seed 1.8", + "id": "qwen/qwen3.8-27b-hemmingway", + "name": "Qwen 3.8 27B Hemingway", + "display_name": "Qwen 3.8 27B Hemingway", "modalities": { "input": [ "text", @@ -172338,225 +164842,205 @@ ] }, "limit": { - "context": 256000, + "context": 262144, "output": 32768 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "minimal", - "low", - "medium", - "high" - ] - } - }, "attachment": true, - "open_weights": false, - "release_date": "2025-12-28", - "last_updated": "2025-12-28", + "open_weights": true, + "release_date": "2026-09-21", + "last_updated": "2026-09-21", "type": "chat" }, { - "id": "bytedance/seedance-2.0-mini", - "name": "Seedance 2.0 Mini", - "display_name": "Seedance 2.0 Mini", + "id": "qwen/qwen3.8-27b-swift", + "name": "Qwen 3.8 27B Swift", + "display_name": "Qwen 3.8 27B Swift", "modalities": { "input": [ "text", - "image", - "video", - "audio" + "image" ], "output": [ - "video" + "text" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 262144, + "output": 32768 }, - "temperature": false, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": true, - "open_weights": false, - "release_date": "2026-06-22", - "last_updated": "2026-06-22" + "open_weights": true, + "release_date": "2026-10-05", + "last_updated": "2026-10-05", + "type": "chat" }, { - "id": "bytedance/seedance-v1.0-pro-fast", - "name": "Seedance v1.0 Pro Fast", - "display_name": "Seedance v1.0 Pro Fast", + "id": "qwen/qwen3.8-max:thinking", + "name": "Qwen3.8 Max Thinking", + "display_name": "Qwen3.8 Max Thinking", "modalities": { "input": [ "text", - "image" + "image", + "video", + "pdf" ], "output": [ - "video" + "text" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 991000, + "output": 131072 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "high", + "max" + ] + } }, "attachment": true, "open_weights": false, - "release_date": "2025-10-24", - "last_updated": "2025-10-31" + "release_date": "2026-08-03", + "last_updated": "2026-08-03", + "type": "chat" }, { - "id": "bytedance/seedream-4.0", - "name": "Seedream 4.0", - "display_name": "Seedream 4.0", + "id": "qwen/qwen-long", + "name": "Qwen Long 10M", + "display_name": "Qwen Long 10M", "modalities": { "input": [ "text" ], "output": [ - "image" - ] - }, - "limit": { - "context": 8192, - "output": 8192 - }, - "temperature": false, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": false, - "release_date": "2025-09-09", - "last_updated": "2025-08-28" - }, - { - "id": "bytedance/seedream-5.0-lite", - "name": "Seedream 5.0 Lite", - "display_name": "Seedream 5.0 Lite", - "modalities": { - "input": [ "text" - ], - "output": [ - "image" ] }, "limit": { - "context": 8192, + "context": 10000000, "output": 8192 }, - "temperature": false, "tool_call": false, "reasoning": { "supported": false }, "attachment": false, "open_weights": false, - "release_date": "2026-02-13", - "last_updated": "2026-01-28" + "release_date": "2024-08-01", + "last_updated": "2024-08-01", + "type": "chat" }, { - "id": "bytedance/seed-1.6", - "name": "Seed 1.6", - "display_name": "Seed 1.6", + "id": "qwen/qwen3-coder", + "name": "Qwen 3 Coder 480B", + "display_name": "Qwen 3 Coder 480B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 32000 + "context": 262000, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": true, - "open_weights": false, - "release_date": "2025-10-15", - "last_updated": "2025-10-15", + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-07-22", + "last_updated": "2025-07-22", "type": "chat" - }, - { - "id": "bytedance/seedance-2.5", - "name": "Seedance 2.5", - "display_name": "Seedance 2.5", + }, + { + "id": "qwen/qwen3-coder-flash", + "name": "Qwen3 Coder Flash", + "display_name": "Qwen3 Coder Flash", "modalities": { "input": [ "text" ], "output": [ - "video" + "text" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 128000, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": false, "reasoning": { "supported": false }, "attachment": false, "open_weights": false, - "release_date": "2026-07-31", - "last_updated": "2026-10-04" + "knowledge": "2025-04", + "release_date": "2025-07-28", + "last_updated": "2025-07-28", + "type": "chat" }, { - "id": "bytedance/seedance-v1.0-pro", - "name": "Seedance v1.0 Pro", - "display_name": "Seedance v1.0 Pro", + "id": "qwen/qwen3.8-27b:thinking", + "name": "Qwen3.8 27B Thinking", + "display_name": "Qwen3.8 27B Thinking", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ - "video" + "text" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 1048576, + "output": 32768 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": true, - "open_weights": false, - "release_date": "2025-06-11", - "last_updated": "2025-06-11" + "open_weights": true, + "release_date": "2026-08-14", + "last_updated": "2026-08-14", + "type": "chat" }, { - "id": "bytedance/seed-2.1-turbo", - "name": "Seed 2.1 Turbo", - "display_name": "Seed 2.1 Turbo", + "id": "qwen/qwen3.8-27b-fimi", + "name": "Qwen 3.8 27B Fimi", + "display_name": "Qwen 3.8 27B Fimi", "modalities": { "input": [ "text", @@ -172568,242 +165052,253 @@ }, "limit": { "context": 262144, - "output": 262144 + "output": 32768 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "high" - ] - } - }, "attachment": true, - "open_weights": false, - "release_date": "2026-06-23", - "last_updated": "2026-06-23", + "open_weights": true, + "release_date": "2026-10-05", + "last_updated": "2026-10-05", "type": "chat" }, { - "id": "stealth/glyph-cluster", - "name": "Glyph Cluster", - "display_name": "Glyph Cluster", + "id": "qwen/qwen3-32b", + "name": "Qwen 3 32b", + "display_name": "Qwen 3 32b", "modalities": { "input": [ - "text" + "text", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 256000 + "context": 41000, + "output": 32768 }, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": true }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "xhigh" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, - "attachment": false, - "open_weights": false, - "release_date": "2026-10-07", - "last_updated": "2026-10-07", + "attachment": true, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-04-28", + "last_updated": "2025-04-28", "type": "chat" }, { - "id": "inception/mercury-3", - "name": "Mercury 3", - "display_name": "Mercury 3", + "id": "qwen/qwen3.8-27b-kimiko", + "name": "Qwen 3.8 27B Kimiko", + "display_name": "Qwen 3.8 27B Kimiko", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 262144, + "output": 32768 }, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": false, - "open_weights": false, - "release_date": "2026-10-19", - "last_updated": "2026-10-19", + "attachment": true, + "open_weights": true, + "release_date": "2026-10-05", + "last_updated": "2026-10-05", "type": "chat" }, { - "id": "inception/mercury-2", - "name": "Mercury 2", - "display_name": "Mercury 2", + "id": "qwen/qwen3.8-27b-queen", + "name": "Qwen 3.8 27B Queen", + "display_name": "Qwen 3.8 27B Queen", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 50000 + "context": 524288, + "output": 32768 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high" - ] - } - }, - "attachment": false, - "open_weights": false, - "release_date": "2026-02-24", - "last_updated": "2026-02-24", + "attachment": true, + "open_weights": true, + "release_date": "2026-09-09", + "last_updated": "2026-09-09", "type": "chat" }, { - "id": "inception/mercury-coder-small", - "name": "Mercury Coder Small Beta", - "display_name": "Mercury Coder Small Beta", + "id": "qwen/qwen3.5-flash", + "name": "Qwen3.5 Flash", + "display_name": "Qwen3.5 Flash", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 32000, - "output": 16384 + "context": 991808, + "output": 65536 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": false + "supported": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": true, "open_weights": false, - "release_date": "2025-02-26", - "last_updated": "2025-02-26", + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" }, { - "id": "inception/mercury-2.5", - "name": "Mercury 2.5", - "display_name": "Mercury 2.5", + "id": "qwen/qwen3-vl-235b-a22b-thinking", + "name": "Qwen3 VL 235B A22B Thinking", + "display_name": "Qwen3 VL 235B A22B Thinking", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 260000, - "output": 65536 + "context": 131072, + "output": 32768 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "high" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, - "attachment": false, - "open_weights": false, - "release_date": "2026-09-08", - "last_updated": "2026-09-08", + "attachment": true, + "open_weights": true, + "knowledge": "2025-03-31", + "release_date": "2025-09-23", + "last_updated": "2025-09-23", "type": "chat" }, { - "id": "xiaomi/mimo-v2.5", - "name": "MiMo M2.5", - "display_name": "MiMo M2.5", + "id": "qwen/qwen3.5-397b-a17b", + "name": "Qwen3.5 397B A17B", + "display_name": "Qwen3.5 397B A17B", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 131100 + "context": 262144, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": true, "open_weights": true, - "knowledge": "2024-12", - "release_date": "2026-04-22", - "last_updated": "2026-04-22", + "release_date": "2026-02-15", + "last_updated": "2026-02-15", "type": "chat" }, { - "id": "xiaomi/mimo-v2.6-pro", - "name": "MiMo V2.6 Pro", - "display_name": "MiMo V2.6 Pro", + "id": "qwen/qwen3.5-27b:thinking", + "name": "Qwen3.5 27B Thinking", + "display_name": "Qwen3.5 27B Thinking", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 260096, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -172811,160 +165306,148 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "minimal", - "low", - "medium", - "high" - ] - } - }, "attachment": true, "open_weights": true, - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" }, { - "id": "xiaomi/mimo-v2.6-pro-ultraspeed", - "name": "MiMo V2.6 Pro UltraSpeed", - "display_name": "MiMo V2.6 Pro UltraSpeed", + "id": "qwen/qwen-turbo", + "name": "Qwen Turbo", + "display_name": "Qwen Turbo", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 1000000, + "output": 8192 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": true }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "none", - "minimal", - "low", - "medium", - "high" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, - "attachment": true, - "open_weights": true, - "release_date": "2026-09-21", - "last_updated": "2026-09-21", + "attachment": false, + "open_weights": false, + "knowledge": "2024-04", + "release_date": "2024-11-01", + "last_updated": "2025-04-28", "type": "chat" }, { - "id": "xiaomi/mimo-v2.5-pro", - "name": "MiMo V2.5 Pro", - "display_name": "MiMo V2.5 Pro", + "id": "qwen/qwen3.5-27b", + "name": "Qwen3.5 27B", + "display_name": "Qwen3.5 27B", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 131000 + "context": 260096, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": true, "open_weights": true, - "knowledge": "2024-12", - "release_date": "2026-04-22", - "last_updated": "2026-04-22", + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" }, { - "id": "xiaomi/mimo-v2.6-flash", - "name": "MiMo V2.6 Flash", - "display_name": "MiMo V2.6 Flash", + "id": "qwen/qwen3.5-122b-a10b", + "name": "Qwen3.5 122B A10B", + "display_name": "Qwen3.5 122B A10B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 262144, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": true }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "none", - "minimal", - "low", - "medium", - "high" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" - } - ] - }, - "agentrouter": { - "id": "agentrouter", - "name": "AgentRouter", - "display_name": "AgentRouter", - "api": "https://agentrouter.org/v1", - "doc": "https://agentrouter.org/docs/opencode.html", - "models": [ + }, { - "id": "gpt-5.6-sol", - "name": "GPT-5.6 Sol", - "display_name": "GPT-5.6 Sol", + "id": "qwen/qwen3.7-plus", + "name": "Qwen3.7 Plus", + "display_name": "Qwen3.7 Plus", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 991808, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -172973,37 +165456,23 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", "effort_options": [ "none", - "low", - "medium", - "high", - "xhigh", - "max" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", "high" - ], - "visibility": "hidden" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "knowledge": "2025-04", + "release_date": "2026-06-02", + "last_updated": "2026-06-02", "type": "chat" }, { - "id": "deepseek-v4-flash", - "name": "DeepSeek V4 Flash", - "display_name": "DeepSeek V4 Flash", + "id": "qwen/qwen3-235b-a22b-instruct-2507", + "name": "Qwen 3 235b A22B 2507", + "display_name": "Qwen 3 235b A22B 2507", "modalities": { "input": [ "text" @@ -173013,58 +165482,36 @@ ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 262144, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." - ] - } + "supported": false }, "attachment": false, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "release_date": "2025-07-21", + "last_updated": "2025-07-21", "type": "chat" }, { - "id": "glm-5.3", - "name": "GLM-5.3", - "display_name": "GLM-5.3", + "id": "qwen/qwen3.8-flash", + "name": "Qwen3.8 Flash", + "display_name": "Qwen3.8 Flash", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, + "context": 991808, "output": 131072 }, "temperature": true, @@ -173077,38 +165524,37 @@ "reasoning": { "supported": true, "effort_options": [ - "low", - "high", - "max" + "none", + "high" ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "attachment": true, + "open_weights": false, + "release_date": "2026-08-26", + "last_updated": "2026-08-26", "type": "chat" }, { - "id": "claude-opus-5", - "name": "Claude Opus 5", - "display_name": "Claude Opus 5", + "id": "qwen/qwen3.5-flash:thinking", + "name": "Qwen3.5 Flash Thinking", + "display_name": "Qwen3.5 Flash Thinking", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 991808, + "output": 65536 }, - "temperature": false, - "tool_call": true, + "temperature": true, + "tool_call": false, "reasoning": { "supported": true, "default": true @@ -173116,30 +165562,29 @@ "extra_capabilities": { "reasoning": { "supported": true, - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-05", - "release_date": "2026-07-24", - "last_updated": "2026-07-24", + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" }, { - "id": "claude-opus-4-8", - "name": "Claude Opus 4.8", - "display_name": "Claude Opus 4.8", + "id": "qwen/qwen3.8-max-0902", + "name": "Qwen3.8 Max 0902", + "display_name": "Qwen3.8 Max 0902", "modalities": { "input": [ "text", "image", + "video", "pdf" ], "output": [ @@ -173147,88 +165592,66 @@ ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 991808, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "high", "effort_options": [ + "none", "low", "medium", "high", - "xhigh", "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-01", - "release_date": "2026-05-28", - "last_updated": "2026-05-28", + "release_date": "2026-09-02", + "last_updated": "2026-09-02", "type": "chat" - } - ] - }, - "qiniu-ai": { - "id": "qiniu-ai", - "name": "Qiniu", - "display_name": "Qiniu", - "api": "https://api.qnaigc.com/v1", - "doc": "https://developer.qiniu.com/aitokenapi", - "models": [ + }, { - "id": "qwen3-30b-a3b-instruct-2507", - "name": "Qwen3 30b A3b Instruct 2507", - "display_name": "Qwen3 30b A3b Instruct 2507", + "id": "qwen/qwen3.8-27b", + "name": "Qwen3.8 27B", + "display_name": "Qwen3.8 27B", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 32000 + "context": 1048576, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2025-07-28", - "last_updated": "2025-07-28", + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "mimo-v2-flash", - "name": "Mimo-V2-Flash", - "display_name": "Mimo-V2-Flash", + "id": "qwen/qwen3-30b-a3b", + "name": "Qwen3 30B A3B", + "display_name": "Qwen3 30B A3B", "modalities": { "input": [ "text" @@ -173238,26 +165661,35 @@ ] }, "limit": { - "context": 256000, - "output": 256000 + "context": 41000, + "output": 32768 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, "open_weights": true, - "knowledge": "2024-12-01", - "release_date": "2025-12-16", - "last_updated": "2026-02-04", + "release_date": "2025-04-28", + "last_updated": "2025-04-28", "type": "chat" }, { - "id": "qwen3-next-80b-a3b-instruct", - "name": "Qwen3 Next 80B A3B Instruct", - "display_name": "Qwen3 Next 80B A3B Instruct", + "id": "qwen/qwen3.6-max-preview", + "name": "Qwen3.6 Max Preview", + "display_name": "Qwen3.6 Max Preview", "modalities": { "input": [ "text" @@ -173267,64 +165699,65 @@ ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 245760, + "output": 65536 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": false + "supported": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, - "open_weights": true, + "open_weights": false, "knowledge": "2025-04", - "release_date": "2025-09", - "last_updated": "2025-09", + "release_date": "2026-04-20", + "last_updated": "2026-04-20", "type": "chat" }, { - "id": "deepseek-r1-0528", - "name": "DeepSeek-R1-0528", - "display_name": "DeepSeek-R1-0528", + "id": "qwen/qwen3-vl-235b-a22b-instruct", + "name": "Qwen3 VL 235B A22B Instruct", + "display_name": "Qwen3 VL 235B A22B Instruct", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 32000 + "context": 131072, + "output": 32768 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2025-05-28", - "last_updated": "2025-05-28", + "knowledge": "2025-03-31", + "release_date": "2025-09-23", + "last_updated": "2025-09-23", "type": "chat" }, { - "id": "qwen3.5-397b-a17b", - "name": "Qwen3.5 397B A17B", - "display_name": "Qwen3.5 397B A17B", + "id": "qwen/qwen3.8-27b-darkidol", + "name": "Qwen 3.8 27B DarkIdol", + "display_name": "Qwen 3.8 27B DarkIdol", "modalities": { "input": [ "text", @@ -173335,36 +165768,24 @@ ] }, "limit": { - "context": 256000, - "output": 64000 + "context": 262144, + "output": 32768 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, "attachment": true, "open_weights": true, - "release_date": "2026-02-15", - "last_updated": "2026-02-15", + "release_date": "2026-10-05", + "last_updated": "2026-10-05", "type": "chat" }, { - "id": "claude-4.5-sonnet", - "name": "Claude 4.5 Sonnet", - "display_name": "Claude 4.5 Sonnet", + "id": "qwen/qwen3.8-27b-antislop", + "name": "Qwen 3.8 27B Antislop", + "display_name": "Qwen 3.8 27B Antislop", "modalities": { "input": [ "text", @@ -173375,56 +165796,52 @@ ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 262144, + "output": 32768 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, "attachment": true, - "open_weights": false, - "knowledge": "2025-07-31", - "release_date": "2025-09-29", - "last_updated": "2025-09-29", + "open_weights": true, + "release_date": "2026-10-05", + "last_updated": "2026-10-05", "type": "chat" }, { - "id": "doubao-seed-2.0-pro", - "name": "Doubao Seed 2.0 Pro", - "display_name": "Doubao Seed 2.0 Pro", + "id": "qwen/qwen3.8-27b-novelist", + "name": "Qwen 3.8 27B Novelist", + "display_name": "Qwen 3.8 27B Novelist", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 128000 + "context": 262144, + "output": 32768 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, "attachment": true, - "open_weights": false, - "release_date": "2026-02-14", - "last_updated": "2026-02-14", + "open_weights": true, + "release_date": "2026-10-05", + "last_updated": "2026-10-05", "type": "chat" }, { - "id": "deepseek-v3.1", - "name": "DeepSeek-V3.1", - "display_name": "DeepSeek-V3.1", + "id": "nothingiisreal/L3.1-70B-Celeste-V0.1-BF16", + "name": "Llama 3.1 70B Celeste v0.1", + "display_name": "Llama 3.1 70B Celeste v0.1", "modalities": { "input": [ "text" @@ -173434,30 +165851,27 @@ ] }, "limit": { - "context": 128000, - "output": 32000 + "context": 32768, + "output": 16384 }, - "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, "open_weights": true, - "release_date": "2025-08-21", - "last_updated": "2025-08-21", + "release_date": "2024-01-01", + "last_updated": "2024-07-23", "type": "chat" }, { - "id": "doubao-seed-1.6-flash", - "name": "Doubao-Seed 1.6 Flash", - "display_name": "Doubao-Seed 1.6 Flash", + "id": "x-ai/grok-build-0.1", + "name": "Grok Build 0.1", + "display_name": "Grok Build 0.1", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" @@ -173465,7 +165879,7 @@ }, "limit": { "context": 256000, - "output": 32000 + "output": 230400 }, "temperature": true, "tool_call": true, @@ -173473,55 +165887,79 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "low", + "medium", + "high" + ] + } + }, "attachment": true, "open_weights": false, - "release_date": "2025-08-28", - "last_updated": "2025-08-28", + "release_date": "2026-04-16", + "last_updated": "2026-04-16", "type": "chat" }, { - "id": "kling-v2-6", - "name": "Kling-V2 6", - "display_name": "Kling-V2 6", + "id": "x-ai/grok-4.6", + "name": "Grok 4.6", + "display_name": "Grok 4.6", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ - "video" + "text" ] }, "limit": { - "context": 99999999, - "output": 99999999 + "context": 500000, + "output": 450000 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "low", + "medium", + "high", + "xhigh" + ] + } }, "attachment": true, "open_weights": false, - "release_date": "2026-01-13", - "last_updated": "2026-01-13" + "knowledge": "2026-02-01", + "release_date": "2026-08-12", + "last_updated": "2026-08-12", + "type": "chat" }, { - "id": "qwen3-235b-a22b-thinking-2507", - "name": "Qwen3 235B A22B Thinking 2507", - "display_name": "Qwen3 235B A22B Thinking 2507", + "id": "x-ai/grok-4.5", + "name": "Grok 4.5", + "display_name": "Grok 4.5", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 4096 + "context": 500000, + "output": 450000 }, "temperature": true, "tool_call": true, @@ -173532,24 +165970,23 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "low", + "medium", + "high" ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2025-07-25", - "last_updated": "2025-07-25", + "attachment": true, + "open_weights": false, + "release_date": "2026-07-08", + "last_updated": "2026-07-08", "type": "chat" }, { - "id": "claude-3.5-haiku", - "name": "Claude 3.5 Haiku", - "display_name": "Claude 3.5 Haiku", + "id": "x-ai/grok-4.20-multi-agent", + "name": "Grok 4.20 Multi-Agent", + "display_name": "Grok 4.20 Multi-Agent", "modalities": { "input": [ "text", @@ -173560,41 +165997,47 @@ ] }, "limit": { - "context": 200000, - "output": 8192 + "context": 2000000, + "output": 131072 }, - "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "high", + "xhigh" + ] + } }, "attachment": true, "open_weights": false, - "knowledge": "2024-07-31", - "release_date": "2024-10-22", - "last_updated": "2024-10-22", + "release_date": "2026-03-31", + "last_updated": "2026-03-31", "type": "chat" }, { - "id": "gemini-2.5-pro", - "name": "Gemini 2.5 Pro", - "display_name": "Gemini 2.5 Pro", + "id": "x-ai/grok-latest", + "name": "Grok Latest", + "display_name": "Grok Latest", "modalities": { "input": [ "text", - "image", - "video", - "audio" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 500000, + "output": 450000 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -173602,47 +166045,37 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "budget", - "budget": { - "default": -1, - "min": 128, - "max": 32768, - "auto": -1, - "unit": "tokens" - }, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" + "effort_options": [ + "low", + "medium", + "high", + "xhigh" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-06-17", - "last_updated": "2025-06-17", + "release_date": "2026-05-03", + "last_updated": "2026-05-03", "type": "chat" }, { - "id": "qwen3-235b-a22b", - "name": "Qwen 3 235B A22B", - "display_name": "Qwen 3 235B A22B", + "id": "x-ai/grok-4.20", + "name": "Grok 4.20", + "display_name": "Grok 4.20", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 32000 + "context": 2000000, + "output": 131072 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -173650,37 +166083,35 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "low", + "medium", + "high" ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-04-28", - "last_updated": "2025-04-28", + "attachment": true, + "open_weights": false, + "release_date": "2026-03-31", + "last_updated": "2026-03-31", "type": "chat" }, { - "id": "qwen3-30b-a3b-thinking-2507", - "name": "Qwen3 30b A3b Thinking 2507", - "display_name": "Qwen3 30b A3b Thinking 2507", + "id": "x-ai/grok-4.3", + "name": "Grok 4.3", + "display_name": "Grok 4.3", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 126000, - "output": 32000 + "context": 1000000, + "output": 900000 }, "temperature": true, "tool_call": true, @@ -173691,37 +166122,35 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "low", + "medium", + "high" ] } }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-02-04", - "last_updated": "2026-02-04", + "release_date": "2026-04-17", + "last_updated": "2026-04-17", "type": "chat" }, { - "id": "qwen3-vl-30b-a3b-thinking", - "name": "Qwen3-Vl 30b A3b Thinking", - "display_name": "Qwen3-Vl 30b A3b Thinking", + "id": "x-ai/grok-4.7", + "name": "Grok 4.7", + "display_name": "Grok 4.7", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 32000 + "context": 500000, + "output": 500000 }, "temperature": true, "tool_call": true, @@ -173731,25 +166160,25 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "low", + "medium", + "high", + "xhigh" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-02-09", - "last_updated": "2026-02-09", + "knowledge": "2026-05", + "release_date": "2026-09-21", + "last_updated": "2026-09-21", "type": "chat" }, { - "id": "claude-4.0-opus", - "name": "Claude 4.0 Opus", - "display_name": "Claude 4.0 Opus", + "id": "fireworks/ember-1", + "name": "Ember 1", + "display_name": "Ember 1", "modalities": { "input": [ "text", @@ -173760,8 +166189,8 @@ ] }, "limit": { - "context": 200000, - "output": 32000 + "context": 1048576, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -173769,17 +166198,26 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "low", + "high", + "max" + ] + } + }, "attachment": true, "open_weights": false, - "knowledge": "2025-03-31", - "release_date": "2025-05-22", - "last_updated": "2025-05-22", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "kimi-k2", - "name": "Kimi K2", - "display_name": "Kimi K2", + "id": "arcee-ai/trinity-large-thinking", + "name": "Trinity Large Thinking", + "display_name": "Trinity Large Thinking", "modalities": { "input": [ "text" @@ -173789,25 +166227,34 @@ ] }, "limit": { - "context": 128000, - "output": 128000 + "context": 262144, + "output": 80000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": false, "open_weights": true, - "knowledge": "2024-12-31", - "release_date": "2025-07-11", - "last_updated": "2025-07-11", + "release_date": "2026-04-01", + "last_updated": "2026-05-28", "type": "chat" - }, + } + ] + }, + "meganova": { + "id": "meganova", + "name": "Meganova", + "display_name": "Meganova", + "api": "https://api.meganova.ai/v1", + "doc": "https://docs.meganova.ai", + "models": [ { - "id": "qwen3-coder-480b-a35b-instruct", - "name": "Qwen3 Coder 480B A35B Instruct", - "display_name": "Qwen3 Coder 480B A35B Instruct", + "id": "meta-llama/Llama-3.3-70B-Instruct", + "name": "Llama 3.3 70B Instruct", + "display_name": "Llama 3.3 70B Instruct", "modalities": { "input": [ "text" @@ -173817,8 +166264,8 @@ ] }, "limit": { - "context": 262000, - "output": 4096 + "context": 131072, + "output": 16384 }, "temperature": true, "tool_call": true, @@ -173827,45 +166274,15 @@ }, "attachment": false, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-07-22", - "last_updated": "2025-07-22", - "type": "chat" - }, - { - "id": "doubao-seed-2.0-code", - "name": "Doubao Seed 2.0 Code", - "display_name": "Doubao Seed 2.0 Code", - "modalities": { - "input": [ - "text", - "image", - "video" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 256000, - "output": 128000 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "attachment": true, - "open_weights": false, - "release_date": "2026-02-14", - "last_updated": "2026-02-14", + "knowledge": "2023-12", + "release_date": "2024-12-06", + "last_updated": "2024-12-06", "type": "chat" }, { - "id": "glm-4.5-air", - "name": "GLM 4.5 Air", - "display_name": "GLM 4.5 Air", + "id": "moonshotai/Kimi-K2-Thinking", + "name": "Kimi K2 Thinking", + "display_name": "Kimi K2 Thinking", "modalities": { "input": [ "text" @@ -173875,8 +166292,8 @@ ] }, "limit": { - "context": 131000, - "output": 4096 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, @@ -173884,17 +166301,28 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, "attachment": false, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-07-28", - "last_updated": "2025-07-28", + "knowledge": "2024-08", + "release_date": "2025-11-06", + "last_updated": "2025-11-06", "type": "chat" }, { - "id": "claude-3.7-sonnet", - "name": "Claude 3.7 Sonnet", - "display_name": "Claude 3.7 Sonnet", + "id": "moonshotai/Kimi-K2.5", + "name": "Kimi K2.5", + "display_name": "Kimi K2.5", "modalities": { "input": [ "text", @@ -173905,76 +166333,76 @@ ] }, "limit": { - "context": 200000, - "output": 128000 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": false, - "summaries": false, - "visibility": "full", + "interleaved": true, + "summaries": true, + "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Anthropic uses thinking budget tokens" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2024-10-31", - "release_date": "2025-02-19", - "last_updated": "2025-02-19", + "open_weights": true, + "knowledge": "2026-01", + "release_date": "2026-01-27", + "last_updated": "2026-01-27", "type": "chat" }, { - "id": "qwen-vl-max-2025-01-25", - "name": "Qwen VL-MAX-2025-01-25", - "display_name": "Qwen VL-MAX-2025-01-25", + "id": "MiniMaxAI/MiniMax-M2.5", + "name": "MiniMax M2.5", + "display_name": "MiniMax M2.5", "modalities": { "input": [ - "text", - "image", - "audio", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 204800, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, - "open_weights": false, - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, + "open_weights": true, + "release_date": "2026-02-12", + "last_updated": "2026-02-12", "type": "chat" }, { - "id": "qwen3-max-preview", - "name": "Qwen3 Max Preview", - "display_name": "Qwen3 Max Preview", + "id": "MiniMaxAI/MiniMax-M2.1", + "name": "MiniMax M2.1", + "display_name": "MiniMax M2.1", "modalities": { "input": [ "text" @@ -173984,13 +166412,14 @@ ] }, "limit": { - "context": 256000, - "output": 64000 + "context": 196608, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { @@ -174004,49 +166433,47 @@ } }, "attachment": false, - "open_weights": false, - "knowledge": "2025-04", - "release_date": "2025-09-05", - "last_updated": "2025-09-23", + "open_weights": true, + "release_date": "2025-12-23", + "last_updated": "2025-12-23", "type": "chat" }, { - "id": "claude-4.0-sonnet", - "name": "Claude 4.0 Sonnet", - "display_name": "Claude 4.0 Sonnet", + "id": "Qwen/Qwen3-235B-A22B-Instruct-2507", + "name": "Qwen3 235B A22B Instruct 2507", + "display_name": "Qwen3 235B A22B Instruct 2507", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 262000, + "output": 262000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-03-31", - "release_date": "2025-05-22", - "last_updated": "2025-05-22", + "attachment": false, + "open_weights": true, + "release_date": "2025-07-21", + "last_updated": "2025-07-21", "type": "chat" }, { - "id": "qwen-turbo", - "name": "Qwen-Turbo", - "display_name": "Qwen-Turbo", + "id": "Qwen/Qwen3.5-Plus", + "name": "Qwen3.5 Plus", + "display_name": "Qwen3.5 Plus", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" @@ -174054,7 +166481,7 @@ }, "limit": { "context": 1000000, - "output": 4096 + "output": 65536 }, "temperature": true, "tool_call": true, @@ -174073,31 +166500,29 @@ ] } }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2024-04", - "release_date": "2024-11-01", - "last_updated": "2025-04-28", + "knowledge": "2025-04", + "release_date": "2026-02-16", + "last_updated": "2026-02-16", "type": "chat" }, { - "id": "gemini-2.0-flash-lite", - "name": "Gemini 2.0 Flash Lite", - "display_name": "Gemini 2.0 Flash Lite", + "id": "Qwen/Qwen2.5-VL-32B-Instruct", + "name": "Qwen2.5 VL 32B Instruct", + "display_name": "Qwen2.5 VL 32B Instruct", "modalities": { "input": [ "text", - "image", - "audio", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 8192 + "context": 16384, + "output": 16384 }, "temperature": true, "tool_call": true, @@ -174105,16 +166530,15 @@ "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2024-06", - "release_date": "2024-12-11", - "last_updated": "2024-12-11", + "open_weights": true, + "release_date": "2025-03-24", + "last_updated": "2025-03-24", "type": "chat" }, { - "id": "qwen3-max", - "name": "Qwen3 Max", - "display_name": "Qwen3 Max", + "id": "zai-org/GLM-5", + "name": "GLM-5", + "display_name": "GLM-5", "modalities": { "input": [ "text" @@ -174124,13 +166548,14 @@ ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 202752, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { @@ -174144,44 +166569,55 @@ } }, "attachment": false, - "open_weights": false, - "knowledge": "2025-04", - "release_date": "2025-09-23", - "last_updated": "2025-09-23", + "open_weights": true, + "release_date": "2026-02-12", + "last_updated": "2026-02-12", "type": "chat" }, { - "id": "gemini-2.5-flash-image", - "name": "Gemini 2.5 Flash Image", - "display_name": "Gemini 2.5 Flash Image", + "id": "zai-org/GLM-4.7", + "name": "GLM-4.7", + "display_name": "GLM-4.7", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ - "image" + "text" ] }, "limit": { - "context": 32768, - "output": 8192 + "context": 202752, + "output": 131072 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-06", - "release_date": "2025-08-26", - "last_updated": "2025-08-26" + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-12-22", + "last_updated": "2025-12-22", + "type": "chat" }, { - "id": "doubao-1.5-thinking-pro", - "name": "Doubao 1.5 Thinking Pro", - "display_name": "Doubao 1.5 Thinking Pro", + "id": "zai-org/GLM-4.6", + "name": "GLM-4.6", + "display_name": "GLM-4.6", "modalities": { "input": [ "text" @@ -174191,8 +166627,8 @@ ] }, "limit": { - "context": 128000, - "output": 16000 + "context": 202752, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -174200,16 +166636,28 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, "attachment": false, - "open_weights": false, - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-09-30", + "last_updated": "2025-09-30", "type": "chat" }, { - "id": "qwen-max-2025-01-25", - "name": "Qwen2.5-Max-2025-01-25", - "display_name": "Qwen2.5-Max-2025-01-25", + "id": "deepseek-ai/DeepSeek-V3-0324", + "name": "DeepSeek V3 0324", + "display_name": "DeepSeek V3 0324", "modalities": { "input": [ "text" @@ -174219,8 +166667,8 @@ ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 163840, + "output": 163840 }, "temperature": true, "tool_call": true, @@ -174228,16 +166676,15 @@ "supported": false }, "attachment": false, - "open_weights": false, - "knowledge": "2024-04", - "release_date": "2024-04-03", - "last_updated": "2025-01-25", + "open_weights": true, + "release_date": "2025-03-24", + "last_updated": "2025-03-24", "type": "chat" }, { - "id": "MiniMax-M1", - "name": "MiniMax M1", - "display_name": "MiniMax M1", + "id": "deepseek-ai/DeepSeek-V3.2-Exp", + "name": "DeepSeek V3.2 Exp", + "display_name": "DeepSeek V3.2 Exp", "modalities": { "input": [ "text" @@ -174247,42 +166694,38 @@ ] }, "limit": { - "context": 1000000, - "output": 80000 + "context": 164000, + "output": 164000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, "open_weights": true, - "release_date": "2025-06-17", - "last_updated": "2025-06-17", + "release_date": "2025-10-10", + "last_updated": "2025-10-10", "type": "chat" }, { - "id": "gemini-2.5-flash", - "name": "Gemini 2.5 Flash", - "display_name": "Gemini 2.5 Flash", + "id": "deepseek-ai/DeepSeek-R1-0528", + "name": "DeepSeek R1 0528", + "display_name": "DeepSeek R1 0528", "modalities": { "input": [ - "text", - "image", - "audio", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, + "context": 163840, "output": 64000 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true @@ -174290,34 +166733,25 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "budget", - "budget": { - "default": -1, - "min": 0, - "max": 24576, - "auto": -1, - "off": 0, - "unit": "tokens" - }, + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-06-17", - "last_updated": "2025-06-17", + "attachment": false, + "open_weights": true, + "knowledge": "2024-07", + "release_date": "2025-05-28", + "last_updated": "2025-05-28", "type": "chat" }, { - "id": "deepseek-v3", - "name": "DeepSeek-V3", - "display_name": "DeepSeek-V3", + "id": "deepseek-ai/DeepSeek-V3.2", + "name": "DeepSeek V3.2", + "display_name": "DeepSeek V3.2", "modalities": { "input": [ "text" @@ -174327,54 +166761,57 @@ ] }, "limit": { - "context": 128000, - "output": 16000 + "context": 164000, + "output": 164000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": false, "open_weights": true, - "release_date": "2024-12-26", - "last_updated": "2024-12-26", + "knowledge": "2024-07", + "release_date": "2025-12-01", + "last_updated": "2025-12-01", "type": "chat" }, { - "id": "claude-4.5-opus", - "name": "Claude 4.5 Opus", - "display_name": "Claude 4.5 Opus", + "id": "deepseek-ai/DeepSeek-V3.1", + "name": "DeepSeek V3.1", + "display_name": "DeepSeek V3.1", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 200000 + "context": 164000, + "output": 164000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-05", - "release_date": "2025-11-24", - "last_updated": "2025-11-24", + "attachment": false, + "open_weights": true, + "release_date": "2025-08-21", + "last_updated": "2025-08-21", "type": "chat" }, { - "id": "qwen3-32b", - "name": "Qwen3 32B", - "display_name": "Qwen3 32B", + "id": "XiaomiMiMo/MiMo-V2-Flash", + "name": "MiMo V2 Flash", + "display_name": "MiMo V2 Flash", "modalities": { "input": [ "text" @@ -174384,8 +166821,8 @@ ] }, "limit": { - "context": 40000, - "output": 4096 + "context": 262144, + "output": 32000 }, "temperature": true, "tool_call": true, @@ -174393,87 +166830,82 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, "attachment": false, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-04-28", - "last_updated": "2025-04-28", + "knowledge": "2024-12-01", + "release_date": "2025-12-16", + "last_updated": "2026-02-04", "type": "chat" }, { - "id": "claude-4.5-haiku", - "name": "Claude 4.5 Haiku", - "display_name": "Claude 4.5 Haiku", + "id": "mistralai/Mistral-Nemo-Instruct-2407", + "name": "Mistral Nemo Instruct 2407", + "display_name": "Mistral Nemo Instruct 2407", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 131072, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-02-28", - "release_date": "2025-10-15", - "last_updated": "2025-10-15", + "attachment": false, + "open_weights": true, + "knowledge": "2024-07", + "release_date": "2024-07-18", + "last_updated": "2024-07-18", "type": "chat" }, { - "id": "doubao-1.5-vision-pro", - "name": "Doubao 1.5 Vision Pro", - "display_name": "Doubao 1.5 Vision Pro", + "id": "mistralai/Mistral-Small-3.2-24B-Instruct-2506", + "name": "Mistral Small 3.2 24B Instruct", + "display_name": "Mistral Small 3.2 24B Instruct", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16000 + "context": 32768, + "output": 8192 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, "attachment": true, - "open_weights": false, - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "open_weights": true, + "knowledge": "2024-10", + "release_date": "2025-06-20", + "last_updated": "2025-06-20", "type": "chat" - }, + } + ] + }, + "togetherai": { + "id": "togetherai", + "name": "Together AI", + "display_name": "Together AI", + "doc": "https://docs.together.ai/docs/serverless-models", + "models": [ { - "id": "doubao-1.5-pro-32k", - "name": "Doubao 1.5 Pro 32k", - "display_name": "Doubao 1.5 Pro 32k", + "id": "meta-llama/Llama-3.3-70B-Instruct-Turbo", + "name": "Llama 3.3 70B", + "display_name": "Llama 3.3 70B", "modalities": { "input": [ "text" @@ -174483,8 +166915,8 @@ ] }, "limit": { - "context": 128000, - "output": 12000 + "context": 131072, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -174492,15 +166924,16 @@ "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "open_weights": true, + "knowledge": "2023-12", + "release_date": "2024-12-06", + "last_updated": "2024-12-06", "type": "chat" }, { - "id": "qwen3-next-80b-a3b-thinking", - "name": "Qwen3 Next 80B A3B Thinking", - "display_name": "Qwen3 Next 80B A3B Thinking", + "id": "LiquidAI/LFM2-24B-A2B", + "name": "LFM2-24B-A2B", + "display_name": "LFM2-24B-A2B", "modalities": { "input": [ "text" @@ -174510,43 +166943,28 @@ ] }, "limit": { - "context": 131072, + "context": 32768, "output": 32768 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": false, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-09", - "last_updated": "2025-09", + "release_date": "2026-02-24", + "last_updated": "2026-02-24", "type": "chat" }, { - "id": "gemini-2.5-flash-lite", - "name": "Gemini 2.5 Flash Lite", - "display_name": "Gemini 2.5 Flash Lite", + "id": "moonshotai/Kimi-K3", + "name": "Kimi K3", + "display_name": "Kimi K3", "modalities": { "input": [ "text", - "image", - "audio", - "video" + "image" ], "output": [ "text" @@ -174554,85 +166972,93 @@ }, "limit": { "context": 1048576, - "output": 64000 + "output": 131072 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "default": -1, - "min": 512, - "max": 24576, - "auto": -1, - "unit": "tokens" - }, + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" + ], + "effort_options": [ + "none", + "low", + "high", + "max" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-06-17", - "last_updated": "2025-06-17", + "open_weights": true, + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" }, { - "id": "qwen2.5-vl-72b-instruct", - "name": "Qwen 2.5 VL 72B Instruct", - "display_name": "Qwen 2.5 VL 72B Instruct", + "id": "openai/gpt-oss-120b", + "name": "GPT OSS 120B", + "display_name": "GPT OSS 120B", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 131072, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "low", + "medium", + "high" + ] + } + }, + "attachment": false, "open_weights": true, - "knowledge": "2024-04", - "release_date": "2025-01-26", - "last_updated": "2025-01-26", + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "deepseek-r1", - "name": "DeepSeek-R1", - "display_name": "DeepSeek-R1", + "id": "nvidia/NVIDIA-Nemotron-3.5-Super-VL", + "name": "Nemotron 3.5 Super VL 120B A12B", + "display_name": "Nemotron 3.5 Super VL 120B A12B", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 32000 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, @@ -174651,17 +167077,16 @@ ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2024-07", - "release_date": "2025-01-20", - "last_updated": "2025-05-29", + "release_date": "2026-10-15", + "last_updated": "2026-10-15", "type": "chat" }, { - "id": "gpt-oss-20b", - "name": "gpt-oss-20b", - "display_name": "gpt-oss-20b", + "id": "nvidia/nemotron-3-ultra-550b-a55b", + "name": "Nemotron 3 Ultra 550B A55B", + "display_name": "Nemotron 3 Ultra 550B A55B", "modalities": { "input": [ "text" @@ -174671,8 +167096,8 @@ ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 512300, + "output": 512300 }, "temperature": true, "tool_call": true, @@ -174687,28 +167112,26 @@ }, "attachment": false, "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "knowledge": "2025-09", + "release_date": "2026-06-04", + "last_updated": "2026-06-04", "type": "chat" }, { - "id": "doubao-seed-1.6-thinking", - "name": "Doubao-Seed 1.6 Thinking", - "display_name": "Doubao-Seed 1.6 Thinking", + "id": "MiniMaxAI/MiniMax-M2.7", + "name": "MiniMax-M2.7", + "display_name": "MiniMax-M2.7", "modalities": { "input": [ - "image", - "text", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 32000 + "context": 196608, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -174716,63 +167139,60 @@ "supported": true, "default": true }, - "attachment": true, - "open_weights": false, - "release_date": "2025-08-15", - "last_updated": "2025-08-15", + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, + "open_weights": true, + "release_date": "2026-03-18", + "last_updated": "2026-03-18", "type": "chat" }, { - "id": "gemini-3.0-pro-image-preview", - "name": "Gemini 3.0 Pro Image Preview", - "display_name": "Gemini 3.0 Pro Image Preview", + "id": "MiniMaxAI/MiniMax-M2.5", + "name": "MiniMax-M2.5", + "display_name": "MiniMax-M2.5", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ - "text", - "image" + "text" ] }, "limit": { - "context": 32768, - "output": 8192 + "context": 204800, + "output": 131072 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "low", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] + "supported": true } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-11-20", - "last_updated": "2025-11-20" + "attachment": false, + "open_weights": true, + "release_date": "2026-02-12", + "last_updated": "2026-02-12", + "type": "chat" }, { - "id": "doubao-seed-2.0-mini", - "name": "Doubao Seed 2.0 Mini", - "display_name": "Doubao Seed 2.0 Mini", + "id": "MiniMaxAI/MiniMax-M3", + "name": "MiniMax-M3", + "display_name": "MiniMax-M3", "modalities": { "input": [ "text", @@ -174784,8 +167204,8 @@ ] }, "limit": { - "context": 256000, - "output": 32000 + "context": 524288, + "output": 524288 }, "temperature": true, "tool_call": true, @@ -174793,27 +167213,34 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, "attachment": true, - "open_weights": false, - "release_date": "2026-02-14", - "last_updated": "2026-02-14", + "open_weights": true, + "release_date": "2026-06-01", + "last_updated": "2026-06-01", "type": "chat" }, { - "id": "glm-4.5", - "name": "GLM 4.5", - "display_name": "GLM 4.5", + "id": "meta-models/Muse-Spark-Open-816B-A42B", + "name": "Muse Spark Open", + "display_name": "Muse Spark Open", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 98304 + "context": 1048576, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -174821,17 +167248,35 @@ "supported": true, "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ] + } + }, + "attachment": true, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-07-28", - "last_updated": "2025-07-28", + "knowledge": "2026-01-04", + "release_date": "2026-10-15", + "last_updated": "2026-10-15", "type": "chat" }, { - "id": "qwen3-235b-a22b-instruct-2507", - "name": "Qwen3 235b A22B Instruct 2507", - "display_name": "Qwen3 235b A22B Instruct 2507", + "id": "Qwen/Qwen2.5-7B-Instruct-Turbo", + "name": "Qwen 2.5 7B Instruct Turbo", + "display_name": "Qwen 2.5 7B Instruct Turbo", "modalities": { "input": [ "text" @@ -174841,8 +167286,8 @@ ] }, "limit": { - "context": 262144, - "output": 64000 + "context": 32768, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -174851,21 +167296,17 @@ }, "attachment": false, "open_weights": true, - "release_date": "2025-07-21", - "last_updated": "2025-07-21", + "release_date": "2024-09-19", + "last_updated": "2024-09-19", "type": "chat" }, { - "id": "gemini-3.0-pro-preview", - "name": "Gemini 3.0 Pro Preview", - "display_name": "Gemini 3.0 Pro Preview", + "id": "Qwen/Qwen3.6-Plus", + "name": "Qwen3.6 Plus", + "display_name": "Qwen3.6 Plus", "modalities": { "input": [ - "text", - "image", - "video", - "pdf", - "audio" + "text" ], "output": [ "text" @@ -174873,7 +167314,7 @@ }, "limit": { "context": 1000000, - "output": 64000 + "output": 65536 }, "temperature": true, "tool_call": true, @@ -174884,103 +167325,117 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "low", - "high" - ], + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" ] } }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-11-18", - "last_updated": "2025-11-18", + "knowledge": "2025-04", + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "claude-3.5-sonnet", - "name": "Claude 3.5 Sonnet", - "display_name": "Claude 3.5 Sonnet", + "id": "Qwen/Qwen3.5-9B", + "name": "Qwen3.5 9B", + "display_name": "Qwen3.5 9B", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 8192 + "context": 262144, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": true, - "open_weights": false, - "knowledge": "2024-04-30", - "release_date": "2024-10-22", - "last_updated": "2024-10-22", + "open_weights": true, + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" }, { - "id": "gemini-2.0-flash", - "name": "Gemini 2.0 Flash", - "display_name": "Gemini 2.0 Flash", + "id": "Qwen/Qwen3.5-397B-A17B", + "name": "Qwen3.5 397B A17B", + "display_name": "Qwen3.5 397B A17B", "modalities": { "input": [ "text", - "image", - "audio", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 8192 + "context": 262144, + "output": 130000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": true, - "open_weights": false, - "knowledge": "2024-06", - "release_date": "2024-12-11", - "last_updated": "2024-12-11", + "open_weights": true, + "release_date": "2026-02-15", + "last_updated": "2026-02-15", "type": "chat" }, { - "id": "claude-4.1-opus", - "name": "Claude 4.1 Opus", - "display_name": "Claude 4.1 Opus", + "id": "Qwen/Qwen3.7-Max", + "name": "Qwen3.7 Max", + "display_name": "Qwen3.7 Max", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 32000 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -174988,77 +167443,76 @@ "supported": true, "default": true }, - "attachment": true, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": false, "open_weights": false, - "knowledge": "2025-03-31", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "release_date": "2026-05-21", + "last_updated": "2026-05-21", "type": "chat" }, { - "id": "doubao-seed-2.0-lite", - "name": "Doubao Seed 2.0 Lite", - "display_name": "Doubao Seed 2.0 Lite", + "id": "Qwen/Qwen3-235B-A22B-Instruct-2507-tput", + "name": "Qwen3 235B A22B Instruct 2507 FP8", + "display_name": "Qwen3 235B A22B Instruct 2507 FP8", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 32000 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": true, - "open_weights": false, - "release_date": "2026-02-14", - "last_updated": "2026-02-14", + "attachment": false, + "open_weights": true, + "release_date": "2025-07-21", + "last_updated": "2025-07-21", "type": "chat" }, { - "id": "doubao-seed-1.6", - "name": "Doubao-Seed 1.6", - "display_name": "Doubao-Seed 1.6", + "id": "Qwen/Qwen3-Coder-Next-FP8", + "name": "Qwen3 Coder Next FP8", + "display_name": "Qwen3 Coder Next FP8", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 32000 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": true, - "open_weights": false, - "release_date": "2025-10-15", - "last_updated": "2025-10-15", + "attachment": false, + "open_weights": true, + "knowledge": "2025-09", + "release_date": "2026-02-03", + "last_updated": "2026-02-03", "type": "chat" }, { - "id": "qwen3-30b-a3b", - "name": "Qwen3 30B A3B", - "display_name": "Qwen3 30B A3B", + "id": "Qwen/Qwen3-Coder-480B-A35B-Instruct-FP8", + "name": "Qwen3 Coder 480B A35B Instruct", + "display_name": "Qwen3 Coder 480B A35B Instruct", "modalities": { "input": [ "text" @@ -175068,51 +167522,38 @@ ] }, "limit": { - "context": 40000, - "output": 4096 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": false, "open_weights": true, - "release_date": "2025-04-28", - "last_updated": "2025-04-28", + "knowledge": "2025-04", + "release_date": "2025-07-22", + "last_updated": "2025-07-22", "type": "chat" }, { - "id": "gemini-3.0-flash-preview", - "name": "Gemini 3.0 Flash Preview", - "display_name": "Gemini 3.0 Flash Preview", + "id": "thinkingmachines/Inkling", + "name": "Inkling", + "display_name": "Inkling", "modalities": { "input": [ "text", "image", - "audio", - "video", - "pdf" + "audio" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 64000 + "context": 524288, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -175122,34 +167563,27 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ + "effort_options": [ + "none", "minimal", "low", "medium", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" + "high", + "xhigh", + "max" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-12-17", - "last_updated": "2025-12-17", + "open_weights": true, + "release_date": "2026-07-15", + "last_updated": "2026-07-15", "type": "chat" }, { - "id": "minimax/minimax-m2", - "name": "Minimax/Minimax-M2", - "display_name": "Minimax/Minimax-M2", + "id": "reflection/Beam-1.0-501B-A23B", + "name": "Beam 1.0 501B A23B", + "display_name": "Beam 1.0 501B A23B", "modalities": { "input": [ "text" @@ -175159,8 +167593,8 @@ ] }, "limit": { - "context": 200000, - "output": 128000 + "context": 1048576, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -175168,16 +167602,36 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "minimal", + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + }, "attachment": false, "open_weights": true, - "release_date": "2025-10-27", - "last_updated": "2025-10-27", + "knowledge": "2026-06-30", + "release_date": "2026-10-05", + "last_updated": "2026-10-16", "type": "chat" }, { - "id": "minimax/minimax-m2.5", - "name": "Minimax/Minimax-M2.5", - "display_name": "Minimax/Minimax-M2.5", + "id": "zai-org/GLM-5", + "name": "GLM-5", + "display_name": "GLM-5", "modalities": { "input": [ "text" @@ -175187,8 +167641,8 @@ ] }, "limit": { - "context": 204800, - "output": 128000 + "context": 202752, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -175198,7 +167652,13 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": false, @@ -175208,9 +167668,9 @@ "type": "chat" }, { - "id": "minimax/minimax-m2.5-highspeed", - "name": "Minimax/Minimax-M2.5 Highspeed", - "display_name": "Minimax/Minimax-M2.5 Highspeed", + "id": "zai-org/GLM-5.2", + "name": "GLM-5.2", + "display_name": "GLM-5.2", "modalities": { "input": [ "text" @@ -175220,8 +167680,8 @@ ] }, "limit": { - "context": 204800, - "output": 128000 + "context": 1048575, + "output": 164000 }, "temperature": true, "tool_call": true, @@ -175231,19 +167691,29 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "high", + "max" + ] } }, "attachment": false, "open_weights": true, - "release_date": "2026-02-13", - "last_updated": "2026-02-13", + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "minimax/minimax-m2.1", - "name": "Minimax/Minimax-M2.1", - "display_name": "Minimax/Minimax-M2.1", + "id": "zai-org/GLM-5.1", + "name": "GLM-5.1", + "display_name": "GLM-5.1", "modalities": { "input": [ "text" @@ -175253,8 +167723,8 @@ ] }, "limit": { - "context": 204800, - "output": 128000 + "context": 202752, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -175269,52 +167739,27 @@ }, "attachment": false, "open_weights": true, - "release_date": "2025-12-23", - "last_updated": "2025-12-23", - "type": "chat" - }, - { - "id": "moonshotai/kimi-k2-0905", - "name": "Kimi K2 0905", - "display_name": "Kimi K2 0905", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 256000, - "output": 100000 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": true, - "release_date": "2025-09-05", - "last_updated": "2025-09-05", + "release_date": "2026-04-07", + "last_updated": "2026-04-07", "type": "chat" }, { - "id": "moonshotai/kimi-k2-thinking", - "name": "Kimi K2 Thinking", - "display_name": "Kimi K2 Thinking", + "id": "zai-org/GLM-5.3-Flash", + "name": "GLM-5.3-Flash", + "display_name": "GLM-5.3-Flash", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 100000 + "context": 1048575, + "output": 400000 }, "temperature": true, "tool_call": true, @@ -175330,33 +167775,35 @@ "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "effort_options": [ + "low", + "high", + "max" ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2024-08", - "release_date": "2025-11-06", - "last_updated": "2025-11-06", + "release_date": "2026-08-26", + "last_updated": "2026-08-26", "type": "chat" }, { - "id": "moonshotai/kimi-k2.5", - "name": "Moonshotai/Kimi-K2.5", - "display_name": "Moonshotai/Kimi-K2.5", + "id": "zai-org/GLM-5.3", + "name": "GLM-5.3", + "display_name": "GLM-5.3", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 256000 + "context": 1048575, + "output": 262144 }, "temperature": true, "tool_call": true, @@ -175372,20 +167819,24 @@ "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "effort_options": [ + "low", + "high", + "max" ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-01-27", - "last_updated": "2026-01-27", + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "stepfun/step-3.5-flash", - "name": "Stepfun/Step-3.5 Flash", - "display_name": "Stepfun/Step-3.5 Flash", + "id": "essentialai/Rnj-1-Instruct", + "name": "Rnj-1 Instruct", + "display_name": "Rnj-1 Instruct", "modalities": { "input": [ "text" @@ -175395,39 +167846,35 @@ ] }, "limit": { - "context": 64000, - "output": 4096 + "context": 32768, + "output": 32768 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, "attachment": false, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-01-29", - "last_updated": "2026-02-13", + "release_date": "2025-12-04", + "last_updated": "2025-12-04", "type": "chat" }, { - "id": "x-ai/grok-4-fast", - "name": "x-AI/Grok-4-Fast", - "display_name": "x-AI/Grok-4-Fast", + "id": "deepseek-ai/DeepSeek-V3-1", + "name": "DeepSeek V3.1", + "display_name": "DeepSeek V3.1", "modalities": { "input": [ - "text", - "image", - "audio", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 2000000, - "output": 2000000 + "context": 131072, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -175435,30 +167882,27 @@ "supported": true, "default": true }, - "attachment": true, - "open_weights": false, - "release_date": "2025-09-20", - "last_updated": "2025-09-20", + "attachment": false, + "open_weights": true, + "release_date": "2025-08-21", + "last_updated": "2025-08-21", "type": "chat" }, { - "id": "x-ai/grok-4-fast-reasoning", - "name": "X-Ai/Grok-4-Fast-Reasoning", - "display_name": "X-Ai/Grok-4-Fast-Reasoning", + "id": "deepseek-ai/DeepSeek-V4-Flash-0731", + "name": "DeepSeek V4 Flash 0731", + "display_name": "DeepSeek V4 Flash 0731", "modalities": { "input": [ - "text", - "image", - "audio", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 2000000, - "output": 2000000 + "context": 1048576, + "output": 384000 }, "temperature": true, "tool_call": true, @@ -175466,44 +167910,59 @@ "supported": true, "default": true }, - "attachment": true, - "open_weights": false, - "release_date": "2025-12-18", - "last_updated": "2025-12-18", + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "high", + "max" + ] + } + }, + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-07-31", + "last_updated": "2026-07-31", "type": "chat" }, { - "id": "x-ai/grok-4.1-fast-non-reasoning", - "name": "X-Ai/Grok 4.1 Fast Non Reasoning", - "display_name": "X-Ai/Grok 4.1 Fast Non Reasoning", + "id": "deepseek-ai/DeepSeek-V3", + "name": "DeepSeek-V3", + "display_name": "DeepSeek-V3", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 2000000, - "output": 2000000 + "context": 131072, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": true, - "open_weights": false, - "release_date": "2025-11-19", - "last_updated": "2025-11-19", + "attachment": false, + "open_weights": true, + "release_date": "2024-12-26", + "last_updated": "2024-12-26", "type": "chat" }, { - "id": "x-ai/grok-code-fast-1", - "name": "x-AI/Grok-Code-Fast 1", - "display_name": "x-AI/Grok-Code-Fast 1", + "id": "deepseek-ai/DeepSeek-V4-Pro-0813", + "name": "DeepSeek V4 Pro 0813", + "display_name": "DeepSeek V4 Pro 0813", "modalities": { "input": [ "text" @@ -175513,8 +167972,8 @@ ] }, "limit": { - "context": 256000, - "output": 10000 + "context": 1048576, + "output": 384000 }, "temperature": true, "tool_call": true, @@ -175524,78 +167983,125 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "high", + "max" + ] } }, "attachment": false, - "open_weights": false, - "release_date": "2025-09-02", - "last_updated": "2025-09-02", + "open_weights": true, + "release_date": "2026-08-13", + "last_updated": "2026-08-22", "type": "chat" }, { - "id": "x-ai/grok-4-fast-non-reasoning", - "name": "X-Ai/Grok-4-Fast-Non-Reasoning", - "display_name": "X-Ai/Grok-4-Fast-Non-Reasoning", + "id": "deepseek-ai/DeepSeek-V4.1-Flash", + "name": "DeepSeek V4.1 Flash", + "display_name": "DeepSeek V4.1 Flash", "modalities": { "input": [ "text", - "image", - "audio", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 2000000, - "output": 2000000 + "context": 1048576, + "output": 384000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "none", + "low", + "high", + "max" + ] + } }, "attachment": true, - "open_weights": false, - "release_date": "2025-12-18", - "last_updated": "2025-12-18", + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-09-10", + "last_updated": "2026-09-10", "type": "chat" }, { - "id": "x-ai/grok-4.1-fast-reasoning", - "name": "X-Ai/Grok 4.1 Fast Reasoning", - "display_name": "X-Ai/Grok 4.1 Fast Reasoning", + "id": "deepseek-ai/DeepSeek-R1", + "name": "DeepSeek-R1", + "display_name": "DeepSeek-R1", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 20000000, - "output": 2000000 + "context": 163839, + "output": 163839 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true }, - "attachment": true, - "open_weights": false, - "release_date": "2025-11-19", - "last_updated": "2025-11-19", + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, + "open_weights": true, + "knowledge": "2024-07", + "release_date": "2025-01-20", + "last_updated": "2025-05-29", "type": "chat" - }, + } + ] + }, + "stepfun-step-plan": { + "id": "stepfun-step-plan", + "name": "StepFun Step Plan (China)", + "display_name": "StepFun Step Plan (China)", + "api": "https://api.stepfun.com/step_plan/v1", + "doc": "https://platform.stepfun.com/docs/zh/step-plan/integrations/reasoning-api", + "models": [ { - "id": "x-ai/grok-4.1-fast", - "name": "x-AI/Grok-4.1-Fast", - "display_name": "x-AI/Grok-4.1-Fast", + "id": "step-router-v1", + "name": "Step Router v1", + "display_name": "Step Router v1", "modalities": { "input": [ "text" @@ -175605,88 +168111,82 @@ ] }, "limit": { - "context": 2000000, - "output": 2000000 + "context": 256000, + "output": 256000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, "open_weights": false, - "release_date": "2025-11-20", - "last_updated": "2025-11-20", + "knowledge": "2025-01", + "release_date": "2026-05-29", + "last_updated": "2026-05-29", "type": "chat" }, { - "id": "openai/gpt-5.2", - "name": "OpenAI/GPT-5.2", - "display_name": "OpenAI/GPT-5.2", + "id": "step-3.5-flash-2603", + "name": "Step 3.5 Flash 2603", + "display_name": "Step 3.5 Flash 2603", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 256000, + "output": 256000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ], - "verbosity": "medium", - "verbosity_options": [ + "effort_options": [ "low", - "medium", "high" - ], - "visibility": "hidden" + ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2025-12-11", - "last_updated": "2025-12-11", + "attachment": false, + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "openai/gpt-5", - "name": "OpenAI/GPT-5", - "display_name": "OpenAI/GPT-5", + "id": "step-5-preview", + "name": "Step 5 Preview", + "display_name": "Step 5 Preview", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 1000000, + "output": 384000 }, "temperature": true, "tool_call": true, @@ -175697,46 +168197,44 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, "mode": "effort", "effort": "medium", "effort_options": [ - "minimal", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ "low", "medium", "high" ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, - "attachment": false, - "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "attachment": true, + "open_weights": true, + "release_date": "2026-09-16", + "last_updated": "2026-09-20", "type": "chat" }, { - "id": "z-ai/glm-5", - "name": "Z-Ai/GLM 5", - "display_name": "Z-Ai/GLM 5", + "id": "step-3.7-flash", + "name": "Step 3.7 Flash", + "display_name": "Step 3.7 Flash", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 128000 + "context": 256000, + "output": 256000 }, "temperature": true, "tool_call": true, @@ -175752,19 +168250,25 @@ "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "effort_options": [ + "low", + "medium", + "high" ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-02-12", - "last_updated": "2026-02-12", + "knowledge": "2026-03-01", + "release_date": "2026-05-29", + "last_updated": "2026-05-29", "type": "chat" }, { - "id": "z-ai/glm-4.6", - "name": "Z-AI/GLM 4.6", - "display_name": "Z-AI/GLM 4.6", + "id": "step-3.5-flash", + "name": "Step 3.5 Flash", + "display_name": "Step 3.5 Flash", "modalities": { "input": [ "text" @@ -175774,8 +168278,8 @@ ] }, "limit": { - "context": 200000, - "output": 200000 + "context": 256000, + "output": 256000 }, "temperature": true, "tool_call": true, @@ -175785,31 +168289,50 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "low", + "high" + ] } }, "attachment": false, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-09-30", - "last_updated": "2025-09-30", + "knowledge": "2025-01", + "release_date": "2026-01-29", + "last_updated": "2026-02-13", "type": "chat" - }, + } + ] + }, + "cloudflare-ai-gateway": { + "id": "cloudflare-ai-gateway", + "name": "Cloudflare AI Gateway", + "display_name": "Cloudflare AI Gateway", + "doc": "https://developers.cloudflare.com/ai-gateway/", + "models": [ { - "id": "z-ai/glm-4.7", - "name": "Z-Ai/GLM 4.7", - "display_name": "Z-Ai/GLM 4.7", + "id": "xai/grok-4.6", + "name": "Grok 4.6", + "display_name": "Grok 4.6", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 200000 + "context": 500000, + "output": 500000 }, "temperature": true, "tool_call": true, @@ -175820,91 +168343,95 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "low", + "medium", + "high" ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-12-22", - "last_updated": "2025-12-22", + "attachment": true, + "open_weights": false, + "knowledge": "2026-02-01", + "release_date": "2026-08-12", + "last_updated": "2026-08-12", "type": "chat" }, { - "id": "z-ai/autoglm-phone-9b", - "name": "Z-Ai/Autoglm Phone 9b", - "display_name": "Z-Ai/Autoglm Phone 9b", + "id": "xai/grok-4.20-0309-reasoning", + "name": "Grok 4.20 (Reasoning)", + "display_name": "Grok 4.20 (Reasoning)", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 12800, - "output": 4096 + "context": 2000000, + "output": 30000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": true, "open_weights": false, - "release_date": "2025-12-23", - "last_updated": "2025-12-23", + "release_date": "2026-03-09", + "last_updated": "2026-03-09", "type": "chat" }, { - "id": "deepseek/deepseek-v3.1-terminus", - "name": "DeepSeek/DeepSeek-V3.1-Terminus", - "display_name": "DeepSeek/DeepSeek-V3.1-Terminus", + "id": "xai/grok-4.20-0309-non-reasoning", + "name": "Grok 4.20 (Non-Reasoning)", + "display_name": "Grok 4.20 (Non-Reasoning)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 32000 + "context": 2000000, + "output": 30000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2025-09-22", - "last_updated": "2025-09-22", + "release_date": "2026-03-09", + "last_updated": "2026-03-09", "type": "chat" }, { - "id": "deepseek/deepseek-v3.1-terminus-thinking", - "name": "DeepSeek/DeepSeek-V3.1-Terminus-Thinking", - "display_name": "DeepSeek/DeepSeek-V3.1-Terminus-Thinking", + "id": "xai/grok-4.5", + "name": "Grok 4.5", + "display_name": "Grok 4.5", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 32000 + "context": 500000, + "output": 500000 }, "temperature": true, "tool_call": true, @@ -175912,27 +168439,39 @@ "supported": true, "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "low", + "medium", + "high" + ] + } + }, + "attachment": true, "open_weights": false, - "release_date": "2025-09-22", - "last_updated": "2025-09-22", + "release_date": "2026-07-08", + "last_updated": "2026-07-08", "type": "chat" }, { - "id": "deepseek/deepseek-v3.2-exp-thinking", - "name": "DeepSeek/DeepSeek-V3.2-Exp-Thinking", - "display_name": "DeepSeek/DeepSeek-V3.2-Exp-Thinking", + "id": "xai/grok-4.3", + "name": "Grok 4.3", + "display_name": "Grok 4.3", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 32000 + "context": 1000000, + "output": 30000 }, "temperature": true, "tool_call": true, @@ -175940,44 +168479,109 @@ "supported": true, "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "none", + "low", + "medium", + "high" + ] + } + }, + "attachment": true, "open_weights": false, - "release_date": "2025-09-29", - "last_updated": "2025-09-29", + "release_date": "2026-04-17", + "last_updated": "2026-04-17", "type": "chat" }, { - "id": "deepseek/deepseek-math-v2", - "name": "Deepseek/Deepseek-Math-V2", - "display_name": "Deepseek/Deepseek-Math-V2", + "id": "xai/grok-4.7", + "name": "Grok 4.7", + "display_name": "Grok 4.7", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 160000, - "output": 160000 + "context": 500000, + "output": 500000 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "high", + "xhigh" + ] + } + }, + "attachment": true, "open_weights": false, - "release_date": "2025-12-04", - "last_updated": "2025-12-04", + "knowledge": "2026-05", + "release_date": "2026-09-21", + "last_updated": "2026-09-21", "type": "chat" }, { - "id": "deepseek/deepseek-v3.2-exp", - "name": "DeepSeek/DeepSeek-V3.2-Exp", - "display_name": "DeepSeek/DeepSeek-V3.2-Exp", + "id": "moonshotai/kimi-k3", + "name": "Kimi K3", + "display_name": "Kimi K3", + "modalities": { + "input": [ + "text", + "image", + "video" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1048576, + "output": 131072 + }, + "temperature": false, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "none", + "low", + "high", + "max" + ] + } + }, + "attachment": true, + "open_weights": true, + "release_date": "2026-07-16", + "last_updated": "2026-07-16", + "type": "chat" + }, + { + "id": "deepseek/deepseek-v4-pro", + "name": "DeepSeek V4 Pro", + "display_name": "DeepSeek V4 Pro", "modalities": { "input": [ "text" @@ -175987,24 +168591,48 @@ ] }, "limit": { - "context": 128000, - "output": 32000 + "context": 131072, + "output": 384000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "high", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." + ] + } }, "attachment": false, - "open_weights": false, - "release_date": "2025-09-29", - "last_updated": "2025-09-29", + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "deepseek/deepseek-v3.2-251201", - "name": "Deepseek/DeepSeek-V3.2", - "display_name": "Deepseek/DeepSeek-V3.2", + "id": "reflection-ai/beam-1.0-501b-a23b", + "name": "Beam 1.0 501B A23B", + "display_name": "Beam 1.0 501B A23B", "modalities": { "input": [ "text" @@ -176014,8 +168642,8 @@ ] }, "limit": { - "context": 128000, - "output": 32000 + "context": 262144, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -176023,17 +168651,35 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + }, "attachment": false, "open_weights": true, - "knowledge": "2024-07", - "release_date": "2025-12-01", - "last_updated": "2025-12-01", + "knowledge": "2026-06-30", + "release_date": "2026-10-05", + "last_updated": "2026-10-16", "type": "chat" }, { - "id": "stepfun-ai/gelab-zero-4b-preview", - "name": "Stepfun-Ai/Gelab Zero 4b Preview", - "display_name": "Stepfun-Ai/Gelab Zero 4b Preview", + "id": "openai/gpt-4.1-nano", + "name": "GPT-4.1 nano", + "display_name": "GPT-4.1 nano", "modalities": { "input": [ "text", @@ -176044,8 +168690,8 @@ ] }, "limit": { - "context": 8192, - "output": 4096 + "context": 1000000, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -176054,91 +168700,180 @@ }, "attachment": true, "open_weights": false, - "release_date": "2025-12-23", - "last_updated": "2025-12-23", + "knowledge": "2024-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", "type": "chat" }, { - "id": "meituan/longcat-flash-lite", - "name": "Meituan/Longcat-Flash-Lite", - "display_name": "Meituan/Longcat-Flash-Lite", + "id": "openai/gpt-6.1-terra", + "name": "GPT-6.1 Terra", + "display_name": "GPT-6.1 Terra", "modalities": { "input": [ + "text", + "image", + "pdf" + ], + "output": [ "text" + ] + }, + "limit": { + "context": 1050000, + "output": 128000 + }, + "temperature": false, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2026-06-01", + "release_date": "2026-10-26", + "last_updated": "2026-10-26", + "type": "chat" + }, + { + "id": "openai/gpt-5.6-terra", + "name": "GPT-5.6 Terra", + "display_name": "GPT-5.6 Terra", + "modalities": { + "input": [ + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 320000 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, "open_weights": false, - "release_date": "2026-02-06", - "last_updated": "2026-02-06", + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "meituan/longcat-flash-chat", - "name": "Meituan/Longcat-Flash-Chat", - "display_name": "Meituan/Longcat-Flash-Chat", + "id": "openai/gpt-5.4", + "name": "GPT-5.4", + "display_name": "GPT-5.4", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 131072 + "context": 1000000, + "output": 128000 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, "open_weights": false, - "release_date": "2025-11-05", - "last_updated": "2025-11-05", + "knowledge": "2025-08-31", + "release_date": "2026-03-05", + "last_updated": "2026-03-05", "type": "chat" - } - ] - }, - "above": { - "id": "above", - "name": "above.dev", - "display_name": "above.dev", - "api": "https://api.above.dev/v1", - "doc": "https://above.dev/docs", - "models": [ + }, { - "id": "glm-5.2-fast", - "name": "GLM 5.2 Fast", - "display_name": "GLM 5.2 Fast", + "id": "openai/gpt-5.6-sol", + "name": "GPT-5.6 Sol", + "display_name": "GPT-5.6 Sol", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -176147,127 +168882,134 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ "none", + "low", + "medium", "high", + "xhigh", "max" - ] + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "attachment": true, + "open_weights": false, + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "mimo-v2.6-pro", - "name": "MiMo V2.6 Pro", - "display_name": "MiMo V2.6 Pro", + "id": "openai/gpt-5.4-mini", + "name": "GPT-5.4 mini", + "display_name": "GPT-5.4 mini", "modalities": { "input": [ "text", - "image", - "audio", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 128000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, - "open_weights": true, - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-03-17", + "last_updated": "2026-03-17", "type": "chat" }, { - "id": "mimo-v2.6-pro-ultraspeed", - "name": "MiMo V2.6 Pro UltraSpeed", - "display_name": "MiMo V2.6 Pro UltraSpeed", + "id": "openai/gpt-4o", + "name": "GPT-4o", + "display_name": "GPT-4o", "modalities": { "input": [ "text", "image", - "audio", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 128000, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": true, - "open_weights": true, - "release_date": "2026-09-21", - "last_updated": "2026-09-21", + "open_weights": false, + "knowledge": "2023-09", + "release_date": "2024-05-13", + "last_updated": "2024-08-06", "type": "chat" }, { - "id": "deepseek-v4-flash", - "name": "DeepSeek V4 Flash", - "display_name": "DeepSeek V4 Flash", + "id": "openai/gpt-5.6-luna", + "name": "GPT-5.6 Luna", + "display_name": "GPT-5.6 Luna", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -176278,137 +169020,131 @@ "supported": true, "default_enabled": true, "mode": "effort", - "effort": "high", + "effort": "medium", "effort_options": [ + "none", "low", + "medium", "high", + "xhigh", "max" ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" ], - "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." - ] + "visibility": "hidden" } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-09-10", - "last_updated": "2026-09-10", + "open_weights": false, + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "qwen3.8-max", - "name": "Qwen 3.8 Max", - "display_name": "Qwen 3.8 Max", + "id": "openai/gpt-4.1", + "name": "GPT-4.1", + "display_name": "GPT-4.1", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, + "context": 1047576, "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": true, "open_weights": false, - "release_date": "2026-08-03", - "last_updated": "2026-08-03", + "knowledge": "2024-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", "type": "chat" }, { - "id": "deepseek-v4-pro", - "name": "DeepSeek V4 Pro", - "display_name": "DeepSeek V4 Pro", + "id": "openai/gpt-5.1", + "name": "GPT-5.1", + "display_name": "GPT-5.1", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 128000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, + "default_enabled": false, "mode": "effort", - "effort": "high", + "effort": "none", "effort_options": [ + "none", "low", - "high", - "max" + "medium", + "high" ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" ], - "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." - ] + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-08-13", - "last_updated": "2026-08-22", + "attachment": true, + "open_weights": false, + "knowledge": "2024-09-30", + "release_date": "2025-11-13", + "last_updated": "2025-11-13", "type": "chat" }, { - "id": "glm-5.2", - "name": "GLM 5.2", - "display_name": "GLM 5.2", + "id": "openai/gpt-6-luna", + "name": "GPT-6 Luna", + "display_name": "GPT-6 Luna", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -176416,30 +169152,27 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ "none", + "low", + "medium", "high", + "xhigh", "max" ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "attachment": true, + "open_weights": false, + "knowledge": "2026-05-18", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "deepseek-v4.1-flash", - "name": "DeepSeek V4.1 Flash", - "display_name": "DeepSeek V4.1 Flash", + "id": "openai/gpt-5-mini", + "name": "GPT-5 Mini", + "display_name": "GPT-5 Mini", "modalities": { "input": [ "text", @@ -176450,10 +169183,10 @@ ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 128000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -176462,30 +169195,78 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "minimal", + "low", + "medium", + "high" ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2024-05-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", + "type": "chat" + }, + { + "id": "openai/gpt-6-sol", + "name": "GPT-6 Sol", + "display_name": "GPT-6 Sol", + "modalities": { + "input": [ + "text", + "image", + "pdf" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1050000, + "output": 128000 + }, + "temperature": false, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { "effort_options": [ + "none", "low", + "medium", "high", + "xhigh", "max" ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-09-10", - "last_updated": "2026-09-10", + "open_weights": false, + "knowledge": "2026-04-20", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "glm-5.3-flash", - "name": "GLM 5.3 Flash", - "display_name": "GLM 5.3 Flash", + "id": "openai/gpt-5.4-pro", + "name": "GPT-5.4 Pro", + "display_name": "GPT-5.4 Pro", "modalities": { "input": [ "text", @@ -176497,9 +169278,9 @@ }, "limit": { "context": 1000000, - "output": 131072 + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -176508,44 +169289,48 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], + "default_enabled": true, + "mode": "effort", + "effort": "high", "effort_options": [ + "medium", "high", - "max" - ] + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, - "open_weights": true, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-03-05", + "last_updated": "2026-03-05", "type": "chat" }, { - "id": "mimo-v2.6-flash", - "name": "MiMo V2.6 Flash", - "display_name": "MiMo V2.6 Flash", + "id": "openai/gpt-5", + "name": "GPT-5", + "display_name": "GPT-5", "modalities": { "input": [ "text", - "image", - "audio", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 128000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -176554,46 +169339,50 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "minimal", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, - "open_weights": true, - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "open_weights": false, + "knowledge": "2024-09-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" - } - ] - }, - "munito-eu": { - "id": "munito-eu", - "name": "Munito AI (EU)", - "display_name": "Munito AI (EU)", - "api": "https://api.eu.munito.ai/inference/v1", - "doc": "https://docs.munito.ai/regions", - "models": [ + }, { - "id": "aleph-alpha/kolibri-1", - "name": "Kolibri 1", - "display_name": "Kolibri 1", + "id": "openai/gpt-6.1-sol", + "name": "GPT-6.1 Sol", + "display_name": "GPT-6.1 Sol", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 943718 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -176601,47 +169390,42 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ "none", "low", "medium", - "high" + "high", + "xhigh", + "max" ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2026-06-18", - "release_date": "2026-10-03", - "last_updated": "2026-10-03", + "attachment": true, + "open_weights": false, + "knowledge": "2026-04-30", + "release_date": "2026-09-29", + "last_updated": "2026-09-29", "type": "chat" }, { - "id": "zai-org/glm-5.3-flash", - "name": "GLM-5.3-Flash", - "display_name": "GLM-5.3-Flash", + "id": "openai/o3", + "name": "o3", + "display_name": "o3", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 943718 + "context": 200000, + "output": 100000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -176650,95 +169434,95 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ "low", - "high", - "max" - ] + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, - "open_weights": true, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", + "open_weights": false, + "knowledge": "2024-05", + "release_date": "2025-04-16", + "last_updated": "2025-04-16", "type": "chat" }, { - "id": "deepseek-ai/deepseek-v4-flash", - "name": "DeepSeek V4 Flash 0731", - "display_name": "DeepSeek V4 Flash 0731", + "id": "openai/gpt-5.4-nano", + "name": "GPT-5.4 nano", + "display_name": "GPT-5.4 nano", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 943718 + "context": 128000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, + "default_enabled": false, "mode": "effort", - "effort": "high", + "effort": "none", "effort_options": [ + "none", "low", + "medium", "high", - "max" + "xhigh" ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" ], - "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." - ] + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-07-31", - "last_updated": "2026-07-31", + "attachment": true, + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-03-17", + "last_updated": "2026-03-17", "type": "chat" }, { - "id": "qwen/qwen3.8-27b", - "name": "Qwen3.8 27B", - "display_name": "Qwen3.8 27B", + "id": "openai/gpt-5.5-pro", + "name": "GPT-5.5 Pro", + "display_name": "GPT-5.5 Pro", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 235929 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -176747,55 +169531,39 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ - "none", - "low", "medium", + "high", "xhigh" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "open_weights": false, + "knowledge": "2025-12-01", + "release_date": "2026-04-23", + "last_updated": "2026-04-23", "type": "chat" - } - ] - }, - "bee": { - "id": "bee", - "name": "Bee by HEOSSI", - "display_name": "Bee by HEOSSI", - "api": "https://api.bee.heossi.com/bee", - "doc": "https://bee.heossi.com/docs/sdks", - "models": [ + }, { - "id": "bee-comb", - "name": "Bee Comb 2.0", - "display_name": "Bee Comb 2.0", + "id": "openai/gpt-5.5", + "name": "GPT-5.5", + "display_name": "GPT-5.5", "modalities": { "input": [ "text", "image", - "video", - "audio" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 16384 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -176803,38 +169571,49 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ "low", "medium", "high", - "xhigh", - "max" - ] + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "release_date": "2026-07-10", - "last_updated": "2026-09-28", + "knowledge": "2025-12-01", + "release_date": "2026-04-23", + "last_updated": "2026-04-23", "type": "chat" }, { - "id": "bee-cell", - "name": "Bee Cell 1.0", - "display_name": "Bee Cell 1.0", + "id": "openai/gpt-4.1-mini", + "name": "GPT-4.1 mini", + "display_name": "GPT-4.1 mini", "modalities": { "input": [ "text", "image", - "audio" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 1047576, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -176843,30 +169622,28 @@ }, "attachment": true, "open_weights": false, - "release_date": "2026-07-10", - "last_updated": "2026-09-28", + "knowledge": "2024-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", "type": "chat" }, { - "id": "bee-hive", - "name": "Bee Hive 1.0", - "display_name": "Bee Hive 1.0", + "id": "openai/o3-mini", + "name": "o3-mini", + "display_name": "o3-mini", "modalities": { "input": [ - "text", - "image", - "video", - "audio" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 200000, + "output": 100000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -176874,41 +169651,43 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ "low", "medium", - "high", - "xhigh", - "max" - ] + "high" + ], + "visibility": "hidden" } }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2026-07-10", - "last_updated": "2026-09-28", + "knowledge": "2024-05", + "release_date": "2024-12-20", + "last_updated": "2025-01-29", "type": "chat" }, { - "id": "bee-brood", - "name": "Bee Brood 1.0", - "display_name": "Bee Brood 1.0", + "id": "openai/o4-mini", + "name": "o4-mini", + "display_name": "o4-mini", "modalities": { "input": [ "text", - "image", - "video", - "audio" + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 16384 + "context": 200000, + "output": 100000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -176916,128 +169695,111 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ "low", "medium", - "high", - "xhigh", - "max" - ] + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "release_date": "2026-07-10", - "last_updated": "2026-09-28", + "knowledge": "2024-05", + "release_date": "2025-04-16", + "last_updated": "2025-04-16", "type": "chat" }, { - "id": "bee-buzz", - "name": "Bee Buzz 1.0", - "display_name": "Bee Buzz 1.0", + "id": "openai/gpt-4o-mini", + "name": "GPT-4o mini", + "display_name": "GPT-4o mini", "modalities": { "input": [ "text", "image", - "video", - "audio" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 24576 + "context": 128000, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ] - } + "supported": false }, "attachment": true, "open_weights": false, - "release_date": "2026-07-10", - "last_updated": "2026-09-28", + "knowledge": "2023-09", + "release_date": "2024-07-18", + "last_updated": "2024-07-18", "type": "chat" }, { - "id": "bee-swarm", - "name": "Bee Swarm 1.0", - "display_name": "Bee Swarm 1.0", + "id": "openai/gpt-6-astra", + "name": "GPT-6 Astra", + "display_name": "GPT-6 Astra", "modalities": { "input": [ "text", "image", - "audio" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 64000 + "context": 1050000, + "output": 128000 }, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ "low", "medium", - "high", - "xhigh", - "max" + "high" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-07-10", - "last_updated": "2026-09-28", + "knowledge": "2026-04-30", + "release_date": "2026-09-04", + "last_updated": "2026-09-04", "type": "chat" - } - ] - }, - "ai-router": { - "id": "ai-router", - "name": "AI-ROUTER", - "display_name": "AI-ROUTER", - "api": "https://api.ai-router.dev/v1", - "doc": "https://ai-router.dev/openai-compatible-api-gateway/", - "models": [ + }, { - "id": "gpt-5.6-sol", - "name": "GPT-5.6 Sol", - "display_name": "GPT-5.6 Sol", + "id": "openai/gpt-5-nano", + "name": "GPT-5 Nano", + "display_name": "GPT-5 Nano", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1050000, + "context": 128000, "output": 128000 }, "temperature": false, @@ -177053,12 +169815,10 @@ "mode": "effort", "effort": "medium", "effort_options": [ - "none", + "minimal", "low", "medium", - "high", - "xhigh", - "max" + "high" ], "verbosity": "medium", "verbosity_options": [ @@ -177071,30 +169831,32 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "knowledge": "2024-05-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "gpt-5.6-luna", - "name": "GPT-5.6 Luna", - "display_name": "GPT-5.6 Luna", + "id": "meta/muse-spark-1.2", + "name": "Muse Spark 1.2", + "display_name": "Muse Spark 1.2", "modalities": { "input": [ "text", "image", - "pdf" + "video", + "pdf", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1048576, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -177103,52 +169865,41 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", "effort_options": [ - "none", + "minimal", "low", "medium", "high", - "xhigh", - "max" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "xhigh" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "release_date": "2026-08-05", + "last_updated": "2026-08-05", "type": "chat" }, { - "id": "gpt-5.6-terra", - "name": "GPT-5.6 Terra", - "display_name": "GPT-5.6 Terra", + "id": "meta/muse-spark-1.1", + "name": "Muse Spark 1.1", + "display_name": "Muse Spark 1.1", "modalities": { "input": [ "text", "image", - "pdf" + "pdf", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1048576, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -177157,105 +169908,128 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", "effort_options": [ - "none", + "minimal", "low", "medium", "high", - "xhigh", - "max" - ], - "verbosity": "medium", - "verbosity_options": [ + "xhigh" + ] + } + }, + "attachment": true, + "open_weights": false, + "release_date": "2026-04-08", + "last_updated": "2026-07-09", + "type": "chat" + }, + { + "id": "meta/muse-spark-open", + "name": "Muse Spark Open", + "display_name": "Muse Spark Open", + "modalities": { + "input": [ + "text", + "image", + "video", + "audio" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1040000, + "output": 131072 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ "low", "medium", - "high" - ], - "visibility": "hidden" + "high", + "xhigh" + ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "open_weights": true, + "knowledge": "2026-01-04", + "release_date": "2026-10-15", + "last_updated": "2026-10-15", "type": "chat" }, { - "id": "gpt-5.4", - "name": "GPT-5.4", - "display_name": "GPT-5.4", + "id": "meta/muse-wonder-1.0", + "name": "Muse Wonder", + "display_name": "Muse Wonder", "modalities": { "input": [ "text", "image", - "pdf" + "video", + "pdf", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1048576, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", "effort_options": [ - "none", + "minimal", "low", "medium", "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "xhigh", + "max" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-05", - "last_updated": "2026-03-05", + "release_date": "2026-10-12", + "last_updated": "2026-10-12", "type": "chat" }, { - "id": "gpt-5.5", - "name": "GPT-5.5", - "display_name": "GPT-5.5", + "id": "meta/muse-spark-1.3", + "name": "Muse Spark 1.3", + "display_name": "Muse Spark 1.3", "modalities": { "input": [ "text", "image", - "pdf" + "video", + "pdf", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1048576, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -177264,101 +170038,93 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", "effort_options": [ + "minimal", "low", "medium", "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "xhigh", + "max" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-12-01", - "release_date": "2026-04-23", - "last_updated": "2026-04-23", + "release_date": "2026-09-02", + "last_updated": "2026-09-02", "type": "chat" - } - ] - }, - "inference": { - "id": "inference", - "name": "Inference", - "display_name": "Inference", - "api": "https://inference.net/v1", - "doc": "https://inference.net/models", - "models": [ + }, { - "id": "meta/llama-3.2-3b-instruct", - "name": "Llama 3.2 3B Instruct", - "display_name": "Llama 3.2 3B Instruct", + "id": "unbiased/pareto", + "name": "Pareto", + "display_name": "Pareto", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 16000, - "output": 4096 + "context": 262144, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, - "open_weights": true, - "knowledge": "2023-12", - "release_date": "2025-01-01", - "last_updated": "2025-01-01", + "attachment": true, + "open_weights": false, + "release_date": "2026-09-17", + "last_updated": "2026-09-17", "type": "chat" }, { - "id": "meta/llama-3.2-11b-vision-instruct", - "name": "Llama 3.2 11B Vision Instruct", - "display_name": "Llama 3.2 11B Vision Instruct", + "id": "alibaba/qwen3-max", + "name": "Qwen3 Max", + "display_name": "Qwen3 Max", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 16000, - "output": 4096 + "context": 262144, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true }, - "attachment": true, - "open_weights": true, - "knowledge": "2023-12", - "release_date": "2024-09-25", - "last_updated": "2024-09-25", + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, + "open_weights": false, + "knowledge": "2025-04", + "release_date": "2025-09-23", + "last_updated": "2025-09-23", "type": "chat" }, { - "id": "meta/llama-3.2-1b-instruct", - "name": "Llama 3.2 1B Instruct", - "display_name": "Llama 3.2 1B Instruct", + "id": "alibaba/qwen3.7-max", + "name": "Qwen3.7 Max", + "display_name": "Qwen3.7 Max", "modalities": { "input": [ "text" @@ -177368,262 +170134,379 @@ ] }, "limit": { - "context": 16000, - "output": 4096 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": false, - "open_weights": true, - "knowledge": "2023-12", - "release_date": "2024-09-25", - "last_updated": "2024-09-25", + "open_weights": false, + "release_date": "2026-05-21", + "last_updated": "2026-05-21", "type": "chat" }, { - "id": "meta/llama-3.1-8b-instruct", - "name": "Llama 3.1 8B Instruct", - "display_name": "Llama 3.1 8B Instruct", + "id": "alibaba/qwen3.8-max", + "name": "Qwen3.8 Max", + "display_name": "Qwen3.8 Max", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 16000, - "output": 4096 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2023-12", - "release_date": "2024-07-23", - "last_updated": "2024-07-23", + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "low", + "medium", + "xhigh" + ] + } + }, + "attachment": true, + "open_weights": false, + "release_date": "2026-08-03", + "last_updated": "2026-08-03", "type": "chat" }, { - "id": "google/gemma-3", - "name": "Google Gemma 3", - "display_name": "Google Gemma 3", + "id": "alibaba/qwen3.5-397b-a17b", + "name": "Qwen3.5 397B-A17B", + "display_name": "Qwen3.5 397B-A17B", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 125000, - "output": 4096 + "context": 262144, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": true, "open_weights": true, - "knowledge": "2024-12", - "release_date": "2025-01-01", - "last_updated": "2025-01-01", + "release_date": "2026-02-15", + "last_updated": "2026-02-15", "type": "chat" }, { - "id": "mistral/mistral-nemo-12b-instruct", - "name": "Mistral Nemo 12B Instruct", - "display_name": "Mistral Nemo 12B Instruct", + "id": "alibaba/qwen3.7-plus", + "name": "Qwen3.7 Plus", + "display_name": "Qwen3.7 Plus", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 16000, - "output": 4096 + "context": 1000000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-12", - "release_date": "2024-07-18", - "last_updated": "2024-07-18", + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-04", + "release_date": "2026-06-02", + "last_updated": "2026-06-02", "type": "chat" }, { - "id": "qwen/qwen3-embedding-4b", - "name": "Qwen 3 Embedding 4B", - "display_name": "Qwen 3 Embedding 4B", + "id": "anthropic/claude-opus-5.5", + "name": "Claude Opus 5.5", + "display_name": "Claude Opus 5.5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 32000, - "output": 2048 + "context": 1000000, + "output": 128000 }, "temperature": false, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-12", - "release_date": "2025-06-05", - "last_updated": "2025-06-05", - "type": "embedding" + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2026-06", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", + "type": "chat" }, { - "id": "qwen/qwen-2.5-7b-vision-instruct", - "name": "Qwen 2.5 7B Vision Instruct", - "display_name": "Qwen 2.5 7B Vision Instruct", + "id": "anthropic/claude-fable-5", + "name": "Claude Fable 5", + "display_name": "Claude Fable 5", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 125000, - "output": 4096 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", + "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", + "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." + ] + } }, "attachment": true, - "open_weights": true, - "knowledge": "2024-12", - "release_date": "2025-01-01", - "last_updated": "2025-01-01", + "open_weights": false, + "knowledge": "2026-01-31", + "release_date": "2026-06-09", + "last_updated": "2026-06-09", "type": "chat" }, { - "id": "osmosis/osmosis-structure-0.6b", - "name": "Osmosis Structure 0.6B", - "display_name": "Osmosis Structure 0.6B", + "id": "anthropic/claude-opus-4.6", + "name": "Claude Opus 4.6", + "display_name": "Claude Opus 4.6", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 4000, - "output": 2048 + "context": 1000000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-12", - "release_date": "2025-01-01", - "last_updated": "2025-01-01", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-05-31", + "release_date": "2026-02-05", + "last_updated": "2026-03-13", "type": "chat" - } - ] - }, - "opper": { - "id": "opper", - "name": "Opper", - "display_name": "Opper", - "api": "https://api.opper.ai/v3/compat", - "doc": "https://opper.ai/models", - "models": [ + }, { - "id": "qwen3.8-27b", - "name": "Qwen3.8 27B", - "display_name": "Qwen3.8 27B", + "id": "anthropic/claude-haiku-4.5", + "name": "Claude Haiku 4.5 (latest)", + "display_name": "Claude Haiku 4.5 (latest)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" ], - "effort_options": [ - "low", - "medium", - "xhigh" + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "attachment": true, + "open_weights": false, + "knowledge": "2025-02-28", + "release_date": "2025-10-15", + "last_updated": "2025-10-15", "type": "chat" }, { - "id": "gpt-5.4-mini", - "name": "GPT-5.4 mini", - "display_name": "GPT-5.4 mini", + "id": "anthropic/claude-opus-4.8", + "name": "Claude Opus 4.8", + "display_name": "Claude Opus 4.8", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 400000, + "context": 1000000, "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -177634,37 +170517,78 @@ "supported": true, "default_enabled": false, "mode": "effort", - "effort": "none", + "effort": "high", "effort_options": [ - "none", "low", "medium", "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" + "xhigh", + "max" ], "interleaved": true, "summaries": true, - "visibility": "summary", + "visibility": "omitted", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-17", - "last_updated": "2026-03-17", + "knowledge": "2026-01", + "release_date": "2026-05-28", + "last_updated": "2026-05-28", "type": "chat" }, { - "id": "claude-opus-4-7", + "id": "anthropic/claude-haiku-5.5", + "name": "Claude Haiku 5.5", + "display_name": "Claude Haiku 5.5", + "modalities": { + "input": [ + "text", + "image", + "pdf" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1000000, + "output": 128000 + }, + "temperature": false, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2026-06", + "release_date": "2026-10-07", + "last_updated": "2026-10-07", + "type": "chat" + }, + { + "id": "anthropic/claude-opus-4.7", "name": "Claude Opus 4.7", "display_name": "Claude Opus 4.7", "modalities": { @@ -177679,7 +170603,7 @@ }, "limit": { "context": 1000000, - "output": 64000 + "output": 128000 }, "temperature": false, "tool_call": true, @@ -177702,7 +170626,7 @@ ], "interleaved": true, "summaries": true, - "visibility": "summary", + "visibility": "omitted", "continuation": [ "thinking_blocks" ], @@ -177721,9 +170645,9 @@ "type": "chat" }, { - "id": "claude-sonnet-4-5", - "name": "Claude Sonnet 4.5 (latest)", - "display_name": "Claude Sonnet 4.5 (latest)", + "id": "anthropic/claude-sonnet-4.6", + "name": "Claude Sonnet 4.6", + "display_name": "Claude Sonnet 4.6", "modalities": { "input": [ "text", @@ -177735,8 +170659,8 @@ ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 1000000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -177748,11 +170672,18 @@ "reasoning": { "supported": true, "default_enabled": false, - "mode": "budget", + "mode": "mixed", "budget": { "min": 1024, "unit": "tokens" }, + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "max" + ], "interleaved": true, "summaries": true, "visibility": "summary", @@ -177760,22 +170691,22 @@ "thinking_blocks" ], "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-07-31", - "release_date": "2025-09-29", - "last_updated": "2025-09-29", + "knowledge": "2025-08-31", + "release_date": "2026-02-17", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "gpt-5.6-sol", - "name": "GPT-5.6 Sol", - "display_name": "GPT-5.6 Sol", + "id": "anthropic/claude-opus-5", + "name": "Claude Opus 5", + "display_name": "Claude Opus 5", "modalities": { "input": [ "text", @@ -177799,45 +170730,31 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", "effort_options": [ - "none", "low", "medium", "high", "xhigh", "max" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "knowledge": "2026-05", + "release_date": "2026-07-24", + "last_updated": "2026-07-24", "type": "chat" }, { - "id": "deepseek-v4-flash", - "name": "DeepSeek V4 Flash", - "display_name": "DeepSeek V4 Flash", + "id": "anthropic/claude-sonnet-5", + "name": "Claude Sonnet 5", + "display_name": "Claude Sonnet 5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" @@ -177845,9 +170762,9 @@ }, "limit": { "context": 1000000, - "output": 384000 + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -177856,40 +170773,31 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", "effort_options": [ "low", + "medium", "high", + "xhigh", "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "attachment": true, + "open_weights": false, + "knowledge": "2026-01-31", + "release_date": "2026-06-30", + "last_updated": "2026-06-30", "type": "chat" }, { - "id": "grok-4.3", - "name": "Grok 4.3", - "display_name": "Grok 4.3", + "id": "anthropic/claude-sonnet-5.5", + "name": "Claude Sonnet 5.5", + "display_name": "Claude Sonnet 5.5", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" @@ -177897,9 +170805,9 @@ }, "limit": { "context": 1000000, - "output": 30000 + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -177907,36 +170815,38 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-04-17", - "last_updated": "2026-04-17", + "knowledge": "2026-06", + "release_date": "2026-09-28", + "last_updated": "2026-09-28", "type": "chat" }, { - "id": "gpt-5.5-pro", - "name": "GPT-5.5 Pro", - "display_name": "GPT-5.5 Pro", + "id": "anthropic/claude-fable-5.1", + "name": "Claude Fable 5.1", + "display_name": "Claude Fable 5.1", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1050000, + "context": 1000000, "output": 128000 }, "temperature": false, @@ -177948,259 +170858,310 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], "interleaved": true, "summaries": true, - "visibility": "summary", + "visibility": "omitted", "continuation": [ "thinking_blocks" ], - "effort_options": [ - "medium", - "high", - "xhigh" + "notes": [ + "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", + "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", + "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-12-01", - "release_date": "2026-04-23", - "last_updated": "2026-04-23", + "knowledge": "2026-06", + "release_date": "2026-09-01", + "last_updated": "2026-09-01", "type": "chat" }, { - "id": "grok-4.5", - "name": "Grok 4.5", - "display_name": "Grok 4.5", + "id": "anthropic/claude-opus-4.5", + "name": "Claude Opus 4.5 (latest)", + "display_name": "Claude Opus 4.5 (latest)", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 500000, - "output": 500000 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", + "effort_options": [ + "low", + "medium", + "high" + ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-07-08", - "last_updated": "2026-07-08", + "knowledge": "2025-05", + "release_date": "2025-11-24", + "last_updated": "2025-11-24", "type": "chat" }, { - "id": "qwen3.6-35b-a3b", - "name": "Qwen3.6 35B-A3B", - "display_name": "Qwen3.6 35B-A3B", + "id": "anthropic/claude-sonnet-4.5", + "name": "Claude Sonnet 4.5 (latest)", + "display_name": "Claude Sonnet 4.5 (latest)", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-04-17", - "last_updated": "2026-04-17", + "open_weights": false, + "knowledge": "2025-07-31", + "release_date": "2025-09-29", + "last_updated": "2025-09-29", "type": "chat" }, { - "id": "mistral-large-2512", - "name": "Mistral Large 3", - "display_name": "Mistral Large 3", + "id": "minimax/m3.1-flash", + "name": "MiniMax-M3.1-Flash", + "display_name": "MiniMax-M3.1-Flash", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 8192 + "context": 1000000, + "output": 512000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } }, "attachment": true, - "open_weights": true, - "knowledge": "2024-11", - "release_date": "2025-12-02", - "last_updated": "2025-12-02", + "open_weights": false, + "release_date": "2026-10-19", + "last_updated": "2026-10-19", "type": "chat" }, { - "id": "claude-haiku-4-5", - "name": "Claude Haiku 4.5 (latest)", - "display_name": "Claude Haiku 4.5 (latest)", + "id": "google/gemini-3-flash", + "name": "Gemini 3 Flash Preview", + "display_name": "Gemini 3 Flash Preview", "modalities": { "input": [ "text", - "image" + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 1000000, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", + "low", + "medium", + "high" + ], "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + "thought_signatures" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-02-28", - "release_date": "2025-10-15", - "last_updated": "2025-10-15", + "knowledge": "2025-01", + "release_date": "2025-12-17", + "last_updated": "2025-12-17", "type": "chat" }, { - "id": "gpt-5.4-nano", - "name": "GPT-5.4 nano", - "display_name": "GPT-5.4 nano", + "id": "google/gemini-2.5-pro", + "name": "Gemini 2.5 Pro", + "display_name": "Gemini 2.5 Pro", "modalities": { "input": [ "text", - "image" + "image", + "audio", + "video", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 1000000, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "interleaved": true, + "default_enabled": true, + "mode": "budget", + "budget": { + "default": -1, + "min": 128, + "max": 32768, + "auto": -1, + "unit": "tokens" + }, "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" + "thought_signatures" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-17", - "last_updated": "2026-03-17", + "knowledge": "2025-01", + "release_date": "2025-06-17", + "last_updated": "2025-06-17", "type": "chat" }, { - "id": "gemma-4-31b-it", - "name": "Gemma 4 31B IT", - "display_name": "Gemma 4 31B IT", + "id": "google/gemini-3.5-flash-lite", + "name": "Gemini 3.5 Flash Lite", + "display_name": "Gemini 3.5 Flash Lite", "modalities": { "input": [ "text", - "image" + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 8192 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -178211,29 +171172,31 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "minimal", + "low", + "medium", + "high" ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "open_weights": false, + "knowledge": "2026-03", + "release_date": "2026-07-21", + "last_updated": "2026-07-21", "type": "chat" }, { - "id": "gpt-5.6-luna", - "name": "GPT-5.6 Luna", - "display_name": "GPT-5.6 Luna", + "id": "google/gemini-3.1-flash-lite", + "name": "Gemini 3.1 Flash Lite", + "display_name": "Gemini 3.1 Flash Lite", "modalities": { "input": [ "text", "image", + "video", + "audio", "pdf" ], "output": [ @@ -178242,9 +171205,9 @@ }, "limit": { "context": 1000000, - "output": 128000 + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -178253,54 +171216,40 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ], - "verbosity": "medium", - "verbosity_options": [ + "minimal", "low", "medium", "high" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "knowledge": "2025-01", + "release_date": "2026-05-07", + "last_updated": "2026-05-07", "type": "chat" }, { - "id": "qwen3.8-max", - "name": "Qwen3.8 Max", - "display_name": "Qwen3.8 Max", + "id": "google/gemini-2.5-flash", + "name": "Gemini 2.5 Flash", + "display_name": "Gemini 2.5 Flash", "modalities": { "input": [ "text", - "image" + "image", + "audio", + "video", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 983616, - "output": 131072 + "context": 1000000, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -178311,37 +171260,51 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": true, + "mode": "budget", + "budget": { + "default": -1, + "min": 0, + "max": 24576, + "auto": -1, + "off": 0, + "unit": "tokens" + }, "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" + "thought_signatures" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-08-03", - "last_updated": "2026-08-03", + "knowledge": "2025-01", + "release_date": "2025-06-17", + "last_updated": "2025-06-17", "type": "chat" }, { - "id": "deepseek-v4-pro", - "name": "DeepSeek V4 Pro", - "display_name": "DeepSeek V4 Pro", + "id": "google/gemini-4-argon", + "name": "Gemini 4 Argon", + "display_name": "Gemini 4 Argon", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, + "context": 1048576, "output": 65536 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -178349,41 +171312,30 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", "effort_options": [ "low", - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." + "medium", + "high" ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "attachment": true, + "open_weights": false, + "knowledge": "2026-03", + "release_date": "2026-10-13", + "last_updated": "2026-10-13", "type": "chat" }, { - "id": "claude-fable-5-1", - "name": "Claude Fable 5.1", - "display_name": "Claude Fable 5.1", + "id": "google/gemini-3.7-flash", + "name": "Gemini 3.7 Flash", + "display_name": "Gemini 3.7 Flash", "modalities": { "input": [ "text", "image", + "video", + "audio", "pdf" ], "output": [ @@ -178391,10 +171343,10 @@ ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 1048576, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -178404,43 +171356,38 @@ "reasoning": { "supported": true, "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ + "mode": "level", + "level": "high", + "level_options": [ + "minimal", "low", "medium", - "high", - "xhigh", - "max" + "high" ], - "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", - "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", - "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." + "thought_signatures" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-09-01", - "last_updated": "2026-09-01", + "knowledge": "2026-03", + "release_date": "2026-08-13", + "last_updated": "2026-08-13", "type": "chat" }, { - "id": "claude-sonnet-5", - "name": "Claude Sonnet 5", - "display_name": "Claude Sonnet 5", + "id": "google/gemini-2.5-flash-lite", + "name": "Gemini 2.5 Flash-Lite", + "display_name": "Gemini 2.5 Flash-Lite", "modalities": { "input": [ "text", "image", + "audio", + "video", "pdf" ], "output": [ @@ -178449,34 +171396,42 @@ }, "limit": { "context": 1000000, - "output": 64000 + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "default": -1, + "min": 512, + "max": 24576, + "auto": -1, + "unit": "tokens" + }, "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" + "thought_signatures" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-30", - "last_updated": "2026-06-30", + "knowledge": "2025-01", + "release_date": "2025-06-17", + "last_updated": "2025-06-17", "type": "chat" }, { - "id": "gemini-3.5-flash", + "id": "google/gemini-3.5-flash", "name": "Gemini 3.5 Flash", "display_name": "Gemini 3.5 Flash", "modalities": { @@ -178513,11 +171468,10 @@ "medium", "high" ], - "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" + "thought_signatures" ] } }, @@ -178529,13 +171483,15 @@ "type": "chat" }, { - "id": "gpt-5.6-terra", - "name": "GPT-5.6 Terra", - "display_name": "GPT-5.6 Terra", + "id": "google/gemini-3.8-flash", + "name": "Gemini 3.8 Flash", + "display_name": "Gemini 3.8 Flash", "modalities": { "input": [ "text", "image", + "video", + "audio", "pdf" ], "output": [ @@ -178543,10 +171499,10 @@ ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 1048576, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -178556,72 +171512,37 @@ "reasoning": { "supported": true, "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ], - "verbosity": "medium", - "verbosity_options": [ + "mode": "level", + "level": "high", + "level_options": [ + "minimal", "low", "medium", "high" ], - "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" + "thought_signatures" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", - "type": "chat" - }, - { - "id": "qwen3-coder-next", - "name": "Qwen3 Coder Next", - "display_name": "Qwen3 Coder Next", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 262144, - "output": 65536 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-09", - "release_date": "2026-02-03", - "last_updated": "2026-02-03", + "release_date": "2026-09-02", + "last_updated": "2026-09-02", "type": "chat" }, { - "id": "gpt-5.3-codex", - "name": "GPT-5.3 Codex", - "display_name": "GPT-5.3 Codex", + "id": "google/gemini-3.1-pro", + "name": "Gemini 3.1 Pro Preview", + "display_name": "Gemini 3.1 Pro Preview", "modalities": { "input": [ "text", + "image", + "video", + "audio", "pdf" ], "output": [ @@ -178629,10 +171550,10 @@ ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 1000000, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -178642,39 +171563,30 @@ "reasoning": { "supported": true, "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ + "mode": "level", + "level": "high", + "level_options": [ "low", - "medium", "high" ], - "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" + "thought_signatures" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-05", - "last_updated": "2026-02-05", + "knowledge": "2025-01", + "release_date": "2026-02-19", + "last_updated": "2026-02-19", "type": "chat" }, { - "id": "gemini-3.5-flash-lite", - "name": "Gemini 3.5 Flash Lite", - "display_name": "Gemini 3.5 Flash Lite", + "id": "google/gemini-3.6-flash", + "name": "Gemini 3.6 Flash", + "display_name": "Gemini 3.6 Flash", "modalities": { "input": [ "text", @@ -178700,11 +171612,19 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", + "low", + "medium", + "high" + ], "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" + "thought_signatures" ] } }, @@ -178716,19 +171636,20 @@ "type": "chat" }, { - "id": "glm-5.3", - "name": "GLM-5.3", - "display_name": "GLM-5.3", + "id": "fireworks/ember-1", + "name": "Ember-1", + "display_name": "Ember-1", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, + "context": 1040000, "output": 131072 }, "temperature": true, @@ -178745,89 +171666,84 @@ "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "effort_options": [ + "none", + "low", + "high", + "max" ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "attachment": true, + "open_weights": false, + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" - }, + } + ] + }, + "sakana": { + "id": "sakana", + "name": "Sakana AI", + "display_name": "Sakana AI", + "api": "https://api.sakana.ai/v1", + "doc": "https://console.sakana.ai/models", + "models": [ { - "id": "claude-opus-4-5", - "name": "Claude Opus 4.5 (latest)", - "display_name": "Claude Opus 4.5 (latest)", + "id": "fugu-ultra", + "name": "Fugu Ultra", + "display_name": "Fugu Ultra", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 1000000, + "output": 1000000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", "effort_options": [ - "low", - "medium", - "high" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." + "high", + "xhigh" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-05", - "release_date": "2025-11-24", - "last_updated": "2025-11-24", + "release_date": "2026-06-15", + "last_updated": "2026-06-15", "type": "chat" }, { - "id": "mistral-small-2603", - "name": "Mistral Small 4", - "display_name": "Mistral Small 4", + "id": "sakana-namazu", + "name": "Sakana Namazu", + "display_name": "Sakana Namazu", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 8192 + "context": 262144, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -178835,45 +171751,30 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, "attachment": true, - "open_weights": true, - "knowledge": "2025-06", - "release_date": "2026-03-16", - "last_updated": "2026-03-16", + "open_weights": false, + "release_date": "2026-08-03", + "last_updated": "2026-08-03", "type": "chat" }, { - "id": "gemini-3.1-pro-preview", - "name": "Gemini 3.1 Pro Preview", - "display_name": "Gemini 3.1 Pro Preview", + "id": "fugu", + "name": "Fugu", + "display_name": "Fugu", "modalities": { "input": [ "text", - "image", - "video", - "audio", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 1000000, + "output": 1000000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -178881,50 +171782,36 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "low", - "high" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "high", + "xhigh" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-02-19", - "last_updated": "2026-02-19", + "release_date": "2026-06-15", + "last_updated": "2026-06-15", "type": "chat" }, { - "id": "muse-spark-1.3", - "name": "Muse Spark 1.3", - "display_name": "Muse Spark 1.3", + "id": "fugu-ultra-20260615", + "name": "Fugu Ultra", + "display_name": "Fugu Ultra", "modalities": { "input": [ "text", - "image", - "video", - "pdf", - "audio" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 1000000, + "output": 1000000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -178932,72 +171819,52 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ - "minimal", - "low", - "medium", "high", - "xhigh", - "max" + "xhigh" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-09-02", - "last_updated": "2026-09-02", + "release_date": "2026-06-15", + "last_updated": "2026-06-15", "type": "chat" - }, + } + ] + }, + "poolside": { + "id": "poolside", + "name": "Poolside", + "display_name": "Poolside", + "api": "https://inference.poolside.ai/v1", + "doc": "https://platform.poolside.ai", + "models": [ { - "id": "gpt-5.4", - "name": "GPT-5.4", - "display_name": "GPT-5.4", + "id": "poolside/laguna-m.1", + "name": "Laguna M.1", + "display_name": "Laguna M.1", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 262144, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], "interleaved": true, "summaries": true, "visibility": "summary", @@ -179006,34 +171873,29 @@ ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-05", - "last_updated": "2026-03-05", + "attachment": false, + "open_weights": true, + "release_date": "2026-04-28", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "gemini-3.8-flash", - "name": "Gemini 3.8 Flash", - "display_name": "Gemini 3.8 Flash", + "id": "poolside/laguna-xs-2.1", + "name": "Laguna XS 2.1", + "display_name": "Laguna XS 2.1", "modalities": { "input": [ - "text", - "image", - "video", - "audio", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 262144, + "output": 32768 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -179042,15 +171904,6 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", - "low", - "medium", - "high" - ], "interleaved": true, "summaries": true, "visibility": "summary", @@ -179059,16 +171912,16 @@ ] } }, - "attachment": true, - "open_weights": false, - "release_date": "2026-09-02", - "last_updated": "2026-09-02", + "attachment": false, + "open_weights": true, + "release_date": "2026-07-02", + "last_updated": "2026-07-02", "type": "chat" }, { - "id": "kimi-k3", - "name": "Kimi K3", - "display_name": "Kimi K3", + "id": "poolside/laguna-s-2.1", + "name": "Laguna S 2.1", + "display_name": "Laguna S 2.1", "modalities": { "input": [ "text" @@ -179079,9 +171932,9 @@ }, "limit": { "context": 1048576, - "output": 131072 + "output": 32768 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -179100,14 +171953,23 @@ }, "attachment": false, "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-16", + "release_date": "2026-07-21", + "last_updated": "2026-07-21", "type": "chat" - }, + } + ] + }, + "kilo": { + "id": "kilo", + "name": "Kilo Gateway", + "display_name": "Kilo Gateway", + "api": "https://api.kilo.ai/api/gateway", + "doc": "https://kilo.ai", + "models": [ { - "id": "sonar-reasoning-pro", - "name": "Sonar Reasoning Pro", - "display_name": "Sonar Reasoning Pro", + "id": "writer/palmyra-x5", + "name": "Writer: Palmyra X5", + "display_name": "Writer: Palmyra X5", "modalities": { "input": [ "text" @@ -179117,42 +171979,27 @@ ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 1040000, + "output": 8192 }, "temperature": true, "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": false, "open_weights": false, - "knowledge": "2025-09-01", - "release_date": "2024-01-01", - "last_updated": "2025-09-01", + "release_date": "2025-04-28", + "last_updated": "2025-04-28", "type": "chat" }, { - "id": "grok-build-0.1", - "name": "Grok Build 0.1", - "display_name": "Grok Build 0.1", + "id": "relace/relace-search", + "name": "Relace: Relace Search", + "display_name": "Relace: Relace Search", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" @@ -179160,136 +172007,78 @@ }, "limit": { "context": 256000, - "output": 256000 + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2026-04-16", - "last_updated": "2026-04-16", + "release_date": "2025-12-08", + "last_updated": "2025-12-08", "type": "chat" }, { - "id": "claude-opus-5", - "name": "Claude Opus 5", - "display_name": "Claude Opus 5", + "id": "relace/relace-apply-3", + "name": "Relace: Relace Apply 3", + "display_name": "Relace: Relace Apply 3", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, + "context": 256000, "output": 128000 }, "temperature": false, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2026-05", - "release_date": "2026-07-24", - "last_updated": "2026-07-24", + "release_date": "2025-09-26", + "last_updated": "2025-09-26", "type": "chat" }, { - "id": "claude-sonnet-4-6", - "name": "Claude Sonnet 4.6", - "display_name": "Claude Sonnet 4.6", + "id": "meta-llama/llama-3.2-3b-instruct", + "name": "Meta: Llama 3.2 3B Instruct", + "display_name": "Meta: Llama 3.2 3B Instruct", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 64000 + "context": 131072, + "output": 117964 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." - ] - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-17", - "last_updated": "2026-03-13", + "attachment": false, + "open_weights": true, + "knowledge": "2023-12", + "release_date": "2024-09-25", + "last_updated": "2024-09-25", "type": "chat" }, { - "id": "gpt-6-astra", - "name": "GPT-6 Astra", - "display_name": "GPT-6 Astra", + "id": "meta-llama/llama-guard-4-12b", + "name": "Meta: Llama Guard 4 12B", + "display_name": "Meta: Llama Guard 4 12B", "modalities": { "input": [ "text", @@ -179300,44 +172089,24 @@ ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 163840, + "output": 16384 }, - "temperature": false, - "tool_call": true, + "temperature": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ] - } + "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2026-04-30", - "release_date": "2026-09-04", - "last_updated": "2026-09-04", + "open_weights": true, + "release_date": "2025-04-29", + "last_updated": "2025-04-29", "type": "chat" }, { - "id": "sonar-pro", - "name": "Sonar Pro", - "display_name": "Sonar Pro", + "id": "meta-llama/llama-3.1-8b-instruct", + "name": "Llama-3.1-8B-Instruct", + "display_name": "Llama-3.1-8B-Instruct", "modalities": { "input": [ "text" @@ -179347,25 +172116,25 @@ ] }, "limit": { - "context": 200000, - "output": 8000 + "context": 131072, + "output": 117964 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, "attachment": false, - "open_weights": false, - "knowledge": "2025-09-01", - "release_date": "2024-01-01", - "last_updated": "2025-09-01", + "open_weights": true, + "knowledge": "2023-12", + "release_date": "2024-07-23", + "last_updated": "2024-07-23", "type": "chat" }, { - "id": "sonar", - "name": "Sonar", - "display_name": "Sonar", + "id": "meta-llama/llama-3.2-1b-instruct", + "name": "Llama 3.2 1B Instruct", + "display_name": "Llama 3.2 1B Instruct", "modalities": { "input": [ "text" @@ -179375,8 +172144,8 @@ ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 60000, + "output": 54000 }, "temperature": true, "tool_call": false, @@ -179384,69 +172153,45 @@ "supported": false }, "attachment": false, - "open_weights": false, - "knowledge": "2025-09-01", - "release_date": "2024-01-01", - "last_updated": "2025-09-01", + "open_weights": true, + "knowledge": "2023-12", + "release_date": "2024-09-25", + "last_updated": "2024-09-25", "type": "chat" }, { - "id": "gemini-3.7-flash", - "name": "Gemini 3.7 Flash", - "display_name": "Gemini 3.7 Flash", + "id": "meta-llama/llama-4-scout", + "name": "Meta: Llama 4 Scout", + "display_name": "Meta: Llama 4 Scout", "modalities": { "input": [ "text", - "image", - "video", - "audio", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 327680, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", - "low", - "medium", - "high" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-08-13", - "last_updated": "2026-08-13", + "open_weights": true, + "knowledge": "2024-08", + "release_date": "2025-04-05", + "last_updated": "2025-04-05", "type": "chat" }, { - "id": "gpt-oss-120b", - "name": "GPT OSS 120B", - "display_name": "GPT OSS 120B", + "id": "meta-llama/llama-3.3-70b-instruct", + "name": "Llama-3.3-70B-Instruct", + "display_name": "Llama-3.3-70B-Instruct", "modalities": { "input": [ "text" @@ -179456,94 +172201,165 @@ ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 131072, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": false, "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "knowledge": "2023-12", + "release_date": "2024-12-06", + "last_updated": "2024-12-06", "type": "chat" }, { - "id": "gpt-5.5", - "name": "GPT-5.5", - "display_name": "GPT-5.5", + "id": "meta-llama/llama-4-maverick", + "name": "Meta: Llama 4 Maverick", + "display_name": "Meta: Llama 4 Maverick", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 128000, + "output": 16384 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": true, + "open_weights": true, + "knowledge": "2024-08", + "release_date": "2025-04-05", + "last_updated": "2025-04-05", + "type": "chat" + }, + { + "id": "meta-llama/llama-3.1-70b-instruct", + "name": "Llama-3.1-70B-Instruct", + "display_name": "Llama-3.1-70B-Instruct", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 131072, + "output": 16384 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "knowledge": "2023-12", + "release_date": "2024-07-23", + "last_updated": "2024-07-23", + "type": "chat" + }, + { + "id": "microsoft/phi-4", + "name": "Microsoft: Phi 4", + "display_name": "Microsoft: Phi 4", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 16384, + "output": 14745 + }, + "temperature": true, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, "open_weights": false, - "knowledge": "2025-12-01", - "release_date": "2026-04-23", - "last_updated": "2026-04-23", + "release_date": "2025-01-10", + "last_updated": "2025-01-10", "type": "chat" }, { - "id": "glm-5.2", - "name": "GLM-5.2", - "display_name": "GLM-5.2", + "id": "cognitivecomputations/dolphin-mistral-24b-venice-edition", + "name": "Venice: Uncensored", + "display_name": "Venice: Uncensored", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 128000, + "output": 8192 + }, + "temperature": true, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "knowledge": "2024-04-30", + "release_date": "2025-07-09", + "last_updated": "2025-07-09", + "type": "chat" + }, + { + "id": "anthracite-org/magnum-v4-72b", + "name": "Magnum v4 72B", + "display_name": "Magnum v4 72B", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 32768, + "output": 4096 + }, + "temperature": true, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "knowledge": "2024-06-30", + "release_date": "2024-10-22", + "last_updated": "2024-10-22", + "type": "chat" + }, + { + "id": "liquid/lfm-2.5-2.6b:free", + "name": "LiquidAI: LFM2.5-2.6B (free)", + "display_name": "LiquidAI: LFM2.5-2.6B (free)", "modalities": { "input": [ "text" @@ -179553,8 +172369,8 @@ ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 65536, + "output": 8192 }, "temperature": true, "tool_call": true, @@ -179564,99 +172380,67 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "high" ] } }, "attachment": false, - "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "open_weights": false, + "release_date": "2026-08-11", + "last_updated": "2026-08-11", "type": "chat" }, { - "id": "claude-opus-4-6", - "name": "Claude Opus 4.6", - "display_name": "Claude Opus 4.6", + "id": "liquid/lfm-2.5-24b-a2b", + "name": "LiquidAI: LFM2.5-24B-A2B", + "display_name": "LiquidAI: LFM2.5-24B-A2B", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 128000, + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", "effort_options": [ - "low", - "medium", - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." + "high" ] } }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-05-31", - "release_date": "2026-02-05", - "last_updated": "2026-03-13", + "release_date": "2026-10-13", + "last_updated": "2026-10-13", "type": "chat" }, { - "id": "gemini-3-flash-preview", - "name": "Gemini 3 Flash Preview", - "display_name": "Gemini 3 Flash Preview", + "id": "liquid/lfm-2.5-2.6b", + "name": "LiquidAI: LFM2.5-2.6B", + "display_name": "LiquidAI: LFM2.5-2.6B", "modalities": { "input": [ - "text", - "image", - "video", - "audio", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 128000, + "output": 8192 }, "temperature": true, "tool_call": true, @@ -179667,34 +172451,21 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", - "low", - "medium", + "effort_options": [ "high" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" ] } }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-12-17", - "last_updated": "2025-12-17", + "release_date": "2026-08-11", + "last_updated": "2026-08-11", "type": "chat" }, { - "id": "gpt-oss-20b", - "name": "GPT OSS 20B", - "display_name": "GPT OSS 20B", + "id": "moonshotai/kimi-k2", + "name": "Kimi K2 0711", + "display_name": "Kimi K2 0711", "modalities": { "input": [ "text" @@ -179704,49 +172475,36 @@ ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 131072, + "output": 98304 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": false, "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "knowledge": "2024-12-31", + "release_date": "2025-07-11", + "last_updated": "2025-07-11", "type": "chat" }, { - "id": "minimax-m3", - "name": "MiniMax-M3", - "display_name": "MiniMax-M3", + "id": "moonshotai/kimi-k2-thinking", + "name": "Kimi K2 Thinking", + "display_name": "Kimi K2 Thinking", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 262144, + "output": 98304 }, "temperature": true, "tool_call": true, @@ -179762,32 +172520,38 @@ "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "effort_options": [ + "high" ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-06-01", - "last_updated": "2026-06-01", + "knowledge": "2024-08", + "release_date": "2025-11-06", + "last_updated": "2025-11-06", "type": "chat" }, { - "id": "glm-5.3-flash", - "name": "GLM-5.3-Flash", - "display_name": "GLM-5.3-Flash", + "id": "moonshotai/kimi-k3.1-pro", + "name": "MoonshotAI: Kimi K3.1 Pro", + "display_name": "MoonshotAI: Kimi K3.1 Pro", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 1048576, + "output": 943718 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -179795,36 +172559,36 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "none", + "low", + "high", + "max" ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", + "attachment": true, + "open_weights": false, + "release_date": "2026-10-23", + "last_updated": "2026-10-23", "type": "chat" }, { - "id": "minimax-m2.7", - "name": "MiniMax-M2.7", - "display_name": "MiniMax-M2.7", + "id": "moonshotai/kimi-k2.7-code", + "name": "Kimi K2.7 Code", + "display_name": "Kimi K2.7 Code", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 196608, - "output": 131072 + "context": 262144, + "output": 235929 }, "temperature": true, "tool_call": true, @@ -179835,24 +172599,22 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "high" ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-03-18", - "last_updated": "2026-03-18", + "knowledge": "2025-01", + "release_date": "2026-06-12", + "last_updated": "2026-06-12", "type": "chat" }, { - "id": "grok-4.6", - "name": "Grok 4.6", - "display_name": "Grok 4.6", + "id": "moonshotai/kimi-k2.6", + "name": "Kimi K2.6", + "display_name": "Kimi K2.6", "modalities": { "input": [ "text", @@ -179863,8 +172625,8 @@ ] }, "limit": { - "context": 500000, - "output": 500000 + "context": 262144, + "output": 235929 }, "temperature": true, "tool_call": true, @@ -179875,25 +172637,23 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "none", + "high" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-02-01", - "release_date": "2026-08-12", - "last_updated": "2026-08-12", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-04-20", + "last_updated": "2026-04-20", "type": "chat" }, { - "id": "qwen3.8-2.4t-a95b", - "name": "Qwen3.8 2.4T A95B", - "display_name": "Qwen3.8 2.4T A95B", + "id": "moonshotai/kimi-k2-0905", + "name": "Kimi K2 Instruct 0905", + "display_name": "Kimi K2 Instruct 0905", "modalities": { "input": [ "text" @@ -179904,107 +172664,76 @@ }, "limit": { "context": 262144, - "output": 131072 + "output": 98304 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": false, "open_weights": true, - "release_date": "2026-08-12", - "last_updated": "2026-08-12", + "release_date": "2025-09-05", + "last_updated": "2025-09-05", "type": "chat" }, { - "id": "claude-opus-4-8", - "name": "Claude Opus 4.8", - "display_name": "Claude Opus 4.8", + "id": "moonshotai/kimi-k3", + "name": "Kimi K3", + "display_name": "Kimi K3", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 1048576, + "output": 943718 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "high", "effort_options": [ + "none", "low", - "medium", "high", - "xhigh", "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-01", - "release_date": "2026-05-28", - "last_updated": "2026-05-28", + "open_weights": true, + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" }, { - "id": "muse-spark-1.2", - "name": "Muse Spark 1.2", - "display_name": "Muse Spark 1.2", + "id": "moonshotai/kimi-k2.5", + "name": "Kimi K2.5", + "display_name": "Kimi K2.5", "modalities": { "input": [ "text", - "image", - "video", - "pdf", - "audio" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 262144, + "output": 235929 }, "temperature": true, "tool_call": true, @@ -180022,39 +172751,35 @@ "thinking_blocks" ], "effort_options": [ - "minimal", - "low", - "medium", - "high", - "xhigh" + "none", + "high" ] } }, "attachment": true, - "open_weights": false, - "release_date": "2026-08-05", - "last_updated": "2026-08-05", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-01-27", + "last_updated": "2026-01-27", "type": "chat" }, { - "id": "claude-fable-5", - "name": "Claude Fable 5", - "display_name": "Claude Fable 5", + "id": "deepseek/deepseek-v4-flash-0731", + "name": "DeepSeek V4 Flash 0731", + "display_name": "DeepSeek V4 Flash 0731", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 1048576, + "output": 943718 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -180063,54 +172788,38 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", "effort_options": [ + "none", "low", - "medium", "high", - "xhigh", "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", - "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", - "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-09", - "last_updated": "2026-06-09", + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-07-31", + "last_updated": "2026-07-31", "type": "chat" }, { - "id": "gpt-5.4-pro", - "name": "GPT-5.4 Pro", - "display_name": "GPT-5.4 Pro", + "id": "deepseek/deepseek-v4-flash", + "name": "DeepSeek V4 Flash", + "display_name": "DeepSeek V4 Flash", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1048575, + "output": 943717 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -180123,96 +172832,60 @@ "mode": "effort", "effort": "high", "effort_options": [ - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ "low", - "medium", - "high" + "high", + "max" ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "notes": [ + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-05", - "last_updated": "2026-03-05", + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" - } - ] - }, - "abacus": { - "id": "abacus", - "name": "Abacus", - "display_name": "Abacus", - "api": "https://routellm.abacus.ai/v1", - "doc": "https://abacus.ai/help/api", - "models": [ + }, { - "id": "gpt-5.2", - "name": "GPT-5.2", - "display_name": "GPT-5.2", + "id": "deepseek/deepseek-chat", + "name": "DeepSeek Chat", + "display_name": "DeepSeek Chat", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 128000, + "output": 16000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2025-12-11", - "last_updated": "2025-12-11", + "attachment": false, + "open_weights": true, + "knowledge": "2025-09", + "release_date": "2025-12-01", + "last_updated": "2026-02-28", "type": "chat" }, { - "id": "claude-haiku-4-5-20251001", - "name": "Claude Haiku 4.5", - "display_name": "Claude Haiku 4.5", + "id": "deepseek/deepseek-v4.1-flash", + "name": "DeepSeek V4.1 Flash", + "display_name": "DeepSeek V4.1 Flash", "modalities": { "input": [ "text", @@ -180223,167 +172896,121 @@ ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 1048576, + "output": 943718 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + "effort_options": [ + "none", + "low", + "high", + "max" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-02-28", - "release_date": "2025-10-15", - "last_updated": "2025-10-15", + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-09-10", + "last_updated": "2026-09-10", "type": "chat" }, { - "id": "gpt-5.4-mini", - "name": "GPT-5.4 mini", - "display_name": "GPT-5.4 mini", + "id": "deepseek/deepseek-chat-v3.1", + "name": "DeepSeek V3.1", + "display_name": "DeepSeek V3.1", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 163840, + "output": 147456 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", "effort_options": [ "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", "high" - ], - "visibility": "hidden" + ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-17", - "last_updated": "2026-03-17", + "attachment": false, + "open_weights": true, + "knowledge": "2025-03-31", + "release_date": "2025-08-21", + "last_updated": "2025-08-21", "type": "chat" }, { - "id": "claude-opus-4-7", - "name": "Claude Opus 4.7", - "display_name": "Claude Opus 4.7", + "id": "deepseek/deepseek-v3.2-exp", + "name": "DeepSeek: DeepSeek V3.2 Exp", + "display_name": "DeepSeek: DeepSeek V3.2 Exp", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 163840, + "output": 147456 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "high", "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." + "none", + "high" ] } }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-04-16", - "last_updated": "2026-04-16", + "release_date": "2025-09-29", + "last_updated": "2025-09-29", "type": "chat" }, { - "id": "grok-4-0709", - "name": "Grok 4", - "display_name": "Grok 4", + "id": "deepseek/deepseek-v3.1-terminus", + "name": "DeepSeek: DeepSeek V3.1 Terminus", + "display_name": "DeepSeek: DeepSeek V3.1 Terminus", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 16384 + "context": 163840, + "output": 147456 }, "temperature": true, "tool_call": true, @@ -180391,32 +173018,39 @@ "supported": true, "default": true }, - "attachment": true, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "high" + ] + } + }, + "attachment": false, "open_weights": false, - "release_date": "2025-07-09", - "last_updated": "2025-07-09", + "release_date": "2025-09-22", + "last_updated": "2025-09-22", "type": "chat" }, { - "id": "gemini-3-pro-image", - "name": "Nano Banana Pro", - "display_name": "Nano Banana Pro", + "id": "deepseek/deepseek-v4-flash-vision-exp", + "name": "DeepSeek V4 Flash Vision Exp", + "display_name": "DeepSeek V4 Flash Vision Exp", "modalities": { "input": [ "text", "image" ], "output": [ - "text", - "image" + "text" ] }, "limit": { - "context": 65536, - "output": 32768 + "context": 1048576, + "output": 262144 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, "default": true @@ -180425,43 +173059,47 @@ "reasoning": { "supported": true, "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ + "mode": "effort", + "effort": "high", + "effort_options": [ "low", - "high" + "high", + "max" ], + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" + ], + "notes": [ + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-05-28", - "last_updated": "2026-05-28" + "open_weights": true, + "release_date": "2026-08-21", + "last_updated": "2026-09-01", + "type": "chat" }, { - "id": "gpt-5.6-sol", - "name": "GPT-5.6 Sol", - "display_name": "GPT-5.6 Sol", + "id": "deepseek/deepseek-v4-pro", + "name": "DeepSeek V4 Pro", + "display_name": "DeepSeek V4 Pro", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 1024000, + "output": 384000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -180472,35 +173110,34 @@ "supported": true, "default_enabled": true, "mode": "effort", - "effort": "medium", + "effort": "high", "effort_options": [ - "none", "low", - "medium", "high", - "xhigh", "max" ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ], - "visibility": "hidden" + "notes": [ + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." + ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "gpt-5.2-codex", - "name": "GPT-5.2 Codex", - "display_name": "GPT-5.2 Codex", + "id": "deepseek/deepseek-v4.1-flash-1017", + "name": "DeepSeek V4.1 Flash 1017", + "display_name": "DeepSeek V4.1 Flash 1017", "modalities": { "input": [ "text", @@ -180511,10 +173148,10 @@ ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 1048576, + "output": 393216 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -180522,76 +173159,73 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", "effort_options": [ + "none", "low", - "medium", "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "max" + ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2025-12-11", - "last_updated": "2025-12-11", + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-10-17", + "last_updated": "2026-10-17", "type": "chat" }, { - "id": "gpt-5.3-chat-latest", - "name": "GPT-5.3 Chat Latest", - "display_name": "GPT-5.3 Chat Latest", + "id": "deepseek/deepseek-v3.2", + "name": "DeepSeek V3.2", + "display_name": "DeepSeek V3.2", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 131072, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-03", - "last_updated": "2026-03-03", + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "none", + "high" + ] + } + }, + "attachment": false, + "open_weights": true, + "knowledge": "2024-07", + "release_date": "2025-12-01", + "last_updated": "2025-12-01", "type": "chat" }, { - "id": "grok-4.3", - "name": "Grok 4.3", - "display_name": "Grok 4.3", + "id": "deepseek/deepseek-r1-0528", + "name": "DeepSeek R1 0528", + "display_name": "DeepSeek R1 0528", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, + "context": 163840, "output": 32768 }, "temperature": true, @@ -180602,19 +173236,28 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "high" + ] } }, - "attachment": true, - "open_weights": false, - "release_date": "2026-04-17", - "last_updated": "2026-04-17", + "attachment": false, + "open_weights": true, + "release_date": "2025-05-28", + "last_updated": "2025-05-28", "type": "chat" }, { - "id": "llama-3.3-70b-versatile", - "name": "Llama 3.3 70B Versatile", - "display_name": "Llama 3.3 70B Versatile", + "id": "deepseek/deepseek-chat-v3-0324", + "name": "DeepSeek V3 0324", + "display_name": "DeepSeek V3 0324", "modalities": { "input": [ "text" @@ -180625,7 +173268,7 @@ }, "limit": { "context": 128000, - "output": 32768 + "output": 115200 }, "temperature": true, "tool_call": true, @@ -180634,27 +173277,26 @@ }, "attachment": false, "open_weights": true, - "knowledge": "2023-12", - "release_date": "2024-12-06", - "last_updated": "2024-12-06", + "knowledge": "2024-07-31", + "release_date": "2025-03-24", + "last_updated": "2025-03-24", "type": "chat" }, { - "id": "grok-4.5", - "name": "Grok 4.5", - "display_name": "Grok 4.5", + "id": "deepseek/deepseek-v4-pro-0813", + "name": "DeepSeek V4 Pro 0813", + "display_name": "DeepSeek V4 Pro 0813", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 500000, - "output": 32768 + "context": 1048576, + "output": 393216 }, "temperature": true, "tool_call": true, @@ -180664,19 +173306,25 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "effort_options": [ + "none", + "low", + "high", + "max" + ] } }, - "attachment": true, - "open_weights": false, - "release_date": "2026-07-08", - "last_updated": "2026-07-08", + "attachment": false, + "open_weights": true, + "release_date": "2026-08-13", + "last_updated": "2026-08-22", "type": "chat" }, { - "id": "kimi-k2-turbo-preview", - "name": "Kimi K2 Turbo Preview", - "display_name": "Kimi K2 Turbo Preview", + "id": "inference-net/schematron-v2-turbo", + "name": "Inference.net: Schematron V2 Turbo", + "display_name": "Inference.net: Schematron V2 Turbo", "modalities": { "input": [ "text" @@ -180686,87 +173334,64 @@ ] }, "limit": { - "context": 256000, + "context": 128000, "output": 8192 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, "attachment": false, "open_weights": false, - "release_date": "2025-07-08", - "last_updated": "2025-07-08", + "release_date": "2026-04-16", + "last_updated": "2026-04-16", "type": "chat" }, { - "id": "gpt-5-nano", - "name": "GPT-5 Nano", - "display_name": "GPT-5 Nano", + "id": "inference-net/schematron-v2-small", + "name": "Inference.net: Schematron V2 Small", + "display_name": "Inference.net: Schematron V2 Small", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 128000, + "output": 4096 }, - "temperature": false, - "tool_call": true, + "temperature": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "minimal", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2024-05-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "release_date": "2026-04-16", + "last_updated": "2026-04-16", "type": "chat" }, { - "id": "gpt-4o", - "name": "GPT-4o", - "display_name": "GPT-4o", + "id": "openai/gpt-4.1-nano", + "name": "GPT-4.1 nano", + "display_name": "GPT-4.1 nano", "modalities": { "input": [ + "image", "text", - "image" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 1047576, + "output": 942818 }, "temperature": true, "tool_call": true, @@ -180775,71 +173400,61 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2023-09", - "release_date": "2024-05-13", - "last_updated": "2024-08-06", + "knowledge": "2024-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", "type": "chat" }, { - "id": "gpt-5.4-nano", - "name": "GPT-5.4 nano", - "display_name": "GPT-5.4 nano", + "id": "openai/gpt-6.1-terra", + "name": "OpenAI: GPT-6.1 Terra", + "display_name": "OpenAI: GPT-6.1 Terra", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 400000, + "context": 1050000, "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", "effort_options": [ "none", "low", "medium", "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "xhigh", + "max" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-17", - "last_updated": "2026-03-17", + "knowledge": "2026-06-01", + "release_date": "2026-10-26", + "last_updated": "2026-10-26", "type": "chat" }, { - "id": "gpt-5.3-codex-xhigh", - "name": "GPT-5.3 Codex XHigh", - "display_name": "GPT-5.3 Codex XHigh", + "id": "openai/gpt-3.5-turbo-16k", + "name": "OpenAI: GPT-3.5 Turbo 16k", + "display_name": "OpenAI: GPT-3.5 Turbo 16k", "modalities": { "input": [ "text", - "image", "pdf" ], "output": [ @@ -180847,10 +173462,37 @@ ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 16385, + "output": 4096 }, - "temperature": false, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": false, + "release_date": "2023-08-28", + "last_updated": "2023-08-28", + "type": "chat" + }, + { + "id": "openai/gpt-oss-20b", + "name": "GPT OSS 20B", + "display_name": "GPT OSS 20B", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 131072, + "output": 32768 + }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -180858,47 +173500,37 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ + "supported": true, + "effort_options": [ "low", "medium", "high" - ], - "visibility": "hidden" + ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-05", - "last_updated": "2026-02-05", + "attachment": false, + "open_weights": true, + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "gpt-5.6-luna", - "name": "GPT-5.6 Luna", - "display_name": "GPT-5.6 Luna", + "id": "openai/gpt-5.6-terra", + "name": "GPT-5.6 Terra", + "display_name": "GPT-5.6 Terra", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, + "context": 1050000, "output": 128000 }, "temperature": false, @@ -180938,124 +173570,125 @@ "type": "chat" }, { - "id": "qwen3.8-max", - "name": "Qwen3.8 Max", - "display_name": "Qwen3.8 Max", + "id": "openai/gpt-4o-2024-05-13", + "name": "GPT-4o (2024-05-13)", + "display_name": "GPT-4o (2024-05-13)", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 128000, + "output": 4096 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, "attachment": true, "open_weights": false, - "release_date": "2026-08-03", - "last_updated": "2026-08-03", + "knowledge": "2023-09", + "release_date": "2024-05-13", + "last_updated": "2024-05-13", "type": "chat" }, { - "id": "gemini-2.5-pro", - "name": "Gemini 2.5 Pro", - "display_name": "Gemini 2.5 Pro", + "id": "openai/gpt-5.4", + "name": "GPT-5.4", + "display_name": "GPT-5.4", "modalities": { "input": [ "text", "image", - "audio" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "budget", - "budget": { - "default": -1, - "min": 128, - "max": 32768, - "auto": -1, - "unit": "tokens" - }, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-06-17", - "last_updated": "2025-06-17", + "knowledge": "2025-08-31", + "release_date": "2026-03-05", + "last_updated": "2026-03-05", "type": "chat" }, { - "id": "gpt-5.1-codex-max", - "name": "GPT-5.1 Codex Max", - "display_name": "GPT-5.1 Codex Max", + "id": "openai/gpt-5.6-sol", + "name": "GPT-5.6 Sol", + "display_name": "GPT-5.6 Sol", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 400000, + "context": 1050000, "output": 128000 }, "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, + "default_enabled": true, "mode": "effort", - "effort": "none", + "effort": "medium", "effort_options": [ "none", "low", "medium", - "high" + "high", + "xhigh", + "max" ], "verbosity": "medium", "verbosity_options": [ @@ -181068,30 +173701,30 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-11-13", - "last_updated": "2025-11-13", + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "claude-sonnet-4-20250514", - "name": "Claude Sonnet 4", - "display_name": "Claude Sonnet 4", + "id": "openai/gpt-5.4-mini", + "name": "GPT-5.4 mini", + "display_name": "GPT-5.4 mini", "modalities": { "input": [ - "text", + "pdf", "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -181101,46 +173734,49 @@ "reasoning": { "supported": true, "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." - ] + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2025-03-31", - "release_date": "2025-05-22", - "last_updated": "2025-05-22", + "knowledge": "2025-08-31", + "release_date": "2026-03-17", + "last_updated": "2026-03-17", "type": "chat" }, { - "id": "route-llm", - "name": "RouteLLM", - "display_name": "RouteLLM", + "id": "openai/gpt-audio-mini", + "name": "GPT-Audio Mini", + "display_name": "GPT-Audio Mini", "modalities": { "input": [ "text", - "image" + "audio", + "pdf" ], "output": [ - "text" + "text", + "audio" ] }, "limit": { "context": 128000, - "output": 64000 + "output": 16384 }, "temperature": true, "tool_call": true, @@ -181149,74 +173785,79 @@ }, "attachment": true, "open_weights": false, - "release_date": "2024-01-01", - "last_updated": "2026-07-10", + "knowledge": "2023-10-01", + "release_date": "2025-10-06", + "last_updated": "2025-10-06", "type": "chat" }, { - "id": "claude-sonnet-5", - "name": "Claude Sonnet 5", - "display_name": "Claude Sonnet 5", + "id": "openai/gpt-4o", + "name": "GPT-4o", + "display_name": "GPT-4o", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 64000 + "context": 128000, + "output": 16384 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-30", - "last_updated": "2026-06-30", + "knowledge": "2023-09", + "release_date": "2024-05-13", + "last_updated": "2024-08-06", "type": "chat" }, { - "id": "o3-mini", - "name": "o3-mini", - "display_name": "o3-mini", + "id": "openai/gpt-5.1-codex-mini", + "name": "GPT-5.1 Codex mini", + "display_name": "GPT-5.1 Codex mini", "modalities": { "input": [ - "text" + "image", + "text", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 400000, + "output": 128000 }, "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, + "default_enabled": false, "mode": "effort", - "effort": "medium", + "effort": "none", "effort_options": [ + "none", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ "low", "medium", "high" @@ -181224,32 +173865,32 @@ "visibility": "hidden" } }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2024-05", - "release_date": "2024-12-20", - "last_updated": "2025-01-29", + "knowledge": "2024-09-30", + "release_date": "2025-11-13", + "last_updated": "2025-11-13", "type": "chat" }, { - "id": "gemini-3.5-flash", - "name": "Gemini 3.5 Flash", - "display_name": "Gemini 3.5 Flash", + "id": "openai/gpt-5.6-luna", + "name": "GPT-5.6 Luna", + "display_name": "GPT-5.6 Luna", "modalities": { "input": [ "text", "image", - "audio" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -181259,43 +173900,48 @@ "reasoning": { "supported": true, "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", + "mode": "effort", + "effort": "medium", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ], + "verbosity": "medium", + "verbosity_options": [ "low", "medium", "high" ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-05-19", - "last_updated": "2026-05-19", + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "gpt-5.6-terra", - "name": "GPT-5.6 Terra", - "display_name": "GPT-5.6 Terra", + "id": "openai/gpt-5.6-luna-pro", + "name": "GPT-5.6 Luna", + "display_name": "GPT-5.6 Luna", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, + "context": 1050000, "output": 128000 }, "temperature": false, @@ -181306,10 +173952,6 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", "effort_options": [ "none", "low", @@ -181317,14 +173959,7 @@ "high", "xhigh", "max" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + ] } }, "attachment": true, @@ -181335,57 +173970,42 @@ "type": "chat" }, { - "id": "o3", - "name": "o3", - "display_name": "o3", + "id": "openai/gpt-3.5-turbo-0613", + "name": "OpenAI: GPT-3.5 Turbo (older v0613)", + "display_name": "OpenAI: GPT-3.5 Turbo (older v0613)", "modalities": { "input": [ "text", - "image" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 4095, + "output": 3685 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2024-05", - "release_date": "2025-04-16", - "last_updated": "2025-04-16", + "release_date": "2024-01-25", + "last_updated": "2024-01-25", "type": "chat" }, { - "id": "gpt-5.3-codex", - "name": "GPT-5.3 Codex", - "display_name": "GPT-5.3 Codex", + "id": "openai/gpt-5.1-codex", + "name": "GPT-5.1 Codex", + "display_name": "GPT-5.1 Codex", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" @@ -181395,23 +174015,23 @@ "context": 400000, "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, + "default_enabled": false, "mode": "effort", - "effort": "medium", + "effort": "none", "effort_options": [ + "none", "low", "medium", - "high", - "xhigh" + "high" ], "verbosity": "medium", "verbosity_options": [ @@ -181424,51 +174044,46 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-05", - "last_updated": "2026-02-05", + "knowledge": "2024-09-30", + "release_date": "2025-11-13", + "last_updated": "2025-11-13", "type": "chat" }, { - "id": "gemini-3.5-flash-lite", - "name": "Gemini 3.5 Flash Lite", - "display_name": "Gemini 3.5 Flash Lite", + "id": "openai/gpt-audio", + "name": "GPT-Audio", + "display_name": "GPT-Audio", "modalities": { "input": [ "text", - "image", - "audio" + "audio", + "pdf" ], "output": [ - "text" + "text", + "audio" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 128000, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-07-21", - "last_updated": "2026-07-21", + "knowledge": "2023-10-01", + "release_date": "2025-08-28", + "last_updated": "2025-08-28", "type": "chat" }, { - "id": "claude-3-7-sonnet-20250219", - "name": "Claude Sonnet 3.7", - "display_name": "Claude Sonnet 3.7", + "id": "openai/gpt-4.1", + "name": "GPT-4.1", + "display_name": "GPT-4.1", "modalities": { "input": [ "text", @@ -181480,163 +174095,100 @@ ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 1047576, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": false, - "summaries": false, - "visibility": "full", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Anthropic uses thinking budget tokens" - ] - } + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2024-10-31", - "release_date": "2025-02-19", - "last_updated": "2025-02-19", + "knowledge": "2024-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", "type": "chat" }, { - "id": "qwen3-max", - "name": "Qwen3 Max", - "display_name": "Qwen3 Max", + "id": "openai/gpt-4o-mini-2024-07-18", + "name": "OpenAI: GPT-4o-mini (2024-07-18)", + "display_name": "OpenAI: GPT-4o-mini (2024-07-18)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, + "context": 128000, "output": 16384 }, "temperature": true, "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, - "attachment": false, - "open_weights": false, - "knowledge": "2025-04", - "release_date": "2025-09-23", - "last_updated": "2025-09-23", - "type": "chat" - }, - { - "id": "gemini-2.5-flash-image", - "name": "Nano Banana", - "display_name": "Nano Banana", - "modalities": { - "input": [ - "text", - "image" - ], - "output": [ - "text", - "image" - ] - }, - "limit": { - "context": 32768, - "output": 32768 - }, - "temperature": true, - "tool_call": false, "reasoning": { "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2024-06", - "release_date": "2025-08-26", - "last_updated": "2025-08-26" + "knowledge": "2023-09", + "release_date": "2024-07-18", + "last_updated": "2024-07-18", + "type": "chat" }, { - "id": "qwen3.7-max", - "name": "Qwen3.7 Max", - "display_name": "Qwen3.7 Max", + "id": "openai/gpt-4o-2024-08-06", + "name": "GPT-4o (2024-08-06)", + "display_name": "GPT-4o (2024-08-06)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 64000 + "context": 128000, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-05-21", - "last_updated": "2026-05-21", + "knowledge": "2023-09", + "release_date": "2024-08-06", + "last_updated": "2024-08-06", "type": "chat" }, { - "id": "gemini-3.1-pro-preview", - "name": "Gemini 3.1 Pro Preview", - "display_name": "Gemini 3.1 Pro Preview", + "id": "openai/gpt-5.6-sol-pro", + "name": "GPT-5.6 Sol", + "display_name": "GPT-5.6 Sol", "modalities": { "input": [ "text", "image", - "audio" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -181644,98 +174196,81 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ + "effort_options": [ + "none", "low", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" + "medium", + "high", + "xhigh", + "max" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-02-19", - "last_updated": "2026-02-19", + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "gemini-2.5-flash", - "name": "Gemini 2.5 Flash", - "display_name": "Gemini 2.5 Flash", + "id": "openai/gpt-5-image-mini", + "name": "GPT-5 Image Mini", + "display_name": "GPT-5 Image Mini", "modalities": { "input": [ - "text", + "pdf", "image", - "audio" + "text" ], "output": [ + "image", "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 400000, + "output": 128000 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "budget", - "budget": { - "default": -1, - "min": 0, - "max": 24576, - "auto": -1, - "off": 0, - "unit": "tokens" - }, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" + "effort_options": [ + "high" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-06-17", - "last_updated": "2025-06-17", - "type": "chat" + "release_date": "2025-10-16", + "last_updated": "2025-10-16" }, { - "id": "gpt-5.4", - "name": "GPT-5.4", - "display_name": "GPT-5.4", + "id": "openai/gpt-5.4-image-2", + "name": "GPT-5.4 Image 2", + "display_name": "GPT-5.4 Image 2", "modalities": { "input": [ + "image", "text", - "image" + "pdf" ], "output": [ + "image", "text" ] }, "limit": { - "context": 400000, + "context": 272000, "output": 128000 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { "supported": true, "default": false @@ -181764,26 +174299,25 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-05", - "last_updated": "2026-03-05", - "type": "chat" + "release_date": "2026-04-21", + "last_updated": "2026-04-21" }, { - "id": "gpt-5-codex", - "name": "GPT-5-Codex", - "display_name": "GPT-5-Codex", + "id": "openai/gpt-6.1-sol-pro", + "name": "OpenAI: GPT-6.1 Sol Pro", + "display_name": "OpenAI: GPT-6.1 Sol Pro", "modalities": { "input": [ - "text", - "image" + "pdf", + "image", + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, + "context": 1050000, "output": 128000 }, "temperature": false, @@ -181794,39 +174328,29 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", "effort_options": [ - "minimal", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ "low", "medium", - "high" - ], - "visibility": "hidden" + "high", + "xhigh", + "max" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-09-15", - "last_updated": "2025-09-15", + "release_date": "2026-09-29", + "last_updated": "2026-09-29", "type": "chat" }, { - "id": "gpt-4o-2024-11-20", - "name": "GPT-4o (2024-11-20)", - "display_name": "GPT-4o (2024-11-20)", + "id": "openai/o3-pro", + "name": "o3-pro", + "display_name": "o3-pro", "modalities": { "input": [ "text", + "pdf", "image" ], "output": [ @@ -181834,41 +174358,11 @@ ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 200000, + "output": 100000 }, - "temperature": true, + "temperature": false, "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-10", - "release_date": "2024-11-20", - "last_updated": "2024-11-20", - "type": "chat" - }, - { - "id": "gemini-3-pro-image-preview", - "name": "Nano Banana Pro Preview", - "display_name": "Nano Banana Pro Preview", - "modalities": { - "input": [ - "text", - "image" - ], - "output": [ - "text", - "image" - ] - }, - "limit": { - "context": 65536, - "output": 32768 - }, - "temperature": true, - "tool_call": false, "reasoning": { "supported": true, "default": true @@ -181877,41 +174371,40 @@ "reasoning": { "supported": true, "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ + "mode": "effort", + "effort": "medium", + "effort_options": [ "low", + "medium", "high" ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-11-20", - "last_updated": "2025-11-20" + "knowledge": "2024-05", + "release_date": "2025-06-10", + "last_updated": "2025-06-10", + "type": "chat" }, { - "id": "o3-pro", - "name": "o3-pro", - "display_name": "o3-pro", + "id": "openai/gpt-5.3-codex", + "name": "GPT-5.3 Codex", + "display_name": "GPT-5.3 Codex", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 400000, + "output": 128000 }, "temperature": false, "tool_call": true, @@ -181926,6 +174419,13 @@ "mode": "effort", "effort": "medium", "effort_options": [ + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ "low", "medium", "high" @@ -181935,17 +174435,19 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2024-05", - "release_date": "2025-06-10", - "last_updated": "2025-06-10", + "knowledge": "2025-08-31", + "release_date": "2026-02-05", + "last_updated": "2026-02-05", "type": "chat" }, { - "id": "mimo-v2-pro", - "name": "MiMo-V2-Pro", - "display_name": "MiMo-V2-Pro", + "id": "openai/gpt-6-astra-pro", + "name": "OpenAI: GPT-6 Astra Pro ($$$$)", + "display_name": "OpenAI: GPT-6 Astra Pro ($$$$)", "modalities": { "input": [ + "pdf", + "image", "text" ], "output": [ @@ -181953,30 +174455,41 @@ ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + }, + "attachment": true, "open_weights": false, - "knowledge": "2024-12", - "release_date": "2026-03-18", - "last_updated": "2026-03-18", + "release_date": "2026-09-04", + "last_updated": "2026-09-04", "type": "chat" }, { - "id": "gpt-5.1", + "id": "openai/gpt-5.1", "name": "GPT-5.1", "display_name": "GPT-5.1", "modalities": { "input": [ + "image", "text", - "image" + "pdf" ], "output": [ "text" @@ -181986,7 +174499,7 @@ "context": 400000, "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -182021,9 +174534,9 @@ "type": "chat" }, { - "id": "claude-opus-4-20250514", - "name": "Claude Opus 4", - "display_name": "Claude Opus 4", + "id": "openai/gpt-chat-latest", + "name": "OpenAI: GPT Chat Latest", + "display_name": "OpenAI: GPT Chat Latest", "modalities": { "input": [ "text", @@ -182035,58 +174548,144 @@ ] }, "limit": { - "context": 200000, - "output": 32000 + "context": 400000, + "output": 128000 + }, + "temperature": false, + "tool_call": true, + "reasoning": { + "supported": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": true, + "open_weights": false, + "release_date": "2026-05-05", + "last_updated": "2026-05-05", + "type": "chat" + }, + { + "id": "openai/gpt-oss-safeguard-20b", + "name": "GPT OSS Safeguard 20B", + "display_name": "GPT OSS Safeguard 20B", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 131072, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + "effort_options": [ + "high" ] } }, + "attachment": false, + "open_weights": true, + "release_date": "2025-10-29", + "last_updated": "2025-10-29", + "type": "chat" + }, + { + "id": "openai/gpt-4o-2024-11-20", + "name": "GPT-4o (2024-11-20)", + "display_name": "GPT-4o (2024-11-20)", + "modalities": { + "input": [ + "text", + "image", + "pdf" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 128000, + "output": 16384 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, "attachment": true, "open_weights": false, - "knowledge": "2025-03-31", - "release_date": "2025-05-22", - "last_updated": "2025-05-22", + "knowledge": "2023-09", + "release_date": "2024-11-20", + "last_updated": "2024-11-20", "type": "chat" }, { - "id": "claude-opus-5", - "name": "Claude Opus 5", - "display_name": "Claude Opus 5", + "id": "openai/gpt-5-image", + "name": "GPT-5 Image", + "display_name": "GPT-5 Image", "modalities": { "input": [ + "image", "text", - "image" + "pdf" ], "output": [ + "image", "text" ] }, "limit": { - "context": 1000000, + "context": 400000, + "output": 128000 + }, + "temperature": true, + "tool_call": false, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "high" + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2024-10-01", + "release_date": "2025-10-14", + "last_updated": "2025-10-14" + }, + { + "id": "openai/gpt-6-luna", + "name": "GPT-6 Luna", + "display_name": "GPT-6 Luna", + "modalities": { + "input": [ + "text", + "image", + "pdf" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1050000, "output": 128000 }, "temperature": false, @@ -182097,93 +174696,94 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-05", - "release_date": "2026-07-24", - "last_updated": "2026-07-24", + "knowledge": "2026-05-18", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "claude-sonnet-4-6", - "name": "Claude Sonnet 4.6", - "display_name": "Claude Sonnet 4.6", + "id": "openai/gpt-5-mini", + "name": "GPT-5 Mini", + "display_name": "GPT-5 Mini", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 64000 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ + "minimal", "low", "medium", - "high", - "max" + "high" ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." - ] + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-17", - "last_updated": "2026-03-13", + "knowledge": "2024-05-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "kimi-k2.5", - "name": "Kimi K2.5", - "display_name": "Kimi K2.5", + "id": "openai/gpt-6.1-terra-pro", + "name": "OpenAI: GPT-6.1 Terra Pro", + "display_name": "OpenAI: GPT-6.1 Terra Pro", "modalities": { "input": [ - "text", + "pdf", "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -182191,53 +174791,68 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-01-27", - "last_updated": "2026-01-27", + "open_weights": false, + "release_date": "2026-10-26", + "last_updated": "2026-10-26", "type": "chat" }, { - "id": "qwen-2.5-coder-32b", - "name": "Qwen 2.5 Coder 32B", - "display_name": "Qwen 2.5 Coder 32B", + "id": "openai/gpt-6-sol", + "name": "GPT-6 Sol", + "display_name": "GPT-6 Sol", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "release_date": "2024-11-12", - "last_updated": "2024-11-12", + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2026-04-20", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "grok-code-fast-1", - "name": "Grok Code Fast 1", - "display_name": "Grok Code Fast 1", + "id": "openai/gpt-oss-120b", + "name": "GPT OSS 120B", + "display_name": "GPT OSS 120B", "modalities": { "input": [ "text" @@ -182247,71 +174862,102 @@ ] }, "limit": { - "context": 256000, - "output": 16384 + "context": 131072, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "effort_options": [ + "low", + "medium", + "high" + ] } }, "attachment": false, - "open_weights": false, - "release_date": "2025-09-02", - "last_updated": "2025-09-02", + "open_weights": true, + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "grok-4-fast-non-reasoning", - "name": "Grok 4 Fast (Non-Reasoning)", - "display_name": "Grok 4 Fast (Non-Reasoning)", + "id": "openai/gpt-5.4-pro", + "name": "GPT-5.4 Pro", + "display_name": "GPT-5.4 Pro", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 2000000, - "output": 16384 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } }, "attachment": true, "open_weights": false, - "release_date": "2025-12-18", - "last_updated": "2025-12-18", + "knowledge": "2025-08-31", + "release_date": "2026-03-05", + "last_updated": "2026-03-05", "type": "chat" }, { - "id": "claude-opus-4-5-20251101", - "name": "Claude Opus 4.5", - "display_name": "Claude Opus 4.5", + "id": "openai/gpt-5.1-codex-max", + "name": "GPT-5.1 Codex Max", + "display_name": "GPT-5.1 Codex Max", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -182321,148 +174967,185 @@ "reasoning": { "supported": true, "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", + "mode": "effort", + "effort": "none", "effort_options": [ + "none", "low", "medium", "high" ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" ], - "notes": [ - "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." - ] + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2025-05", - "release_date": "2025-11-24", - "last_updated": "2025-11-24", + "knowledge": "2024-09-30", + "release_date": "2025-11-13", + "last_updated": "2025-11-13", "type": "chat" }, { - "id": "gemini-3.1-flash-image-preview", - "name": "Nano Banana 2 Preview", - "display_name": "Nano Banana 2 Preview", + "id": "openai/gpt-6-sol-pro", + "name": "OpenAI: GPT-6 Sol Pro", + "display_name": "OpenAI: GPT-6 Sol Pro", "modalities": { "input": [ - "text", - "image" + "pdf", + "image", + "text" ], "output": [ - "text", - "image" + "text" ] }, "limit": { - "context": 1048576, - "output": 32768 + "context": 1050000, + "output": 128000 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { - "supported": true + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-02-26", - "last_updated": "2026-02-26" + "release_date": "2026-09-22", + "last_updated": "2026-09-22", + "type": "chat" }, { - "id": "gpt-4.1-mini", - "name": "GPT-4.1 mini", - "display_name": "GPT-4.1 mini", + "id": "openai/gpt-5", + "name": "GPT-5", + "display_name": "GPT-5", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1047576, - "output": 32768 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "minimal", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } }, "attachment": true, "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-04-14", - "last_updated": "2025-04-14", + "knowledge": "2024-09-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "grok-4-1-fast-non-reasoning", - "name": "Grok 4.1 Fast (Non-Reasoning)", - "display_name": "Grok 4.1 Fast (Non-Reasoning)", + "id": "openai/gpt-6.1-sol", + "name": "GPT-6.1 Sol", + "display_name": "GPT-6.1 Sol", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 2000000, - "output": 16384 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } }, "attachment": true, "open_weights": false, - "release_date": "2025-11-17", - "last_updated": "2025-11-17", + "knowledge": "2026-04-30", + "release_date": "2026-09-29", + "last_updated": "2026-09-29", "type": "chat" }, { - "id": "gemini-3.7-flash", - "name": "Gemini 3.7 Flash", - "display_name": "Gemini 3.7 Flash", + "id": "openai/gpt-5.2-codex", + "name": "GPT-5.2 Codex", + "display_name": "GPT-5.2 Codex", "modalities": { "input": [ "text", "image", - "audio", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -182472,47 +175155,49 @@ "reasoning": { "supported": true, "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ "low", "medium", "high" ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-08-13", - "last_updated": "2026-08-13", + "knowledge": "2025-08-31", + "release_date": "2025-12-11", + "last_updated": "2025-12-11", "type": "chat" }, { - "id": "claude-opus-4-1-20250805", - "name": "Claude Opus 4.1", - "display_name": "Claude Opus 4.1", + "id": "openai/gpt-5.2", + "name": "GPT-5.2", + "display_name": "GPT-5.2", "modalities": { "input": [ - "text", + "pdf", "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 32000 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -182522,45 +175207,47 @@ "reasoning": { "supported": true, "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." - ] + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2025-03-31", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "knowledge": "2025-08-31", + "release_date": "2025-12-11", + "last_updated": "2025-12-11", "type": "chat" }, { - "id": "gpt-5.5", - "name": "GPT-5.5", - "display_name": "GPT-5.5", + "id": "openai/gpt-5-pro", + "name": "GPT-5 Pro", + "display_name": "GPT-5 Pro", "modalities": { "input": [ + "image", "text", - "image" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, + "context": 400000, "output": 128000 }, "temperature": false, @@ -182573,14 +175260,8 @@ "reasoning": { "supported": true, "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ], + "mode": "fixed", + "effort": "high", "verbosity": "medium", "verbosity_options": [ "low", @@ -182592,27 +175273,27 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2025-12-01", - "release_date": "2026-04-23", - "last_updated": "2026-04-23", + "knowledge": "2024-09-30", + "release_date": "2025-10-06", + "last_updated": "2025-10-06", "type": "chat" }, { - "id": "gpt-4o-mini", - "name": "GPT-4o mini", - "display_name": "GPT-4o mini", + "id": "openai/gpt-4", + "name": "GPT-4", + "display_name": "GPT-4", "modalities": { "input": [ "text", - "image" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 8191, + "output": 4096 }, "temperature": true, "tool_call": true, @@ -182621,77 +175302,65 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2023-09", - "release_date": "2024-07-18", - "last_updated": "2024-07-18", + "knowledge": "2023-11", + "release_date": "2023-11-06", + "last_updated": "2024-04-09", "type": "chat" }, { - "id": "claude-opus-4-6", - "name": "Claude Opus 4.6", - "display_name": "Claude Opus 4.6", + "id": "openai/o3", + "name": "o3", + "display_name": "o3", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 200000, + "output": 100000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ "low", "medium", - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "high" ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." - ] + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2025-05-31", - "release_date": "2026-02-05", - "last_updated": "2026-03-13", + "knowledge": "2024-05", + "release_date": "2025-04-16", + "last_updated": "2025-04-16", "type": "chat" }, { - "id": "gpt-5-mini", - "name": "GPT-5 Mini", - "display_name": "GPT-5 Mini", + "id": "openai/gpt-5.4-nano", + "name": "GPT-5.4 nano", + "display_name": "GPT-5.4 nano", "modalities": { "input": [ - "text", - "image" + "pdf", + "image", + "text" ], "output": [ "text" @@ -182705,19 +175374,20 @@ "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, + "default_enabled": false, "mode": "effort", - "effort": "medium", + "effort": "none", "effort_options": [ - "minimal", + "none", "low", "medium", - "high" + "high", + "xhigh" ], "verbosity": "medium", "verbosity_options": [ @@ -182730,30 +175400,72 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2024-05-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "knowledge": "2025-08-31", + "release_date": "2026-03-17", + "last_updated": "2026-03-17", "type": "chat" }, { - "id": "gemini-3-flash-preview", - "name": "Gemini 3 Flash Preview", - "display_name": "Gemini 3 Flash Preview", + "id": "openai/gpt-6-luna-pro", + "name": "OpenAI: GPT-6 Luna Pro", + "display_name": "OpenAI: GPT-6 Luna Pro", + "modalities": { + "input": [ + "pdf", + "image", + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1050000, + "output": 128000 + }, + "temperature": false, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + }, + "attachment": true, + "open_weights": false, + "release_date": "2026-09-22", + "last_updated": "2026-09-22", + "type": "chat" + }, + { + "id": "openai/gpt-5.5-pro", + "name": "GPT-5.5 Pro", + "display_name": "GPT-5.5 Pro", "modalities": { "input": [ "text", "image", - "audio" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -182762,44 +175474,36 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", - "low", + "effort_options": [ "medium", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" + "high", + "xhigh" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-12-17", - "last_updated": "2025-12-17", + "knowledge": "2025-12-01", + "release_date": "2026-04-23", + "last_updated": "2026-04-23", "type": "chat" }, { - "id": "gpt-5", - "name": "GPT-5", - "display_name": "GPT-5", + "id": "openai/gpt-5.5", + "name": "GPT-5.5", + "display_name": "GPT-5.5", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 400000, + "context": 1050000, "output": 128000 }, "temperature": false, @@ -182815,10 +175519,10 @@ "mode": "effort", "effort": "medium", "effort_options": [ - "minimal", "low", "medium", - "high" + "high", + "xhigh" ], "verbosity": "medium", "verbosity_options": [ @@ -182831,30 +175535,30 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "knowledge": "2025-12-01", + "release_date": "2026-04-23", + "last_updated": "2026-04-23", "type": "chat" }, { - "id": "gemini-3.6-flash", - "name": "Gemini 3.6 Flash", - "display_name": "Gemini 3.6 Flash", + "id": "openai/gpt-5.2-pro", + "name": "GPT-5.2 Pro", + "display_name": "GPT-5.2 Pro", "modalities": { "input": [ - "text", "image", - "audio" + "text", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -182864,36 +175568,38 @@ "reasoning": { "supported": true, "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", + "mode": "effort", + "effort": "high", + "effort_options": [ + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ "low", "medium", "high" ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-07-21", - "last_updated": "2026-07-21", + "knowledge": "2025-08-31", + "release_date": "2025-12-11", + "last_updated": "2025-12-11", "type": "chat" }, { - "id": "gpt-4.1", - "name": "GPT-4.1", - "display_name": "GPT-4.1", + "id": "openai/gpt-4.1-mini", + "name": "GPT-4.1 mini", + "display_name": "GPT-4.1 mini", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" @@ -182916,15 +175622,13 @@ "type": "chat" }, { - "id": "gemini-3.1-flash-lite-preview", - "name": "Gemini 3.1 Flash Lite Preview", - "display_name": "Gemini 3.1 Flash Lite Preview", + "id": "openai/gpt-4o-mini", + "name": "GPT-4o mini", + "display_name": "GPT-4o mini", "modalities": { "input": [ "text", "image", - "video", - "audio", "pdf" ], "output": [ @@ -182932,75 +175636,83 @@ ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 128000, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-03-03", - "last_updated": "2026-03-03", + "knowledge": "2023-09", + "release_date": "2024-07-18", + "last_updated": "2024-07-18", "type": "chat" }, { - "id": "gemini-3.1-flash-image", - "name": "Nano Banana 2", - "display_name": "Nano Banana 2", + "id": "openai/gpt-6-astra", + "name": "GPT-6 Astra", + "display_name": "GPT-6 Astra", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ - "text", - "image" + "text" ] }, "limit": { - "context": 1048576, - "output": 32768 + "context": 1050000, + "output": 128000 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-05-28", - "last_updated": "2026-05-28" + "knowledge": "2026-04-30", + "release_date": "2026-09-04", + "last_updated": "2026-09-04", + "type": "chat" }, { - "id": "grok-4.6", - "name": "Grok 4.6", - "display_name": "Grok 4.6", + "id": "openai/gpt-5.6-terra-pro", + "name": "GPT-5.6 Terra", + "display_name": "GPT-5.6 Terra", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 500000, - "output": 32768 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -183008,35 +175720,42 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-02-01", - "release_date": "2026-08-12", - "last_updated": "2026-08-12", + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "gemini-3.1-flash-lite", - "name": "Gemini 3.1 Flash Lite", - "display_name": "Gemini 3.1 Flash Lite", + "id": "openai/gpt-5-nano", + "name": "GPT-5 Nano", + "display_name": "GPT-5 Nano", "modalities": { "input": [ "text", "image", - "audio" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -183044,32 +175763,47 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "minimal", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-05-07", - "last_updated": "2026-05-07", + "knowledge": "2024-05-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "gpt-5.2-chat-latest", - "name": "GPT-5.2 Chat Latest", - "display_name": "GPT-5.2 Chat Latest", + "id": "ibm-granite/granite-4.2-8b", + "name": "IBM: Granite 4.2 8B", + "display_name": "IBM: Granite 4.2 8B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 131072, + "output": 117964 }, "temperature": true, "tool_call": true, @@ -183077,87 +175811,74 @@ "supported": true, "default": true }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-12-11", - "last_updated": "2025-12-11", + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "low", + "high" + ] + } + }, + "attachment": false, + "open_weights": true, + "release_date": "2026-08-25", + "last_updated": "2026-08-25", "type": "chat" }, { - "id": "claude-opus-4-8", - "name": "Claude Opus 4.8", - "display_name": "Claude Opus 4.8", + "id": "inception/mercury-2", + "name": "Inception: Mercury 2", + "display_name": "Inception: Mercury 2", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 128000, + "output": 50000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "high", "effort_options": [ + "none", "low", "medium", - "high", - "xhigh", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." + "high" ] } }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2026-01", - "release_date": "2026-05-28", - "last_updated": "2026-05-28", + "release_date": "2026-02-24", + "last_updated": "2026-02-24", "type": "chat" }, { - "id": "muse-spark-1.2", - "name": "Muse Spark 1.2", - "display_name": "Muse Spark 1.2", + "id": "inception/mercury-2.5", + "name": "Inception: Mercury 2.5", + "display_name": "Inception: Mercury 2.5", "modalities": { "input": [ - "text", - "image", - "audio", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 260000, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -183167,143 +175888,127 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "effort_options": [ + "none", + "low", + "medium", + "high" + ] } }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2026-08-05", - "last_updated": "2026-08-05", + "release_date": "2026-09-08", + "last_updated": "2026-09-08", "type": "chat" }, { - "id": "gpt-4.1-nano", - "name": "GPT-4.1 nano", - "display_name": "GPT-4.1 nano", + "id": "inception/mercury-3", + "name": "Inception: Mercury 3", + "display_name": "Inception: Mercury 3", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1047576, - "output": 32768 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "low", + "medium", + "high" + ] + } + }, + "attachment": false, "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-04-14", - "last_updated": "2025-04-14", + "release_date": "2026-10-16", + "last_updated": "2026-10-16", "type": "chat" }, { - "id": "o4-mini", - "name": "o4-mini", - "display_name": "o4-mini", + "id": "gryphe/mythomax-l2-13b", + "name": "MythoMax 13B", + "display_name": "MythoMax 13B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 4096, + "output": 3686 }, - "temperature": false, - "tool_call": true, + "temperature": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-05", - "release_date": "2025-04-16", - "last_updated": "2025-04-16", + "attachment": false, + "open_weights": true, + "release_date": "2023-08-10", + "last_updated": "2023-08-10", "type": "chat" }, { - "id": "gpt-5.1-codex", - "name": "GPT-5.1 Codex", - "display_name": "GPT-5.1 Codex", + "id": "nvidia/nemotron-3.5-super-vl:free", + "name": "NVIDIA: Nemotron 3.5 Super VL (free)", + "display_name": "NVIDIA: Nemotron 3.5 Super VL (free)", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 1000000, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", "effort_options": [ "none", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", "high" - ], - "visibility": "hidden" + ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-11-13", - "last_updated": "2025-11-13", + "open_weights": true, + "release_date": "2026-10-15", + "last_updated": "2026-10-15", "type": "chat" }, { - "id": "muse-spark-1.1", - "name": "Muse Spark 1.1", - "display_name": "Muse Spark 1.1", + "id": "nvidia/nemotron-3.5-super-vl", + "name": "NVIDIA: Nemotron 3.5 Super VL", + "display_name": "NVIDIA: Nemotron 3.5 Super VL", "modalities": { "input": [ "text", @@ -183315,8 +176020,8 @@ ] }, "limit": { - "context": 1000000, - "output": 32000 + "context": 262144, + "output": 235929 }, "temperature": true, "tool_call": true, @@ -183326,19 +176031,22 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "effort_options": [ + "none", + "high" + ] } }, "attachment": true, - "open_weights": false, - "release_date": "2026-04-08", - "last_updated": "2026-07-09", + "open_weights": true, + "release_date": "2026-10-15", + "last_updated": "2026-10-15", "type": "chat" }, { - "id": "claude-sonnet-4-5-20250929", - "name": "Claude Sonnet 4.5", - "display_name": "Claude Sonnet 4.5", + "id": "nvidia/nemotron-3.5-content-safety:free", + "name": "NVIDIA: Nemotron 3.5 Content Safety (free)", + "display_name": "NVIDIA: Nemotron 3.5 Content Safety (free)", "modalities": { "input": [ "text", @@ -183349,61 +176057,49 @@ ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 128000, + "output": 8192 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + "effort_options": [ + "none", + "high" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-07-31", - "release_date": "2025-09-29", - "last_updated": "2025-09-29", + "open_weights": true, + "release_date": "2026-06-02", + "last_updated": "2026-06-02", "type": "chat" }, { - "id": "claude-fable-5", - "name": "Claude Fable 5", - "display_name": "Claude Fable 5", + "id": "nvidia/nemotron-3-nano-omni-30b-a3b-reasoning:free", + "name": "NVIDIA: Nemotron 3 Nano Omni (free)", + "display_name": "NVIDIA: Nemotron 3 Nano Omni (free)", "modalities": { "input": [ "text", - "image" + "image", + "video", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 256000, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -183411,71 +176107,60 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", - "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", - "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." + "none", + "high" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-09", - "last_updated": "2026-06-09", + "open_weights": true, + "release_date": "2026-04-28", + "last_updated": "2026-04-28", "type": "chat" }, { - "id": "gpt-5.1-chat-latest", - "name": "GPT-5.1 Chat Latest", - "display_name": "GPT-5.1 Chat Latest", + "id": "nvidia/nemotron-3-super-120b-a12b", + "name": "Nemotron 3 Super 120B A12B", + "display_name": "Nemotron 3 Super 120B A12B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 1048576, + "output": 262144 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-11-13", - "last_updated": "2025-11-13", + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "low", + "medium" + ] + } + }, + "attachment": false, + "open_weights": true, + "knowledge": "2025-06", + "release_date": "2026-03-11", + "last_updated": "2026-03-11", "type": "chat" }, { - "id": "Qwen/Qwen3-32B", - "name": "Qwen3 32B", - "display_name": "Qwen3 32B", + "id": "nvidia/nemotron-3.5-lightning:free", + "name": "NVIDIA: Nemotron 3.5 Lightning (free)", + "display_name": "NVIDIA: Nemotron 3.5 Lightning (free)", "modalities": { "input": [ "text" @@ -183485,8 +176170,8 @@ ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 1000000, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -183496,26 +176181,23 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "none", + "high" ] } }, "attachment": false, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-04-28", - "last_updated": "2025-04-28", + "knowledge": "2025-09", + "release_date": "2026-08-11", + "last_updated": "2026-08-11", "type": "chat" }, { - "id": "Qwen/Qwen3-Coder-480B-A35B-Instruct", - "name": "Qwen3-Coder 480B-A35B Instruct", - "display_name": "Qwen3-Coder 480B-A35B Instruct", + "id": "nvidia/nemotron-3.5-lightning", + "name": "Nemotron 3.5 Lightning 30B A3B", + "display_name": "Nemotron 3.5 Lightning 30B A3B", "modalities": { "input": [ "text" @@ -183526,38 +176208,49 @@ }, "limit": { "context": 262144, - "output": 16384 + "output": 235929 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "none", + "high" + ] + } }, "attachment": false, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-07-22", - "last_updated": "2025-07-22", + "knowledge": "2025-09", + "release_date": "2026-08-11", + "last_updated": "2026-08-11", "type": "chat" }, { - "id": "Qwen/QwQ-32B", - "name": "QwQ 32B", - "display_name": "QwQ 32B", + "id": "nvidia/nemotron-3.5-content-safety", + "name": "Nemotron 3.5 Content Safety", + "display_name": "Nemotron 3.5 Content Safety", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 32768, - "output": 32768 + "context": 131072, + "output": 117964 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true @@ -183565,25 +176258,22 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "none", + "high" ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2024-04", - "release_date": "2025-03-05", - "last_updated": "2025-03-05", + "release_date": "2026-06-02", + "last_updated": "2026-06-02", "type": "chat" }, { - "id": "Qwen/Qwen3.6-27B", - "name": "Qwen3.6 27B", - "display_name": "Qwen3.6 27B", + "id": "nvidia/nemotron-3-nano-30b-a3b", + "name": "Nemotron 3 Nano 30B A3B", + "display_name": "Nemotron 3 Nano 30B A3B", "modalities": { "input": [ "text" @@ -183594,7 +176284,7 @@ }, "limit": { "context": 262144, - "output": 8192 + "output": 235929 }, "temperature": true, "tool_call": true, @@ -183604,25 +176294,23 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "none", + "high" ] } }, "attachment": false, "open_weights": true, - "release_date": "2026-04-22", - "last_updated": "2026-04-22", + "knowledge": "2025-06-25", + "release_date": "2025-12-15", + "last_updated": "2025-12-15", "type": "chat" }, { - "id": "Qwen/Qwen2.5-72B-Instruct", - "name": "Qwen 2.5 72B Instruct", - "display_name": "Qwen 2.5 72B Instruct", + "id": "nvidia/nemotron-3-ultra-550b-a55b", + "name": "Nemotron 3 Ultra 550B A55B", + "display_name": "Nemotron 3 Ultra 550B A55B", "modalities": { "input": [ "text" @@ -183632,24 +176320,36 @@ ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 202800, + "output": 182520 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "none", + "medium", + "high" + ] + } }, "attachment": false, "open_weights": true, - "release_date": "2024-09-19", - "last_updated": "2024-09-19", + "knowledge": "2025-09", + "release_date": "2026-06-04", + "last_updated": "2026-06-04", "type": "chat" }, { - "id": "Qwen/Qwen3-235B-A22B-Instruct-2507", - "name": "Qwen3 235B A22B Instruct", - "display_name": "Qwen3 235B A22B Instruct", + "id": "nvidia/nemotron-3-ultra-550b-a55b:free", + "name": "NVIDIA: Nemotron 3 Ultra (free)", + "display_name": "NVIDIA: Nemotron 3 Ultra (free)", "modalities": { "input": [ "text" @@ -183659,76 +176359,87 @@ ] }, "limit": { - "context": 262144, - "output": 8192 + "context": 1000000, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "medium", + "high" + ] + } }, "attachment": false, "open_weights": true, - "release_date": "2025-07-21", - "last_updated": "2025-07-21", + "knowledge": "2025-09", + "release_date": "2026-06-04", + "last_updated": "2026-06-04", "type": "chat" }, { - "id": "MiniMaxAI/MiniMax-M2.7", - "name": "MiniMax-M2.7", - "display_name": "MiniMax-M2.7", + "id": "perceptron/perceptron-mk1", + "name": "Perceptron: Perceptron Mk1", + "display_name": "Perceptron: Perceptron Mk1", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 32768, + "output": 8192 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "none", + "high" ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-03-18", - "last_updated": "2026-03-18", + "attachment": true, + "open_weights": false, + "release_date": "2026-05-12", + "last_updated": "2026-05-12", "type": "chat" }, { - "id": "MiniMaxAI/MiniMax-M3", - "name": "MiniMax-M3", - "display_name": "MiniMax-M3", + "id": "perceptron/perceptron-mk1.5", + "name": "Perceptron: Perceptron Mk1.5", + "display_name": "Perceptron: Perceptron Mk1.5", "modalities": { "input": [ "text", "image", - "video" + "video", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 36864, + "output": 8192 }, "temperature": true, "tool_call": true, @@ -183738,19 +176449,25 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "effort_options": [ + "none", + "minimal", + "low", + "medium", + "high" + ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-06-01", - "last_updated": "2026-06-01", + "open_weights": false, + "release_date": "2026-09-25", + "last_updated": "2026-09-25", "type": "chat" }, { - "id": "google/gemma-4-31b-it", - "name": "Gemma 4 31B IT", - "display_name": "Gemma 4 31B IT", + "id": "particle-ai/particle-1", + "name": "Particle AI: Particle-1", + "display_name": "Particle AI: Particle-1", "modalities": { "input": [ "text", @@ -183761,7 +176478,7 @@ ] }, "limit": { - "context": 262144, + "context": 1048576, "output": 131072 }, "temperature": true, @@ -183772,33 +176489,38 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "effort_options": [ + "none", + "minimal", + "low", + "medium", + "high", + "xhigh", + "max" + ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "open_weights": false, + "release_date": "2026-10-28", + "last_updated": "2026-10-28", "type": "chat" }, { - "id": "moonshotai/Kimi-K2.6", - "name": "Kimi K2.6", - "display_name": "Kimi K2.6", + "id": "z-ai/glm-5.2", + "name": "GLM-5.2", + "display_name": "GLM-5.2", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1048576, + "output": 943718 }, "temperature": true, "tool_call": true, @@ -183808,24 +176530,28 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "effort_options": [ + "none", + "high", + "xhigh" + ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-20", - "last_updated": "2026-04-20", + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "moonshotai/Kimi-K3", - "name": "Kimi K3", - "display_name": "Kimi K3", + "id": "z-ai/glm-5v-turbo", + "name": "GLM-5V-Turbo", + "display_name": "GLM-5V-Turbo", "modalities": { "input": [ - "text", "image", + "text", "video" ], "output": [ @@ -183833,10 +176559,10 @@ ] }, "limit": { - "context": 1048576, + "context": 202752, "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -183844,19 +176570,22 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "effort_options": [ + "none", + "high" + ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-16", + "open_weights": false, + "release_date": "2026-04-01", + "last_updated": "2026-04-01", "type": "chat" }, { - "id": "moonshotai/Kimi-K2.7-Code", - "name": "Kimi K2.7 Code", - "display_name": "Kimi K2.7 Code", + "id": "z-ai/glm-5.3-flashx", + "name": "Z.ai: GLM 5.3 FlashX", + "display_name": "Z.ai: GLM 5.3 FlashX", "modalities": { "input": [ "text", @@ -183868,10 +176597,10 @@ ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1048576, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -183879,20 +176608,23 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "effort_options": [ + "low", + "high", + "max" + ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-06-12", - "last_updated": "2026-06-12", + "open_weights": false, + "release_date": "2026-09-18", + "last_updated": "2026-09-18", "type": "chat" }, { - "id": "openai/gpt-oss-120b", - "name": "GPT OSS 120B", - "display_name": "GPT OSS 120B", + "id": "z-ai/glm-5.3", + "name": "GLM-5.3", + "display_name": "GLM-5.3", "modalities": { "input": [ "text" @@ -183902,8 +176634,8 @@ ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 1048576, + "output": 943718 }, "temperature": true, "tool_call": true, @@ -183913,20 +176645,24 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "effort_options": [ + "low", + "high", + "max" + ] } }, "attachment": false, "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "zai-org/GLM-5", - "name": "GLM-5", - "display_name": "GLM-5", + "id": "z-ai/glm-5-turbo", + "name": "GLM-5-Turbo", + "display_name": "GLM-5-Turbo", "modalities": { "input": [ "text" @@ -183936,7 +176672,7 @@ ] }, "limit": { - "context": 204800, + "context": 202752, "output": 131072 }, "temperature": true, @@ -183948,24 +176684,22 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "none", + "high" ] } }, "attachment": false, - "open_weights": true, - "release_date": "2026-02-12", - "last_updated": "2026-02-12", + "open_weights": false, + "release_date": "2026-03-16", + "last_updated": "2026-03-16", "type": "chat" }, { - "id": "zai-org/GLM-5.1", - "name": "GLM-5.1", - "display_name": "GLM-5.1", + "id": "z-ai/glm-4.5", + "name": "GLM-4.5", + "display_name": "GLM-4.5", "modalities": { "input": [ "text" @@ -183975,8 +176709,8 @@ ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 131072, + "output": 98304 }, "temperature": true, "tool_call": true, @@ -183986,30 +176720,36 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "effort_options": [ + "none", + "high" + ] } }, "attachment": false, "open_weights": true, - "release_date": "2026-04-07", - "last_updated": "2026-04-07", + "knowledge": "2025-04", + "release_date": "2025-07-28", + "last_updated": "2025-07-28", "type": "chat" }, { - "id": "zai-org/GLM-4.6", - "name": "GLM-4.6", - "display_name": "GLM-4.6", + "id": "z-ai/glm-4.6v", + "name": "GLM-4.6V", + "display_name": "GLM-4.6V", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 202752, - "output": 131072 + "context": 131072, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -184019,20 +176759,23 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "effort_options": [ + "none", + "high" + ] } }, - "attachment": false, + "attachment": true, "open_weights": true, "knowledge": "2025-04", - "release_date": "2025-09-30", - "last_updated": "2025-09-30", + "release_date": "2025-12-08", + "last_updated": "2025-12-08", "type": "chat" }, { - "id": "zai-org/GLM-4.5", - "name": "GLM-4.5", - "display_name": "GLM-4.5", + "id": "z-ai/glm-4.7-flash", + "name": "GLM-4.7-Flash", + "display_name": "GLM-4.7-Flash", "modalities": { "input": [ "text" @@ -184043,7 +176786,7 @@ }, "limit": { "context": 131072, - "output": 96000 + "output": 117964 }, "temperature": true, "tool_call": true, @@ -184051,17 +176794,26 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "none", + "high" + ] + } + }, "attachment": false, "open_weights": true, "knowledge": "2025-04", - "release_date": "2025-07-28", - "last_updated": "2025-07-28", + "release_date": "2026-01-19", + "last_updated": "2026-01-19", "type": "chat" }, { - "id": "zai-org/GLM-5.2", - "name": "GLM-5.2", - "display_name": "GLM-5.2", + "id": "z-ai/glm-4.6", + "name": "GLM-4.6", + "display_name": "GLM-4.6", "modalities": { "input": [ "text" @@ -184071,7 +176823,7 @@ ] }, "limit": { - "context": 1048576, + "context": 202752, "output": 131072 }, "temperature": true, @@ -184082,19 +176834,24 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "effort_options": [ + "none", + "high" + ] } }, "attachment": false, "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "knowledge": "2025-04", + "release_date": "2025-09-30", + "last_updated": "2025-09-30", "type": "chat" }, { - "id": "zai-org/GLM-4.7", - "name": "GLM-4.7", - "display_name": "GLM-4.7", + "id": "z-ai/glm-4.5-air", + "name": "GLM-4.5-Air", + "display_name": "GLM-4.5-Air", "modalities": { "input": [ "text" @@ -184104,8 +176861,8 @@ ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 131072, + "output": 98304 }, "temperature": true, "tool_call": true, @@ -184115,37 +176872,35 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "none", + "high" ] } }, "attachment": false, "open_weights": true, "knowledge": "2025-04", - "release_date": "2025-12-22", - "last_updated": "2025-12-22", + "release_date": "2025-07-28", + "last_updated": "2025-07-28", "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-V4-Flash", - "name": "DeepSeek V4 Flash", - "display_name": "DeepSeek V4 Flash", + "id": "z-ai/glm-4.5v", + "name": "GLM-4.5V", + "display_name": "GLM-4.5V", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 32768 + "context": 65536, + "output": 16384 }, "temperature": true, "tool_call": true, @@ -184155,37 +176910,23 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", "effort_options": [ - "low", - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." + "none", + "high" ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "knowledge": "2025-04", + "release_date": "2025-08-11", + "last_updated": "2025-08-11", "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-V4-Pro", - "name": "DeepSeek V4 Pro", - "display_name": "DeepSeek V4 Pro", + "id": "z-ai/glm-5", + "name": "GLM-5", + "display_name": "GLM-5", "modalities": { "input": [ "text" @@ -184195,8 +176936,8 @@ ] }, "limit": { - "context": 1000000, - "output": 32768 + "context": 202752, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -184207,36 +176948,28 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "high", - "max" - ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" ], - "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." + "effort_options": [ + "none", + "high" ] } }, "attachment": false, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "release_date": "2026-02-12", + "last_updated": "2026-02-12", "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-V3.2", - "name": "DeepSeek V3.2", - "display_name": "DeepSeek V3.2", + "id": "z-ai/glm-5.3-prime", + "name": "Z.ai: GLM 5.3 Prime", + "display_name": "Z.ai: GLM 5.3 Prime", "modalities": { "input": [ "text" @@ -184246,8 +176979,8 @@ ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -184257,31 +176990,36 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "effort_options": [ + "low", + "high", + "max" + ] } }, "attachment": false, - "open_weights": true, - "knowledge": "2024-07", - "release_date": "2025-12-01", - "last_updated": "2025-12-01", + "open_weights": false, + "release_date": "2026-09-23", + "last_updated": "2026-09-23", "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-V3.1-Terminus", - "name": "DeepSeek V3.1 Terminus", - "display_name": "DeepSeek V3.1 Terminus", + "id": "z-ai/glm-5.3-flash", + "name": "GLM-5.3-Flash", + "display_name": "GLM-5.3-Flash", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 1048576, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -184289,16 +177027,26 @@ "supported": true, "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "low", + "high", + "max" + ] + } + }, + "attachment": true, "open_weights": true, - "release_date": "2025-06-01", - "last_updated": "2025-06-01", + "release_date": "2026-08-26", + "last_updated": "2026-08-26", "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-R1", - "name": "DeepSeek R1", - "display_name": "DeepSeek R1", + "id": "z-ai/glm-4.7", + "name": "GLM-4.7", + "display_name": "GLM-4.7", "modalities": { "input": [ "text" @@ -184308,8 +177056,8 @@ ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 204800, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -184325,20 +177073,24 @@ "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "effort_options": [ + "none", + "high" ] } }, "attachment": false, "open_weights": true, - "knowledge": "2024-07", - "release_date": "2025-01-20", - "last_updated": "2025-05-29", + "knowledge": "2025-04", + "release_date": "2025-12-22", + "last_updated": "2025-12-22", "type": "chat" }, { - "id": "deepseek/deepseek-v3.1", - "name": "DeepSeek V3.1", - "display_name": "DeepSeek V3.1", + "id": "z-ai/glm-5.1", + "name": "GLM-5.1", + "display_name": "GLM-5.1", "modalities": { "input": [ "text" @@ -184348,8 +177100,8 @@ ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 202752, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -184357,132 +177109,188 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "none", + "high" + ] + } + }, "attachment": false, "open_weights": true, - "release_date": "2025-08-21", - "last_updated": "2025-08-21", + "release_date": "2026-04-07", + "last_updated": "2026-04-07", "type": "chat" }, { - "id": "meta-llama/Meta-Llama-3.1-405B-Instruct-Turbo", - "name": "Llama 3.1 405B Instruct Turbo", - "display_name": "Llama 3.1 405B Instruct Turbo", + "id": "bytedance-seed/seed-2.0-lite", + "name": "Seed 2.0 Lite", + "display_name": "Seed 2.0 Lite", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 262144, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "release_date": "2024-07-23", - "last_updated": "2024-07-23", + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "minimal", + "low", + "medium", + "high" + ] + } + }, + "attachment": true, + "open_weights": false, + "release_date": "2026-02-14", + "last_updated": "2026-02-14", "type": "chat" }, { - "id": "meta-llama/Llama-4-Maverick-17B-128E-Instruct-FP8", - "name": "Llama 4 Maverick 17B Instruct", - "display_name": "Llama 4 Maverick 17B Instruct", + "id": "bytedance-seed/seed-1.6-flash", + "name": "ByteDance Seed: Seed 1.6 Flash (retires Nov 11)", + "display_name": "ByteDance Seed: Seed 1.6 Flash (retires Nov 11)", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 8192 + "context": 262144, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "high" + ] + } }, "attachment": true, - "open_weights": true, - "knowledge": "2024-08", - "release_date": "2025-04-05", - "last_updated": "2025-04-05", + "open_weights": false, + "release_date": "2025-08-28", + "last_updated": "2025-08-28", "type": "chat" }, { - "id": "meta-llama/Meta-Llama-3.1-8B-Instruct", - "name": "Llama 3.1 8B Instruct", - "display_name": "Llama 3.1 8B Instruct", + "id": "bytedance-seed/seed-2.0-mini", + "name": "Seed 2.0 Mini", + "display_name": "Seed 2.0 Mini", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 262144, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2023-12", - "release_date": "2024-07-23", - "last_updated": "2024-07-23", + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "minimal", + "low", + "medium", + "high" + ] + } + }, + "attachment": true, + "open_weights": false, + "release_date": "2026-02-14", + "last_updated": "2026-02-14", "type": "chat" }, { - "id": "meta-llama/Meta-Llama-3.3-70B-Instruct", - "name": "Llama-3.3-70B-Instruct", - "display_name": "Llama-3.3-70B-Instruct", + "id": "bytedance-seed/seed-2-1-turbo", + "name": "ByteDance Seed: Seed 2.1 Turbo", + "display_name": "ByteDance Seed: Seed 2.1 Turbo", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 262144, + "output": 235929 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2023-12", - "release_date": "2024-12-06", - "last_updated": "2024-12-06", + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "high" + ] + } + }, + "attachment": true, + "open_weights": false, + "release_date": "2026-06-23", + "last_updated": "2026-06-23", "type": "chat" }, { - "id": "thinkingmachines/Inkling", - "name": "Inkling", - "display_name": "Inkling", + "id": "bytedance-seed/seed-2.0-code", + "name": "Seed 2.0 Code", + "display_name": "Seed 2.0 Code", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" @@ -184498,36 +177306,38 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "low", + "medium", + "high" + ] + } + }, "attachment": true, - "open_weights": true, - "release_date": "2026-07-15", - "last_updated": "2026-07-15", + "open_weights": false, + "release_date": "2026-02-14", + "last_updated": "2026-02-14", "type": "chat" - } - ] - }, - "siliconflow-com": { - "id": "siliconflow-com", - "name": "SiliconFlow", - "display_name": "SiliconFlow", - "api": "https://api.siliconflow.com/v1", - "doc": "https://cloud.siliconflow.com/models", - "models": [ + }, { - "id": "Qwen/Qwen3-VL-32B-Thinking", - "name": "Qwen/Qwen3-VL-32B-Thinking", - "display_name": "Qwen/Qwen3-VL-32B-Thinking", + "id": "bytedance-seed/seed-1.6", + "name": "ByteDance Seed: Seed 1.6 (retires Nov 11)", + "display_name": "ByteDance Seed: Seed 1.6 (retires Nov 11)", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 262000, + "context": 262144, "output": 32768 }, "temperature": true, @@ -184538,25 +177348,22 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "none", + "high" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2025-10-21", - "last_updated": "2025-11-25", + "open_weights": false, + "release_date": "2025-10-15", + "last_updated": "2025-10-15", "type": "chat" }, { - "id": "Qwen/Qwen3-32B", - "name": "Qwen/Qwen3-32B", - "display_name": "Qwen/Qwen3-32B", + "id": "morph/morph-v3-fast", + "name": "Morph: Morph V3 Fast", + "display_name": "Morph: Morph V3 Fast", "modalities": { "input": [ "text" @@ -184566,37 +177373,24 @@ ] }, "limit": { - "context": 131000, - "output": 32768 + "context": 262144, + "output": 131072 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-04-28", - "last_updated": "2025-04-28", + "open_weights": false, + "release_date": "2025-07-07", + "last_updated": "2025-07-07", "type": "chat" }, { - "id": "Qwen/Qwen3.8-2.4T-A95B", - "name": "Qwen3.8 2.4T A95B", - "display_name": "Qwen3.8 2.4T A95B", + "id": "morph/morph-v3-large", + "name": "Morph: Morph V3 Large", + "display_name": "Morph: Morph V3 Large", "modalities": { "input": [ "text" @@ -184606,30 +177400,24 @@ ] }, "limit": { - "context": 1049000, - "output": 131000 + "context": 262144, + "output": 131072 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, "attachment": false, - "open_weights": true, - "release_date": "2026-08-12", - "last_updated": "2026-08-12", + "open_weights": false, + "release_date": "2025-07-07", + "last_updated": "2025-07-07", "type": "chat" }, { - "id": "Qwen/Qwen3-30B-A3B-Instruct-2507", - "name": "Qwen/Qwen3-30B-A3B-Instruct-2507", - "display_name": "Qwen/Qwen3-30B-A3B-Instruct-2507", + "id": "meituan/longcat-2.0", + "name": "Meituan: LongCat 2.0", + "display_name": "Meituan: LongCat 2.0", "modalities": { "input": [ "text" @@ -184639,24 +177427,34 @@ ] }, "limit": { - "context": 262000, - "output": 32768 + "context": 1048756, + "output": 262144 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "none", + "high" + ] + } }, "attachment": false, "open_weights": true, - "release_date": "2025-07-28", - "last_updated": "2025-07-28", + "release_date": "2026-06-30", + "last_updated": "2026-06-30", "type": "chat" }, { - "id": "Qwen/Qwen3-Coder-30B-A3B-Instruct", - "name": "Qwen/Qwen3-Coder-30B-A3B-Instruct", - "display_name": "Qwen/Qwen3-Coder-30B-A3B-Instruct", + "id": "aion-labs/aion-rp-llama-3.1-8b", + "name": "AionLabs: Aion-RP 1.0 (8B)", + "display_name": "AionLabs: Aion-RP 1.0 (8B)", "modalities": { "input": [ "text" @@ -184666,25 +177464,25 @@ ] }, "limit": { - "context": 262000, - "output": 65536 + "context": 32768, + "output": 29491 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, "attachment": false, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-07-31", - "last_updated": "2025-07-31", + "knowledge": "2023-12-31", + "release_date": "2025-02-04", + "last_updated": "2025-02-04", "type": "chat" }, { - "id": "Qwen/Qwen3-8B", - "name": "Qwen/Qwen3-8B", - "display_name": "Qwen/Qwen3-8B", + "id": "aion-labs/aion-3.0", + "name": "AionLabs: Aion-3.0", + "display_name": "AionLabs: Aion-3.0", "modalities": { "input": [ "text" @@ -184694,7 +177492,7 @@ ] }, "limit": { - "context": 131000, + "context": 131072, "output": 32768 }, "temperature": true, @@ -184705,64 +177503,56 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "high" ] } }, "attachment": false, - "open_weights": true, - "release_date": "2025-04-29", - "last_updated": "2025-04-29", + "open_weights": false, + "release_date": "2026-05-05", + "last_updated": "2026-05-05", "type": "chat" }, { - "id": "Qwen/Qwen3.6-35B-A3B", - "name": "Qwen3.6 35B-A3B", - "display_name": "Qwen3.6 35B-A3B", + "id": "aion-labs/aion-3.0-mini", + "name": "AionLabs: Aion-3.0-Mini", + "display_name": "AionLabs: Aion-3.0-Mini", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, + "context": 131072, "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "high" ] } }, - "attachment": true, - "open_weights": true, - "release_date": "2026-04-17", - "last_updated": "2026-04-17", + "attachment": false, + "open_weights": false, + "release_date": "2026-05-14", + "last_updated": "2026-05-14", "type": "chat" }, { - "id": "Qwen/Qwen2.5-7B-Instruct", - "name": "Qwen/Qwen2.5-7B-Instruct", - "display_name": "Qwen/Qwen2.5-7B-Instruct", + "id": "aion-labs/aion-3.5", + "name": "AionLabs: Aion 3.5", + "display_name": "AionLabs: Aion 3.5", "modalities": { "input": [ "text" @@ -184772,35 +177562,44 @@ ] }, "limit": { - "context": 33000, - "output": 4000 + "context": 262144, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "high", + "max" + ] + } }, "attachment": false, - "open_weights": true, - "release_date": "2024-09-19", - "last_updated": "2024-09-19", + "open_weights": false, + "release_date": "2026-09-23", + "last_updated": "2026-09-23", "type": "chat" }, { - "id": "Qwen/Qwen3-VL-30B-A3B-Thinking", - "name": "Qwen/Qwen3-VL-30B-A3B-Thinking", - "display_name": "Qwen/Qwen3-VL-30B-A3B-Thinking", + "id": "aion-labs/aion-3.5-mini", + "name": "AionLabs: Aion 3.5 Mini", + "display_name": "AionLabs: Aion 3.5 Mini", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262000, + "context": 262144, "output": 32768 }, "temperature": true, @@ -184811,25 +177610,23 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "low", + "high", + "max" ] } }, - "attachment": true, - "open_weights": true, - "release_date": "2025-10-11", - "last_updated": "2025-11-25", + "attachment": false, + "open_weights": false, + "release_date": "2026-09-23", + "last_updated": "2026-09-23", "type": "chat" }, { - "id": "Qwen/Qwen3-Coder-480B-A35B-Instruct", - "name": "Qwen/Qwen3-Coder-480B-A35B-Instruct", - "display_name": "Qwen/Qwen3-Coder-480B-A35B-Instruct", + "id": "aion-labs/aion-2.0", + "name": "AionLabs: Aion-2.0", + "display_name": "AionLabs: Aion-2.0", "modalities": { "input": [ "text" @@ -184839,57 +177636,74 @@ ] }, "limit": { - "context": 262000, - "output": 65536 + "context": 131072, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "high" + ] + } }, "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-07-22", - "last_updated": "2025-07-22", + "open_weights": false, + "release_date": "2025-12-21", + "last_updated": "2025-12-21", "type": "chat" }, { - "id": "Qwen/Qwen3-VL-30B-A3B-Instruct", - "name": "Qwen/Qwen3-VL-30B-A3B-Instruct", - "display_name": "Qwen/Qwen3-VL-30B-A3B-Instruct", + "id": "xiaomi/mimo-v2.6-pro", + "name": "MiMo-V2.6-Pro", + "display_name": "MiMo-V2.6-Pro", "modalities": { "input": [ "text", - "image" + "image", + "audio", + "video" ], "output": [ "text" ] }, "limit": { - "context": 262000, - "output": 32768 + "context": 1048576, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "high" + ] + } }, "attachment": true, "open_weights": true, - "release_date": "2025-10-04", - "last_updated": "2025-10-04", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "Qwen/Qwen3.6-27B", - "name": "Qwen3.6 27B", - "display_name": "Qwen3.6 27B", + "id": "xiaomi/mimo-v2.5-pro", + "name": "MiMo-V2.5-Pro", + "display_name": "MiMo-V2.5-Pro", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" @@ -184897,12 +177711,13 @@ }, "limit": { "context": 262144, - "output": 32768 + "output": 235929 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { @@ -184912,96 +177727,124 @@ "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "effort_options": [ + "none", + "high" ] } }, - "attachment": true, + "attachment": false, "open_weights": true, + "knowledge": "2024-12", "release_date": "2026-04-22", "last_updated": "2026-04-22", "type": "chat" }, { - "id": "Qwen/Qwen2.5-72B-Instruct", - "name": "Qwen/Qwen2.5-72B-Instruct", - "display_name": "Qwen/Qwen2.5-72B-Instruct", + "id": "xiaomi/mimo-v2.5", + "name": "MiMo-V2.5", + "display_name": "MiMo-V2.5", "modalities": { "input": [ - "text" + "text", + "image", + "audio", + "video" ], "output": [ "text" ] }, "limit": { - "context": 33000, - "output": 4000 + "context": 1000000, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "none", + "high" + ] + } + }, + "attachment": true, "open_weights": true, - "release_date": "2024-09-18", - "last_updated": "2025-11-25", + "knowledge": "2024-12", + "release_date": "2026-04-22", + "last_updated": "2026-04-22", "type": "chat" }, { - "id": "Qwen/Qwen3.5-27B", - "name": "Qwen3.5 27B", - "display_name": "Qwen3.5 27B", + "id": "xiaomi/mimo-v2.6-flash", + "name": "MiMo-V2.6-Flash", + "display_name": "MiMo-V2.6-Flash", "modalities": { "input": [ "text", - "image" + "image", + "audio", + "video" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 1048576, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "none", + "high" ] } }, "attachment": true, "open_weights": true, - "release_date": "2026-02-23", - "last_updated": "2026-02-23", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "Qwen/Qwen3-14B", - "name": "Qwen/Qwen3-14B", - "display_name": "Qwen/Qwen3-14B", + "id": "xiaomi/mimo-v2.6-pro-ultraspeed", + "name": "MiMo-V2.6-Pro-UltraSpeed", + "display_name": "MiMo-V2.6-Pro-UltraSpeed", "modalities": { "input": [ - "text" + "text", + "image", + "audio", + "video" ], "output": [ "text" ] }, "limit": { - "context": 131000, - "output": 32768 + "context": 1048576, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -185011,53 +177854,60 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "none", + "high" ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2025-04-30", - "last_updated": "2025-11-25", + "release_date": "2026-09-21", + "last_updated": "2026-09-21", "type": "chat" }, { - "id": "Qwen/Qwen3-VL-8B-Instruct", - "name": "Qwen/Qwen3-VL-8B-Instruct", - "display_name": "Qwen/Qwen3-VL-8B-Instruct", + "id": "openrouter/auto", + "name": "Auto Router", + "display_name": "Auto Router", "modalities": { "input": [ + "audio", + "image", + "pdf", "text", - "image" + "video" ], "output": [ + "image", "text" ] }, "limit": { - "context": 262000, + "context": 2000000, "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": true, - "open_weights": true, - "release_date": "2025-10-15", - "last_updated": "2025-11-25", + "open_weights": false, + "release_date": "2026-03-15", + "last_updated": "2026-03-15", "type": "chat" }, { - "id": "Qwen/Qwen3.5-397B-A17B", - "name": "Qwen3.5 397B-A17B", - "display_name": "Qwen3.5 397B-A17B", + "id": "openrouter/pareto-code", + "name": "Pareto Code Router", + "display_name": "Pareto Code Router", "modalities": { "input": [ "text" @@ -185067,35 +177917,24 @@ ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 200000, + "output": 65536 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { - "supported": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": false, - "open_weights": true, - "release_date": "2026-02-15", - "last_updated": "2026-02-15", + "open_weights": false, + "release_date": "2026-04-21", + "last_updated": "2026-05-01", "type": "chat" }, { - "id": "Qwen/Qwen3.5-9B", - "name": "Qwen/Qwen3.5-9B", - "display_name": "Qwen/Qwen3.5-9B", + "id": "openrouter/free", + "name": "OpenRouter Free Models Router", + "display_name": "OpenRouter Free Models Router", "modalities": { "input": [ "text", @@ -185106,102 +177945,90 @@ ] }, "limit": { - "context": 262144, + "context": 200000, "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": true, + "default": true }, "attachment": true, - "open_weights": true, - "release_date": "2026-02-23", - "last_updated": "2026-02-23", + "open_weights": false, + "release_date": "2026-02-01", + "last_updated": "2026-02-01", "type": "chat" }, { - "id": "Qwen/Qwen3-VL-32B-Instruct", - "name": "Qwen/Qwen3-VL-32B-Instruct", - "display_name": "Qwen/Qwen3-VL-32B-Instruct", + "id": "openrouter/bodybuilder", + "name": "Body Builder (beta)", + "display_name": "Body Builder (beta)", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262000, + "context": 128000, "output": 32768 }, - "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, - "attachment": true, - "open_weights": true, - "release_date": "2025-10-21", - "last_updated": "2025-11-25", + "attachment": false, + "open_weights": false, + "release_date": "2026-03-15", + "last_updated": "2026-03-15", "type": "chat" }, { - "id": "Qwen/Qwen3.5-122B-A10B", - "name": "Qwen3.5 122B-A10B", - "display_name": "Qwen3.5 122B-A10B", + "id": "sakana/fugu-max", + "name": "Fugu Max", + "display_name": "Fugu Max", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "high", + "xhigh", + "max" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-02-23", - "last_updated": "2026-02-23", + "open_weights": false, + "release_date": "2026-09-11", + "last_updated": "2026-09-11", "type": "chat" }, { - "id": "Qwen/Qwen3.5-35B-A3B", - "name": "Qwen3.5 35B-A3B", - "display_name": "Qwen3.5 35B-A3B", + "id": "sakana/fugu-ultra", + "name": "Fugu Ultra", + "display_name": "Fugu Ultra", "modalities": { "input": [ "text", @@ -185212,49 +178039,49 @@ ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "high", + "xhigh", + "max" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-02-23", - "last_updated": "2026-02-23", + "open_weights": false, + "release_date": "2026-06-15", + "last_updated": "2026-06-15", "type": "chat" }, { - "id": "MiniMaxAI/MiniMax-M3", - "name": "MiniMax-M3", - "display_name": "MiniMax-M3", + "id": "sakana/fugu-ultra-v2", + "name": "Fugu Ultra v2", + "display_name": "Fugu Ultra v2", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131000 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -185262,57 +178089,62 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "high", + "xhigh", + "max" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-06-01", - "last_updated": "2026-06-01", + "open_weights": false, + "knowledge": "2026-08-28", + "release_date": "2026-09-11", + "last_updated": "2026-09-11", "type": "chat" }, { - "id": "MiniMaxAI/MiniMax-M2.5", - "name": "MiniMaxAI/MiniMax-M2.5", - "display_name": "MiniMaxAI/MiniMax-M2.5", + "id": "sakana/sakana-namazu", + "name": "Sakana Namazu", + "display_name": "Sakana Namazu", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 197000, - "output": 131000 + "context": 262144, + "output": 65536 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true + "effort_options": [ + "none", + "high" + ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-02-12", - "last_updated": "2026-02-12", + "attachment": true, + "open_weights": false, + "release_date": "2026-08-03", + "last_updated": "2026-08-03", "type": "chat" }, { - "id": "inclusionAI/Ling-flash-2.0", - "name": "inclusionAI/Ling-flash-2.0", - "display_name": "inclusionAI/Ling-flash-2.0", + "id": "poolside/laguna-s-2.1:free", + "name": "Poolside: Laguna S 2.1 (free)", + "display_name": "Poolside: Laguna S 2.1 (free)", "modalities": { "input": [ "text" @@ -185322,28 +178154,36 @@ ] }, "limit": { - "context": 131000, - "output": 49780 + "context": 262144, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "high" + ] + } }, "attachment": false, "open_weights": true, - "release_date": "2025-09-18", - "last_updated": "2025-11-25", + "release_date": "2026-07-21", + "last_updated": "2026-07-21", "type": "chat" }, { - "id": "nex-agi/Nex-N2-Pro", - "name": "Nex-N2-Pro", - "display_name": "Nex-N2-Pro", + "id": "poolside/laguna-xs-2.1", + "name": "Poolside: Laguna XS 2.1 (retires Oct 31)", + "display_name": "Poolside: Laguna XS 2.1 (retires Oct 31)", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" @@ -185351,7 +178191,7 @@ }, "limit": { "context": 262144, - "output": 256000 + "output": 32768 }, "temperature": true, "tool_call": true, @@ -185362,28 +178202,25 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "none", + "high" ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-06-02", - "last_updated": "2026-06-02", + "release_date": "2026-07-02", + "last_updated": "2026-07-02", "type": "chat" }, { - "id": "google/gemma-4-26B-A4B-it", - "name": "Gemma 4 26B A4B IT", - "display_name": "Gemma 4 26B A4B IT", + "id": "poolside/laguna-xs-2.1:free", + "name": "Poolside: Laguna XS 2.1 (free)", + "display_name": "Poolside: Laguna XS 2.1 (free)", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" @@ -185391,101 +178228,81 @@ }, "limit": { "context": 262144, - "output": 99615 + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true + "effort_options": [ + "none", + "high" + ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "release_date": "2026-07-02", + "last_updated": "2026-07-02", "type": "chat" }, { - "id": "google/gemma-4-12B-it", - "name": "Gemma 4 12B IT", - "display_name": "Gemma 4 12B IT", + "id": "poolside/laguna-s-2.1", + "name": "Poolside: Laguna S 2.1 (retires Oct 31)", + "display_name": "Poolside: Laguna S 2.1 (retires Oct 31)", "modalities": { "input": [ - "text", - "image" - ], - "output": [ "text" - ] - }, - "limit": { - "context": 262144, - "output": 99615 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": true, - "release_date": "2026-06-09", - "last_updated": "2026-06-09", - "type": "chat" - }, - { - "id": "google/gemma-4-31B-it", - "name": "Gemma 4 31B IT", - "display_name": "Gemma 4 31B IT", - "modalities": { - "input": [ - "text", - "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 99615 + "context": 1048576, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "effort_options": [ + "none", + "high" + ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "release_date": "2026-07-21", + "last_updated": "2026-07-21", "type": "chat" }, { - "id": "meituan-longcat/LongCat-2.0", - "name": "LongCat-2.0", - "display_name": "LongCat-2.0", + "id": "nex-agi/nex-n2.5-pro", + "name": "Nex AGI: Nex-N2.5-Pro", + "display_name": "Nex AGI: Nex-N2.5-Pro", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1049000, - "output": 131072 + "context": 262144, + "output": 235929 }, "temperature": true, "tool_call": true, @@ -185495,25 +178312,23 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "none", + "medium", + "high" ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-06-30", - "last_updated": "2026-06-30", + "attachment": true, + "open_weights": false, + "release_date": "2026-09-08", + "last_updated": "2026-09-08", "type": "chat" }, { - "id": "moonshotai/Kimi-K2.6", - "name": "moonshotai/Kimi-K2.6", - "display_name": "moonshotai/Kimi-K2.6", + "id": "nex-agi/nex-n2.5-mini", + "name": "Nex AGI: Nex-N2.5-Mini", + "display_name": "Nex AGI: Nex-N2.5-Mini", "modalities": { "input": [ "text", @@ -185524,51 +178339,49 @@ ] }, "limit": { - "context": 262000, - "output": 99560 + "context": 262144, + "output": 235929 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "none", + "medium", + "high" ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-20", - "last_updated": "2026-04-20", + "open_weights": false, + "release_date": "2026-09-08", + "last_updated": "2026-09-08", "type": "chat" }, { - "id": "moonshotai/Kimi-K3", - "name": "Kimi K3", - "display_name": "Kimi K3", + "id": "stepfun/step-5-preview", + "name": "Step 5 Preview", + "display_name": "Step 5 Preview", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 262000 + "context": 1000000, + "output": 64000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -185576,39 +178389,38 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "low", + "medium", + "high" ] } }, "attachment": true, "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-16", + "release_date": "2026-09-16", + "last_updated": "2026-09-20", "type": "chat" }, { - "id": "moonshotai/Kimi-K2.7-Code", - "name": "Kimi K2.7 Code", - "display_name": "Kimi K2.7 Code", + "id": "stepfun/step-3.7-flash", + "name": "Step 3.7 Flash", + "display_name": "Step 3.7 Flash", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 99615 + "context": 256000, + "output": 230400 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -185616,38 +178428,35 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "low", + "medium", + "high" ] } }, "attachment": true, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-06-12", - "last_updated": "2026-06-12", + "knowledge": "2026-03-01", + "release_date": "2026-05-29", + "last_updated": "2026-05-29", "type": "chat" }, { - "id": "moonshotai/Kimi-K2.5", - "name": "moonshotai/Kimi-K2.5", - "display_name": "moonshotai/Kimi-K2.5", + "id": "stepfun/step-3.5-flash", + "name": "Step 3.5 Flash", + "display_name": "Step 3.5 Flash", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262000, - "output": 99560 + "context": 262144, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -185657,26 +178466,22 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "high" ] } }, - "attachment": true, + "attachment": false, "open_weights": true, "knowledge": "2025-01", - "release_date": "2026-01-27", - "last_updated": "2026-01-27", + "release_date": "2026-01-29", + "last_updated": "2026-02-13", "type": "chat" }, { - "id": "openai/gpt-oss-120b", - "name": "openai/gpt-oss-120b", - "display_name": "openai/gpt-oss-120b", + "id": "sao10k/l3.1-euryale-70b", + "name": "Sao10K: Llama 3.1 Euryale 70B v2.2", + "display_name": "Sao10K: Llama 3.1 Euryale 70B v2.2", "modalities": { "input": [ "text" @@ -185686,31 +178491,25 @@ ] }, "limit": { - "context": 131000, - "output": 8000 + "context": 131072, + "output": 16384 }, "temperature": true, "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, "attachment": false, "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "knowledge": "2023-12-31", + "release_date": "2024-08-28", + "last_updated": "2024-08-28", "type": "chat" }, { - "id": "openai/gpt-oss-20b", - "name": "openai/gpt-oss-20b", - "display_name": "openai/gpt-oss-20b", + "id": "sao10k/l3-lunaris-8b", + "name": "Sao10K: Llama 3 8B Lunaris", + "display_name": "Sao10K: Llama 3 8B Lunaris", "modalities": { "input": [ "text" @@ -185720,30 +178519,25 @@ ] }, "limit": { - "context": 131000, - "output": 8000 + "context": 8192, + "output": 7372 }, "temperature": true, "tool_call": false, "reasoning": { - "supported": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, "attachment": false, "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "knowledge": "2023-12-31", + "release_date": "2024-08-13", + "last_updated": "2024-08-13", "type": "chat" }, { - "id": "zai-org/GLM-5", - "name": "zai-org/GLM-5", - "display_name": "zai-org/GLM-5", + "id": "thedrummer/unslopnemo-12b", + "name": "TheDrummer: UnslopNemo 12B", + "display_name": "TheDrummer: UnslopNemo 12B", "modalities": { "input": [ "text" @@ -185753,36 +178547,25 @@ ] }, "limit": { - "context": 205000, - "output": 131072 + "context": 1024000, + "output": 819200 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": false, "open_weights": true, - "release_date": "2026-02-12", - "last_updated": "2026-02-12", + "knowledge": "2024-04-30", + "release_date": "2024-11-08", + "last_updated": "2024-11-08", "type": "chat" }, { - "id": "zai-org/GLM-5.1", - "name": "zai-org/GLM-5.1", - "display_name": "zai-org/GLM-5.1", + "id": "thedrummer/skyfall-36b-v2", + "name": "TheDrummer: Skyfall 36B V2", + "display_name": "TheDrummer: Skyfall 36B V2", "modalities": { "input": [ "text" @@ -185792,36 +178575,25 @@ ] }, "limit": { - "context": 205000, - "output": 131000 + "context": 32768, + "output": 29491 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": false, "open_weights": true, - "release_date": "2026-04-07", - "last_updated": "2026-04-07", + "knowledge": "2024-06-30", + "release_date": "2025-03-10", + "last_updated": "2025-03-10", "type": "chat" }, { - "id": "zai-org/GLM-5.3", - "name": "GLM-5.3", - "display_name": "GLM-5.3", + "id": "thedrummer/cydonia-24b-v4.1", + "name": "TheDrummer: Cydonia 24B V4.1", + "display_name": "TheDrummer: Cydonia 24B V4.1", "modalities": { "input": [ "text" @@ -185831,52 +178603,39 @@ ] }, "limit": { - "context": 1049000, - "output": 262000 + "context": 131072, + "output": 117964 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "low", - "high", - "max" - ] - } + "supported": false }, "attachment": false, "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "knowledge": "2024-04-30", + "release_date": "2025-09-27", + "last_updated": "2025-09-27", "type": "chat" }, { - "id": "zai-org/GLM-5.2", - "name": "GLM-5.2", - "display_name": "GLM-5.2", + "id": "meta/muse-spark-1.2", + "name": "Muse Spark 1.2", + "display_name": "Muse Spark 1.2", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1049000, - "output": 262000 + "context": 1048576, + "output": 943718 }, "temperature": true, "tool_call": true, @@ -185887,40 +178646,38 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ + "minimal", + "low", + "medium", "high", - "max" + "xhigh" ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "attachment": true, + "open_weights": false, + "release_date": "2026-08-05", + "last_updated": "2026-08-05", "type": "chat" }, { - "id": "zai-org/GLM-5.3-Flash", - "name": "GLM-5.3-Flash", - "display_name": "GLM-5.3-Flash", + "id": "meta/muse-glimmer-30b", + "name": "Muse Glimmer 30B", + "display_name": "Muse Glimmer 30B", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1049000, - "output": 262000 + "context": 131072, + "output": 16384 }, "temperature": true, "tool_call": true, @@ -185930,70 +178687,81 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ "low", + "medium", "high", - "max" + "xhigh" ] } }, "attachment": true, "open_weights": true, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", + "knowledge": "2026-01-04", + "release_date": "2026-08-10", + "last_updated": "2026-08-10", "type": "chat" }, { - "id": "zai-org/GLM-4.5-Air", - "name": "zai-org/GLM-4.5-Air", - "display_name": "zai-org/GLM-4.5-Air", + "id": "meta/muse-spark-1.2-contributor", + "name": "Meta: Muse Spark 1.2 Contributor", + "display_name": "Meta: Muse Spark 1.2 Contributor", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131000, - "output": 98304 + "context": 1048576, + "output": 943718 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-07-28", - "last_updated": "2025-07-28", + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] + } + }, + "attachment": true, + "open_weights": false, + "release_date": "2026-08-21", + "last_updated": "2026-08-21", "type": "chat" }, { - "id": "zai-org/GLM-5V-Turbo", - "name": "zai-org/GLM-5V-Turbo", - "display_name": "zai-org/GLM-5V-Turbo", + "id": "meta/muse-spark-1.1", + "name": "Muse Spark 1.1", + "display_name": "Muse Spark 1.1", "modalities": { "input": [ "text", - "image" + "image", + "pdf", + "video" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 131072 + "context": 1048576, + "output": 943718 }, "temperature": true, "tool_call": true, @@ -186004,35 +178772,40 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "minimal", + "low", + "medium", + "high", + "xhigh" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-04-01", - "last_updated": "2026-04-01", + "release_date": "2026-04-08", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-V3.1", - "name": "deepseek-ai/DeepSeek-V3.1", - "display_name": "deepseek-ai/DeepSeek-V3.1", + "id": "meta/muse-spark-open", + "name": "Muse Spark Open", + "display_name": "Muse Spark Open", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "pdf", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 164000, - "output": 8192 + "context": 1048576, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -186040,27 +178813,41 @@ "supported": true, "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "high", + "xhigh" + ] + } + }, + "attachment": true, "open_weights": true, - "release_date": "2025-08-21", - "last_updated": "2025-08-21", + "knowledge": "2026-01-04", + "release_date": "2026-10-15", + "last_updated": "2026-10-15", "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-V4-Pro-0813", - "name": "DeepSeek V4 Pro 0813", - "display_name": "DeepSeek V4 Pro 0813", + "id": "meta/muse-spark-1.3-contributor", + "name": "Meta: Muse Spark 1.3 Contributor", + "display_name": "Meta: Muse Spark 1.3 Contributor", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 1048576, + "output": 943718 }, "temperature": true, "tool_call": true, @@ -186070,36 +178857,40 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "minimal", + "low", + "medium", + "high", + "xhigh", + "max" ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-08-13", - "last_updated": "2026-08-22", + "attachment": true, + "open_weights": false, + "release_date": "2026-09-02", + "last_updated": "2026-09-02", "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-V4-Flash", - "name": "DeepSeek V4 Flash", - "display_name": "DeepSeek V4 Flash", + "id": "meta/muse-spark-1.3", + "name": "Muse Spark 1.3", + "display_name": "Muse Spark 1.3", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 1048576, + "output": 943718 }, "temperature": true, "tool_call": true, @@ -186110,48 +178901,41 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", "effort_options": [ + "minimal", "low", + "medium", "high", + "xhigh", "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "attachment": true, + "open_weights": false, + "release_date": "2026-09-02", + "last_updated": "2026-09-02", "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-V4-Flash-Vision-Exp", - "name": "DeepSeek V4 Flash Vision Exp", - "display_name": "DeepSeek V4 Flash Vision Exp", + "id": "meta/muse-wonder", + "name": "Meta: Muse Wonder", + "display_name": "Meta: Muse Wonder", "modalities": { "input": [ "text", - "image" + "image", + "video", + "pdf", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 1048576, + "output": 943718 }, "temperature": true, "tool_call": true, @@ -186161,39 +178945,30 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", "effort_options": [ + "minimal", "low", + "medium", "high", + "xhigh", "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-08-21", - "last_updated": "2026-09-01", + "open_weights": false, + "release_date": "2026-10-12", + "last_updated": "2026-10-12", "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-V4-Pro", - "name": "DeepSeek V4 Pro", - "display_name": "DeepSeek V4 Pro", + "id": "kilo-auto/balanced", + "name": "Auto Balanced", + "display_name": "Auto Balanced", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" @@ -186201,7 +178976,7 @@ }, "limit": { "context": 1000000, - "output": 384000 + "output": 65536 }, "temperature": true, "tool_call": true, @@ -186209,50 +178984,29 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." - ] - } - }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "attachment": true, + "open_weights": false, + "release_date": "1970-01-01", + "last_updated": "1970-01-01", "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-V3.2", - "name": "deepseek-ai/DeepSeek-V3.2", - "display_name": "deepseek-ai/DeepSeek-V3.2", + "id": "kilo-auto/frontier", + "name": "Auto Frontier", + "display_name": "Auto Frontier", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 164000, - "output": 65536 + "context": 1000000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -186260,22 +179014,16 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-07", - "release_date": "2025-12-01", - "last_updated": "2025-12-01", + "attachment": true, + "open_weights": false, + "release_date": "1970-01-01", + "last_updated": "1970-01-01", "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-V3.1-Terminus", - "name": "deepseek-ai/DeepSeek-V3.1-Terminus", - "display_name": "deepseek-ai/DeepSeek-V3.1-Terminus", + "id": "kilo-auto/free", + "name": "Auto Free", + "display_name": "Auto Free", "modalities": { "input": [ "text" @@ -186285,8 +179033,8 @@ ] }, "limit": { - "context": 164000, - "output": 8192 + "context": 256000, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -186295,26 +179043,27 @@ "default": true }, "attachment": false, - "open_weights": true, - "release_date": "2025-09-29", - "last_updated": "2025-11-25", + "open_weights": false, + "release_date": "1970-01-01", + "last_updated": "1970-01-01", "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-V4-Flash-0731", - "name": "DeepSeek V4 Flash 0731", - "display_name": "DeepSeek V4 Flash 0731", + "id": "kilo-auto/small", + "name": "Auto Small", + "display_name": "Auto Small", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 262144, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -186322,39 +179071,28 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-07-31", - "last_updated": "2026-07-31", + "attachment": true, + "open_weights": false, + "release_date": "1970-01-01", + "last_updated": "1970-01-01", "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-R1", - "name": "deepseek-ai/DeepSeek-R1", - "display_name": "deepseek-ai/DeepSeek-R1", + "id": "kilo-auto/efficient", + "name": "Auto Efficient", + "display_name": "Auto Efficient", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 164000, - "output": 8192 + "context": 1000000, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -186362,80 +179100,72 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, - "attachment": false, - "open_weights": true, - "release_date": "2025-05-28", - "last_updated": "2025-05-28", + "attachment": true, + "open_weights": false, + "release_date": "1970-01-01", + "last_updated": "1970-01-01", "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-V3", - "name": "deepseek-ai/DeepSeek-V3", - "display_name": "deepseek-ai/DeepSeek-V3", + "id": "scaledown/extract", + "name": "ScaleDown: Extract", + "display_name": "ScaleDown: Extract", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 164000, - "output": 8192 + "context": 1000000, + "output": 900000 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { "supported": false }, - "attachment": false, - "open_weights": true, - "release_date": "2025-03-24", - "last_updated": "2025-03-24", + "attachment": true, + "open_weights": false, + "release_date": "2026-10-13", + "last_updated": "2026-10-13", "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-V3.2-Exp", - "name": "deepseek-ai/DeepSeek-V3.2-Exp", - "display_name": "deepseek-ai/DeepSeek-V3.2-Exp", + "id": "scaledown/summarize", + "name": "ScaleDown: Summarize", + "display_name": "ScaleDown: Summarize", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 164000, - "output": 65536 + "context": 1000000, + "output": 4000 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": false, - "open_weights": true, - "release_date": "2025-10-10", - "last_updated": "2025-11-25", + "attachment": true, + "open_weights": false, + "release_date": "2026-10-13", + "last_updated": "2026-10-13", "type": "chat" }, { - "id": "tencent/Hy3", + "id": "tencent/hy3", "name": "Hy3", "display_name": "Hy3", "modalities": { @@ -186448,7 +179178,7 @@ }, "limit": { "context": 262144, - "output": 99615 + "output": 128000 }, "temperature": true, "tool_call": true, @@ -186458,7 +179188,12 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "effort_options": [ + "none", + "low", + "high" + ] } }, "attachment": false, @@ -186468,9 +179203,9 @@ "type": "chat" }, { - "id": "tencent/Hunyuan-A13B-Instruct", - "name": "tencent/Hunyuan-A13B-Instruct", - "display_name": "tencent/Hunyuan-A13B-Instruct", + "id": "tencent/hy-mt2-1.8b", + "name": "Hy-MT2-1.8B", + "display_name": "Hy-MT2-1.8B", "modalities": { "input": [ "text" @@ -186480,25 +179215,24 @@ ] }, "limit": { - "context": 131000, - "output": 117964 + "context": 8192, + "output": 4096 }, "temperature": true, "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, "open_weights": true, - "release_date": "2025-06-30", - "last_updated": "2025-11-25", + "release_date": "2026-05-21", + "last_updated": "2026-05-21", "type": "chat" }, { - "id": "ByteDance-Seed/Seed-OSS-36B-Instruct", - "name": "ByteDance-Seed/Seed-OSS-36B-Instruct", - "display_name": "ByteDance-Seed/Seed-OSS-36B-Instruct", + "id": "tencent/hy-mt2-30b-a3b", + "name": "Hy-MT2-30B-A3B", + "display_name": "Hy-MT2-30B-A3B", "modalities": { "input": [ "text" @@ -186508,29 +179242,24 @@ ] }, "limit": { - "context": 262000, - "output": 99560 + "context": 8192, + "output": 4096 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, "attachment": false, "open_weights": true, - "release_date": "2025-09-04", - "last_updated": "2025-11-25", + "release_date": "2026-05-21", + "last_updated": "2026-05-21", "type": "chat" }, { - "id": "stepfun-ai/Step-3.5-Flash", - "name": "stepfun-ai/Step-3.5-Flash", - "display_name": "stepfun-ai/Step-3.5-Flash", + "id": "tencent/hunyuan-a13b-instruct", + "name": "Tencent: Hunyuan A13B Instruct", + "display_name": "Tencent: Hunyuan A13B Instruct", "modalities": { "input": [ "text" @@ -186540,41 +179269,36 @@ ] }, "limit": { - "context": 262000, - "output": 66000 + "context": 131072, + "output": 117964 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "high" + ] + } + }, "attachment": false, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-01-29", - "last_updated": "2026-02-13", + "open_weights": false, + "release_date": "2025-07-08", + "last_updated": "2025-07-08", "type": "chat" - } - ] - }, - "xiaomi-token-plan-cn": { - "id": "xiaomi-token-plan-cn", - "name": "Xiaomi Token Plan (China)", - "display_name": "Xiaomi Token Plan (China)", - "api": "https://token-plan-cn.xiaomimimo.com/v1", - "doc": "https://platform.xiaomimimo.com/#/docs", - "models": [ + }, { - "id": "mimo-v2.5", - "name": "MiMo-V2.5", - "display_name": "MiMo-V2.5", + "id": "tencent/hy4-preview", + "name": "Hy4 preview", + "display_name": "Hy4 preview", "modalities": { "input": [ - "text", - "image", - "audio", - "video" + "text" ], "output": [ "text" @@ -186582,7 +179306,7 @@ }, "limit": { "context": 1048576, - "output": 131072 + "output": 64000 }, "temperature": true, "tool_call": true, @@ -186593,39 +179317,34 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "none", + "low", + "high" ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2024-12", - "release_date": "2026-04-22", - "last_updated": "2026-04-22", + "release_date": "2026-08-28", + "last_updated": "2026-08-28", "type": "chat" }, { - "id": "mimo-v2.6-pro", - "name": "MiMo-V2.6-Pro", - "display_name": "MiMo-V2.6-Pro", + "id": "tencent/hy3-preview", + "name": "Hy3 preview", + "display_name": "Hy3 preview", "modalities": { "input": [ - "text", - "image", - "audio", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 262144, + "output": 235929 }, "temperature": true, "tool_call": true, @@ -186635,77 +179354,78 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "none", + "low", + "high" ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "release_date": "2026-04-20", + "last_updated": "2026-04-20", "type": "chat" }, { - "id": "mimo-v2.5-tts", - "name": "MiMo-V2.5-TTS", - "display_name": "MiMo-V2.5-TTS", + "id": "tencent/hy-mt2-7b", + "name": "Hy-MT2-7B", + "display_name": "Hy-MT2-7B", "modalities": { "input": [ "text" ], "output": [ - "audio" + "text" ] }, "limit": { "context": 8192, - "output": 8192 + "output": 4096 }, - "temperature": false, + "temperature": true, "tool_call": false, "reasoning": { "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2026-04-22", - "last_updated": "2026-04-22" + "open_weights": true, + "release_date": "2026-05-21", + "last_updated": "2026-05-21", + "type": "chat" }, { - "id": "mimo-v2.5-tts-voiceclone", - "name": "MiMo-V2.5-TTS-VoiceClone", - "display_name": "MiMo-V2.5-TTS-VoiceClone", + "id": "nousresearch/hermes-3-llama-3.1-70b", + "name": "Nous: Hermes 3 70B Instruct (retires Nov 2)", + "display_name": "Nous: Hermes 3 70B Instruct (retires Nov 2)", "modalities": { "input": [ "text" ], "output": [ - "audio" + "text" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 131072, + "output": 16384 }, - "temperature": false, + "temperature": true, "tool_call": false, "reasoning": { "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2026-04-22", - "last_updated": "2026-04-22" + "open_weights": true, + "knowledge": "2023-12-31", + "release_date": "2024-08-18", + "last_updated": "2024-08-18", + "type": "chat" }, { - "id": "mimo-v2.5-pro", - "name": "MiMo-V2.5-Pro", - "display_name": "MiMo-V2.5-Pro", + "id": "nousresearch/hermes-4-405b", + "name": "Nous: Hermes 4 405B", + "display_name": "Nous: Hermes 4 405B", "modalities": { "input": [ "text" @@ -186715,330 +179435,236 @@ ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 131072, + "output": 117964 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "none", + "high" ] } }, "attachment": false, "open_weights": true, - "knowledge": "2024-12", - "release_date": "2026-04-22", - "last_updated": "2026-04-22", + "knowledge": "2024-08-31", + "release_date": "2025-08-26", + "last_updated": "2025-08-26", "type": "chat" }, { - "id": "mimo-v2.5-tts-voicedesign", - "name": "MiMo-V2.5-TTS-VoiceDesign", - "display_name": "MiMo-V2.5-TTS-VoiceDesign", + "id": "nousresearch/hermes-3-llama-3.1-405b", + "name": "Nous: Hermes 3 405B Instruct (retires Nov 2)", + "display_name": "Nous: Hermes 3 405B Instruct (retires Nov 2)", "modalities": { "input": [ "text" ], "output": [ - "audio" + "text" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 131072, + "output": 16384 }, - "temperature": false, + "temperature": true, "tool_call": false, "reasoning": { "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2026-04-22", - "last_updated": "2026-04-22" + "open_weights": true, + "knowledge": "2023-12-31", + "release_date": "2024-08-16", + "last_updated": "2024-08-16", + "type": "chat" }, { - "id": "mimo-v2.6-flash", - "name": "MiMo-V2.6-Flash", - "display_name": "MiMo-V2.6-Flash", + "id": "perplexity/sonar-reasoning-pro", + "name": "Perplexity: Sonar Reasoning Pro", + "display_name": "Perplexity: Sonar Reasoning Pro", "modalities": { "input": [ "text", - "image", - "audio", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 128000, + "output": 115200 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "high" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "open_weights": false, + "release_date": "2025-03-07", + "last_updated": "2025-03-07", "type": "chat" - } - ] - }, - "xiaomi-token-plan-ams": { - "id": "xiaomi-token-plan-ams", - "name": "Xiaomi Token Plan (Europe)", - "display_name": "Xiaomi Token Plan (Europe)", - "api": "https://token-plan-ams.xiaomimimo.com/v1", - "doc": "https://platform.xiaomimimo.com/#/docs", - "models": [ + }, { - "id": "mimo-v2.6-pro", - "name": "MiMo-V2.6-Pro", - "display_name": "MiMo-V2.6-Pro", + "id": "perplexity/sonar", + "name": "Perplexity: Sonar", + "display_name": "Perplexity: Sonar", "modalities": { "input": [ "text", - "image", - "audio", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 127072, + "output": 114364 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": true, - "open_weights": true, - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "open_weights": false, + "release_date": "2025-01-27", + "last_updated": "2025-01-27", "type": "chat" }, { - "id": "mimo-v2.6-flash", - "name": "MiMo-V2.6-Flash", - "display_name": "MiMo-V2.6-Flash", + "id": "perplexity/sonar-deep-research", + "name": "Perplexity: Sonar Deep Research", + "display_name": "Perplexity: Sonar Deep Research", "modalities": { "input": [ - "text", - "image", - "audio", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 128000, + "output": 115200 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "high" ] } }, - "attachment": true, - "open_weights": true, - "release_date": "2026-09-22", - "last_updated": "2026-09-22", - "type": "chat" - }, - { - "id": "mimo-v2.5-tts-voicedesign", - "name": "MiMo-V2.5-TTS-VoiceDesign", - "display_name": "MiMo-V2.5-TTS-VoiceDesign", - "modalities": { - "input": [ - "text" - ], - "output": [ - "audio" - ] - }, - "limit": { - "context": 8192, - "output": 8192 - }, - "temperature": false, - "tool_call": false, - "reasoning": { - "supported": false - }, "attachment": false, "open_weights": false, - "release_date": "2026-04-22", - "last_updated": "2026-04-22" + "release_date": "2025-03-07", + "last_updated": "2025-03-07", + "type": "chat" }, { - "id": "mimo-v2.5-pro", - "name": "MiMo-V2.5-Pro", - "display_name": "MiMo-V2.5-Pro", + "id": "perplexity/sonar-pro-search", + "name": "Perplexity: Sonar Pro Search", + "display_name": "Perplexity: Sonar Pro Search", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 200000, + "output": 8000 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "high" ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-12", - "release_date": "2026-04-22", - "last_updated": "2026-04-22", + "attachment": true, + "open_weights": false, + "release_date": "2025-10-30", + "last_updated": "2025-10-30", "type": "chat" }, { - "id": "mimo-v2.5-tts-voiceclone", - "name": "MiMo-V2.5-TTS-VoiceClone", - "display_name": "MiMo-V2.5-TTS-VoiceClone", + "id": "perplexity/sonar-pro", + "name": "Perplexity: Sonar Pro", + "display_name": "Perplexity: Sonar Pro", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ - "audio" - ] - }, - "limit": { - "context": 8192, - "output": 8192 - }, - "temperature": false, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": false, - "release_date": "2026-04-22", - "last_updated": "2026-04-22" - }, - { - "id": "mimo-v2.5-tts", - "name": "MiMo-V2.5-TTS", - "display_name": "MiMo-V2.5-TTS", - "modalities": { - "input": [ "text" - ], - "output": [ - "audio" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 200000, + "output": 8000 }, - "temperature": false, + "temperature": true, "tool_call": false, "reasoning": { "supported": false }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-04-22", - "last_updated": "2026-04-22" + "release_date": "2025-03-07", + "last_updated": "2025-03-07", + "type": "chat" }, { - "id": "mimo-v2.5", - "name": "MiMo-V2.5", - "display_name": "MiMo-V2.5", + "id": "stealth/glyph-cluster", + "name": "Stealth: Glyph Cluster (free)", + "display_name": "Stealth: Glyph Cluster (free)", "modalities": { "input": [ - "text", - "image", - "audio", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 256000, + "output": 256000 }, "temperature": true, "tool_call": true, @@ -187048,168 +179674,172 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "low", + "medium", + "high", + "xhigh" ] } }, - "attachment": true, - "open_weights": true, - "knowledge": "2024-12", - "release_date": "2026-04-22", - "last_updated": "2026-04-22", + "attachment": false, + "open_weights": false, + "release_date": "2025-08-26", + "last_updated": "2025-08-26", "type": "chat" - } - ] - }, - "togetherai": { - "id": "togetherai", - "name": "Together AI", - "display_name": "Together AI", - "doc": "https://docs.together.ai/docs/serverless-models", - "models": [ + }, { - "id": "Qwen/Qwen3.6-Plus", - "name": "Qwen3.6 Plus", - "display_name": "Qwen3.6 Plus", + "id": "unbiased/pareto-26.9", + "name": "Pareto 26.9", + "display_name": "Pareto 26.9", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 262144, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2025-04", - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "release_date": "2026-10-13", + "last_updated": "2026-10-13", "type": "chat" }, { - "id": "Qwen/Qwen2.5-7B-Instruct-Turbo", - "name": "Qwen 2.5 7B Instruct Turbo", - "display_name": "Qwen 2.5 7B Instruct Turbo", + "id": "unbiased/pareto-26.10", + "name": "Pareto 26.10", + "display_name": "Pareto 26.10", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 32768, - "output": 32768 + "context": 1048576, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, - "open_weights": true, - "release_date": "2024-09-19", - "last_updated": "2024-09-19", + "attachment": true, + "open_weights": false, + "release_date": "2026-10-15", + "last_updated": "2026-10-15", "type": "chat" }, { - "id": "Qwen/Qwen3-Coder-480B-A35B-Instruct-FP8", - "name": "Qwen3 Coder 480B A35B Instruct", - "display_name": "Qwen3 Coder 480B A35B Instruct", + "id": "dots-studio/dots-3-note-preview:free", + "name": "Dots Studio: Dots3-Note Preview (free)", + "display_name": "Dots Studio: Dots3-Note Preview (free)", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 512000, + "output": 460800 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-07-22", - "last_updated": "2025-07-22", + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "high" + ] + } + }, + "attachment": true, + "open_weights": false, + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "Qwen/Qwen3-235B-A22B-Instruct-2507-tput", - "name": "Qwen3 235B A22B Instruct 2507 FP8", - "display_name": "Qwen3 235B A22B Instruct 2507 FP8", + "id": "thinkingmachines/inkling", + "name": "Inkling", + "display_name": "Inkling", "modalities": { "input": [ - "text" + "text", + "image", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 524288, + "output": 471859 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "minimal", + "low", + "medium", + "high", + "max" + ] + } + }, + "attachment": true, "open_weights": true, - "release_date": "2025-07-21", - "last_updated": "2025-07-21", + "release_date": "2026-07-15", + "last_updated": "2026-07-15", "type": "chat" }, { - "id": "Qwen/Qwen3.5-397B-A17B", - "name": "Qwen3.5 397B A17B", - "display_name": "Qwen3.5 397B A17B", + "id": "thinkingmachines/inkling-small", + "name": "Inkling Small", + "display_name": "Inkling Small", "modalities": { "input": [ "text", - "image" + "image", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 130000 + "context": 524288, + "output": 262144 }, "temperature": true, "tool_call": true, @@ -187219,25 +179849,26 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "none", + "minimal", + "low", + "medium", + "high", + "max" ] } }, "attachment": true, "open_weights": true, - "release_date": "2026-02-15", - "last_updated": "2026-02-15", + "release_date": "2026-07-30", + "last_updated": "2026-07-30", "type": "chat" }, { - "id": "Qwen/Qwen3.7-Max", - "name": "Qwen3.7 Max", - "display_name": "Qwen3.7 Max", + "id": "xingchen-agi/xing4.0-29b-a4b:free", + "name": "XingChen: Xing4.0 29B A4B (free)", + "display_name": "XingChen: Xing4.0 29B A4B (free)", "modalities": { "input": [ "text" @@ -187247,8 +179878,8 @@ ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 262144, + "output": 235929 }, "temperature": true, "tool_call": true, @@ -187258,32 +179889,33 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "effort_options": [ + "none", + "high" + ] } }, "attachment": false, "open_weights": false, - "release_date": "2026-05-21", - "last_updated": "2026-05-21", + "release_date": "2026-10-16", + "last_updated": "2026-10-16", "type": "chat" }, { - "id": "Qwen/Qwen3.5-9B", - "name": "Qwen3.5 9B", - "display_name": "Qwen3.5 9B", + "id": "reflection/beam-free", + "name": "Reflection: Beam 1.0 (free)", + "display_name": "Reflection: Beam 1.0 (free)", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 1048576, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -187293,25 +179925,25 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" ] } }, - "attachment": true, - "open_weights": true, - "release_date": "2026-02-23", - "last_updated": "2026-02-23", + "attachment": false, + "open_weights": false, + "release_date": "2025-08-26", + "last_updated": "2025-08-26", "type": "chat" }, { - "id": "Qwen/Qwen3-Coder-Next-FP8", - "name": "Qwen3 Coder Next FP8", - "display_name": "Qwen3 Coder Next FP8", + "id": "reflection/beam-1.0-501b-a23b", + "name": "Reflection: Beam 1.0 501B A23B", + "display_name": "Reflection: Beam 1.0 501B A23B", "modalities": { "input": [ "text" @@ -187321,25 +179953,37 @@ ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1048576, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } }, "attachment": false, "open_weights": true, - "knowledge": "2025-09", - "release_date": "2026-02-03", - "last_updated": "2026-02-03", + "knowledge": "2026-06-30", + "release_date": "2026-10-05", + "last_updated": "2026-10-16", "type": "chat" }, { - "id": "MiniMaxAI/MiniMax-M2.7", - "name": "MiniMax-M2.7", - "display_name": "MiniMax-M2.7", + "id": "recursive/flint-v1.0:free", + "name": "Recursive: Flint (free)", + "display_name": "Recursive: Flint (free)", "modalities": { "input": [ "text" @@ -187349,8 +179993,8 @@ ] }, "limit": { - "context": 196608, - "output": 131072 + "context": 262144, + "output": 235929 }, "temperature": true, "tool_call": true, @@ -187360,60 +180004,49 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "high" ] } }, "attachment": false, - "open_weights": true, - "release_date": "2026-03-18", - "last_updated": "2026-03-18", + "open_weights": false, + "release_date": "2026-10-21", + "last_updated": "2026-10-21", "type": "chat" }, { - "id": "MiniMaxAI/MiniMax-M3", - "name": "MiniMax-M3", - "display_name": "MiniMax-M3", + "id": "bytedance/ui-tars-1.5-7b", + "name": "ByteDance: UI-TARS 7B ", + "display_name": "ByteDance: UI-TARS 7B ", "modalities": { "input": [ - "text", "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 524288, - "output": 524288 + "context": 128000, + "output": 2048 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, "attachment": true, - "open_weights": true, - "release_date": "2026-06-01", - "last_updated": "2026-06-01", + "open_weights": false, + "release_date": "2025-07-22", + "last_updated": "2025-07-22", "type": "chat" }, { - "id": "MiniMaxAI/MiniMax-M2.5", - "name": "MiniMax-M2.5", - "display_name": "MiniMax-M2.5", + "id": "mancer/weaver", + "name": "Mancer: Weaver (alpha)", + "display_name": "Mancer: Weaver (alpha)", "modalities": { "input": [ "text" @@ -187423,34 +180056,29 @@ ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 8000, + "output": 6000 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, "attachment": false, - "open_weights": true, - "release_date": "2026-02-12", - "last_updated": "2026-02-12", + "open_weights": false, + "knowledge": "2023-06-30", + "release_date": "2023-08-02", + "last_updated": "2023-08-02", "type": "chat" }, { - "id": "nvidia/NVIDIA-Nemotron-3.5-Super-VL", - "name": "Nemotron 3.5 Super VL 120B A12B", - "display_name": "Nemotron 3.5 Super VL 120B A12B", + "id": "rekaai/reka-edge", + "name": "Reka Edge", + "display_name": "Reka Edge", "modalities": { "input": [ - "text", "image", + "text", "video" ], "output": [ @@ -187458,36 +180086,24 @@ ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 16384, + "output": 14745 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": true, "open_weights": true, - "release_date": "2026-10-15", - "last_updated": "2026-10-15", + "release_date": "2026-03-11", + "last_updated": "2026-03-11", "type": "chat" }, { - "id": "nvidia/nemotron-3-ultra-550b-a55b", - "name": "Nemotron 3 Ultra 550B A55B", - "display_name": "Nemotron 3 Ultra 550B A55B", + "id": "rekaai/reka-flash-3", + "name": "Reka Flash 3", + "display_name": "Reka Flash 3", "modalities": { "input": [ "text" @@ -187497,58 +180113,62 @@ ] }, "limit": { - "context": 512300, - "output": 512300 + "context": 65536, + "output": 58982 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { - "supported": true + "effort_options": [ + "high" + ] } }, "attachment": false, "open_weights": true, - "knowledge": "2025-09", - "release_date": "2026-06-04", - "last_updated": "2026-06-04", + "knowledge": "2025-01-31", + "release_date": "2025-03-10", + "last_updated": "2025-03-10", "type": "chat" }, { - "id": "essentialai/Rnj-1-Instruct", - "name": "Rnj-1 Instruct", - "display_name": "Rnj-1 Instruct", + "id": "amazon/nova-premier-v1", + "name": "Amazon: Nova Premier 1.0", + "display_name": "Amazon: Nova Premier 1.0", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 32768, - "output": 32768 + "context": 1000000, + "output": 32000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, - "open_weights": true, - "release_date": "2025-12-04", - "last_updated": "2025-12-04", + "attachment": true, + "open_weights": false, + "knowledge": "2024-10", + "release_date": "2025-04-30", + "last_updated": "2025-04-30", "type": "chat" }, { - "id": "moonshotai/Kimi-K3", - "name": "Kimi K3", - "display_name": "Kimi K3", + "id": "amazon/nova-lite-v1", + "name": "Amazon: Nova Lite 1.0", + "display_name": "Amazon: Nova Lite 1.0", "modalities": { "input": [ "text", @@ -187559,42 +180179,25 @@ ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 300000, + "output": 5120 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "none", - "low", - "high", - "max" - ] - } + "supported": false }, "attachment": true, - "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-16", + "open_weights": false, + "knowledge": "2024-10-31", + "release_date": "2024-12-05", + "last_updated": "2024-12-05", "type": "chat" }, { - "id": "reflection/Beam-1.0-501B-A23B", - "name": "Beam 1.0 501B A23B", - "display_name": "Beam 1.0 501B A23B", + "id": "amazon/nova-micro-v1", + "name": "Amazon: Nova Micro 1.0", + "display_name": "Amazon: Nova Micro 1.0", "modalities": { "input": [ "text" @@ -187604,105 +180207,68 @@ ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 128000, + "output": 5120 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "minimal", - "low", - "medium", - "high", - "xhigh", - "max" - ] - } + "supported": false }, "attachment": false, - "open_weights": true, - "knowledge": "2026-06-30", - "release_date": "2026-10-05", - "last_updated": "2026-10-16", + "open_weights": false, + "knowledge": "2024-10-31", + "release_date": "2024-12-05", + "last_updated": "2024-12-05", "type": "chat" }, { - "id": "meta-models/Muse-Spark-Open-816B-A42B", - "name": "Muse Spark Open", - "display_name": "Muse Spark Open", + "id": "amazon/nova-pro-v1", + "name": "Amazon: Nova Pro 1.0", + "display_name": "Amazon: Nova Pro 1.0", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 300000, + "output": 5120 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ] - } + "supported": false }, "attachment": true, - "open_weights": true, - "knowledge": "2026-01-04", - "release_date": "2026-10-15", - "last_updated": "2026-10-15", + "open_weights": false, + "knowledge": "2024-10-31", + "release_date": "2024-12-05", + "last_updated": "2024-12-05", "type": "chat" }, { - "id": "openai/gpt-oss-120b", - "name": "GPT OSS 120B", - "display_name": "GPT OSS 120B", + "id": "amazon/nova-2-lite-v1", + "name": "Amazon: Nova 2 Lite", + "display_name": "Amazon: Nova 2 Lite", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 131072 + "context": 1000000, + "output": 65535 }, "temperature": true, "tool_call": true, @@ -187712,36 +180278,36 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ - "low", - "medium", + "none", "high" ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "attachment": true, + "open_weights": false, + "knowledge": "2025-10", + "release_date": "2025-12-02", + "last_updated": "2025-12-02", "type": "chat" }, { - "id": "zai-org/GLM-5", - "name": "GLM-5", - "display_name": "GLM-5", + "id": "elorian/glimpse", + "name": "Elorian: Glimpse", + "display_name": "Elorian: Glimpse", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 202752, - "output": 131072 + "context": 262144, + "output": 256000 }, "temperature": true, "tool_call": true, @@ -187751,38 +180317,37 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "none", + "high" ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-02-12", - "last_updated": "2026-02-12", + "attachment": true, + "open_weights": false, + "release_date": "2026-10-17", + "last_updated": "2026-10-17", "type": "chat" }, { - "id": "zai-org/GLM-5.1", - "name": "GLM-5.1", - "display_name": "GLM-5.1", + "id": "anthropic/claude-opus-5.5", + "name": "Claude Opus 5.5", + "display_name": "Claude Opus 5.5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 202752, - "output": 131072 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -187790,32 +180355,41 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-04-07", - "last_updated": "2026-04-07", + "attachment": true, + "open_weights": false, + "knowledge": "2026-06", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "zai-org/GLM-5.3", - "name": "GLM-5.3", - "display_name": "GLM-5.3", + "id": "anthropic/claude-fable-5", + "name": "Claude Fable 5", + "display_name": "Claude Fable 5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048575, - "output": 262144 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -187824,390 +180398,522 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], "interleaved": true, "summaries": true, - "visibility": "summary", + "visibility": "omitted", "continuation": [ "thinking_blocks" ], - "effort_options": [ - "low", - "high", - "max" + "notes": [ + "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", + "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", + "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "attachment": true, + "open_weights": false, + "knowledge": "2026-01-31", + "release_date": "2026-06-09", + "last_updated": "2026-06-09", "type": "chat" }, { - "id": "zai-org/GLM-5.2", - "name": "GLM-5.2", - "display_name": "GLM-5.2", + "id": "anthropic/claude-opus-4.6", + "name": "Claude Opus 4.6", + "display_name": "Claude Opus 4.6", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048575, - "output": 164000 + "context": 1000000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "max" + ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" ], - "effort_options": [ - "high", - "max" + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "attachment": true, + "open_weights": false, + "knowledge": "2025-05-31", + "release_date": "2026-02-05", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "zai-org/GLM-5.3-Flash", - "name": "GLM-5.3-Flash", - "display_name": "GLM-5.3-Flash", + "id": "anthropic/claude-haiku-4.5", + "name": "Claude Haiku 4.5 (latest)", + "display_name": "Claude Haiku 4.5 (latest)", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048575, - "output": 400000 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" ], - "effort_options": [ - "low", - "high", - "max" + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", + "open_weights": false, + "knowledge": "2025-02-28", + "release_date": "2025-10-15", + "last_updated": "2025-10-15", "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-V4-Pro-0813", - "name": "DeepSeek V4 Pro 0813", - "display_name": "DeepSeek V4 Pro 0813", + "id": "anthropic/claude-opus-4.8", + "name": "Claude Opus 4.8", + "display_name": "Claude Opus 4.8", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 384000 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], "interleaved": true, "summaries": true, - "visibility": "summary", + "visibility": "omitted", "continuation": [ "thinking_blocks" ], - "effort_options": [ - "high", - "max" + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-08-13", - "last_updated": "2026-08-22", + "attachment": true, + "open_weights": false, + "knowledge": "2026-01", + "release_date": "2026-05-28", + "last_updated": "2026-05-28", "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-V3-1", - "name": "DeepSeek V3.1", - "display_name": "DeepSeek V3.1", + "id": "anthropic/claude-haiku-5.5", + "name": "Claude Haiku 5.5", + "display_name": "Claude Haiku 5.5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 131072 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": false, - "open_weights": true, - "release_date": "2025-08-21", - "last_updated": "2025-08-21", + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2026-06", + "release_date": "2026-10-07", + "last_updated": "2026-10-07", "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-V4-Flash-0731", - "name": "DeepSeek V4 Flash 0731", - "display_name": "DeepSeek V4 Flash 0731", + "id": "anthropic/claude-opus-4.7", + "name": "Claude Opus 4.7", + "display_name": "Claude Opus 4.7", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 384000 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], "interleaved": true, "summaries": true, - "visibility": "summary", + "visibility": "omitted", "continuation": [ "thinking_blocks" ], - "effort_options": [ - "high", - "max" + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-07-31", - "last_updated": "2026-07-31", + "attachment": true, + "open_weights": false, + "knowledge": "2026-01-31", + "release_date": "2026-04-16", + "last_updated": "2026-04-16", "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-R1", - "name": "DeepSeek-R1", - "display_name": "DeepSeek-R1", + "id": "anthropic/claude-opus-4.1", + "name": "Claude Opus 4.1 (latest)", + "display_name": "Claude Opus 4.1 (latest)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 163839, - "output": 163839 + "context": 200000, + "output": 32000 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-07", - "release_date": "2025-01-20", - "last_updated": "2025-05-29", + "attachment": true, + "open_weights": false, + "knowledge": "2025-03-31", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-V4.1-Flash", - "name": "DeepSeek V4.1 Flash", - "display_name": "DeepSeek V4.1 Flash", + "id": "anthropic/claude-sonnet-4.6", + "name": "Claude Sonnet 4.6", + "display_name": "Claude Sonnet 4.6", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 384000 + "context": 1000000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "max" + ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" ], - "effort_options": [ - "none", - "low", - "high", - "max" + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-09-10", - "last_updated": "2026-09-10", + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-02-17", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-V3", - "name": "DeepSeek-V3", - "display_name": "DeepSeek-V3", + "id": "anthropic/claude-opus-5", + "name": "Claude Opus 5", + "display_name": "Claude Opus 5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 131072 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "release_date": "2024-12-26", - "last_updated": "2024-12-26", + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2026-05", + "release_date": "2026-07-24", + "last_updated": "2026-07-24", "type": "chat" }, { - "id": "meta-llama/Llama-3.3-70B-Instruct-Turbo", - "name": "Llama 3.3 70B", - "display_name": "Llama 3.3 70B", + "id": "anthropic/claude-sonnet-5", + "name": "Claude Sonnet 5", + "display_name": "Claude Sonnet 5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 131072 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2023-12", - "release_date": "2024-12-06", - "last_updated": "2024-12-06", + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2026-01-31", + "release_date": "2026-06-30", + "last_updated": "2026-06-30", "type": "chat" }, { - "id": "thinkingmachines/Inkling", - "name": "Inkling", - "display_name": "Inkling", + "id": "anthropic/claude-sonnet-5.5", + "name": "Claude Sonnet 5.5", + "display_name": "Claude Sonnet 5.5", "modalities": { "input": [ "text", "image", - "audio" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 524288, - "output": 131072 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -188216,8 +180922,6 @@ "extra_capabilities": { "reasoning": { "effort_options": [ - "none", - "minimal", "low", "medium", "high", @@ -188227,51 +180931,73 @@ } }, "attachment": true, - "open_weights": true, - "release_date": "2026-07-15", - "last_updated": "2026-07-15", + "open_weights": false, + "knowledge": "2026-06", + "release_date": "2026-09-28", + "last_updated": "2026-09-28", "type": "chat" }, { - "id": "LiquidAI/LFM2-24B-A2B", - "name": "LFM2-24B-A2B", - "display_name": "LFM2-24B-A2B", + "id": "anthropic/claude-fable-5.1", + "name": "Claude Fable 5.1", + "display_name": "Claude Fable 5.1", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 32768, - "output": 32768 + "context": 1000000, + "output": 128000 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "release_date": "2026-02-24", - "last_updated": "2026-02-24", - "type": "chat" - } - ] - }, - "pioneer": { - "id": "pioneer", - "name": "Pioneer", - "display_name": "Pioneer", - "api": "https://api.fastino.ai/v1", - "doc": "https://agent.pioneer.ai/llms.txt", - "models": [ + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", + "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", + "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2026-06", + "release_date": "2026-09-01", + "last_updated": "2026-09-01", + "type": "chat" + }, { - "id": "gpt-5.6-sol", - "name": "GPT-5.6 Sol", - "display_name": "GPT-5.6 Sol", + "id": "anthropic/claude-opus-4.5", + "name": "Claude Opus 4.5 (latest)", + "display_name": "Claude Opus 4.5 (latest)", "modalities": { "input": [ "text", @@ -188283,31 +181009,26 @@ ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 200000, + "output": 64000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ], - "verbosity": "medium", - "verbosity_options": [ "low", "medium", "high" @@ -188317,20 +181038,24 @@ "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "knowledge": "2025-05", + "release_date": "2025-11-24", + "last_updated": "2025-11-24", "type": "chat" }, { - "id": "claude-haiku-4-5", - "name": "Claude Haiku 4.5 (latest)", - "display_name": "Claude Haiku 4.5 (latest)", + "id": "anthropic/claude-sonnet-4.5", + "name": "Claude Sonnet 4.5 (latest)", + "display_name": "Claude Sonnet 4.5 (latest)", "modalities": { "input": [ "text", @@ -188342,7 +181067,7 @@ ] }, "limit": { - "context": 200000, + "context": 1000000, "output": 64000 }, "temperature": true, @@ -188374,89 +181099,56 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2025-02-28", - "release_date": "2025-10-15", - "last_updated": "2025-10-15", + "knowledge": "2025-07-31", + "release_date": "2025-09-29", + "last_updated": "2025-09-29", "type": "chat" }, { - "id": "gpt-5.6-luna", - "name": "GPT-5.6 Luna", - "display_name": "GPT-5.6 Luna", + "id": "undi95/remm-slerp-l2-13b", + "name": "ReMM SLERP 13B", + "display_name": "ReMM SLERP 13B", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 6144, + "output": 5529 }, - "temperature": false, - "tool_call": true, + "temperature": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "attachment": false, + "open_weights": true, + "knowledge": "2023-06-30", + "release_date": "2023-07-22", + "last_updated": "2023-07-22", "type": "chat" }, { - "id": "claude-sonnet-5", - "name": "Claude Sonnet 5", - "display_name": "Claude Sonnet 5", + "id": "minimax/minimax-m2.7", + "name": "MiniMax-M2.7", + "display_name": "MiniMax-M2.7", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 204800, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -188472,40 +181164,90 @@ "thinking_blocks" ], "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" + "high" ] } }, + "attachment": false, + "open_weights": true, + "release_date": "2026-03-18", + "last_updated": "2026-03-18", + "type": "chat" + }, + { + "id": "minimax/minimax-m2-her", + "name": "MiniMax-M2 Her", + "display_name": "MiniMax-M2 Her", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 65536, + "output": 2048 + }, + "temperature": true, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": false, + "release_date": "2026-01-23", + "last_updated": "2026-01-23", + "type": "chat" + }, + { + "id": "minimax/minimax-01", + "name": "MiniMax: MiniMax-01", + "display_name": "MiniMax: MiniMax-01", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1000192, + "output": 900172 + }, + "temperature": true, + "tool_call": false, + "reasoning": { + "supported": false + }, "attachment": true, "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-30", - "last_updated": "2026-06-30", + "release_date": "2025-01-15", + "last_updated": "2025-01-15", "type": "chat" }, { - "id": "gpt-5.6-terra", - "name": "GPT-5.6 Terra", - "display_name": "GPT-5.6 Terra", + "id": "minimax/minimax-m3", + "name": "MiniMax-M3", + "display_name": "MiniMax-M3", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 524288, + "output": 512000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -188514,57 +181256,37 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", "effort_options": [ "none", - "low", - "medium", - "high", - "xhigh", - "max" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", "high" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "open_weights": true, + "release_date": "2026-06-01", + "last_updated": "2026-06-01", "type": "chat" }, { - "id": "claude-opus-5-fast", - "name": "Claude Opus 5", - "display_name": "Claude Opus 5", + "id": "minimax/minimax-m3.1-flash", + "name": "MiniMax: MiniMax M3.1 Flash", + "display_name": "MiniMax: MiniMax M3.1 Flash", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 1048576, + "output": 524288 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -188572,13 +181294,6 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ "low", "medium", @@ -188590,30 +181305,27 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2026-05", - "release_date": "2026-07-24", - "last_updated": "2026-07-24", + "release_date": "2026-10-19", + "last_updated": "2026-10-19", "type": "chat" }, { - "id": "claude-opus-5", - "name": "Claude Opus 5", - "display_name": "Claude Opus 5", + "id": "minimax/minimax-m2.5", + "name": "MiniMax-M2.5", + "display_name": "MiniMax-M2.5", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 204800, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -188622,47 +181334,34 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" + "high" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-05", - "release_date": "2026-07-24", - "last_updated": "2026-07-24", + "attachment": false, + "open_weights": true, + "release_date": "2026-02-12", + "last_updated": "2026-02-12", "type": "chat" }, { - "id": "gpt-5.5", - "name": "GPT-5.5", - "display_name": "GPT-5.5", + "id": "minimax/minimax-m2.1", + "name": "MiniMax-M2.1", + "display_name": "MiniMax-M2.1", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 204800, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -188671,45 +181370,24 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", "high" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-12-01", - "release_date": "2026-04-23", - "last_updated": "2026-04-23", + "attachment": false, + "open_weights": true, + "release_date": "2025-12-23", + "last_updated": "2025-12-23", "type": "chat" }, { - "id": "claude-fable-5", - "name": "Claude Fable 5", - "display_name": "Claude Fable 5", + "id": "minimax/minimax-m1", + "name": "MiniMax: MiniMax M1", + "display_name": "MiniMax: MiniMax M1", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" @@ -188717,9 +181395,9 @@ }, "limit": { "context": 1000000, - "output": 128000 + "output": 40000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -188727,41 +181405,22 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", - "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", - "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." + "none", + "high" ] } }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-09", - "last_updated": "2026-06-09", + "release_date": "2025-06-17", + "last_updated": "2025-06-17", "type": "chat" }, { - "id": "fastino/gliner2-multi-v1", - "name": "GLiNER2 Multi", - "display_name": "GLiNER2 Multi", + "id": "minimax/minimax-m2", + "name": "MiniMax-M2", + "display_name": "MiniMax-M2", "modalities": { "input": [ "text" @@ -188771,24 +181430,32 @@ ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 204800, + "output": 131072 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "high" + ] + } }, "attachment": false, "open_weights": true, - "release_date": "2025-11-30", - "last_updated": "2025-11-30", + "release_date": "2025-10-27", + "last_updated": "2025-10-27", "type": "chat" }, { - "id": "fastino/gliner2-privacy-filter-PII-multi", - "name": "GLiNER2 Privacy Filter PII (Multi)", - "display_name": "GLiNER2 Privacy Filter PII (Multi)", + "id": "upstage/solar-pro4", + "name": "Upstage: Solar Pro 4", + "display_name": "Upstage: Solar Pro 4", "modalities": { "input": [ "text" @@ -188798,24 +181465,39 @@ ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 524288, + "output": 131072 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "minimal", + "low", + "medium", + "high", + "xhigh", + "max" + ] + } }, "attachment": false, - "open_weights": true, - "release_date": "2026-04-30", - "last_updated": "2026-04-30", + "open_weights": false, + "knowledge": "2026-02", + "release_date": "2026-08-06", + "last_updated": "2026-08-06", "type": "chat" }, { - "id": "fastino/GLiNER-2.5-Decide", - "name": "GLiNER-2.5-Decide", - "display_name": "GLiNER-2.5-Decide", + "id": "upstage/solar-mini4", + "name": "Upstage: Solar Mini 4", + "display_name": "Upstage: Solar Mini 4", "modalities": { "input": [ "text" @@ -188825,24 +181507,39 @@ ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 524288, + "output": 131072 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "minimal", + "low", + "medium", + "high", + "xhigh", + "max" + ] + } }, "attachment": false, - "open_weights": true, - "release_date": "2026-09-24", - "last_updated": "2026-09-24", + "open_weights": false, + "knowledge": "2026-02", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "fastino/gliner2-multi-large-v1", - "name": "GLiNER2 Multi Large", - "display_name": "GLiNER2 Multi Large", + "id": "upstage/solar-pro-3", + "name": "Upstage: Solar Pro 3 (retires Oct 30)", + "display_name": "Upstage: Solar Pro 3 (retires Oct 30)", "modalities": { "input": [ "text" @@ -188852,24 +181549,37 @@ ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 131072, + "output": 117964 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "minimal", + "low", + "medium", + "high" + ] + } }, "attachment": false, - "open_weights": true, - "release_date": "2025-11-30", - "last_updated": "2025-11-30", + "open_weights": false, + "knowledge": "2025-07", + "release_date": "2026-01-26", + "last_updated": "2026-03-23", "type": "chat" }, { - "id": "fastino/gliguard-LLMGuardrails-300M", - "name": "GLiGuard LLM Guardrails 300M", - "display_name": "GLiGuard LLM Guardrails 300M", + "id": "cohere/north-mini-code:free", + "name": "Cohere: North Mini Code (free)", + "display_name": "Cohere: North Mini Code (free)", "modalities": { "input": [ "text" @@ -188879,51 +181589,72 @@ ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 256000, + "output": 64000 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "high" + ] + } }, "attachment": false, "open_weights": true, - "release_date": "2026-04-30", - "last_updated": "2026-04-30", + "knowledge": "2025-09-23", + "release_date": "2026-06-09", + "last_updated": "2026-06-09", "type": "chat" }, { - "id": "fastino/gliner2.5-base-v1", - "name": "GLiNER 2.5 Base", - "display_name": "GLiNER 2.5 Base", + "id": "cohere/command-a-plus", + "name": "Cohere: Command A+", + "display_name": "Cohere: Command A+", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 4096, - "output": 4096 + "context": 192000, + "output": 64000 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "high" + ] + } + }, + "attachment": true, "open_weights": true, - "release_date": "2026-08-24", - "last_updated": "2026-08-24", + "knowledge": "2025-04-01", + "release_date": "2026-05-20", + "last_updated": "2026-06-09", "type": "chat" }, { - "id": "fastino/gliner2.5-multi-v1", - "name": "GLiNER 2.5 Multi", - "display_name": "GLiNER 2.5 Multi", + "id": "cohere/command-r-08-2024", + "name": "Command R", + "display_name": "Command R", "modalities": { "input": [ "text" @@ -188933,24 +181664,25 @@ ] }, "limit": { - "context": 4096, - "output": 4096 + "context": 128000, + "output": 4000 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, "attachment": false, "open_weights": true, - "release_date": "2026-08-24", - "last_updated": "2026-08-24", + "knowledge": "2024-06-01", + "release_date": "2024-08-30", + "last_updated": "2024-08-30", "type": "chat" }, { - "id": "fastino/gliner2-large-v1", - "name": "GLiNER2 Large", - "display_name": "GLiNER2 Large", + "id": "cohere/command-r7b-12-2024", + "name": "Command R7B", + "display_name": "Command R7B", "modalities": { "input": [ "text" @@ -188960,8 +181692,8 @@ ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 128000, + "output": 4000 }, "temperature": true, "tool_call": false, @@ -188970,14 +181702,15 @@ }, "attachment": false, "open_weights": true, - "release_date": "2025-06-30", - "last_updated": "2025-06-30", + "knowledge": "2024-06-01", + "release_date": "2024-12-13", + "last_updated": "2024-12-13", "type": "chat" }, { - "id": "fastino/gliner2-base-v1", - "name": "GLiNER2 Base", - "display_name": "GLiNER2 Base", + "id": "cohere/command-r-plus-08-2024", + "name": "Command R+", + "display_name": "Command R+", "modalities": { "input": [ "text" @@ -188987,24 +181720,25 @@ ] }, "limit": { - "context": 2048, - "output": 2048 + "context": 128000, + "output": 4000 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, "attachment": false, "open_weights": true, - "release_date": "2025-06-30", - "last_updated": "2025-06-30", + "knowledge": "2024-06-01", + "release_date": "2024-08-30", + "last_updated": "2024-08-30", "type": "chat" }, { - "id": "fastino/gliguard-PII-multi", - "name": "GLiNER2-Guardrails-PII-Multi", - "display_name": "GLiNER2-Guardrails-PII-Multi", + "id": "cohere/command-a", + "name": "Command A", + "display_name": "Command A", "modalities": { "input": [ "text" @@ -189014,7 +181748,7 @@ ] }, "limit": { - "context": 8192, + "context": 256000, "output": 8192 }, "temperature": true, @@ -189024,19 +181758,19 @@ }, "attachment": false, "open_weights": true, - "release_date": "2026-07-08", - "last_updated": "2026-07-08", + "knowledge": "2024-08-31", + "release_date": "2025-03-13", + "last_updated": "2025-03-13", "type": "chat" }, { - "id": "nvidia/NVIDIA-Nemotron-3.5-Super-VL-120B-A12B-NVFP4", - "name": "Nemotron 3.5 Super VL 120B A12B", - "display_name": "Nemotron 3.5 Super VL 120B A12B", + "id": "prism-ml/ternary-bonsai-2-9b", + "name": "PrismML: Ternary Bonsai 2 9B", + "display_name": "PrismML: Ternary Bonsai 2 9B", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" @@ -189044,7 +181778,7 @@ }, "limit": { "context": 262144, - "output": 4096 + "output": 65536 }, "temperature": true, "tool_call": true, @@ -189054,42 +181788,34 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ - "low", - "medium", - "high", - "xhigh" + "none", + "high" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-10-15", - "last_updated": "2026-10-15", + "open_weights": false, + "release_date": "2026-10-16", + "last_updated": "2026-10-16", "type": "chat" }, { - "id": "nvidia/NVIDIA-Nemotron-3.5-Lightning-30B-A3B-BF16", - "name": "Nemotron 3.5 Lightning 30B A3B", - "display_name": "Nemotron 3.5 Lightning 30B A3B", + "id": "prism-ml/ternary-bonsai-2-27b", + "name": "PrismML: Ternary Bonsai 2 27B", + "display_name": "PrismML: Ternary Bonsai 2 27B", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 65536, - "output": 4096 + "context": 262144, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -189099,178 +181825,167 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ - "low", + "none", "medium", - "high", "xhigh" ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-09", - "release_date": "2026-08-11", - "last_updated": "2026-08-11", + "attachment": true, + "open_weights": false, + "release_date": "2026-09-18", + "last_updated": "2026-09-18", "type": "chat" }, { - "id": "moonshotai/Kimi-K3", - "name": "Kimi K3", - "display_name": "Kimi K3", + "id": "moondream/moondream3-preview", + "name": "Moondream: Moondream 3 Preview", + "display_name": "Moondream: Moondream 3 Preview", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 32000, + "output": 4096 }, - "temperature": false, - "tool_call": true, + "temperature": true, + "tool_call": false, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ - "low", - "high", - "max" + "none", + "high" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-16", + "open_weights": false, + "release_date": "2026-10-15", + "last_updated": "2026-10-15", "type": "chat" }, { - "id": "moonshotai/Kimi-K3-Fast", - "name": "Kimi K3", - "display_name": "Kimi K3", + "id": "moondream/moondream3.1-9b-a2b", + "name": "Moondream: Moondream 3.1", + "display_name": "Moondream: Moondream 3.1", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 32000, + "output": 4096 }, - "temperature": false, - "tool_call": true, + "temperature": true, + "tool_call": false, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ - "low", - "high", - "max" + "none", + "high" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-16", + "open_weights": false, + "release_date": "2026-10-15", + "last_updated": "2026-10-15", "type": "chat" }, { - "id": "zai-org/GLM-5.2", - "name": "GLM-5.2", - "display_name": "GLM-5.2", + "id": "mistralai/voxtral-small-24b-2507", + "name": "Voxtral Small 24B 2507", + "display_name": "Voxtral Small 24B 2507", "modalities": { "input": [ - "text" + "text", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1040000, - "output": 128000 + "context": 32768, + "output": 26214 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "high", - "max" - ] - } + "supported": false }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "release_date": "2025-07-15", + "last_updated": "2025-07-15", "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-V4-Flash", - "name": "DeepSeek V4 Flash", - "display_name": "DeepSeek V4 Flash", + "id": "mistralai/mixtral-8x22b-instruct", + "name": "Mixtral 8x22B Instruct", + "display_name": "Mixtral 8x22B Instruct", "modalities": { "input": [ + "text", + "pdf" + ], + "output": [ "text" + ] + }, + "limit": { + "context": 65536, + "output": 52428 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": true, + "knowledge": "2024-01-31", + "release_date": "2024-04-17", + "last_updated": "2024-04-17", + "type": "chat" + }, + { + "id": "mistralai/mistral-small-2603", + "name": "Mistral Small 4", + "display_name": "Mistral Small 4", + "modalities": { + "input": [ + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 262144, + "output": 209715 }, "temperature": true, "tool_call": true, @@ -189280,45 +181995,23 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", "effort_options": [ - "low", - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." + "none", + "high" ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "knowledge": "2025-06", + "release_date": "2026-03-16", + "last_updated": "2026-03-16", "type": "chat" - } - ] - }, - "sap-ai-core": { - "id": "sap-ai-core", - "name": "SAP AI Core", - "display_name": "SAP AI Core", - "doc": "https://help.sap.com/docs/sap-ai-core", - "models": [ + }, { - "id": "sap-abap-1", - "name": "sap-abap-1", - "display_name": "sap-abap-1", + "id": "mistralai/mistral-small-24b-instruct-2501", + "name": "Mistral Small 3", + "display_name": "Mistral Small 3", "modalities": { "input": [ "text" @@ -189329,23 +182022,24 @@ }, "limit": { "context": 32768, - "output": 4096 + "output": 16384 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2025-11-26", - "last_updated": "2025-11-26", + "open_weights": true, + "knowledge": "2023-10-31", + "release_date": "2025-01-30", + "last_updated": "2025-01-30", "type": "chat" }, { - "id": "gpt-5.2", - "name": "gpt-5.2", - "display_name": "gpt-5.2", + "id": "mistralai/mistral-large-4-0", + "name": "Mistral: Mistral Large 4", + "display_name": "Mistral: Mistral Large 4", "modalities": { "input": [ "text", @@ -189356,48 +182050,92 @@ ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 1048576, + "output": 262144 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", "effort_options": [ "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", "high" - ], - "visibility": "hidden" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2025-12-11", - "last_updated": "2025-12-11", + "release_date": "2026-10-06", + "last_updated": "2026-10-06", "type": "chat" }, { - "id": "mistralai--mistral-medium", - "name": "Mistral Medium 3.5", - "display_name": "Mistral Medium 3.5", + "id": "mistralai/mistral-large-2407", + "name": "Mistral Large 2407", + "display_name": "Mistral Large 2407", + "modalities": { + "input": [ + "text", + "pdf" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 131072, + "output": 104857 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": true, + "knowledge": "2024-03-31", + "release_date": "2024-07-24", + "last_updated": "2024-07-24", + "type": "chat" + }, + { + "id": "mistralai/mistral-large-2512", + "name": "Mistral Large 3", + "display_name": "Mistral Large 3", + "modalities": { + "input": [ + "text", + "image", + "pdf" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 262144, + "output": 209715 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": true, + "knowledge": "2024-11", + "release_date": "2025-12-02", + "last_updated": "2025-12-02", + "type": "chat" + }, + { + "id": "mistralai/ministral-3b-2512", + "name": "Ministral 3 3B 2512", + "display_name": "Ministral 3 3B 2512", "modalities": { "input": [ "text", @@ -189408,33 +182146,52 @@ ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 131072, + "output": 104857 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": true, + "release_date": "2025-12-02", + "last_updated": "2025-12-02", + "type": "chat" + }, + { + "id": "mistralai/mistral-nemo", + "name": "Mistral Nemo", + "display_name": "Mistral Nemo", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 131072, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "high" - ] - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-04-29", - "last_updated": "2026-04-29", + "knowledge": "2024-07", + "release_date": "2024-07-18", + "last_updated": "2024-07-18", "type": "chat" }, { - "id": "gpt-5.6-sol", - "name": "gpt-5.6-sol", - "display_name": "gpt-5.6-sol", + "id": "mistralai/mistral-medium-3", + "name": "Mistral Medium 3", + "display_name": "Mistral Medium 3", "modalities": { "input": [ "text", @@ -189446,106 +182203,86 @@ ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 131072, + "output": 104857 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "knowledge": "2025-03-31", + "release_date": "2025-05-07", + "last_updated": "2025-05-07", "type": "chat" }, { - "id": "text-embedding-3-large", - "name": "text-embedding-3-large", - "display_name": "text-embedding-3-large", + "id": "mistralai/ministral-14b-2512", + "name": "Ministral 3 14B 2512", + "display_name": "Ministral 3 14B 2512", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 8191, - "output": 3072 + "context": 262144, + "output": 209715 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, - "open_weights": false, - "release_date": "2024-01-25", - "last_updated": "2024-01-25", - "type": "embedding" + "attachment": true, + "open_weights": true, + "release_date": "2025-12-02", + "last_updated": "2025-12-02", + "type": "chat" }, { - "id": "amazon--nova-micro", - "name": "amazon--nova-micro", - "display_name": "amazon--nova-micro", + "id": "mistralai/mistral-medium-3.1", + "name": "Mistral Medium 3.1", + "display_name": "Mistral Medium 3.1", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 131072, + "output": 104857 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2024-10", - "release_date": "2024-12-03", - "last_updated": "2024-12-03", + "knowledge": "2025-06-30", + "release_date": "2025-08-12", + "last_updated": "2025-08-12", "type": "chat" }, { - "id": "cohere--command-a-reasoning", - "name": "cohere--command-a-reasoning", - "display_name": "cohere--command-a-reasoning", + "id": "mistralai/mistral-small-3.2-24b-instruct", + "name": "Mistral Small 3.2 24B", + "display_name": "Mistral Small 3.2 24B", "modalities": { "input": [ + "image", "text" ], "output": [ @@ -189553,37 +182290,25 @@ ] }, "limit": { - "context": 256000, - "output": 32000 + "context": 128000, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "minimal", - "low", - "medium", - "high" - ] - } + "supported": false }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2024-06-01", - "release_date": "2025-08-21", - "last_updated": "2025-08-21", + "knowledge": "2023-10-31", + "release_date": "2025-06-20", + "last_updated": "2025-06-20", "type": "chat" }, { - "id": "mistralai--mistral-small", - "name": "mistralai--mistral-small", - "display_name": "mistralai--mistral-small", + "id": "mistralai/mistral-small-3.1-24b-instruct", + "name": "Mistral Small 3.1 24B", + "display_name": "Mistral Small 3.1 24B", "modalities": { "input": [ "text", @@ -189595,88 +182320,56 @@ }, "limit": { "context": 128000, - "output": 128000 + "output": 102400 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "high" - ] - } + "supported": false }, "attachment": true, "open_weights": true, - "knowledge": "2025-06", - "release_date": "2026-03-16", - "last_updated": "2026-03-16", + "knowledge": "2023-10-31", + "release_date": "2025-03-17", + "last_updated": "2025-03-17", "type": "chat" }, { - "id": "gpt-5-nano", - "name": "gpt-5-nano", - "display_name": "gpt-5-nano", + "id": "mistralai/devstral-2512", + "name": "Devstral 2", + "display_name": "Devstral 2", "modalities": { "input": [ "text", - "image" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 262144, + "output": 209715 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "minimal", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2024-05-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "open_weights": true, + "knowledge": "2025-12", + "release_date": "2025-12-09", + "last_updated": "2025-12-09", "type": "chat" }, { - "id": "anthropic--claude-4-sonnet", - "name": "anthropic--claude-4-sonnet", - "display_name": "anthropic--claude-4-sonnet", + "id": "mistralai/mistral-saba", + "name": "Saba", + "display_name": "Saba", "modalities": { "input": [ "text", - "image", "pdf" ], "output": [ @@ -189684,30 +182377,28 @@ ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 32768, + "output": 26214 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2025-03-31", - "release_date": "2025-05-22", - "last_updated": "2025-05-22", + "knowledge": "2024-09-30", + "release_date": "2025-02-17", + "last_updated": "2025-02-17", "type": "chat" }, { - "id": "anthropic--claude-4.6-opus", - "name": "anthropic--claude-4.6-opus", - "display_name": "anthropic--claude-4.6-opus", + "id": "mistralai/mistral-large", + "name": "Mistral Large", + "display_name": "Mistral Large", "modalities": { "input": [ "text", - "image", "pdf" ], "output": [ @@ -189715,67 +182406,53 @@ ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 128000, + "output": 102400 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "max" - ] - } + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2025-05-31", - "release_date": "2026-02-05", - "last_updated": "2026-03-13", + "knowledge": "2024-11-30", + "release_date": "2024-02-26", + "last_updated": "2024-02-26", "type": "chat" }, { - "id": "anthropic--claude-4.5-sonnet", - "name": "anthropic--claude-4.5-sonnet", - "display_name": "anthropic--claude-4.5-sonnet", + "id": "mistralai/ministral-8b-2512", + "name": "Ministral 3 8B 2512", + "display_name": "Ministral 3 8B 2512", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 262144, + "output": 209715 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2025-07-31", - "release_date": "2025-09-29", - "last_updated": "2025-09-29", + "open_weights": true, + "release_date": "2025-12-02", + "last_updated": "2025-12-02", "type": "chat" }, { - "id": "anthropic--claude-4.5-opus", - "name": "anthropic--claude-4.5-opus", - "display_name": "anthropic--claude-4.5-opus", + "id": "mistralai/mistral-medium-3-5", + "name": "Mistral Medium 3.5", + "display_name": "Mistral Medium 3.5", "modalities": { "input": [ "text", @@ -189787,8 +182464,8 @@ ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 262144, + "output": 209715 }, "temperature": true, "tool_call": true, @@ -189799,36 +182476,33 @@ "extra_capabilities": { "reasoning": { "effort_options": [ - "low", - "medium", + "none", "high" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-05", - "release_date": "2025-11-24", - "last_updated": "2025-11-24", + "release_date": "2026-04-30", + "last_updated": "2026-04-30", "type": "chat" }, { - "id": "amazon--nova-pro", - "name": "amazon--nova-pro", - "display_name": "amazon--nova-pro", + "id": "mistralai/codestral-2508", + "name": "Codestral 25.08", + "display_name": "Codestral 25.08", "modalities": { "input": [ "text", - "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 300000, - "output": 8192 + "context": 256000, + "output": 204800 }, "temperature": true, "tool_call": true, @@ -189837,28 +182511,29 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2024-10", - "release_date": "2024-12-03", - "last_updated": "2024-12-03", + "release_date": "2025-07-30", + "last_updated": "2025-07-30", "type": "chat" }, { - "id": "amazon--nova-lite", - "name": "amazon--nova-lite", - "display_name": "amazon--nova-lite", + "id": "google/gemini-3.1-pro-preview", + "name": "Gemini 3.1 Pro Preview", + "display_name": "Gemini 3.1 Pro Preview", "modalities": { "input": [ "text", "image", - "video" + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 64000 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -189868,28 +182543,38 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ "low", - "medium", "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-10", - "release_date": "2025-12-02", - "last_updated": "2025-12-01", + "knowledge": "2025-01", + "release_date": "2026-02-19", + "last_updated": "2026-02-19", "type": "chat" }, { - "id": "anthropic--claude-4.7-opus", - "name": "anthropic--claude-4.7-opus", - "display_name": "anthropic--claude-4.7-opus", + "id": "google/gemini-3-flash-preview", + "name": "Gemini 3 Flash Preview", + "display_name": "Gemini 3 Flash Preview", "modalities": { "input": [ "text", "image", + "video", + "audio", "pdf" ], "output": [ @@ -189897,10 +182582,10 @@ ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 1048576, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -189908,30 +182593,40 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", "low", "medium", - "high", - "xhigh", - "max" + "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-04-16", - "last_updated": "2026-04-16", + "knowledge": "2025-01", + "release_date": "2025-12-17", + "last_updated": "2025-12-17", "type": "chat" }, { - "id": "gpt-5.6-luna", - "name": "gpt-5.6-luna", - "display_name": "gpt-5.6-luna", + "id": "google/gemini-3.1-pro-preview-customtools", + "name": "Gemini 3.1 Pro Preview Custom Tools", + "display_name": "Gemini 3.1 Pro Preview Custom Tools", "modalities": { "input": [ "text", "image", + "video", + "audio", "pdf" ], "output": [ @@ -189939,10 +182634,10 @@ ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1048576, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -189952,36 +182647,58 @@ "reasoning": { "supported": true, "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ], - "verbosity": "medium", - "verbosity_options": [ + "mode": "level", + "level": "high", + "level_options": [ "low", - "medium", "high" ], - "visibility": "hidden" + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "knowledge": "2025-01", + "release_date": "2026-02-19", + "last_updated": "2026-02-19", "type": "chat" }, { - "id": "gemini-2.5-pro", - "name": "gemini-2.5-pro", - "display_name": "gemini-2.5-pro", + "id": "google/gemma-2-27b-it", + "name": "Gemma 2 27B", + "display_name": "Gemma 2 27B", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 8192, + "output": 2048 + }, + "temperature": true, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "knowledge": "2024-06-30", + "release_date": "2024-07-13", + "last_updated": "2024-07-13", + "type": "chat" + }, + { + "id": "google/gemini-2.5-pro", + "name": "Gemini 2.5 Pro", + "display_name": "Gemini 2.5 Pro", "modalities": { "input": [ "text", @@ -190031,9 +182748,9 @@ "type": "chat" }, { - "id": "gemini-3.5-flash", - "name": "gemini-3.5-flash", - "display_name": "gemini-3.5-flash", + "id": "google/gemini-3.5-flash-lite", + "name": "Gemini 3.5 Flash Lite", + "display_name": "Gemini 3.5 Flash Lite", "modalities": { "input": [ "text", @@ -190059,117 +182776,112 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ + "effort_options": [ "minimal", "low", "medium", "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-05-19", - "last_updated": "2026-05-19", + "knowledge": "2026-03", + "release_date": "2026-07-21", + "last_updated": "2026-07-21", "type": "chat" }, { - "id": "gpt-5.6-terra", - "name": "gpt-5.6-terra", - "display_name": "gpt-5.6-terra", + "id": "google/gemma-3-12b-it", + "name": "Gemma 3 12B IT", + "display_name": "Gemma 3 12B IT", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 131072, + "output": 16384 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "attachment": true, + "open_weights": true, + "knowledge": "2024-08", + "release_date": "2025-03-12", + "last_updated": "2025-03-12", + "type": "chat" + }, + { + "id": "google/lyria-3-pro-preview", + "name": "Lyria 3 Pro Preview", + "display_name": "Lyria 3 Pro Preview", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text", + "audio" + ] + }, + "limit": { + "context": 1048576, + "output": 65536 + }, + "temperature": true, + "tool_call": false, + "reasoning": { + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "release_date": "2026-03-25", + "last_updated": "2026-03-25", "type": "chat" }, { - "id": "anthropic--claude-3-haiku", - "name": "anthropic--claude-3-haiku", - "display_name": "anthropic--claude-3-haiku", + "id": "google/gemma-3-4b-it", + "name": "Gemma 3 4B IT", + "display_name": "Gemma 3 4B IT", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 4096 + "context": 131072, + "output": 16384 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2023-08-31", - "release_date": "2024-03-13", - "last_updated": "2024-03-13", + "open_weights": true, + "knowledge": "2024-08", + "release_date": "2025-03-12", + "last_updated": "2025-03-12", "type": "chat" }, { - "id": "gemini-3.5-flash-lite", - "name": "Gemini 3.5 Flash Lite", - "display_name": "Gemini 3.5 Flash Lite", + "id": "google/gemini-3.1-flash-lite-preview", + "name": "Gemini 3.1 Flash Lite Preview", + "display_name": "Gemini 3.1 Flash Lite Preview", "modalities": { "input": [ "text", @@ -190194,8 +182906,8 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ + "none", "minimal", "low", "medium", @@ -190205,19 +182917,21 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-07-21", - "last_updated": "2026-07-21", + "knowledge": "2025-01", + "release_date": "2026-03-03", + "last_updated": "2026-03-03", "type": "chat" }, { - "id": "gpt-6.1-sol", - "name": "GPT-6.1 Sol", - "display_name": "GPT-6.1 Sol", + "id": "google/gemini-3.1-flash-lite", + "name": "Gemini 3.1 Flash Lite", + "display_name": "Gemini 3.1 Flash Lite", "modalities": { "input": [ "text", "image", + "video", + "audio", "pdf" ], "output": [ @@ -190225,10 +182939,10 @@ ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1048576, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -190236,26 +182950,68 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ + "none", + "minimal", "low", "medium", - "high", - "xhigh", - "max" + "high" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-04-30", - "release_date": "2026-09-29", - "last_updated": "2026-09-29", + "knowledge": "2025-01", + "release_date": "2026-05-07", + "last_updated": "2026-05-07", "type": "chat" }, { - "id": "gemini-2.5-flash", - "name": "gemini-2.5-flash", - "display_name": "gemini-2.5-flash", + "id": "google/gemini-3.1-flash-image", + "name": "Nano Banana 2", + "display_name": "Nano Banana 2", + "modalities": { + "input": [ + "image", + "text", + "pdf" + ], + "output": [ + "text", + "image" + ] + }, + "limit": { + "context": 131072, + "output": 32768 + }, + "temperature": true, + "tool_call": false, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "none", + "minimal", + "high" + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2026-05-28", + "last_updated": "2026-05-28" + }, + { + "id": "google/gemini-2.5-flash", + "name": "Gemini 2.5 Flash", + "display_name": "Gemini 2.5 Flash", "modalities": { "input": [ "text", @@ -190270,7 +183026,7 @@ }, "limit": { "context": 1048576, - "output": 65536 + "output": 65535 }, "temperature": true, "tool_call": true, @@ -190306,9 +183062,9 @@ "type": "chat" }, { - "id": "gpt-5.4", - "name": "gpt-5.4", - "display_name": "gpt-5.4", + "id": "google/gemini-3.1-flash-image-preview", + "name": "Nano Banana 2 Preview", + "display_name": "Nano Banana 2 Preview", "modalities": { "input": [ "text", @@ -190316,67 +183072,54 @@ "pdf" ], "output": [ - "text" + "text", + "image" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 65536, + "output": 58982 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", "effort_options": [ "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", + "minimal", "high" - ], - "visibility": "hidden" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-05", - "last_updated": "2026-03-05", - "type": "chat" + "knowledge": "2025-01", + "release_date": "2026-02-26", + "last_updated": "2026-02-26" }, { - "id": "gemini-3.8-flash", - "name": "Gemini 3.8 Flash", - "display_name": "Gemini 3.8 Flash", + "id": "google/gemini-3-pro-image", + "name": "Nano Banana Pro", + "display_name": "Nano Banana Pro", "modalities": { "input": [ - "text", "image", - "video", - "audio", + "text", "pdf" ], "output": [ - "text" + "text", + "image" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 65536, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -190391,9 +183134,7 @@ "mode": "level", "level": "high", "level_options": [ - "minimal", "low", - "medium", "high" ], "summaries": true, @@ -190405,123 +183146,109 @@ }, "attachment": true, "open_weights": false, - "release_date": "2026-09-02", - "last_updated": "2026-09-02", - "type": "chat" - }, - { - "id": "gemini-embedding", - "name": "Gemini Embedding 001", - "display_name": "Gemini Embedding 001", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 2048, - "output": 1 - }, - "temperature": false, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": false, - "knowledge": "2025-05", - "release_date": "2025-05-20", - "last_updated": "2025-05-20", - "type": "embedding" + "knowledge": "2025-01", + "release_date": "2026-05-28", + "last_updated": "2026-05-28" }, { - "id": "sonar-deep-research", - "name": "sonar-deep-research", - "display_name": "sonar-deep-research", + "id": "google/gemma-4-26b-a4b-it", + "name": "Gemma 4 26B A4B IT", + "display_name": "Gemma 4 26B A4B IT", "modalities": { "input": [ - "text" + "image", + "text", + "video" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 32768 + "context": 262144, + "output": 235929 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ - "minimal", - "low", - "medium", + "none", "high" ] } }, - "attachment": false, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-02-01", - "last_updated": "2025-09-01", + "attachment": true, + "open_weights": true, + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "nvidia--llama-3.2-nv-embedqa-1b", - "name": "nvidia--llama-3.2-nv-embedqa-1b", - "display_name": "nvidia--llama-3.2-nv-embedqa-1b", + "id": "google/gemma-4-31b-it", + "name": "Gemma 4 31B IT", + "display_name": "Gemma 4 31B IT", "modalities": { "input": [ - "text" + "image", + "text", + "video" ], "output": [ "text" ] }, "limit": { - "context": 8192, - "output": 4096 + "context": 262144, + "output": 16384 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": false, - "release_date": "2024-09-25", - "last_updated": "2024-09-25", + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "none", + "high" + ] + } + }, + "attachment": true, + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "anthropic--claude-4.8-opus", - "name": "anthropic--claude-4.8-opus", - "display_name": "anthropic--claude-4.8-opus", + "id": "google/gemini-nano-banana-2.1", + "name": "Nano Banana 2.1", + "display_name": "Nano Banana 2.1", "modalities": { "input": [ - "text", "image", + "text", "pdf" ], "output": [ - "text" + "text", + "image" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 65536, + "output": 58982 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -190530,215 +183257,239 @@ "extra_capabilities": { "reasoning": { "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" + "none", + "minimal", + "high" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-01", - "release_date": "2026-05-28", - "last_updated": "2026-05-28", - "type": "chat" + "release_date": "2026-10-06", + "last_updated": "2026-10-06" }, { - "id": "amazon--titan-embed-text", - "name": "amazon--titan-embed-text", - "display_name": "amazon--titan-embed-text", + "id": "google/gemini-3.1-flash-lite-image", + "name": "Nano Banana 2 Lite", + "display_name": "Nano Banana 2 Lite", "modalities": { "input": [ - "text" + "image", + "text", + "pdf" ], "output": [ - "text" - ] - }, - "limit": { - "context": 8192, - "output": 1536 - }, - "temperature": false, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": false, - "release_date": "2024-04-30", - "last_updated": "2024-04-30", - "type": "chat" - }, - { - "id": "mistralai--mistral-medium-instruct", - "name": "mistralai--mistral-medium-instruct", - "display_name": "mistralai--mistral-medium-instruct", - "modalities": { - "input": [ "text", "image" - ], - "output": [ - "text" ] }, "limit": { - "context": 128000, - "output": 128000 + "context": 65536, + "output": 58982 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "none", + "minimal", + "high" + ] + } }, "attachment": true, "open_weights": false, - "knowledge": "2025-05", - "release_date": "2025-05-07", - "last_updated": "2025-05-07", - "type": "chat" + "knowledge": "2025-01", + "release_date": "2026-06-30", + "last_updated": "2026-06-30" }, { - "id": "gpt-4.1-mini", - "name": "gpt-4.1-mini", - "display_name": "gpt-4.1-mini", + "id": "google/gemini-2.5-pro-preview", + "name": "Gemini 2.5 Pro Preview 06-05", + "display_name": "Gemini 2.5 Pro Preview 06-05", "modalities": { "input": [ - "text", + "pdf", "image", - "pdf" + "text", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 1047576, - "output": 32768 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "budget", + "budget": { + "default": -1, + "min": 128, + "max": 32768, + "auto": -1, + "unit": "tokens" + }, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] + } }, "attachment": true, "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-04-14", - "last_updated": "2025-04-14", + "knowledge": "2025-01-31", + "release_date": "2025-06-05", + "last_updated": "2025-06-05", "type": "chat" }, { - "id": "gpt-6-astra", - "name": "GPT-6 Astra", - "display_name": "GPT-6 Astra", + "id": "google/gemini-2.5-flash-image", + "name": "Nano Banana", + "display_name": "Nano Banana", "modalities": { "input": [ - "text", "image", + "text", "pdf" ], "output": [ - "text" + "text", + "image" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 32768, + "output": 8192 }, - "temperature": false, - "tool_call": true, + "temperature": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ] - } + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2026-04-30", - "release_date": "2026-09-04", - "last_updated": "2026-09-04", - "type": "chat" + "knowledge": "2024-06", + "release_date": "2025-08-26", + "last_updated": "2025-08-26" }, { - "id": "sonar-pro", - "name": "sonar-pro", - "display_name": "sonar-pro", + "id": "google/gemini-3-pro-image-preview", + "name": "Nano Banana Pro Preview", + "display_name": "Nano Banana Pro Preview", "modalities": { "input": [ + "image", "text", - "image" + "pdf" ], "output": [ - "text" + "text", + "image" ] }, "limit": { - "context": 200000, - "output": 8192 + "context": 65536, + "output": 32768 }, "temperature": true, "tool_call": false, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "low", + "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] + } }, "attachment": true, "open_weights": false, - "knowledge": "2025-09-01", - "release_date": "2024-01-01", - "last_updated": "2025-09-01", - "type": "chat" + "knowledge": "2025-01", + "release_date": "2025-11-20", + "last_updated": "2025-11-20" }, { - "id": "sonar", - "name": "sonar", - "display_name": "sonar", + "id": "google/gemini-4-argon", + "name": "Gemini 4 Argon", + "display_name": "Gemini 4 Argon", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 1048576, + "output": 943718 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "high" + ] + } + }, + "attachment": true, "open_weights": false, - "knowledge": "2025-09-01", - "release_date": "2024-01-01", - "last_updated": "2025-09-01", + "knowledge": "2026-03", + "release_date": "2026-10-13", + "last_updated": "2026-10-13", "type": "chat" }, { - "id": "gpt-5.5", - "name": "gpt-5.5", - "display_name": "gpt-5.5", + "id": "google/gemini-3.7-flash", + "name": "Gemini 3.7 Flash", + "display_name": "Gemini 3.7 Flash", "modalities": { "input": [ "text", "image", + "video", + "audio", "pdf" ], "output": [ @@ -190746,10 +183497,10 @@ ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1048576, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -190759,34 +183510,32 @@ "reasoning": { "supported": true, "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ + "mode": "level", + "level": "high", + "level_options": [ + "minimal", "low", "medium", "high" ], - "visibility": "hidden" + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-12-01", - "release_date": "2026-04-23", - "last_updated": "2026-04-23", + "knowledge": "2026-03", + "release_date": "2026-08-13", + "last_updated": "2026-08-13", "type": "chat" }, { - "id": "gemini-2.5-flash-lite", - "name": "gemini-2.5-flash-lite", - "display_name": "gemini-2.5-flash-lite", + "id": "google/gemini-2.5-flash-lite", + "name": "Gemini 2.5 Flash-Lite", + "display_name": "Gemini 2.5 Flash-Lite", "modalities": { "input": [ "text", @@ -190801,7 +183550,7 @@ }, "limit": { "context": 1048576, - "output": 65536 + "output": 65535 }, "temperature": true, "tool_call": true, @@ -190836,23 +183585,26 @@ "type": "chat" }, { - "id": "gpt-5-mini", - "name": "gpt-5-mini", - "display_name": "gpt-5-mini", + "id": "google/gemini-3.5-flash", + "name": "Gemini 3.5 Flash", + "display_name": "Gemini 3.5 Flash", "modalities": { "input": [ "text", - "image" + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 1048576, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -190862,79 +183614,78 @@ "reasoning": { "supported": true, "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ + "mode": "level", + "level": "high", + "level_options": [ "minimal", "low", "medium", "high" ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2024-05-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "knowledge": "2025-01", + "release_date": "2026-05-19", + "last_updated": "2026-05-19", "type": "chat" }, { - "id": "anthropic--claude-4-opus", - "name": "anthropic--claude-4-opus", - "display_name": "anthropic--claude-4-opus", + "id": "google/lyria-3-clip-preview", + "name": "Lyria 3 Clip Preview", + "display_name": "Lyria 3 Clip Preview", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ - "text" + "text", + "audio" ] }, "limit": { - "context": 200000, - "output": 32000 + "context": 1048576, + "output": 65536 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2025-03-31", - "release_date": "2025-05-22", - "last_updated": "2025-05-22", + "release_date": "2026-03-25", + "last_updated": "2026-03-25", "type": "chat" }, { - "id": "gpt-5", - "name": "gpt-5", - "display_name": "gpt-5", + "id": "google/gemini-3.8-flash", + "name": "Gemini 3.8 Flash", + "display_name": "Gemini 3.8 Flash", "modalities": { "input": [ "text", - "image" + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 1048576, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -190944,32 +183695,58 @@ "reasoning": { "supported": true, "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ + "mode": "level", + "level": "high", + "level_options": [ "minimal", "low", "medium", "high" ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "release_date": "2026-09-02", + "last_updated": "2026-09-02", "type": "chat" }, { - "id": "gemini-3.6-flash", + "id": "google/gemma-3-27b-it", + "name": "Gemma 3 27B IT", + "display_name": "Gemma 3 27B IT", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 131072, + "output": 117964 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": true, + "knowledge": "2024-08", + "release_date": "2025-03-12", + "last_updated": "2025-03-12", + "type": "chat" + }, + { + "id": "google/gemini-3.6-flash", "name": "Gemini 3.6 Flash", "display_name": "Gemini 3.6 Flash", "modalities": { @@ -191021,24 +183798,22 @@ "type": "chat" }, { - "id": "gpt-6-luna", - "name": "GPT-6 Luna", - "display_name": "GPT-6 Luna", + "id": "inclusionai/ling-3.1-flash", + "name": "inclusionAI: Ling 3.1 Flash", + "display_name": "inclusionAI: Ling 3.1 Flash", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1000000, + "output": 262144 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -191048,68 +183823,69 @@ "reasoning": { "effort_options": [ "none", - "low", - "medium", - "high", - "xhigh", - "max" + "high" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-05-18", - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "attachment": false, + "open_weights": true, + "release_date": "2026-09-29", + "last_updated": "2026-09-29", "type": "chat" }, { - "id": "gpt-4.1", - "name": "gpt-4.1", - "display_name": "gpt-4.1", + "id": "inclusionai/ling-3.0-flash", + "name": "inclusionAI: Ling 3.0 Flash", + "display_name": "inclusionAI: Ling 3.0 Flash", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1047576, + "context": 262144, "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-04-14", - "last_updated": "2025-04-14", + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "high" + ] + } + }, + "attachment": false, + "open_weights": true, + "release_date": "2026-07-23", + "last_updated": "2026-07-23", "type": "chat" }, { - "id": "anthropic--claude-4.6-sonnet", - "name": "anthropic--claude-4.6-sonnet", - "display_name": "anthropic--claude-4.6-sonnet", + "id": "inclusionai/ling-3.0-flash-vl", + "name": "inclusionAI: Ling 3.0 Flash VL", + "display_name": "inclusionAI: Ling 3.0 Flash VL", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 64000 + "context": 131072, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -191120,65 +183896,33 @@ "extra_capabilities": { "reasoning": { "effort_options": [ - "low", - "medium", - "high", - "max" + "none", + "high" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-17", - "last_updated": "2026-03-13", - "type": "chat" - }, - { - "id": "nvidia--llama-nemotron-embed-1b", - "name": "Llama Nemotron Embed 1B v2", - "display_name": "Llama Nemotron Embed 1B v2", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 8192, - "output": 2048 - }, - "temperature": false, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, "open_weights": true, - "release_date": "2025-10-16", - "last_updated": "2025-10-16", - "type": "embedding" + "release_date": "2026-09-10", + "last_updated": "2026-09-10", + "type": "chat" }, { - "id": "gemini-3.1-flash-lite", - "name": "gemini-3.1-flash-lite", - "display_name": "gemini-3.1-flash-lite", + "id": "qwen/qwen3.6-plus", + "name": "Qwen3.6 Plus", + "display_name": "Qwen3.6 Plus", "modalities": { "input": [ "text", "image", - "video", - "audio", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1048576, + "context": 1000000, "output": 65536 }, "temperature": true, @@ -191190,88 +183934,89 @@ "extra_capabilities": { "reasoning": { "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ - "minimal", - "low", - "medium", + "none", "high" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-05-07", - "last_updated": "2026-05-07", + "knowledge": "2025-04", + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "gpt-4.1-nano", - "name": "gpt-4.1-nano", - "display_name": "gpt-4.1-nano", + "id": "qwen/qwen3-coder-next", + "name": "Qwen3 Coder Next", + "display_name": "Qwen3 Coder Next", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1047576, - "output": 32768 + "context": 262144, + "output": 235929 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-04-14", - "last_updated": "2025-04-14", + "attachment": false, + "open_weights": true, + "knowledge": "2025-09", + "release_date": "2026-02-03", + "last_updated": "2026-02-03", "type": "chat" }, { - "id": "gemini-embedding-2", - "name": "Gemini Embedding 2", - "display_name": "Gemini Embedding 2", + "id": "qwen/qwen2.5-vl-72b-instruct", + "name": "Qwen: Qwen2.5 VL 72B Instruct", + "display_name": "Qwen: Qwen2.5 VL 72B Instruct", "modalities": { "input": [ "text", - "image", - "audio", - "video", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 8192, - "output": 3072 + "context": 128000, + "output": 115200 }, - "temperature": false, + "temperature": true, "tool_call": false, "reasoning": { "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2025-11", - "release_date": "2026-04-22", - "last_updated": "2026-04-22", - "type": "embedding" + "open_weights": true, + "knowledge": "2024-04", + "release_date": "2025-01-26", + "last_updated": "2025-01-26", + "type": "chat" }, { - "id": "text-embedding-3-small", - "name": "text-embedding-3-small", - "display_name": "text-embedding-3-small", + "id": "qwen/qwen3-vl-8b-instruct", + "name": "Qwen: Qwen3 VL 8B Instruct", + "display_name": "Qwen: Qwen3 VL 8B Instruct", "modalities": { "input": [ + "image", "text" ], "output": [ @@ -191279,75 +184024,64 @@ ] }, "limit": { - "context": 8191, - "output": 1536 + "context": 262144, + "output": 235929 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2024-01-25", - "last_updated": "2024-01-25", - "type": "embedding" + "release_date": "2025-10-14", + "last_updated": "2025-10-14", + "type": "chat" }, { - "id": "anthropic--claude-4.5-haiku", - "name": "anthropic--claude-4.5-haiku", - "display_name": "anthropic--claude-4.5-haiku", + "id": "qwen/qwen3-30b-a3b-instruct-2507", + "name": "Qwen: Qwen3 30B A3B Instruct 2507", + "display_name": "Qwen: Qwen3 30B A3B Instruct 2507", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 262144, + "output": 235929 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-02-28", - "release_date": "2025-10-15", - "last_updated": "2025-10-15", + "attachment": false, + "open_weights": true, + "release_date": "2025-07-28", + "last_updated": "2025-07-28", "type": "chat" - } - ] - }, - "302ai": { - "id": "302ai", - "name": "302.AI", - "display_name": "302.AI", - "api": "https://api.302.ai/v1", - "doc": "https://doc.302.ai", - "models": [ + }, { - "id": "glm-5.1", - "name": "GLM-5.1", - "display_name": "GLM-5.1", + "id": "qwen/qwen3.5-flash-02-23", + "name": "Qwen: Qwen3.5-Flash", + "display_name": "Qwen: Qwen3.5-Flash", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 131072 + "context": 1000000, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -191363,61 +184097,35 @@ "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "effort_options": [ + "none", + "high" ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-04-07", - "last_updated": "2026-04-07", - "type": "chat" - }, - { - "id": "doubao-seed-1-6-vision-250815", - "name": "doubao-seed-1-6-vision-250815", - "display_name": "doubao-seed-1-6-vision-250815", - "modalities": { - "input": [ - "text", - "image" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 256000, - "output": 32000 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, "attachment": true, "open_weights": false, - "release_date": "2025-08-15", - "last_updated": "2025-08-15", + "release_date": "2026-02-25", + "last_updated": "2026-02-25", "type": "chat" }, { - "id": "glm-5v-turbo", - "name": "GLM-5V-Turbo", - "display_name": "GLM-5V-Turbo", + "id": "qwen/qwen3.8-max-prime", + "name": "Qwen 3.8 Max Prime", + "display_name": "Qwen 3.8 Max Prime", "modalities": { "input": [ "text", "image", - "video", - "audio", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 200000, + "context": 1000000, "output": 131072 }, "temperature": true, @@ -191428,66 +184136,38 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "minimal", + "low", + "medium", + "high", + "xhigh" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-04-01", - "last_updated": "2026-04-01", - "type": "chat" - }, - { - "id": "deepseek-v3.2-thinking", - "name": "DeepSeek-V3.2-Thinking", - "display_name": "DeepSeek-V3.2-Thinking", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 128000, - "output": 128000 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-12", - "release_date": "2025-12-01", - "last_updated": "2025-12-01", + "release_date": "2026-09-23", + "last_updated": "2026-09-23", "type": "chat" }, { - "id": "gemini-2.5-flash-nothink", - "name": "gemini-2.5-flash-nothink", - "display_name": "gemini-2.5-flash-nothink", + "id": "qwen/qwen3.5-35b-a3b", + "name": "Qwen3.5 35B-A3B", + "display_name": "Qwen3.5 35B-A3B", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 262144, + "output": 81920 }, "temperature": true, "tool_call": true, @@ -191498,101 +184178,86 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "budget", - "budget": { - "default": -1, - "min": 0, - "max": 24576, - "auto": -1, - "off": 0, - "unit": "tokens" - }, + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" + ], + "effort_options": [ + "none", + "high" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-06-17", - "last_updated": "2025-06-17", + "open_weights": true, + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" }, { - "id": "gpt-5.2", - "name": "gpt-5.2", - "display_name": "gpt-5.2", + "id": "qwen/qwen3.6-27b", + "name": "Qwen3.6 27B", + "display_name": "Qwen3.6 27B", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 262144, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", "high" - ], - "visibility": "hidden" + ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2025-12-11", - "last_updated": "2025-12-11", + "open_weights": true, + "release_date": "2026-04-22", + "last_updated": "2026-04-22", "type": "chat" }, { - "id": "claude-haiku-5-5", - "name": "Claude Haiku 5.5", - "display_name": "Claude Haiku 5.5", + "id": "qwen/qwen3.8-2.4t-a95b", + "name": "Qwen3.8 2.4T A95B", + "display_name": "Qwen3.8 2.4T A95B", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 1010000, + "output": 909000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -191600,26 +184265,24 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ "low", "medium", - "high", - "xhigh", - "max" + "xhigh" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-10-07", - "last_updated": "2026-10-07", + "attachment": false, + "open_weights": true, + "release_date": "2026-08-12", + "last_updated": "2026-08-12", "type": "chat" }, { - "id": "glm-5", - "name": "glm-5", - "display_name": "glm-5", + "id": "qwen/qwen-2.5-72b-instruct", + "name": "Qwen2.5 72B Instruct", + "display_name": "Qwen2.5 72B Instruct", "modalities": { "input": [ "text" @@ -191629,188 +184292,137 @@ ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 32768, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": false, - "open_weights": true, - "release_date": "2026-02-12", - "last_updated": "2026-02-12", + "open_weights": false, + "release_date": "2024-09-19", + "last_updated": "2024-09-19", "type": "chat" }, { - "id": "gpt-5.6-luna-pro", - "name": "gpt-5.6-luna-pro", - "display_name": "gpt-5.6-luna-pro", + "id": "qwen/qwen3-vl-30b-a3b-instruct", + "name": "Qwen3 VL 30B A3B Instruct", + "display_name": "Qwen3 VL 30B A3B Instruct", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 262144, + "output": 16384 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ] - } + "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "open_weights": true, + "release_date": "2025-10-04", + "last_updated": "2025-10-04", "type": "chat" }, { - "id": "claude-haiku-4-5-20251001", - "name": "claude-haiku-4-5-20251001", - "display_name": "claude-haiku-4-5-20251001", + "id": "qwen/qwen3-14b", + "name": "Qwen: Qwen3 14B", + "display_name": "Qwen: Qwen3 14B", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 40960, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + "effort_options": [ + "none", + "high" ] } }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-02-28", - "release_date": "2025-10-15", - "last_updated": "2025-10-15", + "release_date": "2025-04-28", + "last_updated": "2025-04-28", "type": "chat" }, { - "id": "gpt-5.4-mini", - "name": "gpt-5.4-mini", - "display_name": "gpt-5.4-mini", + "id": "qwen/qwen3.7-max", + "name": "Qwen3.7 Max", + "display_name": "Qwen3.7 Max", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 1000000, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", "effort_options": [ "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", "high" - ], - "visibility": "hidden" + ] } }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-17", - "last_updated": "2026-03-17", + "release_date": "2026-05-21", + "last_updated": "2026-05-21", "type": "chat" }, { - "id": "claude-opus-4-7", - "name": "claude-opus-4-7", - "display_name": "claude-opus-4-7", + "id": "qwen/qwen3.5-plus-02-15", + "name": "Qwen: Qwen3.5 Plus 2026-02-15", + "display_name": "Qwen: Qwen3.5 Plus 2026-02-15", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" @@ -191818,63 +184430,50 @@ }, "limit": { "context": 1000000, - "output": 128000 + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], "interleaved": true, "summaries": true, - "visibility": "omitted", + "visibility": "summary", "continuation": [ "thinking_blocks" ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." + "effort_options": [ + "none", + "high" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-04-16", - "last_updated": "2026-04-16", + "release_date": "2026-02-16", + "last_updated": "2026-02-16", "type": "chat" }, { - "id": "claude-opus-4-1-20250805-thinking", - "name": "claude-opus-4-1-20250805-thinking", - "display_name": "claude-opus-4-1-20250805-thinking", + "id": "qwen/qwen3-235b-a22b-thinking-2507", + "name": "Qwen: Qwen3 235B A22B Thinking 2507", + "display_name": "Qwen: Qwen3 235B A22B Thinking 2507", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 32000 + "context": 128000, + "output": 16384 }, "temperature": true, "tool_call": true, @@ -191885,84 +184484,42 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + "effort_options": [ + "high" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-03-31", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", - "type": "chat" - }, - { - "id": "glm-4.6", - "name": "glm-4.6", - "display_name": "glm-4.6", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 204800, - "output": 131072 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, "attachment": false, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-09-30", - "last_updated": "2025-09-30", + "release_date": "2025-07-25", + "last_updated": "2025-07-25", "type": "chat" }, { - "id": "gpt-5.6-sol", - "name": "GPT-5.6 Sol", - "display_name": "GPT-5.6 Sol", + "id": "qwen/qwen3.5-9b", + "name": "Qwen3.5 9B", + "display_name": "Qwen3.5 9B", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 262144, + "output": 235929 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -191971,66 +184528,67 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ "none", - "low", - "medium", - "high", - "xhigh", - "max" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", "high" - ], - "visibility": "hidden" + ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "open_weights": true, + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" }, { - "id": "gpt-5.3-chat-latest", - "name": "GPT-5.3 Chat (latest)", - "display_name": "GPT-5.3 Chat (latest)", + "id": "qwen/qwen3.7-flash", + "name": "Qwen3.7 Flash", + "display_name": "Qwen3.7 Flash", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 1000000, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "none", + "high" + ] + } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-03", - "last_updated": "2026-03-03", + "release_date": "2026-07-15", + "last_updated": "2026-07-15", "type": "chat" }, { - "id": "MiniMax-M2.1", - "name": "MiniMax-M2.1", - "display_name": "MiniMax-M2.1", + "id": "qwen/qwen-plus", + "name": "Qwen Plus", + "display_name": "Qwen Plus", "modalities": { "input": [ "text" @@ -192040,35 +184598,41 @@ ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 1000000, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": true }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": false, - "open_weights": true, - "release_date": "2025-12-23", - "last_updated": "2025-12-23", + "open_weights": false, + "knowledge": "2024-04", + "release_date": "2024-01-25", + "last_updated": "2025-09-11", "type": "chat" }, { - "id": "grok-4.3", - "name": "Grok 4.3", - "display_name": "Grok 4.3", + "id": "qwen/qwen3.5-plus-20260420", + "name": "Qwen: Qwen3.5 Plus 2026-04-20", + "display_name": "Qwen: Qwen3.5 Plus 2026-04-20", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" @@ -192076,7 +184640,7 @@ }, "limit": { "context": 1000000, - "output": 30000 + "output": 65536 }, "temperature": true, "tool_call": true, @@ -192087,24 +184651,28 @@ "extra_capabilities": { "reasoning": { "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ "none", - "low", - "medium", "high" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-04-17", - "last_updated": "2026-04-17", + "release_date": "2026-04-27", + "last_updated": "2026-04-27", "type": "chat" }, { - "id": "MiniMax-M2.7", - "name": "MiniMax-M2.7", - "display_name": "MiniMax-M2.7", + "id": "qwen/qwen3-next-80b-a3b-instruct", + "name": "Qwen3-Next 80B-A3B Instruct", + "display_name": "Qwen3-Next 80B-A3B Instruct", "modalities": { "input": [ "text" @@ -192114,48 +184682,38 @@ ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 262144, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": false, "open_weights": true, - "release_date": "2026-03-18", - "last_updated": "2026-03-18", + "knowledge": "2025-04", + "release_date": "2025-09", + "last_updated": "2025-09", "type": "chat" }, { - "id": "grok-4.5", - "name": "Grok 4.5", - "display_name": "Grok 4.5", + "id": "qwen/qwen3.6-flash", + "name": "Qwen3.6 Flash", + "display_name": "Qwen3.6 Flash", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 500000, - "output": 500000 + "context": 1000000, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -192166,21 +184724,26 @@ "extra_capabilities": { "reasoning": { "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ - "low", - "medium", + "none", "high" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-07-08", - "last_updated": "2026-07-08", + "release_date": "2026-04-27", + "last_updated": "2026-04-27", "type": "chat" }, { - "id": "qwen3.6-35b-a3b", + "id": "qwen/qwen3.6-35b-a3b", "name": "Qwen3.6 35B-A3B", "display_name": "Qwen3.6 35B-A3B", "modalities": { @@ -192195,7 +184758,7 @@ }, "limit": { "context": 262144, - "output": 65536 + "output": 235929 }, "temperature": true, "tool_call": true, @@ -192211,6 +184774,10 @@ "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "effort_options": [ + "none", + "high" ] } }, @@ -192221,13 +184788,14 @@ "type": "chat" }, { - "id": "qwen3.7-plus", - "name": "Qwen3.7 Plus", - "display_name": "Qwen3.7 Plus", + "id": "qwen/qwen3.8-omni-flash", + "name": "Qwen3.8 Omni Flash", + "display_name": "Qwen3.8 Omni Flash", "modalities": { "input": [ "text", "image", + "audio", "video" ], "output": [ @@ -192236,7 +184804,7 @@ }, "limit": { "context": 1000000, - "output": 64000 + "output": 131072 }, "temperature": true, "tool_call": true, @@ -192246,20 +184814,22 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "effort_options": [ + "none", + "high" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-04", - "release_date": "2026-06-02", - "last_updated": "2026-06-02", + "release_date": "2026-09-17", + "last_updated": "2026-09-17", "type": "chat" }, { - "id": "gpt-5-thinking", - "name": "gpt-5-thinking", - "display_name": "gpt-5-thinking", + "id": "qwen/qwen3-vl-30b-a3b-thinking", + "name": "Qwen: Qwen3 VL 30B A3B Thinking", + "display_name": "Qwen: Qwen3 VL 30B A3B Thinking", "modalities": { "input": [ "text", @@ -192270,8 +184840,8 @@ ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 262144, + "output": 235929 }, "temperature": true, "tool_call": true, @@ -192279,105 +184849,185 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "high" + ] + } + }, "attachment": true, "open_weights": false, - "knowledge": "2024-10", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "release_date": "2025-10-06", + "last_updated": "2025-10-06", "type": "chat" }, { - "id": "grok-4.1", - "name": "grok-4.1", - "display_name": "grok-4.1", + "id": "qwen/qwen3-coder-30b-a3b-instruct", + "name": "Qwen3-Coder 30B-A3B Instruct", + "display_name": "Qwen3-Coder 30B-A3B Instruct", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 262144, + "output": 235929 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-06", - "release_date": "2025-11-18", - "last_updated": "2025-11-18", + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-07-31", + "last_updated": "2025-07-31", "type": "chat" }, { - "id": "mistral-large-2512", - "name": "mistral-large-2512", - "display_name": "mistral-large-2512", + "id": "qwen/qwen-2.5-coder-32b-instruct", + "name": "Qwen2.5 Coder 32B Instruct", + "display_name": "Qwen2.5 Coder 32B Instruct", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 262144 + "context": 32768, + "output": 29491 + }, + "temperature": true, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "release_date": "2024-11-12", + "last_updated": "2024-11-12", + "type": "chat" + }, + { + "id": "qwen/qwen3-coder", + "name": "Qwen: Qwen3 Coder 480B A35B", + "display_name": "Qwen: Qwen3 Coder 480B A35B", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 262144, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2024-12", - "release_date": "2025-12-02", - "last_updated": "2025-12-02", + "knowledge": "2025-04", + "release_date": "2025-07-22", + "last_updated": "2025-07-22", "type": "chat" }, { - "id": "gpt-4o", - "name": "gpt-4o", - "display_name": "gpt-4o", + "id": "qwen/qwen3-coder-flash", + "name": "Qwen3 Coder Flash", + "display_name": "Qwen3 Coder Flash", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 1000000, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2023-09", - "release_date": "2024-05-13", - "last_updated": "2024-08-06", + "knowledge": "2025-04", + "release_date": "2025-07-28", + "last_updated": "2025-07-28", "type": "chat" }, { - "id": "qwen3.5-35b-a3b", - "name": "Qwen3.5 35B-A3B", - "display_name": "Qwen3.5 35B-A3B", + "id": "qwen/qwen3-32b", + "name": "Qwen3 32B", + "display_name": "Qwen3 32B", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 40960, + "output": 16384 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "none", + "high" + ] + } + }, + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-04-28", + "last_updated": "2025-04-28", + "type": "chat" + }, + { + "id": "qwen/qwen3.5-397b-a17b", + "name": "Qwen3.5 397B-A17B", + "display_name": "Qwen3.5 397B-A17B", "modalities": { "input": [ "text", @@ -192390,7 +185040,7 @@ }, "limit": { "context": 262144, - "output": 65536 + "output": 235929 }, "temperature": true, "tool_call": true, @@ -192406,31 +185056,36 @@ "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "effort_options": [ + "none", + "high" ] } }, "attachment": true, "open_weights": true, - "release_date": "2026-02-23", - "last_updated": "2026-02-23", + "release_date": "2026-02-15", + "last_updated": "2026-02-15", "type": "chat" }, { - "id": "grok-4-fast-reasoning", - "name": "grok-4-fast-reasoning", - "display_name": "grok-4-fast-reasoning", + "id": "qwen/qwen3.5-27b", + "name": "Qwen3.5 27B", + "display_name": "Qwen3.5 27B", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 2000000, - "output": 30000 + "context": 262144, + "output": 81920 }, "temperature": true, "tool_call": true, @@ -192438,69 +185093,103 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "none", + "high" + ] + } + }, "attachment": true, + "open_weights": true, + "release_date": "2026-02-23", + "last_updated": "2026-02-23", + "type": "chat" + }, + { + "id": "qwen/qwen-2.5-7b-instruct", + "name": "Qwen: Qwen2.5 7B Instruct", + "display_name": "Qwen: Qwen2.5 7B Instruct", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 32768, + "output": 29491 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": false, "open_weights": false, - "knowledge": "2025-06", - "release_date": "2025-12-18", - "last_updated": "2025-12-18", + "release_date": "2024-10-16", + "last_updated": "2024-10-16", "type": "chat" }, { - "id": "claude-haiku-4-5", - "name": "claude-haiku-4-5", - "display_name": "claude-haiku-4-5", + "id": "qwen/qwen3.5-122b-a10b", + "name": "Qwen3.5 122B-A10B", + "display_name": "Qwen3.5 122B-A10B", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 262144, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + "effort_options": [ + "none", + "high" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-02-28", - "release_date": "2025-10-15", - "last_updated": "2025-10-15", + "open_weights": true, + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" }, { - "id": "gpt-5.4-nano", - "name": "gpt-5.4-nano", - "display_name": "gpt-5.4-nano", + "id": "qwen/qwen3.7-plus", + "name": "Qwen3.7 Plus", + "display_name": "Qwen3.7 Plus", "modalities": { "input": [ "text", @@ -192511,48 +185200,35 @@ ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 1000000, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", "effort_options": [ "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", "high" - ], - "visibility": "hidden" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-17", - "last_updated": "2026-03-17", + "knowledge": "2025-04", + "release_date": "2026-06-02", + "last_updated": "2026-06-02", "type": "chat" }, { - "id": "kimi-k2.7-code", - "name": "Kimi K2.7 Code", - "display_name": "Kimi K2.7 Code", + "id": "qwen/qwen3.8-flash", + "name": "Qwen3.8 Flash", + "display_name": "Qwen3.8 Flash", "modalities": { "input": [ "text", @@ -192564,10 +185240,10 @@ ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1000000, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -192576,68 +185252,78 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "none", + "high" ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-06-12", - "last_updated": "2026-06-12", + "open_weights": false, + "release_date": "2026-08-26", + "last_updated": "2026-08-26", "type": "chat" }, { - "id": "doubao-seed-1-8-251215", - "name": "doubao-seed-1-8-251215", - "display_name": "doubao-seed-1-8-251215", + "id": "qwen/qwen3.8-max-0902", + "name": "Qwen3.8 Max 0902", + "display_name": "Qwen3.8 Max 0902", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 224000, - "output": 64000 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] + } }, "attachment": true, "open_weights": false, - "release_date": "2025-12-28", - "last_updated": "2025-12-28", + "release_date": "2026-09-02", + "last_updated": "2026-09-02", "type": "chat" }, { - "id": "claude-sonnet-5-5", - "name": "Claude Sonnet 5.5", - "display_name": "Claude Sonnet 5.5", + "id": "qwen/qwen3.8-27b", + "name": "Qwen3.8 27B", + "display_name": "Qwen3.8 27B", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 262144, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -192646,40 +185332,36 @@ "extra_capabilities": { "reasoning": { "effort_options": [ + "none", "low", "medium", - "high", - "xhigh", - "max" + "xhigh" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-09-28", - "last_updated": "2026-09-28", + "open_weights": true, + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "gpt-5.6-luna", - "name": "GPT-5.6 Luna", - "display_name": "GPT-5.6 Luna", + "id": "qwen/qwen3-30b-a3b", + "name": "Qwen3 30B A3B", + "display_name": "Qwen3 30B A3B", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 40960, + "output": 16384 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -192688,37 +185370,57 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ "none", - "low", - "medium", - "high", - "xhigh", - "max" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", "high" - ], - "visibility": "hidden" + ] } }, + "attachment": false, + "open_weights": true, + "release_date": "2025-04-28", + "last_updated": "2025-04-28", + "type": "chat" + }, + { + "id": "qwen/qwen3-vl-235b-a22b-instruct", + "name": "Qwen3 VL 235B A22B Instruct", + "display_name": "Qwen3 VL 235B A22B Instruct", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 131072, + "output": 32768 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, "attachment": true, - "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "open_weights": true, + "knowledge": "2025-03-31", + "release_date": "2025-09-23", + "last_updated": "2025-09-23", "type": "chat" }, { - "id": "MiniMax-M2", - "name": "MiniMax-M2", - "display_name": "MiniMax-M2", + "id": "qwen/qwen3-235b-a22b-2507", + "name": "Qwen: Qwen3 235B A22B Instruct 2507", + "display_name": "Qwen: Qwen3 235B A22B Instruct 2507", "modalities": { "input": [ "text" @@ -192728,8 +185430,8 @@ ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 262144, + "output": 16384 }, "temperature": true, "tool_call": true, @@ -192738,19 +185440,18 @@ }, "attachment": false, "open_weights": true, - "release_date": "2025-10-27", - "last_updated": "2025-10-27", + "release_date": "2025-07-21", + "last_updated": "2025-07-21", "type": "chat" }, { - "id": "qwen3.8-max", - "name": "Qwen3.8 Max", - "display_name": "Qwen3.8 Max", + "id": "x-ai/grok-build-0.1", + "name": "Grok Build 0.1", + "display_name": "Grok Build 0.1", "modalities": { "input": [ "text", "image", - "video", "pdf" ], "output": [ @@ -192758,8 +185459,8 @@ ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 256000, + "output": 230400 }, "temperature": true, "tool_call": true, @@ -192770,35 +185471,25 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ - "low", - "medium", - "xhigh" + "high" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-08-03", - "last_updated": "2026-08-03", + "release_date": "2026-04-16", + "last_updated": "2026-04-16", "type": "chat" }, { - "id": "gemini-4-argon", - "name": "Gemini 4 Argon", - "display_name": "Gemini 4 Argon", + "id": "x-ai/grok-4.6", + "name": "Grok 4.6", + "display_name": "Grok 4.6", "modalities": { "input": [ "text", "image", - "video", - "audio", "pdf" ], "output": [ @@ -192806,10 +185497,10 @@ ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 500000, + "output": 450000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -192817,36 +185508,39 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ "low", "medium", - "high" + "high", + "xhigh" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-10-13", - "last_updated": "2026-10-13", + "knowledge": "2026-02-01", + "release_date": "2026-08-12", + "last_updated": "2026-08-12", "type": "chat" }, { - "id": "gemini-2.5-pro", - "name": "gemini-2.5-pro", - "display_name": "gemini-2.5-pro", + "id": "x-ai/grok-4.5", + "name": "Grok 4.5", + "display_name": "Grok 4.5", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 500000, + "output": 450000 }, "temperature": true, "tool_call": true, @@ -192857,33 +185551,23 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "budget", - "budget": { - "default": -1, - "min": 128, - "max": 32768, - "auto": -1, - "unit": "tokens" - }, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" + "effort_options": [ + "low", + "medium", + "high" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-06-17", - "last_updated": "2025-06-17", + "release_date": "2026-07-08", + "last_updated": "2026-07-08", "type": "chat" }, { - "id": "claude-fable-5-1", - "name": "Claude Fable 5.1", - "display_name": "Claude Fable 5.1", + "id": "x-ai/grok-4.20-multi-agent", + "name": "SpaceXAI: Grok 4.20 Multi-Agent", + "display_name": "SpaceXAI: Grok 4.20 Multi-Agent", "modalities": { "input": [ "text", @@ -192895,120 +185579,114 @@ ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 2000000, + "output": 1800000 }, - "temperature": false, - "tool_call": true, + "temperature": true, + "tool_call": false, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", "effort_options": [ "low", "medium", "high", - "xhigh", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", - "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", - "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." + "xhigh" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-09-01", - "last_updated": "2026-09-01", + "release_date": "2026-03-31", + "last_updated": "2026-03-31", "type": "chat" }, { - "id": "ministral-14b-2512", - "name": "ministral-14b-2512", - "display_name": "ministral-14b-2512", + "id": "x-ai/grok-4.20", + "name": "SpaceXAI: Grok 4.20", + "display_name": "SpaceXAI: Grok 4.20", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 128000 + "context": 2000000, + "output": 1800000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "high" + ] + } }, "attachment": true, - "open_weights": true, - "knowledge": "2024-12", - "release_date": "2025-12-02", - "last_updated": "2025-12-02", + "open_weights": false, + "release_date": "2026-03-31", + "last_updated": "2026-03-31", "type": "chat" }, { - "id": "qwen3-235b-a22b", - "name": "Qwen3-235B-A22B", - "display_name": "Qwen3-235B-A22B", + "id": "x-ai/grok-4.3", + "name": "Grok 4.3", + "display_name": "Grok 4.3", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 1000000, + "output": 900000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "none", + "low", + "medium", + "high" ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-04-28", - "last_updated": "2025-04-28", + "attachment": true, + "open_weights": false, + "release_date": "2026-04-17", + "last_updated": "2026-04-17", "type": "chat" }, { - "id": "claude-sonnet-5", - "name": "Claude Sonnet 5", - "display_name": "Claude Sonnet 5", + "id": "x-ai/grok-4.7", + "name": "Grok 4.7", + "display_name": "Grok 4.7", "modalities": { "input": [ "text", @@ -193020,10 +185698,10 @@ ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 500000, + "output": 450000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -193031,27 +185709,73 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ "low", "medium", "high", - "xhigh", - "max" + "xhigh" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-30", - "last_updated": "2026-06-30", + "knowledge": "2026-05", + "release_date": "2026-09-21", + "last_updated": "2026-09-21", "type": "chat" }, { - "id": "kimi-k2-thinking", - "name": "kimi-k2-thinking", - "display_name": "kimi-k2-thinking", + "id": "fireworks/ember-1", + "name": "Fireworks: Ember-1", + "display_name": "Fireworks: Ember-1", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1048576, + "output": 943718 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "low", + "high", + "max" + ] + } + }, + "attachment": true, + "open_weights": false, + "release_date": "2026-09-22", + "last_updated": "2026-09-22", + "type": "chat" + } + ] + }, + "minimax-cn-coding-plan": { + "id": "minimax-cn-coding-plan", + "name": "MiniMax Token Plan (minimax.cn)", + "display_name": "MiniMax Token Plan (minimax.cn)", + "api": "https://api.minimax.cn/anthropic/v1", + "doc": "https://platform.minimaxi.com/docs/token-plan/intro", + "models": [ + { + "id": "MiniMax-M2.7", + "name": "MiniMax-M2.7", + "display_name": "MiniMax-M2.7", "modalities": { "input": [ "text" @@ -193061,8 +185785,8 @@ ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 204800, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -193083,30 +185807,27 @@ }, "attachment": false, "open_weights": true, - "knowledge": "2025-06", - "release_date": "2025-11-06", - "last_updated": "2025-11-06", + "release_date": "2026-03-18", + "last_updated": "2026-03-18", "type": "chat" }, { - "id": "gemini-3.5-flash", - "name": "Gemini 3.5 Flash", - "display_name": "Gemini 3.5 Flash", + "id": "MiniMax-M3.1-Flash-Preview", + "name": "MiniMax-M3.1-Flash-Preview", + "display_name": "MiniMax-M3.1-Flash-Preview", "modalities": { "input": [ "text", "image", - "video", - "audio", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 1000000, + "output": 512000 }, "temperature": true, "tool_call": true, @@ -193116,83 +185837,64 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", + "effort_options": [ "low", "medium", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" + "high", + "xhigh", + "max" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-05-19", - "last_updated": "2026-05-19", + "release_date": "2026-09-27", + "last_updated": "2026-09-27", "type": "chat" }, { - "id": "claude-opus-5-thinking", - "name": "claude-opus-5-thinking", - "display_name": "claude-opus-5-thinking", + "id": "MiniMax-M2", + "name": "MiniMax-M2", + "display_name": "MiniMax-M2", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 204800, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true - } - }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-05", - "release_date": "2026-07-24", - "last_updated": "2026-07-24", + "attachment": false, + "open_weights": true, + "release_date": "2025-10-27", + "last_updated": "2025-10-27", "type": "chat" }, { - "id": "deepseek-flash", - "name": "DeepSeek V4.1 Flash", - "display_name": "DeepSeek V4.1 Flash", + "id": "MiniMax-M2.5", + "name": "MiniMax-M2.5", + "display_name": "MiniMax-M2.5", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 204800, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -193202,46 +185904,34 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "low", - "high", - "max" - ] + "supported": true } }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-09-10", - "last_updated": "2026-09-10", + "release_date": "2026-02-12", + "last_updated": "2026-02-12", "type": "chat" }, { - "id": "gpt-5.6-terra", - "name": "GPT-5.6 Terra", - "display_name": "GPT-5.6 Terra", + "id": "MiniMax-M3.1-Flash", + "name": "MiniMax-M3.1-Flash", + "display_name": "MiniMax-M3.1-Flash", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1000000, + "output": 524288 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -193249,53 +185939,38 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", "effort_options": [ - "none", "low", "medium", "high", "xhigh", "max" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "release_date": "2026-10-19", + "last_updated": "2026-10-19", "type": "chat" }, { - "id": "gemini-3.5-flash-thinking", - "name": "gemini-3.5-flash-thinking", - "display_name": "gemini-3.5-flash-thinking", + "id": "MiniMax-M3", + "name": "MiniMax-M3", + "display_name": "MiniMax-M3", "modalities": { "input": [ "text", "image", - "video", - "audio", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 1000000, + "output": 524288 }, "temperature": true, "tool_call": true, @@ -193305,49 +185980,32 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", - "low", - "medium", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] + "supported": true } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-05-19", - "last_updated": "2026-05-19", + "open_weights": true, + "release_date": "2026-06-01", + "last_updated": "2026-06-25", "type": "chat" }, { - "id": "o3", - "name": "o3", - "display_name": "o3", + "id": "MiniMax-M2.1", + "name": "MiniMax-M2.1", + "display_name": "MiniMax-M2.1", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 204800, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -193355,29 +186013,19 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "supported": true } }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-05", - "release_date": "2025-04-16", - "last_updated": "2025-04-16", + "attachment": false, + "open_weights": true, + "release_date": "2025-12-23", + "last_updated": "2025-12-23", "type": "chat" }, { - "id": "qwen3-coder-480b-a35b-instruct", - "name": "qwen3-coder-480b-a35b-instruct", - "display_name": "qwen3-coder-480b-a35b-instruct", + "id": "MiniMax-M2.5-highspeed", + "name": "MiniMax-M2.5-highspeed", + "display_name": "MiniMax-M2.5-highspeed", "modalities": { "input": [ "text" @@ -193387,38 +186035,41 @@ ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 204800, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": false, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-07-22", - "last_updated": "2025-07-22", + "release_date": "2026-02-13", + "last_updated": "2026-02-13", "type": "chat" }, { - "id": "grok-4.7", - "name": "Grok 4.7", - "display_name": "Grok 4.7", + "id": "MiniMax-M2.7-highspeed", + "name": "MiniMax-M2.7-highspeed", + "display_name": "MiniMax-M2.7-highspeed", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 500000, - "output": 500000 + "context": 204800, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -193434,86 +186085,76 @@ "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "effort_options": [ - "low", - "medium", - "high", - "xhigh" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-05", - "release_date": "2026-09-21", - "last_updated": "2026-09-21", + "attachment": false, + "open_weights": true, + "release_date": "2026-03-18", + "last_updated": "2026-03-18", "type": "chat" - }, + } + ] + }, + "mistral": { + "id": "mistral", + "name": "Mistral", + "display_name": "Mistral", + "doc": "https://docs.mistral.ai/getting-started/models/", + "models": [ { - "id": "gemini-2.5-flash-lite-preview-09-2025", - "name": "gemini-2.5-flash-lite-preview-09-2025", - "display_name": "gemini-2.5-flash-lite-preview-09-2025", + "id": "zai-glm-5-3", + "name": "GLM-5.3", + "display_name": "GLM-5.3", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 1048576, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "default": -1, - "min": 512, - "max": 24576, - "auto": -1, - "unit": "tokens" - }, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" + "effort_options": [ + "low", + "high", + "max" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-09-26", - "last_updated": "2025-09-26", + "attachment": false, + "open_weights": true, + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "qwen3.7-max-2026-06-08", - "name": "qwen3.7-max-2026-06-08", - "display_name": "qwen3.7-max-2026-06-08", + "id": "labs-leanstral-1-5-1", + "name": "Leanstral 1.5", + "display_name": "Leanstral 1.5", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 262144, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -193521,16 +186162,24 @@ "supported": true, "default": true }, - "attachment": false, - "open_weights": false, - "release_date": "2026-05-21", - "last_updated": "2026-05-21", + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "high" + ] + } + }, + "attachment": true, + "open_weights": true, + "release_date": "2026-06-30", + "last_updated": "2026-06-30", "type": "chat" }, { - "id": "claude-sonnet-4-6-thinking", - "name": "claude-sonnet-4-6-thinking", - "display_name": "claude-sonnet-4-6-thinking", + "id": "mistral-small-2603", + "name": "Mistral Small 4", + "display_name": "Mistral Small 4", "modalities": { "input": [ "text", @@ -193542,8 +186191,8 @@ ] }, "limit": { - "context": 1000000, - "output": 64000 + "context": 262144, + "output": 256000 }, "temperature": true, "tool_call": true, @@ -193553,43 +186202,23 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", "effort_options": [ - "low", - "medium", - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." + "none", + "high" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-17", - "last_updated": "2026-03-13", + "open_weights": true, + "knowledge": "2025-06", + "release_date": "2026-03-16", + "last_updated": "2026-03-16", "type": "chat" }, { - "id": "claude-opus-5-5", - "name": "Claude Opus 5.5", - "display_name": "Claude Opus 5.5", + "id": "mistral-medium-2604", + "name": "Mistral Medium 3.5", + "display_name": "Mistral Medium 3.5", "modalities": { "input": [ "text", @@ -193601,10 +186230,10 @@ ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 262144, + "output": 262144 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -193613,112 +186242,131 @@ "extra_capabilities": { "reasoning": { "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" + "none", + "high" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "open_weights": true, + "release_date": "2026-04-29", + "last_updated": "2026-04-29", "type": "chat" }, { - "id": "qwen3.5-plus", - "name": "Qwen3.5 Plus", - "display_name": "Qwen3.5 Plus", + "id": "mistral-medium-2505", + "name": "Mistral Medium 3", + "display_name": "Mistral Medium 3", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 131072, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2025-04", - "release_date": "2026-02-16", - "last_updated": "2026-02-16", + "knowledge": "2025-05", + "release_date": "2025-05-07", + "last_updated": "2025-05-07", "type": "chat" }, { - "id": "gpt-5-pro", - "name": "gpt-5-pro", - "display_name": "gpt-5-pro", + "id": "devstral-medium-latest", + "name": "Devstral 2 (latest)", + "display_name": "Devstral 2 (latest)", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 272000 + "context": 262144, + "output": 262144 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "fixed", - "effort": "high", - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "attachment": false, + "open_weights": true, + "knowledge": "2025-12", + "release_date": "2025-12-02", + "last_updated": "2025-12-02", + "type": "chat" + }, + { + "id": "voxtral-mini-latest", + "name": "Voxtral Mini (latest)", + "display_name": "Voxtral Mini (latest)", + "modalities": { + "input": [ + "audio" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 8192, + "output": 8192 + }, + "temperature": false, + "tool_call": false, + "reasoning": { + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-10-06", - "last_updated": "2025-10-06", - "type": "chat" + "release_date": "2026-02-04", + "last_updated": "2026-02-04" }, { - "id": "gpt-6-sol", - "name": "GPT-6 Sol", - "display_name": "GPT-6 Sol", + "id": "mistral-embed", + "name": "Mistral Embed", + "display_name": "Mistral Embed", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 8000, + "output": 3072 + }, + "temperature": false, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": false, + "release_date": "2023-12-11", + "last_updated": "2023-12-11", + "type": "embedding" + }, + { + "id": "ministral-8b-latest", + "name": "Ministral 8B (latest)", + "display_name": "Ministral 8B (latest)", "modalities": { "input": [ "text", @@ -193730,136 +186378,96 @@ ] }, "limit": { - "context": 1050000, + "context": 262144, "output": 128000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ] - } + "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2026-04-20", - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "open_weights": true, + "knowledge": "2024-10", + "release_date": "2024-10-01", + "last_updated": "2024-10-04", "type": "chat" }, { - "id": "gpt-5.6-sol-pro", - "name": "gpt-5.6-sol-pro", - "display_name": "gpt-5.6-sol-pro", + "id": "pixtral-12b", + "name": "Pixtral 12B", + "display_name": "Pixtral 12B", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1050000, + "context": 128000, "output": 128000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ] - } + "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "open_weights": true, + "knowledge": "2024-09", + "release_date": "2024-09-01", + "last_updated": "2024-09-01", "type": "chat" }, { - "id": "qwen3.6-plus", - "name": "Qwen3.6 Plus", - "display_name": "Qwen3.6 Plus", + "id": "mistral-large-2512", + "name": "Mistral Large 3", + "display_name": "Mistral Large 3", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2025-04", - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "open_weights": true, + "knowledge": "2024-11", + "release_date": "2024-11-01", + "last_updated": "2025-12-02", "type": "chat" }, { - "id": "qwen3.6-flash", - "name": "Qwen3.6 Flash", - "display_name": "Qwen3.6 Flash", + "id": "magistral-medium-latest", + "name": "Magistral Medium (latest)", + "display_name": "Magistral Medium (latest)", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 262144, + "output": 16384 }, "temperature": true, "tool_call": true, @@ -193869,25 +186477,49 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "none", + "high" ] } }, "attachment": true, - "open_weights": false, - "release_date": "2026-04-27", - "last_updated": "2026-04-27", + "open_weights": true, + "knowledge": "2025-06", + "release_date": "2025-03-17", + "last_updated": "2025-03-20", "type": "chat" }, { - "id": "doubao-seed-1-6-thinking-250715", - "name": "doubao-seed-1-6-thinking-250715", - "display_name": "doubao-seed-1-6-thinking-250715", + "id": "voxtral-mini-tts-latest", + "name": "Voxtral Mini TTS (latest)", + "display_name": "Voxtral Mini TTS (latest)", + "modalities": { + "input": [ + "text" + ], + "output": [ + "audio" + ] + }, + "limit": { + "context": 8192, + "output": 8192 + }, + "temperature": false, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "release_date": "2026-03-23", + "last_updated": "2026-03-23" + }, + { + "id": "mistral-small-2506", + "name": "Mistral Small 3.2", + "display_name": "Mistral Small 3.2", "modalities": { "input": [ "text", @@ -193898,31 +186530,29 @@ ] }, "limit": { - "context": 256000, - "output": 16000 + "context": 128000, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": true, - "open_weights": false, - "release_date": "2025-07-15", - "last_updated": "2025-07-15", + "open_weights": true, + "knowledge": "2025-03", + "release_date": "2025-06-20", + "last_updated": "2025-06-20", "type": "chat" }, { - "id": "gemini-3.5-flash-lite", - "name": "Gemini 3.5 Flash Lite", - "display_name": "Gemini 3.5 Flash Lite", + "id": "ministral-3b-2512", + "name": "Ministral 3 3B", + "display_name": "Ministral 3 3B", "modalities": { "input": [ "text", "image", - "video", - "audio", "pdf" ], "output": [ @@ -193930,37 +186560,24 @@ ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 131072, + "output": 262144 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "minimal", - "low", - "medium", - "high" - ] - } + "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-07-21", - "last_updated": "2026-07-21", + "open_weights": true, + "release_date": "2025-12-02", + "last_updated": "2025-12-02", "type": "chat" }, { - "id": "glm-5.3", - "name": "GLM-5.3", - "display_name": "GLM-5.3", + "id": "zai-glm-5-2", + "name": "GLM-5.2", + "display_name": "GLM-5.2", "modalities": { "input": [ "text" @@ -193970,7 +186587,7 @@ ] }, "limit": { - "context": 1000000, + "context": 1048576, "output": 131072 }, "temperature": true, @@ -193981,15 +186598,8 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ - "low", + "none", "high", "max" ] @@ -193997,72 +186607,72 @@ }, "attachment": false, "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "gemini-2.0-flash-lite", - "name": "gemini-2.0-flash-lite", - "display_name": "gemini-2.0-flash-lite", + "id": "ministral-14b-2512", + "name": "Ministral 3 14B", + "display_name": "Ministral 3 14B", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 2000000, - "output": 8192 + "context": 262144, + "output": 262144 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2024-11", - "release_date": "2024-12-11", - "last_updated": "2024-12-11", + "open_weights": true, + "release_date": "2025-12-02", + "last_updated": "2025-12-02", "type": "chat" }, { - "id": "gemini-2.5-flash-image", - "name": "gemini-2.5-flash-image", - "display_name": "gemini-2.5-flash-image", + "id": "codestral-latest", + "name": "Codestral (latest)", + "display_name": "Codestral (latest)", "modalities": { "input": [ "text", - "image" + "pdf" ], "output": [ - "text", - "image" + "text" ] }, "limit": { - "context": 32768, - "output": 32768 + "context": 256000, + "output": 4096 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-08-26", - "last_updated": "2025-08-26" + "open_weights": true, + "knowledge": "2024-10", + "release_date": "2024-05-29", + "last_updated": "2025-01-04", + "type": "chat" }, { - "id": "gpt-6.1-sol", - "name": "GPT-6.1 Sol", - "display_name": "GPT-6.1 Sol", + "id": "mistral-large-4", + "name": "Mistral Large 4", + "display_name": "Mistral Large 4", "modalities": { "input": [ "text", @@ -194074,10 +186684,10 @@ ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1048576, + "output": 262144 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -194086,70 +186696,91 @@ "extra_capabilities": { "reasoning": { "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" + "none", + "high" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-04-30", - "release_date": "2026-09-29", - "last_updated": "2026-09-29", + "release_date": "2026-10-06", + "last_updated": "2026-10-06", "type": "chat" }, { - "id": "qwen3.7-max", - "name": "Qwen3.7 Max", - "display_name": "Qwen3.7 Max", + "id": "mistral-large-latest", + "name": "Mistral Large (latest)", + "display_name": "Mistral Large (latest)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, - "attachment": false, - "open_weights": false, - "release_date": "2026-05-21", - "last_updated": "2026-05-21", + "attachment": true, + "open_weights": true, + "knowledge": "2024-11", + "release_date": "2024-11-01", + "last_updated": "2025-12-02", "type": "chat" }, { - "id": "gemini-3-pro-preview", - "name": "gemini-3-pro-preview", - "display_name": "gemini-3-pro-preview", + "id": "voxtral-small-latest", + "name": "Voxtral Small (latest)", + "display_name": "Voxtral Small (latest)", "modalities": { "input": [ "text", - "image" + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 64000 + "context": 32768, + "output": 32000 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": true, + "release_date": "2025-07-15", + "last_updated": "2025-07-15", + "type": "chat" + }, + { + "id": "glm-5-2", + "name": "GLM-5.2", + "display_name": "GLM-5.2", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1048576, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -194159,65 +186790,56 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "low", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" + "effort_options": [ + "none", + "high", + "max" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-06", - "release_date": "2025-11-18", - "last_updated": "2025-11-18", + "attachment": false, + "open_weights": true, + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "MiniMax-M1", - "name": "MiniMax-M1", - "display_name": "MiniMax-M1", + "id": "mistral-medium-2508", + "name": "Mistral Medium 3.1", + "display_name": "Mistral Medium 3.1", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2025-06-16", - "last_updated": "2025-06-16", + "knowledge": "2025-05", + "release_date": "2025-08-12", + "last_updated": "2025-08-12", "type": "chat" }, { - "id": "gemini-3.1-pro-preview", - "name": "Gemini 3.1 Pro Preview", - "display_name": "Gemini 3.1 Pro Preview", + "id": "mistral-medium-latest", + "name": "Mistral Medium (latest)", + "display_name": "Mistral Medium (latest)", "modalities": { "input": [ "text", "image", - "video", - "audio", "pdf" ], "output": [ @@ -194225,8 +186847,8 @@ ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, @@ -194236,32 +186858,22 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "low", + "effort_options": [ + "none", "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-02-19", - "last_updated": "2026-02-19", + "open_weights": true, + "release_date": "2026-04-29", + "last_updated": "2026-04-29", "type": "chat" }, { - "id": "gemini-2.5-flash", - "name": "gemini-2.5-flash", - "display_name": "gemini-2.5-flash", + "id": "labs-devstral-small-2512", + "name": "Devstral Small 2", + "display_name": "Devstral Small 2", "modalities": { "input": [ "text", @@ -194272,58 +186884,38 @@ ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 256000, + "output": 256000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "budget", - "budget": { - "default": -1, - "min": 0, - "max": 24576, - "auto": -1, - "off": 0, - "unit": "tokens" - }, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] - } + "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-06-17", - "last_updated": "2025-06-17", + "open_weights": true, + "knowledge": "2025-12", + "release_date": "2025-12-09", + "last_updated": "2025-12-09", "type": "chat" }, { - "id": "grok-4.20-beta-0309-reasoning", - "name": "grok-4.20-beta-0309-reasoning", - "display_name": "grok-4.20-beta-0309-reasoning", + "id": "mistral-small-latest", + "name": "Mistral Small (latest)", + "display_name": "Mistral Small (latest)", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 2000000, - "output": 30000 + "context": 262144, + "output": 256000 }, "temperature": true, "tool_call": true, @@ -194333,72 +186925,79 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "effort_options": [ + "none", + "high" + ] } }, "attachment": true, - "open_weights": false, - "release_date": "2026-03-09", - "last_updated": "2026-03-09", + "open_weights": true, + "knowledge": "2025-06", + "release_date": "2026-03-16", + "last_updated": "2026-03-16", "type": "chat" }, { - "id": "gpt-5.4", - "name": "gpt-5.4", - "display_name": "gpt-5.4", + "id": "devstral-2512", + "name": "Devstral 2", + "display_name": "Devstral 2", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 262144, + "output": 262144 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": false + "supported": false }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "attachment": false, + "open_weights": true, + "knowledge": "2025-12", + "release_date": "2025-12-09", + "last_updated": "2025-12-09", + "type": "chat" + }, + { + "id": "devstral-latest", + "name": "Devstral 2", + "display_name": "Devstral 2", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-05", - "last_updated": "2026-03-05", + "limit": { + "context": 262144, + "output": 262144 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "knowledge": "2025-12", + "release_date": "2025-12-09", + "last_updated": "2025-12-09", "type": "chat" }, { - "id": "qwen3-max-2025-09-23", - "name": "qwen3-max-2025-09-23", - "display_name": "qwen3-max-2025-09-23", + "id": "open-mistral-nemo", + "name": "Open Mistral Nemo", + "display_name": "Open Mistral Nemo", "modalities": { "input": [ "text" @@ -194408,8 +187007,8 @@ ] }, "limit": { - "context": 258048, - "output": 65536 + "context": 128000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -194417,21 +187016,21 @@ "supported": false }, "attachment": false, - "open_weights": false, - "knowledge": "2025-04", - "release_date": "2025-09-23", - "last_updated": "2025-09-23", + "open_weights": true, + "knowledge": "2024-07", + "release_date": "2024-07-01", + "last_updated": "2024-07-01", "type": "chat" }, { - "id": "kimi-k2.6", - "name": "Kimi K2.6", - "display_name": "Kimi K2.6", + "id": "ministral-8b-2512", + "name": "Ministral 3 8B", + "display_name": "Ministral 3 8B", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" @@ -194444,37 +187043,23 @@ "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": true, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-20", - "last_updated": "2026-04-20", + "release_date": "2025-12-02", + "last_updated": "2025-12-02", "type": "chat" }, { - "id": "gemini-3.8-flash", - "name": "Gemini 3.8 Flash", - "display_name": "Gemini 3.8 Flash", + "id": "zai-glm-5-3-flash", + "name": "GLM-5.3-Flash", + "display_name": "GLM-5.3-Flash", "modalities": { "input": [ "text", "image", "video", - "audio", "pdf" ], "output": [ @@ -194483,7 +187068,7 @@ }, "limit": { "context": 1048576, - "output": 65536 + "output": 131072 }, "temperature": true, "tool_call": true, @@ -194493,235 +187078,185 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", + "effort_options": [ "low", - "medium", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" + "high", + "max" ] } }, "attachment": true, - "open_weights": false, - "release_date": "2026-09-02", - "last_updated": "2026-09-02", + "open_weights": true, + "release_date": "2026-08-26", + "last_updated": "2026-08-26", "type": "chat" }, { - "id": "gemini-3-pro-image-preview", - "name": "gemini-3-pro-image-preview", - "display_name": "gemini-3-pro-image-preview", + "id": "deepseek-v4-1-flash-1017", + "name": "DeepSeek V4.1 Flash 1017", + "display_name": "DeepSeek V4.1 Flash 1017", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ - "text", - "image" + "text" ] }, "limit": { - "context": 32768, - "output": 64000 + "context": 1048576, + "output": 128000 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ + "effort_options": [ + "none", "low", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" + "high", + "max" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-06", - "release_date": "2025-11-20", - "last_updated": "2025-11-20" + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-10-17", + "last_updated": "2026-10-17", + "type": "chat" }, { - "id": "kimi-k3", - "name": "Kimi K3", - "display_name": "Kimi K3", + "id": "codestral-2508", + "name": "Codestral 25.08", + "display_name": "Codestral 25.08", "modalities": { "input": [ "text", - "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 256000, + "output": 8192 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "low", - "high", - "max" - ] - } + "supported": false }, "attachment": true, - "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-16", + "open_weights": false, + "release_date": "2025-07-30", + "last_updated": "2025-07-30", "type": "chat" }, { - "id": "grok-4-1-fast-reasoning", - "name": "grok-4-1-fast-reasoning", - "display_name": "grok-4-1-fast-reasoning", + "id": "ministral-3b-latest", + "name": "Ministral 3B (latest)", + "display_name": "Ministral 3B (latest)", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 2000000, - "output": 30000 + "context": 131072, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2025-06", - "release_date": "2025-11-19", - "last_updated": "2025-11-19", + "open_weights": true, + "knowledge": "2024-10", + "release_date": "2024-10-01", + "last_updated": "2024-10-04", "type": "chat" }, { - "id": "glm-4.6v", - "name": "GLM-4.6V", - "display_name": "GLM-4.6V", + "id": "voxtral-small-2507", + "name": "Voxtral Small", + "display_name": "Voxtral Small", "modalities": { "input": [ "text", - "image", - "video" + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 32768 + "context": 32768, + "output": 32000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": true, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-12-08", - "last_updated": "2025-12-08", + "release_date": "2025-07-15", + "last_updated": "2025-07-15", "type": "chat" - }, + } + ] + }, + "poe": { + "id": "poe", + "name": "Poe", + "display_name": "Poe", + "api": "https://api.poe.com/v1", + "doc": "https://creator.poe.com/docs/external-applications/openai-compatible-api", + "models": [ { - "id": "gpt-5.6-terra-pro", - "name": "gpt-5.6-terra-pro", - "display_name": "gpt-5.6-terra-pro", + "id": "trytako/tako", + "name": "Tako", + "display_name": "Tako", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 2048, + "output": 8192 }, "temperature": false, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ] - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "release_date": "2024-08-15", + "last_updated": "2024-08-15", "type": "chat" }, { - "id": "gemini-2.5-flash-preview-09-2025", - "name": "gemini-2.5-flash-preview-09-2025", - "display_name": "gemini-2.5-flash-preview-09-2025", + "id": "xai/grok-4-fast-non-reasoning", + "name": "Grok-4-Fast-Non-Reasoning", + "display_name": "Grok-4-Fast-Non-Reasoning", "modalities": { "input": [ "text", @@ -194732,109 +187267,62 @@ ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 2000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "budget", - "budget": { - "default": -1, - "min": 0, - "max": 24576, - "auto": -1, - "off": 0, - "unit": "tokens" - }, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] - } + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-09-26", - "last_updated": "2025-09-26", + "release_date": "2025-12-18", + "last_updated": "2025-12-18", "type": "chat" }, { - "id": "gpt-5.1", - "name": "gpt-5.1", - "display_name": "gpt-5.1", + "id": "xai/grok-3", + "name": "Grok 3", + "display_name": "Grok 3", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 131072, + "output": 8192 }, "temperature": false, "tool_call": true, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-11-13", - "last_updated": "2025-11-13", + "release_date": "2025-04-11", + "last_updated": "2025-04-11", "type": "chat" }, { - "id": "claude-opus-5", - "name": "Claude Opus 5", - "display_name": "Claude Opus 5", + "id": "xai/grok-4", + "name": "Grok-4", + "display_name": "Grok-4", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, + "context": 256000, "output": 128000 }, "temperature": false, @@ -194845,99 +187333,59 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ] + "supported": true } }, "attachment": true, "open_weights": false, - "knowledge": "2026-05", - "release_date": "2026-07-24", - "last_updated": "2026-07-24", + "release_date": "2025-07-10", + "last_updated": "2025-07-10", "type": "chat" }, { - "id": "claude-sonnet-4-6", - "name": "claude-sonnet-4-6", - "display_name": "claude-sonnet-4-6", + "id": "xai/grok-4.1-fast-non-reasoning", + "name": "Grok-4.1-Fast-Non-Reasoning", + "display_name": "Grok-4.1-Fast-Non-Reasoning", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 64000 + "context": 2000000, + "output": 30000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." - ] - } + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-17", - "last_updated": "2026-03-13", + "release_date": "2025-11-19", + "last_updated": "2025-11-19", "type": "chat" }, { - "id": "kimi-k2.5", - "name": "Kimi K2.5", - "display_name": "Kimi K2.5", + "id": "xai/grok-4.20-multi-agent", + "name": "Grok-4.20-Multi-Agent", + "display_name": "Grok-4.20-Multi-Agent", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 128000, + "output": 8192 }, "temperature": false, "tool_call": true, @@ -194947,26 +187395,22 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "medium", + "high" ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-01-27", - "last_updated": "2026-01-27", + "open_weights": false, + "release_date": "2026-03-13", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "grok-4-fast-non-reasoning", - "name": "grok-4-fast-non-reasoning", - "display_name": "grok-4-fast-non-reasoning", + "id": "xai/grok-4-fast-reasoning", + "name": "Grok-4-Fast-Reasoning", + "display_name": "Grok-4-Fast-Reasoning", "modalities": { "input": [ "text", @@ -194978,160 +187422,97 @@ }, "limit": { "context": 2000000, - "output": 30000 + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": true, "open_weights": false, - "knowledge": "2025-06", "release_date": "2025-12-18", "last_updated": "2025-12-18", "type": "chat" }, { - "id": "claude-opus-4-5-20251101", - "name": "claude-opus-4-5-20251101", - "display_name": "claude-opus-4-5-20251101", + "id": "xai/grok-4.1-fast-reasoning", + "name": "Grok-4.1-Fast-Reasoning", + "display_name": "Grok-4.1-Fast-Reasoning", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 2000000, + "output": 30000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." - ] - } + "default": true }, "attachment": true, "open_weights": false, - "knowledge": "2025-03-31", - "release_date": "2025-11-24", - "last_updated": "2025-11-24", + "release_date": "2025-11-19", + "last_updated": "2025-11-19", "type": "chat" }, { - "id": "gemini-3.1-flash-image-preview", - "name": "gemini-3.1-flash-image-preview", - "display_name": "gemini-3.1-flash-image-preview", + "id": "xai/grok-code-fast-1", + "name": "Grok Code Fast 1", + "display_name": "Grok Code Fast 1", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ - "text", - "image" + "text" ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 256000, + "output": 128000 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { "supported": true } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-02-26", - "last_updated": "2026-02-26" - }, - { - "id": "gpt-4.1-mini", - "name": "gpt-4.1-mini", - "display_name": "gpt-4.1-mini", - "modalities": { - "input": [ - "text", - "image", - "pdf" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 1047576, - "output": 32768 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-04-14", - "last_updated": "2025-04-14", + "release_date": "2025-09-02", + "last_updated": "2025-09-02", "type": "chat" }, { - "id": "gpt-6-astra", - "name": "GPT-6 Astra", - "display_name": "GPT-6 Astra", + "id": "xai/grok-3-mini", + "name": "Grok 3 Mini", + "display_name": "Grok 3 Mini", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 131072, + "output": 8192 }, "temperature": false, "tool_call": true, @@ -195141,94 +187522,63 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ "low", "medium", - "high", - "xhigh", - "max" + "high" ] } }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2026-04-30", - "release_date": "2026-09-04", - "last_updated": "2026-09-04", + "release_date": "2025-04-11", + "last_updated": "2025-04-11", "type": "chat" }, { - "id": "claude-sonnet-4-5-20250929-thinking", - "name": "claude-sonnet-4-5-20250929-thinking", - "display_name": "claude-sonnet-4-5-20250929-thinking", + "id": "fireworks-ai/kimi-k2.5-fw", + "name": "Kimi-K2.5-FW", + "display_name": "Kimi-K2.5-FW", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 262144, + "output": 16384 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." - ] - } + "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2025-03", - "release_date": "2025-09-29", - "last_updated": "2025-09-29", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-01-27", + "last_updated": "2026-01-27", "type": "chat" }, { - "id": "gemini-3.7-flash", - "name": "Gemini 3.7 Flash", - "display_name": "Gemini 3.7 Flash", + "id": "empiriolabs/deepseek-v4-pro-el", + "name": "DeepSeek-V4-Pro-EL", + "display_name": "DeepSeek-V4-Pro-EL", "modalities": { "input": [ - "text", - "image", - "video", - "audio", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 1000000, + "output": 384000 }, "temperature": true, "tool_call": true, @@ -195236,101 +187586,57 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", - "low", - "medium", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] - } - }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-08-13", - "last_updated": "2026-08-13", + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "claude-opus-4-1-20250805", - "name": "claude-opus-4-1-20250805", - "display_name": "claude-opus-4-1-20250805", + "id": "empiriolabs/deepseek-v4-flash-el", + "name": "DeepSeek-V4-Flash-EL", + "display_name": "DeepSeek-V4-Flash-EL", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 32000 + "context": 1000000, + "output": 384000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." - ] - } + "default": true }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-03-31", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "gpt-5.5", - "name": "GPT-5.5", - "display_name": "GPT-5.5", + "id": "poetools/claude-code", + "name": "claude-code", + "display_name": "claude-code", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 8192, + "output": 8192 }, "temperature": false, "tool_call": true, @@ -195340,79 +187646,55 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", "effort_options": [ + "none", "low", "medium", "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "xhigh", + "max" + ] } }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-12-01", - "release_date": "2026-04-23", - "last_updated": "2026-04-23", + "release_date": "2025-11-27", + "last_updated": "2025-11-27", "type": "chat" }, { - "id": "glm-5.2", - "name": "GLM-5.2", - "display_name": "GLM-5.2", + "id": "openai/gpt-4.1-nano", + "name": "GPT-4.1-nano", + "display_name": "GPT-4.1-nano", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 1047576, + "output": 32768 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "high", - "max" - ] - } + "supported": false }, - "attachment": false, - "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "attachment": true, + "open_weights": false, + "knowledge": "2024-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", "type": "chat" }, { - "id": "gpt-5-mini", - "name": "gpt-5-mini", - "display_name": "gpt-5-mini", + "id": "openai/gpt-5-chat", + "name": "GPT-5-Chat", + "display_name": "GPT-5-Chat", "modalities": { "input": [ "text", @@ -195423,238 +187705,187 @@ ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 128000, + "output": 16384 }, "temperature": false, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "minimal", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2024-05-30", + "knowledge": "2024-09-30", "release_date": "2025-08-07", "last_updated": "2025-08-07", "type": "chat" }, { - "id": "claude-opus-4-7-thinking", - "name": "claude-opus-4-7-thinking", - "display_name": "claude-opus-4-7-thinking", + "id": "openai/gpt-4-turbo", + "name": "GPT-4-Turbo", + "display_name": "GPT-4-Turbo", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 128000, + "output": 4096 }, "temperature": false, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." - ] - } + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-04-16", - "last_updated": "2026-04-16", + "knowledge": "2023-12", + "release_date": "2023-11-06", + "last_updated": "2024-04-09", "type": "chat" }, { - "id": "gemini-3-flash-preview", - "name": "gemini-3-flash-preview", - "display_name": "gemini-3-flash-preview", + "id": "openai/gpt-image-1-mini", + "name": "GPT-Image-1-Mini", + "display_name": "GPT-Image-1-Mini", "modalities": { "input": [ "text", "image" ], "output": [ - "text" + "image" ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 8192, + "output": 8192 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", - "low", - "medium", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] - } + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2025-06", - "release_date": "2025-12-17", - "last_updated": "2025-12-17", - "type": "chat" + "release_date": "2025-10-06", + "last_updated": "2025-10-06" }, { - "id": "glm-4.5v", - "name": "GLM-4.5V", - "display_name": "GLM-4.5V", + "id": "openai/o1-pro", + "name": "o1-pro", + "display_name": "o1-pro", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 64000, - "output": 16384 + "context": 200000, + "output": 100000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, "attachment": true, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-08-11", - "last_updated": "2025-08-11", + "open_weights": false, + "knowledge": "2023-09", + "release_date": "2025-03-19", + "last_updated": "2025-03-19", "type": "chat" }, { - "id": "glm-5.3-flash", - "name": "GLM-5.3-Flash", - "display_name": "GLM-5.3-Flash", + "id": "openai/gpt-5.4", + "name": "GPT-5.4", + "display_name": "GPT-5.4", "modalities": { "input": [ "text", "image", - "video", "pdf" ], "output": [ - "text" + "text", + "image" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], + "default_enabled": false, + "mode": "effort", + "effort": "none", "effort_options": [ + "none", "low", + "medium", "high", - "max" - ] + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, - "open_weights": true, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-03-05", + "last_updated": "2026-03-05", "type": "chat" }, { - "id": "gpt-5", - "name": "gpt-5", - "display_name": "gpt-5", + "id": "openai/gpt-5.4-mini", + "name": "GPT-5.4-Mini", + "display_name": "GPT-5.4-Mini", "modalities": { "input": [ "text", "image" ], "output": [ - "text" + "text", + "image" ] }, "limit": { @@ -195665,19 +187896,20 @@ "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, + "default_enabled": false, "mode": "effort", - "effort": "medium", + "effort": "none", "effort_options": [ - "minimal", + "none", "low", "medium", - "high" + "high", + "xhigh" ], "verbosity": "medium", "verbosity_options": [ @@ -195690,54 +187922,71 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "knowledge": "2025-08-31", + "release_date": "2026-03-17", + "last_updated": "2026-03-17", "type": "chat" }, { - "id": "glm-5-turbo", - "name": "glm-5-turbo", - "display_name": "glm-5-turbo", + "id": "openai/sora-2", + "name": "Sora-2", + "display_name": "Sora-2", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ - "text" + "video" ] }, "limit": { - "context": 200000, - "output": 131072 + "context": 8192, + "output": 8192 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "attachment": true, + "open_weights": false, + "release_date": "2025-10-06", + "last_updated": "2025-10-06" + }, + { + "id": "openai/gpt-4o", + "name": "GPT-4o", + "display_name": "GPT-4o", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] }, - "attachment": false, + "limit": { + "context": 128000, + "output": 8192 + }, + "temperature": false, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": true, "open_weights": false, - "release_date": "2026-03-16", - "last_updated": "2026-03-16", + "knowledge": "2023-09", + "release_date": "2024-05-13", + "last_updated": "2024-08-06", "type": "chat" }, { - "id": "glm-4.7", - "name": "glm-4.7", - "display_name": "glm-4.7", + "id": "openai/gpt-5.1-codex-mini", + "name": "GPT-5.1-Codex-Mini", + "display_name": "GPT-5.1-Codex-Mini", "modalities": { "input": [ "text" @@ -195747,137 +187996,131 @@ ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-12-22", - "last_updated": "2025-12-22", + "open_weights": false, + "knowledge": "2024-09-30", + "release_date": "2025-11-13", + "last_updated": "2025-11-13", "type": "chat" }, { - "id": "gemini-3.6-flash", - "name": "Gemini 3.6 Flash", - "display_name": "Gemini 3.6 Flash", + "id": "openai/gpt-3.5-turbo-raw", + "name": "GPT-3.5-Turbo-Raw", + "display_name": "GPT-3.5-Turbo-Raw", "modalities": { "input": [ "text", - "image", - "video", - "audio", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 4524, + "output": 2048 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", - "low", - "medium", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] - } + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-07-21", - "last_updated": "2026-07-21", + "knowledge": "2021-09-01", + "release_date": "2023-03-01", + "last_updated": "2023-11-06", "type": "chat" }, { - "id": "gpt-6-luna", - "name": "GPT-6 Luna", - "display_name": "GPT-6 Luna", + "id": "openai/gpt-5.1-codex", + "name": "GPT-5.1-Codex", + "display_name": "GPT-5.1-Codex", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1050000, + "context": 400000, "output": 128000 }, "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", "effort_options": [ "none", "low", "medium", - "high", - "xhigh", - "max" - ] + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2026-05-18", - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "knowledge": "2024-09-30", + "release_date": "2025-11-13", + "last_updated": "2025-11-13", "type": "chat" }, { - "id": "gpt-4.1", - "name": "gpt-4.1", - "display_name": "gpt-4.1", + "id": "openai/gpt-4.1", + "name": "GPT-4.1", + "display_name": "GPT-4.1", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" @@ -195887,7 +188130,7 @@ "context": 1047576, "output": 32768 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": false @@ -195900,99 +188143,78 @@ "type": "chat" }, { - "id": "gemini-3.1-flash-lite-preview", - "name": "Gemini 3.1 Flash Lite Preview", - "display_name": "Gemini 3.1 Flash Lite Preview", + "id": "openai/gpt-image-1.5", + "name": "gpt-image-1.5", + "display_name": "gpt-image-1.5", "modalities": { "input": [ "text", - "image", - "video", - "audio", - "pdf" + "image" ], "output": [ - "text" + "image" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 128000, + "output": 8192 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "minimal", - "low", - "medium", - "high" - ] - } + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-03-03", - "last_updated": "2026-03-03", - "type": "chat" + "release_date": "2025-11-25", + "last_updated": "2025-11-25" }, { - "id": "deepseek-v3.2", - "name": "deepseek-v3.2", - "display_name": "deepseek-v3.2", + "id": "openai/gpt-3.5-turbo", + "name": "GPT-3.5-Turbo", + "display_name": "GPT-3.5-Turbo", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 16384, + "output": 2048 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-12", - "release_date": "2025-12-01", - "last_updated": "2025-12-01", + "attachment": true, + "open_weights": false, + "knowledge": "2021-09-01", + "release_date": "2023-03-01", + "last_updated": "2023-11-06", "type": "chat" }, { - "id": "grok-4.6", - "name": "Grok 4.6", - "display_name": "Grok 4.6", + "id": "openai/o3-deep-research", + "name": "o3-deep-research", + "display_name": "o3-deep-research", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 500000, - "output": 500000 + "context": 200000, + "output": 100000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -196001,97 +188223,69 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ "low", "medium", - "high", - "xhigh" - ] + "high" + ], + "visibility": "hidden" } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-02-01", - "release_date": "2026-08-12", - "last_updated": "2026-08-12", - "type": "chat" - }, - { - "id": "glm-4.5", - "name": "GLM-4.5", - "display_name": "GLM-4.5", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 131072, - "output": 98304 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-07-28", - "last_updated": "2025-07-28", + "open_weights": false, + "knowledge": "2024-05", + "release_date": "2025-06-26", + "last_updated": "2025-06-26", "type": "chat" }, { - "id": "qwen3-235b-a22b-instruct-2507", - "name": "qwen3-235b-a22b-instruct-2507", - "display_name": "qwen3-235b-a22b-instruct-2507", + "id": "openai/sora-2-pro", + "name": "Sora-2-Pro", + "display_name": "Sora-2-Pro", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ - "text" + "video" ] }, "limit": { - "context": 128000, - "output": 65536 + "context": 8192, + "output": 8192 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-07-21", - "last_updated": "2025-07-21", - "type": "chat" + "attachment": true, + "open_weights": false, + "release_date": "2025-10-06", + "last_updated": "2025-10-06" }, { - "id": "MiniMax-M3", - "name": "MiniMax-M3", - "display_name": "MiniMax-M3", + "id": "openai/o3-mini-high", + "name": "o3-mini-high", + "display_name": "o3-mini-high", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 512000 + "context": 200000, + "output": 100000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -196099,36 +188293,43 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, - "open_weights": true, - "release_date": "2026-06-01", - "last_updated": "2026-06-01", + "open_weights": false, + "knowledge": "2024-05", + "release_date": "2024-12-20", + "last_updated": "2025-01-29", "type": "chat" }, { - "id": "gemini-3.1-flash-lite", - "name": "Gemini 3.1 Flash Lite", - "display_name": "Gemini 3.1 Flash Lite", + "id": "openai/o3-pro", + "name": "o3-pro", + "display_name": "o3-pro", "modalities": { "input": [ "text", - "image", - "video", - "audio", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 200000, + "output": 100000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -196137,25 +188338,28 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ - "minimal", "low", "medium", "high" - ] + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-05-07", - "last_updated": "2026-05-07", + "knowledge": "2024-05", + "release_date": "2025-06-10", + "last_updated": "2025-06-10", "type": "chat" }, { - "id": "gpt-5.2-chat-latest", - "name": "gpt-5.2-chat-latest", - "display_name": "gpt-5.2-chat-latest", + "id": "openai/gpt-5.3-codex", + "name": "GPT-5.3-Codex", + "display_name": "GPT-5.3-Codex", "modalities": { "input": [ "text", @@ -196166,8 +188370,8 @@ ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 400000, + "output": 128000 }, "temperature": false, "tool_call": true, @@ -196177,34 +188381,47 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ - "medium" - ] + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, "knowledge": "2025-08-31", - "release_date": "2025-12-11", - "last_updated": "2025-12-11", + "release_date": "2026-02-05", + "last_updated": "2026-02-05", "type": "chat" }, { - "id": "claude-opus-4-8", - "name": "Claude Opus 4.8", - "display_name": "Claude Opus 4.8", + "id": "openai/gpt-5.1", + "name": "GPT-5.1", + "display_name": "GPT-5.1", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, + "context": 400000, "output": 128000 }, "temperature": false, @@ -196218,86 +188435,75 @@ "supported": true, "default_enabled": false, "mode": "effort", - "effort": "high", + "effort": "none", "effort_options": [ + "none", "low", "medium", - "high", - "xhigh", - "max" + "high" ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." - ] + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2026-01", - "release_date": "2026-05-28", - "last_updated": "2026-05-28", + "knowledge": "2024-09-30", + "release_date": "2025-11-13", + "last_updated": "2025-11-13", "type": "chat" }, { - "id": "MiniMax-M2.5", - "name": "MiniMax-M2.5", - "display_name": "MiniMax-M2.5", + "id": "openai/gpt-3.5-turbo-instruct", + "name": "GPT-3.5-Turbo-Instruct", + "display_name": "GPT-3.5-Turbo-Instruct", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 3500, + "output": 1024 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, - "attachment": false, - "open_weights": true, - "release_date": "2026-02-12", - "last_updated": "2026-02-12", + "attachment": true, + "open_weights": false, + "release_date": "2023-09-20", + "last_updated": "2023-09-20", "type": "chat" }, { - "id": "qwen3.8-flash", - "name": "Qwen3.8 Flash", - "display_name": "Qwen3.8 Flash", + "id": "openai/gpt-5-codex", + "name": "GPT-5-Codex", + "display_name": "GPT-5-Codex", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -196306,29 +188512,35 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ + "minimal", "low", "medium", - "xhigh" - ] + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", + "knowledge": "2024-09-30", + "release_date": "2025-09-15", + "last_updated": "2025-09-15", "type": "chat" }, { - "id": "gpt-4.1-nano", - "name": "gpt-4.1-nano", - "display_name": "gpt-4.1-nano", + "id": "openai/chatgpt-4o-latest", + "name": "ChatGPT-4o-Latest", + "display_name": "ChatGPT-4o-Latest", "modalities": { "input": [ "text", @@ -196339,201 +188551,108 @@ ] }, "limit": { - "context": 1047576, - "output": 32768 + "context": 128000, + "output": 8192 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-04-14", - "last_updated": "2025-04-14", + "release_date": "2024-08-14", + "last_updated": "2024-08-14", "type": "chat" }, { - "id": "claude-sonnet-4-5-20250929", - "name": "claude-sonnet-4-5-20250929", - "display_name": "claude-sonnet-4-5-20250929", + "id": "openai/gpt-4o-aug", + "name": "GPT-4o-Aug", + "display_name": "GPT-4o-Aug", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 128000, + "output": 8192 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." - ] - } + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2025-07-31", - "release_date": "2025-09-29", - "last_updated": "2025-09-29", + "knowledge": "2023-09", + "release_date": "2024-08-06", + "last_updated": "2024-08-06", "type": "chat" }, { - "id": "claude-fable-5", - "name": "Claude Fable 5", - "display_name": "Claude Fable 5", + "id": "openai/gpt-5.3-instant", + "name": "GPT-5.3-Instant", + "display_name": "GPT-5.3-Instant", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 128000, + "output": 16384 }, "temperature": false, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", - "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", - "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." - ] - } + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-09", - "last_updated": "2026-06-09", - "type": "chat" - }, - { - "id": "kimi-k2-0905-preview", - "name": "kimi-k2-0905-preview", - "display_name": "kimi-k2-0905-preview", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 262144, - "output": 262144 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-06", - "release_date": "2025-09-05", - "last_updated": "2025-09-05", + "knowledge": "2025-08-31", + "release_date": "2026-03-03", + "last_updated": "2026-03-03", "type": "chat" }, { - "id": "qwen3-30b-a3b", - "name": "Qwen3-30B-A3B", - "display_name": "Qwen3-30B-A3B", + "id": "openai/dall-e-3", + "name": "DALL-E-3", + "display_name": "DALL-E-3", "modalities": { "input": [ "text" ], "output": [ - "text" + "image" ] }, "limit": { - "context": 128000, + "context": 800, "output": 8192 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-04-28", - "last_updated": "2025-04-28", - "type": "chat" + "open_weights": false, + "release_date": "2023-11-06", + "last_updated": "2023-11-06" }, { - "id": "gpt-5.1-chat-latest", - "name": "gpt-5.1-chat-latest", - "display_name": "gpt-5.1-chat-latest", + "id": "openai/gpt-5-mini", + "name": "GPT-5-mini", + "display_name": "GPT-5-mini", "modalities": { "input": [ "text", @@ -196544,8 +188663,8 @@ ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 400000, + "output": 128000 }, "temperature": false, "tool_call": true, @@ -196555,45 +188674,49 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ - "medium" - ] + "minimal", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-11-13", - "last_updated": "2025-11-13", + "knowledge": "2024-05-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" - } - ] - }, - "inceptron": { - "id": "inceptron", - "name": "Inceptron", - "display_name": "Inceptron", - "api": "https://api.inceptron.io/v1", - "doc": "https://docs.inceptron.io", - "models": [ + }, { - "id": "moonshotai/Kimi-K2.6", - "name": "Kimi K2.6", - "display_name": "Kimi K2.6", + "id": "openai/o4-mini-deep-research", + "name": "o4-mini-deep-research", + "display_name": "o4-mini-deep-research", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 200000, + "output": 100000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -196602,25 +188725,28 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-20", - "last_updated": "2026-04-20", + "attachment": false, + "open_weights": false, + "knowledge": "2024-05", + "release_date": "2025-06-26", + "last_updated": "2025-06-26", "type": "chat" }, { - "id": "moonshotai/Kimi-K2.7-Code", - "name": "Kimi K2.7 Code", - "display_name": "Kimi K2.7 Code", + "id": "openai/gpt-5.1-instant", + "name": "GPT-5.1-Instant", + "display_name": "GPT-5.1-Instant", "modalities": { "input": [ "text", @@ -196631,50 +188757,62 @@ ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 128000, + "output": 16384 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-06-12", - "last_updated": "2026-06-12", + "open_weights": false, + "knowledge": "2024-09-30", + "release_date": "2025-11-13", + "last_updated": "2025-11-13", "type": "chat" }, { - "id": "zai-org/GLM-5.3", - "name": "GLM 5.3", - "display_name": "GLM 5.3", + "id": "openai/gpt-5.4-pro", + "name": "GPT-5.4-Pro", + "display_name": "GPT-5.4-Pro", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ - "text" + "text", + "image" ] }, "limit": { - "context": 1048576, - "output": 1048576 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -196683,85 +188821,99 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], + "default_enabled": true, + "mode": "effort", + "effort": "high", "effort_options": [ - "low", + "medium", "high", - "max" - ] + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "attachment": true, + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-03-05", + "last_updated": "2026-03-05", "type": "chat" }, { - "id": "zai-org/GLM-5.2", - "name": "GLM 5.2", - "display_name": "GLM 5.2", + "id": "openai/gpt-5.1-codex-max", + "name": "GPT-5.1-Codex-Max", + "display_name": "GPT-5.1-Codex-Max", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 1048576 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], + "default_enabled": false, + "mode": "effort", + "effort": "none", "effort_options": [ - "high", - "max" - ] + "none", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "attachment": true, + "open_weights": false, + "knowledge": "2024-09-30", + "release_date": "2025-11-13", + "last_updated": "2025-11-13", "type": "chat" }, { - "id": "zai-org/GLM-5.3-Flash", - "name": "GLM 5.3 Flash", - "display_name": "GLM 5.3 Flash", + "id": "openai/gpt-5", + "name": "GPT-5", + "display_name": "GPT-5", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 1048576 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -196770,29 +188922,35 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ + "minimal", "low", - "high", - "max" - ] + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", + "attachment": true, + "open_weights": false, + "knowledge": "2024-09-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-V4-Flash-0731", - "name": "DeepSeek V4 Flash 0731", - "display_name": "DeepSeek V4 Flash 0731", + "id": "openai/gpt-4o-search", + "name": "GPT-4o-Search", + "display_name": "GPT-4o-Search", "modalities": { "input": [ "text" @@ -196802,49 +188960,24 @@ ] }, "limit": { - "context": 1048576, - "output": 1048576 + "context": 128000, + "output": 8192 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "high", - "max" - ] - } + "supported": false }, "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-07-31", - "last_updated": "2026-07-31", + "open_weights": false, + "release_date": "2025-03-11", + "last_updated": "2025-03-11", "type": "chat" - } - ] - }, - "gitlab": { - "id": "gitlab", - "name": "GitLab Duo", - "display_name": "GitLab Duo", - "doc": "https://docs.gitlab.com/user/duo_agent_platform/", - "models": [ + }, { - "id": "duo-chat-gpt-5-2", - "name": "Agentic Chat (GPT-5.2)", - "display_name": "Agentic Chat (GPT-5.2)", + "id": "openai/gpt-5.2-codex", + "name": "GPT-5.2-Codex", + "display_name": "GPT-5.2-Codex", "modalities": { "input": [ "text", @@ -196858,7 +188991,7 @@ "context": 400000, "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -196866,13 +188999,23 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ - "none", "low", "medium", "high", "xhigh" - ] + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, @@ -196883,108 +189026,102 @@ "type": "chat" }, { - "id": "duo-chat-fable-5", - "name": "Agentic Chat (Claude Fable 5)", - "display_name": "Agentic Chat (Claude Fable 5)", + "id": "openai/gpt-5.2", + "name": "GPT-5.2", + "display_name": "GPT-5.2", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, + "context": 400000, "output": 128000 }, "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", "effort_options": [ + "none", "low", "medium", "high", - "xhigh", - "max" - ] + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-09", - "last_updated": "2026-06-09", + "knowledge": "2025-08-31", + "release_date": "2025-12-11", + "last_updated": "2025-12-11", "type": "chat" }, { - "id": "duo-chat-gpt-6-1-sol", - "name": "Agentic Chat (GPT-6.1 Sol)", - "display_name": "Agentic Chat (GPT-6.1 Sol)", + "id": "openai/gpt-image-1", + "name": "GPT-Image-1", + "display_name": "GPT-Image-1", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ - "text" + "image" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 128000, + "output": 8192 }, "temperature": false, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ] - } + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2026-04-30", - "release_date": "2026-09-29", - "last_updated": "2026-09-29", - "type": "chat" + "release_date": "2025-04-24", + "last_updated": "2025-04-24" }, { - "id": "duo-chat-opus-4-5", - "name": "Agentic Chat (Claude Opus 4.5)", - "display_name": "Agentic Chat (Claude Opus 4.5)", + "id": "openai/gpt-5-pro", + "name": "GPT-5-Pro", + "display_name": "GPT-5-Pro", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -196992,37 +189129,42 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ + "supported": true, + "default_enabled": true, + "mode": "fixed", + "effort": "high", + "verbosity": "medium", + "verbosity_options": [ "low", "medium", "high" - ] + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2025-05", - "release_date": "2025-11-24", - "last_updated": "2025-11-24", + "knowledge": "2024-09-30", + "release_date": "2025-10-06", + "last_updated": "2025-10-06", "type": "chat" }, { - "id": "duo-chat-gpt-5-6-terra", - "name": "Agentic Chat (GPT-5.6 Terra)", - "display_name": "Agentic Chat (GPT-5.6 Terra)", + "id": "openai/o3", + "name": "o3", + "display_name": "o3", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 200000, + "output": 100000 }, "temperature": false, "tool_call": true, @@ -197032,82 +189174,93 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ - "none", "low", "medium", - "high", - "xhigh", - "max" - ] + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "knowledge": "2024-05", + "release_date": "2025-04-16", + "last_updated": "2025-04-16", "type": "chat" }, { - "id": "duo-chat-gpt-5-4", - "name": "Agentic Chat (GPT-5.4)", - "display_name": "Agentic Chat (GPT-5.4)", + "id": "openai/gpt-5.4-nano", + "name": "GPT-5.4-Nano", + "display_name": "GPT-5.4-Nano", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ - "text" + "text", + "image" ] }, "limit": { - "context": 1050000, + "context": 400000, "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", "effort_options": [ "none", "low", "medium", "high", "xhigh" - ] + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, "knowledge": "2025-08-31", - "release_date": "2026-03-05", - "last_updated": "2026-03-05", + "release_date": "2026-03-17", + "last_updated": "2026-03-17", "type": "chat" }, { - "id": "duo-chat-gpt-5-5", - "name": "Agentic Chat (GPT-5.5)", - "display_name": "Agentic Chat (GPT-5.5)", + "id": "openai/gpt-5.3-codex-spark", + "name": "GPT-5.3-Codex-Spark", + "display_name": "GPT-5.3-Codex-Spark", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 128000, + "output": 16384 }, "temperature": false, "tool_call": true, @@ -197117,31 +189270,40 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ - "none", "low", "medium", "high", "xhigh" - ] + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-12-01", - "release_date": "2026-04-23", - "last_updated": "2026-04-23", + "knowledge": "2025-08-31", + "release_date": "2026-02-05", + "last_updated": "2026-02-05", "type": "chat" }, { - "id": "duo-chat-haiku-4-5", - "name": "Agentic Chat (Claude Haiku 4.5)", - "display_name": "Agentic Chat (Claude Haiku 4.5)", + "id": "openai/o1", + "name": "o1", + "display_name": "o1", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" @@ -197149,80 +189311,79 @@ }, "limit": { "context": 200000, - "output": 64000 + "output": 100000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, "attachment": true, "open_weights": false, - "knowledge": "2025-02-28", - "release_date": "2025-10-15", - "last_updated": "2025-10-15", + "knowledge": "2023-09", + "release_date": "2024-12-05", + "last_updated": "2024-12-05", "type": "chat" }, { - "id": "duo-chat-gpt-5-3-codex", - "name": "Agentic Chat (GPT-5.3 Codex)", - "display_name": "Agentic Chat (GPT-5.3 Codex)", + "id": "openai/gpt-4o-mini-search", + "name": "GPT-4o-mini-Search", + "display_name": "GPT-4o-mini-Search", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 128000, + "output": 8192 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ] - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-05", - "last_updated": "2026-02-05", + "release_date": "2025-03-11", + "last_updated": "2025-03-11", "type": "chat" }, { - "id": "duo-chat-sonnet-5", - "name": "Agentic Chat (Claude Sonnet 5)", - "display_name": "Agentic Chat (Claude Sonnet 5)", + "id": "openai/gpt-5.5-pro", + "name": "GPT-5.5-Pro", + "display_name": "GPT-5.5-Pro", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ - "text" + "text", + "image" ] }, "limit": { - "context": 1000000, - "output": 64000 + "context": 400000, + "output": 128000 }, "temperature": false, "tool_call": true, @@ -197232,40 +189393,40 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ - "low", "medium", "high", - "xhigh", - "max" + "xhigh" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-30", - "last_updated": "2026-06-30", + "knowledge": "2025-12-01", + "release_date": "2026-04-23", + "last_updated": "2026-04-23", "type": "chat" }, { - "id": "duo-chat-gpt-5-4-mini", - "name": "Agentic Chat (GPT-5.4 Mini)", - "display_name": "Agentic Chat (GPT-5.4 Mini)", + "id": "openai/gpt-5.5", + "name": "GPT-5.5", + "display_name": "GPT-5.5", "modalities": { "input": [ "text", "image" ], "output": [ - "text" + "text", + "image" ] }, "limit": { "context": 400000, "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -197273,69 +189434,63 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ - "none", "low", "medium", "high", "xhigh" - ] + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-17", - "last_updated": "2026-03-17", + "knowledge": "2025-12-01", + "release_date": "2026-04-23", + "last_updated": "2026-04-23", "type": "chat" }, { - "id": "duo-chat-gpt-5-6-luna", - "name": "Agentic Chat (GPT-5.6 Luna)", - "display_name": "Agentic Chat (GPT-5.6 Luna)", + "id": "openai/gpt-image-2", + "name": "GPT-Image-2", + "display_name": "GPT-Image-2", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ - "text" + "image" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 8192, + "output": 8192 }, "temperature": false, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ] - } + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", - "type": "chat" + "release_date": "2026-04-21", + "last_updated": "2026-04-21" }, { - "id": "duo-chat-gpt-5-mini", - "name": "Agentic Chat (GPT-5 Mini)", - "display_name": "Agentic Chat (GPT-5 Mini)", + "id": "openai/gpt-5.2-pro", + "name": "GPT-5.2-Pro", + "display_name": "GPT-5.2-Pro", "modalities": { "input": [ "text", @@ -197357,121 +189512,128 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", "effort_options": [ - "minimal", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ "low", "medium", "high" - ] + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2024-05-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "knowledge": "2025-08-31", + "release_date": "2025-12-11", + "last_updated": "2025-12-11", "type": "chat" }, { - "id": "duo-chat-opus-5-5", - "name": "Agentic Chat (Claude Opus 5.5)", - "display_name": "Agentic Chat (Claude Opus 5.5)", + "id": "openai/gpt-5.2-instant", + "name": "GPT-5.2-Instant", + "display_name": "GPT-5.2-Instant", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 128000, + "output": 16384 }, "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", "effort_options": [ + "none", "low", "medium", "high", - "xhigh", - "max" - ] + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "knowledge": "2025-08-31", + "release_date": "2025-12-11", + "last_updated": "2025-12-11", "type": "chat" }, { - "id": "duo-chat-gpt-5-2-codex", - "name": "Agentic Chat (GPT-5.2 Codex)", - "display_name": "Agentic Chat (GPT-5.2 Codex)", + "id": "openai/gpt-4.1-mini", + "name": "GPT-4.1-mini", + "display_name": "GPT-4.1-mini", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 1047576, + "output": 32768 }, "temperature": false, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ] - } + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2025-12-11", - "last_updated": "2025-12-11", + "knowledge": "2024-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", "type": "chat" }, { - "id": "duo-chat-opus-5", - "name": "Agentic Chat (Claude Opus 5)", - "display_name": "Agentic Chat (Claude Opus 5)", + "id": "openai/o3-mini", + "name": "o3-mini", + "display_name": "o3-mini", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 200000, + "output": 100000 }, "temperature": false, "tool_call": true, @@ -197481,39 +189643,41 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ "low", "medium", - "high", - "xhigh", - "max" - ] + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2026-05", - "release_date": "2026-07-24", - "last_updated": "2026-07-24", + "knowledge": "2024-05", + "release_date": "2024-12-20", + "last_updated": "2025-01-29", "type": "chat" }, { - "id": "duo-chat-haiku-5-5", - "name": "Agentic Chat (Claude Haiku 5.5)", - "display_name": "Agentic Chat (Claude Haiku 5.5)", + "id": "openai/o4-mini", + "name": "o4-mini", + "display_name": "o4-mini", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 200000, + "output": 100000 }, "temperature": false, "tool_call": true, @@ -197523,69 +189687,58 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ "low", "medium", - "high", - "xhigh", - "max" - ] + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-10-07", - "last_updated": "2026-10-07", + "knowledge": "2024-05", + "release_date": "2025-04-16", + "last_updated": "2025-04-16", "type": "chat" }, { - "id": "duo-chat-gpt-6-sol", - "name": "Agentic Chat (GPT-6 Sol)", - "display_name": "Agentic Chat (GPT-6 Sol)", + "id": "openai/gpt-4o-mini", + "name": "GPT-4o-mini", + "display_name": "GPT-4o-mini", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 124096, + "output": 4096 }, "temperature": false, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ] - } + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2026-04-20", - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "knowledge": "2023-09", + "release_date": "2024-07-18", + "last_updated": "2024-07-18", "type": "chat" }, { - "id": "duo-chat-gpt-5-1", - "name": "Agentic Chat (GPT-5.1)", - "display_name": "Agentic Chat (GPT-5.1)", + "id": "openai/gpt-5-nano", + "name": "GPT-5-nano", + "display_name": "GPT-5-nano", "modalities": { "input": [ "text", @@ -197599,7 +189752,7 @@ "context": 400000, "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -197607,320 +189760,223 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ - "none", + "minimal", "low", "medium", "high" - ] + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-11-13", - "last_updated": "2025-11-13", + "knowledge": "2024-05-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "duo-chat-opus-4-8", - "name": "Agentic Chat (Claude Opus 4.8)", - "display_name": "Agentic Chat (Claude Opus 4.8)", + "id": "runwayml/runway-gen-4-turbo", + "name": "Runway-Gen-4-Turbo", + "display_name": "Runway-Gen-4-Turbo", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ - "text" + "video" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 256, + "output": 8192 }, "temperature": false, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ] - } + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2026-01", - "release_date": "2026-05-28", - "last_updated": "2026-05-28", - "type": "chat" + "release_date": "2025-05-09", + "last_updated": "2025-05-09" }, { - "id": "duo-chat-sonnet-5-5", - "name": "Agentic Chat (Claude Sonnet 5.5)", - "display_name": "Agentic Chat (Claude Sonnet 5.5)", + "id": "runwayml/runway", + "name": "Runway", + "display_name": "Runway", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ - "text" + "video" ] }, "limit": { - "context": 1000000, - "output": 64000 + "context": 256, + "output": 8192 }, "temperature": false, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ] - } + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-09-28", - "last_updated": "2026-09-28", - "type": "chat" + "release_date": "2024-10-11", + "last_updated": "2024-10-11" }, { - "id": "duo-chat-gpt-5-4-nano", - "name": "Agentic Chat (GPT-5.4 Nano)", - "display_name": "Agentic Chat (GPT-5.4 Nano)", + "id": "ideogramai/ideogram-v2", + "name": "Ideogram-v2", + "display_name": "Ideogram-v2", "modalities": { "input": [ "text", "image" ], "output": [ - "text" + "image" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 150, + "output": 8192 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ] - } + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-17", - "last_updated": "2026-03-17", - "type": "chat" + "release_date": "2024-08-21", + "last_updated": "2024-08-21" }, { - "id": "duo-chat-gpt-5-6-sol", - "name": "Agentic Chat (GPT-5.6 Sol)", - "display_name": "Agentic Chat (GPT-5.6 Sol)", + "id": "ideogramai/ideogram-v2a", + "name": "Ideogram-v2a", + "display_name": "Ideogram-v2a", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ - "text" + "image" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 150, + "output": 8192 }, "temperature": false, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ] - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", - "type": "chat" + "release_date": "2025-02-27", + "last_updated": "2025-02-27" }, { - "id": "duo-chat-fable-5-1", - "name": "Agentic Chat (Claude Fable 5.1)", - "display_name": "Agentic Chat (Claude Fable 5.1)", + "id": "ideogramai/ideogram", + "name": "Ideogram", + "display_name": "Ideogram", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ - "text" + "image" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 150, + "output": 8192 }, "temperature": false, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ] - } + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-09-01", - "last_updated": "2026-09-01", - "type": "chat" + "release_date": "2024-04-03", + "last_updated": "2024-04-03" }, { - "id": "duo-chat-gpt-6-luna", - "name": "Agentic Chat (GPT-6 Luna)", - "display_name": "Agentic Chat (GPT-6 Luna)", + "id": "ideogramai/ideogram-v2a-turbo", + "name": "Ideogram-v2a-Turbo", + "display_name": "Ideogram-v2a-Turbo", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ - "text" + "image" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 150, + "output": 8192 }, "temperature": false, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ] - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2026-05-18", - "release_date": "2026-09-22", - "last_updated": "2026-09-22", - "type": "chat" + "release_date": "2025-02-27", + "last_updated": "2025-02-27" }, { - "id": "duo-chat-gpt-6-astra", - "name": "Agentic Chat (GPT-6 Astra)", - "display_name": "Agentic Chat (GPT-6 Astra)", + "id": "lumalabs/ray2", + "name": "Ray2", + "display_name": "Ray2", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ - "text" + "video" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 5000, + "output": 8192 }, "temperature": false, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ] - } + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2026-04-30", - "release_date": "2026-09-04", - "last_updated": "2026-09-04", - "type": "chat" + "release_date": "2025-02-20", + "last_updated": "2025-02-20" }, { - "id": "duo-chat-sonnet-4-6", - "name": "Agentic Chat (Claude Sonnet 4.6)", - "display_name": "Agentic Chat (Claude Sonnet 4.6)", + "id": "anthropic/claude-opus-4.6", + "name": "Claude-Opus-4.6", + "display_name": "Claude-Opus-4.6", "modalities": { "input": [ "text", @@ -197932,36 +189988,54 @@ ] }, "limit": { - "context": 1000000, - "output": 64000 + "context": 983040, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", "effort_options": [ "low", "medium", "high", "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-17", + "knowledge": "2025-05-31", + "release_date": "2026-02-05", "last_updated": "2026-03-13", "type": "chat" }, { - "id": "duo-chat-sonnet-4-5", - "name": "Agentic Chat (Claude Sonnet 4.5)", - "display_name": "Agentic Chat (Claude Sonnet 4.5)", + "id": "anthropic/claude-haiku-4.5", + "name": "Claude-Haiku-4.5", + "display_name": "Claude-Haiku-4.5", "modalities": { "input": [ "text", @@ -197973,26 +190047,47 @@ ] }, "limit": { - "context": 200000, + "context": 192000, "output": 64000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + ] + } }, "attachment": true, "open_weights": false, - "knowledge": "2025-07-31", - "release_date": "2025-09-29", - "last_updated": "2025-09-29", + "knowledge": "2025-02-28", + "release_date": "2025-10-15", + "last_updated": "2025-10-15", "type": "chat" }, { - "id": "duo-chat-opus-4-6", - "name": "Agentic Chat (Claude Opus 4.6)", - "display_name": "Agentic Chat (Claude Opus 4.6)", + "id": "anthropic/claude-sonnet-3.7", + "name": "Claude-Sonnet-3.7", + "display_name": "Claude-Sonnet-3.7", "modalities": { "input": [ "text", @@ -198004,36 +190099,26 @@ ] }, "limit": { - "context": 1000000, + "context": 196608, "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "max" - ] - } - }, "attachment": true, "open_weights": false, - "knowledge": "2025-05-31", - "release_date": "2026-02-05", - "last_updated": "2026-03-13", + "knowledge": "2024-10-31", + "release_date": "2025-02-19", + "last_updated": "2025-02-19", "type": "chat" }, { - "id": "duo-chat-opus-4-7", - "name": "Agentic Chat (Claude Opus 4.7)", - "display_name": "Agentic Chat (Claude Opus 4.7)", + "id": "anthropic/claude-opus-4.8", + "name": "Claude-Opus-4.8", + "display_name": "Claude-Opus-4.8", "modalities": { "input": [ "text", @@ -198045,491 +190130,505 @@ ] }, "limit": { - "context": 1000000, + "context": 1048576, "output": 128000 }, "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "high", "effort_options": [ "low", "medium", "high", "xhigh", "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-04-16", - "last_updated": "2026-04-16", + "knowledge": "2026-01", + "release_date": "2026-05-28", + "last_updated": "2026-05-28", "type": "chat" }, { - "id": "duo-chat-gpt-5-codex", - "name": "Agentic Chat (GPT-5 Codex)", - "display_name": "Agentic Chat (GPT-5 Codex)", + "id": "anthropic/claude-opus-4.7", + "name": "Claude-Opus-4.7", + "display_name": "Claude-Opus-4.7", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 400000, + "context": 1048576, "output": 128000 }, "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "high", "effort_options": [ "low", "medium", - "high" + "high", + "xhigh", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-09-15", - "last_updated": "2025-09-15", + "knowledge": "2026-01-31", + "release_date": "2026-04-16", + "last_updated": "2026-04-16", "type": "chat" - } - ] - }, - "atomic-chat": { - "id": "atomic-chat", - "name": "Atomic Chat", - "display_name": "Atomic Chat", - "api": "http://127.0.0.1:1337/v1", - "doc": "https://atomic.chat", - "models": [ + }, { - "id": "Qwen3_5-9B-MLX-4bit", - "name": "Qwen 3.5 9B (MLX 4-bit)", - "display_name": "Qwen 3.5 9B (MLX 4-bit)", + "id": "anthropic/claude-sonnet-3.5-june", + "name": "Claude-Sonnet-3.5-June", + "display_name": "Claude-Sonnet-3.5-June", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 32768, + "context": 189096, "output": 8192 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": false }, "attachment": true, - "open_weights": true, - "release_date": "2026-02-23", - "last_updated": "2026-02-23", - "type": "chat" - }, - { - "id": "gemma-4-E4B-it-MLX-4bit", - "name": "Gemma 4 E4B Instruct (MLX 4-bit)", - "display_name": "Gemma 4 E4B Instruct (MLX 4-bit)", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 32768, - "output": 8192 - }, - "temperature": true, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": true, - "release_date": "2026-04-02", - "last_updated": "2026-04-02", - "type": "chat" - }, - { - "id": "gemma-4-E4B-it-IQ4_XS", - "name": "Gemma 4 E4B Instruct (IQ4_XS)", - "display_name": "Gemma 4 E4B Instruct (IQ4_XS)", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 32768, - "output": 8192 - }, - "temperature": true, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": true, - "release_date": "2026-04-02", - "last_updated": "2026-04-02", - "type": "chat" - }, - { - "id": "Meta-Llama-3_1-8B-Instruct-GGUF", - "name": "Meta Llama 3.1 8B Instruct (GGUF)", - "display_name": "Meta Llama 3.1 8B Instruct (GGUF)", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 131072, - "output": 4096 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": true, - "knowledge": "2023-12", - "release_date": "2024-07-23", - "last_updated": "2024-07-23", + "open_weights": false, + "release_date": "2024-11-18", + "last_updated": "2024-11-18", "type": "chat" }, { - "id": "Qwen3_5-9B-Q4_K_M", - "name": "Qwen 3.5 9B (Q4_K_M)", - "display_name": "Qwen 3.5 9B (Q4_K_M)", + "id": "anthropic/claude-opus-4.1", + "name": "Claude-Opus-4.1", + "display_name": "Claude-Opus-4.1", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 32768, - "output": 8192 + "context": 196608, + "output": 32000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + ] + } }, "attachment": true, - "open_weights": true, - "release_date": "2026-02-23", - "last_updated": "2026-02-23", + "open_weights": false, + "knowledge": "2025-03-31", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" - } - ] - }, - "llmtr": { - "id": "llmtr", - "name": "LLMTR", - "display_name": "LLMTR", - "api": "https://llmtr.com/v1", - "doc": "https://llmtr.com/docs", - "models": [ + }, { - "id": "muse-glimmer-30b-tr", - "name": "Muse Glimmer 30B (TR)", - "display_name": "Muse Glimmer 30B (TR)", + "id": "anthropic/claude-sonnet-4", + "name": "Claude-Sonnet-4", + "display_name": "Claude-Sonnet-4", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 131072 + "context": 983040, + "output": 64000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true - }, - "attachment": true, - "open_weights": true, - "knowledge": "2026-01-04", - "release_date": "2026-08-10", - "last_updated": "2026-08-10", - "type": "chat" - }, - { - "id": "magibu-11b-v8", - "name": "Magibu 11B v8", - "display_name": "Magibu 11B v8", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 8192, - "output": 8192 + "default": false }, - "temperature": true, - "tool_call": false, - "reasoning": { - "supported": false + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + ] + } }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-06-05", - "last_updated": "2026-08-16", + "knowledge": "2025-03-31", + "release_date": "2025-05-22", + "last_updated": "2025-05-22", "type": "chat" }, { - "id": "qwen3-6-35b", - "name": "Qwen3.6 35B-A3B", - "display_name": "Qwen3.6 35B-A3B", + "id": "anthropic/claude-sonnet-4.6", + "name": "Claude-Sonnet-4.6", + "display_name": "Claude-Sonnet-4.6", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 16384, - "output": 16384 + "context": 983040, + "output": 128000 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." + ] + } }, "attachment": true, - "open_weights": true, - "release_date": "2026-04-17", - "last_updated": "2026-04-17", + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-02-17", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "medgemma-4b", - "name": "MedGemma 4B", - "display_name": "MedGemma 4B", + "id": "anthropic/claude-haiku-3", + "name": "Claude-Haiku-3", + "display_name": "Claude-Haiku-3", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 8192, + "context": 189096, "output": 8192 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { "supported": false }, "attachment": true, - "open_weights": true, - "release_date": "2026-04-26", - "last_updated": "2026-08-16", + "open_weights": false, + "knowledge": "2023-08-31", + "release_date": "2024-03-13", + "last_updated": "2024-03-13", "type": "chat" }, { - "id": "trendyol-asure-12b", - "name": "Trendyol Asure 12B", - "display_name": "Trendyol Asure 12B", + "id": "anthropic/claude-sonnet-3.5", + "name": "Claude-Sonnet-3.5", + "display_name": "Claude-Sonnet-3.5", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 40960, - "output": 40960 + "context": 189096, + "output": 8192 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { "supported": false }, "attachment": true, - "open_weights": true, - "release_date": "2026-02-19", - "last_updated": "2026-02-20", + "open_weights": false, + "knowledge": "2024-04-30", + "release_date": "2024-10-22", + "last_updated": "2024-10-22", "type": "chat" }, { - "id": "gemma-4", - "name": "Gemma 4", - "display_name": "Gemma 4", + "id": "anthropic/claude-haiku-3.5", + "name": "Claude-Haiku-3.5", + "display_name": "Claude-Haiku-3.5", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 131072 + "context": 189096, + "output": 8192 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "open_weights": false, + "knowledge": "2024-07-31", + "release_date": "2024-10-22", + "last_updated": "2024-10-22", "type": "chat" }, { - "id": "meta/muse-spark-1.2-contributor", - "name": "Muse Spark 1.2 Contributor", - "display_name": "Muse Spark 1.2 Contributor", + "id": "anthropic/claude-opus-4", + "name": "Claude-Opus-4", + "display_name": "Claude-Opus-4", "modalities": { "input": [ "text", "image", - "video", - "pdf", - "audio" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 192512, + "output": 28672 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "minimal", - "low", - "medium", - "high", - "xhigh" + "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-08-05", - "last_updated": "2026-08-05", + "knowledge": "2025-03-31", + "release_date": "2025-05-22", + "last_updated": "2025-05-22", "type": "chat" }, { - "id": "sakana/fugu-ultra", - "name": "Fugu Ultra", - "display_name": "Fugu Ultra", + "id": "anthropic/claude-opus-4.5", + "name": "Claude-Opus-4.5", + "display_name": "Claude-Opus-4.5", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 1000000 + "context": 196608, + "output": 64000 }, "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", "effort_options": [ - "high", - "xhigh" + "low", + "medium", + "high" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-06-15", - "last_updated": "2026-06-15", + "knowledge": "2025-05", + "release_date": "2025-11-24", + "last_updated": "2025-11-24", "type": "chat" }, { - "id": "google/gemini-2.5-flash-lite", - "name": "Gemini 2.5 Flash-Lite", - "display_name": "Gemini 2.5 Flash-Lite", + "id": "anthropic/claude-sonnet-4.5", + "name": "Claude-Sonnet-4.5", + "display_name": "Claude-Sonnet-4.5", "modalities": { "input": [ "text", "image", - "audio", - "video", "pdf" ], "output": [ @@ -198537,10 +190636,10 @@ ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 983040, + "output": 32768 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -198552,91 +190651,86 @@ "default_enabled": false, "mode": "budget", "budget": { - "default": -1, - "min": 512, - "max": 24576, - "auto": -1, + "min": 1024, "unit": "tokens" }, + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-06-17", - "last_updated": "2025-06-17", + "knowledge": "2025-07-31", + "release_date": "2025-09-29", + "last_updated": "2025-09-29", "type": "chat" }, { - "id": "mimo/mimo-v2.5", - "name": "MiMo-V2.5", - "display_name": "MiMo-V2.5", + "id": "stabilityai/stablediffusionxl", + "name": "StableDiffusionXL", + "display_name": "StableDiffusionXL", "modalities": { "input": [ "text", - "image", - "audio", - "video" + "image" ], "output": [ - "text" + "image" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 200, + "output": 8192 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": true, - "open_weights": true, - "knowledge": "2024-12", - "release_date": "2026-04-22", - "last_updated": "2026-04-22", - "type": "chat" + "open_weights": false, + "release_date": "2023-07-09", + "last_updated": "2023-07-09" }, { - "id": "mimo/mimo-v2.5-pro", - "name": "MiMo-V2.5-Pro", - "display_name": "MiMo-V2.5-Pro", + "id": "topazlabs-co/topazlabs", + "name": "TopazLabs", + "display_name": "TopazLabs", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ - "text" + "image" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 204, + "output": 8192 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-12", - "release_date": "2026-04-22", - "last_updated": "2026-04-22", - "type": "chat" + "attachment": true, + "open_weights": false, + "release_date": "2024-12-03", + "last_updated": "2024-12-03" }, { - "id": "upstage/solar-pro2", - "name": "Solar Pro 2", - "display_name": "Solar Pro 2", + "id": "novita/kimi-k2-thinking", + "name": "kimi-k2-thinking", + "display_name": "kimi-k2-thinking", "modalities": { "input": [ "text" @@ -198646,10 +190740,10 @@ ] }, "limit": { - "context": 65536, + "context": 256000, "output": 8192 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -198657,65 +190751,56 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "minimal", - "high" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, "attachment": false, - "open_weights": false, - "knowledge": "2025-03", - "release_date": "2025-05-20", - "last_updated": "2025-05-20", + "open_weights": true, + "knowledge": "2024-08", + "release_date": "2025-11-06", + "last_updated": "2025-11-06", "type": "chat" }, { - "id": "upstage/solar-pro4", - "name": "Solar Pro 4", - "display_name": "Solar Pro 4", + "id": "novita/glm-4.6v", + "name": "glm-4.6v", + "display_name": "glm-4.6v", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 524288, - "output": 131072 + "context": 131000, + "output": 32768 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "minimal", - "low", - "medium", - "high", - "xhigh", - "max" - ] - } - }, - "attachment": false, - "open_weights": false, - "knowledge": "2026-02", - "release_date": "2026-08-06", - "last_updated": "2026-08-06", + "attachment": true, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-12-08", + "last_updated": "2025-12-08", "type": "chat" }, { - "id": "upstage/solar-pro3", - "name": "Solar Pro 3", - "display_name": "Solar Pro 3", + "id": "novita/glm-4.7-flash", + "name": "glm-4.7-flash", + "display_name": "glm-4.7-flash", "modalities": { "input": [ "text" @@ -198725,10 +190810,10 @@ ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 200000, + "output": 65500 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -198736,52 +190821,54 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "low", - "medium", - "high" - ] + "supported": true } }, "attachment": false, - "open_weights": false, - "knowledge": "2025-07", - "release_date": "2026-01-26", - "last_updated": "2026-03-23", + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2026-01-19", + "last_updated": "2026-01-19", "type": "chat" }, { - "id": "mistral/voxtral-small-latest", - "name": "Voxtral Small (latest)", - "display_name": "Voxtral Small (latest)", + "id": "novita/glm-4.6", + "name": "GLM-4.6", + "display_name": "GLM-4.6", "modalities": { "input": [ - "text", - "audio" + "text" ], "output": [ "text" ] }, "limit": { - "context": 32000, - "output": 32000 + "context": 8192, + "output": 8192 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": false, "open_weights": true, - "release_date": "2025-07-15", - "last_updated": "2025-07-15", + "knowledge": "2025-04", + "release_date": "2025-09-30", + "last_updated": "2025-09-30", "type": "chat" }, { - "id": "qwen/qwen3.5-397b-a17b", - "name": "Qwen3.5 397B-A17B", - "display_name": "Qwen3.5 397B-A17B", + "id": "novita/kimi-k2.6", + "name": "Kimi-K2.6", + "display_name": "Kimi-K2.6", "modalities": { "input": [ "text", @@ -198793,8 +190880,8 @@ ] }, "limit": { - "context": 256000, - "output": 65536 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, @@ -198804,38 +190891,31 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, "attachment": true, "open_weights": true, - "release_date": "2026-02-15", - "last_updated": "2026-02-15", + "knowledge": "2025-04", + "release_date": "2026-04-20", + "last_updated": "2026-04-20", "type": "chat" }, { - "id": "qwen/qwen3.7-plus", - "name": "Qwen3.7 Plus", - "display_name": "Qwen3.7 Plus", + "id": "novita/deepseek-v3.2", + "name": "DeepSeek-V3.2", + "display_name": "DeepSeek-V3.2", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 64000 + "context": 128000, + "output": 8192 }, "temperature": true, "tool_call": true, @@ -198848,30 +190928,28 @@ "supported": true } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-04", - "release_date": "2026-06-02", - "last_updated": "2026-06-02", + "attachment": false, + "open_weights": true, + "knowledge": "2024-07", + "release_date": "2025-12-01", + "last_updated": "2025-12-01", "type": "chat" }, { - "id": "qwen/qwen3.5-plus", - "name": "Qwen3.5 Plus", - "display_name": "Qwen3.5 Plus", + "id": "novita/glm-5", + "name": "GLM-5", + "display_name": "GLM-5", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 205000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -198890,17 +190968,16 @@ ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-04", - "release_date": "2026-02-16", - "last_updated": "2026-02-16", + "attachment": false, + "open_weights": true, + "release_date": "2026-02-12", + "last_updated": "2026-02-12", "type": "chat" }, { - "id": "qwen/qwen3.6-plus", - "name": "Qwen3.6 Plus", - "display_name": "Qwen3.6 Plus", + "id": "novita/kimi-k2.5", + "name": "Kimi-K2.5", + "display_name": "Kimi-K2.5", "modalities": { "input": [ "text", @@ -198912,8 +190989,8 @@ ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 128000, + "output": 262144 }, "temperature": true, "tool_call": true, @@ -198933,29 +191010,60 @@ } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-04", - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-01-27", + "last_updated": "2026-01-27", "type": "chat" }, { - "id": "qwen/qwen3.6-flash", - "name": "Qwen3.6 Flash", - "display_name": "Qwen3.6 Flash", + "id": "novita/minimax-m2.1", + "name": "minimax-m2.1", + "display_name": "minimax-m2.1", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 205000, + "output": 131072 + }, + "temperature": false, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": false, + "open_weights": true, + "release_date": "2025-12-23", + "last_updated": "2025-12-23", + "type": "chat" + }, + { + "id": "novita/glm-4.7", + "name": "glm-4.7", + "display_name": "glm-4.7", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 205000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -198974,16 +191082,17 @@ ] } }, - "attachment": true, - "open_weights": false, - "release_date": "2026-04-27", - "last_updated": "2026-04-27", + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-12-22", + "last_updated": "2025-12-22", "type": "chat" }, { - "id": "qwen/qwen3-coder-flash", - "name": "Qwen3 Coder Flash", - "display_name": "Qwen3 Coder Flash", + "id": "novita/glm-4.7-n", + "name": "glm-4.7-n", + "display_name": "glm-4.7-n", "modalities": { "input": [ "text" @@ -198993,35 +191102,65 @@ ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 205000, + "output": 131072 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": false, - "open_weights": false, + "open_weights": true, "knowledge": "2025-04", - "release_date": "2025-07-28", - "last_updated": "2025-07-28", + "release_date": "2025-12-22", + "last_updated": "2025-12-22", "type": "chat" }, { - "id": "qwen/qwen3-max", - "name": "Qwen3 Max", - "display_name": "Qwen3 Max", + "id": "google/imagen-3", + "name": "Imagen-3", + "display_name": "Imagen-3", "modalities": { "input": [ "text" ], + "output": [ + "image" + ] + }, + "limit": { + "context": 480, + "output": 8192 + }, + "temperature": false, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": false, + "release_date": "2024-10-15", + "last_updated": "2024-10-15" + }, + { + "id": "google/gemini-3-flash", + "name": "Gemini-3-Flash", + "display_name": "Gemini-3-Flash", + "modalities": { + "input": [ + "text", + "image", + "video", + "audio" + ], "output": [ "text" ] }, "limit": { - "context": 256000, + "context": 1048576, "output": 65536 }, "temperature": true, @@ -199033,39 +191172,49 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", + "low", + "medium", + "high" + ], "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" + "thought_signatures" ] } }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2025-04", - "release_date": "2025-09-23", - "last_updated": "2025-09-23", + "knowledge": "2025-01", + "release_date": "2025-12-17", + "last_updated": "2025-12-17", "type": "chat" }, { - "id": "qwen/qwen3-vl-plus", - "name": "Qwen3-VL Plus", - "display_name": "Qwen3-VL Plus", + "id": "google/gemini-2.5-pro", + "name": "Gemini-2.5-Pro", + "display_name": "Gemini-2.5-Pro", "modalities": { "input": [ "text", - "image" + "image", + "video", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 32768 + "context": 1065535, + "output": 65535 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -199074,76 +191223,105 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": true, + "mode": "budget", + "budget": { + "default": -1, + "min": 128, + "max": 32768, + "auto": -1, + "unit": "tokens" + }, "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" + "thought_signatures" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-04", - "release_date": "2025-09-23", - "last_updated": "2025-09-23", + "knowledge": "2025-01", + "release_date": "2025-06-17", + "last_updated": "2025-06-17", "type": "chat" }, { - "id": "qwen/qwen-flash", - "name": "Qwen Flash", - "display_name": "Qwen Flash", + "id": "google/veo-3.1-fast", + "name": "Veo-3.1-Fast", + "display_name": "Veo-3.1-Fast", "modalities": { "input": [ - "text" + "text", + "image" + ], + "output": [ + "video" + ] + }, + "limit": { + "context": 480, + "output": 8192 + }, + "temperature": false, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": false, + "release_date": "2025-10-15", + "last_updated": "2025-10-15" + }, + { + "id": "google/gemini-2.0-flash-lite", + "name": "Gemini-2.0-Flash-Lite", + "display_name": "Gemini-2.0-Flash-Lite", + "modalities": { + "input": [ + "text", + "image", + "video", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 32768 + "context": 990000, + "output": 8192 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-07-28", - "last_updated": "2025-07-28", + "knowledge": "2024-06", + "release_date": "2024-12-11", + "last_updated": "2024-12-11", "type": "chat" }, { - "id": "qwen/qwen-plus", - "name": "Qwen Plus", - "display_name": "Qwen Plus", + "id": "google/gemini-3.5-flash-lite", + "name": "Gemini-3.5-Flash-Lite", + "display_name": "Gemini-3.5-Flash-Lite", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 32768 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -199154,146 +191332,138 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "minimal", + "low", + "medium", + "high" ] } }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2024-04", - "release_date": "2024-01-25", - "last_updated": "2025-09-11", + "knowledge": "2026-03", + "release_date": "2026-07-21", + "last_updated": "2026-07-21", "type": "chat" }, { - "id": "qwen/qwen3-coder-plus", - "name": "Qwen3 Coder Plus", - "display_name": "Qwen3 Coder Plus", + "id": "google/imagen-3-fast", + "name": "Imagen-3-Fast", + "display_name": "Imagen-3-Fast", "modalities": { "input": [ "text" ], "output": [ - "text" + "image" ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 480, + "output": 8192 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": false }, "attachment": false, "open_weights": false, - "knowledge": "2025-04", - "release_date": "2025-07-23", - "last_updated": "2025-07-23", - "type": "chat" + "release_date": "2024-10-17", + "last_updated": "2024-10-17" }, { - "id": "poolside/laguna-xs-2.1", - "name": "Laguna XS 2.1", - "display_name": "Laguna XS 2.1", + "id": "google/gemini-deep-research", + "name": "gemini-deep-research", + "display_name": "gemini-deep-research", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 1048576, + "output": 8192 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, - "attachment": false, - "open_weights": true, - "release_date": "2026-07-02", - "last_updated": "2026-07-02", + "attachment": true, + "open_weights": false, + "release_date": "2025-12-11", + "last_updated": "2025-12-11", "type": "chat" }, { - "id": "publicai/apertus-8b-instruct", - "name": "Apertus 8B Instruct", - "display_name": "Apertus 8B Instruct", + "id": "google/imagen-4", + "name": "Imagen-4", + "display_name": "Imagen-4", "modalities": { "input": [ "text" ], "output": [ - "text" + "image" ] }, "limit": { - "context": 65536, + "context": 480, "output": 8192 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": false }, "attachment": false, - "open_weights": true, - "knowledge": "2025-09", - "release_date": "2025-09-02", - "last_updated": "2025-09-02", - "type": "chat" + "open_weights": false, + "release_date": "2025-05-22", + "last_updated": "2025-05-22" }, { - "id": "publicai/apertus-70b-instruct", - "name": "Apertus 70B Instruct", - "display_name": "Apertus 70B Instruct", + "id": "google/veo-3", + "name": "Veo-3", + "display_name": "Veo-3", "modalities": { "input": [ "text" ], "output": [ - "text" + "video" ] }, "limit": { - "context": 65536, + "context": 480, "output": 8192 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": false }, "attachment": false, - "open_weights": true, - "knowledge": "2025-09", - "release_date": "2025-09-02", - "last_updated": "2025-09-02", - "type": "chat" + "open_weights": false, + "release_date": "2025-05-21", + "last_updated": "2025-05-21" }, { - "id": "thinkingmachines/inkling-small", - "name": "Inkling Small", - "display_name": "Inkling Small", + "id": "google/gemini-2.0-flash", + "name": "Gemini-2.0-Flash", + "display_name": "Gemini-2.0-Flash", "modalities": { "input": [ "text", "image", + "video", "audio" ], "output": [ @@ -199301,41 +191471,30 @@ ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 990000, + "output": 8192 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "minimal", - "low", - "medium", - "high", - "xhigh" - ] - } + "supported": false }, "attachment": true, - "open_weights": true, - "release_date": "2026-07-30", - "last_updated": "2026-07-30", + "open_weights": false, + "knowledge": "2024-06", + "release_date": "2024-12-11", + "last_updated": "2024-12-11", "type": "chat" }, { - "id": "thinkingmachines/inkling", - "name": "Inkling", - "display_name": "Inkling", + "id": "google/gemini-3.1-flash-lite", + "name": "Gemini-3.1-Flash-Lite", + "display_name": "Gemini-3.1-Flash-Lite", "modalities": { "input": [ "text", "image", + "video", "audio" ], "output": [ @@ -199343,8 +191502,8 @@ ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -199354,173 +191513,148 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ - "none", "minimal", "low", - "medium", - "high", - "xhigh" + "high" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-07-15", - "last_updated": "2026-07-15", + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2026-05-07", + "last_updated": "2026-05-07", "type": "chat" }, { - "id": "perplexity/sonar-deep-research", - "name": "Sonar Deep Research", - "display_name": "Sonar Deep Research", + "id": "google/nano-banana-pro", + "name": "Nano-Banana-Pro", + "display_name": "Nano-Banana-Pro", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ - "text" + "image" ] }, "limit": { - "context": 128000, - "output": 32768 + "context": 65536, + "output": 8192 }, "temperature": false, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": false, + "attachment": true, "open_weights": false, "knowledge": "2025-01", - "release_date": "2025-02-01", - "last_updated": "2025-09-01", - "type": "chat" - } - ] - }, - "modelscope": { - "id": "modelscope", - "name": "ModelScope", - "display_name": "ModelScope", - "api": "https://api-inference.modelscope.cn/v1", - "doc": "https://modelscope.cn/docs/model-service/API-Inference/intro", - "models": [ + "release_date": "2025-11-20", + "last_updated": "2025-11-20" + }, { - "id": "Qwen/Qwen3-30B-A3B-Thinking-2507", - "name": "Qwen3 30B A3B Thinking 2507", - "display_name": "Qwen3 30B A3B Thinking 2507", + "id": "google/lyria", + "name": "Lyria", + "display_name": "Lyria", "modalities": { "input": [ "text" ], "output": [ - "text" + "audio" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 8192, + "output": 8192 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-07-30", - "last_updated": "2025-07-30", + "open_weights": false, + "release_date": "2025-06-04", + "last_updated": "2025-06-04", "type": "chat" }, { - "id": "Qwen/Qwen3-30B-A3B-Instruct-2507", - "name": "Qwen3 30B A3B Instruct 2507", - "display_name": "Qwen3 30B A3B Instruct 2507", + "id": "google/imagen-4-ultra", + "name": "Imagen-4-Ultra", + "display_name": "Imagen-4-Ultra", "modalities": { "input": [ "text" ], "output": [ - "text" + "image" ] }, "limit": { - "context": 262144, - "output": 16384 + "context": 480, + "output": 8192 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": false }, "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-07-28", - "last_updated": "2025-07-28", - "type": "chat" + "open_weights": false, + "release_date": "2025-05-24", + "last_updated": "2025-05-24" }, { - "id": "Qwen/Qwen3-Coder-30B-A3B-Instruct", - "name": "Qwen3 Coder 30B A3B Instruct", - "display_name": "Qwen3 Coder 30B A3B Instruct", + "id": "google/veo-3-fast", + "name": "Veo-3-Fast", + "display_name": "Veo-3-Fast", "modalities": { "input": [ "text" ], "output": [ - "text" + "video" ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 480, + "output": 8192 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": false }, "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-07-31", - "last_updated": "2025-07-31", - "type": "chat" + "open_weights": false, + "release_date": "2025-10-13", + "last_updated": "2025-10-13" }, { - "id": "Qwen/Qwen3-235B-A22B-Thinking-2507", - "name": "Qwen3-235B-A22B-Thinking-2507", - "display_name": "Qwen3-235B-A22B-Thinking-2507", + "id": "google/gemini-2.5-flash", + "name": "Gemini-2.5-Flash", + "display_name": "Gemini-2.5-Flash", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 131072 + "context": 1065535, + "output": 65535 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -199529,136 +191663,161 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": true, + "mode": "budget", + "budget": { + "default": -1, + "min": 0, + "max": 24576, + "auto": -1, + "off": 0, + "unit": "tokens" + }, "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" + "thought_signatures" ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-07-25", - "last_updated": "2025-07-25", + "attachment": true, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2025-06-17", + "last_updated": "2025-06-17", "type": "chat" }, { - "id": "Qwen/Qwen3-235B-A22B-Instruct-2507", - "name": "Qwen3 235B A22B Instruct 2507", - "display_name": "Qwen3 235B A22B Instruct 2507", + "id": "google/gemini-omni-1.1-flash", + "name": "Gemini-Omni-1.1-Flash", + "display_name": "Gemini-Omni-1.1-Flash", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ + "video" + ] + }, + "limit": { + "context": 131072, + "output": 57920 + }, + "temperature": false, + "tool_call": false, + "reasoning": { + "supported": true, + "default": true + }, + "attachment": true, + "open_weights": false, + "release_date": "2026-08-27", + "last_updated": "2026-08-27" + }, + { + "id": "google/veo-3.1", + "name": "Veo-3.1", + "display_name": "Veo-3.1", + "modalities": { + "input": [ "text" + ], + "output": [ + "video" ] }, "limit": { - "context": 262144, - "output": 131072 + "context": 480, + "output": 8192 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": false }, "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-07-21", - "last_updated": "2025-07-21", - "type": "chat" + "open_weights": false, + "release_date": "2025-10-15", + "last_updated": "2025-10-15" }, { - "id": "ZhipuAI/GLM-4.6", - "name": "GLM-4.6", - "display_name": "GLM-4.6", + "id": "google/nano-banana", + "name": "Nano-Banana", + "display_name": "Nano-Banana", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ - "text" + "text", + "image" ] }, "limit": { - "context": 202752, - "output": 98304 + "context": 65536, + "output": 8192 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-07", - "release_date": "2025-09-30", - "last_updated": "2025-09-30", - "type": "chat" + "attachment": true, + "open_weights": false, + "knowledge": "2024-06", + "release_date": "2025-08-26", + "last_updated": "2025-08-26" }, { - "id": "ZhipuAI/GLM-4.5", - "name": "GLM-4.5", - "display_name": "GLM-4.5", + "id": "google/gemma-4-31b", + "name": "Gemma-4-31B", + "display_name": "Gemma-4-31B", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 98304 + "context": 262144, + "output": 8192 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-07-28", - "last_updated": "2025-07-28", + "knowledge": "2025-01", + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" - } - ] - }, - "tencent-token-plan": { - "id": "tencent-token-plan", - "name": "Tencent Token Plan", - "display_name": "Tencent Token Plan", - "api": "https://api.lkeap.cloud.tencent.com/plan/v3", - "doc": "https://cloud.tencent.com/document/product/1823/130060", - "models": [ + }, { - "id": "hy3", - "name": "Hy3", - "display_name": "Hy3", + "id": "google/gemini-3.7-flash", + "name": "Gemini-3.7-Flash", + "display_name": "Gemini-3.7-Flash", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 128000 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -199669,25 +191828,39 @@ "extra_capabilities": { "reasoning": { "supported": true, - "effort_options": [ - "none", + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", + "low", + "medium", "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-07-06", - "last_updated": "2026-07-06", + "attachment": true, + "open_weights": false, + "knowledge": "2026-03", + "release_date": "2026-08-13", + "last_updated": "2026-08-13", "type": "chat" }, { - "id": "hy4-preview", - "name": "Hy4 preview", - "display_name": "Hy4 preview", + "id": "google/gemini-2.5-flash-lite", + "name": "Gemini-2.5-Flash-Lite", + "display_name": "Gemini-2.5-Flash-Lite", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio" ], "output": [ "text" @@ -199697,45 +191870,46 @@ "context": 1024000, "output": 64000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "effort_options": [ - "none", - "high" + "default_enabled": false, + "mode": "budget", + "budget": { + "default": -1, + "min": 512, + "max": 24576, + "auto": -1, + "unit": "tokens" + }, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-08-28", - "last_updated": "2026-08-28", + "attachment": true, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2025-06-17", + "last_updated": "2025-06-17", "type": "chat" - } - ] - }, - "boundless": { - "id": "boundless", - "name": "Boundless", - "display_name": "Boundless", - "api": "https://api.inference.boundless.network/v1", - "doc": "https://inference.boundless.network/models", - "models": [ + }, { - "id": "mimo-v2.6-pro", - "name": "MiMo-V2.6-Pro", - "display_name": "MiMo-V2.6-Pro", + "id": "google/gemini-3.5-flash", + "name": "Gemini-3.5-Flash", + "display_name": "Gemini-3.5-Flash", "modalities": { "input": [ "text", "image", - "audio", "video" ], "output": [ @@ -199744,7 +191918,7 @@ }, "limit": { "context": 1048576, - "output": 131072 + "output": 65536 }, "temperature": true, "tool_call": true, @@ -199752,119 +191926,104 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", + "low", + "medium", + "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] + } + }, "attachment": true, - "open_weights": true, - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2026-05-19", + "last_updated": "2026-05-19", "type": "chat" }, { - "id": "gpt-5.6-sol", - "name": "GPT-5.6 Sol", - "display_name": "GPT-5.6 Sol", + "id": "google/imagen-4-fast", + "name": "Imagen-4-Fast", + "display_name": "Imagen-4-Fast", "modalities": { "input": [ "text" ], "output": [ - "text" + "image" ] }, "limit": { - "context": 262144, - "output": 128000 + "context": 480, + "output": 8192 }, "temperature": false, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, "attachment": false, "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", - "type": "chat" + "release_date": "2025-06-25", + "last_updated": "2025-06-25" }, { - "id": "nemotron3-super", - "name": "Nemotron 3 Super 120B A12B", - "display_name": "Nemotron 3 Super 120B A12B", + "id": "google/veo-2", + "name": "Veo-2", + "display_name": "Veo-2", "modalities": { "input": [ "text" ], "output": [ - "text" + "video" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 480, + "output": 8192 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "low", - "medium" - ] - } + "supported": false }, "attachment": false, - "open_weights": true, - "knowledge": "2025-06", - "release_date": "2026-03-11", - "last_updated": "2026-03-11", - "type": "chat" + "open_weights": false, + "release_date": "2024-12-02", + "last_updated": "2024-12-02" }, { - "id": "gpt-5.6-luna", - "name": "GPT-5.6 Luna", - "display_name": "GPT-5.6 Luna", + "id": "google/gemini-3.8-flash", + "name": "Gemini-3.8-Flash", + "display_name": "Gemini-3.8-Flash", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 128000 + "context": 1048576, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -199874,39 +192033,37 @@ "reasoning": { "supported": true, "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ], - "verbosity": "medium", - "verbosity_options": [ + "mode": "level", + "level": "high", + "level_options": [ + "minimal", "low", "medium", "high" ], - "visibility": "hidden" + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] } }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "release_date": "2026-09-02", + "last_updated": "2026-09-02", "type": "chat" }, { - "id": "deepseek-v4-pro-0813", - "name": "DeepSeek V4 Pro 0813", - "display_name": "DeepSeek V4 Pro 0813", + "id": "google/gemini-3.1-pro", + "name": "Gemini-3.1-Pro", + "display_name": "Gemini-3.1-Pro", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio" ], "output": [ "text" @@ -199914,7 +192071,7 @@ }, "limit": { "context": 1048576, - "output": 384000 + "output": 65536 }, "temperature": true, "tool_call": true, @@ -199925,37 +192082,47 @@ "extra_capabilities": { "reasoning": { "supported": true, - "effort_options": [ - "none", + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ "low", "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-08-13", - "last_updated": "2026-08-22", + "attachment": true, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2026-02-19", + "last_updated": "2026-02-19", "type": "chat" }, { - "id": "gpt-6-sol", - "name": "GPT-6 Sol", - "display_name": "GPT-6 Sol", + "id": "google/gemini-3.6-flash", + "name": "Gemini-3.6-Flash", + "display_name": "Gemini-3.6-Flash", "modalities": { "input": [ "text", - "image" + "image", + "video", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1048576, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -199963,113 +192130,152 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "none", + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", "low", "medium", "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-04-20", - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "knowledge": "2026-03", + "release_date": "2026-07-21", + "last_updated": "2026-07-21", "type": "chat" }, { - "id": "glm-5.3", - "name": "GLM-5.3", - "display_name": "GLM-5.3", + "id": "elevenlabs/elevenlabs-music", + "name": "ElevenLabs-Music", + "display_name": "ElevenLabs-Music", "modalities": { "input": [ "text" ], "output": [ - "text" + "audio" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 2000, + "output": 8192 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "low", - "high" - ] - } + "supported": false }, "attachment": false, - "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "open_weights": false, + "release_date": "2025-08-29", + "last_updated": "2025-08-29", "type": "chat" }, { - "id": "claude-opus-5.5", - "name": "Claude Opus 5.5", - "display_name": "Claude Opus 5.5", + "id": "elevenlabs/elevenlabs-v3", + "name": "ElevenLabs-v3", + "display_name": "ElevenLabs-v3", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ - "text" + "audio" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 128000, + "output": 8192 }, "temperature": false, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high" - ] - } + "attachment": false, + "open_weights": false, + "release_date": "2025-08-20", + "last_updated": "2025-08-20" + }, + { + "id": "elevenlabs/elevenlabs-v2.5-turbo", + "name": "ElevenLabs-v2.5-Turbo", + "display_name": "ElevenLabs-v2.5-Turbo", + "modalities": { + "input": [ + "text" + ], + "output": [ + "audio" + ] }, - "attachment": true, + "limit": { + "context": 128000, + "output": 8192 + }, + "temperature": false, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": false, "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "release_date": "2024-07-19", + "last_updated": "2024-07-19" + }, + { + "id": "cerebras/llama-3.1-8b-cs", + "name": "Llama-3.1-8B-CS", + "display_name": "Llama-3.1-8B-CS", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 128000, + "output": 8192 + }, + "temperature": false, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "knowledge": "2023-12", + "release_date": "2024-07-23", + "last_updated": "2024-07-23", "type": "chat" }, { - "id": "kimi-k3", - "name": "Kimi K3", - "display_name": "Kimi K3", + "id": "cerebras/qwen3-235b-2507-cs", + "name": "qwen3-235b-2507-cs", + "display_name": "qwen3-235b-2507-cs", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 8192, + "output": 8192 }, "temperature": false, "tool_call": true, @@ -200077,26 +192283,16 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "none", - "low", - "high" - ] - } - }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-16", + "release_date": "2025-07-21", + "last_updated": "2025-07-21", "type": "chat" }, { - "id": "claude-fable-5.1", - "name": "Claude Fable 5.1", - "display_name": "Claude Fable 5.1", + "id": "cerebras/qwen3-32b-cs", + "name": "qwen3-32b-cs", + "display_name": "qwen3-32b-cs", "modalities": { "input": [ "text" @@ -200106,8 +192302,8 @@ ] }, "limit": { - "context": 262144, - "output": 128000 + "context": 8192, + "output": 8192 }, "temperature": false, "tool_call": true, @@ -200115,43 +192311,45 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", - "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", - "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." - ] - } + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-04-28", + "last_updated": "2025-04-28", + "type": "chat" + }, + { + "id": "cerebras/llama-3.3-70b-cs", + "name": "llama-3.3-70b-cs", + "display_name": "llama-3.3-70b-cs", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 8192, + "output": 8192 + }, + "temperature": false, + "tool_call": false, + "reasoning": { + "supported": false }, "attachment": false, - "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-09-01", - "last_updated": "2026-09-01", + "open_weights": true, + "knowledge": "2023-12", + "release_date": "2024-12-06", + "last_updated": "2024-12-06", "type": "chat" }, { - "id": "claude-opus-5", - "name": "Claude Opus 5", - "display_name": "Claude Opus 5", + "id": "cerebras/gpt-oss-120b-cs", + "name": "GPT-OSS-120B-CS", + "display_name": "GPT-OSS-120B-CS", "modalities": { "input": [ "text" @@ -200161,8 +192359,8 @@ ] }, "limit": { - "context": 262144, - "output": 128000 + "context": 128000, + "output": 8192 }, "temperature": false, "tool_call": true, @@ -200172,9 +192370,7 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ - "none", "low", "medium", "high" @@ -200182,16 +192378,25 @@ } }, "attachment": false, - "open_weights": false, - "knowledge": "2026-05", - "release_date": "2026-07-24", - "last_updated": "2026-07-24", + "open_weights": true, + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" - }, + } + ] + }, + "volcengine-coding-plan": { + "id": "volcengine-coding-plan", + "name": "Volcengine Ark Coding Plan", + "display_name": "Volcengine Ark Coding Plan", + "api": "https://ark.cn-beijing.volces.com/api/coding/v3", + "doc": "https://www.volcengine.com/docs/82379/1928261", + "models": [ { - "id": "glm-5.2", - "name": "GLM-5.2", - "display_name": "GLM-5.2", + "id": "deepseek-v4-flash", + "name": "DeepSeek V4 Flash", + "display_name": "DeepSeek V4 Flash", "modalities": { "input": [ "text" @@ -200201,8 +192406,8 @@ ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 1000000, + "output": 384000 }, "temperature": true, "tool_call": true, @@ -200213,34 +192418,47 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", "effort_options": [ - "none", - "high" + "low", + "high", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, "attachment": false, "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "deepseek-v4.1-flash", - "name": "DeepSeek V4.1 Flash", - "display_name": "DeepSeek V4.1 Flash", + "id": "glm-5.3", + "name": "GLM-5.3", + "display_name": "GLM-5.3", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 384000 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -200251,24 +192469,29 @@ "extra_capabilities": { "reasoning": { "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ - "none", "low", - "high" + "high", + "max" ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-09-10", - "last_updated": "2026-09-10", + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "minimax-m3", - "name": "MiniMax-M3", - "display_name": "MiniMax-M3", + "id": "doubao-seed-2.1-turbo", + "name": "Seed 2.1 Turbo", + "display_name": "Seed 2.1 Turbo", "modalities": { "input": [ "text", @@ -200280,8 +192503,8 @@ ] }, "limit": { - "context": 1048576, - "output": 512000 + "context": 256000, + "output": 256000 }, "temperature": true, "tool_call": true, @@ -200291,19 +192514,30 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "none", + "low", + "high" + ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-06-01", - "last_updated": "2026-06-01", + "open_weights": false, + "release_date": "2026-06-23", + "last_updated": "2026-06-23", "type": "chat" }, { - "id": "glm-5.3-flash", - "name": "GLM-5.3-Flash", - "display_name": "GLM-5.3-Flash", + "id": "doubao-seed-2.0-lite", + "name": "Seed 2.0 Lite", + "display_name": "Seed 2.0 Lite", "modalities": { "input": [ "text", @@ -200315,8 +192549,8 @@ ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 256000, + "output": 32000 }, "temperature": true, "tool_call": true, @@ -200327,34 +192561,42 @@ "extra_capabilities": { "reasoning": { "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ + "none", "low", "high" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", + "open_weights": false, + "release_date": "2026-02-14", + "last_updated": "2026-02-14", "type": "chat" }, { - "id": "gpt-6-luna", - "name": "GPT-6 Luna", - "display_name": "GPT-6 Luna", + "id": "kimi-k2.7-code", + "name": "Kimi K2.7 Code", + "display_name": "Kimi K2.7 Code", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 262144, + "output": 262144 }, "temperature": false, "tool_call": true, @@ -200364,30 +192606,30 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "high" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-05-18", - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-06-12", + "last_updated": "2026-06-12", "type": "chat" }, { - "id": "mimo-v2.6-flash", - "name": "MiMo-V2.6-Flash", - "display_name": "MiMo-V2.6-Flash", + "id": "minimax-m3", + "name": "MiniMax-M3", + "display_name": "MiniMax-M3", "modalities": { "input": [ "text", "image", - "audio", "video" ], "output": [ @@ -200396,36 +192638,7 @@ }, "limit": { "context": 1048576, - "output": 131072 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "attachment": true, - "open_weights": true, - "release_date": "2026-09-22", - "last_updated": "2026-09-22", - "type": "chat" - }, - { - "id": "qwen3.8-flash", - "name": "Qwen3.8 Flash", - "display_name": "Qwen3.8 Flash", - "modalities": { - "input": [ - "text", - "image" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 1000000, - "output": 131072 + "output": 512000 }, "temperature": true, "tool_call": true, @@ -200436,22 +192649,24 @@ "extra_capabilities": { "reasoning": { "supported": true, - "effort_options": [ - "low", - "medium" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, "attachment": true, - "open_weights": false, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", + "open_weights": true, + "release_date": "2026-06-01", + "last_updated": "2026-06-01", "type": "chat" }, { - "id": "dsv4", - "name": "DeepSeek V4 Flash 0731", - "display_name": "DeepSeek V4 Flash 0731", + "id": "deepseek-v4-pro", + "name": "DeepSeek V4 Pro", + "display_name": "DeepSeek V4 Pro", "modalities": { "input": [ "text" @@ -200461,7 +192676,7 @@ ] }, "limit": { - "context": 1048576, + "context": 1000000, "output": 384000 }, "temperature": true, @@ -200472,36 +192687,50 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", "effort_options": [ - "none", "low", - "high" + "high", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, "attachment": false, "open_weights": true, "knowledge": "2025-05", - "release_date": "2026-07-31", - "last_updated": "2026-07-31", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "qwen3.6", - "name": "Qwen3.6 35B-A3B", - "display_name": "Qwen3.6 35B-A3B", + "id": "doubao-seed-evolving", + "name": "Seed Evolving", + "display_name": "Seed Evolving", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 256000, + "output": 256000 }, "temperature": true, "tool_call": true, @@ -200509,32 +192738,37 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "none", + "low", + "high" + ] + } + }, "attachment": true, - "open_weights": true, - "release_date": "2026-04-17", - "last_updated": "2026-04-17", + "open_weights": false, + "release_date": "2026-06-23", + "last_updated": "2026-06-23", "type": "chat" - } - ] - }, - "bothub": { - "id": "bothub", - "name": "Bothub", - "display_name": "Bothub", - "api": "https://openai.bothub.ru/v1", - "doc": "https://bothub.ru/models", - "models": [ + }, { - "id": "muse-spark-1.3-contributor", - "name": "Muse Spark 1.3 Contributor", - "display_name": "Muse Spark 1.3 Contributor", + "id": "kimi-k3", + "name": "Kimi K3", + "display_name": "Kimi K3", "modalities": { "input": [ "text", "image", - "video", - "pdf", - "audio" + "video" ], "output": [ "text" @@ -200542,9 +192776,9 @@ }, "limit": { "context": 1048576, - "output": 943718 + "output": 131072 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -200554,29 +192788,33 @@ "reasoning": { "supported": true, "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ - "minimal", "low", - "medium", "high", - "xhigh" + "max" ] } }, "attachment": true, - "open_weights": false, - "release_date": "2026-09-02", - "last_updated": "2026-09-02", + "open_weights": true, + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" }, { - "id": "gpt-5.6-luna", - "name": "GPT-5.6 Luna", - "display_name": "GPT-5.6 Luna", + "id": "glm-5.3-flash", + "name": "GLM-5.3-Flash", + "display_name": "GLM-5.3-Flash", "modalities": { "input": [ "text", "image", + "video", "pdf" ], "output": [ @@ -200584,10 +192822,10 @@ ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1000000, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -200596,38 +192834,38 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ - "none", "low", - "medium", "high", - "xhigh", "max" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "interleaved": true, - "visibility": "hidden" + ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "open_weights": true, + "release_date": "2026-08-26", + "last_updated": "2026-08-26", "type": "chat" - }, + } + ] + }, + "lmstudio": { + "id": "lmstudio", + "name": "LMStudio", + "display_name": "LMStudio", + "api": "http://127.0.0.1:1234/v1", + "doc": "https://lmstudio.ai/models", + "models": [ { - "id": "deepseek-v4-pro-0813", - "name": "DeepSeek V4 Pro 0813", - "display_name": "DeepSeek V4 Pro 0813", + "id": "openai/gpt-oss-20b", + "name": "GPT OSS 20B", + "display_name": "GPT OSS 20B", "modalities": { "input": [ "text" @@ -200637,8 +192875,8 @@ ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 131072, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -200649,28 +192887,27 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, "effort_options": [ - "none", - "high", - "max" + "low", + "medium", + "high" ] } }, "attachment": false, "open_weights": true, - "release_date": "2026-08-13", - "last_updated": "2026-08-22", + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "gemma-4-31b-it:free", - "name": "Gemma 4 31B IT (free)", - "display_name": "Gemma 4 31B IT (free)", + "id": "qwen/qwen3-30b-a3b-2507", + "name": "Qwen3 30B A3B 2507", + "display_name": "Qwen3 30B A3B 2507", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" @@ -200678,31 +192915,24 @@ }, "limit": { "context": 262144, - "output": 32768 + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "knowledge": "2025-04", + "release_date": "2025-07-28", + "last_updated": "2025-07-28", "type": "chat" }, { - "id": "glm-5.3", - "name": "GLM-5.3", - "display_name": "GLM-5.3", + "id": "qwen/qwen3-coder-30b", + "name": "Qwen3 Coder 30B", + "display_name": "Qwen3 Coder 30B", "modalities": { "input": [ "text" @@ -200712,36 +192942,34 @@ ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 262144, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "effort_options": [ - "low", - "high", - "max" - ] - } + "supported": false }, "attachment": false, "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "knowledge": "2025-04", + "release_date": "2025-07-31", + "last_updated": "2025-07-31", "type": "chat" - }, + } + ] + }, + "ambient": { + "id": "ambient", + "name": "Ambient", + "display_name": "Ambient", + "api": "https://api.ambient.xyz/v1", + "doc": "https://ambient.xyz", + "models": [ { - "id": "deepseek-v4-flash-0731", - "name": "DeepSeek V4 Flash 0731", - "display_name": "DeepSeek V4 Flash 0731", + "id": "z-ai/glm-5.2", + "name": "GLM-5.2", + "display_name": "GLM-5.2", "modalities": { "input": [ "text" @@ -200751,8 +192979,8 @@ ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 202752, + "output": 202752 }, "temperature": true, "tool_call": true, @@ -200763,10 +192991,7 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, "effort_options": [ - "none", - "low", "high", "max" ] @@ -200774,29 +192999,25 @@ }, "attachment": false, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-07-31", - "last_updated": "2026-07-31", + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "glm-5.3-flash", - "name": "GLM-5.3-Flash", - "display_name": "GLM-5.3-Flash", + "id": "ambient/large", + "name": "Ambient Large", + "display_name": "Ambient Large", "modalities": { "input": [ - "text", - "image", - "video", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 202752, + "output": 202752 }, "temperature": true, "tool_call": true, @@ -200806,25 +193027,22 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, "effort_options": [ - "low", "high", "max" ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "nemotron-3-ultra-550b-a55b:free", - "name": "Nemotron 3 Ultra (free)", - "display_name": "Nemotron 3 Ultra (free)", + "id": "ambient/small", + "name": "Ambient Small", + "display_name": "Ambient Small", "modalities": { "input": [ "text" @@ -200834,164 +193052,100 @@ ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 101072, + "output": 101072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "effort_options": [ - "none", - "medium", - "high" - ] - } + "supported": false }, "attachment": false, "open_weights": true, - "knowledge": "2025-09", - "release_date": "2026-06-04", - "last_updated": "2026-06-04", + "release_date": "2026-10-13", + "last_updated": "2026-10-13", "type": "chat" - } - ] - }, - "qihang-ai": { - "id": "qihang-ai", - "name": "QiHang", - "display_name": "QiHang", - "api": "https://api.qhaigc.net/v1", - "doc": "https://www.qhaigc.net/docs", - "models": [ + }, { - "id": "gpt-5.2", - "name": "GPT-5.2", - "display_name": "GPT-5.2", + "id": "unsloth/qwen3.8-27b-gguf", + "name": "qwen3.8-27b-4q", + "display_name": "qwen3.8-27b-4q", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 101072, + "output": 101072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2025-12-11", - "last_updated": "2025-12-11", + "attachment": false, + "open_weights": true, + "release_date": "2026-10-13", + "last_updated": "2026-10-13", "type": "chat" }, { - "id": "claude-haiku-4-5-20251001", - "name": "Claude Haiku 4.5", - "display_name": "Claude Haiku 4.5", + "id": "zai-org/GLM-5.2-FP8", + "name": "GLM-5.2", + "display_name": "GLM-5.2", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 202752, + "output": 202752 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + "effort_options": [ + "high", + "max" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-07-31", - "release_date": "2025-10-15", - "last_updated": "2025-10-15", + "attachment": false, + "open_weights": true, + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "gpt-5.2-codex", - "name": "GPT-5.2 Codex", - "display_name": "GPT-5.2 Codex", + "id": "minimax/minimax-m3", + "name": "MiniMax-M3", + "display_name": "MiniMax-M3", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 131072, + "output": 131702 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -200999,100 +193153,57 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "supported": true } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2025-12-11", - "last_updated": "2025-12-11", + "attachment": false, + "open_weights": true, + "release_date": "2026-06-01", + "last_updated": "2026-06-01", "type": "chat" }, { - "id": "gemini-3-pro-preview", - "name": "Gemini 3 Pro Preview", - "display_name": "Gemini 3 Pro Preview", + "id": "qwen/qwen3-30b-a3b-instruct-2507", + "name": "Qwen3 30B-A3B Instruct 2507", + "display_name": "Qwen3 30B-A3B Instruct 2507", "modalities": { "input": [ - "text", - "image", - "audio", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 65000 + "context": 131072, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "low", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-11", - "release_date": "2025-11-18", - "last_updated": "2025-11-18", + "attachment": false, + "open_weights": true, + "release_date": "2025-07-28", + "last_updated": "2025-07-28", "type": "chat" }, { - "id": "gemini-2.5-flash", - "name": "Gemini 2.5 Flash", - "display_name": "Gemini 2.5 Flash", + "id": "qwen/qwen3.6-27b", + "name": "Qwen3.6 27B", + "display_name": "Qwen3.6 27B", "modalities": { "input": [ - "text", - "image", - "audio", - "video", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 32768, + "output": 8192 }, "temperature": true, "tool_call": true, @@ -201103,91 +193214,63 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "budget", - "budget": { - "default": -1, - "min": 0, - "max": 24576, - "auto": -1, - "off": 0, - "unit": "tokens" - }, + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-06-17", - "last_updated": "2025-06-17", + "attachment": false, + "open_weights": true, + "release_date": "2026-04-22", + "last_updated": "2026-04-22", "type": "chat" }, { - "id": "claude-opus-4-5-20251101", - "name": "Claude Opus 4.5", - "display_name": "Claude Opus 4.5", + "id": "qwen/qwen3.6-35b-a3b", + "name": "Qwen3.6 35B-A3B", + "display_name": "Qwen3.6 35B-A3B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 32000 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high" - ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-03", - "release_date": "2025-11-24", - "last_updated": "2025-11-24", + "attachment": false, + "open_weights": true, + "release_date": "2026-04-17", + "last_updated": "2026-04-17", "type": "chat" }, { - "id": "gpt-5-mini", - "name": "GPT-5-Mini", - "display_name": "GPT-5-Mini", + "id": "qwen/qwen3.8-27b", + "name": "Qwen3.8 27B", + "display_name": "Qwen3.8 27B", "modalities": { "input": [ "text", @@ -201198,10 +193281,10 @@ ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 32768, + "output": 8192 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -201209,51 +193292,44 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", "effort_options": [ - "minimal", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ "low", "medium", - "high" - ], - "visibility": "hidden" + "xhigh" + ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "open_weights": true, + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" - }, + } + ] + }, + "kosmik": { + "id": "kosmik", + "name": "Kosmik Compute", + "display_name": "Kosmik Compute", + "api": "https://api.koscompute.com/v1", + "doc": "https://api.koscompute.com/docs/", + "models": [ { - "id": "gemini-3-flash-preview", - "name": "Gemini 3 Flash Preview", - "display_name": "Gemini 3 Flash Preview", + "id": "qwen/qwen3.8-27b", + "name": "Qwen3.8 27B", + "display_name": "Qwen3.8 27B", "modalities": { "input": [ "text", - "image", - "video", - "audio", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 262144, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -201264,162 +193340,102 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", - "low", - "medium", - "high" - ], + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" + ], + "effort_options": [ + "none", + "low", + "medium", + "xhigh" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-12-17", - "last_updated": "2025-12-17", + "open_weights": true, + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" - }, + } + ] + }, + "stepfun": { + "id": "stepfun", + "name": "StepFun (China)", + "display_name": "StepFun (China)", + "api": "https://api.stepfun.com/v1", + "doc": "https://platform.stepfun.com/docs/zh/overview/concept", + "models": [ { - "id": "claude-sonnet-4-5-20250929", - "name": "Claude Sonnet 4.5", - "display_name": "Claude Sonnet 4.5", + "id": "step-tts-2", + "name": "Step TTS 2", + "display_name": "Step TTS 2", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ - "text" + "audio" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 8192, + "output": 8192 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." - ] - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-07-31", - "release_date": "2025-09-29", - "last_updated": "2025-09-29", - "type": "chat" - } - ] - }, - "zeldoc": { - "id": "zeldoc", - "name": "Zeldoc", - "display_name": "Zeldoc", - "api": "https://api.zeldoc.ai/v1", - "doc": "https://docs.zeldoc.ai", - "models": [ + "release_date": "2026-03-01", + "last_updated": "2026-07-02" + }, { - "id": "zdev", - "name": "ZDev", - "display_name": "ZDev", + "id": "stepaudio-2.5-asr", + "name": "StepAudio 2.5 ASR", + "display_name": "StepAudio 2.5 ASR", "modalities": { "input": [ - "text", - "image" + "audio" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 8192, + "output": 8192 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "low", - "high", - "max" - ] - } + "supported": false }, - "attachment": true, - "open_weights": false, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", - "type": "chat" - } - ] - }, - "aiand": { - "id": "aiand", - "name": "ai&", - "display_name": "ai&", - "api": "https://api.aiand.com/v1", - "doc": "https://docs.aiand.com/", - "models": [ + "attachment": true, + "open_weights": false, + "release_date": "2026-04-24", + "last_updated": "2026-07-02" + }, { - "id": "google/gemma-4-31b-it", - "name": "Gemma 4 31B IT", - "display_name": "Gemma 4 31B IT", + "id": "step-3.5-flash-2603", + "name": "Step 3.5 Flash 2603", + "display_name": "Step 3.5 Flash 2603", "modalities": { "input": [ - "text", - "image", - "video", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 256000, + "output": 256000 }, "temperature": true, "tool_call": true, @@ -201437,12 +193453,12 @@ "thinking_blocks" ], "effort_options": [ - "none", + "low", "high" ] } }, - "attachment": true, + "attachment": false, "open_weights": true, "knowledge": "2025-01", "release_date": "2026-04-02", @@ -201450,22 +193466,22 @@ "type": "chat" }, { - "id": "moonshotai/kimi-k2.7-code", - "name": "Kimi K2.7 Code", - "display_name": "Kimi K2.7 Code", + "id": "step-5-preview", + "name": "Step 5 Preview", + "display_name": "Step 5 Preview", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1000000, + "output": 384000 }, "temperature": true, "tool_call": true, @@ -201476,41 +193492,70 @@ "extra_capabilities": { "reasoning": { "supported": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high" + ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "effort_options": [ - "high" ] } }, "attachment": true, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-06-12", - "last_updated": "2026-06-12", + "release_date": "2026-09-16", + "last_updated": "2026-09-20", "type": "chat" }, { - "id": "moonshotai/kimi-k3", - "name": "Kimi K3", - "display_name": "Kimi K3", + "id": "stepaudio-2.5-tts", + "name": "StepAudio 2.5 TTS", + "display_name": "StepAudio 2.5 TTS", + "modalities": { + "input": [ + "text" + ], + "output": [ + "audio" + ] + }, + "limit": { + "context": 8192, + "output": 8192 + }, + "temperature": false, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": false, + "release_date": "2026-04-16", + "last_updated": "2026-07-02" + }, + { + "id": "step-3.7-flash", + "name": "Step 3.7 Flash", + "display_name": "Step 3.7 Flash", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 256000, + "output": 256000 }, "temperature": true, "tool_call": true, @@ -201529,21 +193574,22 @@ ], "effort_options": [ "low", - "high", - "max" + "medium", + "high" ] } }, "attachment": true, "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-16", + "knowledge": "2026-03-01", + "release_date": "2026-05-29", + "last_updated": "2026-05-29", "type": "chat" }, { - "id": "motif-technologies/motif-3", - "name": "Motif 3", - "display_name": "Motif 3", + "id": "step-3.5-flash", + "name": "Step 3.5 Flash", + "display_name": "Step 3.5 Flash", "modalities": { "input": [ "text" @@ -201553,8 +193599,8 @@ ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 256000, + "output": 256000 }, "temperature": true, "tool_call": true, @@ -201572,48 +193618,83 @@ "thinking_blocks" ], "effort_options": [ - "none", + "low", "high" ] } }, "attachment": false, "open_weights": true, - "release_date": "2026-08-07", - "last_updated": "2026-08-07", + "knowledge": "2025-01", + "release_date": "2026-01-29", + "last_updated": "2026-02-13", "type": "chat" - }, + } + ] + }, + "cortecs": { + "id": "cortecs", + "name": "Cortecs", + "display_name": "Cortecs", + "api": "https://api.cortecs.ai/v1", + "doc": "https://api.cortecs.ai/v1/models", + "models": [ { - "id": "openai/gpt-oss-120b", - "name": "GPT OSS 120B", - "display_name": "GPT OSS 120B", + "id": "gpt-4.1-nano", + "name": "GPT-4.1 nano", + "display_name": "GPT-4.1 nano", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, + "context": 1047576, "output": 32768 }, "temperature": true, "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": false, + "knowledge": "2024-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", + "type": "chat" + }, + { + "id": "gpt-6.1-terra", + "name": "GPT-6.1 Terra", + "display_name": "GPT-6.1 Terra", + "modalities": { + "input": [ + "text", + "image", + "pdf" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1050000, + "output": 128000 + }, + "temperature": false, + "tool_call": true, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ "low", "medium", @@ -201621,30 +193702,32 @@ ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "attachment": true, + "open_weights": false, + "knowledge": "2026-06-01", + "release_date": "2026-10-26", + "last_updated": "2026-10-26", "type": "chat" }, { - "id": "zai-org/glm-5.3", - "name": "GLM-5.3", - "display_name": "GLM-5.3", + "id": "claude-opus-5.5", + "name": "Claude Opus 5.5", + "display_name": "Claude Opus 5.5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -201652,30 +193735,24 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ "low", - "high", - "max" + "medium", + "high" ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "attachment": true, + "open_weights": false, + "knowledge": "2026-06", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "zai-org/glm-5.2", - "name": "GLM-5.2", - "display_name": "GLM-5.2", + "id": "deepseek-v4-flash-0731", + "name": "DeepSeek V4 Flash 0731", + "display_name": "DeepSeek V4 Flash 0731", "modalities": { "input": [ "text" @@ -201686,7 +193763,7 @@ }, "limit": { "context": 1048576, - "output": 131072 + "output": 1048576 }, "temperature": true, "tool_call": true, @@ -201704,27 +193781,55 @@ "thinking_blocks" ], "effort_options": [ - "none", - "high", - "max" + "low", + "medium", + "high" ] } }, "attachment": false, "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "knowledge": "2025-05", + "release_date": "2026-07-31", + "last_updated": "2026-07-31", "type": "chat" }, { - "id": "zai-org/glm-5.3-flash", - "name": "GLM-5.3-Flash", - "display_name": "GLM-5.3-Flash", + "id": "mistral-7b-instruct-v0.2", + "name": "mistral-7b-instruct-v0.2", + "display_name": "mistral-7b-instruct-v0.2", + "modalities": { + "input": [ + "text", + "pdf" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 32000, + "output": 8192 + }, + "temperature": false, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": false, + "release_date": "2025-05-26", + "last_updated": "2025-05-26", + "type": "chat" + }, + { + "id": "claude-opus4-6", + "name": "Claude Opus 4.6", + "display_name": "Claude Opus 4.6", "modalities": { "input": [ "text", "image", - "video", "pdf" ], "output": [ @@ -201732,8 +193837,8 @@ ] }, "limit": { - "context": 1048550, - "output": 131072 + "context": 1000000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -201743,59 +193848,53 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ "low", - "high", - "max" + "medium", + "high" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", + "open_weights": false, + "knowledge": "2025-05-31", + "release_date": "2026-02-05", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "deepseek-ai/deepseek-v4-flash", - "name": "DeepSeek V4 Flash", - "display_name": "DeepSeek V4 Flash", + "id": "claude-haiku-4-5", + "name": "Claude Haiku 4.5 (latest)", + "display_name": "Claude Haiku 4.5 (latest)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 384000 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "high", - "max" - ], + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, "interleaved": true, "summaries": true, "visibility": "summary", @@ -201803,21 +193902,50 @@ "thinking_blocks" ], "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-02-28", + "release_date": "2025-10-15", + "last_updated": "2025-10-15", + "type": "chat" + }, + { + "id": "apertus-70b", + "name": "Apertus 70B", + "display_name": "Apertus 70B", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 65536, + "output": 16384 + }, + "temperature": false, + "tool_call": true, + "reasoning": { + "supported": false + }, "attachment": false, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "knowledge": "2025-09", + "release_date": "2025-09-02", + "last_updated": "2025-09-02", "type": "chat" }, { - "id": "deepseek-ai/deepseek-v4-pro", - "name": "DeepSeek V4 Pro", - "display_name": "DeepSeek V4 Pro", + "id": "qwen3-coder-next", + "name": "Qwen3 Coder Next", + "display_name": "Qwen3 Coder Next", "modalities": { "input": [ "text" @@ -201827,61 +193955,65 @@ ] }, "limit": { - "context": 1048576, - "output": 384000 + "context": 256000, + "output": 256000 }, "temperature": true, "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "knowledge": "2025-09", + "release_date": "2026-02-03", + "last_updated": "2026-02-03", + "type": "chat" + }, + { + "id": "nvidia-nemotron-3-nano-30b-a3b", + "name": "nvidia-nemotron-3-nano-30b-a3b", + "display_name": "nvidia-nemotron-3-nano-30b-a3b", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 256000, + "output": 256000 + }, + "temperature": false, + "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." - ] - } - }, "attachment": false, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "knowledge": "2025-06-25", + "release_date": "2025-12-15", + "last_updated": "2025-12-15", "type": "chat" }, { - "id": "deepseek-ai/deepseek-v4.1-flash", - "name": "DeepSeek V4.1 Flash", - "display_name": "DeepSeek V4.1 Flash", + "id": "gpt-oss-20b", + "name": "GPT OSS 20B", + "display_name": "GPT OSS 20B", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 384000 + "context": 131000, + "output": 131000 }, "temperature": true, "tool_call": true, @@ -201892,44 +194024,35 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ - "none", - "high", - "max" + "low", + "medium", + "high" ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-09-10", - "last_updated": "2026-09-10", + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "qwen/qwen3.8-27b", - "name": "Qwen3.8 27B", - "display_name": "Qwen3.8 27B", + "id": "gpt-oss-safeguard-120b", + "name": "GPT OSS Safeguard 120B", + "display_name": "GPT OSS Safeguard 120B", "modalities": { "input": [ - "text", - "image", - "video", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 128000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -201939,36 +194062,27 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ - "none", "low", "medium", - "xhigh" + "high" ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "release_date": "2025-10-29", + "last_updated": "2025-10-29", "type": "chat" }, { - "id": "qwen/qwen3.6-27b", - "name": "Qwen3.6 27B", - "display_name": "Qwen3.6 27B", + "id": "gpt-5.6-terra", + "name": "GPT-5.6 Terra", + "display_name": "GPT-5.6 Terra", "modalities": { "input": [ "text", "image", - "video", "pdf" ], "output": [ @@ -201976,10 +194090,10 @@ ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -201988,79 +194102,69 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ "none", + "low", + "medium", + "high", + "xhigh", + "max" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", "high" - ] + ], + "visibility": "hidden" } }, "attachment": true, - "open_weights": true, - "release_date": "2026-04-22", - "last_updated": "2026-04-22", + "open_weights": false, + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" - } - ] - }, - "anyapi": { - "id": "anyapi", - "name": "AnyAPI", - "display_name": "AnyAPI", - "api": "https://api.anyapi.ai/v1", - "doc": "https://docs.anyapi.ai", - "models": [ + }, { - "id": "xai/grok-4.3", - "name": "Grok 4.3", - "display_name": "Grok 4.3", + "id": "mistral-small-2503", + "name": "mistral-small-2503", + "display_name": "mistral-small-2503", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 30000 + "context": 128000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, "attachment": true, - "open_weights": false, - "release_date": "2026-04-17", - "last_updated": "2026-04-17", + "open_weights": true, + "knowledge": "2024-06", + "release_date": "2025-03-17", + "last_updated": "2025-03-17", "type": "chat" }, { - "id": "google/gemini-2.5-pro", - "name": "Gemini 2.5 Pro", - "display_name": "Gemini 2.5 Pro", + "id": "glm-5.2", + "name": "GLM-5.2", + "display_name": "GLM-5.2", "modalities": { "input": [ - "text", - "image", - "audio", - "video", - "pdf" + "text" ], "output": [ "text" @@ -202068,7 +194172,7 @@ }, "limit": { "context": 1048576, - "output": 65536 + "output": 1000000 }, "temperature": true, "tool_call": true, @@ -202079,39 +194183,61 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "budget", - "budget": { - "default": -1, - "min": 128, - "max": 32768, - "auto": -1, - "unit": "tokens" - }, + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" + ], + "effort_options": [ + "high", + "max" ] } }, + "attachment": false, + "open_weights": true, + "release_date": "2026-06-13", + "last_updated": "2026-06-13", + "type": "chat" + }, + { + "id": "qwen2.5-vl-72b-instruct", + "name": "qwen2.5-vl-72b-instruct", + "display_name": "qwen2.5-vl-72b-instruct", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 32000, + "output": 32000 + }, + "temperature": false, + "tool_call": false, + "reasoning": { + "supported": false + }, "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-06-17", - "last_updated": "2025-06-17", + "open_weights": true, + "knowledge": "2024-04", + "release_date": "2025-01-26", + "last_updated": "2025-01-26", "type": "chat" }, { - "id": "google/gemini-3-pro-preview", - "name": "Gemini 3 Pro Preview", - "display_name": "Gemini 3 Pro Preview", + "id": "gpt-5.4", + "name": "GPT-5.4", + "display_name": "GPT-5.4", "modalities": { "input": [ "text", "image", - "video", - "audio", "pdf" ], "output": [ @@ -202119,49 +194245,52 @@ ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 1050000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ "low", + "medium", "high" ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-11-18", - "last_updated": "2025-11-18", + "knowledge": "2025-08-31", + "release_date": "2026-03-05", + "last_updated": "2026-03-05", "type": "chat" }, { - "id": "google/gemini-2.5-flash", - "name": "Gemini 2.5 Flash", - "display_name": "Gemini 2.5 Flash", + "id": "gpt-5.6-sol", + "name": "GPT-5.6 Sol", + "display_name": "GPT-5.6 Sol", "modalities": { "input": [ "text", "image", - "audio", - "video", "pdf" ], "output": [ @@ -202169,10 +194298,10 @@ ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -202182,91 +194311,70 @@ "reasoning": { "supported": true, "default_enabled": true, - "mode": "budget", - "budget": { - "default": -1, - "min": 0, - "max": 24576, - "auto": -1, - "off": 0, - "unit": "tokens" - }, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] + "mode": "effort", + "effort": "medium", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-06-17", - "last_updated": "2025-06-17", + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "google/gemini-2.5-flash-lite", - "name": "Gemini 2.5 Flash-Lite", - "display_name": "Gemini 2.5 Flash-Lite", + "id": "mistral-small-2603", + "name": "Mistral Small 4", + "display_name": "Mistral Small 4", "modalities": { "input": [ "text", - "image", - "audio", - "video", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 262144, + "output": 256000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "default": -1, - "min": 512, - "max": 24576, - "auto": -1, - "unit": "tokens" - }, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] - } + "default": true }, "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-06-17", - "last_updated": "2025-06-17", + "open_weights": true, + "knowledge": "2025-06", + "release_date": "2026-03-16", + "last_updated": "2026-03-16", "type": "chat" }, { - "id": "google/gemini-3-flash-preview", - "name": "Gemini 3 Flash Preview", - "display_name": "Gemini 3 Flash Preview", + "id": "claude-haiku-5.5", + "name": "Claude Haiku 5.5", + "display_name": "Claude Haiku 5.5", "modalities": { "input": [ "text", "image", - "video", - "audio", "pdf" ], "output": [ @@ -202274,10 +194382,10 @@ ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -202285,37 +194393,29 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", + "effort_options": [ "low", "medium", "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-12-17", - "last_updated": "2025-12-17", + "knowledge": "2026-06", + "release_date": "2026-10-07", + "last_updated": "2026-10-07", "type": "chat" }, { - "id": "cohere/command-r-plus-08-2024", - "name": "Command R+", - "display_name": "Command R+", + "id": "gpt-4o", + "name": "GPT-4o", + "display_name": "GPT-4o", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" @@ -202323,24 +194423,24 @@ }, "limit": { "context": 128000, - "output": 4000 + "output": 16000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-06-01", - "release_date": "2024-08-30", - "last_updated": "2024-08-30", + "attachment": true, + "open_weights": false, + "knowledge": "2023-09", + "release_date": "2024-05-13", + "last_updated": "2024-08-06", "type": "chat" }, { - "id": "openai/gpt-5.2", - "name": "GPT-5.2", - "display_name": "GPT-5.2", + "id": "deepseek-v4.1-flash", + "name": "DeepSeek V4.1 Flash", + "display_name": "DeepSeek V4.1 Flash", "modalities": { "input": [ "text", @@ -202351,61 +194451,51 @@ ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 1048576, + "output": 393216 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ "low", "medium", "high" - ], - "visibility": "hidden" + ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2025-12-11", - "last_updated": "2025-12-11", + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-09-10", + "last_updated": "2026-09-10", "type": "chat" }, { - "id": "openai/o3-mini", - "name": "o3-mini", - "display_name": "o3-mini", + "id": "gemini-2.5-pro", + "name": "Gemini 2.5 Pro", + "display_name": "Gemini 2.5 Pro", "modalities": { "input": [ - "text" + "text", + "image", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 1048576, + "output": 65535 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -202415,27 +194505,32 @@ "reasoning": { "supported": true, "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "mode": "budget", + "budget": { + "default": -1, + "min": 128, + "max": 32768, + "auto": -1, + "unit": "tokens" + }, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] } }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2024-05", - "release_date": "2024-12-20", - "last_updated": "2025-01-29", + "knowledge": "2025-01", + "release_date": "2025-06-17", + "last_updated": "2025-06-17", "type": "chat" }, { - "id": "openai/o3", - "name": "o3", - "display_name": "o3", + "id": "claude-4-5-sonnet", + "name": "Claude Sonnet 4.5 (latest)", + "display_name": "Claude Sonnet 4.5 (latest)", "modalities": { "input": [ "text", @@ -202448,9 +194543,9 @@ }, "limit": { "context": 200000, - "output": 100000 + "output": 64000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -202458,29 +194553,24 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", "effort_options": [ "low", "medium", "high" - ], - "visibility": "hidden" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2024-05", - "release_date": "2025-04-16", - "last_updated": "2025-04-16", + "knowledge": "2025-07-31", + "release_date": "2025-09-29", + "last_updated": "2025-09-29", "type": "chat" }, { - "id": "openai/gpt-5.4", - "name": "GPT-5.4", - "display_name": "GPT-5.4", + "id": "gpt-5.6-luna", + "name": "GPT-5.6 Luna", + "display_name": "GPT-5.6 Luna", "modalities": { "input": [ "text", @@ -202495,24 +194585,25 @@ "context": 1050000, "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, + "default_enabled": true, "mode": "effort", - "effort": "none", + "effort": "medium", "effort_options": [ "none", "low", "medium", "high", - "xhigh" + "xhigh", + "max" ], "verbosity": "medium", "verbosity_options": [ @@ -202525,96 +194616,85 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-05", - "last_updated": "2026-03-05", + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "openai/gpt-5.1", - "name": "GPT-5.1", - "display_name": "GPT-5.1", + "id": "gemini-3.5-flash-lite", + "name": "Gemini 3.5 Flash Lite", + "display_name": "Gemini 3.5 Flash Lite", "modalities": { "input": [ "text", - "image" + "image", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 1048576, + "output": 65535 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", "effort_options": [ - "none", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ "low", "medium", "high" - ], - "visibility": "hidden" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-11-13", - "last_updated": "2025-11-13", + "knowledge": "2026-03", + "release_date": "2026-07-21", + "last_updated": "2026-07-21", "type": "chat" }, { - "id": "openai/gpt-4.1-mini", - "name": "GPT-4.1 mini", - "display_name": "GPT-4.1 mini", + "id": "qwen3-30b-a3b-instruct-2507", + "name": "qwen3-30b-a3b-instruct-2507", + "display_name": "qwen3-30b-a3b-instruct-2507", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1047576, - "output": 32768 + "context": 262000, + "output": 262000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-04-14", - "last_updated": "2025-04-14", + "attachment": false, + "open_weights": true, + "release_date": "2025-07-28", + "last_updated": "2025-07-28", "type": "chat" }, { - "id": "openai/gpt-5-mini", - "name": "GPT-5 Mini", - "display_name": "GPT-5 Mini", + "id": "mistral-large-4-0", + "name": "Mistral Large 4", + "display_name": "Mistral Large 4", "modalities": { "input": [ "text", @@ -202625,10 +194705,10 @@ ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 1000000, + "output": 262144 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -202636,36 +194716,22 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", "effort_options": [ - "minimal", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", + "none", "high" - ], - "visibility": "hidden" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2024-05-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "release_date": "2026-10-06", + "last_updated": "2026-10-06", "type": "chat" }, { - "id": "openai/gpt-5", - "name": "GPT-5", - "display_name": "GPT-5", + "id": "qwen3.6-27b", + "name": "Qwen3.6 27B", + "display_name": "Qwen3.6 27B", "modalities": { "input": [ "text", @@ -202676,10 +194742,10 @@ ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 262000, + "output": 262000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -202688,33 +194754,22 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "minimal", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "open_weights": true, + "release_date": "2026-04-22", + "last_updated": "2026-04-22", "type": "chat" }, { - "id": "openai/gpt-4.1", + "id": "gpt-4.1", "name": "GPT-4.1", "display_name": "GPT-4.1", "modalities": { @@ -202744,23 +194799,22 @@ "type": "chat" }, { - "id": "openai/o4-mini", - "name": "o4-mini", - "display_name": "o4-mini", + "id": "qwen3.8-2.4t-a95b", + "name": "Qwen3.8 2.4T A95B", + "display_name": "Qwen3.8 2.4T A95B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 262144, + "output": 262144 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -202769,59 +194823,57 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", "effort_options": [ "low", "medium", - "high" - ], - "visibility": "hidden" + "xhigh" + ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-05", - "release_date": "2025-04-16", - "last_updated": "2025-04-16", + "attachment": false, + "open_weights": true, + "release_date": "2026-08-12", + "last_updated": "2026-08-12", "type": "chat" }, { - "id": "deepseek/deepseek-chat", - "name": "DeepSeek Chat", - "display_name": "DeepSeek Chat", + "id": "mistral-medium-3.5", + "name": "mistral-medium-3.5", + "display_name": "mistral-medium-3.5", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 256000, + "output": 256000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-09", - "release_date": "2025-12-01", - "last_updated": "2026-02-28", + "attachment": true, + "open_weights": false, + "release_date": "2026-04-30", + "last_updated": "2026-04-30", "type": "chat" }, { - "id": "deepseek/deepseek-v4-flash", - "name": "DeepSeek V4 Flash", - "display_name": "DeepSeek V4 Flash", + "id": "claude-opus4-7", + "name": "Claude Opus 4.7", + "display_name": "Claude Opus 4.7", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" @@ -202829,9 +194881,9 @@ }, "limit": { "context": 1000000, - "output": 384000 + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -202839,37 +194891,24 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", "effort_options": [ "low", - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." + "medium", + "high" ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "attachment": true, + "open_weights": false, + "knowledge": "2026-01-31", + "release_date": "2026-04-16", + "last_updated": "2026-04-16", "type": "chat" }, { - "id": "deepseek/deepseek-v4-pro", - "name": "DeepSeek V4 Pro", - "display_name": "DeepSeek V4 Pro", + "id": "glm-5.3", + "name": "GLM-5.3", + "display_name": "GLM-5.3", "modalities": { "input": [ "text" @@ -202879,8 +194918,8 @@ ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 1048576, + "output": 1048576 }, "temperature": true, "tool_call": true, @@ -202891,39 +194930,28 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", "effort_options": [ "low", "high", "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, "attachment": false, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "deepseek/deepseek-r1", - "name": "DeepSeek Reasoner", - "display_name": "DeepSeek Reasoner", + "id": "claude-4-6-sonnet", + "name": "Claude Sonnet 4.6", + "display_name": "Claude Sonnet 4.6", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" @@ -202931,7 +194959,7 @@ }, "limit": { "context": 1000000, - "output": 384000 + "output": 128000 }, "temperature": true, "tool_call": true, @@ -202941,30 +194969,58 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "low", + "medium", + "high" ] } }, - "attachment": false, + "attachment": true, + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-02-17", + "last_updated": "2026-03-13", + "type": "chat" + }, + { + "id": "mistral-large-2512", + "name": "Mistral Large 3", + "display_name": "Mistral Large 3", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 256000, + "output": 256000 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": true, "open_weights": true, - "knowledge": "2025-09", - "release_date": "2025-12-01", - "last_updated": "2026-02-28", + "knowledge": "2024-11", + "release_date": "2025-12-02", + "last_updated": "2025-12-02", "type": "chat" }, { - "id": "anthropic/claude-opus-4-7", - "name": "Claude Opus 4.7", - "display_name": "Claude Opus 4.7", + "id": "gemini-3.1-flash-lite", + "name": "Gemini 3.1 Flash Lite", + "display_name": "Gemini 3.1 Flash Lite", "modalities": { "input": [ "text", "image", + "audio", "pdf" ], "output": [ @@ -202972,104 +195028,104 @@ ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 1048576, + "output": 65535 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "high", "effort_options": [ "low", "medium", - "high", - "xhigh", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." + "high" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-04-16", - "last_updated": "2026-04-16", + "knowledge": "2025-01", + "release_date": "2026-05-07", + "last_updated": "2026-05-07", "type": "chat" }, { - "id": "anthropic/claude-sonnet-4-5", - "name": "Claude Sonnet 4.5 (latest)", - "display_name": "Claude Sonnet 4.5 (latest)", + "id": "kolibri-1", + "name": "kolibri-1", + "display_name": "kolibri-1", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 262144, + "output": 81920 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + "effort_options": [ + "none", + "low", + "medium", + "high" ] } }, + "attachment": false, + "open_weights": true, + "knowledge": "2026-06-18", + "release_date": "2026-10-03", + "last_updated": "2026-10-03", + "type": "chat" + }, + { + "id": "nemotron-nano-v2-12b", + "name": "nemotron-nano-v2-12b", + "display_name": "nemotron-nano-v2-12b", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 128000, + "output": 128000 + }, + "temperature": false, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, "attachment": true, - "open_weights": false, - "knowledge": "2025-07-31", - "release_date": "2025-09-29", - "last_updated": "2025-09-29", + "open_weights": true, + "release_date": "2025-10-28", + "last_updated": "2025-10-28", "type": "chat" }, { - "id": "anthropic/claude-haiku-4-5", - "name": "Claude Haiku 4.5 (latest)", - "display_name": "Claude Haiku 4.5 (latest)", + "id": "nova-lite-v1", + "name": "Nova Lite 1.0", + "display_name": "Nova Lite 1.0", "modalities": { "input": [ "text", @@ -203081,106 +195137,94 @@ ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 300000, + "output": 10000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": true, - "default": false + "supported": false }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." - ] - } + "attachment": true, + "open_weights": false, + "knowledge": "2024-10-31", + "release_date": "2024-12-05", + "last_updated": "2024-12-05", + "type": "chat" + }, + { + "id": "nova-micro-v1", + "name": "Nova Micro 1.0", + "display_name": "Nova Micro 1.0", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 128000, + "output": 10000 + }, + "temperature": false, + "tool_call": true, + "reasoning": { + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2025-02-28", - "release_date": "2025-10-15", - "last_updated": "2025-10-15", + "knowledge": "2024-10-31", + "release_date": "2024-12-05", + "last_updated": "2024-12-05", "type": "chat" }, { - "id": "anthropic/claude-sonnet-4-6", - "name": "Claude Sonnet 4.6", - "display_name": "Claude Sonnet 4.6", + "id": "qwen3.5-9b", + "name": "Qwen3.5 9B", + "display_name": "Qwen3.5 9B", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 64000 + "context": 262000, + "output": 262000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "max" - ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-17", - "last_updated": "2026-03-13", + "open_weights": true, + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" }, { - "id": "anthropic/claude-opus-4-6", - "name": "Claude Opus 4.6", - "display_name": "Claude Opus 4.6", + "id": "gpt-5.1", + "name": "GPT-5.1", + "display_name": "GPT-5.1", "modalities": { "input": [ "text", @@ -203192,7 +195236,7 @@ ] }, "limit": { - "context": 1000000, + "context": 400000, "output": 128000 }, "temperature": true, @@ -203205,128 +195249,141 @@ "reasoning": { "supported": true, "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", + "mode": "effort", + "effort": "none", "effort_options": [ + "none", "low", "medium", - "high", - "max" + "high" ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." - ] + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2025-05-31", - "release_date": "2026-02-05", - "last_updated": "2026-03-13", + "knowledge": "2024-09-30", + "release_date": "2025-11-13", + "last_updated": "2025-11-13", "type": "chat" }, { - "id": "mistralai/mistral-large-2512", - "name": "Mistral Large 3", - "display_name": "Mistral Large 3", + "id": "qwen3guard-gen-0.6b", + "name": "qwen3guard-gen-0.6b", + "display_name": "qwen3guard-gen-0.6b", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 32000, + "output": 32000 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { "supported": false }, - "attachment": true, - "open_weights": true, - "knowledge": "2024-11", - "release_date": "2025-12-02", - "last_updated": "2025-12-02", + "attachment": false, + "open_weights": false, + "release_date": "2026-02-04", + "last_updated": "2026-02-04", "type": "chat" }, { - "id": "mistralai/devstral-2512", - "name": "Devstral 2", - "display_name": "Devstral 2", + "id": "qwen3-vl-235b-a22b", + "name": "qwen3-vl-235b-a22b", + "display_name": "qwen3-vl-235b-a22b", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 256000, + "output": 256000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": true, "open_weights": true, - "knowledge": "2025-12", - "release_date": "2025-12-09", - "last_updated": "2025-12-09", + "knowledge": "2025-03-31", + "release_date": "2025-09-23", + "last_updated": "2025-09-23", "type": "chat" }, { - "id": "perplexity/sonar-reasoning-pro", - "name": "Sonar Reasoning Pro", - "display_name": "Sonar Reasoning Pro", + "id": "gpt-6-luna", + "name": "GPT-6 Luna", + "display_name": "GPT-6 Luna", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 1050000, + "output": 128000 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "high" + ] + } + }, "attachment": true, "open_weights": false, - "knowledge": "2025-09-01", - "release_date": "2024-01-01", - "last_updated": "2025-09-01", + "knowledge": "2026-05-18", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "perplexity/sonar-pro", - "name": "Sonar Pro", - "display_name": "Sonar Pro", + "id": "ministral-3b-2512", + "name": "Ministral 3 3B 2512", + "display_name": "Ministral 3 3B 2512", "modalities": { "input": [ "text", @@ -203337,34 +195394,24 @@ ] }, "limit": { - "context": 200000, - "output": 8192 + "context": 256000, + "output": 256000 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2025-09-01", - "release_date": "2024-01-01", - "last_updated": "2025-09-01", + "open_weights": true, + "release_date": "2025-12-02", + "last_updated": "2025-12-02", "type": "chat" - } - ] - }, - "tokengo": { - "id": "tokengo", - "name": "TokenGo", - "display_name": "TokenGo", - "api": "https://api.tokengo.com/v1", - "doc": "https://www.tokengo.com/docs", - "models": [ + }, { - "id": "minimax/minimax-m2.5", - "name": "MiniMax-M2.5", - "display_name": "MiniMax-M2.5", + "id": "hermes-4-405b", + "name": "Hermes 4 405B", + "display_name": "Hermes 4 405B", "modalities": { "input": [ "text" @@ -203374,79 +195421,67 @@ ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 128000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, "attachment": false, "open_weights": true, - "release_date": "2026-02-12", - "last_updated": "2026-02-12", + "knowledge": "2024-08-31", + "release_date": "2025-08-26", + "last_updated": "2025-08-26", "type": "chat" }, { - "id": "moonshotai/kimi-k2.6", - "name": "Kimi K2.6", - "display_name": "Kimi K2.6", + "id": "mixtral-8x7B-instruct-v0.1", + "name": "Mixtral 8x7B Instruct v0.1", + "display_name": "Mixtral 8x7B Instruct v0.1", "modalities": { "input": [ "text", - "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 32000, + "output": 4096 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, "attachment": true, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-20", - "last_updated": "2026-04-20", + "release_date": "2023-12-11", + "last_updated": "2023-12-11", "type": "chat" }, { - "id": "moonshotai/kimi-k3", - "name": "Kimi K3", - "display_name": "Kimi K3", + "id": "pixtral-large-2502", + "name": "Pixtral Large (25.02)", + "display_name": "Pixtral Large (25.02)", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 128000, + "output": 128000 }, "temperature": false, "tool_call": true, @@ -203454,41 +195489,31 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "low", - "high", - "max" - ] - } - }, "attachment": true, - "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-16", + "open_weights": false, + "release_date": "2025-04-08", + "last_updated": "2025-04-08", "type": "chat" }, { - "id": "qwen/qwen3.5-397b-a17b", - "name": "Qwen3.5 397B-A17B", - "display_name": "Qwen3.5 397B-A17B", + "id": "claude-opus4-8", + "name": "Claude Opus 4.8", + "display_name": "Claude Opus 4.8", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -203496,71 +195521,39 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "low", + "medium", + "high" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-02-15", - "last_updated": "2026-02-15", - "type": "chat" - }, - { - "id": "z-ai/glm-5.1", - "name": "GLM-5.1", - "display_name": "GLM-5.1", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 200000, - "output": 131072 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, - "attachment": false, - "open_weights": true, - "release_date": "2026-04-07", - "last_updated": "2026-04-07", + "open_weights": false, + "knowledge": "2026-01", + "release_date": "2026-05-28", + "last_updated": "2026-05-28", "type": "chat" }, { - "id": "z-ai/glm-5", - "name": "GLM-5", - "display_name": "GLM-5", + "id": "kimi-k2.7-code", + "name": "Kimi K2.7 Code", + "display_name": "Kimi K2.7 Code", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 262144, + "output": 262144 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -203577,29 +195570,31 @@ ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-02-12", - "last_updated": "2026-02-12", + "knowledge": "2025-01", + "release_date": "2026-06-12", + "last_updated": "2026-06-12", "type": "chat" }, { - "id": "z-ai/glm-5.3", - "name": "GLM-5.3", - "display_name": "GLM-5.3", + "id": "gpt-5-mini", + "name": "GPT-5 Mini", + "display_name": "GPT-5 Mini", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -203608,26 +195603,40 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ + "minimal", "low", - "high", - "max" - ] + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "attachment": true, + "open_weights": false, + "knowledge": "2024-05-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "z-ai/glm-5.2", - "name": "GLM-5.2", - "display_name": "GLM-5.2", + "id": "claude-opus-5", + "name": "Claude Opus 5", + "display_name": "Claude Opus 5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" @@ -203635,9 +195644,9 @@ }, "limit": { "context": 1000000, - "output": 131072 + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -203647,26 +195656,27 @@ "reasoning": { "supported": true, "effort_options": [ - "high", - "max" + "low", + "medium", + "high" ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "attachment": true, + "open_weights": false, + "knowledge": "2026-05", + "release_date": "2026-07-24", + "last_updated": "2026-07-24", "type": "chat" }, { - "id": "z-ai/glm-5.3-flash", - "name": "GLM-5.3-Flash", - "display_name": "GLM-5.3-Flash", + "id": "nova-pro-v1", + "name": "Nova Pro 1.0", + "display_name": "Nova Pro 1.0", "modalities": { "input": [ "text", "image", - "video", "pdf" ], "output": [ @@ -203674,46 +195684,37 @@ ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 300000, + "output": 10000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "low", - "high", - "max" - ] - } + "supported": false }, "attachment": true, - "open_weights": true, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", + "open_weights": false, + "knowledge": "2024-10-31", + "release_date": "2024-12-05", + "last_updated": "2024-12-05", "type": "chat" }, { - "id": "deepseek/deepseek-v4-flash", - "name": "DeepSeek V4 Flash", - "display_name": "DeepSeek V4 Flash", + "id": "qwen3.6-35b-a3b", + "name": "Qwen3.6 35B-A3B", + "display_name": "Qwen3.6 35B-A3B", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 262000, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -203724,36 +195725,24 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "high", - "max" - ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "release_date": "2026-04-17", + "last_updated": "2026-04-17", "type": "chat" }, { - "id": "deepseek/deepseek-v3.1", - "name": "DeepSeek-V3.1", - "display_name": "DeepSeek-V3.1", + "id": "qwen3-coder-30b-a3b-instruct", + "name": "Qwen3-Coder 30B-A3B Instruct", + "display_name": "Qwen3-Coder 30B-A3B Instruct", "modalities": { "input": [ "text" @@ -203763,38 +195752,40 @@ ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, "open_weights": true, - "release_date": "2025-08-21", - "last_updated": "2025-08-21", + "knowledge": "2025-04", + "release_date": "2025-07-31", + "last_updated": "2025-07-31", "type": "chat" }, { - "id": "deepseek/deepseek-v4-pro", - "name": "DeepSeek V4 Pro", - "display_name": "DeepSeek V4 Pro", + "id": "gpt-6-sol", + "name": "GPT-6 Sol", + "display_name": "GPT-6 Sol", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -203802,48 +195793,66 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", "effort_options": [ "low", - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." + "medium", + "high" ] } }, - "attachment": false, + "attachment": true, + "open_weights": false, + "knowledge": "2026-04-20", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", + "type": "chat" + }, + { + "id": "ministral-14b-2512", + "name": "Ministral 3 14B 2512", + "display_name": "Ministral 3 14B 2512", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 256000, + "output": 256000 + }, + "temperature": false, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": true, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "release_date": "2025-12-02", + "last_updated": "2025-12-02", "type": "chat" }, { - "id": "deepseek/deepseek-v3.2", - "name": "DeepSeek V3.2", - "display_name": "DeepSeek V3.2", + "id": "gemini-2.5-flash", + "name": "Gemini 2.5 Flash", + "display_name": "Gemini 2.5 Flash", "modalities": { "input": [ - "text" + "text", + "image", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 64000 + "context": 1048576, + "output": 65535 }, "temperature": true, "tool_call": true, @@ -203853,29 +195862,35 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": true, + "mode": "budget", + "budget": { + "default": -1, + "min": 0, + "max": 24576, + "auto": -1, + "off": 0, + "unit": "tokens" + }, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-07", - "release_date": "2025-12-01", - "last_updated": "2025-12-01", + "attachment": true, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2025-06-17", + "last_updated": "2025-06-17", "type": "chat" - } - ] - }, - "poolside": { - "id": "poolside", - "name": "Poolside", - "display_name": "Poolside", - "api": "https://inference.poolside.ai/v1", - "doc": "https://platform.poolside.ai", - "models": [ + }, { - "id": "poolside/laguna-s-2.1", - "name": "Laguna S 2.1", - "display_name": "Laguna S 2.1", + "id": "glm-4.7-flash", + "name": "GLM-4.7-Flash", + "display_name": "GLM-4.7-Flash", "modalities": { "input": [ "text" @@ -203885,8 +195900,8 @@ ] }, "limit": { - "context": 1048576, - "output": 32768 + "context": 203000, + "output": 203000 }, "temperature": true, "tool_call": true, @@ -203907,14 +195922,15 @@ }, "attachment": false, "open_weights": true, - "release_date": "2026-07-21", - "last_updated": "2026-07-21", + "knowledge": "2025-04", + "release_date": "2026-01-19", + "last_updated": "2026-01-19", "type": "chat" }, { - "id": "poolside/laguna-m.1", - "name": "Laguna M.1", - "display_name": "Laguna M.1", + "id": "gpt-oss-120b", + "name": "GPT OSS 120B", + "display_name": "GPT OSS 120B", "modalities": { "input": [ "text" @@ -203924,8 +195940,8 @@ ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 131000, + "output": 131000 }, "temperature": true, "tool_call": true, @@ -203936,37 +195952,38 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "low", + "medium", + "high" ] } }, "attachment": false, "open_weights": true, - "release_date": "2026-04-28", - "last_updated": "2026-06-13", + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "poolside/laguna-xs-2.1", - "name": "Laguna XS 2.1", - "display_name": "Laguna XS 2.1", + "id": "gpt-5", + "name": "GPT-5", + "display_name": "GPT-5", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -203975,76 +195992,92 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "minimal", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-07-02", - "last_updated": "2026-07-02", + "attachment": true, + "open_weights": false, + "knowledge": "2024-09-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" - } - ] - }, - "kenari": { - "id": "kenari", - "name": "Kenari", - "display_name": "Kenari", - "api": "https://kenari.id/v1", - "doc": "https://kenari.id/docs", - "models": [ + }, { - "id": "mistral-large:free", - "name": "Mistral Large (Free)", - "display_name": "Mistral Large (Free)", + "id": "kimi-k2.6", + "name": "Kimi K2.6", + "display_name": "Kimi K2.6", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 256000, + "output": 256000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": true, "open_weights": true, - "knowledge": "2024-11", - "release_date": "2024-11-01", - "last_updated": "2025-12-02", + "knowledge": "2025-01", + "release_date": "2026-04-20", + "last_updated": "2026-04-20", "type": "chat" }, { - "id": "deepseek-v4-1-flash", - "name": "DeepSeek V4.1 Flash", - "display_name": "DeepSeek V4.1 Flash", + "id": "gpt-6.1-sol", + "name": "GPT-6.1 Sol", + "display_name": "GPT-6.1 Sol", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -204053,35 +196086,35 @@ "extra_capabilities": { "reasoning": { "effort_options": [ - "none", "low", - "high", - "max" + "medium", + "high" ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-09-10", - "last_updated": "2026-09-10", + "open_weights": false, + "knowledge": "2026-04-30", + "release_date": "2026-09-29", + "last_updated": "2026-09-29", "type": "chat" }, { - "id": "minimax-m2-7", - "name": "MiniMax-M2.7", - "display_name": "MiniMax-M2.7", + "id": "minimax-m3", + "name": "MiniMax-M3", + "display_name": "MiniMax-M3", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 1048576, + "output": 1048576 }, "temperature": true, "tool_call": true, @@ -204089,73 +196122,61 @@ "supported": true, "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": true, "open_weights": true, - "release_date": "2026-03-18", - "last_updated": "2026-03-18", + "release_date": "2026-06-01", + "last_updated": "2026-06-01", "type": "chat" }, { - "id": "claude-opus-4-7", - "name": "Claude Opus 4.7", - "display_name": "Claude Opus 4.7", + "id": "minimax-m3.1-flash", + "name": "MiniMax-M3.1-Flash", + "display_name": "MiniMax-M3.1-Flash", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 1048576, + "output": 64000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "high", "effort_options": [ "low", "medium", "high", "xhigh", "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-04-16", - "last_updated": "2026-04-16", + "release_date": "2026-10-19", + "last_updated": "2026-10-19", "type": "chat" }, { - "id": "nemotron-3-super-120b-a12b:free", - "name": "Nemotron 3 Super 120B A12B (Free)", - "display_name": "Nemotron 3 Super 120B A12B (Free)", + "id": "minimax-m2.5", + "name": "MiniMax-M2.5", + "display_name": "MiniMax-M2.5", "modalities": { "input": [ "text" @@ -204165,8 +196186,8 @@ ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 196000, + "output": 196000 }, "temperature": true, "tool_call": true, @@ -204176,35 +196197,37 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "none", - "low", - "medium" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, "attachment": false, "open_weights": true, - "knowledge": "2025-06", - "release_date": "2026-03-11", - "last_updated": "2026-03-11", + "release_date": "2026-02-12", + "last_updated": "2026-02-12", "type": "chat" }, { - "id": "deepseek-v4-flash", - "name": "DeepSeek V4 Flash", - "display_name": "DeepSeek V4 Flash", + "id": "gemma-4-26b-a4b-it", + "name": "Gemma 4 26B A4B IT", + "display_name": "Gemma 4 26B A4B IT", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 262000, + "output": 81920 }, "temperature": true, "tool_call": true, @@ -204214,37 +196237,19 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." - ] + "supported": true } }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "nemotron-3-nano-30b-a3b", - "name": "Nemotron 3 Nano 30B A3B", - "display_name": "Nemotron 3 Nano 30B A3B", + "id": "mistral-nemo-instruct-2407", + "name": "mistral-nemo-instruct-2407", + "display_name": "mistral-nemo-instruct-2407", "modalities": { "input": [ "text" @@ -204254,77 +196259,65 @@ ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 118000, + "output": 118000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, "open_weights": true, - "knowledge": "2025-06-25", - "release_date": "2025-12-15", - "last_updated": "2025-12-15", + "knowledge": "2024-07", + "release_date": "2024-07-18", + "last_updated": "2024-07-18", "type": "chat" }, { - "id": "hy3", - "name": "Hy3", - "display_name": "Hy3", + "id": "mistral-large-2402", + "name": "mistral-large-2402", + "display_name": "mistral-large-2402", "modalities": { "input": [ - "text" + "text", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 128000 + "context": 32000, + "output": 8192 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "none", - "low", - "high" - ] - } - }, - "attachment": false, - "open_weights": true, - "release_date": "2026-07-06", - "last_updated": "2026-07-06", + "attachment": true, + "open_weights": false, + "release_date": "2025-05-26", + "last_updated": "2025-05-26", "type": "chat" }, { - "id": "step-3-7-flash:free", - "name": "Step 3.7 Flash (Free)", - "display_name": "Step 3.7 Flash (Free)", + "id": "qwen3-32b", + "name": "Qwen3 32B", + "display_name": "Qwen3 32B", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 256000 + "context": 16384, + "output": 16384 }, "temperature": true, "tool_call": true, @@ -204334,39 +196327,38 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "low", - "medium", - "high" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2026-03-01", - "release_date": "2026-05-29", - "last_updated": "2026-05-29", + "knowledge": "2025-04", + "release_date": "2025-04-28", + "last_updated": "2025-04-28", "type": "chat" }, { - "id": "gemini-3-6-flash", - "name": "Gemini 3.6 Flash", - "display_name": "Gemini 3.6 Flash", + "id": "gemma-4-31b-it", + "name": "Gemma 4 31B IT", + "display_name": "Gemma 4 31B IT", "modalities": { "input": [ "text", - "image", - "video", - "audio", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 262000, + "output": 262000 }, "temperature": true, "tool_call": true, @@ -204376,25 +196368,20 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "minimal", - "low", - "medium", - "high" - ] + "supported": true } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-07-21", - "last_updated": "2026-07-21", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "mimo-v2-5-pro", - "name": "MiMo-V2.5-Pro", - "display_name": "MiMo-V2.5-Pro", + "id": "qwen3guard-gen-8b", + "name": "qwen3guard-gen-8b", + "display_name": "qwen3guard-gen-8b", "modalities": { "input": [ "text" @@ -204404,32 +196391,28 @@ ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 32000, + "output": 32000 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, - "open_weights": true, - "knowledge": "2024-12", - "release_date": "2026-04-22", - "last_updated": "2026-04-22", + "open_weights": false, + "release_date": "2026-02-04", + "last_updated": "2026-02-04", "type": "chat" }, { - "id": "gemini-3-5-flash", - "name": "Gemini 3.5 Flash", - "display_name": "Gemini 3.5 Flash", + "id": "nova-2-lite", + "name": "Nova 2 Lite", + "display_name": "Nova 2 Lite", "modalities": { "input": [ "text", "image", - "video", - "audio", "pdf" ], "output": [ @@ -204437,68 +196420,69 @@ ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 1000000, + "output": 65535 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "minimal", - "low", - "medium", - "high" - ] - } - }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-05-19", - "last_updated": "2026-05-19", + "knowledge": "2025-10", + "release_date": "2025-12-02", + "last_updated": "2025-12-01", "type": "chat" }, { - "id": "whisper-large-v3-turbo", - "name": "Whisper Large v3 Turbo", - "display_name": "Whisper Large v3 Turbo", + "id": "qwen3.5-397b-a17b", + "name": "Qwen3.5 397B-A17B", + "display_name": "Qwen3.5 397B-A17B", "modalities": { "input": [ - "audio" + "text" ], "output": [ "text" ] }, "limit": { - "context": 448, - "output": 448 + "context": 262000, + "output": 262000 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, "open_weights": true, - "release_date": "2024-10-01", - "last_updated": "2024-10-01" + "release_date": "2026-02-15", + "last_updated": "2026-02-15", + "type": "chat" }, { - "id": "gemini-3-7-flash", - "name": "Gemini 3.7 Flash", - "display_name": "Gemini 3.7 Flash", + "id": "claude-sonnet-5", + "name": "Claude Sonnet 5", + "display_name": "Claude Sonnet 5", "modalities": { "input": [ "text", "image", - "video", - "audio", "pdf" ], "output": [ @@ -204506,10 +196490,10 @@ ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -204517,6 +196501,7 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ "low", "medium", @@ -204526,30 +196511,26 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-08-13", - "last_updated": "2026-08-13", + "knowledge": "2026-01-31", + "release_date": "2026-06-30", + "last_updated": "2026-06-30", "type": "chat" }, { - "id": "gemini-2-5-flash-lite", - "name": "Gemini 2.5 Flash-Lite", - "display_name": "Gemini 2.5 Flash-Lite", + "id": "deepseek-v4-pro", + "name": "DeepSeek V4 Pro", + "display_name": "DeepSeek V4 Pro", "modalities": { "input": [ - "text", - "image", - "audio", - "video", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 1000000, + "output": 384000 }, "temperature": true, "tool_call": true, @@ -204557,44 +196538,39 @@ "supported": true, "default": true }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-06-17", - "last_updated": "2025-06-17", - "type": "chat" - }, - { - "id": "grok-imagine-image", - "name": "Grok Imagine Image", - "display_name": "Grok Imagine Image", - "modalities": { - "input": [ - "text", - "image" - ], - "output": [ - "image" - ] - }, - "limit": { - "context": 16000, - "output": 8192 - }, - "temperature": false, - "tool_call": false, - "reasoning": { - "supported": false + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "high", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." + ] + } }, - "attachment": true, - "open_weights": false, - "release_date": "2026-01-28", - "last_updated": "2026-01-28" + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", + "type": "chat" }, { - "id": "mistral-medium-3-5:free", - "name": "Mistral Medium 3.5 (Free)", - "display_name": "Mistral Medium 3.5 (Free)", + "id": "deepseek-v4.1-flash-1017", + "name": "DeepSeek V4.1 Flash 1017", + "display_name": "DeepSeek V4.1 Flash 1017", "modalities": { "input": [ "text", @@ -204605,8 +196581,8 @@ ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1048576, + "output": 1048576 }, "temperature": true, "tool_call": true, @@ -204617,68 +196593,62 @@ "extra_capabilities": { "reasoning": { "effort_options": [ - "none", + "low", + "medium", "high" ] } }, "attachment": true, "open_weights": true, - "release_date": "2026-04-29", - "last_updated": "2026-04-29", + "knowledge": "2025-05", + "release_date": "2026-10-17", + "last_updated": "2026-10-17", "type": "chat" }, { - "id": "gemini-2-5-flash", - "name": "Gemini 2.5 Flash", - "display_name": "Gemini 2.5 Flash", + "id": "llama-3.3-70b-instruct", + "name": "Llama-3.3-70B-Instruct", + "display_name": "Llama-3.3-70B-Instruct", "modalities": { "input": [ - "text", - "image", - "audio", - "video", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 131000, + "output": 131000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-06-17", - "last_updated": "2025-06-17", + "attachment": false, + "open_weights": true, + "knowledge": "2023-12", + "release_date": "2024-12-06", + "last_updated": "2024-12-06", "type": "chat" }, { - "id": "glm-5-3-flash", - "name": "GLM-5.3-Flash", - "display_name": "GLM-5.3-Flash", + "id": "deepseek-v3.2", + "name": "DeepSeek V3.2", + "display_name": "DeepSeek V3.2", "modalities": { "input": [ - "text", - "image", - "video", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 163840, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -204688,37 +196658,40 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ "low", - "high", - "max" + "medium", + "high" ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", + "knowledge": "2024-07", + "release_date": "2025-12-01", + "last_updated": "2025-12-01", "type": "chat" }, { - "id": "gemma-4-31b-it", - "name": "Gemma 4 31B IT", - "display_name": "Gemma 4 31B IT", + "id": "claude-sonnet-5.5", + "name": "Claude Sonnet 5.5", + "display_name": "Claude Sonnet 5.5", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -204726,20 +196699,24 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "effort_options": [ + "low", + "medium", + "high" + ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "open_weights": false, + "knowledge": "2026-06", + "release_date": "2026-09-28", + "last_updated": "2026-09-28", "type": "chat" }, { - "id": "deepseek-v4-pro", - "name": "DeepSeek V4 Pro", - "display_name": "DeepSeek V4 Pro", + "id": "devstral-2512", + "name": "Devstral 2", + "display_name": "Devstral 2", "modalities": { "input": [ "text" @@ -204749,52 +196726,30 @@ ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 256000, + "output": 256000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." - ] - } + "supported": false }, "attachment": false, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "knowledge": "2025-12", + "release_date": "2025-12-09", + "last_updated": "2025-12-09", "type": "chat" }, { - "id": "gpt-5-5", - "name": "GPT-5.5", - "display_name": "GPT-5.5", + "id": "gemini-4-argon", + "name": "Gemini 4 Argon", + "display_name": "Gemini 4 Argon", "modalities": { "input": [ "text", "image", + "audio", "pdf" ], "output": [ @@ -204802,8 +196757,8 @@ ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1048576, + "output": 65535 }, "temperature": false, "tool_call": true, @@ -204813,48 +196768,38 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ "low", "medium", "high" - ], - "visibility": "hidden" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-12-01", - "release_date": "2026-04-23", - "last_updated": "2026-04-23", + "knowledge": "2026-03", + "release_date": "2026-10-13", + "last_updated": "2026-10-13", "type": "chat" }, { - "id": "grok-4-6", - "name": "Grok 4.6", - "display_name": "Grok 4.6", + "id": "gemini-3.7-flash", + "name": "Gemini 3.7 Flash", + "display_name": "Gemini 3.7 Flash", "modalities": { "input": [ "text", - "image" + "image", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 500000, - "output": 500000 + "context": 1048576, + "output": 65535 }, "temperature": true, "tool_call": true, @@ -204864,38 +196809,46 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", "low", "medium", - "high", - "xhigh" + "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-02-01", - "release_date": "2026-08-12", - "last_updated": "2026-08-12", + "knowledge": "2026-03", + "release_date": "2026-08-13", + "last_updated": "2026-08-13", "type": "chat" }, { - "id": "claude-sonnet-5", - "name": "Claude Sonnet 5", - "display_name": "Claude Sonnet 5", + "id": "kimi-k3", + "name": "Kimi K3", + "display_name": "Kimi K3", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 1048576, + "output": 1048576 }, "temperature": false, "tool_call": true, @@ -204906,26 +196859,29 @@ "extra_capabilities": { "reasoning": { "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ "low", - "medium", "high", - "xhigh", "max" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-30", - "last_updated": "2026-06-30", + "open_weights": true, + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" }, { - "id": "glm-5-2", - "name": "GLM-5.2", - "display_name": "GLM-5.2", + "id": "qwen3-235b-a22b-instruct-2507", + "name": "Qwen3 235B-A22B Instruct 2507", + "display_name": "Qwen3 235B-A22B Instruct 2507", "modalities": { "input": [ "text" @@ -204935,34 +196891,24 @@ ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 262000, + "output": 262000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "high", - "xhigh" - ] - } + "supported": false }, "attachment": false, "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "release_date": "2025-07-21", + "last_updated": "2025-07-21", "type": "chat" }, { - "id": "glm-4-7-flash:free", - "name": "GLM-4.7-Flash (Free)", - "display_name": "GLM-4.7-Flash (Free)", + "id": "minicpm-v-4.5", + "name": "minicpm-v-4.5", + "display_name": "minicpm-v-4.5", "modalities": { "input": [ "text" @@ -204972,40 +196918,35 @@ ] }, "limit": { - "context": 200000, - "output": 131072 + "context": 32000, + "output": 32000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2026-01-19", - "last_updated": "2026-01-19", + "open_weights": false, + "release_date": "2026-06-02", + "last_updated": "2026-06-02", "type": "chat" }, { - "id": "mimo-v2-5", - "name": "MiMo-V2.5", - "display_name": "MiMo-V2.5", + "id": "minimax-m2.1", + "name": "MiniMax-M2.1", + "display_name": "MiniMax-M2.1", "modalities": { "input": [ - "text", - "image", - "audio", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 196000, + "output": 196000 }, "temperature": true, "tool_call": true, @@ -205013,115 +196954,120 @@ "supported": true, "default": true }, - "attachment": true, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, "open_weights": true, - "knowledge": "2024-12", - "release_date": "2026-04-22", - "last_updated": "2026-04-22", + "release_date": "2025-12-23", + "last_updated": "2025-12-23", "type": "chat" }, { - "id": "kimi-k2-7-code:free", - "name": "Kimi K2.7 Code (Free)", - "display_name": "Kimi K2.7 Code (Free)", + "id": "qwen3.8-27b", + "name": "Qwen3.8 27B", + "display_name": "Qwen3.8 27B", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1000000, + "output": 500000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "xhigh" + ] + } + }, "attachment": true, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-06-12", - "last_updated": "2026-06-12", + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "gpt-5-4-mini", - "name": "GPT-5.4 mini", - "display_name": "GPT-5.4 mini", + "id": "claude-opus4-5", + "name": "Claude Opus 4.5 (latest)", + "display_name": "Claude Opus 4.5 (latest)", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ "low", "medium", "high" - ], - "visibility": "hidden" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-17", - "last_updated": "2026-03-17", + "knowledge": "2025-05", + "release_date": "2025-11-24", + "last_updated": "2025-11-24", "type": "chat" }, { - "id": "gpt-5-6-luna", - "name": "GPT-5.6 Luna", - "display_name": "GPT-5.6 Luna", + "id": "gemini-3.5-flash", + "name": "Gemini 3.5 Flash", + "display_name": "Gemini 3.5 Flash", "modalities": { "input": [ "text", "image", - "pdf" + "audio" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1048576, + "output": 65535 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -205131,83 +197077,72 @@ "reasoning": { "supported": true, "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ], - "verbosity": "medium", - "verbosity_options": [ + "mode": "level", + "level": "high", + "level_options": [ + "minimal", "low", "medium", "high" ], - "visibility": "hidden" + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "knowledge": "2025-01", + "release_date": "2026-05-19", + "last_updated": "2026-05-19", "type": "chat" }, { - "id": "nemotron-3-ultra-550b-a55b", - "name": "Nemotron 3 Ultra 550B A55B", - "display_name": "Nemotron 3 Ultra 550B A55B", + "id": "ministral-8b-2512", + "name": "Ministral 3 8B 2512", + "display_name": "Ministral 3 8B 2512", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 256000, + "output": 256000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2025-09", - "release_date": "2026-06-04", - "last_updated": "2026-06-04", + "release_date": "2025-12-02", + "last_updated": "2025-12-02", "type": "chat" }, { - "id": "nano-banana-2-lite", - "name": "Nano Banana 2 Lite", - "display_name": "Nano Banana 2 Lite", + "id": "glm-5.3-flash", + "name": "GLM-5.3-Flash", + "display_name": "GLM-5.3-Flash", "modalities": { "input": [ "text", "image" ], "output": [ - "text", - "image" + "text" ] }, "limit": { - "context": 65536, - "output": 4096 + "context": 1048576, + "output": 1048576 }, "temperature": true, "tool_call": true, @@ -205217,68 +197152,66 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ - "minimal", - "high" + "low", + "high", + "max" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-06-30", - "last_updated": "2026-06-30" + "open_weights": true, + "release_date": "2026-08-26", + "last_updated": "2026-08-26", + "type": "chat" }, { - "id": "kimi-k2-6:free", - "name": "Kimi K2.6 (Free)", - "display_name": "Kimi K2.6 (Free)", + "id": "gpt-4.1-mini", + "name": "GPT-4.1 mini", + "display_name": "GPT-4.1 mini", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1047576, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-20", - "last_updated": "2026-04-20", + "open_weights": false, + "knowledge": "2024-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", "type": "chat" }, { - "id": "gemini-3-1-pro", - "name": "Gemini 3.1 Pro Preview", - "display_name": "Gemini 3.1 Pro Preview", + "id": "qwen3.8-flash-next", + "name": "Qwen3.8 Flash Next", + "display_name": "Qwen3.8 Flash Next", "modalities": { "input": [ "text", - "image", - "video", - "audio", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 262144, + "output": 64000 }, "temperature": true, "tool_call": true, @@ -205291,23 +197224,23 @@ "effort_options": [ "low", "medium", - "high" + "xhigh" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-02-19", - "last_updated": "2026-02-19", + "open_weights": true, + "release_date": "2026-08-27", + "last_updated": "2026-08-27", "type": "chat" }, { - "id": "glm-5-1", - "name": "GLM-5.1", - "display_name": "GLM-5.1", + "id": "mistral-small-3.2-24b-instruct-2506", + "name": "mistral-small-3.2-24b-instruct-2506", + "display_name": "mistral-small-3.2-24b-instruct-2506", "modalities": { "input": [ + "image", "text" ], "output": [ @@ -205315,92 +197248,96 @@ ] }, "limit": { - "context": 200000, - "output": 131072 + "context": 131000, + "output": 131000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-04-07", - "last_updated": "2026-04-07", + "knowledge": "2023-10-31", + "release_date": "2025-06-20", + "last_updated": "2025-06-20", "type": "chat" }, { - "id": "gpt-image-2", - "name": "GPT-Image-2", - "display_name": "GPT-Image-2", + "id": "codestral-2508", + "name": "Codestral 25.08", + "display_name": "Codestral 25.08", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ - "image" + "text" ] }, "limit": { - "context": 272000, - "output": 16384 + "context": 256000, + "output": 256000 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2026-04-21", - "last_updated": "2026-04-21" + "release_date": "2025-07-30", + "last_updated": "2025-07-30", + "type": "chat" }, { - "id": "minimax-m2-7-highspeed", - "name": "MiniMax-M2.7-highspeed", - "display_name": "MiniMax-M2.7-highspeed", + "id": "gpt-4o-mini", + "name": "GPT-4o mini", + "display_name": "GPT-4o mini", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 128000, + "output": 16000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": false, - "open_weights": true, - "release_date": "2026-03-18", - "last_updated": "2026-03-18", + "attachment": true, + "open_weights": false, + "knowledge": "2023-09", + "release_date": "2024-07-18", + "last_updated": "2024-07-18", "type": "chat" }, { - "id": "grok-4-5", - "name": "Grok 4.5", - "display_name": "Grok 4.5", + "id": "gemini-3.8-flash", + "name": "Gemini 3.8 Flash", + "display_name": "Gemini 3.8 Flash", "modalities": { "input": [ "text", - "image" + "image", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 500000, - "output": 500000 + "context": 1048576, + "output": 65535 }, "temperature": true, "tool_call": true, @@ -205410,23 +197347,33 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", "low", "medium", "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-07-08", - "last_updated": "2026-07-08", + "release_date": "2026-09-02", + "last_updated": "2026-09-02", "type": "chat" }, { - "id": "hy3:free", - "name": "Hy3 (Free)", - "display_name": "Hy3 (Free)", + "id": "deepseek-v4-pro-0813", + "name": "DeepSeek V4 Pro 0813", + "display_name": "DeepSeek V4 Pro 0813", "modalities": { "input": [ "text" @@ -205436,8 +197383,8 @@ ] }, "limit": { - "context": 256000, - "output": 128000 + "context": 1048576, + "output": 64000 }, "temperature": true, "tool_call": true, @@ -205447,76 +197394,69 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ - "none", "low", + "medium", "high" ] } }, "attachment": false, "open_weights": true, - "release_date": "2026-07-06", - "last_updated": "2026-07-06", + "release_date": "2026-08-13", + "last_updated": "2026-08-22", "type": "chat" }, { - "id": "kimi-k3", - "name": "Kimi K3", - "display_name": "Kimi K3", + "id": "gemma-3-27b-it", + "name": "Gemma 3 27B IT", + "display_name": "Gemma 3 27B IT", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 131000, + "output": 110000 }, "temperature": false, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "low", - "high", - "max" - ] - } - }, "attachment": true, "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-16", + "knowledge": "2024-08", + "release_date": "2025-03-12", + "last_updated": "2025-03-12", "type": "chat" }, { - "id": "nemotron-3-super-120b-a12b", - "name": "Nemotron 3 Super 120B A12B", - "display_name": "Nemotron 3 Super 120B A12B", + "id": "gpt-6-astra", + "name": "GPT-6 Astra", + "display_name": "GPT-6 Astra", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -205524,64 +197464,36 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ - "none", "low", - "medium" + "medium", + "high" ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-06", - "release_date": "2026-03-11", - "last_updated": "2026-03-11", - "type": "chat" - }, - { - "id": "grok-imagine-image-2-0", - "name": "Grok Imagine Image 2.0", - "display_name": "Grok Imagine Image 2.0", - "modalities": { - "input": [ - "text", - "image" - ], - "output": [ - "image" - ] - }, - "limit": { - "context": 64000, - "output": 8192 - }, - "temperature": false, - "tool_call": false, - "reasoning": { - "supported": false - }, "attachment": true, "open_weights": false, - "release_date": "2026-08-07", - "last_updated": "2026-08-07" + "knowledge": "2026-04-30", + "release_date": "2026-09-04", + "last_updated": "2026-09-04", + "type": "chat" }, { - "id": "qwen3-7-plus", - "name": "Qwen3.7 Plus", - "display_name": "Qwen3.7 Plus", + "id": "glm-5.1", + "name": "GLM-5.1", + "display_name": "GLM-5.1", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 64000 + "context": 202752, + "output": 202752 }, "temperature": true, "tool_call": true, @@ -205589,29 +197501,38 @@ "supported": true, "default": true }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-04", - "release_date": "2026-06-02", - "last_updated": "2026-06-02", + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, + "open_weights": true, + "release_date": "2026-04-07", + "last_updated": "2026-04-07", "type": "chat" }, { - "id": "gpt-5-6-sol", - "name": "GPT-5.6 Sol", - "display_name": "GPT-5.6 Sol", + "id": "gpt-5-nano", + "name": "GPT-5 Nano", + "display_name": "GPT-5 Nano", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1050000, + "context": 400000, "output": 128000 }, "temperature": false, @@ -205627,12 +197548,10 @@ "mode": "effort", "effort": "medium", "effort_options": [ - "none", + "minimal", "low", "medium", - "high", - "xhigh", - "max" + "high" ], "verbosity": "medium", "verbosity_options": [ @@ -205645,30 +197564,30 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "knowledge": "2024-05-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "claude-opus-5", - "name": "Claude Opus 5", - "display_name": "Claude Opus 5", + "id": "gemini-3.6-flash", + "name": "Gemini 3.6 Flash", + "display_name": "Gemini 3.6 Flash", "modalities": { "input": [ "text", "image", - "pdf" + "audio" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 1048576, + "output": 65535 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -205677,98 +197596,72 @@ "extra_capabilities": { "reasoning": { "supported": true, - "effort_options": [ + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", "low", "medium", - "high", - "xhigh", - "max" + "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-05", - "release_date": "2026-07-24", - "last_updated": "2026-07-24", + "knowledge": "2026-03", + "release_date": "2026-07-21", + "last_updated": "2026-07-21", "type": "chat" }, { - "id": "claude-sonnet-4-6", - "name": "Claude Sonnet 4.6", - "display_name": "Claude Sonnet 4.6", + "id": "voxtral-small-2507", + "name": "voxtral-small-2507", + "display_name": "voxtral-small-2507", "modalities": { "input": [ "text", - "image", - "pdf" + "audio" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 64000 + "context": 32000, + "output": 32000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." - ] - } + "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-17", - "last_updated": "2026-03-13", + "open_weights": true, + "release_date": "2025-07-15", + "last_updated": "2025-07-15", "type": "chat" }, { - "id": "grok-build-0-1", - "name": "Grok Build 0.1", - "display_name": "Grok Build 0.1", + "id": "minimax-m2", + "name": "MiniMax-M2", + "display_name": "MiniMax-M2", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 256000 + "context": 400000, + "output": 196000 }, "temperature": true, "tool_call": true, @@ -205776,16 +197669,36 @@ "supported": true, "default": true }, - "attachment": true, - "open_weights": false, - "release_date": "2026-04-16", - "last_updated": "2026-04-16", + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, + "open_weights": true, + "release_date": "2025-10-27", + "last_updated": "2025-10-27", "type": "chat" - }, + } + ] + }, + "alibaba-token-plan": { + "id": "alibaba-token-plan", + "name": "Alibaba Token Plan", + "display_name": "Alibaba Token Plan", + "api": "https://token-plan.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1", + "doc": "https://www.alibabacloud.com/help/en/model-studio/token-plan-overview", + "models": [ { - "id": "deepseek-v4-flash:free", - "name": "DeepSeek V4 Flash (Free)", - "display_name": "DeepSeek V4 Flash (Free)", + "id": "deepseek-v4-flash-0731", + "name": "DeepSeek V4 Flash 0731", + "display_name": "DeepSeek V4 Flash 0731", "modalities": { "input": [ "text" @@ -205806,8 +197719,14 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ - "low", "high", "max" ] @@ -205816,60 +197735,55 @@ "attachment": false, "open_weights": true, "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "release_date": "2026-07-31", + "last_updated": "2026-07-31", "type": "chat" }, { - "id": "kimi-k2-6", - "name": "Kimi K2.6", - "display_name": "Kimi K2.6", + "id": "happyhorse-1.1-t2v", + "name": "HappyHorse 1.1 Text-to-Video", + "display_name": "HappyHorse 1.1 Text-to-Video", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ - "text" + "video" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 8192, + "output": 8192 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-20", - "last_updated": "2026-04-20", - "type": "chat" + "attachment": false, + "open_weights": false, + "release_date": "2026-07-17", + "last_updated": "2026-07-17" }, { - "id": "gpt-5-6-terra", - "name": "GPT-5.6 Terra", - "display_name": "GPT-5.6 Terra", + "id": "qwen3.6-plus", + "name": "Qwen3.6 Plus", + "display_name": "Qwen3.6 Plus", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1000000, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -205878,37 +197792,25 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "knowledge": "2025-04", + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "gpt-oss-120b", - "name": "GPT OSS 120B", - "display_name": "GPT OSS 120B", + "id": "glm-5.2", + "name": "GLM-5.2", + "display_name": "GLM-5.2", "modalities": { "input": [ "text" @@ -205918,8 +197820,8 @@ ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -205930,24 +197832,54 @@ "extra_capabilities": { "reasoning": { "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ - "low", - "medium", - "high" + "high", + "max" ] } }, "attachment": false, "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "gpt-oss-20b", - "name": "GPT OSS 20B", - "display_name": "GPT OSS 20B", + "id": "qwen-image-2.0-pro", + "name": "Qwen Image 2.0 Pro", + "display_name": "Qwen Image 2.0 Pro", + "modalities": { + "input": [ + "text" + ], + "output": [ + "image" + ] + }, + "limit": { + "context": 8192, + "output": 8192 + }, + "temperature": true, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": false, + "release_date": "2026-03-03", + "last_updated": "2026-03-03" + }, + { + "id": "deepseek-v4-flash", + "name": "DeepSeek V4 Flash", + "display_name": "DeepSeek V4 Flash", "modalities": { "input": [ "text" @@ -205957,8 +197889,8 @@ ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 1000000, + "output": 384000 }, "temperature": true, "tool_call": true, @@ -205969,62 +197901,67 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", "effort_options": [ "low", - "medium", - "high" + "high", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, "attachment": false, "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "minimax-m3", - "name": "MiniMax-M3", - "display_name": "MiniMax-M3", + "id": "happyhorse-1.1-r2v", + "name": "HappyHorse 1.1 Reference-to-Video", + "display_name": "HappyHorse 1.1 Reference-to-Video", "modalities": { "input": [ - "text", "image", - "video" + "text" ], "output": [ - "text" + "video" ] }, "limit": { - "context": 1048576, - "output": 512000 + "context": 8192, + "output": 8192 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, "attachment": true, - "open_weights": true, - "release_date": "2026-06-01", - "last_updated": "2026-06-01", - "type": "chat" + "open_weights": false, + "release_date": "2026-07-17", + "last_updated": "2026-07-17" }, { - "id": "glm-5-3", - "name": "GLM-5.3", - "display_name": "GLM-5.3", + "id": "deepseek-v4.1-flash", + "name": "DeepSeek V4.1 Flash", + "display_name": "DeepSeek V4.1 Flash", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" @@ -206032,7 +197969,7 @@ }, "limit": { "context": 1000000, - "output": 131072 + "output": 384000 }, "temperature": true, "tool_call": true, @@ -206042,6 +197979,13 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ "low", "high", @@ -206049,96 +197993,93 @@ ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "knowledge": "2025-05", + "release_date": "2026-09-10", + "last_updated": "2026-09-10", "type": "chat" }, { - "id": "nano-banana-2", - "name": "Nano Banana 2", - "display_name": "Nano Banana 2", + "id": "MiniMax-M2.5", + "name": "MiniMax-M2.5", + "display_name": "MiniMax-M2.5", "modalities": { "input": [ - "text", - "image", - "video", - "pdf" + "text" ], "output": [ - "text", - "image" + "text" ] }, "limit": { - "context": 131072, + "context": 196608, "output": 32768 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "minimal", - "high" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-05-28", - "last_updated": "2026-05-28" + "attachment": false, + "open_weights": true, + "release_date": "2026-02-12", + "last_updated": "2026-02-12", + "type": "chat" }, { - "id": "gemini-3-1-flash-tts", - "name": "Gemini 3.1 Flash TTS Preview", - "display_name": "Gemini 3.1 Flash TTS Preview", + "id": "happyhorse-1.1-i2v", + "name": "HappyHorse 1.1 Image-to-Video", + "display_name": "HappyHorse 1.1 Image-to-Video", "modalities": { "input": [ + "image", "text" ], "output": [ - "audio" + "video" ] }, "limit": { "context": 8192, - "output": 16384 + "output": 8192 }, "temperature": true, "tool_call": false, "reasoning": { "supported": false }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-04-15", - "last_updated": "2026-04-15" + "release_date": "2026-07-17", + "last_updated": "2026-07-17" }, { - "id": "mimo-v2-5:free", - "name": "MiMo-V2.5 (Free)", - "display_name": "MiMo-V2.5 (Free)", + "id": "glm-5.3", + "name": "GLM-5.3", + "display_name": "GLM-5.3", "modalities": { "input": [ - "text", - "image", - "audio", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, + "context": 1000000, "output": 131072 }, "temperature": true, @@ -206147,32 +198088,43 @@ "supported": true, "default": true }, - "attachment": true, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "low", + "high", + "max" + ] + } + }, + "attachment": false, "open_weights": true, - "knowledge": "2024-12", - "release_date": "2026-04-22", - "last_updated": "2026-04-22", + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "gemini-3-1-flash-lite", - "name": "Gemini 3.1 Flash Lite", - "display_name": "Gemini 3.1 Flash Lite", + "id": "qwen3.7-max", + "name": "Qwen3.7 Max", + "display_name": "Qwen3.7 Max", "modalities": { "input": [ - "text", - "image", - "video", - "audio", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -206182,29 +198134,30 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "minimal", - "low", - "medium", - "high" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-05-07", - "last_updated": "2026-05-07", + "release_date": "2026-05-21", + "last_updated": "2026-05-21", "type": "chat" }, { - "id": "claude-opus-4-8", - "name": "Claude Opus 4.8", - "display_name": "Claude Opus 4.8", + "id": "qwen3.8-max", + "name": "Qwen3.8 Max", + "display_name": "Qwen3.8 Max", "modalities": { "input": [ "text", "image", + "video", "pdf" ], "output": [ @@ -206213,49 +198166,38 @@ }, "limit": { "context": 1000000, - "output": 128000 + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], "interleaved": true, "summaries": true, - "visibility": "omitted", + "visibility": "summary", "continuation": [ "thinking_blocks" ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." + "effort_options": [ + "low", + "medium", + "xhigh" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-01", - "release_date": "2026-05-28", - "last_updated": "2026-05-28", + "release_date": "2026-08-03", + "last_updated": "2026-08-03", "type": "chat" }, { - "id": "kimi-k2-7-code", + "id": "kimi-k2.7-code", "name": "Kimi K2.7 Code", "display_name": "Kimi K2.7 Code", "modalities": { @@ -206278,6 +198220,17 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, "attachment": true, "open_weights": true, "knowledge": "2025-01", @@ -206286,101 +198239,89 @@ "type": "chat" }, { - "id": "nano-banana-pro", - "name": "Nano Banana Pro", - "display_name": "Nano Banana Pro", + "id": "qwen3.6-flash", + "name": "Qwen3.6 Flash", + "display_name": "Qwen3.6 Flash", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ - "text", - "image" + "text" ] }, "limit": { - "context": 65536, - "output": 32768 + "context": 1000000, + "output": 65536 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "low", - "high" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-05-28", - "last_updated": "2026-05-28" + "release_date": "2026-04-27", + "last_updated": "2026-04-27", + "type": "chat" }, { - "id": "step-3-7-flash", - "name": "Step 3.7 Flash", - "display_name": "Step 3.7 Flash", + "id": "qwen-image-2.0", + "name": "Qwen Image 2.0", + "display_name": "Qwen Image 2.0", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ - "text" + "image" ] }, "limit": { - "context": 256000, - "output": 256000 + "context": 8192, + "output": 8192 }, "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high" - ] - } - }, - "attachment": true, - "open_weights": true, - "knowledge": "2026-03-01", - "release_date": "2026-05-29", - "last_updated": "2026-05-29", - "type": "chat" + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": false, + "release_date": "2026-03-03", + "last_updated": "2026-03-03" }, { - "id": "qwen3-8-max", - "name": "Qwen3.8 Max", - "display_name": "Qwen3.8 Max", + "id": "kimi-k2.6", + "name": "Kimi K2.6", + "display_name": "Kimi K2.6", "modalities": { "input": [ "text", "image", - "video", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, @@ -206390,28 +198331,29 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "low", - "medium", - "xhigh" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, "attachment": true, - "open_weights": false, - "release_date": "2026-08-03", - "last_updated": "2026-08-03", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-04-20", + "last_updated": "2026-04-20", "type": "chat" }, { - "id": "claude-fable-5", - "name": "Claude Fable 5", - "display_name": "Claude Fable 5", + "id": "deepseek-v4-pro", + "name": "DeepSeek V4 Pro", + "display_name": "DeepSeek V4 Pro", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" @@ -206419,9 +198361,9 @@ }, "limit": { "context": 1000000, - "output": 128000 + "output": 384000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -206435,47 +198377,35 @@ "effort": "high", "effort_options": [ "low", - "medium", "high", - "xhigh", "max" ], "interleaved": true, "summaries": true, - "visibility": "omitted", + "visibility": "summary", "continuation": [ "thinking_blocks" ], "notes": [ - "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", - "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", - "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-09", - "last_updated": "2026-06-09", + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" - } - ] - }, - "volcengine-coding-plan": { - "id": "volcengine-coding-plan", - "name": "Volcengine Ark Coding Plan", - "display_name": "Volcengine Ark Coding Plan", - "api": "https://ark.cn-beijing.volces.com/api/coding/v3", - "doc": "https://www.volcengine.com/docs/82379/1928261", - "models": [ + }, { - "id": "deepseek-v4-flash", - "name": "DeepSeek V4 Flash", - "display_name": "DeepSeek V4 Flash", + "id": "deepseek-v4.1-flash-1017", + "name": "DeepSeek V4.1 Flash 1017", + "display_name": "DeepSeek V4.1 Flash 1017", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" @@ -206494,36 +198424,30 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "high", - "max" - ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" ], - "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." + "effort_options": [ + "low", + "high", + "max" ] } }, - "attachment": false, + "attachment": true, "open_weights": true, "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "release_date": "2026-10-17", + "last_updated": "2026-10-17", "type": "chat" }, { - "id": "kimi-k2.7-code", - "name": "Kimi K2.7 Code", - "display_name": "Kimi K2.7 Code", + "id": "qwen3.8-max-preview", + "name": "Qwen3.8 Max Preview", + "display_name": "Qwen3.8 Max Preview", "modalities": { "input": [ "text", @@ -206535,10 +198459,10 @@ ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1000000, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -206552,20 +198476,58 @@ "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "effort_options": [ + "low", + "medium", + "xhigh" ] } }, "attachment": true, + "open_weights": false, + "release_date": "2026-07-19", + "last_updated": "2026-07-19", + "type": "chat" + }, + { + "id": "deepseek-v3.2", + "name": "DeepSeek V3.2", + "display_name": "DeepSeek V3.2", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 131072, + "output": 65536 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": false, "open_weights": true, "knowledge": "2025-01", - "release_date": "2026-06-12", - "last_updated": "2026-06-12", + "release_date": "2025-12-03", + "last_updated": "2025-12-05", "type": "chat" }, { - "id": "deepseek-v4-pro", - "name": "DeepSeek V4 Pro", - "display_name": "DeepSeek V4 Pro", + "id": "glm-5", + "name": "GLM-5", + "display_name": "GLM-5", "modalities": { "input": [ "text" @@ -206575,8 +198537,8 @@ ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 202752, + "output": 16384 }, "temperature": true, "tool_call": true, @@ -206587,39 +198549,29 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "high", - "max" - ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "open_weights": false, + "release_date": "2026-02-12", + "last_updated": "2026-02-12", "type": "chat" }, { - "id": "glm-5.3", - "name": "GLM-5.3", - "display_name": "GLM-5.3", + "id": "qwen3.7-plus", + "name": "Qwen3.7 Plus", + "display_name": "Qwen3.7 Plus", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" @@ -206627,7 +198579,7 @@ }, "limit": { "context": 1000000, - "output": 131072 + "output": 65536 }, "temperature": true, "tool_call": true, @@ -206643,24 +198595,20 @@ "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "effort_options": [ - "low", - "high", - "max" ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "attachment": true, + "open_weights": false, + "knowledge": "2025-04", + "release_date": "2026-06-02", + "last_updated": "2026-06-02", "type": "chat" }, { - "id": "kimi-k3", - "name": "Kimi K3", - "display_name": "Kimi K3", + "id": "qwen3.8-flash", + "name": "Qwen3.8 Flash", + "display_name": "Qwen3.8 Flash", "modalities": { "input": [ "text", @@ -206672,10 +198620,10 @@ ] }, "limit": { - "context": 1048576, + "context": 1000000, "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -206692,21 +198640,21 @@ ], "effort_options": [ "low", - "high", - "max" + "medium", + "xhigh" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-16", + "open_weights": false, + "release_date": "2026-08-26", + "last_updated": "2026-08-26", "type": "chat" }, { - "id": "minimax-m3", - "name": "MiniMax-M3", - "display_name": "MiniMax-M3", + "id": "kimi-k2.5", + "name": "Kimi K2.5", + "display_name": "Kimi K2.5", "modalities": { "input": [ "text", @@ -206718,8 +198666,8 @@ ] }, "limit": { - "context": 1048576, - "output": 512000 + "context": 262144, + "output": 98304 }, "temperature": true, "tool_call": true, @@ -206740,20 +198688,44 @@ }, "attachment": true, "open_weights": true, - "release_date": "2026-06-01", - "last_updated": "2026-06-01", + "knowledge": "2025-01", + "release_date": "2026-01-27", + "last_updated": "2026-01-27", "type": "chat" }, { - "id": "glm-5.3-flash", - "name": "GLM-5.3-Flash", - "display_name": "GLM-5.3-Flash", + "id": "wan2.7-image", + "name": "Wan2.7 Image", + "display_name": "Wan2.7 Image", "modalities": { "input": [ - "text", - "image", - "video", - "pdf" + "text" + ], + "output": [ + "image" + ] + }, + "limit": { + "context": 8192, + "output": 8192 + }, + "temperature": true, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": false, + "release_date": "2026-05-29", + "last_updated": "2026-05-29" + }, + { + "id": "deepseek-v4-pro-0813", + "name": "DeepSeek V4 Pro 0813", + "display_name": "DeepSeek V4 Pro 0813", + "modalities": { + "input": [ + "text" ], "output": [ "text" @@ -206761,7 +198733,7 @@ }, "limit": { "context": 1000000, - "output": 131072 + "output": 384000 }, "temperature": true, "tool_call": true, @@ -206779,35 +198751,32 @@ "thinking_blocks" ], "effort_options": [ - "low", "high", "max" ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", + "release_date": "2026-08-13", + "last_updated": "2026-08-22", "type": "chat" }, { - "id": "doubao-seed-2.1-turbo", - "name": "Seed 2.1 Turbo", - "display_name": "Seed 2.1 Turbo", + "id": "glm-5.1", + "name": "GLM-5.1", + "display_name": "GLM-5.1", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 256000 + "context": 202752, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -206823,37 +198792,116 @@ "visibility": "summary", "continuation": [ "thinking_blocks" - ], + ] + } + }, + "attachment": false, + "open_weights": true, + "release_date": "2026-04-07", + "last_updated": "2026-04-07", + "type": "chat" + }, + { + "id": "wan2.7-image-pro", + "name": "Wan2.7 Image Pro", + "display_name": "Wan2.7 Image Pro", + "modalities": { + "input": [ + "text" + ], + "output": [ + "image" + ] + }, + "limit": { + "context": 8192, + "output": 8192 + }, + "temperature": true, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": false, + "release_date": "2026-05-29", + "last_updated": "2026-05-29" + } + ] + }, + "echo": { + "id": "echo", + "name": "Echo", + "display_name": "Echo", + "api": "https://echo.tracerml.ai/v1", + "doc": "https://echo.tracerml.ai/docs/api", + "models": [ + { + "id": "echo", + "name": "Echo", + "display_name": "Echo", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 262144, + "output": 65536 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { "effort_options": [ "none", "low", + "medium", "high" ] } }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2026-06-23", - "last_updated": "2026-06-23", + "release_date": "2026-07-19", + "last_updated": "2026-08-16", "type": "chat" - }, + } + ] + }, + "qihang-ai": { + "id": "qihang-ai", + "name": "QiHang", + "display_name": "QiHang", + "api": "https://api.qhaigc.net/v1", + "doc": "https://www.qhaigc.net/docs", + "models": [ { - "id": "doubao-seed-2.0-lite", - "name": "Seed 2.0 Lite", - "display_name": "Seed 2.0 Lite", + "id": "gemini-3-flash-preview", + "name": "Gemini 3 Flash Preview", + "display_name": "Gemini 3 Flash Preview", "modalities": { "input": [ "text", "image", - "video" + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 32000 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -206864,33 +198912,38 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", + "low", + "medium", + "high" + ], "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "none", - "low", - "high" + "thought_signatures" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-02-14", - "last_updated": "2026-02-14", + "knowledge": "2025-01", + "release_date": "2025-12-17", + "last_updated": "2025-12-17", "type": "chat" }, { - "id": "doubao-seed-evolving", - "name": "Seed Evolving", - "display_name": "Seed Evolving", + "id": "gemini-3-pro-preview", + "name": "Gemini 3 Pro Preview", + "display_name": "Gemini 3 Pro Preview", "modalities": { "input": [ "text", "image", + "audio", "video" ], "output": [ @@ -206898,8 +198951,8 @@ ] }, "limit": { - "context": 256000, - "output": 256000 + "context": 1000000, + "output": 65000 }, "temperature": true, "tool_call": true, @@ -206910,38 +198963,31 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "low", + "high" + ], "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "none", - "low", - "high" + "thought_signatures" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-06-23", - "last_updated": "2026-06-23", + "knowledge": "2025-11", + "release_date": "2025-11-18", + "last_updated": "2025-11-18", "type": "chat" - } - ] - }, - "neon": { - "id": "neon", - "name": "Neon", - "display_name": "Neon", - "api": "${NEON_AI_GATEWAY_BASE_URL}/v1", - "doc": "https://neon.com/docs", - "models": [ + }, { - "id": "llama-4-maverick", - "name": "Llama 4 Maverick 17B Instruct", - "display_name": "Llama 4 Maverick 17B Instruct", + "id": "gpt-5-mini", + "name": "GPT-5-Mini", + "display_name": "GPT-5-Mini", "modalities": { "input": [ "text", @@ -206952,25 +198998,47 @@ ] }, "limit": { - "context": 1000000, - "output": 8192 + "context": 200000, + "output": 64000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "minimal", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } }, "attachment": true, - "open_weights": true, - "knowledge": "2024-08", - "release_date": "2025-04-05", - "last_updated": "2025-04-05", + "open_weights": false, + "knowledge": "2024-09-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "claude-haiku-5-5", - "name": "Claude Haiku 5.5", - "display_name": "Claude Haiku 5.5", + "id": "claude-haiku-4-5-20251001", + "name": "Claude Haiku 4.5", + "display_name": "Claude Haiku 4.5", "modalities": { "input": [ "text", @@ -206982,38 +199050,62 @@ ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 200000, + "output": 64000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + ] + } }, "attachment": true, "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-10-07", - "last_updated": "2026-10-07", + "knowledge": "2025-07-31", + "release_date": "2025-10-15", + "last_updated": "2025-10-15", "type": "chat" }, { - "id": "deepseek-v4-1-flash", - "name": "DeepSeek V4.1 Flash", - "display_name": "DeepSeek V4.1 Flash", + "id": "gemini-2.5-flash", + "name": "Gemini 2.5 Flash", + "display_name": "Gemini 2.5 Flash", "modalities": { "input": [ "text", - "image" + "image", + "audio", + "video", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -207023,109 +199115,138 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "low", - "high", - "max" + "supported": true, + "default_enabled": true, + "mode": "budget", + "budget": { + "default": -1, + "min": 0, + "max": 24576, + "auto": -1, + "off": 0, + "unit": "tokens" + }, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-09-10", - "last_updated": "2026-09-10", + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2025-06-17", + "last_updated": "2025-06-17", "type": "chat" }, { - "id": "claude-opus-4-7", - "name": "Claude Opus 4.7", - "display_name": "Claude Opus 4.7", + "id": "gpt-5.2-codex", + "name": "GPT-5.2 Codex", + "display_name": "GPT-5.2 Codex", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, + "context": 400000, "output": 128000 }, "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, + "default_enabled": true, "mode": "effort", - "effort": "high", + "effort": "medium", "effort_options": [ "low", "medium", "high", - "xhigh", - "max" + "xhigh" ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." - ] + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-04-16", - "last_updated": "2026-04-16", + "knowledge": "2025-08-31", + "release_date": "2025-12-11", + "last_updated": "2025-12-11", "type": "chat" }, { - "id": "meta-llama-3-3-70b-instruct", - "name": "Llama-3.3-70B-Instruct", - "display_name": "Llama-3.3-70B-Instruct", + "id": "gpt-5.2", + "name": "GPT-5.2", + "display_name": "GPT-5.2", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 400000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false }, - "attachment": false, - "open_weights": true, - "knowledge": "2023-12", - "release_date": "2024-12-06", - "last_updated": "2024-12-06", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2025-12-11", + "last_updated": "2025-12-11", "type": "chat" }, { - "id": "claude-sonnet-4-5", - "name": "Claude Sonnet 4.5 (latest)", - "display_name": "Claude Sonnet 4.5 (latest)", + "id": "claude-sonnet-4-5-20250929", + "name": "Claude Sonnet 4.5", + "display_name": "Claude Sonnet 4.5", "modalities": { "input": [ "text", @@ -207175,9 +199296,9 @@ "type": "chat" }, { - "id": "gpt-5-2", - "name": "GPT-5.2", - "display_name": "GPT-5.2", + "id": "claude-opus-4-5-20251101", + "name": "Claude Opus 4.5", + "display_name": "Claude Opus 4.5", "modalities": { "input": [ "text", @@ -207188,8 +199309,8 @@ ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 200000, + "output": 32000 }, "temperature": true, "tool_call": true, @@ -207201,35 +199322,78 @@ "reasoning": { "supported": true, "default_enabled": false, - "mode": "effort", - "effort": "none", + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ "low", "medium", "high" ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2025-12-11", - "last_updated": "2025-12-11", + "knowledge": "2025-03", + "release_date": "2025-11-24", + "last_updated": "2025-11-24", + "type": "chat" + } + ] + }, + "io-net": { + "id": "io-net", + "name": "IO.NET", + "display_name": "IO.NET", + "api": "https://api.intelligence.io.solutions/api/v1", + "doc": "https://io.net/docs/guides/intelligence/io-intelligence", + "models": [ + { + "id": "meta-llama/Llama-3.2-90B-Vision-Instruct", + "name": "Llama 3.2 90B Vision Instruct", + "display_name": "Llama 3.2 90B Vision Instruct", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 16000, + "output": 4096 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": true, + "knowledge": "2023-12", + "release_date": "2024-09-25", + "last_updated": "2024-09-25", "type": "chat" }, { - "id": "qwen3-next-80b-a3b-instruct", - "name": "Qwen3-Next 80B-A3B Instruct", - "display_name": "Qwen3-Next 80B-A3B Instruct", + "id": "meta-llama/Llama-3.3-70B-Instruct", + "name": "Llama 3.3 70B Instruct", + "display_name": "Llama 3.3 70B Instruct", "modalities": { "input": [ "text" @@ -207239,8 +199403,8 @@ ] }, "limit": { - "context": 131072, - "output": 10000 + "context": 128000, + "output": 4096 }, "temperature": true, "tool_call": true, @@ -207249,73 +199413,55 @@ }, "attachment": false, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-09", - "last_updated": "2025-09", + "knowledge": "2023-12", + "release_date": "2024-12-06", + "last_updated": "2024-12-06", "type": "chat" }, { - "id": "gemini-3-6-flash", - "name": "Gemini 3.6 Flash", - "display_name": "Gemini 3.6 Flash", + "id": "meta-llama/Llama-4-Maverick-17B-128E-Instruct-FP8", + "name": "Llama 4 Maverick 17B 128E Instruct", + "display_name": "Llama 4 Maverick 17B 128E Instruct", "modalities": { "input": [ "text", - "image", - "video", - "audio", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 430000, + "output": 4096 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "minimal", - "low", - "medium", - "high" - ] - } + "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-07-21", - "last_updated": "2026-07-21", + "open_weights": true, + "knowledge": "2024-12", + "release_date": "2025-04-05", + "last_updated": "2025-04-05", "type": "chat" }, { - "id": "gemini-3-5-flash", - "name": "Gemini 3.5 Flash", - "display_name": "Gemini 3.5 Flash", + "id": "moonshotai/Kimi-K2-Thinking", + "name": "Kimi K2 Thinking", + "display_name": "Kimi K2 Thinking", "modalities": { "input": [ - "text", - "image", - "video", - "audio", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 32768, + "output": 4096 }, "temperature": true, "tool_call": true, @@ -207325,39 +199471,67 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "minimal", - "low", - "medium", - "high" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-05-19", - "last_updated": "2026-05-19", + "attachment": false, + "open_weights": true, + "knowledge": "2024-08", + "release_date": "2025-11-06", + "last_updated": "2025-11-06", "type": "chat" }, { - "id": "gpt-5-nano", - "name": "GPT-5 Nano", - "display_name": "GPT-5 Nano", + "id": "moonshotai/Kimi-K2-Instruct-0905", + "name": "Kimi K2 Instruct", + "display_name": "Kimi K2 Instruct", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 32768, + "output": 4096 }, - "temperature": false, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "knowledge": "2024-08", + "release_date": "2025-09-05", + "last_updated": "2025-09-05", + "type": "chat" + }, + { + "id": "openai/gpt-oss-20b", + "name": "GPT-OSS 20B", + "display_name": "GPT-OSS 20B", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 64000, + "output": 4096 + }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -207366,52 +199540,37 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", "effort_options": [ - "minimal", "low", "medium", "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-05-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "attachment": false, + "open_weights": true, + "knowledge": "2024-10", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "gemini-3-7-flash", - "name": "Gemini 3.7 Flash", - "display_name": "Gemini 3.7 Flash", + "id": "openai/gpt-oss-120b", + "name": "GPT-OSS 120B", + "display_name": "GPT-OSS 120B", "modalities": { "input": [ - "text", - "image", - "video", - "audio", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 131072, + "output": 4096 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -207419,6 +199578,7 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ "low", "medium", @@ -207426,69 +199586,113 @@ ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-08-13", - "last_updated": "2026-08-13", + "attachment": false, + "open_weights": true, + "knowledge": "2024-10", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", + "type": "chat" + }, + { + "id": "Intel/Qwen3-Coder-480B-A35B-Instruct-int4-mixed-ar", + "name": "Qwen 3 Coder 480B", + "display_name": "Qwen 3 Coder 480B", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 106000, + "output": 4096 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "knowledge": "2024-12", + "release_date": "2025-07-22", + "last_updated": "2025-07-22", + "type": "chat" + }, + { + "id": "Qwen/Qwen3-Next-80B-A3B-Instruct", + "name": "Qwen 3 Next 80B Instruct", + "display_name": "Qwen 3 Next 80B Instruct", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 262144, + "output": 4096 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "knowledge": "2024-12", + "release_date": "2025-09", + "last_updated": "2025-09", "type": "chat" }, { - "id": "claude-haiku-4-5", - "name": "Claude Haiku 4.5 (latest)", - "display_name": "Claude Haiku 4.5 (latest)", + "id": "Qwen/Qwen3-235B-A22B-Thinking-2507", + "name": "Qwen 3 235B Thinking", + "display_name": "Qwen 3 235B Thinking", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 262144, + "output": 4096 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-02-28", - "release_date": "2025-10-15", - "last_updated": "2025-10-15", + "attachment": false, + "open_weights": true, + "knowledge": "2024-12", + "release_date": "2025-07-25", + "last_updated": "2025-07-25", "type": "chat" }, { - "id": "glm-5-3-flash", - "name": "GLM-5.3 Flash", - "display_name": "GLM-5.3 Flash", + "id": "Qwen/Qwen2.5-VL-32B-Instruct", + "name": "Qwen 2.5 VL 32B Instruct", + "display_name": "Qwen 2.5 VL 32B Instruct", "modalities": { "input": [ "text", @@ -207499,49 +199703,38 @@ ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 32000, + "output": 4096 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "high", - "max" - ] - } + "supported": false }, "attachment": true, "open_weights": true, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", + "knowledge": "2024-09", + "release_date": "2024-11-01", + "last_updated": "2024-11-01", "type": "chat" }, { - "id": "claude-sonnet-5-5", - "name": "Claude Sonnet 5.5", - "display_name": "Claude Sonnet 5.5", + "id": "zai-org/GLM-4.6", + "name": "GLM 4.6", + "display_name": "GLM 4.6", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 200000, + "output": 4096 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -207549,41 +199742,39 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ + "none", "low", "medium", - "high", - "xhigh", - "max" + "high" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-09-28", - "last_updated": "2026-09-28", + "attachment": false, + "open_weights": true, + "knowledge": "2024-10", + "release_date": "2025-09-30", + "last_updated": "2025-09-30", "type": "chat" }, { - "id": "claude-fable-5-1", - "name": "Claude Fable 5.1", - "display_name": "Claude Fable 5.1", + "id": "deepseek-ai/DeepSeek-R1-0528", + "name": "DeepSeek R1", + "display_name": "DeepSeek R1", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 128000, + "output": 4096 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -207592,175 +199783,109 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], "interleaved": true, "summaries": true, - "visibility": "omitted", + "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", - "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", - "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-09-01", - "last_updated": "2026-09-01", + "attachment": false, + "open_weights": true, + "knowledge": "2024-07", + "release_date": "2025-05-28", + "last_updated": "2025-05-28", "type": "chat" }, { - "id": "gpt-5-5", - "name": "GPT-5.5", - "display_name": "GPT-5.5", + "id": "mistralai/Devstral-Small-2505", + "name": "Devstral Small 2505", + "display_name": "Devstral Small 2505", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 128000, + "output": 4096 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-12-01", - "release_date": "2026-04-23", - "last_updated": "2026-04-23", + "knowledge": "2024-12", + "release_date": "2025-05-01", + "last_updated": "2025-05-01", "type": "chat" }, { - "id": "grok-4-6", - "name": "Grok 4.6", - "display_name": "Grok 4.6", + "id": "mistralai/Mistral-Nemo-Instruct-2407", + "name": "Mistral Nemo Instruct 2407", + "display_name": "Mistral Nemo Instruct 2407", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 500000, - "output": 524288 + "context": 128000, + "output": 4096 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ] - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-02-01", - "release_date": "2026-08-12", - "last_updated": "2026-08-12", + "attachment": false, + "open_weights": true, + "knowledge": "2024-05", + "release_date": "2024-07-18", + "last_updated": "2024-07-18", "type": "chat" }, { - "id": "claude-sonnet-5", - "name": "Claude Sonnet 5", - "display_name": "Claude Sonnet 5", + "id": "mistralai/Mistral-Large-Instruct-2411", + "name": "Mistral Large Instruct 2411", + "display_name": "Mistral Large Instruct 2411", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 128000, + "output": 4096 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ] - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-30", - "last_updated": "2026-06-30", + "attachment": false, + "open_weights": true, + "knowledge": "2024-10", + "release_date": "2024-11-18", + "last_updated": "2024-11-18", "type": "chat" }, { - "id": "glm-5-2", - "name": "GLM-5.2", - "display_name": "GLM-5.2", + "id": "mistralai/Magistral-Small-2506", + "name": "Magistral Small 2506", + "display_name": "Magistral Small 2506", "modalities": { "input": [ "text" @@ -207770,104 +199895,86 @@ ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 128000, + "output": 4096 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "minimal", - "low", - "medium", - "high", - "max" - ] - } + "supported": false }, "attachment": false, "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "knowledge": "2025-01", + "release_date": "2025-06-10", + "last_updated": "2025-06-10", "type": "chat" - }, + } + ] + }, + "llmgateway-providers": { + "id": "llmgateway-providers", + "name": "LLM Gateway", + "display_name": "LLM Gateway", + "api": "https://api.llmgateway.io/v1", + "doc": "https://llmgateway.io/docs", + "models": [ { - "id": "gpt-5-4-mini", - "name": "GPT-5.4 mini", - "display_name": "GPT-5.4 mini", + "id": "groq/gpt-oss-20b", + "name": "GPT OSS 20B (Groq)", + "display_name": "GPT OSS 20B (Groq)", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 131072, + "output": 32766 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ "low", "medium", "high" - ], - "visibility": "hidden" + ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-17", - "last_updated": "2026-03-17", + "attachment": false, + "open_weights": true, + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "gpt-5-6-luna", - "name": "GPT-5.6 Luna", - "display_name": "GPT-5.6 Luna", + "id": "groq/gpt-oss-120b", + "name": "GPT OSS 120B (Groq)", + "display_name": "GPT OSS 120B (Groq)", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 131072, + "output": 32766 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -207876,42 +199983,27 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ], - "verbosity": "medium", - "verbosity_options": [ "low", "medium", "high" - ], - "visibility": "hidden" + ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "attachment": false, + "open_weights": true, + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "claude-opus-5-5", - "name": "Claude Opus 5.5", - "display_name": "Claude Opus 5.5", + "id": "scx-ai-gp/glm-5.2", + "name": "GLM-5.2 (SCX.ai)", + "display_name": "GLM-5.2 (SCX.ai)", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" @@ -207919,9 +200011,9 @@ }, "limit": { "context": 1000000, - "output": 128000 + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -207929,7 +200021,16 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ + "none", + "minimal", "low", "medium", "high", @@ -207938,74 +200039,54 @@ ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "attachment": false, + "open_weights": true, + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "gpt-6-sol", - "name": "GPT-6 Sol", - "display_name": "GPT-6 Sol", + "id": "scx-ai-gp/glm-5.3-fast", + "name": "GLM 5.3 Fast (SCX.ai)", + "display_name": "GLM 5.3 Fast (SCX.ai)", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, + "context": 1000000, "output": 128000 }, - "temperature": false, - "tool_call": true, + "temperature": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ] - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-04-20", - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "attachment": false, + "open_weights": true, + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "gemini-3-1-pro", - "name": "Gemini 3.1 Pro Preview Custom Tools", - "display_name": "Gemini 3.1 Pro Preview Custom Tools", + "id": "scx-ai-gp/glm-5.2-fast", + "name": "GLM-5.2 Turbo (SCX.ai)", + "display_name": "GLM-5.2 Turbo (SCX.ai)", "modalities": { "input": [ - "text", - "image", - "video", - "audio", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -208013,59 +200094,92 @@ "supported": true, "default": true }, + "attachment": false, + "open_weights": true, + "release_date": "2026-06-13", + "last_updated": "2026-06-13", + "type": "chat" + }, + { + "id": "scx-ai-gp/deepseek-v4.1-flash", + "name": "DeepSeek V4.1 Flash (SCX.ai)", + "display_name": "DeepSeek V4.1 Flash (SCX.ai)", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1000000, + "output": 384000 + }, + "temperature": true, + "tool_call": false, + "reasoning": { + "supported": true + }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "low", - "medium", - "high" - ] + "supported": true } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-02-19", - "last_updated": "2026-02-19", + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-09-10", + "last_updated": "2026-09-10", "type": "chat" }, { - "id": "gemma-3-12b", - "name": "Gemma 3 12B", - "display_name": "Gemma 3 12B", + "id": "scx-ai-gp/glm-5.3", + "name": "GLM-5.3 (SCX.ai)", + "display_name": "GLM-5.3 (SCX.ai)", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 1000000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "low", + "high", + "max" + ] + } + }, + "attachment": false, "open_weights": true, - "knowledge": "2024-08-31", - "release_date": "2025-03-12", - "last_updated": "2025-03-12", + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "claude-opus-4-5", - "name": "Claude Opus 4.5 (latest)", - "display_name": "Claude Opus 4.5 (latest)", + "id": "scx-ai-gp/qwen3.8-max", + "name": "Qwen3.8 Max (SCX.ai)", + "display_name": "Qwen3.8 Max (SCX.ai)", "modalities": { "input": [ "text", "image", + "video", "pdf" ], "output": [ @@ -208073,81 +200187,85 @@ ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", "effort_options": [ "low", "medium", - "high" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." + "xhigh" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-05", - "release_date": "2025-11-24", - "last_updated": "2025-11-24", + "release_date": "2026-08-03", + "last_updated": "2026-08-03", "type": "chat" }, { - "id": "meta-llama-3-1-8b-instruct", - "name": "Llama 3.1 8B Instruct", - "display_name": "Llama 3.1 8B Instruct", + "id": "scx-ai-gp/kimi-k2.7-code", + "name": "Kimi K2.7 Code (SCX.ai)", + "display_name": "Kimi K2.7 Code (SCX.ai)", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 262144, + "output": 262144 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "none", + "minimal", + "low", + "medium", + "high", + "xhigh" + ] + } + }, + "attachment": true, "open_weights": true, - "knowledge": "2023-12-31", - "release_date": "2024-07-23", - "last_updated": "2024-07-23", + "knowledge": "2025-01", + "release_date": "2026-06-12", + "last_updated": "2026-06-12", "type": "chat" }, { - "id": "kimi-k3", - "name": "Kimi K3", - "display_name": "Kimi K3", + "id": "scx-ai-gp/kimi-k3", + "name": "Kimi K3 (SCX.ai)", + "display_name": "Kimi K3 (SCX.ai)", "modalities": { "input": [ "text", @@ -208160,9 +200278,9 @@ }, "limit": { "context": 1048576, - "output": 65536 + "output": 1048576 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -208177,6 +200295,7 @@ "low", "medium", "high", + "xhigh", "max" ] } @@ -208188,61 +200307,50 @@ "type": "chat" }, { - "id": "gpt-5-4-nano", - "name": "GPT-5.4 nano", - "display_name": "GPT-5.4 nano", + "id": "scx-ai-gp/glm-5.3-flash", + "name": "GLM-5.3 Flash (SCX.ai)", + "display_name": "GLM-5.3 Flash (SCX.ai)", "modalities": { "input": [ "text", - "image" + "image", + "video", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 1048576, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", "effort_options": [ - "none", "low", - "medium", "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "max" + ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-17", - "last_updated": "2026-03-17", + "open_weights": true, + "release_date": "2026-08-26", + "last_updated": "2026-08-26", "type": "chat" }, { - "id": "gpt-6-1-sol", - "name": "GPT-6.1 Sol", - "display_name": "GPT-6.1 Sol", + "id": "xai/grok-4-3", + "name": "Grok 4.3 (xAI)", + "display_name": "Grok 4.3 (xAI)", "modalities": { "input": [ "text", @@ -208254,10 +200362,10 @@ ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1000000, + "output": 1000000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -208266,24 +200374,23 @@ "extra_capabilities": { "reasoning": { "effort_options": [ + "none", "low", "medium", - "high", - "xhigh" + "high" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-04-30", - "release_date": "2026-09-29", - "last_updated": "2026-09-29", + "release_date": "2026-04-17", + "last_updated": "2026-04-17", "type": "chat" }, { - "id": "gpt-5-6-sol", - "name": "GPT-5.6 Sol", - "display_name": "GPT-5.6 Sol", + "id": "xai/grok-4-7", + "name": "Grok 4.7 (xAI)", + "display_name": "Grok 4.7 (xAI)", "modalities": { "input": [ "text", @@ -208295,10 +200402,10 @@ ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 500000, + "output": 500000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -208306,53 +200413,39 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", "effort_options": [ - "none", "low", "medium", "high", - "xhigh", - "max" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "xhigh" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "knowledge": "2026-05", + "release_date": "2026-09-21", + "last_updated": "2026-09-21", "type": "chat" }, { - "id": "claude-opus-5", - "name": "Claude Opus 5", - "display_name": "Claude Opus 5", + "id": "xai/grok-4-6", + "name": "Grok 4.6 (xAI)", + "display_name": "Grok 4.6 (xAI)", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 500000, + "output": 500000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -208360,44 +200453,39 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ "low", "medium", "high", - "xhigh", - "max" + "xhigh" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-05", - "release_date": "2026-07-24", - "last_updated": "2026-07-24", + "knowledge": "2026-02-01", + "release_date": "2026-08-12", + "last_updated": "2026-08-12", "type": "chat" }, { - "id": "gemini-3-8-flash", - "name": "Gemini 3.8 Flash", - "display_name": "Gemini 3.8 Flash", + "id": "xai/grok-4", + "name": "Grok 4 (xAI)", + "display_name": "Grok 4 (xAI)", "modalities": { "input": [ "text", - "image", - "video", - "audio", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 256000, + "output": 256000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -208405,23 +200493,19 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "low", - "medium", - "high" - ] + "supported": true } }, "attachment": true, "open_weights": false, - "release_date": "2026-09-02", - "last_updated": "2026-09-02", + "release_date": "2025-07-09", + "last_updated": "2025-07-09", "type": "chat" }, { - "id": "claude-sonnet-4-6", - "name": "Claude Sonnet 4.6", - "display_name": "Claude Sonnet 4.6", + "id": "xai/grok-4-20-beta-0309-non-reasoning", + "name": "Grok 4.20 Beta Non-Reasoning (0309) (xAI)", + "display_name": "Grok 4.20 Beta Non-Reasoning (0309) (xAI)", "modalities": { "input": [ "text", @@ -208433,57 +200517,28 @@ ] }, "limit": { - "context": 1000000, - "output": 64000 + "context": 2000000, + "output": 30000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." - ] - } + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-17", - "last_updated": "2026-03-13", + "release_date": "2026-03-09", + "last_updated": "2026-03-09", "type": "chat" }, { - "id": "grok-4-7", - "name": "Grok 4.7", - "display_name": "Grok 4.7", + "id": "xai/grok-4-5", + "name": "Grok 4.5 (xAI)", + "display_name": "Grok 4.5 (xAI)", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" @@ -208504,22 +200559,20 @@ "effort_options": [ "low", "medium", - "high", - "xhigh" + "high" ] } }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2026-05", - "release_date": "2026-09-21", - "last_updated": "2026-09-21", + "release_date": "2026-07-08", + "last_updated": "2026-07-08", "type": "chat" }, { - "id": "gpt-6-astra", - "name": "GPT-6 Astra", - "display_name": "GPT-6 Astra", + "id": "xai/grok-4-20-beta-0309-reasoning", + "name": "Grok 4.20 Beta Reasoning (0309) (xAI)", + "display_name": "Grok 4.20 Beta Reasoning (0309) (xAI)", "modalities": { "input": [ "text", @@ -208531,10 +200584,10 @@ ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 2000000, + "output": 30000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -208542,27 +200595,23 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ "low", "medium", - "high", - "xhigh", - "max" + "high" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-04-30", - "release_date": "2026-09-04", - "last_updated": "2026-09-04", + "release_date": "2026-03-09", + "last_updated": "2026-03-09", "type": "chat" }, { - "id": "gpt-5-6-terra", - "name": "GPT-5.6 Terra", - "display_name": "GPT-5.6 Terra", + "id": "xai/grok-build-0-1", + "name": "Grok Build 0.1 (xAI)", + "display_name": "Grok Build 0.1 (xAI)", "modalities": { "input": [ "text", @@ -208574,10 +200623,10 @@ ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 256000, + "output": 256000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -208585,38 +200634,23 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ], - "verbosity": "medium", - "verbosity_options": [ "low", "medium", "high" - ], - "visibility": "hidden" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "release_date": "2026-04-16", + "last_updated": "2026-04-16", "type": "chat" }, { - "id": "gpt-oss-120b", - "name": "GPT OSS 120B", - "display_name": "GPT OSS 120B", + "id": "zai/glm-5.2", + "name": "GLM-5.2 (Z AI)", + "display_name": "GLM-5.2 (Z AI)", "modalities": { "input": [ "text" @@ -208626,8 +200660,8 @@ ] }, "limit": { - "context": 131072, - "output": 25000 + "context": 1000000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -208638,37 +200672,67 @@ "extra_capabilities": { "reasoning": { "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ - "low", - "medium", - "high" + "none", + "high", + "max" ] } }, "attachment": false, "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "inkling", - "name": "Inkling", - "display_name": "Inkling", + "id": "zai/glm-4-32b-0414-128k", + "name": "GLM-4 32B (0414-128k) (Z AI)", + "display_name": "GLM-4 32B (0414-128k) (Z AI)", "modalities": { "input": [ - "text", - "image", - "audio" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 128000, + "output": 128000 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": false, + "release_date": "2025-04-14", + "last_updated": "2025-04-14", + "type": "chat" + }, + { + "id": "zai/glm-5.3", + "name": "GLM-5.3 (Z AI)", + "display_name": "GLM-5.3 (Z AI)", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1000000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -208678,85 +200742,82 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ - "none", - "minimal", "low", - "medium", "high", "max" ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-07-15", - "last_updated": "2026-07-15", + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "claude-opus-4-6", - "name": "Claude Opus 4.6", - "display_name": "Claude Opus 4.6", + "id": "zai/glm-4.7-flashx", + "name": "GLM-4.7 FlashX (Z AI)", + "display_name": "GLM-4.7 FlashX (Z AI)", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 200000, + "output": 128000 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2026-01-19", + "last_updated": "2026-01-19", + "type": "chat" + }, + { + "id": "zai/glm-4.5", + "name": "GLM-4.5 (Z AI)", + "display_name": "GLM-4.5 (Z AI)", + "modalities": { + "input": [ + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 128000, + "output": 98304 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." - ] - } + "default": true }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-05-31", - "release_date": "2026-02-05", - "last_updated": "2026-03-13", + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-07-28", + "last_updated": "2025-07-28", "type": "chat" }, { - "id": "gpt-5-mini", - "name": "GPT-5 Mini", - "display_name": "GPT-5 Mini", + "id": "zai/glm-4.6v-flashx", + "name": "GLM-4.6V FlashX (Z AI)", + "display_name": "GLM-4.6V FlashX (Z AI)", "modalities": { "input": [ "text", @@ -208767,58 +200828,38 @@ ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 128000, + "output": 16000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "minimal", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } - }, "attachment": true, "open_weights": false, - "knowledge": "2024-05-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "release_date": "2025-12-08", + "last_updated": "2025-12-08", "type": "chat" }, { - "id": "gpt-oss-20b", - "name": "GPT OSS 20B", - "display_name": "GPT OSS 20B", + "id": "zai/glm-4.6v", + "name": "GLM-4.6V (Z AI)", + "display_name": "GLM-4.6V (Z AI)", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 25000 + "context": 128000, + "output": 16000 }, "temperature": true, "tool_call": true, @@ -208826,39 +200867,27 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "low", - "medium", - "high" - ] - } - }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "knowledge": "2025-04", + "release_date": "2025-12-08", + "last_updated": "2025-12-08", "type": "chat" }, { - "id": "gpt-5-3-codex", - "name": "GPT-5.3 Codex", - "display_name": "GPT-5.3 Codex", + "id": "zai/glm-4.5-x", + "name": "GLM-4.5 X (Z AI)", + "display_name": "GLM-4.5 X (Z AI)", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, + "context": 128000, "output": 128000 }, "temperature": true, @@ -208867,52 +200896,29 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } - }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-05", - "last_updated": "2026-02-05", + "release_date": "2025-07-28", + "last_updated": "2025-07-28", "type": "chat" }, { - "id": "gpt-5", - "name": "GPT-5", - "display_name": "GPT-5", + "id": "zai/glm-4.6", + "name": "GLM-4.6 (Z AI)", + "display_name": "GLM-4.6 (Z AI)", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 200000, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -208920,36 +200926,20 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "minimal", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "supported": true } }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-09-30", + "last_updated": "2025-09-30", "type": "chat" }, { - "id": "glm-5-3", - "name": "GLM-5.3", - "display_name": "GLM-5.3", + "id": "zai/glm-4.5-air", + "name": "GLM-4.5 Air (Z AI)", + "display_name": "GLM-4.5 Air (Z AI)", "modalities": { "input": [ "text" @@ -208959,49 +200949,38 @@ ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 128000, + "output": 98304 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "high", - "max" - ] - } + "supported": false }, "attachment": false, "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "knowledge": "2025-04", + "release_date": "2025-07-28", + "last_updated": "2025-07-28", "type": "chat" }, { - "id": "gemini-3-5-flash-lite", - "name": "Gemini 3.5 Flash Lite", - "display_name": "Gemini 3.5 Flash Lite", + "id": "zai/glm-4.5v", + "name": "GLM-4.5V (Z AI)", + "display_name": "GLM-4.5V (Z AI)", "modalities": { "input": [ "text", "image", - "video", - "audio", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 128000, + "output": 16000 }, "temperature": true, "tool_call": true, @@ -209009,84 +200988,57 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "minimal", - "low", - "medium", - "high" - ] - } - }, "attachment": true, - "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-07-21", - "last_updated": "2026-07-21", + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-08-11", + "last_updated": "2025-08-11", "type": "chat" }, { - "id": "gpt-6-luna", - "name": "GPT-6 Luna", - "display_name": "GPT-6 Luna", + "id": "zai/glm-4.5-airx", + "name": "GLM-4.5 AirX (Z AI)", + "display_name": "GLM-4.5 AirX (Z AI)", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, + "context": 128000, "output": 128000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ] - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2026-05-18", - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "release_date": "2025-07-28", + "last_updated": "2025-07-28", "type": "chat" }, { - "id": "gpt-5-5-pro", - "name": "GPT-5.5 Pro", - "display_name": "GPT-5.5 Pro", + "id": "zai/glm-5", + "name": "GLM-5 (Z AI)", + "display_name": "GLM-5 (Z AI)", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 202800, + "output": 131100 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -209094,30 +201046,39 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ + "none", + "minimal", + "low", "medium", "high", - "xhigh" + "xhigh", + "max" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-12-01", - "release_date": "2026-04-23", - "last_updated": "2026-04-23", + "attachment": false, + "open_weights": true, + "release_date": "2026-02-12", + "last_updated": "2026-02-12", "type": "chat" }, { - "id": "gemini-3-flash", - "name": "Gemini 3 Flash Preview", - "display_name": "Gemini 3 Flash Preview", + "id": "zai/glm-5.3-flash", + "name": "GLM-5.3 Flash (Z AI)", + "display_name": "GLM-5.3 Flash (Z AI)", "modalities": { "input": [ "text", "image", "video", - "audio", "pdf" ], "output": [ @@ -209126,7 +201087,7 @@ }, "limit": { "context": 1048576, - "output": 65536 + "output": 131072 }, "temperature": true, "tool_call": true, @@ -209137,38 +201098,26 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", + "effort_options": [ "low", - "medium", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" + "high", + "max" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-12-17", - "last_updated": "2025-12-17", + "open_weights": true, + "release_date": "2026-08-26", + "last_updated": "2026-08-26", "type": "chat" }, { - "id": "claude-opus-4-1", - "name": "Claude Opus 4.1 (latest)", - "display_name": "Claude Opus 4.1 (latest)", + "id": "zai/glm-4.7", + "name": "GLM-4.7 (Z AI)", + "display_name": "GLM-4.7 (Z AI)", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" @@ -209176,61 +201125,47 @@ }, "limit": { "context": 200000, - "output": 32000 + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-03-31", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-12-22", + "last_updated": "2025-12-22", "type": "chat" }, { - "id": "gemini-3-1-flash-lite", - "name": "Gemini 3.1 Flash Lite Preview", - "display_name": "Gemini 3.1 Flash Lite Preview", + "id": "zai/glm-5.1", + "name": "GLM-5.1 (Z AI)", + "display_name": "GLM-5.1 (Z AI)", "modalities": { "input": [ - "text", - "image", - "video", - "audio", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 200000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -209240,86 +201175,81 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ + "none", + "minimal", "low", "medium", - "high" + "high", + "xhigh", + "max" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-03-03", - "last_updated": "2026-03-03", + "attachment": false, + "open_weights": true, + "release_date": "2026-04-07", + "last_updated": "2026-04-07", "type": "chat" }, { - "id": "claude-opus-4-8", - "name": "Claude Opus 4.8", - "display_name": "Claude Opus 4.8", + "id": "runpod/kimi-k3", + "name": "Kimi K3 (Runpod)", + "display_name": "Kimi K3 (Runpod)", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 1048576, + "output": 1048576 }, "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "high", "effort_options": [ + "none", + "minimal", "low", "medium", "high", "xhigh", "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-01", - "release_date": "2026-05-28", - "last_updated": "2026-05-28", + "open_weights": true, + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" }, { - "id": "gpt-5-4", - "name": "GPT-5.4", - "display_name": "GPT-5.4", + "id": "deepseek/deepseek-v4-pro", + "name": "DeepSeek V4 Pro (DeepSeek)", + "display_name": "DeepSeek V4 Pro (DeepSeek)", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" @@ -209327,47 +201257,47 @@ }, "limit": { "context": 1050000, - "output": 128000 + "output": 393216 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, + "default_enabled": true, "mode": "effort", - "effort": "none", + "effort": "high", "effort_options": [ - "none", "low", - "medium", "high", - "xhigh" + "max" ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ], - "visibility": "hidden" + "notes": [ + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." + ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-05", - "last_updated": "2026-03-05", + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "gpt-5-1", - "name": "GPT-5.1", - "display_name": "GPT-5.1", + "id": "deepseek/deepseek-v4.1-flash-1017", + "name": "DeepSeek V4.1 Flash 1017 (DeepSeek)", + "display_name": "DeepSeek V4.1 Flash 1017 (DeepSeek)", "modalities": { "input": [ "text", @@ -209378,58 +201308,48 @@ ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 1050000, + "output": 393216 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", "effort_options": [ "none", "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "high", + "max" + ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-11-13", - "last_updated": "2025-11-13", + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-10-17", + "last_updated": "2026-10-17", "type": "chat" }, { - "id": "qwen35-122b-a10b", - "name": "Qwen3.5 122B-A10B", - "display_name": "Qwen3.5 122B-A10B", + "id": "sciforium/deepseek-v4.1-flash-1017", + "name": "DeepSeek V4.1 Flash 1017 (sciforium)", + "display_name": "DeepSeek V4.1 Flash 1017 (sciforium)", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 25000 + "context": 1056784, + "output": 384000 }, "temperature": true, "tool_call": true, @@ -209442,36 +201362,36 @@ "effort_options": [ "none", "low", - "medium", - "high" + "high", + "xhigh", + "max" ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-02-23", - "last_updated": "2026-02-23", + "knowledge": "2025-05", + "release_date": "2026-10-17", + "last_updated": "2026-10-17", "type": "chat" }, { - "id": "claude-fable-5", - "name": "Claude Fable 5", - "display_name": "Claude Fable 5", + "id": "cloudflare/deepseek-v4-flash", + "name": "DeepSeek V4 Flash (Cloudflare)", + "display_name": "DeepSeek V4 Flash (Cloudflare)", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 1048576, + "output": 393216 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -209485,48 +201405,34 @@ "effort": "high", "effort_options": [ "low", - "medium", "high", - "xhigh", "max" ], "interleaved": true, "summaries": true, - "visibility": "omitted", + "visibility": "summary", "continuation": [ "thinking_blocks" ], "notes": [ - "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", - "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", - "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-09", - "last_updated": "2026-06-09", + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" - } - ] - }, - "coralbricks": { - "id": "coralbricks", - "name": "CoralBricks", - "display_name": "CoralBricks", - "api": "https://inference.coralbricks.ai/v1", - "doc": "https://www.coralbricks.ai/docs", - "models": [ + }, { - "id": "deepseek-v4.1-flash-fast", - "name": "DeepSeek V4.1 Flash", - "display_name": "DeepSeek V4.1 Flash", + "id": "cloudflare/glm-5.3", + "name": "GLM-5.3 (Cloudflare)", + "display_name": "GLM-5.3 (Cloudflare)", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" @@ -209534,7 +201440,7 @@ }, "limit": { "context": 1048576, - "output": 393216 + "output": 131072 }, "temperature": true, "tool_call": true, @@ -209545,35 +201451,23 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, "effort_options": [ - "none", "low", "high", "max" ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-09-10", - "last_updated": "2026-09-10", + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" - } - ] - }, - "llmgateway": { - "id": "llmgateway", - "name": "DevPass (LLM Gateway)", - "display_name": "DevPass (LLM Gateway)", - "api": "https://api.llmgateway.io/v1", - "doc": "https://llmgateway.io/docs", - "models": [ + }, { - "id": "glm-5.1", - "name": "GLM-5.1", - "display_name": "GLM-5.1", + "id": "cloudflare/deepseek-v4-pro", + "name": "DeepSeek V4 Pro (Cloudflare)", + "display_name": "DeepSeek V4 Pro (Cloudflare)", "modalities": { "input": [ "text" @@ -209583,8 +201477,8 @@ ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 1048576, + "output": 393216 }, "temperature": true, "tool_call": true, @@ -209595,44 +201489,48 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "high", + "max" + ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" ], - "effort_options": [ - "none", - "minimal", - "low", - "medium", - "high", - "xhigh", - "max" + "notes": [ + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, "attachment": false, "open_weights": true, - "release_date": "2026-04-07", - "last_updated": "2026-04-07", + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "glm-5.2-fast", - "name": "GLM-5.2", - "display_name": "GLM-5.2", + "id": "cloudflare/deepseek-v4.1-flash-1017", + "name": "DeepSeek V4.1 Flash 1017 (Cloudflare)", + "display_name": "DeepSeek V4.1 Flash 1017 (Cloudflare)", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 1048576, + "output": 393216 }, "temperature": true, "tool_call": true, @@ -209640,57 +201538,86 @@ "supported": true, "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "minimal", + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + }, + "attachment": true, "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "knowledge": "2025-05", + "release_date": "2026-10-17", + "last_updated": "2026-10-17", "type": "chat" }, { - "id": "llama-3.3-70b-instruct", - "name": "Llama-3.3-70B-Instruct", - "display_name": "Llama-3.3-70B-Instruct", + "id": "cloudflare/glm-5.3-flash", + "name": "GLM-5.3 Flash (Cloudflare)", + "display_name": "GLM-5.3 Flash (Cloudflare)", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 4096 + "context": 1048576, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "low", + "high", + "max" + ] + } + }, + "attachment": true, "open_weights": true, - "knowledge": "2023-12", - "release_date": "2024-12-06", - "last_updated": "2024-12-06", + "release_date": "2026-08-26", + "last_updated": "2026-08-26", "type": "chat" }, { - "id": "minimax-m2", - "name": "MiniMax-M2", - "display_name": "MiniMax-M2", + "id": "azure-anthropic/claude-fable-5", + "name": "Claude Fable 5 (Azure Anthropic)", + "display_name": "Claude Fable 5 (Azure Anthropic)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 196608, - "output": 131072 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -209698,85 +201625,159 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", "effort_options": [ "low", "medium", "high", "xhigh", "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", + "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", + "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2025-10-27", - "last_updated": "2025-10-27", + "attachment": true, + "open_weights": false, + "knowledge": "2026-01-31", + "release_date": "2026-06-09", + "last_updated": "2026-06-09", "type": "chat" }, { - "id": "reka-edge-2603", - "name": "Reka Edge 2603", - "display_name": "Reka Edge 2603", + "id": "azure-anthropic/claude-opus-4-7", + "name": "Claude Opus 4.7 (Azure Anthropic)", + "display_name": "Claude Opus 4.7 (Azure Anthropic)", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 16384, - "output": 16384 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." + ] + } }, "attachment": true, "open_weights": false, - "release_date": "2026-10-09", - "last_updated": "2026-10-09", + "knowledge": "2026-01-31", + "release_date": "2026-04-16", + "last_updated": "2026-04-16", "type": "chat" }, { - "id": "codestral-2508", - "name": "Codestral", - "display_name": "Codestral", + "id": "azure-anthropic/claude-fable-5-1", + "name": "Claude Fable 5.1 (Azure Anthropic)", + "display_name": "Claude Fable 5.1 (Azure Anthropic)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 16384 + "context": 1000000, + "output": 128000 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", + "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", + "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." + ] + } + }, + "attachment": true, "open_weights": false, - "release_date": "2025-07-30", - "last_updated": "2025-07-30", + "knowledge": "2026-06", + "release_date": "2026-09-01", + "last_updated": "2026-09-01", "type": "chat" }, { - "id": "glm-5v-turbo", - "name": "GLM-5V-Turbo", - "display_name": "GLM-5V-Turbo", + "id": "azure-anthropic/claude-opus-5-5", + "name": "Claude Opus 5.5 (Azure Anthropic)", + "display_name": "Claude Opus 5.5 (Azure Anthropic)", "modalities": { "input": [ "text", "image", - "video", "pdf" ], "output": [ @@ -209784,10 +201785,10 @@ ] }, "limit": { - "context": 200000, - "output": 131072 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -209806,143 +201807,175 @@ }, "attachment": true, "open_weights": false, - "release_date": "2026-04-01", - "last_updated": "2026-04-01", + "knowledge": "2026-06", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "granite-4.2-8b", - "name": "Granite 4.2 8B", - "display_name": "Granite 4.2 8B", + "id": "azure-anthropic/claude-opus-4-6", + "name": "Claude Opus 4.6 (Azure Anthropic)", + "display_name": "Claude Opus 4.6 (Azure Anthropic)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 131072 + "context": 1000000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", "effort_options": [ - "none", "low", "medium", - "high" + "high", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-08-25", - "last_updated": "2026-08-25", + "attachment": true, + "open_weights": false, + "knowledge": "2025-05-31", + "release_date": "2026-02-05", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "ling-3.0-flash-vl", - "name": "Ling 3.0 Flash VL", - "display_name": "Ling 3.0 Flash VL", + "id": "azure-anthropic/claude-opus-4-8", + "name": "Claude Opus 4.8 (Azure Anthropic)", + "display_name": "Claude Opus 4.8 (Azure Anthropic)", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 131072 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "high", "effort_options": [ - "none", "low", "medium", - "high" + "high", + "xhigh", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-09-10", - "last_updated": "2026-09-10", + "open_weights": false, + "knowledge": "2026-01", + "release_date": "2026-05-28", + "last_updated": "2026-05-28", "type": "chat" }, { - "id": "gpt-5.2", - "name": "GPT-5.2", - "display_name": "GPT-5.2", + "id": "azure-anthropic/claude-opus-5", + "name": "Claude Opus 5 (Azure Anthropic)", + "display_name": "Claude Opus 5 (Azure Anthropic)", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 400000, + "context": 1000000, "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", "effort_options": [ "none", "low", "medium", "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "xhigh", + "max" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2025-12-11", - "last_updated": "2025-12-11", + "knowledge": "2026-05", + "release_date": "2026-07-24", + "last_updated": "2026-07-24", "type": "chat" }, { - "id": "claude-haiku-5-5", - "name": "Claude Haiku 5.5", - "display_name": "Claude Haiku 5.5", + "id": "azure-anthropic/claude-sonnet-5-5", + "name": "Claude Sonnet 5.5 (Azure Anthropic)", + "display_name": "Claude Sonnet 5.5 (Azure Anthropic)", "modalities": { "input": [ "text", @@ -209966,7 +201999,6 @@ "extra_capabilities": { "reasoning": { "effort_options": [ - "none", "low", "medium", "high", @@ -209978,27 +202010,29 @@ "attachment": true, "open_weights": false, "knowledge": "2026-06", - "release_date": "2026-10-07", - "last_updated": "2026-10-07", + "release_date": "2026-09-28", + "last_updated": "2026-09-28", "type": "chat" }, { - "id": "glm-5", - "name": "GLM-5", - "display_name": "GLM-5", + "id": "azure-anthropic/claude-sonnet-5", + "name": "Claude Sonnet 5 (Azure Anthropic)", + "display_name": "Claude Sonnet 5 (Azure Anthropic)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 203000, - "output": 131072 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -210007,15 +202041,8 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ "none", - "minimal", "low", "medium", "high", @@ -210024,59 +202051,28 @@ ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-02-12", - "last_updated": "2026-02-12", - "type": "chat" - }, - { - "id": "mistral-large-4", - "name": "Mistral Large 4", - "display_name": "Mistral Large 4", - "modalities": { - "input": [ - "text", - "image" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 1000000, - "output": 262144 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, "attachment": true, "open_weights": false, - "release_date": "2026-10-06", - "last_updated": "2026-10-06", + "knowledge": "2026-01-31", + "release_date": "2026-06-30", + "last_updated": "2026-06-30", "type": "chat" }, { - "id": "mimo-v2.6-pro", - "name": "MiMo-V2.6-Pro", - "display_name": "MiMo-V2.6-Pro", + "id": "canopywave/glm-5.2", + "name": "GLM-5.2 (CanopyWave)", + "display_name": "GLM-5.2 (CanopyWave)", "modalities": { "input": [ - "text", - "image", - "audio", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 200000, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -210086,6 +202082,13 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ "none", "minimal", @@ -210097,45 +202100,45 @@ ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "claude-haiku-4-5-20251001", - "name": "Claude Haiku 4.5", - "display_name": "Claude Haiku 4.5", + "id": "canopywave/deepseek-v4-flash", + "name": "DeepSeek V4 Flash (CanopyWave)", + "display_name": "DeepSeek V4 Flash (CanopyWave)", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 1000000, + "output": 393216 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "high", + "max" + ], "interleaved": true, "summaries": true, "visibility": "summary", @@ -210143,79 +202146,75 @@ "thinking_blocks" ], "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-02-28", - "release_date": "2025-10-15", - "last_updated": "2025-10-15", + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "gpt-5.4-mini", - "name": "GPT-5.4 mini", - "display_name": "GPT-5.4 mini", + "id": "canopywave/kimi-k2.6", + "name": "Kimi K2.6 (CanopyWave)", + "display_name": "Kimi K2.6 (CanopyWave)", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 262144, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ "none", + "minimal", "low", "medium", "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "xhigh", + "max" + ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-17", - "last_updated": "2026-03-17", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-04-20", + "last_updated": "2026-04-20", "type": "chat" }, { - "id": "claude-opus-4-7", - "name": "Claude Opus 4.7", - "display_name": "Claude Opus 4.7", + "id": "canopywave/deepseek-v4-pro", + "name": "DeepSeek V4 Pro (CanopyWave)", + "display_name": "DeepSeek V4 Pro (CanopyWave)", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" @@ -210223,117 +202222,106 @@ }, "limit": { "context": 1000000, - "output": 128000 + "output": 393216 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, + "default_enabled": true, "mode": "effort", "effort": "high", "effort_options": [ "low", - "medium", "high", - "xhigh", "max" ], "interleaved": true, "summaries": true, - "visibility": "omitted", + "visibility": "summary", "continuation": [ "thinking_blocks" ], "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-04-16", - "last_updated": "2026-04-16", + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "claude-sonnet-4-5", - "name": "Claude Sonnet 4.5 (latest)", - "display_name": "Claude Sonnet 4.5 (latest)", + "id": "canopywave/kimi-k3", + "name": "Kimi K3 (CanopyWave)", + "display_name": "Kimi K3 (CanopyWave)", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 1048576, + "output": 1048576 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + "effort_options": [ + "none", + "minimal", + "low", + "medium", + "high", + "xhigh", + "max" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-07-31", - "release_date": "2025-09-29", - "last_updated": "2025-09-29", + "open_weights": true, + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" }, { - "id": "muse-spark-1.3-contributor", - "name": "Muse Spark 1.3 Contributor", - "display_name": "Muse Spark 1.3 Contributor", + "id": "openai/gpt-6.1-terra", + "name": "GPT-6.1 Terra (OpenAI)", + "display_name": "GPT-6.1 Terra (OpenAI)", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 1048576 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -210342,37 +202330,41 @@ "extra_capabilities": { "reasoning": { "effort_options": [ - "minimal", + "none", "low", "medium", "high", - "xhigh" + "xhigh", + "max" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-09-02", - "last_updated": "2026-09-02", + "knowledge": "2026-06-01", + "release_date": "2026-10-26", + "last_updated": "2026-10-26", "type": "chat" }, { - "id": "glm-4.6", - "name": "GLM-4.6", - "display_name": "GLM-4.6", + "id": "openai/gpt-5.6-terra", + "name": "GPT-5.6 Terra (OpenAI)", + "display_name": "GPT-5.6 Terra (OpenAI)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -210380,20 +202372,38 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-09-30", - "last_updated": "2025-09-30", + "attachment": true, + "open_weights": false, + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "gpt-5.6-sol", - "name": "GPT-5.6 Sol", - "display_name": "GPT-5.6 Sol", + "id": "openai/gpt-5.4", + "name": "GPT-5.4 (OpenAI)", + "display_name": "GPT-5.4 (OpenAI)", "modalities": { "input": [ "text", @@ -210408,25 +202418,24 @@ "context": 1050000, "output": 128000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, + "default_enabled": false, "mode": "effort", - "effort": "medium", + "effort": "none", "effort_options": [ "none", "low", "medium", "high", - "xhigh", - "max" + "xhigh" ], "verbosity": "medium", "verbosity_options": [ @@ -210439,18 +202448,20 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "knowledge": "2025-08-31", + "release_date": "2026-03-05", + "last_updated": "2026-03-05", "type": "chat" }, { - "id": "deepseek-v4-flash", - "name": "DeepSeek V4 Flash", - "display_name": "DeepSeek V4 Flash", + "id": "openai/gpt-5.6-sol", + "name": "GPT-5.6 Sol (OpenAI)", + "display_name": "GPT-5.6 Sol (OpenAI)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" @@ -210458,9 +202469,9 @@ }, "limit": { "context": 1050000, - "output": 384000 + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -210471,39 +202482,39 @@ "supported": true, "default_enabled": true, "mode": "effort", - "effort": "high", + "effort": "medium", "effort_options": [ + "none", "low", + "medium", "high", + "xhigh", "max" ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" ], - "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." - ] + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "attachment": true, + "open_weights": false, + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "gpt-5.2-codex", - "name": "GPT-5.2 Codex", - "display_name": "GPT-5.2 Codex", + "id": "openai/gpt-5.4-mini", + "name": "GPT-5.4 Mini (OpenAI)", + "display_name": "GPT-5.4 Mini (OpenAI)", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" @@ -210513,19 +202524,20 @@ "context": 400000, "output": 128000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, + "default_enabled": false, "mode": "effort", - "effort": "medium", + "effort": "none", "effort_options": [ + "none", "low", "medium", "high", @@ -210543,42 +202555,44 @@ "attachment": true, "open_weights": false, "knowledge": "2025-08-31", - "release_date": "2025-12-11", - "last_updated": "2025-12-11", + "release_date": "2026-03-17", + "last_updated": "2026-03-17", "type": "chat" }, { - "id": "qwen3-next-80b-a3b-instruct", - "name": "Qwen3-Next 80B-A3B Instruct", - "display_name": "Qwen3-Next 80B-A3B Instruct", + "id": "openai/gpt-4o", + "name": "GPT-4o (OpenAI)", + "display_name": "GPT-4o (OpenAI)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 128000, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-09", - "last_updated": "2025-09", + "attachment": true, + "open_weights": false, + "knowledge": "2023-09", + "release_date": "2024-05-13", + "last_updated": "2024-08-06", "type": "chat" }, { - "id": "grok-4-20-non-reasoning", - "name": "Grok 4.20 (Non-Reasoning)", - "display_name": "Grok 4.20 (Non-Reasoning)", + "id": "openai/gpt-5.6-luna", + "name": "GPT-5.6 Luna (OpenAI)", + "display_name": "GPT-5.6 Luna (OpenAI)", "modalities": { "input": [ "text", @@ -210590,60 +202604,82 @@ ] }, "limit": { - "context": 2000000, - "output": 30000 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "release_date": "2026-03-09", - "last_updated": "2026-03-09", + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "qwen3-coder-30b-a3b-instruct", - "name": "Qwen3-Coder 30B-A3B Instruct", - "display_name": "Qwen3-Coder 30B-A3B Instruct", + "id": "openai/gpt-4o-transcribe", + "name": "GPT-4o Transcribe (OpenAI)", + "display_name": "GPT-4o Transcribe (OpenAI)", "modalities": { "input": [ - "text" + "text", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 262000, - "output": 65536 + "context": 16000, + "output": 2000 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-07-31", - "last_updated": "2025-07-31", + "attachment": true, + "open_weights": false, + "release_date": "2025-03-20", + "last_updated": "2025-03-20", "type": "chat" }, { - "id": "glm-5.3-fast", - "name": "GLM-5.3", - "display_name": "GLM-5.3", + "id": "openai/gpt-4.1", + "name": "GPT-4.1 (OpenAI)", + "display_name": "GPT-4.1 (OpenAI)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" @@ -210651,65 +202687,51 @@ }, "limit": { "context": 1000000, - "output": 131072 + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": false, - "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "attachment": true, + "open_weights": false, + "knowledge": "2024-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", "type": "chat" }, { - "id": "hy3", - "name": "Hy3", - "display_name": "Hy3", + "id": "openai/gpt-live-transcribe", + "name": "GPT Live Transcribe (OpenAI)", + "display_name": "GPT Live Transcribe (OpenAI)", "modalities": { "input": [ - "text" + "text", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 128000 + "context": 8192, + "output": 8192 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "none", - "minimal", - "low", - "medium", - "high", - "xhigh" - ] - } + "supported": false }, - "attachment": false, - "open_weights": true, - "release_date": "2026-07-06", - "last_updated": "2026-07-06", - "type": "chat" + "attachment": true, + "open_weights": false, + "release_date": "2026-07-28", + "last_updated": "2026-07-28" }, { - "id": "gpt-5.5-pro", - "name": "GPT-5.5 Pro", - "display_name": "GPT-5.5 Pro", + "id": "openai/gpt-5.3-codex", + "name": "GPT-5.3 Codex (OpenAI)", + "display_name": "GPT-5.3 Codex (OpenAI)", "modalities": { "input": [ "text", @@ -210721,10 +202743,10 @@ ] }, "limit": { - "context": 1050000, + "context": 400000, "output": 128000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -210733,89 +202755,101 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ + "low", "medium", "high", "xhigh" - ] + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2025-12-01", - "release_date": "2026-04-23", - "last_updated": "2026-04-23", + "knowledge": "2025-08-31", + "release_date": "2026-02-05", + "last_updated": "2026-02-05", "type": "chat" }, { - "id": "qwen3.6-35b-a3b", - "name": "Qwen3.6 35B-A3B", - "display_name": "Qwen3.6 35B-A3B", + "id": "openai/gpt-5.1", + "name": "GPT-5.1 (OpenAI)", + "display_name": "GPT-5.1 (OpenAI)", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 400000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], + "default_enabled": false, + "mode": "effort", + "effort": "none", "effort_options": [ "none", - "minimal", "low", "medium", - "high", - "xhigh", - "max" - ] + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, - "open_weights": true, - "release_date": "2026-04-17", - "last_updated": "2026-04-17", + "open_weights": false, + "knowledge": "2024-09-30", + "release_date": "2025-11-13", + "last_updated": "2025-11-13", "type": "chat" }, { - "id": "qwen3.7-plus", - "name": "Qwen3.7 Plus", - "display_name": "Qwen3.7 Plus", + "id": "openai/gpt-6-luna", + "name": "GPT-6 Luna (OpenAI)", + "display_name": "GPT-6 Luna (OpenAI)", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 983616, - "output": 64000 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -210823,10 +202857,8 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ "none", - "minimal", "low", "medium", "high", @@ -210837,57 +202869,43 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2025-04", - "release_date": "2026-06-02", - "last_updated": "2026-06-02", + "knowledge": "2026-05-18", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "hy4-preview", - "name": "Hy4 preview", - "display_name": "Hy4 preview", + "id": "openai/gpt-4o-mini-transcribe", + "name": "GPT-4o Mini Transcribe (OpenAI)", + "display_name": "GPT-4o Mini Transcribe (OpenAI)", "modalities": { "input": [ - "text" + "text", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 64000 + "context": 16000, + "output": 2000 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "none", - "minimal", - "low", - "medium", - "high", - "xhigh", - "max" - ] - } + "supported": false }, - "attachment": false, - "open_weights": true, - "release_date": "2026-08-28", - "last_updated": "2026-08-28", + "attachment": true, + "open_weights": false, + "release_date": "2025-03-20", + "last_updated": "2025-03-20", "type": "chat" }, { - "id": "gpt-5-nano", - "name": "GPT-5 Nano", - "display_name": "GPT-5 Nano", + "id": "openai/gpt-5-mini", + "name": "GPT-5 Mini (OpenAI)", + "display_name": "GPT-5 Mini (OpenAI)", "modalities": { "input": [ "text", @@ -210936,79 +202954,24 @@ "type": "chat" }, { - "id": "qwen-max", - "name": "Qwen Max", - "display_name": "Qwen Max", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 32768, - "output": 8192 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": false, - "knowledge": "2024-04", - "release_date": "2024-04-03", - "last_updated": "2025-01-25", - "type": "chat" - }, - { - "id": "mistral-large-2512", - "name": "Mistral Large 3", - "display_name": "Mistral Large 3", + "id": "openai/gpt-6-sol", + "name": "GPT-6 Sol (OpenAI)", + "display_name": "GPT-6 Sol (OpenAI)", "modalities": { "input": [ "text", - "image" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 262144, - "output": 262144 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": true, - "knowledge": "2024-11", - "release_date": "2025-12-02", - "last_updated": "2025-12-02", - "type": "chat" - }, - { - "id": "minimax-m2.5", - "name": "MiniMax-M2.5", - "display_name": "MiniMax-M2.5", - "modalities": { - "input": [ - "text" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 228700, - "output": 131072 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -211016,8 +202979,8 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ + "none", "low", "medium", "high", @@ -211026,16 +202989,17 @@ ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-02-12", - "last_updated": "2026-02-12", + "attachment": true, + "open_weights": false, + "knowledge": "2026-04-20", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "seed-2-0-mini-260428", - "name": "Seed 2.0 Mini (260428)", - "display_name": "Seed 2.0 Mini (260428)", + "id": "openai/gpt-5.4-pro", + "name": "GPT-5.4 Pro (OpenAI)", + "display_name": "GPT-5.4 Pro (OpenAI)", "modalities": { "input": [ "text", @@ -211046,10 +203010,10 @@ ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -211057,69 +203021,101 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", "effort_options": [ - "minimal", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ "low", "medium", "high" - ] + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "release_date": "2026-04-28", - "last_updated": "2026-04-28", + "knowledge": "2025-08-31", + "release_date": "2026-03-05", + "last_updated": "2026-03-05", "type": "chat" }, { - "id": "gpt-4o", - "name": "GPT-4o", - "display_name": "GPT-4o", + "id": "openai/gpt-5", + "name": "GPT-5 (OpenAI)", + "display_name": "GPT-5 (OpenAI)", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "minimal", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } }, "attachment": true, "open_weights": false, - "knowledge": "2023-09", - "release_date": "2024-05-13", - "last_updated": "2024-08-06", + "knowledge": "2024-09-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "qwen3.5-35b-a3b", - "name": "Qwen3.5 35B-A3B", - "display_name": "Qwen3.5 35B-A3B", + "id": "openai/gpt-6.1-sol", + "name": "GPT-6.1 Sol (OpenAI)", + "display_name": "GPT-6.1 Sol (OpenAI)", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -211127,16 +203123,7 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ - "none", - "minimal", "low", "medium", "high", @@ -211146,187 +203133,156 @@ } }, "attachment": true, - "open_weights": true, - "release_date": "2026-02-23", - "last_updated": "2026-02-23", + "open_weights": false, + "knowledge": "2026-04-30", + "release_date": "2026-09-29", + "last_updated": "2026-09-29", "type": "chat" }, { - "id": "qwen3-235b-a22b-thinking-2507", - "name": "Qwen3 235B A22B Thinking (2507)", - "display_name": "Qwen3 235B A22B Thinking (2507)", + "id": "openai/gpt-5.2", + "name": "GPT-5.2 (OpenAI)", + "display_name": "GPT-5.2 (OpenAI)", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 262000, - "output": 8192 + "context": 400000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "release_date": "2025-07-08", - "last_updated": "2025-07-08", - "type": "chat" - }, - { - "id": "mistral-medium-3-5", - "name": "Mistral Medium 3.5", - "display_name": "Mistral Medium 3.5", - "modalities": { - "input": [ - "text", - "image" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 262144, - "output": 262144 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, "attachment": true, "open_weights": false, - "release_date": "2026-04-30", - "last_updated": "2026-04-30", + "knowledge": "2025-08-31", + "release_date": "2025-12-11", + "last_updated": "2025-12-11", "type": "chat" }, { - "id": "claude-haiku-4-5", - "name": "Claude Haiku 4.5 (latest)", - "display_name": "Claude Haiku 4.5 (latest)", + "id": "openai/gpt-5-pro", + "name": "GPT-5 Pro (OpenAI)", + "display_name": "GPT-5 Pro (OpenAI)", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 400000, + "output": 272000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "default_enabled": true, + "mode": "fixed", + "effort": "high", + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." - ] + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2025-02-28", - "release_date": "2025-10-15", - "last_updated": "2025-10-15", + "knowledge": "2024-09-30", + "release_date": "2025-10-06", + "last_updated": "2025-10-06", "type": "chat" }, { - "id": "fugu-max", - "name": "Fugu Max", - "display_name": "Fugu Max", + "id": "openai/gpt-transcribe", + "name": "GPT Transcribe (OpenAI)", + "display_name": "GPT Transcribe (OpenAI)", "modalities": { "input": [ "text", - "image" + "audio" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 1000000 + "context": 8192, + "output": 8192 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "high", - "xhigh", - "max" - ] - } + "supported": false }, "attachment": true, "open_weights": false, - "release_date": "2026-09-11", - "last_updated": "2026-09-11", - "type": "chat" + "release_date": "2026-07-28", + "last_updated": "2026-07-28" }, { - "id": "gpt-5.2-pro", - "name": "GPT-5.2 Pro", - "display_name": "GPT-5.2 Pro", + "id": "openai/o3", + "name": "o3 (OpenAI)", + "display_name": "o3 (OpenAI)", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 200000, + "output": 100000 }, "temperature": false, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true @@ -211336,14 +203292,8 @@ "supported": true, "default_enabled": true, "mode": "effort", - "effort": "high", + "effort": "medium", "effort_options": [ - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ "low", "medium", "high" @@ -211353,15 +203303,15 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2025-12-11", - "last_updated": "2025-12-11", + "knowledge": "2024-05", + "release_date": "2025-04-16", + "last_updated": "2025-04-16", "type": "chat" }, { - "id": "gpt-5.4-nano", - "name": "GPT-5.4 nano", - "display_name": "GPT-5.4 nano", + "id": "openai/gpt-5.4-nano", + "name": "GPT-5.4 Nano (OpenAI)", + "display_name": "GPT-5.4 Nano (OpenAI)", "modalities": { "input": [ "text", @@ -211411,51 +203361,63 @@ "type": "chat" }, { - "id": "qwen3-vl-235b-a22b-instruct", - "name": "Qwen3 VL 235B A22B Instruct", - "display_name": "Qwen3 VL 235B A22B Instruct", + "id": "openai/gpt-5.5-pro", + "name": "GPT-5.5 Pro (OpenAI)", + "display_name": "GPT-5.5 Pro (OpenAI)", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 8192 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "medium", + "high", + "xhigh" + ] + } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-03-31", - "release_date": "2025-09-23", - "last_updated": "2025-09-23", + "open_weights": false, + "knowledge": "2025-12-01", + "release_date": "2026-04-23", + "last_updated": "2026-04-23", "type": "chat" }, { - "id": "kimi-k2.7-code", - "name": "Kimi K2.7 Code", - "display_name": "Kimi K2.7 Code", + "id": "openai/gpt-5.5", + "name": "GPT-5.5 (OpenAI)", + "display_name": "GPT-5.5 (OpenAI)", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1050000, + "output": 128000 }, "temperature": false, "tool_call": true, @@ -211466,61 +203428,35 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ - "none", - "minimal", "low", "medium", "high", - "xhigh", - "max" - ] + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-06-12", - "last_updated": "2026-06-12", - "type": "chat" - }, - { - "id": "glm-4.5-airx", - "name": "GLM-4.5 AirX", - "display_name": "GLM-4.5 AirX", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 128000, - "output": 16384 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": false, "open_weights": false, - "release_date": "2025-07-28", - "last_updated": "2025-07-28", + "knowledge": "2025-12-01", + "release_date": "2026-04-23", + "last_updated": "2026-04-23", "type": "chat" }, { - "id": "seed-1-6-250915", - "name": "Seed 1.6 (250915)", - "display_name": "Seed 1.6 (250915)", + "id": "openai/gpt-5.2-pro", + "name": "GPT-5.2 Pro (OpenAI)", + "display_name": "GPT-5.2 Pro (OpenAI)", "modalities": { "input": [ "text", @@ -211531,10 +203467,10 @@ ] }, "limit": { - "context": 256000, - "output": 8192 + "context": 400000, + "output": 272000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -211542,55 +203478,70 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", "effort_options": [ - "minimal", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ "low", "medium", "high" - ] + ], + "visibility": "hidden" } }, "attachment": true, - "open_weights": true, - "release_date": "2025-09-15", - "last_updated": "2025-09-15", + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2025-12-11", + "last_updated": "2025-12-11", "type": "chat" }, { - "id": "llama-3.2-3b-instruct", - "name": "Llama 3.2 3B Instruct", - "display_name": "Llama 3.2 3B Instruct", + "id": "openai/gpt-4.1-mini", + "name": "GPT-4.1 Mini (OpenAI)", + "display_name": "GPT-4.1 Mini (OpenAI)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 32768, - "output": 32000 + "context": 1000000, + "output": 32768 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, - "open_weights": true, - "release_date": "2024-09-18", - "last_updated": "2024-09-18", + "attachment": true, + "open_weights": false, + "knowledge": "2024-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", "type": "chat" }, { - "id": "custom", - "name": "Custom Model", - "display_name": "Custom Model", + "id": "openai/gpt-4o-mini", + "name": "GPT-4o Mini (OpenAI)", + "display_name": "GPT-4o Mini (OpenAI)", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" @@ -211607,14 +203558,15 @@ }, "attachment": true, "open_weights": false, - "release_date": "2024-01-01", - "last_updated": "2024-01-01", + "knowledge": "2023-09", + "release_date": "2024-07-18", + "last_updated": "2024-07-18", "type": "chat" }, { - "id": "claude-sonnet-5-5", - "name": "Claude Sonnet 5.5", - "display_name": "Claude Sonnet 5.5", + "id": "openai/gpt-6-astra", + "name": "GPT-6 Astra (OpenAI)", + "display_name": "GPT-6 Astra (OpenAI)", "modalities": { "input": [ "text", @@ -211626,7 +203578,7 @@ ] }, "limit": { - "context": 1000000, + "context": 1050000, "output": 128000 }, "temperature": false, @@ -211637,6 +203589,7 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ "low", "medium", @@ -211648,15 +203601,15 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-09-28", - "last_updated": "2026-09-28", + "knowledge": "2026-04-30", + "release_date": "2026-09-04", + "last_updated": "2026-09-04", "type": "chat" }, { - "id": "llama-3.2-11b-instruct", - "name": "Llama 3.2 11B Instruct", - "display_name": "Llama 3.2 11B Instruct", + "id": "openai/gpt-5-nano", + "name": "GPT-5 Nano (OpenAI)", + "display_name": "GPT-5 Nano (OpenAI)", "modalities": { "input": [ "text" @@ -211666,24 +203619,47 @@ ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 400000, + "output": 128000 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "minimal", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } }, "attachment": false, - "open_weights": true, - "release_date": "2024-09-25", - "last_updated": "2024-09-25", + "open_weights": false, + "knowledge": "2024-05-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "minimax-m2.5-highspeed", - "name": "MiniMax-M2.5-highspeed", - "display_name": "MiniMax-M2.5-highspeed", + "id": "azure-ai-foundry/grok-4-3", + "name": "Grok 4.3 (Azure AI Foundry)", + "display_name": "Grok 4.3 (Azure AI Foundry)", "modalities": { "input": [ "text" @@ -211693,8 +203669,8 @@ ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 20000, + "output": 8192 }, "temperature": true, "tool_call": true, @@ -211704,26 +203680,24 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ + "none", "low", "medium", - "high", - "xhigh", - "max" + "high" ] } }, "attachment": false, - "open_weights": true, - "release_date": "2026-02-13", - "last_updated": "2026-02-13", + "open_weights": false, + "release_date": "2026-04-17", + "last_updated": "2026-04-17", "type": "chat" }, { - "id": "ministral-3b-2512", - "name": "Ministral 3B", - "display_name": "Ministral 3B", + "id": "azure-ai-foundry/grok-4-1-fast-reasoning", + "name": "Grok 4.1 Fast Reasoning (Azure AI Foundry)", + "display_name": "Grok 4.1 Fast Reasoning (Azure AI Foundry)", "modalities": { "input": [ "text", @@ -211734,35 +203708,47 @@ ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 2000000, + "output": 30000 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "low", + "medium", + "high" + ] + } }, "attachment": true, - "open_weights": true, - "release_date": "2025-12-02", - "last_updated": "2025-12-02", + "open_weights": false, + "release_date": "2025-11-19", + "last_updated": "2025-11-19", "type": "chat" }, { - "id": "qwen3-235b-a22b-fp8", - "name": "Qwen3 235B A22B FP8", - "display_name": "Qwen3 235B A22B FP8", + "id": "deepinfra/muse-glimmer-30b", + "name": "Muse Glimmer 30B (DeepInfra)", + "display_name": "Muse Glimmer 30B (DeepInfra)", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 40960, - "output": 8192 + "context": 131072, + "output": 16384 }, "temperature": true, "tool_call": true, @@ -211770,28 +203756,40 @@ "supported": true, "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "minimal", + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + }, + "attachment": true, "open_weights": true, - "release_date": "2025-04-28", - "last_updated": "2025-04-28", + "knowledge": "2026-01-04", + "release_date": "2026-08-10", + "last_updated": "2026-08-10", "type": "chat" }, { - "id": "gemma-4-31b-it", - "name": "Gemma 4 31B IT", - "display_name": "Gemma 4 31B IT", + "id": "deepinfra/deepseek-v4-flash", + "name": "DeepSeek V4 Flash (DeepInfra)", + "display_name": "DeepSeek V4 Flash (DeepInfra)", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 1000000, + "output": 393216 }, "temperature": true, "tool_call": true, @@ -211801,35 +203799,51 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "high", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." + ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "gpt-5.6-luna", - "name": "GPT-5.6 Luna", - "display_name": "GPT-5.6 Luna", + "id": "deepinfra/deepseek-v4.1-flash", + "name": "DeepSeek V4.1 Flash (DeepInfra)", + "display_name": "DeepSeek V4.1 Flash (DeepInfra)", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1048576, + "output": 393216 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -211838,81 +203852,63 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", "effort_options": [ "none", + "minimal", "low", "medium", "high", "xhigh", "max" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-09-10", + "last_updated": "2026-09-10", "type": "chat" }, { - "id": "qwen3.8-max", - "name": "Qwen3.8 Max Preview", - "display_name": "Qwen3.8 Max Preview", + "id": "deepinfra/qwen3-vl-30b-a3b-instruct", + "name": "Qwen3 VL 30B A3B Instruct (DeepInfra)", + "display_name": "Qwen3 VL 30B A3B Instruct (DeepInfra)", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 1000000 + "context": 262144, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "low", - "medium", - "xhigh" - ] - } + "supported": false }, "attachment": true, - "open_weights": false, - "release_date": "2026-07-19", - "last_updated": "2026-07-19", + "open_weights": true, + "release_date": "2025-10-04", + "last_updated": "2025-10-04", "type": "chat" }, { - "id": "gemini-4-argon", - "name": "Gemini 4 Argon", - "display_name": "Gemini 4 Argon", + "id": "deepinfra/mimo-v2.6-pro", + "name": "MiMo V2.6 Pro (DeepInfra)", + "display_name": "MiMo V2.6 Pro (DeepInfra)", "modalities": { "input": [ "text", "image", - "audio" + "audio", + "video" ], "output": [ "text" @@ -211920,9 +203916,9 @@ }, "limit": { "context": 1048576, - "output": 1048576 + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -211931,32 +203927,39 @@ "extra_capabilities": { "reasoning": { "effort_options": [ - "high" + "none", + "minimal", + "low", + "medium", + "high", + "xhigh", + "max" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-10-13", - "last_updated": "2026-10-13", + "open_weights": true, + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "deepseek-v4-pro", - "name": "DeepSeek V4 Pro", - "display_name": "DeepSeek V4 Pro", + "id": "deepinfra/qwen3.5-9b", + "name": "Qwen3.5 9B (DeepInfra)", + "display_name": "Qwen3.5 9B (DeepInfra)", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 384000 + "context": 262144, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -211967,93 +203970,52 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "high", - "max" - ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" }, { - "id": "claude-fable-5-1", - "name": "Claude Fable 5.1", - "display_name": "Claude Fable 5.1", + "id": "deepinfra/ling-3.0-flash", + "name": "InclusionAI Ling 3.0 Flash (DeepInfra)", + "display_name": "InclusionAI Ling 3.0 Flash (DeepInfra)", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 262144, + "output": 32768 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", - "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", - "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." - ] - } - }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-09-01", - "last_updated": "2026-09-01", + "attachment": false, + "open_weights": true, + "release_date": "2026-07-23", + "last_updated": "2026-07-23", "type": "chat" }, { - "id": "ministral-14b-2512", - "name": "Ministral 14B", - "display_name": "Ministral 14B", + "id": "deepinfra/nemotron-3-ultra-550b", + "name": "Nemotron 3 Ultra 550B (DeepInfra)", + "display_name": "Nemotron 3 Ultra 550B (DeepInfra)", "modalities": { "input": [ "text", @@ -212065,23 +204027,23 @@ }, "limit": { "context": 262144, - "output": 8192 + "output": 262144 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, "attachment": true, - "open_weights": true, - "release_date": "2025-12-02", - "last_updated": "2025-12-02", + "open_weights": false, + "release_date": "2026-06-01", + "last_updated": "2026-06-01", "type": "chat" }, { - "id": "minimax-m3.1-flash", - "name": "MiniMax-M3.1-Flash", - "display_name": "MiniMax-M3.1-Flash", + "id": "deepinfra/ling-3.0-flash-vl", + "name": "Ling 3.0 Flash VL (DeepInfra)", + "display_name": "Ling 3.0 Flash VL (DeepInfra)", "modalities": { "input": [ "text", @@ -212093,8 +204055,8 @@ ] }, "limit": { - "context": 1048576, - "output": 512000 + "context": 131072, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -212106,37 +204068,33 @@ "reasoning": { "effort_options": [ "none", - "minimal", "low", "medium", - "high", - "xhigh", - "max" + "high" ] } }, "attachment": true, - "open_weights": false, - "release_date": "2026-10-19", - "last_updated": "2026-10-19", + "open_weights": true, + "release_date": "2026-09-10", + "last_updated": "2026-09-10", "type": "chat" }, { - "id": "grok-4-6", - "name": "Grok 4.6", - "display_name": "Grok 4.6", + "id": "deepinfra/gemma-4-26b-a4b-it", + "name": "Gemma 4 26B A4B IT (DeepInfra)", + "display_name": "Gemma 4 26B A4B IT (DeepInfra)", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 500000, - "output": 500000 + "context": 262144, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -212146,41 +204104,33 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "minimal", - "low", - "medium", - "high", - "xhigh" - ] + "supported": true } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-02-01", - "release_date": "2026-08-12", - "last_updated": "2026-08-12", + "attachment": false, + "open_weights": true, + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "claude-sonnet-5", - "name": "Claude Sonnet 5", - "display_name": "Claude Sonnet 5", + "id": "deepinfra/gemma-4-31b-it", + "name": "Gemma 4 31B IT (DeepInfra)", + "display_name": "Gemma 4 31B IT (DeepInfra)", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 1000000 + "context": 262144, + "output": 32768 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": true, "default": true @@ -212190,6 +204140,7 @@ "supported": true, "effort_options": [ "none", + "minimal", "low", "medium", "high", @@ -212198,30 +204149,31 @@ ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-30", - "last_updated": "2026-06-30", + "attachment": false, + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "grok-4-20-beta-0309-reasoning", - "name": "Grok 4.20 (Reasoning)", - "display_name": "Grok 4.20 (Reasoning)", + "id": "deepinfra/mimo-v2.6-flash", + "name": "MiMo V2.6 Flash (DeepInfra)", + "display_name": "MiMo V2.6 Flash (DeepInfra)", "modalities": { "input": [ "text", "image", - "pdf" + "audio", + "video" ], "output": [ "text" ] }, "limit": { - "context": 2000000, - "output": 30000 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -212232,34 +204184,37 @@ "extra_capabilities": { "reasoning": { "effort_options": [ + "none", + "minimal", "low", "medium", - "high" + "high", + "xhigh", + "max" ] } }, "attachment": true, - "open_weights": false, - "release_date": "2026-03-09", - "last_updated": "2026-03-09", + "open_weights": true, + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "seed-1-6-250615", - "name": "Seed 1.6 (250615)", - "display_name": "Seed 1.6 (250615)", + "id": "deepinfra/deepseek-v4-pro", + "name": "DeepSeek V4 Pro (DeepInfra)", + "display_name": "DeepSeek V4 Pro (DeepInfra)", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 8192 + "context": 1048576, + "output": 64000 }, "temperature": true, "tool_call": true, @@ -212269,35 +204224,49 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", "effort_options": [ - "minimal", "low", - "medium", - "high" + "high", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2025-06-25", - "last_updated": "2025-06-25", + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "minimax-m2.1", - "name": "MiniMax-M2.1", - "display_name": "MiniMax-M2.1", + "id": "deepinfra/deepseek-v4.1-flash-1017", + "name": "DeepSeek V4.1 Flash 1017 (DeepInfra)", + "display_name": "DeepSeek V4.1 Flash 1017 (DeepInfra)", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 1048576, + "output": 393216 }, "temperature": true, "tool_call": true, @@ -212307,8 +204276,9 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ + "none", + "minimal", "low", "medium", "high", @@ -212317,69 +204287,61 @@ ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2025-12-23", - "last_updated": "2025-12-23", + "knowledge": "2025-05", + "release_date": "2026-10-17", + "last_updated": "2026-10-17", "type": "chat" }, { - "id": "fugu-ultra-v2.0", - "name": "Fugu Ultra v2.0", - "display_name": "Fugu Ultra v2.0", + "id": "deepinfra/deepseek-v3.2", + "name": "DeepSeek V3.2 (DeepInfra)", + "display_name": "DeepSeek V3.2 (DeepInfra)", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 1000000 + "context": 160000, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": true }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "high", - "xhigh", - "max" - ] + "supported": true } }, - "attachment": true, - "open_weights": false, - "release_date": "2026-09-11", - "last_updated": "2026-09-11", + "attachment": false, + "open_weights": true, + "knowledge": "2024-07", + "release_date": "2025-12-01", + "last_updated": "2025-12-01", "type": "chat" }, { - "id": "gemini-3.5-flash", - "name": "Gemini 3.5 Flash", - "display_name": "Gemini 3.5 Flash", + "id": "deepinfra/granite-4.2-8b", + "name": "Granite 4.2 8B (DeepInfra)", + "display_name": "Granite 4.2 8B (DeepInfra)", "modalities": { "input": [ - "text", - "image", - "video", - "audio", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 131072, + "output": 117964 }, "temperature": true, "tool_call": true, @@ -212389,34 +204351,24 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", + "effort_options": [ + "none", "low", "medium", "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-05-19", - "last_updated": "2026-05-19", + "attachment": false, + "open_weights": true, + "release_date": "2026-08-25", + "last_updated": "2026-08-25", "type": "chat" }, { - "id": "gemini-pro-latest", - "name": "Gemini Pro Latest", - "display_name": "Gemini Pro Latest", + "id": "deepinfra/qwen3-vl-235b-a22b-instruct", + "name": "Qwen3 VL 235B A22B Instruct (DeepInfra)", + "display_name": "Qwen3 VL 235B A22B Instruct (DeepInfra)", "modalities": { "input": [ "text", @@ -212427,47 +204379,38 @@ ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 262144, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high" - ] - } + "supported": false }, "attachment": true, - "open_weights": false, - "release_date": "2026-02-27", - "last_updated": "2026-02-27", + "open_weights": true, + "knowledge": "2025-03-31", + "release_date": "2025-09-23", + "last_updated": "2025-09-23", "type": "chat" }, { - "id": "gpt-5.6-terra", - "name": "GPT-5.6 Terra", - "display_name": "GPT-5.6 Terra", + "id": "moonshot/kimi-k2.7-code-highspeed", + "name": "Kimi K2.7 Code Highspeed (Moonshot AI)", + "display_name": "Kimi K2.7 Code Highspeed (Moonshot AI)", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 262144, + "output": 262144 }, "temperature": false, "tool_call": true, @@ -212478,52 +204421,47 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ - "none", "low", "medium", "high", "xhigh", "max" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-06-12", + "last_updated": "2026-06-12", "type": "chat" }, { - "id": "grok-4-20-reasoning", - "name": "Grok 4.20 (Reasoning)", - "display_name": "Grok 4.20 (Reasoning)", + "id": "moonshot/kimi-k3.1-pro", + "name": "Kimi K3.1 Pro (Moonshot AI)", + "display_name": "Kimi K3.1 Pro (Moonshot AI)", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 2000000, - "output": 30000 + "context": 1048576, + "output": 1048576 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -212531,37 +204469,36 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ "low", - "medium", - "high" + "high", + "max" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-03-09", - "last_updated": "2026-03-09", + "release_date": "2026-10-23", + "last_updated": "2026-10-23", "type": "chat" }, { - "id": "o3", - "name": "o3", - "display_name": "o3", + "id": "moonshot/kimi-k2.7-code", + "name": "Kimi K2.7 Code (Moonshot AI)", + "display_name": "Kimi K2.7 Code (Moonshot AI)", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 262144, + "output": 262144 }, "temperature": false, "tool_call": true, @@ -212572,40 +204509,45 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ "low", "medium", - "high" - ], - "visibility": "hidden" + "high", + "xhigh", + "max" + ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2024-05", - "release_date": "2025-04-16", - "last_updated": "2025-04-16", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-06-12", + "last_updated": "2026-06-12", "type": "chat" }, { - "id": "muse-spark-1.2-contributor", - "name": "Muse Spark 1.2 Contributor", - "display_name": "Muse Spark 1.2 Contributor", + "id": "moonshot/kimi-k2.6", + "name": "Kimi K2.6 (Moonshot AI)", + "display_name": "Kimi K2.6 (Moonshot AI)", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 1048576 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, @@ -212615,111 +204557,118 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ + "none", "minimal", "low", "medium", "high", - "xhigh" + "xhigh", + "max" ] } }, - "attachment": true, - "open_weights": false, - "release_date": "2026-08-06", - "last_updated": "2026-08-06", - "type": "chat" - }, - { - "id": "kimi-k2", - "name": "Kimi K2", - "display_name": "Kimi K2", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 256000, - "output": 16384 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2025-07-11", - "last_updated": "2025-07-11", + "knowledge": "2025-01", + "release_date": "2026-04-20", + "last_updated": "2026-04-20", "type": "chat" }, { - "id": "qwen3-coder-next", - "name": "Qwen3 Coder Next", - "display_name": "Qwen3 Coder Next", + "id": "moonshot/kimi-k3.1-pro-highspeed", + "name": "Kimi K3.1 Pro Highspeed (Moonshot AI)", + "display_name": "Kimi K3.1 Pro Highspeed (Moonshot AI)", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 1048576, + "output": 1048576 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-09", - "release_date": "2026-02-03", - "last_updated": "2026-02-03", + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "high", + "max" + ] + } + }, + "attachment": true, + "open_weights": false, + "release_date": "2026-10-23", + "last_updated": "2026-10-23", "type": "chat" }, { - "id": "gpt-live-transcribe", - "name": "GPT-Live-Transcribe", - "display_name": "GPT-Live-Transcribe", + "id": "moonshot/kimi-k3", + "name": "Kimi K3 (Moonshot AI)", + "display_name": "Kimi K3 (Moonshot AI)", "modalities": { "input": [ "text", - "audio" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 1048576, + "output": 1048576 }, "temperature": false, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "low", + "high", + "max" + ] + } }, "attachment": true, - "open_weights": false, - "release_date": "2026-07-28", - "last_updated": "2026-07-28" + "open_weights": true, + "release_date": "2026-07-16", + "last_updated": "2026-07-16", + "type": "chat" }, { - "id": "qwen3-coder-480b-a35b-instruct", - "name": "Qwen3-Coder 480B-A35B Instruct", - "display_name": "Qwen3-Coder 480B-A35B Instruct", + "id": "moonshot/kimi-k2.5", + "name": "Kimi K2.5 (Moonshot AI)", + "display_name": "Kimi K2.5 (Moonshot AI)", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" @@ -212727,36 +204676,58 @@ }, "limit": { "context": 262144, - "output": 65536 + "output": 32768 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "none", + "minimal", + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + }, + "attachment": true, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-07-22", - "last_updated": "2025-07-22", + "knowledge": "2025-01", + "release_date": "2026-01-27", + "last_updated": "2026-01-27", "type": "chat" }, { - "id": "seed-2-0-pro-260328", - "name": "Seed 2.0 Pro (260328)", - "display_name": "Seed 2.0 Pro (260328)", + "id": "nebius/minimax-m3.1-flash", + "name": "MiniMax M3.1 Flash (Nebius AI)", + "display_name": "MiniMax M3.1 Flash (Nebius AI)", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1048576, + "output": 1048576 }, "temperature": true, "tool_call": true, @@ -212767,36 +204738,37 @@ "extra_capabilities": { "reasoning": { "effort_options": [ + "none", "minimal", "low", "medium", - "high" + "high", + "xhigh", + "max" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-03-28", - "last_updated": "2026-03-28", + "release_date": "2026-10-19", + "last_updated": "2026-10-19", "type": "chat" }, { - "id": "qwen3.5-27b", - "name": "Qwen3.5 27B", - "display_name": "Qwen3.5 27B", + "id": "baidu/glm-5.2", + "name": "GLM-5.2 (Baidu)", + "display_name": "GLM-5.2 (Baidu)", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 1048576, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -212824,31 +204796,29 @@ ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-02-23", - "last_updated": "2026-02-23", + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "claude-opus-5-5", - "name": "Claude Opus 5.5", - "display_name": "Claude Opus 5.5", + "id": "baidu/deepseek-v4-flash", + "name": "DeepSeek V4 Flash (Baidu)", + "display_name": "DeepSeek V4 Flash (Baidu)", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 1048576, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -212856,26 +204826,37 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", "effort_options": [ "low", - "medium", "high", - "xhigh", "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "auto", - "name": "Auto Route", - "display_name": "Auto Route", + "id": "baidu/deepseek-v4.1-flash", + "name": "DeepSeek V4.1 Flash (Baidu)", + "display_name": "DeepSeek V4.1 Flash (Baidu)", "modalities": { "input": [ "text", @@ -212886,43 +204867,53 @@ ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 1048576, + "output": 393216 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "effort_options": [ + "none", + "minimal", + "low", + "medium", + "high", + "xhigh", + "max" + ] } }, "attachment": true, - "open_weights": false, - "release_date": "2024-01-01", - "last_updated": "2024-01-01", + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-09-10", + "last_updated": "2026-09-10", "type": "chat" }, { - "id": "gpt-5-pro", - "name": "GPT-5 Pro", - "display_name": "GPT-5 Pro", + "id": "baidu/glm-5.3", + "name": "GLM-5.3 (Baidu)", + "display_name": "GLM-5.3 (Baidu)", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 272000 + "context": 1048576, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -212931,41 +204922,34 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "fixed", - "effort": "high", - "verbosity": "medium", - "verbosity_options": [ + "effort_options": [ "low", - "medium", - "high" - ], - "visibility": "hidden" + "high", + "max" + ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-10-06", - "last_updated": "2025-10-06", + "attachment": false, + "open_weights": true, + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "qwen3.7-flash", - "name": "Qwen3.7 Flash", - "display_name": "Qwen3.7 Flash", + "id": "baidu/deepseek-v4-pro", + "name": "DeepSeek V4 Pro (Baidu)", + "display_name": "DeepSeek V4 Pro (Baidu)", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 983616, - "output": 1000000 + "context": 1048576, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -212976,42 +204960,50 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", "effort_options": [ - "none", - "minimal", "low", - "medium", "high", - "xhigh", "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, - "attachment": true, - "open_weights": false, - "release_date": "2026-07-15", - "last_updated": "2026-07-15", + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "gpt-6-sol", - "name": "GPT-6 Sol", - "display_name": "GPT-6 Sol", + "id": "baidu/deepseek-v4.1-flash-1017", + "name": "DeepSeek V4.1 Flash 1017 (Baidu)", + "display_name": "DeepSeek V4.1 Flash 1017 (Baidu)", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1048576, + "output": 393216 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -213021,6 +205013,7 @@ "reasoning": { "effort_options": [ "none", + "minimal", "low", "medium", "high", @@ -213030,20 +205023,21 @@ } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-04-20", - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-10-17", + "last_updated": "2026-10-17", "type": "chat" }, { - "id": "gpt-5.3-codex", - "name": "GPT-5.3 Codex", - "display_name": "GPT-5.3 Codex", + "id": "baidu/glm-5.3-flash", + "name": "GLM-5.3 Flash (Baidu)", + "display_name": "GLM-5.3 Flash (Baidu)", "modalities": { "input": [ "text", "image", + "video", "pdf" ], "output": [ @@ -213051,8 +205045,8 @@ ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 1048576, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -213063,35 +205057,22 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "xhigh", + "max" + ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-05", - "last_updated": "2026-02-05", + "open_weights": true, + "release_date": "2026-08-26", + "last_updated": "2026-08-26", "type": "chat" }, { - "id": "llama-3.1-70b-instruct", - "name": "Llama 3.1 70B Instruct", - "display_name": "Llama 3.1 70B Instruct", + "id": "baidu/glm-5.1", + "name": "GLM-5.1 (Baidu)", + "display_name": "GLM-5.1 (Baidu)", "modalities": { "input": [ "text" @@ -213101,247 +205082,349 @@ ] }, "limit": { - "context": 128000, - "output": 2048 + "context": 202752, + "output": 131072 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "none", + "minimal", + "low", + "medium", + "high", + "xhigh", + "max" + ] + } }, "attachment": false, "open_weights": true, - "knowledge": "2023-12", - "release_date": "2024-07-23", - "last_updated": "2024-07-23", + "release_date": "2026-04-07", + "last_updated": "2026-04-07", "type": "chat" }, { - "id": "qwen3-14b", - "name": "Qwen3 14B", - "display_name": "Qwen3 14B", + "id": "vertex-anthropic/claude-sonnet-4-5", + "name": "Claude Sonnet 4.5 (Vertex AI (Anthropic))", + "display_name": "Claude Sonnet 4.5 (Vertex AI (Anthropic))", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 32768, - "output": 32768 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2025-04-28", - "last_updated": "2025-04-28", + "knowledge": "2025-07-31", + "release_date": "2025-09-29", + "last_updated": "2025-09-29", "type": "chat" }, { - "id": "grok-4", - "name": "Grok 4", - "display_name": "Grok 4", + "id": "vertex-anthropic/claude-haiku-4-5", + "name": "Claude Haiku 4.5 (Vertex AI (Anthropic))", + "display_name": "Claude Haiku 4.5 (Vertex AI (Anthropic))", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 256000 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": false }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + ] } }, "attachment": true, "open_weights": false, - "release_date": "2025-07-09", - "last_updated": "2025-07-09", + "knowledge": "2025-02-28", + "release_date": "2025-10-15", + "last_updated": "2025-10-15", "type": "chat" }, { - "id": "qwen3.6-plus", - "name": "Qwen3.6 Plus", - "display_name": "Qwen3.6 Plus", + "id": "vertex-anthropic/claude-sonnet-4-6", + "name": "Claude Sonnet 4.6 (Vertex AI (Anthropic))", + "display_name": "Claude Sonnet 4.6 (Vertex AI (Anthropic))", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 983616, - "output": 65536 + "context": 1000000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "max" + ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" ], - "effort_options": [ - "none", - "minimal", - "low", - "medium", - "high", - "xhigh", - "max" + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-04", - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "knowledge": "2025-08-31", + "release_date": "2026-02-17", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "glm-4.5-air", - "name": "GLM-4.5-Air", - "display_name": "GLM-4.5-Air", + "id": "vertex-anthropic/claude-opus-4-7", + "name": "Claude Opus 4.7 (Vertex AI (Anthropic))", + "display_name": "Claude Opus 4.7 (Vertex AI (Anthropic))", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131000, - "output": 98304 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-07-28", - "last_updated": "2025-07-28", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2026-01-31", + "release_date": "2026-04-16", + "last_updated": "2026-04-16", "type": "chat" }, { - "id": "qwen3.6-flash", - "name": "Qwen3.6 Flash", - "display_name": "Qwen3.6 Flash", + "id": "vertex-anthropic/claude-opus-4-6", + "name": "Claude Opus 4.6 (Vertex AI (Anthropic))", + "display_name": "Claude Opus 4.6 (Vertex AI (Anthropic))", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 983616, - "output": 65536 + "context": 1000000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "max" + ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" ], - "effort_options": [ - "none", - "minimal", - "low", - "medium", - "high", - "xhigh", - "max" + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-04-27", - "last_updated": "2026-04-27", + "knowledge": "2025-05-31", + "release_date": "2026-02-05", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "minimax-m2.1-lightning", - "name": "MiniMax M2.1 Lightning", - "display_name": "MiniMax M2.1 Lightning", + "id": "vertex-anthropic/claude-sonnet-5", + "name": "Claude Sonnet 5 (Vertex AI (Anthropic))", + "display_name": "Claude Sonnet 5 (Vertex AI (Anthropic))", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 196608, - "output": 131072 + "context": 1000000, + "output": 128000 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ + "none", "low", "medium", "high", @@ -213350,22 +205433,21 @@ ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2025-12-23", - "last_updated": "2025-12-23", + "attachment": true, + "open_weights": false, + "knowledge": "2026-01-31", + "release_date": "2026-06-30", + "last_updated": "2026-06-30", "type": "chat" }, { - "id": "gemini-3.5-flash-lite", - "name": "Gemini 3.5 Flash Lite", - "display_name": "Gemini 3.5 Flash Lite", + "id": "vertex-anthropic/claude-opus-4-5-20251101", + "name": "Claude Opus 4.5 (Vertex AI (Anthropic))", + "display_name": "Claude Opus 4.5 (Vertex AI (Anthropic))", "modalities": { "input": [ "text", "image", - "video", - "audio", "pdf" ], "output": [ @@ -213373,37 +205455,53 @@ ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 200000, + "output": 32000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", "effort_options": [ - "minimal", "low", "medium", "high" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-07-21", - "last_updated": "2026-07-21", + "knowledge": "2025-05", + "release_date": "2025-11-24", + "last_updated": "2025-11-24", "type": "chat" }, { - "id": "qwen3-coder-flash", - "name": "Qwen3 Coder Flash", - "display_name": "Qwen3 Coder Flash", + "id": "inference.net/llama-3.2-11b-instruct", + "name": "Llama 3.2 11B Instruct (Inference.net)", + "display_name": "Llama 3.2 11B Instruct (Inference.net)", "modalities": { "input": [ "text" @@ -213413,25 +205511,24 @@ ] }, "limit": { - "context": 997952, - "output": 65536 + "context": 128000, + "output": 128000 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, "attachment": false, "open_weights": false, - "knowledge": "2025-04", - "release_date": "2025-07-28", - "last_updated": "2025-07-28", + "release_date": "2024-09-25", + "last_updated": "2024-09-25", "type": "chat" }, { - "id": "glm-5.3", - "name": "GLM-5.3", - "display_name": "GLM-5.3", + "id": "inference.net/glm-5.3", + "name": "GLM-5.3 (Inference.net)", + "display_name": "GLM-5.3 (Inference.net)", "modalities": { "input": [ "text" @@ -213454,12 +205551,8 @@ "reasoning": { "supported": true, "effort_options": [ - "none", - "minimal", "low", - "medium", "high", - "xhigh", "max" ] } @@ -213471,21 +205564,22 @@ "type": "chat" }, { - "id": "seed-1-6-flash-250715", - "name": "Seed 1.6 Flash (250715)", - "display_name": "Seed 1.6 Flash (250715)", + "id": "inference.net/minimax-m3.1-flash", + "name": "MiniMax M3.1 Flash (Inference.net)", + "display_name": "MiniMax M3.1 Flash (Inference.net)", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 8192 + "context": 1000000, + "output": 524288 }, "temperature": true, "tool_call": true, @@ -213496,121 +205590,152 @@ "extra_capabilities": { "reasoning": { "effort_options": [ - "minimal", "low", "medium", - "high" + "high", + "xhigh", + "max" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2025-07-26", - "last_updated": "2025-07-26", + "open_weights": false, + "release_date": "2026-10-19", + "last_updated": "2026-10-19", "type": "chat" }, { - "id": "llama-3-70b-instruct", - "name": "Llama 3 70B Instruct", - "display_name": "Llama 3 70B Instruct", + "id": "inference.net/deepseek-v4.1-flash-cyber", + "name": "DeepSeek V4.1 Flash Cyber (Inference.net)", + "display_name": "DeepSeek V4.1 Flash Cyber (Inference.net)", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 8192, - "output": 8000 + "context": 1040000, + "output": 393216 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "release_date": "2024-04-18", - "last_updated": "2024-04-18", + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "low", + "high", + "xhigh", + "max" + ] + } + }, + "attachment": true, + "open_weights": false, + "release_date": "2026-10-29", + "last_updated": "2026-10-29", "type": "chat" }, { - "id": "gpt-4o-mini-transcribe", - "name": "GPT-4o Mini Transcribe", - "display_name": "GPT-4o Mini Transcribe", + "id": "inference.net/deepseek-v4.1-flash-1017", + "name": "DeepSeek V4.1 Flash 1017 (Inference.net)", + "display_name": "DeepSeek V4.1 Flash 1017 (Inference.net)", "modalities": { "input": [ "text", - "audio" + "image" ], "output": [ "text" ] }, "limit": { - "context": 16000, - "output": 16000 + "context": 262144, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "low", + "high", + "xhigh", + "max" + ] + } }, "attachment": true, - "open_weights": false, - "release_date": "2025-03-20", - "last_updated": "2025-03-20", + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-10-17", + "last_updated": "2026-10-17", "type": "chat" }, { - "id": "qwen3-max", - "name": "Qwen3 Max", - "display_name": "Qwen3 Max", + "id": "inference.net/glm-5.3-flash", + "name": "GLM-5.3 Flash (Inference.net)", + "display_name": "GLM-5.3 Flash (Inference.net)", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 1048576, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "low", + "high", + "max" ] } }, - "attachment": false, - "open_weights": false, - "knowledge": "2025-04", - "release_date": "2025-09-23", - "last_updated": "2025-09-23", + "attachment": true, + "open_weights": true, + "release_date": "2026-08-26", + "last_updated": "2026-08-26", "type": "chat" }, { - "id": "fugu-ultra", - "name": "Fugu Ultra", - "display_name": "Fugu Ultra", + "id": "xiaomi/mimo-v2.6-pro", + "name": "MiMo V2.6 Pro (Xiaomi)", + "display_name": "MiMo V2.6 Pro (Xiaomi)", "modalities": { "input": [ "text", - "image" + "image", + "audio", + "video" ], "output": [ "text" @@ -213618,7 +205743,7 @@ }, "limit": { "context": 1000000, - "output": 1000000 + "output": 131072 }, "temperature": true, "tool_call": true, @@ -213629,37 +205754,39 @@ "extra_capabilities": { "reasoning": { "effort_options": [ - "high", - "xhigh", - "max" + "none", + "low", + "medium", + "high" ] } }, "attachment": true, - "open_weights": false, - "release_date": "2026-06-15", - "last_updated": "2026-06-15", + "open_weights": true, + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "gpt-6.1-sol", - "name": "GPT-6.1 Sol", - "display_name": "GPT-6.1 Sol", + "id": "xiaomi/mimo-v2.6-flash", + "name": "MiMo V2.6 Flash (Xiaomi)", + "display_name": "MiMo V2.6 Flash (Xiaomi)", "modalities": { "input": [ "text", "image", - "pdf" + "audio", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1000000, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -213668,38 +205795,35 @@ "extra_capabilities": { "reasoning": { "effort_options": [ + "none", "low", "medium", - "high", - "xhigh", - "max" + "high" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-04-30", - "release_date": "2026-09-29", - "last_updated": "2026-09-29", + "open_weights": true, + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "qwen35-397b-a17b", - "name": "Qwen3.5 397B-A17B", - "display_name": "Qwen3.5 397B-A17B", + "id": "reka-ai/deepseek-v4.1-flash", + "name": "DeepSeek V4.1 Flash (reka-ai)", + "display_name": "DeepSeek V4.1 Flash (reka-ai)", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 1048576, + "output": 393216 }, "temperature": true, "tool_call": true, @@ -213709,6 +205833,7 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ "none", "minimal", @@ -213722,14 +205847,15 @@ }, "attachment": true, "open_weights": true, - "release_date": "2026-02-15", - "last_updated": "2026-02-15", + "knowledge": "2025-05", + "release_date": "2026-09-10", + "last_updated": "2026-09-10", "type": "chat" }, { - "id": "qwen3.7-max", - "name": "Qwen3.7 Max", - "display_name": "Qwen3.7 Max", + "id": "reka-ai/glm-5.3", + "name": "GLM-5.3 (reka-ai)", + "display_name": "GLM-5.3 (reka-ai)", "modalities": { "input": [ "text" @@ -213739,8 +205865,8 @@ ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 1048576, + "output": 262144 }, "temperature": true, "tool_call": true, @@ -213763,15 +205889,15 @@ } }, "attachment": false, - "open_weights": false, - "release_date": "2026-05-21", - "last_updated": "2026-05-21", + "open_weights": true, + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "mistral-small-2603", - "name": "Mistral Small 4", - "display_name": "Mistral Small 4", + "id": "reka-ai/deepseek-v4.1-flash-1017", + "name": "DeepSeek V4.1 Flash 1017 (reka-ai)", + "display_name": "DeepSeek V4.1 Flash 1017 (reka-ai)", "modalities": { "input": [ "text", @@ -213782,8 +205908,8 @@ ] }, "limit": { - "context": 262144, - "output": 256000 + "context": 1048576, + "output": 393216 }, "temperature": true, "tool_call": true, @@ -213791,94 +205917,141 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "minimal", + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + }, "attachment": true, "open_weights": true, - "knowledge": "2025-06", - "release_date": "2026-03-16", - "last_updated": "2026-03-16", + "knowledge": "2025-05", + "release_date": "2026-10-17", + "last_updated": "2026-10-17", "type": "chat" }, { - "id": "hy-mt2-plus", - "name": "Hy-MT2 Plus", - "display_name": "Hy-MT2 Plus", + "id": "reka-ai/glm-5.3-flash", + "name": "GLM-5.3 Flash (reka-ai)", + "display_name": "GLM-5.3 Flash (reka-ai)", "modalities": { "input": [ + "text", + "image", + "video", + "pdf" + ], + "output": [ "text" + ] + }, + "limit": { + "context": 262144, + "output": 262144 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "none", + "minimal", + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + }, + "attachment": true, + "open_weights": true, + "release_date": "2026-08-26", + "last_updated": "2026-08-26", + "type": "chat" + }, + { + "id": "reka-ai/reka-edge-2603", + "name": "Reka Edge 2603 (reka-ai)", + "display_name": "Reka Edge 2603 (reka-ai)", + "modalities": { + "input": [ + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 16384, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-05-21", - "last_updated": "2026-05-21", + "release_date": "2026-10-09", + "last_updated": "2026-10-09", "type": "chat" }, { - "id": "gemini-3.1-pro-preview", - "name": "Gemini 3.1 Pro Preview", - "display_name": "Gemini 3.1 Pro Preview", + "id": "greenference/qwen3.6-27b", + "name": "Qwen3.6 27B (greenference)", + "display_name": "Qwen3.6 27B (greenference)", "modalities": { "input": [ - "text", - "image", - "video", - "audio", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 16384, + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "low", - "high" - ], + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-02-19", - "last_updated": "2026-02-19", + "attachment": false, + "open_weights": true, + "release_date": "2026-04-22", + "last_updated": "2026-04-22", "type": "chat" }, { - "id": "qwen3-32b", - "name": "Qwen3 32B", - "display_name": "Qwen3 32B", + "id": "greenference/qwen3-14b", + "name": "Qwen3 14B (greenference)", + "display_name": "Qwen3 14B (greenference)", "modalities": { "input": [ "text" @@ -213888,14 +206061,13 @@ ] }, "limit": { - "context": 40960, - "output": 16384 + "context": 16384, + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": true }, "extra_capabilities": { "reasoning": { @@ -213909,64 +206081,58 @@ } }, "attachment": false, - "open_weights": true, - "knowledge": "2025-04", + "open_weights": false, "release_date": "2025-04-28", "last_updated": "2025-04-28", "type": "chat" }, { - "id": "muse-spark-1.3", - "name": "Muse Spark 1.3", - "display_name": "Muse Spark 1.3", + "id": "greenference/qwen3-30b-a3b", + "name": "Qwen3 30B A3B (greenference)", + "display_name": "Qwen3 30B A3B (greenference)", "modalities": { "input": [ - "text", - "image", - "video", - "pdf", - "audio" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 8192, + "output": 4096 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": true }, "extra_capabilities": { "reasoning": { "supported": true, - "effort_options": [ - "minimal", - "low", - "medium", - "high", - "xhigh" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, - "attachment": true, - "open_weights": false, - "release_date": "2026-09-02", - "last_updated": "2026-09-02", + "attachment": false, + "open_weights": true, + "release_date": "2025-04-28", + "last_updated": "2025-04-28", "type": "chat" }, { - "id": "gpt-5.4", - "name": "GPT-5.4", - "display_name": "GPT-5.4", + "id": "greenference/glm-5.3-flash", + "name": "GLM-5.3 Flash (greenference)", + "display_name": "GLM-5.3 Flash (greenference)", "modalities": { "input": [ "text", "image", + "video", "pdf" ], "output": [ @@ -213974,63 +206140,48 @@ ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1048576, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ "low", "medium", "high" - ], - "visibility": "hidden" + ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-05", - "last_updated": "2026-03-05", + "open_weights": true, + "release_date": "2026-08-26", + "last_updated": "2026-08-26", "type": "chat" }, { - "id": "muse-wonder-1.0", - "name": "Muse Wonder", - "display_name": "Muse Wonder", + "id": "sakana/fugu-ultra-v2.0", + "name": "Fugu Ultra v2.0 (Sakana AI)", + "display_name": "Fugu Ultra v2.0 (Sakana AI)", "modalities": { "input": [ "text", "image", - "video", - "pdf", - "audio" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 1000000, + "output": 1000000 }, "temperature": true, "tool_call": true, @@ -214041,37 +206192,36 @@ "extra_capabilities": { "reasoning": { "effort_options": [ - "minimal", - "low", - "medium", "high", - "xhigh" + "xhigh", + "max" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-10-12", - "last_updated": "2026-10-12", + "knowledge": "2026-08-28", + "release_date": "2026-09-11", + "last_updated": "2026-09-11", "type": "chat" }, { - "id": "kimi-k2.6", - "name": "Kimi K2.6", - "display_name": "Kimi K2.6", + "id": "sakana/fugu-max", + "name": "Fugu Max (Sakana AI)", + "display_name": "Fugu Max (Sakana AI)", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1000000, + "output": 1000000 }, "temperature": true, "tool_call": true, @@ -214081,18 +206231,7 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ - "none", - "minimal", - "low", - "medium", "high", "xhigh", "max" @@ -214100,16 +206239,15 @@ } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-20", - "last_updated": "2026-04-20", + "open_weights": false, + "release_date": "2026-09-11", + "last_updated": "2026-09-11", "type": "chat" }, { - "id": "grok-4-5", - "name": "Grok 4.5", - "display_name": "Grok 4.5", + "id": "sakana/fugu-ultra", + "name": "Fugu Ultra (Sakana AI)", + "display_name": "Fugu Ultra (Sakana AI)", "modalities": { "input": [ "text", @@ -214120,10 +206258,10 @@ ] }, "limit": { - "context": 500000, - "output": 500000 + "context": 1000000, + "output": 1000000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -214132,35 +206270,34 @@ "extra_capabilities": { "reasoning": { "effort_options": [ - "low", - "medium", - "high" + "high", + "xhigh", + "max" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-07-08", - "last_updated": "2026-07-08", + "release_date": "2026-06-15", + "last_updated": "2026-06-15", "type": "chat" }, { - "id": "gemini-3.8-flash", - "name": "Gemini 3.8 Flash", - "display_name": "Gemini 3.8 Flash", + "id": "together-ai/muse-glimmer-30b", + "name": "Muse Glimmer 30B (Together AI)", + "display_name": "Muse Glimmer 30B (Together AI)", "modalities": { "input": [ "text", - "image", - "audio" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 1048576 + "context": 131072, + "output": 117964 }, "temperature": true, "tool_call": true, @@ -214170,38 +206307,31 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ + "effort_options": [ "minimal", "low", "medium", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" + "high", + "xhigh", + "max" ] } }, "attachment": true, - "open_weights": false, - "release_date": "2026-09-02", - "last_updated": "2026-09-02", + "open_weights": true, + "knowledge": "2026-01-04", + "release_date": "2026-08-10", + "last_updated": "2026-08-10", "type": "chat" }, { - "id": "kimi-k3", - "name": "Kimi K3", - "display_name": "Kimi K3", + "id": "together-ai/deepseek-v4.1-flash", + "name": "DeepSeek V4.1 Flash (Together AI)", + "display_name": "DeepSeek V4.1 Flash (Together AI)", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" @@ -214209,9 +206339,9 @@ }, "limit": { "context": 1048576, - "output": 131072 + "output": 393216 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -214222,9 +206352,7 @@ "supported": true, "effort_options": [ "none", - "minimal", "low", - "medium", "high", "xhigh", "max" @@ -214233,26 +206361,26 @@ }, "attachment": true, "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-16", + "knowledge": "2025-05", + "release_date": "2026-09-10", + "last_updated": "2026-09-10", "type": "chat" }, { - "id": "grok-4-1-fast-reasoning", - "name": "Grok 4.1 Fast Reasoning", - "display_name": "Grok 4.1 Fast Reasoning", + "id": "together-ai/qwen3.8-2.4t-a95b", + "name": "Qwen3.8 2.4T A95B (Together AI)", + "display_name": "Qwen3.8 2.4T A95B (Together AI)", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 2000000, - "output": 30000 + "context": 1010000, + "output": 909000 }, "temperature": true, "tool_call": true, @@ -214264,26 +206392,26 @@ "reasoning": { "supported": true, "effort_options": [ + "none", "low", "medium", - "high" + "xhigh" ] } }, - "attachment": true, - "open_weights": false, - "release_date": "2025-11-19", - "last_updated": "2025-11-19", + "attachment": false, + "open_weights": true, + "release_date": "2026-08-12", + "last_updated": "2026-08-12", "type": "chat" }, { - "id": "kimi-k3.1-pro-highspeed", - "name": "Kimi K3.1 Pro Highspeed", - "display_name": "Kimi K3.1 Pro Highspeed", + "id": "together-ai/glm-5.3", + "name": "GLM-5.3 (Together AI)", + "display_name": "GLM-5.3 (Together AI)", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" @@ -214291,9 +206419,9 @@ }, "limit": { "context": 1048576, - "output": 1048576 + "output": 943717 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -214301,6 +206429,7 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ "low", "high", @@ -214308,28 +206437,27 @@ ] } }, - "attachment": true, - "open_weights": false, - "release_date": "2026-10-23", - "last_updated": "2026-10-23", + "attachment": false, + "open_weights": true, + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "seed-1-8-251228", - "name": "Seed 1.8 (251228)", - "display_name": "Seed 1.8 (251228)", + "id": "together-ai/gpt-oss-120b", + "name": "GPT OSS 120B (Together AI)", + "display_name": "GPT OSS 120B (Together AI)", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 8192 + "context": 131072, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -214339,55 +206467,58 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ - "minimal", "low", "medium", "high" ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2025-12-18", - "last_updated": "2025-12-18", + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "glm-4.6v", - "name": "GLM-4.6V", - "display_name": "GLM-4.6V", + "id": "together-ai/minimax-m3", + "name": "MiniMax M3 (Together AI)", + "display_name": "MiniMax M3 (Together AI)", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 524288, + "output": 131072 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true }, - "attachment": true, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": false, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-12-08", - "last_updated": "2025-12-08", + "release_date": "2026-06-01", + "last_updated": "2026-06-01", "type": "chat" }, { - "id": "qwen3.6-27b", - "name": "Qwen3.6 27B", - "display_name": "Qwen3.6 27B", + "id": "together-ai/minimax-m3.1-flash", + "name": "MiniMax M3.1 Flash (Together AI)", + "display_name": "MiniMax M3.1 Flash (Together AI)", "modalities": { "input": [ "text", @@ -214399,8 +206530,8 @@ ] }, "limit": { - "context": 16384, - "output": 65536 + "context": 1048576, + "output": 1048576 }, "temperature": true, "tool_call": true, @@ -214408,32 +206539,19 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, "attachment": true, - "open_weights": true, - "release_date": "2026-04-22", - "last_updated": "2026-04-22", + "open_weights": false, + "release_date": "2026-10-19", + "last_updated": "2026-10-19", "type": "chat" }, { - "id": "kimi-k3.1-pro", - "name": "Kimi K3.1 Pro", - "display_name": "Kimi K3.1 Pro", + "id": "together-ai/deepseek-v4-pro", + "name": "DeepSeek V4 Pro (Together AI)", + "display_name": "DeepSeek V4 Pro (Together AI)", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" @@ -214441,9 +206559,9 @@ }, "limit": { "context": 1048576, - "output": 131072 + "output": 163840 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -214451,34 +206569,49 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", "effort_options": [ "low", "high", "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, - "attachment": true, - "open_weights": false, - "release_date": "2026-10-23", - "last_updated": "2026-10-23", + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "Qwen3.8-27B", - "name": "Qwen3.8 27B", - "display_name": "Qwen3.8 27B", + "id": "together-ai/deepseek-v4.1-flash-1017", + "name": "DeepSeek V4.1 Flash 1017 (Together AI)", + "display_name": "DeepSeek V4.1 Flash 1017 (Together AI)", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 262000, - "output": 32768 + "context": 1048576, + "output": 393216 }, "temperature": true, "tool_call": true, @@ -214489,77 +206622,65 @@ "extra_capabilities": { "reasoning": { "effort_options": [ + "none", "low", - "medium", - "xhigh" + "high", + "xhigh", + "max" ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "knowledge": "2025-05", + "release_date": "2026-10-17", + "last_updated": "2026-10-17", "type": "chat" }, { - "id": "gpt-5.1", - "name": "GPT-5.1", - "display_name": "GPT-5.1", + "id": "together-ai/kimi-k3", + "name": "Kimi K3 (Together AI)", + "display_name": "Kimi K3 (Together AI)", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 1000000, + "output": 1000000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "supported": true } }, "attachment": true, - "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-11-13", - "last_updated": "2025-11-13", + "open_weights": true, + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" }, { - "id": "claude-opus-5", - "name": "Claude Opus 5", - "display_name": "Claude Opus 5", + "id": "together-ai/glm-5.3-flash", + "name": "GLM-5.3 Flash (Together AI)", + "display_name": "GLM-5.3 Flash (Together AI)", "modalities": { "input": [ "text", "image", + "video", "pdf" ], "output": [ @@ -214567,10 +206688,10 @@ ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 1048576, + "output": 943717 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -214580,42 +206701,36 @@ "reasoning": { "supported": true, "effort_options": [ - "none", "low", - "medium", "high", - "xhigh", "max" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-05", - "release_date": "2026-07-24", - "last_updated": "2026-07-24", + "open_weights": true, + "release_date": "2026-08-26", + "last_updated": "2026-08-26", "type": "chat" }, { - "id": "kimi-k2.7-code-highspeed", - "name": "Kimi K2.7 Code Highspeed", - "display_name": "Kimi K2.7 Code Highspeed", + "id": "together-ai/glm-4.7", + "name": "GLM-4.7 (Together AI)", + "display_name": "GLM-4.7 (Together AI)", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 202752, + "output": 128000 }, - "temperature": false, - "tool_call": true, + "temperature": true, + "tool_call": false, "reasoning": { "supported": true, "default": true @@ -214628,28 +206743,20 @@ "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "effort_options": [ - "minimal", - "low", - "medium", - "high", - "xhigh", - "max" ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-06-12", - "last_updated": "2026-06-12", + "knowledge": "2025-04", + "release_date": "2025-12-22", + "last_updated": "2025-12-22", "type": "chat" }, { - "id": "qwen3-vl-plus", - "name": "Qwen3-VL Plus", - "display_name": "Qwen3-VL Plus", + "id": "mistral/mistral-small-2603", + "name": "Mistral Small 4 (Mistral AI)", + "display_name": "Mistral Small 4 (Mistral AI)", "modalities": { "input": [ "text", @@ -214661,100 +206768,66 @@ }, "limit": { "context": 262144, - "output": 32768 + "output": 256000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2025-04", - "release_date": "2025-09-23", - "last_updated": "2025-09-23", + "open_weights": true, + "knowledge": "2025-06", + "release_date": "2026-03-16", + "last_updated": "2026-03-16", "type": "chat" }, { - "id": "claude-sonnet-4-6", - "name": "Claude Sonnet 4.6", - "display_name": "Claude Sonnet 4.6", + "id": "mistral/glm-5.3", + "name": "GLM-5.3 (Mistral AI)", + "display_name": "GLM-5.3 (Mistral AI)", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 64000 + "context": 1048576, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", "effort_options": [ "low", - "medium", "high", "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-17", - "last_updated": "2026-03-13", + "attachment": false, + "open_weights": true, + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "kimi-k2.5", - "name": "Kimi K2.5", - "display_name": "Kimi K2.5", + "id": "mistral/mistral-large-2512", + "name": "Mistral Large 3 (Mistral AI)", + "display_name": "Mistral Large 3 (Mistral AI)", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" @@ -214764,82 +206837,51 @@ "context": 262144, "output": 262144 }, - "temperature": false, - "tool_call": true, + "temperature": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "none", - "minimal", - "low", - "medium", - "high", - "xhigh", - "max" - ] - } + "supported": false }, "attachment": true, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-01-27", - "last_updated": "2026-01-27", + "knowledge": "2024-11", + "release_date": "2025-12-02", + "last_updated": "2025-12-02", "type": "chat" }, { - "id": "grok-build-0-1", - "name": "Grok Build 0.1", - "display_name": "Grok Build 0.1", + "id": "mistral/mistral-small-2506", + "name": "Mistral Small 3.2 (Mistral AI)", + "display_name": "Mistral Small 3.2 (Mistral AI)", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 256000 + "context": 128000, + "output": 16384 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high" - ] - } + "supported": false }, "attachment": true, - "open_weights": false, - "release_date": "2026-04-16", - "last_updated": "2026-04-16", + "open_weights": true, + "knowledge": "2025-03", + "release_date": "2025-06-20", + "last_updated": "2025-06-20", "type": "chat" }, { - "id": "grok-4-7", - "name": "Grok 4.7", - "display_name": "Grok 4.7", + "id": "mistral/ministral-3b-2512", + "name": "Ministral 3B (Mistral AI)", + "display_name": "Ministral 3B (Mistral AI)", "modalities": { "input": [ "text", @@ -214850,95 +206892,108 @@ ] }, "limit": { - "context": 524288, - "output": 500000 + "context": 131072, + "output": 131072 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "minimal", - "low", - "medium", - "high", - "xhigh" - ] - } + "attachment": true, + "open_weights": true, + "release_date": "2025-12-02", + "last_updated": "2025-12-02", + "type": "chat" + }, + { + "id": "mistral/ministral-14b-2512", + "name": "Ministral 14B (Mistral AI)", + "display_name": "Ministral 14B (Mistral AI)", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 262144, + "output": 262144 + }, + "temperature": true, + "tool_call": false, + "reasoning": { + "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2026-05", - "release_date": "2026-09-21", - "last_updated": "2026-09-21", + "open_weights": true, + "release_date": "2025-12-02", + "last_updated": "2025-12-02", "type": "chat" }, { - "id": "claude-opus-4-5-20251101", - "name": "Claude Opus 4.5", - "display_name": "Claude Opus 4.5", + "id": "mistral/mistral-large-4", + "name": "Mistral Large 4 (Mistral AI)", + "display_name": "Mistral Large 4 (Mistral AI)", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 1000000, + "output": 262144 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." - ] - } + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2025-05", - "release_date": "2025-11-24", - "last_updated": "2025-11-24", + "release_date": "2026-10-06", + "last_updated": "2026-10-06", "type": "chat" }, { - "id": "devstral-2512", - "name": "Devstral 2", - "display_name": "Devstral 2", + "id": "mistral/mistral-large-latest", + "name": "Mistral Large Latest (Mistral AI)", + "display_name": "Mistral Large Latest (Mistral AI)", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 128000, + "output": 262144 + }, + "temperature": true, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "knowledge": "2024-11", + "release_date": "2024-11-01", + "last_updated": "2025-12-02", + "type": "chat" + }, + { + "id": "mistral/devstral-2512", + "name": "Devstral 2 (Mistral AI)", + "display_name": "Devstral 2 (Mistral AI)", "modalities": { "input": [ "text" @@ -214952,7 +207007,7 @@ "output": 262144 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, @@ -214964,49 +207019,37 @@ "type": "chat" }, { - "id": "qwen-flash", - "name": "Qwen Flash", - "display_name": "Qwen Flash", + "id": "mistral/ministral-8b-2512", + "name": "Ministral 8B (Mistral AI)", + "display_name": "Ministral 8B (Mistral AI)", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 32768 + "context": 262144, + "output": 262144 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, - "attachment": false, - "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-07-28", - "last_updated": "2025-07-28", + "attachment": true, + "open_weights": true, + "release_date": "2025-12-02", + "last_updated": "2025-12-02", "type": "chat" }, { - "id": "gpt-4.1-mini", - "name": "GPT-4.1 mini", - "display_name": "GPT-4.1 mini", + "id": "mistral/mistral-medium-3-5", + "name": "Mistral Medium 3.5 (Mistral AI)", + "display_name": "Mistral Medium 3.5 (Mistral AI)", "modalities": { "input": [ "text", @@ -215018,8 +207061,8 @@ ] }, "limit": { - "context": 1000000, - "output": 32768 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, @@ -215028,27 +207071,54 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-04-14", - "last_updated": "2025-04-14", + "release_date": "2026-04-30", + "last_updated": "2026-04-30", "type": "chat" }, { - "id": "gpt-6-astra", - "name": "GPT-6 Astra", - "display_name": "GPT-6 Astra", + "id": "mistral/codestral-2508", + "name": "Codestral (Mistral AI)", + "display_name": "Codestral (Mistral AI)", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 256000, + "output": 256000 + }, + "temperature": true, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": false, + "release_date": "2025-07-30", + "last_updated": "2025-07-30", + "type": "chat" + }, + { + "id": "aws-mantle/gpt-5.6-terra", + "name": "GPT-5.6 Terra (AWS Mantle)", + "display_name": "GPT-5.6 Terra (AWS Mantle)", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 1050000 + "context": 921600, + "output": 128000 }, "temperature": false, "tool_call": true, @@ -215059,85 +207129,150 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ + "none", "low", "medium", "high", "xhigh", "max" - ] + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2026-04-30", - "release_date": "2026-09-04", - "last_updated": "2026-09-04", + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "grok-4-1-fast-non-reasoning", - "name": "Grok 4.1 Fast Non-Reasoning", - "display_name": "Grok 4.1 Fast Non-Reasoning", + "id": "aws-mantle/gpt-5.6-sol", + "name": "GPT-5.6 Sol (AWS Mantle)", + "display_name": "GPT-5.6 Sol (AWS Mantle)", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 2000000, - "output": 2000000 + "context": 921600, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } }, "attachment": true, "open_weights": false, - "release_date": "2025-11-19", - "last_updated": "2025-11-19", + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "gpt-transcribe", - "name": "GPT-Transcribe", - "display_name": "GPT-Transcribe", + "id": "aws-mantle/gpt-5.6-luna", + "name": "GPT-5.6 Luna (AWS Mantle)", + "display_name": "GPT-5.6 Luna (AWS Mantle)", "modalities": { "input": [ "text", - "audio" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 921600, + "output": 128000 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } }, "attachment": true, "open_weights": false, - "release_date": "2026-07-28", - "last_updated": "2026-07-28" + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", + "type": "chat" }, { - "id": "deepseek-v4.1-flash-1017", - "name": "DeepSeek V4.1 Flash 1017", - "display_name": "DeepSeek V4.1 Flash 1017", + "id": "aws-mantle/gpt-6-astra", + "name": "GPT-6 Astra (AWS Mantle)", + "display_name": "GPT-6 Astra (AWS Mantle)", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" @@ -215145,9 +207280,9 @@ }, "limit": { "context": 1050000, - "output": 1050000 + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -215155,63 +207290,39 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ "low", + "medium", "high", + "xhigh", "max" ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-10-17", - "last_updated": "2026-10-17", - "type": "chat" - }, - { - "id": "sonar", - "name": "Sonar", - "display_name": "Sonar", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 130000, - "output": 4096 - }, - "temperature": true, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, "open_weights": false, - "knowledge": "2025-09-01", - "release_date": "2024-01-01", - "last_updated": "2025-09-01", + "knowledge": "2026-04-30", + "release_date": "2026-09-04", + "last_updated": "2026-09-04", "type": "chat" }, { - "id": "qwen-plus", - "name": "Qwen Plus", - "display_name": "Qwen Plus", + "id": "entrim/deepseek-v4.1-flash", + "name": "DeepSeek V4.1 Flash (entrim)", + "display_name": "DeepSeek V4.1 Flash (entrim)", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 1048576, + "output": 384000 }, "temperature": true, "tool_call": true, @@ -215222,25 +207333,26 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" ] } }, - "attachment": false, - "open_weights": false, - "knowledge": "2024-04", - "release_date": "2024-01-25", - "last_updated": "2025-09-11", + "attachment": true, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-09-10", + "last_updated": "2026-09-10", "type": "chat" }, { - "id": "minimax-text-01", - "name": "MiniMax Text 01", - "display_name": "MiniMax Text 01", + "id": "entrim/glm-5.3", + "name": "GLM-5.3 (entrim)", + "display_name": "GLM-5.3 (entrim)", "modalities": { "input": [ "text" @@ -215250,25 +207362,37 @@ ] }, "limit": { - "context": 1000000, + "context": 1048576, "output": 131072 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + }, "attachment": false, "open_weights": true, - "release_date": "2025-01-15", - "last_updated": "2025-01-15", + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "mistral-small-2506", - "name": "Mistral Small 3.2", - "display_name": "Mistral Small 3.2", + "id": "entrim/deepseek-v4.1-flash-1017", + "name": "DeepSeek V4.1 Flash 1017 (entrim)", + "display_name": "DeepSeek V4.1 Flash 1017 (entrim)", "modalities": { "input": [ "text", @@ -215279,31 +207403,42 @@ ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 1048576, + "output": 384000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } }, "attachment": true, "open_weights": true, - "knowledge": "2025-03", - "release_date": "2025-06-20", - "last_updated": "2025-06-20", + "knowledge": "2025-05", + "release_date": "2026-10-17", + "last_updated": "2026-10-17", "type": "chat" }, { - "id": "gemini-3.7-flash", - "name": "Gemini 3.7 Flash", - "display_name": "Gemini 3.7 Flash", + "id": "entrim/glm-5.3-flash", + "name": "GLM-5.3 Flash (entrim)", + "display_name": "GLM-5.3 Flash (entrim)", "modalities": { "input": [ "text", "image", "video", - "audio", "pdf" ], "output": [ @@ -215312,7 +207447,7 @@ }, "limit": { "context": 1048576, - "output": 65536 + "output": 131072 }, "temperature": true, "tool_call": true, @@ -215323,33 +207458,25 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", + "effort_options": [ "low", "medium", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" + "high", + "xhigh", + "max" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-08-13", - "last_updated": "2026-08-13", + "open_weights": true, + "release_date": "2026-08-26", + "last_updated": "2026-08-26", "type": "chat" }, { - "id": "gpt-oss-120b", - "name": "GPT OSS 120B", - "display_name": "GPT OSS 120B", + "id": "runware/glm-5.2", + "name": "GLM-5.2 (Runware)", + "display_name": "GLM-5.2 (Runware)", "modalities": { "input": [ "text" @@ -215359,8 +207486,8 @@ ] }, "limit": { - "context": 131072, - "output": 32766 + "context": 1024000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -215371,39 +207498,46 @@ "extra_capabilities": { "reasoning": { "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ + "none", + "minimal", "low", "medium", - "high" + "high", + "xhigh", + "max" ] } }, "attachment": false, "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "gpt-5.5", - "name": "GPT-5.5", - "display_name": "GPT-5.5", + "id": "runware/deepseek-v4-flash", + "name": "DeepSeek V4 Flash (Runware)", + "display_name": "DeepSeek V4 Flash (Runware)", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1048576, + "output": 384000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -215414,46 +207548,46 @@ "supported": true, "default_enabled": true, "mode": "effort", - "effort": "medium", + "effort": "high", "effort_options": [ "low", - "medium", "high", - "xhigh" + "max" ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ], - "visibility": "hidden" + "notes": [ + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." + ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-12-01", - "release_date": "2026-04-23", - "last_updated": "2026-04-23", + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "qwen3.5-9b", - "name": "Qwen3.5 9B", - "display_name": "Qwen3.5 9B", + "id": "runware/deepseek-v4.1-flash", + "name": "DeepSeek V4.1 Flash (Runware)", + "display_name": "DeepSeek V4.1 Flash (Runware)", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 1048576, + "output": 384000 }, "temperature": true, "tool_call": true, @@ -215464,24 +207598,26 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "none", + "low", + "high", + "xhigh", + "max" ] } }, "attachment": true, "open_weights": true, - "release_date": "2026-02-23", - "last_updated": "2026-02-23", + "knowledge": "2025-05", + "release_date": "2026-09-10", + "last_updated": "2026-09-10", "type": "chat" }, { - "id": "glm-5.2", - "name": "GLM-5.2", - "display_name": "GLM-5.2", + "id": "runware/glm-5.3", + "name": "GLM-5.3 (Runware)", + "display_name": "GLM-5.3 (Runware)", "modalities": { "input": [ "text" @@ -215491,7 +207627,7 @@ ] }, "limit": { - "context": 1048576, + "context": 1000000, "output": 131072 }, "temperature": true, @@ -215503,63 +207639,23 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ - "none", - "minimal", "low", - "medium", "high", - "xhigh", "max" ] } }, "attachment": false, "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", - "type": "chat" - }, - { - "id": "gpt-4o-mini", - "name": "GPT-4o mini", - "display_name": "GPT-4o mini", - "modalities": { - "input": [ - "text", - "image", - "pdf" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 128000, - "output": 16384 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": false, - "knowledge": "2023-09", - "release_date": "2024-07-18", - "last_updated": "2024-07-18", + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "glm-4.7-flashx", - "name": "GLM-4.7-FlashX", - "display_name": "GLM-4.7-FlashX", + "id": "runware/gpt-oss-120b", + "name": "GPT OSS 120B (Runware)", + "display_name": "GPT OSS 120B (Runware)", "modalities": { "input": [ "text" @@ -215569,8 +207665,8 @@ ] }, "limit": { - "context": 200000, - "output": 131072 + "context": 131072, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -215578,29 +207674,40 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "low", + "medium", + "high" + ] + } + }, "attachment": false, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2026-01-19", - "last_updated": "2026-01-19", + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "deepseek-v4.1-flash", - "name": "DeepSeek V4.1 Flash", - "display_name": "DeepSeek V4.1 Flash", + "id": "runware/kimi-k2.6", + "name": "Kimi K2.6 (Runware)", + "display_name": "Kimi K2.6 (Runware)", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 384000 + "context": 262144, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -215611,24 +207718,34 @@ "extra_capabilities": { "reasoning": { "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ + "none", + "minimal", "low", + "medium", "high", + "xhigh", "max" ] } }, "attachment": true, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-09-10", - "last_updated": "2026-09-10", + "knowledge": "2025-01", + "release_date": "2026-04-20", + "last_updated": "2026-04-20", "type": "chat" }, { - "id": "qwen3-vl-30b-a3b-instruct", - "name": "Qwen3 VL 30B A3B Instruct", - "display_name": "Qwen3 VL 30B A3B Instruct", + "id": "runware/gemma-4-31b-it", + "name": "Gemma 4 31B IT (Runware)", + "display_name": "Gemma 4 31B IT (Runware)", "modalities": { "input": [ "text", @@ -215640,36 +207757,47 @@ }, "limit": { "context": 262144, - "output": 8192 + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "none", + "high", + "xhigh", + "max" + ] + } }, "attachment": true, "open_weights": true, - "release_date": "2025-10-04", - "last_updated": "2025-10-04", + "knowledge": "2025-01", + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "grok-4-3", - "name": "Grok 4.3", - "display_name": "Grok 4.3", + "id": "runware/deepseek-v4-pro", + "name": "DeepSeek V4 Pro (Runware)", + "display_name": "DeepSeek V4 Pro (Runware)", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 30000 + "context": 1048576, + "output": 384000 }, "temperature": true, "tool_call": true, @@ -215679,24 +207807,37 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", "effort_options": [ - "none", "low", - "medium", - "high" + "high", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, - "attachment": true, - "open_weights": false, - "release_date": "2026-04-17", - "last_updated": "2026-04-17", + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "llama-4-maverick-17b-instruct", - "name": "Llama 4 Maverick 17B Instruct", - "display_name": "Llama 4 Maverick 17B Instruct", + "id": "runware/deepseek-v4.1-flash-1017", + "name": "DeepSeek V4.1 Flash 1017 (runware)", + "display_name": "DeepSeek V4.1 Flash 1017 (runware)", "modalities": { "input": [ "text", @@ -215708,97 +207849,93 @@ }, "limit": { "context": 1048576, - "output": 2048 + "output": 1048576 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "low", + "high", + "xhigh", + "max" + ] + } }, "attachment": true, "open_weights": true, - "knowledge": "2024-08", - "release_date": "2025-04-05", - "last_updated": "2025-04-05", + "knowledge": "2025-05", + "release_date": "2026-10-17", + "last_updated": "2026-10-17", "type": "chat" }, { - "id": "claude-opus-4-6", - "name": "Claude Opus 4.6", - "display_name": "Claude Opus 4.6", + "id": "runware/kimi-k3", + "name": "Kimi K3 (Runware)", + "display_name": "Kimi K3 (Runware)", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 1048576, + "output": 1048576 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", "effort_options": [ + "none", "low", - "medium", "high", "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-05-31", - "release_date": "2026-02-05", - "last_updated": "2026-03-13", + "open_weights": true, + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" }, { - "id": "gpt-5-mini", - "name": "GPT-5 Mini", - "display_name": "GPT-5 Mini", + "id": "runware/glm-5.3-flash", + "name": "GLM-5.3 Flash (Runware)", + "display_name": "GLM-5.3 Flash (Runware)", "modalities": { "input": [ "text", - "image" + "image", + "video", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 1000000, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -215807,35 +207944,27 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", "effort_options": [ + "none", "minimal", "low", "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "high", + "xhigh", + "max" + ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2024-05-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "open_weights": true, + "release_date": "2026-08-26", + "last_updated": "2026-08-26", "type": "chat" }, { - "id": "gemini-3-flash-preview", - "name": "Gemini 3 Flash Preview", - "display_name": "Gemini 3 Flash Preview", + "id": "quartz/gemini-3.1-pro-preview", + "name": "Gemini 3.1 Pro (Preview) (Quartz)", + "display_name": "Gemini 3.1 Pro (Preview) (Quartz)", "modalities": { "input": [ "text", @@ -215865,9 +207994,7 @@ "mode": "level", "level": "high", "level_options": [ - "minimal", "low", - "medium", "high" ], "summaries": true, @@ -215880,25 +208007,29 @@ "attachment": true, "open_weights": false, "knowledge": "2025-01", - "release_date": "2025-12-17", - "last_updated": "2025-12-17", + "release_date": "2026-02-19", + "last_updated": "2026-02-19", "type": "chat" }, { - "id": "gpt-oss-20b", - "name": "GPT OSS 20B", - "display_name": "GPT OSS 20B", + "id": "meta/muse-spark-1.2", + "name": "Muse Spark 1.2 (Meta)", + "display_name": "Muse Spark 1.2 (Meta)", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "pdf", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 32766 + "context": 1048576, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -215910,34 +208041,38 @@ "reasoning": { "supported": true, "effort_options": [ + "minimal", "low", "medium", - "high" + "high", + "xhigh" ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "attachment": true, + "open_weights": false, + "release_date": "2026-08-05", + "last_updated": "2026-08-05", "type": "chat" }, { - "id": "ling-3.0-flash", - "name": "InclusionAI Ling 3.0 Flash", - "display_name": "InclusionAI Ling 3.0 Flash", + "id": "meta/muse-spark-1.1", + "name": "Muse Spark 1.1 (Meta)", + "display_name": "Muse Spark 1.1 (Meta)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf", + "video" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1048576, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -215947,24 +208082,32 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ - "none" + "minimal", + "low", + "medium", + "high", + "xhigh" ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-07-23", - "last_updated": "2026-07-23", + "attachment": true, + "open_weights": false, + "release_date": "2026-04-08", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "gpt-4o-transcribe", - "name": "GPT-4o Transcribe", - "display_name": "GPT-4o Transcribe", + "id": "meta/muse-wonder-1.0", + "name": "Muse Wonder 1.0 (Meta)", + "display_name": "Muse Wonder 1.0 (Meta)", "modalities": { "input": [ "text", + "image", + "video", + "pdf", "audio" ], "output": [ @@ -215972,64 +208115,95 @@ ] }, "limit": { - "context": 16000, - "output": 16000 + "context": 1048576, + "output": 1048576 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] + } }, "attachment": true, "open_weights": false, - "release_date": "2025-03-20", - "last_updated": "2025-03-20", + "release_date": "2026-10-12", + "last_updated": "2026-10-12", "type": "chat" }, { - "id": "glm-4-32b-0414-128k", - "name": "GLM-4 32B (0414-128k)", - "display_name": "GLM-4 32B (0414-128k)", + "id": "meta/muse-spark-1.3", + "name": "Muse Spark 1.3 (Meta)", + "display_name": "Muse Spark 1.3 (Meta)", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "pdf", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 1048576, + "output": 1048576 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] + } + }, + "attachment": true, "open_weights": false, - "release_date": "2025-04-14", - "last_updated": "2025-04-14", + "release_date": "2026-09-02", + "last_updated": "2026-09-02", "type": "chat" }, { - "id": "glm-4.5v", - "name": "GLM-4.5V", - "display_name": "GLM-4.5V", + "id": "google-vertex/gemini-3.1-pro-preview", + "name": "Gemini 3.1 Pro (Preview) (Google Vertex AI)", + "display_name": "Gemini 3.1 Pro (Preview) (Google Vertex AI)", "modalities": { "input": [ "text", "image", - "video" + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -216037,22 +208211,41 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "low", + "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] + } + }, "attachment": true, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-08-11", - "last_updated": "2025-08-11", + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2026-02-19", + "last_updated": "2026-02-19", "type": "chat" }, { - "id": "minimax-m3", - "name": "MiniMax-M3", - "display_name": "MiniMax-M3", + "id": "google-vertex/gemini-3-flash-preview", + "name": "Gemini 3 Flash (Preview) (Google Vertex AI)", + "display_name": "Gemini 3 Flash (Preview) (Google Vertex AI)", "modalities": { "input": [ "text", "image", - "video" + "video", + "audio", + "pdf" ], "output": [ "text" @@ -216060,7 +208253,7 @@ }, "limit": { "context": 1048576, - "output": 512000 + "output": 65535 }, "temperature": true, "tool_call": true, @@ -216071,32 +208264,39 @@ "extra_capabilities": { "reasoning": { "supported": true, - "effort_options": [ - "none", + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ "minimal", "low", "medium", - "high", - "xhigh", - "max" + "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-06-01", - "last_updated": "2026-06-01", + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2025-12-17", + "last_updated": "2025-12-17", "type": "chat" }, { - "id": "glm-5.3-flash", - "name": "GLM-5.3-Flash", - "display_name": "GLM-5.3-Flash", + "id": "google-vertex/gemini-3.5-flash-lite", + "name": "Gemini 3.5 Flash Lite (Google Vertex AI)", + "display_name": "Gemini 3.5 Flash Lite (Google Vertex AI)", "modalities": { "input": [ "text", "image", "video", + "audio", "pdf" ], "output": [ @@ -216105,7 +208305,7 @@ }, "limit": { "context": 1048576, - "output": 131072 + "output": 65536 }, "temperature": true, "tool_call": true, @@ -216117,40 +208317,41 @@ "reasoning": { "supported": true, "effort_options": [ - "none", "minimal", "low", "medium", - "high", - "xhigh", - "max" + "high" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", + "open_weights": false, + "knowledge": "2026-03", + "release_date": "2026-07-21", + "last_updated": "2026-07-21", "type": "chat" }, { - "id": "gpt-5", - "name": "GPT-5", - "display_name": "GPT-5", + "id": "google-vertex/gemini-3.1-flash-lite", + "name": "Gemini 3.1 Flash Lite (Google Vertex AI)", + "display_name": "Gemini 3.1 Flash Lite (Google Vertex AI)", "modalities": { "input": [ "text", - "image" + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 1048576, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -216159,48 +208360,42 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", "effort_options": [ "minimal", "low", "medium", "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "knowledge": "2025-01", + "release_date": "2026-05-07", + "last_updated": "2026-05-07", "type": "chat" }, { - "id": "glm-5-turbo", - "name": "GLM-5-Turbo", - "display_name": "GLM-5-Turbo", + "id": "google-vertex/gemini-4-argon", + "name": "Gemini 4 Argon (Google Vertex AI)", + "display_name": "Gemini 4 Argon (Google Vertex AI)", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 131072 + "context": 1048576, + "output": 1048576 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -216208,37 +208403,37 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" + "high" ] } }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-03-16", - "last_updated": "2026-03-16", + "knowledge": "2026-03", + "release_date": "2026-10-13", + "last_updated": "2026-10-13", "type": "chat" }, { - "id": "glm-4.7", - "name": "GLM-4.7", - "display_name": "GLM-4.7", + "id": "google-vertex/gemini-3.7-flash", + "name": "Gemini 3.7 Flash (Google Vertex AI)", + "display_name": "Gemini 3.7 Flash (Google Vertex AI)", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -216249,36 +208444,48 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", + "low", + "medium", + "high" + ], "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" + "thought_signatures" ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-12-22", - "last_updated": "2025-12-22", + "attachment": true, + "open_weights": false, + "knowledge": "2026-03", + "release_date": "2026-08-13", + "last_updated": "2026-08-13", "type": "chat" }, { - "id": "minimax-m2.7", - "name": "MiniMax-M2.7", - "display_name": "MiniMax-M2.7", + "id": "google-vertex/gemini-3.5-flash", + "name": "Gemini 3.5 Flash (Google Vertex AI)", + "display_name": "Gemini 3.5 Flash (Google Vertex AI)", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -216289,31 +208496,33 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", + "low", + "medium", + "high" + ], "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" + "thought_signatures" ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-03-18", - "last_updated": "2026-03-18", + "attachment": true, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2026-05-19", + "last_updated": "2026-05-19", "type": "chat" }, { - "id": "gemini-3.6-flash", - "name": "Gemini 3.6 Flash", - "display_name": "Gemini 3.6 Flash", + "id": "google-vertex/gemini-3.8-flash", + "name": "Gemini 3.8 Flash (Google Vertex AI)", + "display_name": "Gemini 3.8 Flash (Google Vertex AI)", "modalities": { "input": [ "text", @@ -216357,26 +208566,29 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-07-21", - "last_updated": "2026-07-21", + "release_date": "2026-09-02", + "last_updated": "2026-09-02", "type": "chat" }, { - "id": "minimax-m2.7-highspeed", - "name": "MiniMax-M2.7-highspeed", - "display_name": "MiniMax-M2.7-highspeed", + "id": "google-vertex/gemini-3.6-flash", + "name": "Gemini 3.6 Flash (Google Vertex AI)", + "display_name": "Gemini 3.6 Flash (Google Vertex AI)", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -216387,75 +208599,46 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", + "low", + "medium", + "high" + ], "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" + "thought_signatures" ] - } - }, - "attachment": false, - "open_weights": true, - "release_date": "2026-03-18", - "last_updated": "2026-03-18", - "type": "chat" - }, - { - "id": "llama-4-scout-17b-instruct", - "name": "Llama 4 Scout 17B Instruct", - "display_name": "Llama 4 Scout 17B Instruct", - "modalities": { - "input": [ - "text", - "image" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 131072, - "output": 2048 - }, - "temperature": true, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": true, - "knowledge": "2024-08", - "release_date": "2025-04-05", - "last_updated": "2025-04-05", + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2026-03", + "release_date": "2026-07-21", + "last_updated": "2026-07-21", "type": "chat" }, { - "id": "gpt-6-luna", - "name": "GPT-6 Luna", - "display_name": "GPT-6 Luna", + "id": "tencent/hy3", + "name": "Hy3 (Tencent Cloud)", + "display_name": "Hy3 (Tencent Cloud)", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 262144, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -216463,32 +208646,30 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ "none", + "minimal", "low", "medium", "high", - "xhigh", - "max" + "xhigh" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-05-18", - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "attachment": false, + "open_weights": true, + "release_date": "2026-07-06", + "last_updated": "2026-07-06", "type": "chat" }, { - "id": "gpt-4.1", - "name": "GPT-4.1", - "display_name": "GPT-4.1", + "id": "tencent/glm-5.2", + "name": "GLM-5.2 (Tencent Cloud)", + "display_name": "GLM-5.2 (Tencent Cloud)", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" @@ -216496,36 +208677,55 @@ }, "limit": { "context": 1000000, - "output": 32768 + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-04-14", - "last_updated": "2025-04-14", + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "none", + "minimal", + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + }, + "attachment": false, + "open_weights": true, + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "qwen3-vl-235b-a22b-thinking", - "name": "Qwen3 VL 235B A22B Thinking", - "display_name": "Qwen3 VL 235B A22B Thinking", + "id": "tencent/deepseek-v4-flash", + "name": "DeepSeek V4 Flash (Tencent Cloud)", + "display_name": "DeepSeek V4 Flash (Tencent Cloud)", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 1000000, + "output": 393216 }, "temperature": true, "tool_call": true, @@ -216536,25 +208736,36 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "high", + "max" + ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "notes": [ + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2025-03-31", - "release_date": "2025-09-23", - "last_updated": "2025-09-23", + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "nemotron-3-ultra-550b", - "name": "Nemotron 3 Ultra 550B A55B", - "display_name": "Nemotron 3 Ultra 550B A55B", + "id": "tencent/minimax-m2.7", + "name": "MiniMax M2.7 (Tencent Cloud)", + "display_name": "MiniMax M2.7 (Tencent Cloud)", "modalities": { "input": [ "text" @@ -216564,7 +208775,7 @@ ] }, "limit": { - "context": 1048576, + "context": 200000, "output": 128000 }, "temperature": true, @@ -216573,31 +208784,49 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + }, "attachment": false, "open_weights": true, - "knowledge": "2025-09", - "release_date": "2026-06-04", - "last_updated": "2026-06-04", + "release_date": "2026-03-18", + "last_updated": "2026-03-18", "type": "chat" }, { - "id": "deepseek-v3.2", - "name": "DeepSeek V3.2", - "display_name": "DeepSeek V3.2", + "id": "tencent/kimi-k2.7-code-highspeed", + "name": "Kimi K2.7 Code Highspeed (Tencent Cloud)", + "display_name": "Kimi K2.7 Code Highspeed (Tencent Cloud)", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 163840, - "output": 16384 + "context": 262144, + "output": 262144 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -216605,31 +208834,48 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "minimal", + "low", + "medium", + "high", + "xhigh", + "max" + ] } }, "attachment": true, "open_weights": true, - "knowledge": "2024-07", - "release_date": "2025-12-01", - "last_updated": "2025-12-01", + "knowledge": "2025-01", + "release_date": "2026-06-12", + "last_updated": "2026-06-12", "type": "chat" }, { - "id": "glm-4.5", - "name": "GLM-4.5", - "display_name": "GLM-4.5", + "id": "tencent/glm-5v-turbo", + "name": "GLM-5V Turbo (Tencent Cloud)", + "display_name": "GLM-5V Turbo (Tencent Cloud)", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131000, - "output": 98304 + "context": 200000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -216637,44 +208883,27 @@ "supported": true, "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-07-28", - "last_updated": "2025-07-28", - "type": "chat" - }, - { - "id": "qwen3-235b-a22b-instruct-2507", - "name": "Qwen3 235B A22B Instruct (2507)", - "display_name": "Qwen3 235B A22B Instruct (2507)", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 262144, - "output": 8192 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } }, - "attachment": false, - "open_weights": true, - "release_date": "2025-07-21", - "last_updated": "2025-07-21", + "attachment": true, + "open_weights": false, + "release_date": "2026-04-01", + "last_updated": "2026-04-01", "type": "chat" }, { - "id": "qwen3.8-2.4t-a95b", - "name": "Qwen3.8 2.4T A95B", - "display_name": "Qwen3.8 2.4T A95B", + "id": "tencent/glm-5-turbo", + "name": "GLM-5 Turbo (Tencent Cloud)", + "display_name": "GLM-5 Turbo (Tencent Cloud)", "modalities": { "input": [ "text" @@ -216684,8 +208913,8 @@ ] }, "limit": { - "context": 1010000, - "output": 131072 + "context": 200000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -216697,8 +208926,6 @@ "reasoning": { "supported": true, "effort_options": [ - "none", - "minimal", "low", "medium", "high", @@ -216708,32 +208935,30 @@ } }, "attachment": false, - "open_weights": true, - "release_date": "2026-08-12", - "last_updated": "2026-08-12", + "open_weights": false, + "release_date": "2026-03-16", + "last_updated": "2026-03-16", "type": "chat" }, { - "id": "gemini-3.1-flash-lite", - "name": "Gemini 3.1 Flash Lite", - "display_name": "Gemini 3.1 Flash Lite", + "id": "tencent/kimi-k2.7-code", + "name": "Kimi K2.7 Code (Tencent Cloud)", + "display_name": "Kimi K2.7 Code (Tencent Cloud)", "modalities": { "input": [ "text", "image", - "video", - "audio", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 262144, + "output": 262144 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -216742,37 +208967,44 @@ "extra_capabilities": { "reasoning": { "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ "minimal", "low", "medium", - "high" + "high", + "xhigh", + "max" ] } }, "attachment": true, - "open_weights": false, + "open_weights": true, "knowledge": "2025-01", - "release_date": "2026-05-07", - "last_updated": "2026-05-07", + "release_date": "2026-06-12", + "last_updated": "2026-06-12", "type": "chat" }, { - "id": "gemma-4-26b-a4b-it", - "name": "Gemma 4 26B A4B IT", - "display_name": "Gemma 4 26B A4B IT", + "id": "tencent/hy4-preview", + "name": "Hy4 Preview (Tencent Cloud)", + "display_name": "Hy4 Preview (Tencent Cloud)", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 1000000, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -216782,19 +209014,28 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "effort_options": [ + "none", + "minimal", + "low", + "medium", + "high", + "xhigh", + "max" + ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "release_date": "2026-08-28", + "last_updated": "2026-08-28", "type": "chat" }, { - "id": "qwen3.5-122b-a10b", - "name": "Qwen3.5 122B-A10B", - "display_name": "Qwen3.5 122B-A10B", + "id": "tencent/kimi-k2.6", + "name": "Kimi K2.6 (Tencent Cloud)", + "display_name": "Kimi K2.6 (Tencent Cloud)", "modalities": { "input": [ "text", @@ -216807,7 +209048,7 @@ }, "limit": { "context": 262144, - "output": 65536 + "output": 262144 }, "temperature": true, "tool_call": true, @@ -216837,54 +209078,28 @@ }, "attachment": true, "open_weights": true, - "release_date": "2026-02-23", - "last_updated": "2026-02-23", - "type": "chat" - }, - { - "id": "ministral-8b-2512", - "name": "Ministral 8B", - "display_name": "Ministral 8B", - "modalities": { - "input": [ - "text", - "image" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 262144, - "output": 8192 - }, - "temperature": true, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": true, - "release_date": "2025-12-02", - "last_updated": "2025-12-02", + "knowledge": "2025-01", + "release_date": "2026-04-20", + "last_updated": "2026-04-20", "type": "chat" }, { - "id": "seed-2-0-code-preview-260328", - "name": "Seed 2.0 Code Preview (260328)", - "display_name": "Seed 2.0 Code Preview (260328)", + "id": "tencent/minimax-m3", + "name": "MiniMax M3 (Tencent Cloud)", + "display_name": "MiniMax M3 (Tencent Cloud)", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -216894,24 +209109,26 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ - "minimal", "low", "medium", - "high" + "high", + "xhigh", + "max" ] } }, "attachment": true, - "open_weights": false, - "release_date": "2026-03-28", - "last_updated": "2026-03-28", + "open_weights": true, + "release_date": "2026-06-01", + "last_updated": "2026-06-01", "type": "chat" }, { - "id": "glm-4.5-x", - "name": "GLM-4.5 X", - "display_name": "GLM-4.5 X", + "id": "tencent/hy-mt2-plus", + "name": "Hy-MT2 Plus (Tencent Cloud)", + "display_name": "Hy-MT2 Plus (Tencent Cloud)", "modalities": { "input": [ "text" @@ -216921,39 +209138,35 @@ ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 8192, + "output": 4096 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, "open_weights": false, - "release_date": "2025-07-28", - "last_updated": "2025-07-28", + "release_date": "2026-05-21", + "last_updated": "2026-05-21", "type": "chat" }, { - "id": "mimo-v2.6-flash", - "name": "MiMo-V2.6-Flash", - "display_name": "MiMo-V2.6-Flash", + "id": "tencent/deepseek-v4-pro", + "name": "DeepSeek V4 Pro (Tencent Cloud)", + "display_name": "DeepSeek V4 Pro (Tencent Cloud)", "modalities": { "input": [ - "text", - "image", - "audio", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 1000000, + "output": 393216 }, "temperature": true, "tool_call": true, @@ -216963,39 +209176,48 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", "effort_options": [ - "none", - "minimal", "low", - "medium", "high", - "xhigh", "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "glm-4.6v-flashx", - "name": "GLM-4.6V FlashX", - "display_name": "GLM-4.6V FlashX", + "id": "tencent/glm-5", + "name": "GLM-5 (Tencent Cloud)", + "display_name": "GLM-5 (Tencent Cloud)", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16000 + "context": 200000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -217003,82 +209225,93 @@ "supported": true, "default": true }, - "attachment": true, - "open_weights": false, - "release_date": "2025-12-08", - "last_updated": "2025-12-08", + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "none", + "minimal", + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + }, + "attachment": false, + "open_weights": true, + "release_date": "2026-02-12", + "last_updated": "2026-02-12", "type": "chat" }, { - "id": "gpt-5.1-codex-mini", - "name": "GPT-5.1 Codex mini", - "display_name": "GPT-5.1 Codex mini", + "id": "tencent/kimi-k3", + "name": "Kimi K3 (Tencent Cloud)", + "display_name": "Kimi K3 (Tencent Cloud)", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 1048576, + "output": 1048576 }, "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", "effort_options": [ "none", + "minimal", "low", "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "high", + "xhigh", + "max" + ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-11-13", - "last_updated": "2025-11-13", + "open_weights": true, + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" }, { - "id": "kimi-k3-fast", - "name": "Kimi K3", - "display_name": "Kimi K3", + "id": "tencent/glm-5.1", + "name": "GLM-5.1 (Tencent Cloud)", + "display_name": "GLM-5.1 (Tencent Cloud)", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1040384, - "output": 131072 + "context": 200000, + "output": 128000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -217086,8 +209319,14 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ - "none", "low", "medium", "high", @@ -217096,20 +209335,22 @@ ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-16", + "release_date": "2026-04-07", + "last_updated": "2026-04-07", "type": "chat" }, { - "id": "claude-opus-4-8", - "name": "Claude Opus 4.8", - "display_name": "Claude Opus 4.8", + "id": "google-ai-studio/gemini-3.1-pro-preview", + "name": "Gemini 3.1 Pro (Preview) (Google AI Studio)", + "display_name": "Gemini 3.1 Pro (Preview) (Google AI Studio)", "modalities": { "input": [ "text", "image", + "video", + "audio", "pdf" ], "output": [ @@ -217117,59 +209358,50 @@ ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 1048576, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "high", - "effort_options": [ + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ "low", - "medium", - "high", - "xhigh", - "max" + "high" ], - "interleaved": true, "summaries": true, - "visibility": "omitted", + "visibility": "summary", "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." + "thought_signatures" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-01", - "release_date": "2026-05-28", - "last_updated": "2026-05-28", + "knowledge": "2025-01", + "release_date": "2026-02-19", + "last_updated": "2026-02-19", "type": "chat" }, { - "id": "muse-spark-1.2", - "name": "Muse Spark 1.2", - "display_name": "Muse Spark 1.2", + "id": "google-ai-studio/gemini-3-flash-preview", + "name": "Gemini 3 Flash (Preview) (Google AI Studio)", + "display_name": "Gemini 3 Flash (Preview) (Google AI Studio)", "modalities": { "input": [ "text", "image", "video", - "pdf", - "audio" + "audio", + "pdf" ], "output": [ "text" @@ -217177,7 +209409,7 @@ }, "limit": { "context": 1048576, - "output": 131072 + "output": 65535 }, "temperature": true, "tool_call": true, @@ -217188,36 +209420,48 @@ "extra_capabilities": { "reasoning": { "supported": true, - "effort_options": [ + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ "minimal", "low", "medium", - "high", - "xhigh" + "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-08-05", - "last_updated": "2026-08-05", + "knowledge": "2025-01", + "release_date": "2025-12-17", + "last_updated": "2025-12-17", "type": "chat" }, { - "id": "glm-4.7-flash", - "name": "GLM-4.7-Flash", - "display_name": "GLM-4.7-Flash", + "id": "google-ai-studio/gemini-3.5-flash-lite", + "name": "Gemini 3.5 Flash Lite (Google AI Studio)", + "display_name": "Gemini 3.5 Flash Lite (Google AI Studio)", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 131072 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -217227,62 +209471,80 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "effort_options": [ + "minimal", + "low", + "medium", + "high" + ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2026-01-19", - "last_updated": "2026-01-19", + "attachment": true, + "open_weights": false, + "knowledge": "2026-03", + "release_date": "2026-07-21", + "last_updated": "2026-07-21", "type": "chat" }, { - "id": "mistral-large-latest", - "name": "Mistral Large (latest)", - "display_name": "Mistral Large (latest)", + "id": "google-ai-studio/gemini-pro-latest", + "name": "Gemini Pro Latest (Google AI Studio)", + "display_name": "Gemini Pro Latest (Google AI Studio)", "modalities": { "input": [ "text", - "image" + "image", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 262144 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "high" + ] + } }, "attachment": true, - "open_weights": true, - "knowledge": "2024-11", - "release_date": "2024-11-01", - "last_updated": "2025-12-02", + "open_weights": false, + "release_date": "2026-02-27", + "last_updated": "2026-02-27", "type": "chat" }, { - "id": "qwen3.8-flash", - "name": "Qwen3.8 Flash", - "display_name": "Qwen3.8 Flash", + "id": "google-ai-studio/gemini-3.1-flash-lite", + "name": "Gemini 3.1 Flash Lite (Google AI Studio)", + "display_name": "Gemini 3.1 Flash Lite (Google AI Studio)", "modalities": { "input": [ "text", "image", - "video" + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -217294,41 +209556,41 @@ "reasoning": { "supported": true, "effort_options": [ - "none", "minimal", "low", "medium", - "high", - "xhigh", - "max" + "high" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", + "knowledge": "2025-01", + "release_date": "2026-05-07", + "last_updated": "2026-05-07", "type": "chat" }, { - "id": "step-3.7-flash", - "name": "Step 3.7 Flash", - "display_name": "Step 3.7 Flash", + "id": "google-ai-studio/gemini-4-argon", + "name": "Gemini 4 Argon (Google AI Studio)", + "display_name": "Gemini 4 Argon (Google AI Studio)", "modalities": { "input": [ "text", "image", - "video" + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 256000 + "context": 1048576, + "output": 1048576 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -217337,67 +209599,87 @@ "extra_capabilities": { "reasoning": { "effort_options": [ - "minimal", - "low", - "medium", - "high", - "xhigh", - "max" + "high" ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2026-03-01", - "release_date": "2026-05-29", - "last_updated": "2026-05-29", + "open_weights": false, + "knowledge": "2026-03", + "release_date": "2026-10-13", + "last_updated": "2026-10-13", "type": "chat" }, { - "id": "ernie-4.5-vl-424b-a47b", - "name": "ERNIE 4.5 VL 424B A47B", - "display_name": "ERNIE 4.5 VL 424B A47B", + "id": "google-ai-studio/gemini-3.8-flash", + "name": "Gemini 3.8 Flash (Google AI Studio)", + "display_name": "Gemini 3.8 Flash (Google AI Studio)", "modalities": { "input": [ "text", - "image" + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 123000, - "output": 123000 + "context": 1048576, + "output": 65536 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", + "low", + "medium", + "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] + } + }, "attachment": true, "open_weights": false, - "release_date": "2025-06-30", - "last_updated": "2025-06-30", + "release_date": "2026-09-02", + "last_updated": "2026-09-02", "type": "chat" }, { - "id": "seed-2-0-lite-260428", - "name": "Seed 2.0 Lite (260428)", - "display_name": "Seed 2.0 Lite (260428)", + "id": "google-ai-studio/gemini-3.6-flash", + "name": "Gemini 3.6 Flash (Google AI Studio)", + "display_name": "Gemini 3.6 Flash (Google AI Studio)", "modalities": { "input": [ "text", - "image" + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -217407,110 +209689,106 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ "minimal", "low", "medium", "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-04-28", - "last_updated": "2026-04-28", + "knowledge": "2026-03", + "release_date": "2026-07-21", + "last_updated": "2026-07-21", "type": "chat" }, { - "id": "gpt-5.1-codex", - "name": "GPT-5.1 Codex", - "display_name": "GPT-5.1 Codex", + "id": "perplexity/sonar", + "name": "Sonar (Perplexity)", + "display_name": "Sonar (Perplexity)", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 130000, + "output": 4096 }, - "temperature": false, - "tool_call": true, + "temperature": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-11-13", - "last_updated": "2025-11-13", + "knowledge": "2025-09-01", + "release_date": "2024-01-01", + "last_updated": "2025-09-01", "type": "chat" }, { - "id": "grok-4-20-beta-0309-non-reasoning", - "name": "Grok 4.20 (Non-Reasoning)", - "display_name": "Grok 4.20 (Non-Reasoning)", + "id": "meta-contributor/muse-spark-1.2-contributor", + "name": "Muse Spark 1.2 Contributor (Meta Contributor)", + "display_name": "Muse Spark 1.2 Contributor (Meta Contributor)", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 2000000, - "output": 30000 + "context": 1048576, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] + } }, "attachment": true, "open_weights": false, - "release_date": "2026-03-09", - "last_updated": "2026-03-09", + "release_date": "2026-08-06", + "last_updated": "2026-08-06", "type": "chat" }, { - "id": "muse-spark-1.1", - "name": "Muse Spark 1.1", - "display_name": "Muse Spark 1.1", + "id": "meta-contributor/muse-spark-1.3-contributor", + "name": "Muse Spark 1.3 Contributor (Meta Contributor)", + "display_name": "Muse Spark 1.3 Contributor (Meta Contributor)", "modalities": { "input": [ "text", - "image", - "pdf", - "video" + "image" ], "output": [ "text" @@ -217518,7 +209796,7 @@ }, "limit": { "context": 1048576, - "output": 131072 + "output": 1048576 }, "temperature": true, "tool_call": true, @@ -217528,7 +209806,6 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ "minimal", "low", @@ -217540,81 +209817,75 @@ }, "attachment": true, "open_weights": false, - "release_date": "2026-04-08", - "last_updated": "2026-07-09", + "release_date": "2026-09-02", + "last_updated": "2026-09-02", "type": "chat" }, { - "id": "claude-sonnet-4-5-20250929", - "name": "Claude Sonnet 4.5", - "display_name": "Claude Sonnet 4.5", + "id": "bytedance/glm-5.2", + "name": "GLM-5.2 (ByteDance)", + "display_name": "GLM-5.2 (ByteDance)", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 1024000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + "effort_options": [ + "none", + "minimal", + "low", + "medium", + "high", + "xhigh", + "max" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-07-31", - "release_date": "2025-09-29", - "last_updated": "2025-09-29", + "attachment": false, + "open_weights": true, + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "claude-fable-5", - "name": "Claude Fable 5", - "display_name": "Claude Fable 5", + "id": "bytedance/deepseek-v4-flash", + "name": "DeepSeek V4 Flash (ByteDance)", + "display_name": "DeepSeek V4 Flash (ByteDance)", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 1048576, + "output": 393216 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -217628,35 +209899,31 @@ "effort": "high", "effort_options": [ "low", - "medium", "high", - "xhigh", "max" ], "interleaved": true, "summaries": true, - "visibility": "omitted", + "visibility": "summary", "continuation": [ "thinking_blocks" ], "notes": [ - "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", - "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", - "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-09", - "last_updated": "2026-06-09", + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "qwen-plus-latest", - "name": "Qwen Plus Latest", - "display_name": "Qwen Plus Latest", + "id": "bytedance/seed-1-6-250915", + "name": "Seed 1.6 (250915) (ByteDance)", + "display_name": "Seed 1.6 (250915) (ByteDance)", "modalities": { "input": [ "text", @@ -217667,35 +209934,35 @@ ] }, "limit": { - "context": 1000000, - "output": 8192 + "context": 256000, + "output": 256000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "minimal", + "low", + "medium", + "high" ] } }, "attachment": true, "open_weights": false, - "release_date": "2025-01-25", - "last_updated": "2025-01-25", + "release_date": "2025-09-15", + "last_updated": "2025-09-15", "type": "chat" }, { - "id": "muse-glimmer-30b", - "name": "Muse Glimmer 30B", - "display_name": "Muse Glimmer 30B", + "id": "bytedance/seed-2-0-lite-260428", + "name": "Seed 2.0 Lite (260428) (ByteDance)", + "display_name": "Seed 2.0 Lite (260428) (ByteDance)", "modalities": { "input": [ "text", @@ -217706,7 +209973,7 @@ ] }, "limit": { - "context": 131072, + "context": 262144, "output": 131072 }, "temperature": true, @@ -217721,23 +209988,20 @@ "minimal", "low", "medium", - "high", - "xhigh", - "max" + "high" ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2026-01-04", - "release_date": "2026-08-10", - "last_updated": "2026-08-10", + "open_weights": false, + "release_date": "2026-04-28", + "last_updated": "2026-04-28", "type": "chat" }, { - "id": "gpt-5.4-pro", - "name": "GPT-5.4 Pro", - "display_name": "GPT-5.4 Pro", + "id": "bytedance/seed-2-0-code-preview-260328", + "name": "Seed 2.0 Code Preview (260328) (ByteDance)", + "display_name": "Seed 2.0 Code Preview (260328) (ByteDance)", "modalities": { "input": [ "text", @@ -217748,10 +210012,10 @@ ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 262144, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -217759,35 +210023,24 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", "effort_options": [ - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ + "minimal", "low", "medium", "high" - ], - "visibility": "hidden" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-05", - "last_updated": "2026-03-05", + "release_date": "2026-03-28", + "last_updated": "2026-03-28", "type": "chat" }, { - "id": "qwen3-30b-a3b", - "name": "Qwen3 30B A3B", - "display_name": "Qwen3 30B A3B", + "id": "bytedance/gpt-oss-120b", + "name": "GPT OSS 120B (ByteDance)", + "display_name": "GPT OSS 120B (ByteDance)", "modalities": { "input": [ "text" @@ -217797,8 +210050,8 @@ ] }, "limit": { - "context": 32768, - "output": 16384 + "context": 128000, + "output": 32000 }, "temperature": true, "tool_call": true, @@ -217809,48 +210062,38 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "low", + "medium", + "high" ] } }, "attachment": false, "open_weights": true, - "release_date": "2025-04-28", - "last_updated": "2025-04-28", + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" - } - ] - }, - "vivgrid": { - "id": "vivgrid", - "name": "Vivgrid", - "display_name": "Vivgrid", - "api": "https://api.vivgrid.com/v1", - "doc": "https://docs.vivgrid.com/models", - "models": [ + }, { - "id": "claude-haiku-5-5", - "name": "Claude Haiku 5.5", - "display_name": "Claude Haiku 5.5", + "id": "bytedance/seed-2-0-pro-260328", + "name": "Seed 2.0 Pro (260328) (ByteDance)", + "display_name": "Seed 2.0 Pro (260328) (ByteDance)", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 262144, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -217859,91 +210102,74 @@ "extra_capabilities": { "reasoning": { "effort_options": [ + "minimal", "low", "medium", - "high", - "xhigh", - "max" + "high" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-10-07", - "last_updated": "2026-10-07", + "release_date": "2026-03-28", + "last_updated": "2026-03-28", "type": "chat" }, { - "id": "gpt-5.4-mini", - "name": "GPT-5.4 Mini", - "display_name": "GPT-5.4 Mini", + "id": "bytedance/seed-1-6-250615", + "name": "Seed 1.6 (250615) (ByteDance)", + "display_name": "Seed 1.6 (250615) (ByteDance)", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 256000, + "output": 256000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ + "minimal", "low", "medium", "high" - ], - "visibility": "hidden" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-17", - "last_updated": "2026-03-17", + "release_date": "2025-06-25", + "last_updated": "2025-06-25", "type": "chat" }, { - "id": "gpt-5.6-sol", - "name": "GPT 5.6 Sol", - "display_name": "GPT 5.6 Sol", + "id": "bytedance/seed-1-8-251228", + "name": "Seed 1.8 (251228) (ByteDance)", + "display_name": "Seed 1.8 (251228) (ByteDance)", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 256000, + "output": 256000 }, "temperature": true, "tool_call": true, @@ -217953,38 +210179,24 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ], - "verbosity": "medium", - "verbosity_options": [ + "minimal", "low", "medium", "high" - ], - "visibility": "hidden" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "release_date": "2025-12-18", + "last_updated": "2025-12-18", "type": "chat" }, { - "id": "deepseek-v4-flash", - "name": "DeepSeek V4 Flash", - "display_name": "DeepSeek V4 Flash", + "id": "bytedance/deepseek-v4-pro", + "name": "DeepSeek V4 Pro (ByteDance)", + "display_name": "DeepSeek V4 Pro (ByteDance)", "modalities": { "input": [ "text" @@ -217994,8 +210206,8 @@ ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 1048576, + "output": 393216 }, "temperature": true, "tool_call": true, @@ -218028,14 +210240,48 @@ "attachment": false, "open_weights": true, "knowledge": "2025-05", - "release_date": "2026-07-31", - "last_updated": "2026-07-31", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "gpt-5.2-codex", - "name": "GPT-5.2 Codex", - "display_name": "GPT-5.2 Codex", + "id": "bytedance/deepseek-v3.2", + "name": "DeepSeek V3.2 (ByteDance)", + "display_name": "DeepSeek V3.2 (ByteDance)", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 131072, + "output": 32768 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": false, + "open_weights": true, + "knowledge": "2024-07", + "release_date": "2025-12-01", + "last_updated": "2025-12-01", + "type": "chat" + }, + { + "id": "bytedance/seed-2-0-mini-260428", + "name": "Seed 2.0 Mini (260428) (ByteDance)", + "display_name": "Seed 2.0 Mini (260428) (ByteDance)", "modalities": { "input": [ "text", @@ -218046,10 +210292,10 @@ ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 262144, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -218057,104 +210303,78 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ + "minimal", "low", "medium", "high" - ], - "visibility": "hidden" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2025-12-11", - "last_updated": "2025-12-11", + "release_date": "2026-04-28", + "last_updated": "2026-04-28", "type": "chat" }, { - "id": "gpt-5.4-nano", - "name": "GPT-5.4 Nano", - "display_name": "GPT-5.4 Nano", + "id": "bytedance/glm-4.7", + "name": "GLM-4.7 (ByteDance)", + "display_name": "GLM-4.7 (ByteDance)", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, + "context": 200000, "output": 128000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-17", - "last_updated": "2026-03-17", + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-12-22", + "last_updated": "2025-12-22", "type": "chat" }, { - "id": "claude-sonnet-5-5", - "name": "Claude Sonnet 5.5", - "display_name": "Claude Sonnet 5.5", + "id": "bytedance/seed-1-6-flash-250715", + "name": "Seed 1.6 Flash (250715) (ByteDance)", + "display_name": "Seed 1.6 Flash (250715) (ByteDance)", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 256000, + "output": 256000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -218163,38 +210383,35 @@ "extra_capabilities": { "reasoning": { "effort_options": [ + "minimal", "low", "medium", - "high", - "xhigh", - "max" + "high" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-09-28", - "last_updated": "2026-09-28", + "release_date": "2025-07-26", + "last_updated": "2025-07-26", "type": "chat" }, { - "id": "gpt-5.6-luna", - "name": "GPT 5.6 Luna", - "display_name": "GPT 5.6 Luna", + "id": "luminal/deepseek-v4.1-flash", + "name": "DeepSeek V4.1 Flash (luminal)", + "display_name": "DeepSeek V4.1 Flash (luminal)", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1000000, + "output": 384000 }, "temperature": true, "tool_call": true, @@ -218205,48 +210422,41 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", "effort_options": [ "none", + "minimal", "low", "medium", "high", "xhigh", "max" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-09-10", + "last_updated": "2026-09-10", "type": "chat" }, { - "id": "deepseek-v4-pro", - "name": "DeepSeek V4 Pro", - "display_name": "DeepSeek V4 Pro", + "id": "alibaba/qwen3.6-plus", + "name": "Qwen3.6 Plus (Alibaba Cloud)", + "display_name": "Qwen3.6 Plus (Alibaba Cloud)", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 983616, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -218257,92 +210467,85 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "high", - "max" - ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" ], - "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." + "effort_options": [ + "none", + "minimal", + "low", + "medium", + "high", + "xhigh", + "max" ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "attachment": true, + "open_weights": false, + "knowledge": "2025-04", + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "gpt-5.1-codex-max", - "name": "GPT-5.1 Codex Max", - "display_name": "GPT-5.1 Codex Max", + "id": "alibaba/glm-5.2", + "name": "GLM-5.2 (Alibaba Cloud)", + "display_name": "GLM-5.2 (Alibaba Cloud)", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 1000000, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ "none", + "minimal", "low", "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "high", + "xhigh", + "max" + ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-11-13", - "last_updated": "2025-11-13", + "attachment": false, + "open_weights": true, + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "claude-fable-5-1", - "name": "Claude Fable 5.1", - "display_name": "Claude Fable 5.1", + "id": "alibaba/deepseek-v4-flash", + "name": "DeepSeek V4 Flash (Alibaba Cloud)", + "display_name": "DeepSeek V4 Flash (Alibaba Cloud)", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" @@ -218350,9 +210553,9 @@ }, "limit": { "context": 1000000, - "output": 128000 + "output": 393216 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -218366,40 +210569,35 @@ "effort": "high", "effort_options": [ "low", - "medium", "high", - "xhigh", "max" ], "interleaved": true, "summaries": true, - "visibility": "omitted", + "visibility": "summary", "continuation": [ "thinking_blocks" ], "notes": [ - "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", - "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", - "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-09-01", - "last_updated": "2026-09-01", + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "claude-sonnet-5", - "name": "Claude Sonnet 5", - "display_name": "Claude Sonnet 5", + "id": "alibaba/deepseek-v4.1-flash", + "name": "DeepSeek V4.1 Flash (Alibaba Cloud)", + "display_name": "DeepSeek V4.1 Flash (Alibaba Cloud)", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" @@ -218407,9 +210605,9 @@ }, "limit": { "context": 1000000, - "output": 128000 + "output": 393216 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -218419,6 +210617,8 @@ "reasoning": { "supported": true, "effort_options": [ + "none", + "minimal", "low", "medium", "high", @@ -218428,16 +210628,16 @@ } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-30", - "last_updated": "2026-06-30", + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-09-10", + "last_updated": "2026-09-10", "type": "chat" }, { - "id": "deepseek-v4-pro-0813", - "name": "DeepSeek V4 Pro 0813", - "display_name": "DeepSeek V4 Pro 0813", + "id": "alibaba/qwen-plus-latest", + "name": "Qwen Plus Latest (Alibaba Cloud)", + "display_name": "Qwen Plus Latest (Alibaba Cloud)", "modalities": { "input": [ "text" @@ -218448,13 +210648,12 @@ }, "limit": { "context": 1000000, - "output": 384000 + "output": 32000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": true }, "extra_capabilities": { "reasoning": { @@ -218464,36 +210663,32 @@ "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "effort_options": [ - "high", - "max" ] } }, "attachment": false, - "open_weights": true, - "release_date": "2026-08-13", - "last_updated": "2026-08-22", + "open_weights": false, + "release_date": "2024-09-09", + "last_updated": "2024-09-09", "type": "chat" }, { - "id": "gpt-5.6-terra", - "name": "GPT 5.6 Terra", - "display_name": "GPT 5.6 Terra", + "id": "alibaba/qwen3.5-35b-a3b", + "name": "Qwen3.5 35B A3B (Alibaba Cloud)", + "display_name": "Qwen3.5 35B A3B (Alibaba Cloud)", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 262144, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -218504,52 +210699,46 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ "none", + "minimal", "low", "medium", "high", "xhigh", "max" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "open_weights": true, + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" }, { - "id": "claude-opus-5-5", - "name": "Claude Opus 5.5", - "display_name": "Claude Opus 5.5", + "id": "alibaba/glm-5.3", + "name": "GLM-5.3 (Alibaba Cloud)", + "display_name": "GLM-5.3 (Alibaba Cloud)", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 1048576, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -218557,41 +210746,37 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ "low", - "medium", "high", - "xhigh", "max" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "attachment": false, + "open_weights": true, + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "gpt-6-sol", - "name": "GPT-6 Sol", - "display_name": "GPT-6 Sol", + "id": "alibaba/qwen3.7-max", + "name": "Qwen3.7 Max (Alibaba Cloud)", + "display_name": "Qwen3.7 Max (Alibaba Cloud)", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 983616, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -218599,8 +210784,10 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ "none", + "minimal", "low", "medium", "high", @@ -218609,31 +210796,31 @@ ] } }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2026-04-20", - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "release_date": "2026-05-21", + "last_updated": "2026-05-21", "type": "chat" }, { - "id": "gpt-5.3-codex", - "name": "GPT-5.3 Codex", - "display_name": "GPT-5.3 Codex", + "id": "alibaba/qwen3.7-flash", + "name": "Qwen3.7 Flash (Alibaba Cloud)", + "display_name": "Qwen3.7 Flash (Alibaba Cloud)", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 983616, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -218642,35 +210829,27 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", "effort_options": [ + "none", + "minimal", "low", "medium", "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "xhigh", + "max" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-05", - "last_updated": "2026-02-05", + "release_date": "2026-07-15", + "last_updated": "2026-07-15", "type": "chat" }, { - "id": "glm-5.3", - "name": "GLM-5.3", - "display_name": "GLM-5.3", + "id": "alibaba/qwen-plus", + "name": "Qwen Plus (Alibaba Cloud)", + "display_name": "Qwen Plus (Alibaba Cloud)", "modalities": { "input": [ "text" @@ -218680,14 +210859,13 @@ ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 131072, + "output": 32000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": true }, "extra_capabilities": { "reasoning": { @@ -218697,72 +210875,64 @@ "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "effort_options": [ - "low", - "high", - "max" ] } }, "attachment": false, - "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "open_weights": false, + "knowledge": "2024-04", + "release_date": "2024-01-25", + "last_updated": "2025-09-11", "type": "chat" }, { - "id": "gpt-6.1-sol", - "name": "GPT-6.1 Sol", - "display_name": "GPT-6.1 Sol", + "id": "alibaba/qwen-flash", + "name": "Qwen Flash (Alibaba Cloud)", + "display_name": "Qwen Flash (Alibaba Cloud)", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1000000, + "output": 32000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": true }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2026-04-30", - "release_date": "2026-09-29", - "last_updated": "2026-09-29", + "knowledge": "2024-04", + "release_date": "2025-07-28", + "last_updated": "2025-07-28", "type": "chat" }, { - "id": "gemini-3.1-pro-preview", - "name": "Gemini 3.1 Pro Preview", - "display_name": "Gemini 3.1 Pro Preview", + "id": "alibaba/qwen3.8-max", + "name": "Qwen3.8 Max (Alibaba Cloud)", + "display_name": "Qwen3.8 Max (Alibaba Cloud)", "modalities": { "input": [ "text", "image", "video", - "audio", "pdf" ], "output": [ @@ -218770,8 +210940,8 @@ ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 983616, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -218782,99 +210952,64 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ + "effort_options": [ "low", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" + "medium", + "xhigh" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-02-19", - "last_updated": "2026-02-19", + "release_date": "2026-08-03", + "last_updated": "2026-08-03", "type": "chat" }, { - "id": "gpt-5.4", - "name": "GPT-5.4", - "display_name": "GPT-5.4", + "id": "alibaba/qwen-max", + "name": "Qwen Max (Alibaba Cloud)", + "display_name": "Qwen Max (Alibaba Cloud)", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 32768, + "output": 8192 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-05", - "last_updated": "2026-03-05", + "knowledge": "2024-04", + "release_date": "2024-04-03", + "last_updated": "2025-01-25", "type": "chat" }, { - "id": "gemini-3.8-flash", - "name": "Gemini 3.8 Flash", - "display_name": "Gemini 3.8 Flash", + "id": "alibaba/qwen3.6-flash", + "name": "Qwen3.6 Flash (Alibaba Cloud)", + "display_name": "Qwen3.6 Flash (Alibaba Cloud)", "modalities": { "input": [ "text", "image", - "video", - "audio", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 128000 + "context": 983616, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -218885,47 +211020,48 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", - "low", - "medium", - "high" - ], + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" + ], + "effort_options": [ + "none", + "minimal", + "low", + "medium", + "high", + "xhigh", + "max" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-09-02", - "last_updated": "2026-09-02", + "release_date": "2026-04-27", + "last_updated": "2026-04-27", "type": "chat" }, { - "id": "kimi-k3", - "name": "Kimi K3", - "display_name": "Kimi K3", + "id": "alibaba/qwen3.6-35b-a3b", + "name": "Qwen3.6 35B A3B (Alibaba Cloud)", + "display_name": "Qwen3.6 35B A3B (Alibaba Cloud)", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 262144, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -218933,34 +211069,50 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "none", + "minimal", + "low", + "medium", + "high", + "xhigh", + "max" + ] } }, "attachment": true, "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-16", + "release_date": "2026-04-17", + "last_updated": "2026-04-17", "type": "chat" }, { - "id": "claude-opus-5", - "name": "Claude Opus 5", - "display_name": "Claude Opus 5", + "id": "alibaba/qwen3.8-omni-flash", + "name": "Qwen3.8 Omni Flash (Alibaba Cloud)", + "display_name": "Qwen3.8 Omni Flash (Alibaba Cloud)", "modalities": { "input": [ "text", "image", - "pdf" + "audio", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 983616, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -218968,8 +211120,9 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ + "none", + "minimal", "low", "medium", "high", @@ -218980,30 +211133,55 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2026-05", - "release_date": "2026-07-24", - "last_updated": "2026-07-24", + "release_date": "2026-09-17", + "last_updated": "2026-09-17", "type": "chat" }, { - "id": "gpt-6-astra", - "name": "GPT-6 Astra", - "display_name": "GPT-6 Astra", + "id": "alibaba/qwen3-coder-flash", + "name": "Qwen3 Coder Flash (Alibaba Cloud)", + "display_name": "Qwen3 Coder Flash (Alibaba Cloud)", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 997952, + "output": 65536 }, - "temperature": false, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": false, + "knowledge": "2025-04", + "release_date": "2025-07-28", + "last_updated": "2025-07-28", + "type": "chat" + }, + { + "id": "alibaba/deepseek-v4-pro", + "name": "DeepSeek V4 Pro (Alibaba Cloud)", + "display_name": "DeepSeek V4 Pro (Alibaba Cloud)", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1000000, + "output": 393216 + }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -219012,41 +211190,48 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", "effort_options": [ "low", - "medium", "high", - "xhigh", "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-04-30", - "release_date": "2026-09-04", - "last_updated": "2026-09-04", + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "gemini-3.7-flash", - "name": "Gemini 3.7 Flash", - "display_name": "Gemini 3.7 Flash", + "id": "alibaba/deepseek-v4.1-flash-1017", + "name": "DeepSeek V4.1 Flash 1017 (Alibaba Cloud)", + "display_name": "DeepSeek V4.1 Flash 1017 (Alibaba Cloud)", "modalities": { "input": [ "text", - "image", - "video", - "audio", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 1000000, + "output": 393216 }, "temperature": true, "tool_call": true, @@ -219056,49 +211241,43 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ + "effort_options": [ + "none", "minimal", "low", "medium", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" + "high", + "xhigh", + "max" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-08-13", - "last_updated": "2026-08-13", + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-10-17", + "last_updated": "2026-10-17", "type": "chat" }, { - "id": "gpt-5.5", - "name": "GPT-5.5", - "display_name": "GPT-5.5", + "id": "alibaba/qwen3.5-27b", + "name": "Qwen3.5 27B (Alibaba Cloud)", + "display_name": "Qwen3.5 27B (Alibaba Cloud)", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 262144, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -219107,46 +211286,46 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ + "none", + "minimal", "low", "medium", "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "xhigh", + "max" + ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-12-01", - "release_date": "2026-04-23", - "last_updated": "2026-04-23", + "open_weights": true, + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" }, { - "id": "glm-5.2", - "name": "GLM-5.2", - "display_name": "GLM-5.2", + "id": "alibaba/qwen3.5-122b-a10b", + "name": "Qwen3.5 122B A10B (Alibaba Cloud)", + "display_name": "Qwen3.5 122B A10B (Alibaba Cloud)", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 262144, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -219164,33 +211343,37 @@ "thinking_blocks" ], "effort_options": [ + "none", + "minimal", + "low", + "medium", "high", + "xhigh", "max" ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" }, { - "id": "deepseek-v4.1-flash", - "name": "DeepSeek V4.1 Flash", - "display_name": "DeepSeek V4.1 Flash", + "id": "alibaba/glm-5", + "name": "GLM-5 (Alibaba Cloud)", + "display_name": "GLM-5 (Alibaba Cloud)", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 202752, + "output": 16384 }, "temperature": true, "tool_call": true, @@ -219208,37 +211391,40 @@ "thinking_blocks" ], "effort_options": [ + "none", + "minimal", "low", + "medium", "high", - "max" + "xhigh" ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-09-10", - "last_updated": "2026-09-10", + "release_date": "2026-02-12", + "last_updated": "2026-02-12", "type": "chat" }, { - "id": "gpt-5-mini", - "name": "GPT-5 Mini", - "display_name": "GPT-5 Mini", + "id": "alibaba/qwen3.7-plus", + "name": "Qwen3.7 Plus (Alibaba Cloud)", + "display_name": "Qwen3.7 Plus (Alibaba Cloud)", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 272000, - "output": 128000 + "context": 983616, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -219247,51 +211433,43 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", "effort_options": [ + "none", "minimal", "low", "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "high", + "xhigh", + "max" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2024-05-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "knowledge": "2025-04", + "release_date": "2026-06-02", + "last_updated": "2026-06-02", "type": "chat" }, { - "id": "glm-5.3-flash", - "name": "GLM-5.3-Flash", - "display_name": "GLM-5.3-Flash", + "id": "alibaba/kimi-k3", + "name": "Kimi K3 (Alibaba Cloud)", + "display_name": "Kimi K3 (Alibaba Cloud)", "modalities": { "input": [ "text", "image", - "video", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 1048576, + "output": 1048576 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -219300,44 +211478,42 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ + "none", + "minimal", "low", + "medium", "high", + "xhigh", "max" ] } }, "attachment": true, "open_weights": true, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" }, { - "id": "gpt-6-luna", - "name": "GPT-6 Luna", - "display_name": "GPT-6 Luna", + "id": "alibaba/qwen35-397b-a17b", + "name": "Qwen3.5 397B A17B (Alibaba Cloud)", + "display_name": "Qwen3.5 397B A17B (Alibaba Cloud)", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 262144, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -219347,6 +211523,7 @@ "reasoning": { "effort_options": [ "none", + "minimal", "low", "medium", "high", @@ -219356,31 +211533,28 @@ } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-05-18", - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "open_weights": true, + "release_date": "2026-02-15", + "last_updated": "2026-02-15", "type": "chat" }, { - "id": "gemini-3.1-flash-lite-preview", - "name": "Gemini 3.1 Flash Lite Preview", - "display_name": "Gemini 3.1 Flash Lite Preview", + "id": "alibaba/qwen3.8-flash", + "name": "Qwen3.8 Flash (Alibaba Cloud)", + "display_name": "Qwen3.8 Flash (Alibaba Cloud)", "modalities": { "input": [ "text", "image", - "video", - "audio", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 983616, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -219390,38 +211564,43 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ "none", + "minimal", "low", "medium", - "high" + "high", + "xhigh", + "max" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-03-03", - "last_updated": "2026-03-03", + "release_date": "2026-08-26", + "last_updated": "2026-08-26", "type": "chat" }, { - "id": "deepseek-v3.2", - "name": "DeepSeek-V3.2", - "display_name": "DeepSeek-V3.2", + "id": "alibaba/kimi-k2.5", + "name": "Kimi K2.5 (Alibaba Cloud)", + "display_name": "Kimi K2.5 (Alibaba Cloud)", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 128000 + "context": 262144, + "output": 98304 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -219430,25 +211609,34 @@ "extra_capabilities": { "reasoning": { "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ "none", + "minimal", "low", "medium", - "high" + "high", + "xhigh", + "max" ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2024-07", - "release_date": "2025-12-01", - "last_updated": "2025-12-01", + "knowledge": "2025-01", + "release_date": "2026-01-27", + "last_updated": "2026-01-27", "type": "chat" }, { - "id": "viv-fast", - "name": "Viv Fast", - "display_name": "Viv Fast", + "id": "alibaba/qwen3-vl-plus", + "name": "Qwen3 VL Plus (Alibaba Cloud)", + "display_name": "Qwen3 VL Plus (Alibaba Cloud)", "modalities": { "input": [ "text", @@ -219459,49 +211647,51 @@ ] }, "limit": { - "context": 1000000, - "output": 256000 + "context": 262144, + "output": 32768 }, - "temperature": false, - "tool_call": true, + "temperature": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": true }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "low", - "high", - "max" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-09", - "release_date": "2026-09-21", - "last_updated": "2026-09-21", + "knowledge": "2025-04", + "release_date": "2025-09-23", + "last_updated": "2025-09-23", "type": "chat" }, { - "id": "gpt-5.1-codex", - "name": "GPT-5.1 Codex", - "display_name": "GPT-5.1 Codex", + "id": "anthropic/claude-sonnet-4-5", + "name": "Claude Sonnet 4.5 (Anthropic)", + "display_name": "Claude Sonnet 4.5 (Anthropic)", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 200000, + "output": 64000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -219511,34 +211701,34 @@ "reasoning": { "supported": true, "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ], - "visibility": "hidden" + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-11-13", - "last_updated": "2025-11-13", + "knowledge": "2025-07-31", + "release_date": "2025-09-29", + "last_updated": "2025-09-29", "type": "chat" }, { - "id": "claude-fable-5", - "name": "Claude Fable 5", - "display_name": "Claude Fable 5", + "id": "anthropic/claude-fable-5", + "name": "Claude Fable 5 (Anthropic)", + "display_name": "Claude Fable 5 (Anthropic)", "modalities": { "input": [ "text", @@ -219591,69 +211781,68 @@ "release_date": "2026-06-09", "last_updated": "2026-06-09", "type": "chat" - } - ] - }, - "scx-ai": { - "id": "scx-ai", - "name": "SCX.ai", - "display_name": "SCX.ai", - "api": "https://api.scx.ai/v1", - "doc": "https://platform.scx.ai/docs", - "models": [ + }, { - "id": "MiniMax-M2.7", - "name": "MiniMax-M2.7", - "display_name": "MiniMax-M2.7", + "id": "anthropic/claude-haiku-4-5", + "name": "Claude Haiku 4.5 (Anthropic)", + "display_name": "Claude Haiku 4.5 (Anthropic)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 196608, - "output": 196608 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" ], - "effort_options": [ - "low", - "medium", - "high" + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-03-18", - "last_updated": "2026-03-18", + "attachment": true, + "open_weights": false, + "knowledge": "2025-02-28", + "release_date": "2025-10-15", + "last_updated": "2025-10-15", "type": "chat" }, { - "id": "Qwen3.8-Max", - "name": "Qwen3.8 Max", - "display_name": "Qwen3.8 Max", + "id": "anthropic/claude-sonnet-4-6", + "name": "Claude Sonnet 4.6 (Anthropic)", + "display_name": "Claude Sonnet 4.6 (Anthropic)", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" @@ -219661,44 +211850,58 @@ }, "limit": { "context": 1000000, - "output": 131072 + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "max" + ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" ], - "effort_options": [ - "none", - "low", - "medium", - "xhigh" + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-08-03", - "last_updated": "2026-08-03", + "knowledge": "2025-08-31", + "release_date": "2026-02-17", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "GLM-5.2", - "name": "GLM-5.2", - "display_name": "GLM-5.2", + "id": "anthropic/claude-opus-4-7", + "name": "Claude Opus 4.7 (Anthropic)", + "display_name": "Claude Opus 4.7 (Anthropic)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" @@ -219706,53 +211909,66 @@ }, "limit": { "context": 1000000, - "output": 131072 + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], "interleaved": true, "summaries": true, - "visibility": "summary", + "visibility": "omitted", "continuation": [ "thinking_blocks" ], - "effort_options": [ - "none", - "high", - "max" + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "attachment": true, + "open_weights": false, + "knowledge": "2026-01-31", + "release_date": "2026-04-16", + "last_updated": "2026-04-16", "type": "chat" }, { - "id": "gpt-oss-120b", - "name": "GPT OSS 120B", - "display_name": "GPT OSS 120B", + "id": "anthropic/claude-fable-5-1", + "name": "Claude Fable 5.1 (Anthropic)", + "display_name": "Claude Fable 5.1 (Anthropic)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 131072 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -219761,54 +211977,55 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], "interleaved": true, "summaries": true, - "visibility": "summary", + "visibility": "omitted", "continuation": [ "thinking_blocks" ], - "effort_options": [ - "low", - "medium", - "high" + "notes": [ + "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", + "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", + "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "attachment": true, + "open_weights": false, + "knowledge": "2026-06", + "release_date": "2026-09-01", + "last_updated": "2026-09-01", "type": "chat" - } - ] - }, - "moark": { - "id": "moark", - "name": "Moark", - "display_name": "Moark", - "api": "https://moark.com/v1", - "doc": "https://moark.com/docs/openapi/v1#tag/%E6%96%87%E6%9C%AC%E7%94%9F%E6%88%90", - "models": [ + }, { - "id": "Kimi-K2.6", - "name": "Kimi K2.6", - "display_name": "Kimi K2.6", + "id": "anthropic/claude-opus-5-5", + "name": "Claude Opus 5.5 (Anthropic)", + "display_name": "Claude Opus 5.5 (Anthropic)", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -219816,56 +212033,31 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-20", - "last_updated": "2026-04-20", - "type": "chat" - }, - { - "id": "MiniMax-M2.1", - "name": "MiniMax-M2.1", - "display_name": "MiniMax-M2.1", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 204800, - "output": 131072 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, - "attachment": false, - "open_weights": true, - "release_date": "2025-12-23", - "last_updated": "2025-12-23", + "open_weights": false, + "knowledge": "2026-06", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "DeepSeek-V4-Flash", - "name": "DeepSeek V4 Flash", - "display_name": "DeepSeek V4 Flash", + "id": "anthropic/claude-opus-4-6", + "name": "Claude Opus 4.6 (Anthropic)", + "display_name": "Claude Opus 4.6 (Anthropic)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" @@ -219873,22 +212065,27 @@ }, "limit": { "context": 1000000, - "output": 384000 + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, "effort": "high", "effort_options": [ "low", + "medium", "high", "max" ], @@ -219899,63 +212096,27 @@ "thinking_blocks" ], "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." - ] - } - }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", - "type": "chat" - }, - { - "id": "MiniMax-M2.7", - "name": "MiniMax-M2.7", - "display_name": "MiniMax-M2.7", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 204800, - "output": 131072 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-03-18", - "last_updated": "2026-03-18", + "attachment": true, + "open_weights": false, + "knowledge": "2025-05-31", + "release_date": "2026-02-05", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "DeepSeek-V4-Pro", - "name": "DeepSeek V4 Pro", - "display_name": "DeepSeek V4 Pro", + "id": "anthropic/claude-opus-4-8", + "name": "Claude Opus 4.8 (Anthropic)", + "display_name": "Claude Opus 4.8 (Anthropic)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" @@ -219963,50 +212124,56 @@ }, "limit": { "context": 1000000, - "output": 384000 + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, + "default_enabled": false, "mode": "effort", "effort": "high", "effort_options": [ "low", + "medium", "high", + "xhigh", "max" ], "interleaved": true, "summaries": true, - "visibility": "summary", + "visibility": "omitted", "continuation": [ "thinking_blocks" ], "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "attachment": true, + "open_weights": false, + "knowledge": "2026-01", + "release_date": "2026-05-28", + "last_updated": "2026-05-28", "type": "chat" }, { - "id": "deepseek-v4-flash-0731", - "name": "DeepSeek V4 Flash 0731", - "display_name": "DeepSeek V4 Flash 0731", + "id": "anthropic/claude-opus-5", + "name": "Claude Opus 5 (Anthropic)", + "display_name": "Claude Opus 5 (Anthropic)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" @@ -220014,9 +212181,9 @@ }, "limit": { "context": 1000000, - "output": 384000 + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -220024,58 +212191,85 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-07-31", - "last_updated": "2026-07-31", + "attachment": true, + "open_weights": false, + "knowledge": "2026-05", + "release_date": "2026-07-24", + "last_updated": "2026-07-24", "type": "chat" }, { - "id": "kimi-k3", - "name": "Kimi K3", - "display_name": "Kimi K3", + "id": "anthropic/claude-haiku-4-5-20251001", + "name": "Claude Haiku 4.5 (2025-10-01) (Anthropic)", + "display_name": "Claude Haiku 4.5 (2025-10-01) (Anthropic)", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 200000, + "output": 64000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-16", + "open_weights": false, + "knowledge": "2025-02-28", + "release_date": "2025-10-15", + "last_updated": "2025-10-15", "type": "chat" }, { - "id": "GLM-5.3", - "name": "GLM-5.3", - "display_name": "GLM-5.3", + "id": "anthropic/claude-haiku-5-5", + "name": "Claude Haiku 5.5 (Anthropic)", + "display_name": "Claude Haiku 5.5 (Anthropic)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" @@ -220083,9 +212277,9 @@ }, "limit": { "context": 1000000, - "output": 131072 + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -220093,32 +212287,42 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "attachment": true, + "open_weights": false, + "knowledge": "2026-06", + "release_date": "2026-10-07", + "last_updated": "2026-10-07", "type": "chat" }, { - "id": "GLM-4.7", - "name": "GLM-4.7", - "display_name": "GLM-4.7", + "id": "anthropic/claude-sonnet-5-5", + "name": "Claude Sonnet 5.5 (Anthropic)", + "display_name": "Claude Sonnet 5.5 (Anthropic)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -220126,31 +212330,31 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-12-22", - "last_updated": "2025-12-22", + "attachment": true, + "open_weights": false, + "knowledge": "2026-06", + "release_date": "2026-09-28", + "last_updated": "2026-09-28", "type": "chat" }, { - "id": "Qwen3.6-Flash", - "name": "Qwen3.6 Flash", - "display_name": "Qwen3.6 Flash", + "id": "anthropic/claude-sonnet-5", + "name": "Claude Sonnet 5 (Anthropic)", + "display_name": "Claude Sonnet 5 (Anthropic)", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" @@ -220158,9 +212362,9 @@ }, "limit": { "context": 1000000, - "output": 65536 + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -220169,209 +212373,148 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-04-27", - "last_updated": "2026-04-27", + "knowledge": "2026-01-31", + "release_date": "2026-06-30", + "last_updated": "2026-06-30", "type": "chat" - } - ] - }, - "nearai": { - "id": "nearai", - "name": "NEAR AI Cloud", - "display_name": "NEAR AI Cloud", - "api": "https://cloud-api.near.ai/v1", - "doc": "https://docs.near.ai/", - "models": [ - { - "id": "Qwen/Qwen3-Embedding-0.6B", - "name": "Qwen3 Embedding 0.6B", - "display_name": "Qwen3 Embedding 0.6B", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 32768, - "output": 1024 - }, - "temperature": false, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": true, - "release_date": "2025-06-05", - "last_updated": "2025-06-05", - "type": "embedding" - }, - { - "id": "Qwen/Qwen3-Reranker-0.6B", - "name": "Qwen3 Reranker 0.6B", - "display_name": "Qwen3 Reranker 0.6B", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 40960, - "output": 1024 - }, - "temperature": false, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": true, - "release_date": "2025-06-05", - "last_updated": "2025-06-05", - "type": "rerank" }, { - "id": "Qwen/Qwen3.6-35B-A3B-FP8", - "name": "Qwen 3.6 35B A3B FP8", - "display_name": "Qwen 3.6 35B A3B FP8", + "id": "anthropic/claude-sonnet-4-5-20250929", + "name": "Claude Sonnet 4.5 (2025-09-29) (Anthropic)", + "display_name": "Claude Sonnet 4.5 (2025-09-29) (Anthropic)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 8192 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-04-17", - "last_updated": "2026-04-17", - "type": "chat" - }, - { - "id": "Qwen/Qwen3-VL-30B-A3B-Instruct", - "name": "Qwen3-VL 30B-A3B Instruct", - "display_name": "Qwen3-VL 30B-A3B Instruct", - "modalities": { - "input": [ - "text", - "image" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 16384, - "output": 8192 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, "attachment": true, - "open_weights": true, - "release_date": "2025-10-04", - "last_updated": "2025-10-04", + "open_weights": false, + "knowledge": "2025-07-31", + "release_date": "2025-09-29", + "last_updated": "2025-09-29", "type": "chat" }, { - "id": "Qwen/Qwen3.8-27B", - "name": "Qwen3.8 27B", - "display_name": "Qwen3.8 27B", + "id": "anthropic/claude-opus-4-5-20251101", + "name": "Claude Opus 4.5 (Anthropic)", + "display_name": "Claude Opus 4.5 (Anthropic)", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 200000, + "output": 32000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", + "effort_options": [ + "low", + "medium", + "high" + ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "open_weights": false, + "knowledge": "2025-05", + "release_date": "2025-11-24", + "last_updated": "2025-11-24", "type": "chat" }, { - "id": "google/gemini-2.5-pro", - "name": "Gemini 2.5 Pro", - "display_name": "Gemini 2.5 Pro", + "id": "ranoai/deepseek-v4-flash", + "name": "DeepSeek V4 Flash (RanoAI)", + "display_name": "DeepSeek V4 Flash (RanoAI)", "modalities": { "input": [ - "text", - "image", - "audio", - "video", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 1000000, + "output": 393216 }, "temperature": true, "tool_call": true, @@ -220383,47 +212526,46 @@ "reasoning": { "supported": true, "default_enabled": true, - "mode": "budget", - "budget": { - "default": -1, - "min": 128, - "max": 32768, - "auto": -1, - "unit": "tokens" - }, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "high", + "max" + ], + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" + ], + "notes": [ + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-06-17", - "last_updated": "2025-06-17", + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "google/gemini-3.5-flash", - "name": "Gemini 3.5 Flash", - "display_name": "Gemini 3.5 Flash", + "id": "minimax/minimax-m2.7", + "name": "MiniMax M2.7 (MiniMax)", + "display_name": "MiniMax M2.7 (MiniMax)", "modalities": { "input": [ - "text", - "image", - "video", - "audio", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 204800, + "output": 131100 }, "temperature": true, "tool_call": true, @@ -220434,48 +212576,42 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", - "low", - "medium", - "high" - ], + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" + ], + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-05-19", - "last_updated": "2026-05-19", + "attachment": false, + "open_weights": true, + "release_date": "2026-03-18", + "last_updated": "2026-03-18", "type": "chat" }, { - "id": "google/gemini-2.5-flash", - "name": "Gemini 2.5 Flash", - "display_name": "Gemini 2.5 Flash", + "id": "minimax/minimax-m2.7-highspeed", + "name": "MiniMax M2.7 Highspeed (MiniMax)", + "display_name": "MiniMax M2.7 Highspeed (MiniMax)", "modalities": { "input": [ - "text", - "image", - "audio", - "video", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 204800, + "output": 131100 }, "temperature": true, "tool_call": true, @@ -220486,46 +212622,44 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "budget", - "budget": { - "default": -1, - "min": 0, - "max": 24576, - "auto": -1, - "off": 0, - "unit": "tokens" - }, + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" + ], + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-06-17", - "last_updated": "2025-06-17", + "attachment": false, + "open_weights": true, + "release_date": "2026-03-18", + "last_updated": "2026-03-18", "type": "chat" }, { - "id": "google/gemini-3.8-flash", - "name": "Gemini 3.8 Flash", - "display_name": "Gemini 3.8 Flash", + "id": "minimax/minimax-m3", + "name": "MiniMax M3 (MiniMax)", + "display_name": "MiniMax M3 (MiniMax)", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 512000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -220536,39 +212670,32 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ + "effort_options": [ + "none", "minimal", "low", "medium", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" + "high", + "xhigh", + "max" ] } }, "attachment": true, - "open_weights": false, - "release_date": "2026-09-02", - "last_updated": "2026-09-02", + "open_weights": true, + "release_date": "2026-06-01", + "last_updated": "2026-06-01", "type": "chat" }, { - "id": "google/gemini-2.5-flash-lite", - "name": "Gemini 2.5 Flash-Lite", - "display_name": "Gemini 2.5 Flash-Lite", + "id": "minimax/minimax-m3.1-flash", + "name": "MiniMax M3.1 Flash (MiniMax)", + "display_name": "MiniMax M3.1 Flash (MiniMax)", "modalities": { "input": [ "text", "image", - "audio", - "video", - "pdf" + "video" ], "output": [ "text" @@ -220576,59 +212703,46 @@ }, "limit": { "context": 1048576, - "output": 65536 + "output": 524288 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "default": -1, - "min": 512, - "max": 24576, - "auto": -1, - "unit": "tokens" - }, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-06-17", - "last_updated": "2025-06-17", + "release_date": "2026-10-19", + "last_updated": "2026-10-19", "type": "chat" }, { - "id": "google/gemini-3.1-flash-lite", - "name": "Gemini 3.1 Flash Lite", - "display_name": "Gemini 3.1 Flash Lite", + "id": "minimax/minimax-m2.1-lightning", + "name": "MiniMax M2.1 Lightning (MiniMax)", + "display_name": "MiniMax M2.1 Lightning (MiniMax)", "modalities": { "input": [ - "text", - "image", - "video", - "audio", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 196608, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -220638,20 +212752,25 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] } }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-05-07", - "last_updated": "2026-05-07", + "release_date": "2025-12-23", + "last_updated": "2025-12-23", "type": "chat" }, { - "id": "moonshotai/kimi-k2.6", - "name": "Kimi K2.6", - "display_name": "Kimi K2.6", + "id": "minimax/minimax-m2.5", + "name": "MiniMax M2.5 (MiniMax)", + "display_name": "MiniMax M2.5 (MiniMax)", "modalities": { "input": [ "text" @@ -220661,8 +212780,8 @@ ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 204800, + "output": 131100 }, "temperature": true, "tool_call": true, @@ -220673,25 +212792,25 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" ] } }, "attachment": false, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-20", - "last_updated": "2026-04-20", + "release_date": "2026-02-12", + "last_updated": "2026-02-12", "type": "chat" }, { - "id": "moonshotai/kimi-k3", - "name": "Kimi K3", - "display_name": "Kimi K3", + "id": "minimax/minimax-m2.5-highspeed", + "name": "MiniMax M2.5 Highspeed (MiniMax)", + "display_name": "MiniMax M2.5 Highspeed (MiniMax)", "modalities": { "input": [ "text" @@ -220701,10 +212820,10 @@ ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 204800, + "output": 131100 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -220713,42 +212832,36 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ "low", + "medium", "high", + "xhigh", "max" ] } }, "attachment": false, "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-16", + "release_date": "2026-02-13", + "last_updated": "2026-02-13", "type": "chat" }, { - "id": "x-ai/grok-4.7", - "name": "Grok 4.7", - "display_name": "Grok 4.7", + "id": "minimax/minimax-text-01", + "name": "MiniMax Text 01 (MiniMax)", + "display_name": "MiniMax Text 01 (MiniMax)", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 500000, - "output": 500000 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -220756,27 +212869,16 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ] - } - }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2026-05", - "release_date": "2026-09-21", - "last_updated": "2026-09-21", + "release_date": "2025-01-15", + "last_updated": "2025-01-15", "type": "chat" }, { - "id": "x-ai/grok-4.6", - "name": "Grok 4.6", - "display_name": "Grok 4.6", + "id": "minimax/minimax-m2.1", + "name": "MiniMax M2.1 (MiniMax)", + "display_name": "MiniMax M2.1 (MiniMax)", "modalities": { "input": [ "text" @@ -220786,8 +212888,8 @@ ] }, "limit": { - "context": 500000, - "output": 500000 + "context": 196608, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -220802,155 +212904,149 @@ "low", "medium", "high", - "xhigh" + "xhigh", + "max" ] } }, "attachment": false, - "open_weights": false, - "knowledge": "2026-02-01", - "release_date": "2026-08-12", - "last_updated": "2026-08-12", + "open_weights": true, + "release_date": "2025-12-23", + "last_updated": "2025-12-23", "type": "chat" }, { - "id": "openai/whisper-large-v3", - "name": "Whisper Large v3", - "display_name": "Whisper Large v3", + "id": "minimax/minimax-m2", + "name": "MiniMax M2 (MiniMax)", + "display_name": "MiniMax M2 (MiniMax)", "modalities": { "input": [ - "audio" + "text" ], "output": [ "text" ] }, "limit": { - "context": 448, - "output": 448 + "context": 196608, + "output": 131072 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + }, + "attachment": false, "open_weights": true, - "release_date": "2023-11-06", - "last_updated": "2023-11-06" + "release_date": "2025-10-27", + "last_updated": "2025-10-27", + "type": "chat" }, { - "id": "openai/gpt-5.2", - "name": "GPT-5.2", - "display_name": "GPT-5.2", + "id": "novita/hy3", + "name": "Hy3 (NovitaAI)", + "display_name": "Hy3 (NovitaAI)", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", "effort_options": [ "none", "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", "high" - ], - "visibility": "hidden" + ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2025-12-11", - "last_updated": "2025-12-11", + "attachment": false, + "open_weights": true, + "release_date": "2026-07-06", + "last_updated": "2026-07-06", "type": "chat" }, { - "id": "openai/gpt-5.4-mini", - "name": "GPT-5.4 mini", - "display_name": "GPT-5.4 mini", + "id": "novita/glm-5.2", + "name": "GLM-5.2 (NovitaAI)", + "display_name": "GLM-5.2 (NovitaAI)", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 1048576, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ "none", + "minimal", "low", "medium", "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "xhigh", + "max" + ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-17", - "last_updated": "2026-03-17", + "attachment": false, + "open_weights": true, + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "openai/gpt-5.6-sol", - "name": "GPT-5.6 Sol", - "display_name": "GPT-5.6 Sol", + "id": "novita/deepseek-v4-flash", + "name": "DeepSeek V4 Flash (NovitaAI)", + "display_name": "DeepSeek V4 Flash (NovitaAI)", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" @@ -220958,9 +213054,9 @@ }, "limit": { "context": 1050000, - "output": 128000 + "output": 393216 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -220971,138 +213067,107 @@ "supported": true, "default_enabled": true, "mode": "effort", - "effort": "medium", + "effort": "high", "effort_options": [ - "none", "low", - "medium", "high", - "xhigh", "max" ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ], - "visibility": "hidden" + "notes": [ + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." + ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "openai/gpt-5-nano", - "name": "GPT-5 Nano", - "display_name": "GPT-5 Nano", + "id": "novita/kimi-k2", + "name": "Kimi K2 (NovitaAI)", + "display_name": "Kimi K2 (NovitaAI)", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 131072, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "minimal", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2024-05-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "release_date": "2025-07-11", + "last_updated": "2025-07-11", "type": "chat" }, { - "id": "openai/gpt-5.4-nano", - "name": "GPT-5.4 nano", - "display_name": "GPT-5.4 nano", + "id": "novita/minimax-m2.7", + "name": "MiniMax M2.7 (NovitaAI)", + "display_name": "MiniMax M2.7 (NovitaAI)", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 204800, + "output": 131100 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ - "none", "low", "medium", "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "xhigh", + "max" + ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-17", - "last_updated": "2026-03-17", + "attachment": false, + "open_weights": true, + "release_date": "2026-03-18", + "last_updated": "2026-03-18", "type": "chat" }, { - "id": "openai/gpt-5.6-luna", - "name": "GPT-5.6 Luna", - "display_name": "GPT-5.6 Luna", + "id": "novita/deepseek-v4.1-flash", + "name": "DeepSeek V4.1 Flash (NovitaAI)", + "display_name": "DeepSeek V4.1 Flash (NovitaAI)", "modalities": { "input": [ "text", @@ -221113,10 +213178,10 @@ ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1048576, + "output": 393216 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -221125,37 +213190,28 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", "effort_options": [ "none", + "minimal", "low", "medium", "high", "xhigh", "max" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-09-10", + "last_updated": "2026-09-10", "type": "chat" }, { - "id": "openai/o3-mini", - "name": "o3-mini", - "display_name": "o3-mini", + "id": "novita/qwen3.8-2.4t-a95b", + "name": "Qwen3.8 2.4T A95B (NovitaAI)", + "display_name": "Qwen3.8 2.4T A95B (NovitaAI)", "modalities": { "input": [ "text" @@ -221165,10 +213221,10 @@ ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 1000000, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -221177,43 +213233,69 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", "effort_options": [ + "none", + "minimal", "low", "medium", - "high" - ], - "visibility": "hidden" + "high", + "xhigh", + "max" + ] } }, "attachment": false, - "open_weights": false, - "knowledge": "2024-05", - "release_date": "2024-12-20", - "last_updated": "2025-01-29", + "open_weights": true, + "release_date": "2026-08-12", + "last_updated": "2026-08-12", "type": "chat" }, { - "id": "openai/o3", - "name": "o3", - "display_name": "o3", + "id": "novita/qwen3-vl-30b-a3b-instruct", + "name": "Qwen3 VL 30B A3B Instruct (NovitaAI)", + "display_name": "Qwen3 VL 30B A3B Instruct (NovitaAI)", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 131072, + "output": 32768 }, - "temperature": false, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": true, + "release_date": "2025-10-04", + "last_updated": "2025-10-04", + "type": "chat" + }, + { + "id": "novita/glm-5.3", + "name": "GLM-5.3 (NovitaAI)", + "display_name": "GLM-5.3 (NovitaAI)", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1048576, + "output": 131072 + }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -221222,42 +213304,36 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", "effort_options": [ "low", - "medium", - "high" - ], - "visibility": "hidden" + "high", + "max" + ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-05", - "release_date": "2025-04-16", - "last_updated": "2025-04-16", + "attachment": false, + "open_weights": true, + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "openai/gpt-6-sol", - "name": "GPT-6 Sol", - "display_name": "GPT-6 Sol", + "id": "novita/qwen3.7-max", + "name": "Qwen3.7 Max (NovitaAI)", + "display_name": "Qwen3.7 Max (NovitaAI)", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1000000, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -221265,8 +213341,10 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ "none", + "minimal", "low", "medium", "high", @@ -221275,31 +213353,29 @@ ] } }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2026-04-20", - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "release_date": "2026-05-21", + "last_updated": "2026-05-21", "type": "chat" }, { - "id": "openai/gpt-6.1-sol", - "name": "GPT-6.1 Sol", - "display_name": "GPT-6.1 Sol", + "id": "novita/ling-3.0-flash", + "name": "InclusionAI Ling 3.0 Flash (NovitaAI)", + "display_name": "InclusionAI Ling 3.0 Flash (NovitaAI)", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 262144, + "output": 32768 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -221308,29 +213384,25 @@ "extra_capabilities": { "reasoning": { "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" + "none" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-04-30", - "release_date": "2026-09-29", - "last_updated": "2026-09-29", + "attachment": false, + "open_weights": true, + "release_date": "2026-07-23", + "last_updated": "2026-07-23", "type": "chat" }, { - "id": "openai/gpt-5.4", - "name": "GPT-5.4", - "display_name": "GPT-5.4", + "id": "novita/qwen3.8-max", + "name": "Qwen3.8 Max (NovitaAI)", + "display_name": "Qwen3.8 Max (NovitaAI)", "modalities": { "input": [ "text", "image", + "video", "pdf" ], "output": [ @@ -221338,143 +213410,130 @@ ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", "effort_options": [ - "none", "low", "medium", - "high", "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-05", - "last_updated": "2026-03-05", + "release_date": "2026-08-03", + "last_updated": "2026-08-03", "type": "chat" }, { - "id": "openai/gpt-5.1", - "name": "GPT-5.1", - "display_name": "GPT-5.1", + "id": "novita/kimi-k2.7-code", + "name": "Kimi K2.7 Code (NovitaAI)", + "display_name": "Kimi K2.7 Code (NovitaAI)", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 262144, + "output": 262144 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ], - "verbosity": "medium", - "verbosity_options": [ + "effort_options": [ "low", "medium", - "high" - ], - "visibility": "hidden" + "high", + "xhigh", + "max" + ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-11-13", - "last_updated": "2025-11-13", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-06-12", + "last_updated": "2026-06-12", "type": "chat" }, { - "id": "openai/gpt-4.1-mini", - "name": "GPT-4.1 mini", - "display_name": "GPT-4.1 mini", + "id": "novita/glm-4.6v", + "name": "GLM-4.6V (NovitaAI)", + "display_name": "GLM-4.6V (NovitaAI)", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1047576, - "output": 32768 + "context": 131072, + "output": 16000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": true, - "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-04-14", - "last_updated": "2025-04-14", + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-12-08", + "last_updated": "2025-12-08", "type": "chat" }, { - "id": "openai/gpt-6-astra", - "name": "GPT-6 Astra", - "display_name": "GPT-6 Astra", + "id": "novita/qwen3.6-35b-a3b", + "name": "Qwen3.6 35B A3B (NovitaAI)", + "display_name": "Qwen3.6 35B A3B (NovitaAI)", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 262144, + "output": 64000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -221483,7 +213542,15 @@ "extra_capabilities": { "reasoning": { "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ + "none", + "minimal", "low", "medium", "high", @@ -221493,31 +213560,28 @@ } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-04-30", - "release_date": "2026-09-04", - "last_updated": "2026-09-04", + "open_weights": true, + "release_date": "2026-04-17", + "last_updated": "2026-04-17", "type": "chat" }, { - "id": "openai/gpt-5.5", - "name": "GPT-5.5", - "display_name": "GPT-5.5", + "id": "novita/glm-4.6", + "name": "GLM-4.6 (NovitaAI)", + "display_name": "GLM-4.6 (NovitaAI)", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 204800, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -221525,50 +213589,35 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "supported": true } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-12-01", - "release_date": "2026-04-23", - "last_updated": "2026-04-23", + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-09-30", + "last_updated": "2025-09-30", "type": "chat" }, { - "id": "openai/gpt-5-mini", - "name": "GPT-5 Mini", - "display_name": "GPT-5 Mini", + "id": "novita/kimi-k2.6", + "name": "Kimi K2.6 (NovitaAI)", + "display_name": "Kimi K2.6 (NovitaAI)", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 262144, + "output": 262144 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -221577,49 +213626,49 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ + "none", "minimal", "low", "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "high", + "xhigh", + "max" + ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2024-05-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-04-20", + "last_updated": "2026-04-20", "type": "chat" }, { - "id": "openai/gpt-5", - "name": "GPT-5", - "display_name": "GPT-5", + "id": "novita/minimax-m3.1-flash", + "name": "MiniMax M3.1 Flash (NovitaAI)", + "display_name": "MiniMax M3.1 Flash (NovitaAI)", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 1000000, + "output": 524288 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -221627,50 +213676,38 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", "effort_options": [ - "minimal", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ "low", "medium", - "high" - ], - "visibility": "hidden" + "high", + "xhigh", + "max" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "release_date": "2026-10-19", + "last_updated": "2026-10-19", "type": "chat" }, { - "id": "openai/gpt-6-luna", - "name": "GPT-6 Luna", - "display_name": "GPT-6 Luna", + "id": "novita/minimax-m2.5", + "name": "MiniMax M2.5 (NovitaAI)", + "display_name": "MiniMax M2.5 (NovitaAI)", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 204800, + "output": 131100 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -221678,8 +213715,8 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ - "none", "low", "medium", "high", @@ -221688,47 +213725,48 @@ ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-05-18", - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "attachment": false, + "open_weights": true, + "release_date": "2026-02-12", + "last_updated": "2026-02-12", "type": "chat" }, { - "id": "openai/gpt-4.1", - "name": "GPT-4.1", - "display_name": "GPT-4.1", + "id": "novita/gemma-4-26b-a4b-it", + "name": "Gemma 4 26B A4B IT (NovitaAI)", + "display_name": "Gemma 4 26B A4B IT (NovitaAI)", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1047576, + "context": 262144, "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-04-14", - "last_updated": "2025-04-14", + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": false, + "open_weights": true, + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "openai/gpt-4.1-nano", - "name": "GPT-4.1 nano", - "display_name": "GPT-4.1 nano", + "id": "novita/llama-4-scout-17b-instruct", + "name": "Llama 4 Scout 17B Instruct (NovitaAI)", + "display_name": "Llama 4 Scout 17B Instruct (NovitaAI)", "modalities": { "input": [ "text", @@ -221739,96 +213777,89 @@ ] }, "limit": { - "context": 1047576, - "output": 32768 + "context": 131072, + "output": 131072 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-04-14", - "last_updated": "2025-04-14", + "open_weights": true, + "knowledge": "2024-08", + "release_date": "2025-04-05", + "last_updated": "2025-04-05", "type": "chat" }, { - "id": "openai/o4-mini", - "name": "o4-mini", - "display_name": "o4-mini", + "id": "novita/gemma-4-31b-it", + "name": "Gemma 4 31B IT (NovitaAI)", + "display_name": "Gemma 4 31B IT (NovitaAI)", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 262144, + "output": 32768 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "supported": true } }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-05", - "release_date": "2025-04-16", - "last_updated": "2025-04-16", + "attachment": false, + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "black-forest-labs/FLUX.2-klein-4B", - "name": "FLUX.2 Klein 4B", - "display_name": "FLUX.2 Klein 4B", + "id": "novita/glm-4.5v", + "name": "GLM-4.5V (NovitaAI)", + "display_name": "GLM-4.5V (NovitaAI)", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ - "image" + "text" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 65536, + "output": 16000 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": true, "open_weights": true, - "release_date": "2026-01-15", - "last_updated": "2026-01-15" + "knowledge": "2025-04", + "release_date": "2025-08-11", + "last_updated": "2025-08-11", + "type": "chat" }, { - "id": "qwen/qwen3.5-397b-a17b", - "name": "Qwen3.5 397B-A17B", - "display_name": "Qwen3.5 397B-A17B", + "id": "novita/deepseek-v4.1-flash-1017", + "name": "DeepSeek V4.1 Flash 1017 (NovitaAI)", + "display_name": "DeepSeek V4.1 Flash 1017 (NovitaAI)", "modalities": { "input": [ "text", @@ -221839,8 +213870,8 @@ ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 1048576, + "output": 393216 }, "temperature": true, "tool_call": true, @@ -221850,25 +213881,28 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "none", + "minimal", + "low", + "medium", + "high", + "xhigh", + "max" ] } }, "attachment": true, "open_weights": true, - "release_date": "2026-02-15", - "last_updated": "2026-02-15", + "knowledge": "2025-05", + "release_date": "2026-10-17", + "last_updated": "2026-10-17", "type": "chat" }, { - "id": "qwen/qwen3.7-max", - "name": "Qwen3.7 Max", - "display_name": "Qwen3.7 Max", + "id": "novita/llama-3.3-70b-instruct", + "name": "Llama 3.3 70B Instruct (NovitaAI)", + "display_name": "Llama 3.3 70B Instruct (NovitaAI)", "modalities": { "input": [ "text" @@ -221878,41 +213912,38 @@ ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 131072, + "output": 120000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2026-05-21", - "last_updated": "2026-05-21", + "open_weights": true, + "knowledge": "2023-12", + "release_date": "2024-12-06", + "last_updated": "2024-12-06", "type": "chat" }, { - "id": "z-ai/glm-5.3", - "name": "GLM-5.3", - "display_name": "GLM-5.3", + "id": "novita/qwen3.5-122b-a10b", + "name": "Qwen3.5 122B A10B (NovitaAI)", + "display_name": "Qwen3.5 122B A10B (NovitaAI)", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 262144, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -221930,33 +213961,36 @@ "thinking_blocks" ], "effort_options": [ + "none", + "minimal", "low", + "medium", "high", + "xhigh", "max" ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" }, { - "id": "z-ai/glm-5.3-flash", - "name": "GLM-5.3-Flash", - "display_name": "GLM-5.3-Flash", + "id": "novita/glm-5", + "name": "GLM-5 (NovitaAI)", + "display_name": "GLM-5 (NovitaAI)", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, + "context": 202800, "output": 131072 }, "temperature": true, @@ -221975,36 +214009,41 @@ "thinking_blocks" ], "effort_options": [ + "none", + "minimal", "low", + "medium", "high", + "xhigh", "max" ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", + "release_date": "2026-02-12", + "last_updated": "2026-02-12", "type": "chat" }, { - "id": "deepseek/deepseek-v4.1-flash-1017", - "name": "DeepSeek V4.1 Flash 1017", - "display_name": "DeepSeek V4.1 Flash 1017", + "id": "novita/kimi-k3", + "name": "Kimi K3 (NovitaAI)", + "display_name": "Kimi K3 (NovitaAI)", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 1048576, + "output": 1048576 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -222012,78 +214051,72 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ + "none", + "minimal", "low", + "medium", "high", + "xhigh", "max" ] } }, "attachment": true, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-10-17", - "last_updated": "2026-10-17", + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" }, { - "id": "deepseek/deepseek-v3.2", - "name": "DeepSeek V3.2", - "display_name": "DeepSeek V3.2", + "id": "novita/llama-4-maverick-17b-instruct", + "name": "Llama 4 Maverick 17B Instruct (NovitaAI)", + "display_name": "Llama 4 Maverick 17B Instruct (NovitaAI)", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 64000 + "context": 1048576, + "output": 8192 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2024-07", - "release_date": "2025-12-01", - "last_updated": "2025-12-01", + "knowledge": "2024-08", + "release_date": "2025-04-05", + "last_updated": "2025-04-05", "type": "chat" }, { - "id": "anthropic/claude-haiku-5-5", - "name": "Claude Haiku 5.5", - "display_name": "Claude Haiku 5.5", + "id": "novita/step-3.7-flash", + "name": "Step 3.7 Flash (NovitaAI)", + "display_name": "Step 3.7 Flash (NovitaAI)", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 262144, + "output": 256000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -222092,6 +214125,7 @@ "extra_capabilities": { "reasoning": { "effort_options": [ + "minimal", "low", "medium", "high", @@ -222101,181 +214135,134 @@ } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-10-07", - "last_updated": "2026-10-07", + "open_weights": true, + "knowledge": "2026-03-01", + "release_date": "2026-05-29", + "last_updated": "2026-05-29", "type": "chat" }, { - "id": "anthropic/claude-opus-4-7", - "name": "Claude Opus 4.7", - "display_name": "Claude Opus 4.7", + "id": "novita/qwen35-397b-a17b", + "name": "Qwen3.5 397B A17B (NovitaAI)", + "display_name": "Qwen3.5 397B A17B (NovitaAI)", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 262144, + "output": 64000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "high", "effort_options": [ + "none", + "minimal", "low", "medium", "high", "xhigh", "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-04-16", - "last_updated": "2026-04-16", + "open_weights": true, + "release_date": "2026-02-15", + "last_updated": "2026-02-15", "type": "chat" }, { - "id": "anthropic/claude-sonnet-4-5", - "name": "Claude Sonnet 4.5 (latest)", - "display_name": "Claude Sonnet 4.5 (latest)", + "id": "novita/qwen3.8-flash", + "name": "Qwen3.8 Flash (NovitaAI)", + "display_name": "Qwen3.8 Flash (NovitaAI)", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + "effort_options": [ + "none", + "minimal", + "low", + "medium", + "high", + "xhigh", + "max" ] } }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-07-31", - "release_date": "2025-09-29", - "last_updated": "2025-09-29", + "release_date": "2026-08-26", + "last_updated": "2026-08-26", "type": "chat" }, { - "id": "anthropic/claude-haiku-4-5", - "name": "Claude Haiku 4.5 (latest)", - "display_name": "Claude Haiku 4.5 (latest)", + "id": "novita/qwen3.8-27b", + "name": "Qwen3.8 27B (NovitaAI)", + "display_name": "Qwen3.8 27B (NovitaAI)", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." - ] - } + "default": true }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-02-28", - "release_date": "2025-10-15", - "last_updated": "2025-10-15", + "attachment": false, + "open_weights": true, + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "anthropic/claude-sonnet-5-5", - "name": "Claude Sonnet 5.5", - "display_name": "Claude Sonnet 5.5", + "id": "novita/glm-5.3-flash", + "name": "GLM-5.3 Flash (NovitaAI)", + "display_name": "GLM-5.3 Flash (NovitaAI)", "modalities": { "input": [ "text", "image", + "video", "pdf" ], "output": [ @@ -222283,10 +214270,10 @@ ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 1048576, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -222294,40 +214281,37 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ "low", - "medium", "high", - "xhigh", "max" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-09-28", - "last_updated": "2026-09-28", + "open_weights": true, + "release_date": "2026-08-26", + "last_updated": "2026-08-26", "type": "chat" }, { - "id": "anthropic/claude-fable-5-1", - "name": "Claude Fable 5.1", - "display_name": "Claude Fable 5.1", + "id": "novita/glm-4.7", + "name": "GLM-4.7 (NovitaAI)", + "display_name": "GLM-4.7 (NovitaAI)", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, + "context": 204800, "output": 128000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -222336,54 +214320,38 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], "interleaved": true, "summaries": true, - "visibility": "omitted", + "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", - "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", - "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-09-01", - "last_updated": "2026-09-01", + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-12-22", + "last_updated": "2025-12-22", "type": "chat" }, { - "id": "anthropic/claude-sonnet-5", - "name": "Claude Sonnet 5", - "display_name": "Claude Sonnet 5", + "id": "novita/glm-5.1", + "name": "GLM-5.1 (NovitaAI)", + "display_name": "GLM-5.1 (NovitaAI)", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 204800, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -222391,20 +214359,34 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "none", + "minimal", + "low", + "medium", + "high", + "xhigh", + "max" + ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-30", - "last_updated": "2026-06-30", + "attachment": false, + "open_weights": true, + "release_date": "2026-04-07", + "last_updated": "2026-04-07", "type": "chat" }, { - "id": "anthropic/claude-opus-5-5", - "name": "Claude Opus 5.5", - "display_name": "Claude Opus 5.5", + "id": "vertex-openai/grok-4-7", + "name": "Grok 4.7 (Vertex AI (OpenAI-compatible))", + "display_name": "Grok 4.7 (Vertex AI (OpenAI-compatible))", "modalities": { "input": [ "text", @@ -222416,10 +214398,10 @@ ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 524288, + "output": 524288 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -222428,25 +214410,24 @@ "extra_capabilities": { "reasoning": { "effort_options": [ + "minimal", "low", "medium", - "high", - "xhigh", - "max" + "high" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "knowledge": "2026-05", + "release_date": "2026-09-21", + "last_updated": "2026-09-21", "type": "chat" }, { - "id": "anthropic/claude-opus-5", - "name": "Claude Opus 5", - "display_name": "Claude Opus 5", + "id": "vertex-openai/grok-4-6", + "name": "Grok 4.6 (Vertex AI (OpenAI-compatible))", + "display_name": "Grok 4.6 (Vertex AI (OpenAI-compatible))", "modalities": { "input": [ "text", @@ -222457,10 +214438,10 @@ ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 500000, + "output": 500000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -222468,20 +214449,25 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "effort_options": [ + "minimal", + "low", + "medium", + "high" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-05", - "release_date": "2026-07-24", - "last_updated": "2026-07-24", + "knowledge": "2026-02-01", + "release_date": "2026-08-12", + "last_updated": "2026-08-12", "type": "chat" }, { - "id": "anthropic/claude-sonnet-4-6", - "name": "Claude Sonnet 4.6", - "display_name": "Claude Sonnet 4.6", + "id": "vertex-openai/grok-4-20-reasoning", + "name": "Grok 4.20 Reasoning (Vertex AI (OpenAI-compatible))", + "display_name": "Grok 4.20 Reasoning (Vertex AI (OpenAI-compatible))", "modalities": { "input": [ "text", @@ -222493,54 +214479,35 @@ ] }, "limit": { - "context": 1000000, - "output": 64000 + "context": 2000000, + "output": 30000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", "effort_options": [ "low", "medium", - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." + "high" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-17", - "last_updated": "2026-03-13", + "release_date": "2026-03-09", + "last_updated": "2026-03-09", "type": "chat" }, { - "id": "anthropic/claude-opus-4-6", - "name": "Claude Opus 4.6", - "display_name": "Claude Opus 4.6", + "id": "vertex-openai/grok-4-20-non-reasoning", + "name": "Grok 4.20 Non-Reasoning (Vertex AI (OpenAI-compatible))", + "display_name": "Grok 4.20 Non-Reasoning (Vertex AI (OpenAI-compatible))", "modalities": { "input": [ "text", @@ -222552,124 +214519,88 @@ ] }, "limit": { - "context": 200000, - "output": 128000 + "context": 2000000, + "output": 30000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": false + "supported": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." - ] + "supported": true } }, "attachment": true, "open_weights": false, - "knowledge": "2025-05-31", - "release_date": "2026-02-05", - "last_updated": "2026-03-13", + "release_date": "2026-03-09", + "last_updated": "2026-03-09", "type": "chat" }, { - "id": "anthropic/claude-opus-4-8", - "name": "Claude Opus 4.8", - "display_name": "Claude Opus 4.8", + "id": "scx-ai/minimax-m2.7", + "name": "MiniMax M2.7 (SCX.ai (Turbo))", + "display_name": "MiniMax M2.7 (SCX.ai (Turbo))", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 196608, + "output": 196608 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "high", + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ "low", "medium", "high", "xhigh", "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-01", - "release_date": "2026-05-28", - "last_updated": "2026-05-28", + "attachment": false, + "open_weights": true, + "release_date": "2026-03-18", + "last_updated": "2026-03-18", "type": "chat" }, { - "id": "anthropic/claude-fable-5", - "name": "Claude Fable 5", - "display_name": "Claude Fable 5", + "id": "scx-ai/gpt-oss-120b", + "name": "GPT OSS 120B (SCX.ai (Turbo))", + "display_name": "GPT OSS 120B (SCX.ai (Turbo))", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 131072, + "output": 32768 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -222678,76 +214609,24 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", "effort_options": [ "low", "medium", - "high", - "xhigh", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", - "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", - "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." + "high" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-09", - "last_updated": "2026-06-09", - "type": "chat" - } - ] - }, - "infomaniak": { - "id": "infomaniak", - "name": "Infomaniak", - "display_name": "Infomaniak", - "api": "https://api.infomaniak.com/2/ai/${INFOMANIAK_PRODUCT_ID}/openai/v1", - "doc": "https://www.infomaniak.com/en/hosting/ai-services/open-source-models", - "models": [ - { - "id": "mini_lm_l12_v2", - "name": "All-MiniLM-L12-v2", - "display_name": "All-MiniLM-L12-v2", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 128, - "output": 384 - }, - "temperature": false, - "tool_call": false, - "reasoning": { - "supported": false - }, "attachment": false, "open_weights": true, - "release_date": "2021-08-30", - "last_updated": "2021-08-30", - "type": "embedding" + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", + "type": "chat" }, { - "id": "bge_multilingual_gemma2", - "name": "BGE Multilingual Gemma2", - "display_name": "BGE Multilingual Gemma2", + "id": "scx-ai/qwen3-32b", + "name": "Qwen3 32B (SCX.ai (Turbo))", + "display_name": "Qwen3 32B (SCX.ai (Turbo))", "modalities": { "input": [ "text" @@ -222757,36 +214636,8 @@ ] }, "limit": { - "context": 8000, - "output": 3584 - }, - "temperature": false, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": true, - "release_date": "2024-07-25", - "last_updated": "2026-08-01", - "type": "embedding" - }, - { - "id": "Qwen/Qwen3.5-122B-A10B-FP8", - "name": "Qwen3.5 122B-A10B FP8", - "display_name": "Qwen3.5 122B-A10B FP8", - "modalities": { - "input": [ - "text", - "image" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 200000, - "output": 65536 + "context": 32768, + "output": 8192 }, "temperature": true, "tool_call": true, @@ -222805,30 +214656,32 @@ ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-02-23", - "last_updated": "2026-02-23", + "knowledge": "2025-04", + "release_date": "2025-04-28", + "last_updated": "2025-04-28", "type": "chat" }, { - "id": "Qwen/Qwen3.5-397B-A17B-FP8", - "name": "Qwen3.5 397B-A17B FP8", - "display_name": "Qwen3.5 397B-A17B FP8", + "id": "azure/gpt-5.6-terra", + "name": "GPT-5.6 Terra (Azure)", + "display_name": "GPT-5.6 Terra (Azure)", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 65536 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -222837,72 +214690,105 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, - "open_weights": true, - "release_date": "2026-02-15", - "last_updated": "2026-02-15", + "open_weights": false, + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "nvidia/NVIDIA-Nemotron-3-Nano-30B-A3B-FP8", - "name": "Nemotron 3 Nano 30B A3B FP8", - "display_name": "Nemotron 3 Nano 30B A3B FP8", + "id": "azure/gpt-5.4", + "name": "GPT-5.4 (Azure)", + "display_name": "GPT-5.4 (Azure)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 262144 + "context": 1050000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-06-25", - "release_date": "2025-12-15", - "last_updated": "2025-12-15", + "attachment": true, + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-03-05", + "last_updated": "2026-03-05", "type": "chat" }, { - "id": "google/gemma-4-31B-it", - "name": "Gemma 4 31B IT", - "display_name": "Gemma 4 31B IT", + "id": "azure/gpt-5.6-sol", + "name": "GPT-5.6 Sol (Azure)", + "display_name": "GPT-5.6 Sol (Azure)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 100000, - "output": 32768 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -222910,20 +214796,38 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "attachment": true, + "open_weights": false, + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "moonshotai/Kimi-K2.6", - "name": "Kimi K2.6", - "display_name": "Kimi K2.6", + "id": "azure/gpt-5.4-mini", + "name": "GPT-5.4 Mini (Azure)", + "display_name": "GPT-5.4 Mini (Azure)", "modalities": { "input": [ "text", @@ -222934,45 +214838,61 @@ ] }, "limit": { - "context": 256000, - "output": 256000 + "context": 400000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-20", - "last_updated": "2026-04-20", + "attachment": true, + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-03-17", + "last_updated": "2026-03-17", "type": "chat" }, { - "id": "swiss-ai/Apertus-v1.5-70B", - "name": "Apertus v1.5 70B", - "display_name": "Apertus v1.5 70B", + "id": "azure/gpt-4o", + "name": "GPT-4o (Azure)", + "display_name": "GPT-4o (Azure)", "modalities": { "input": [ "text", "image", - "audio" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 100000, - "output": 8192 + "context": 128000, + "output": 16384 }, "temperature": true, "tool_call": true, @@ -222980,15 +214900,16 @@ "supported": false }, "attachment": true, - "open_weights": true, - "release_date": "2026-07-24", - "last_updated": "2026-08-01", + "open_weights": false, + "knowledge": "2023-09", + "release_date": "2024-05-13", + "last_updated": "2024-08-06", "type": "chat" }, { - "id": "mistralai/Ministral-3-14B-Instruct-2512", - "name": "Ministral 3 14B Instruct", - "display_name": "Ministral 3 14B Instruct", + "id": "azure/gpt-5.1-codex-mini", + "name": "GPT-5.1 Codex mini (Azure)", + "display_name": "GPT-5.1 Codex mini (Azure)", "modalities": { "input": [ "text", @@ -222999,38 +214920,62 @@ ] }, "limit": { - "context": 100000, - "output": 25600 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } }, "attachment": true, - "open_weights": true, - "release_date": "2025-12-02", - "last_updated": "2025-12-02", + "open_weights": false, + "knowledge": "2024-09-30", + "release_date": "2025-11-13", + "last_updated": "2025-11-13", "type": "chat" }, { - "id": "mistralai/Mistral-Small-4-119B-2603", - "name": "Mistral Small 4", - "display_name": "Mistral Small 4", + "id": "azure/gpt-5.6-luna", + "name": "GPT-5.6 Luna (Azure)", + "display_name": "GPT-5.6 Luna (Azure)", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 256000 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -223039,116 +214984,134 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-06", - "release_date": "2026-03-16", - "last_updated": "2026-03-16", + "open_weights": false, + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" - } - ] - }, - "nano-gpt": { - "id": "nano-gpt", - "name": "NanoGPT", - "display_name": "NanoGPT", - "api": "https://nano-gpt.com/api/v1", - "doc": "https://docs.nano-gpt.com", - "models": [ + }, { - "id": "deepseek-chat", - "name": "DeepSeek V3/Deepseek Chat", - "display_name": "DeepSeek V3/Deepseek Chat", + "id": "azure/gpt-5.1-codex", + "name": "GPT-5.1 Codex (Azure)", + "display_name": "GPT-5.1 Codex (Azure)", "modalities": { "input": [ "text", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 400000, + "output": 272000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-09", - "release_date": "2025-12-01", - "last_updated": "2026-02-28", + "open_weights": false, + "knowledge": "2024-09-30", + "release_date": "2025-11-13", + "last_updated": "2025-11-13", "type": "chat" }, { - "id": "Qwen3.5-27B-BlueStar-v3-Derestricted", - "name": "Qwen3.5 27B BlueStar v3 Derestricted", - "display_name": "Qwen3.5 27B BlueStar v3 Derestricted", + "id": "azure/gpt-4.1", + "name": "GPT-4.1 (Azure)", + "display_name": "GPT-4.1 (Azure)", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 16384 + "context": 1000000, + "output": 32768 }, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "none", - "high" - ] - } + "supported": false }, "attachment": true, - "open_weights": true, - "release_date": "2026-04-30", - "last_updated": "2026-04-30", + "open_weights": false, + "knowledge": "2024-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", "type": "chat" }, { - "id": "gemini-2.5-flash-preview-05-20", - "name": "Gemini 2.5 Flash 0520", - "display_name": "Gemini 2.5 Flash 0520", + "id": "azure/gpt-5.3-codex", + "name": "GPT-5.3 Codex (Azure)", + "display_name": "GPT-5.3 Codex (Azure)", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048000, - "output": 65536 + "context": 400000, + "output": 128000 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, "default": true @@ -223157,33 +215120,34 @@ "reasoning": { "supported": true, "default_enabled": true, - "mode": "budget", - "budget": { - "default": -1, - "min": 0, - "max": 24576, - "auto": -1, - "off": 0, - "unit": "tokens" - }, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-05-20", - "last_updated": "2025-05-20", + "knowledge": "2025-08-31", + "release_date": "2026-02-05", + "last_updated": "2026-02-05", "type": "chat" }, { - "id": "longcat-2.5-preview", - "name": "LongCat 2.5 Preview", - "display_name": "LongCat 2.5 Preview", + "id": "azure/gpt-5.1", + "name": "GPT-5.1 (Azure)", + "display_name": "GPT-5.1 (Azure)", "modalities": { "input": [ "text", @@ -223194,53 +215158,90 @@ ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 400000, + "output": 128000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } }, "attachment": true, "open_weights": false, - "release_date": "2026-09-25", - "last_updated": "2026-09-25", + "knowledge": "2024-09-30", + "release_date": "2025-11-13", + "last_updated": "2025-11-13", "type": "chat" }, { - "id": "gemini-exp-1206", - "name": "Gemini 2.0 Pro 1206", - "display_name": "Gemini 2.0 Pro 1206", + "id": "azure/gpt-6-luna", + "name": "GPT-6 Luna (Azure)", + "display_name": "GPT-6 Luna (Azure)", "modalities": { "input": [ "text", "image", - "audio" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 2097152, - "output": 8192 + "context": 1050000, + "output": 128000 }, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ] + } }, "attachment": true, "open_weights": false, - "release_date": "2024-12-06", - "last_updated": "2024-12-06", + "knowledge": "2026-05-18", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "gemma-4-31b-it-garnet", - "name": "Garnet", - "display_name": "Garnet", + "id": "azure/gpt-5-mini", + "name": "GPT-5 Mini (Azure)", + "display_name": "GPT-5 Mini (Azure)", "modalities": { "input": [ "text", @@ -223251,37 +215252,62 @@ ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 400000, + "output": 128000 }, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "minimal", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, "attachment": true, - "open_weights": true, - "release_date": "2026-07-29", - "last_updated": "2026-07-29", + "open_weights": false, + "knowledge": "2024-05-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "Gemma-4-31B-AssGuard", - "name": "Gemma 4 31B AssGuard", - "display_name": "Gemma 4 31B AssGuard", + "id": "azure/gpt-6-sol", + "name": "GPT-6 Sol (Azure)", + "display_name": "GPT-6 Sol (Azure)", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1050000, + "output": 128000 }, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -223291,20 +215317,25 @@ "reasoning": { "effort_options": [ "none", - "high" + "low", + "medium", + "high", + "xhigh", + "max" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-05-15", - "last_updated": "2026-05-15", + "open_weights": false, + "knowledge": "2026-04-20", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "phi-4-mini-instruct", - "name": "Phi 4 Mini", - "display_name": "Phi 4 Mini", + "id": "azure/gpt-oss-120b", + "name": "GPT OSS 120B (Azure)", + "display_name": "GPT OSS 120B (Azure)", "modalities": { "input": [ "text" @@ -223314,53 +215345,36 @@ ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 131072, + "output": 32768 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-02-26", - "last_updated": "2025-02-26", - "type": "chat" - }, - { - "id": "command-a-reasoning-08-2025", - "name": "Cohere Command A (08/2025)", - "display_name": "Cohere Command A (08/2025)", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 256000, - "output": 8192 + "supported": true, + "default": true }, - "temperature": true, - "tool_call": false, - "reasoning": { - "supported": false + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "low", + "medium", + "high" + ] + } }, "attachment": false, "open_weights": true, - "knowledge": "2024-06-01", - "release_date": "2025-08-21", - "last_updated": "2025-08-21", + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "gemma-4-31b-it-fabled", - "name": "Fabled", - "display_name": "Fabled", + "id": "azure/gpt-5.4-pro", + "name": "GPT-5.4 Pro (Azure)", + "display_name": "GPT-5.4 Pro (Azure)", "modalities": { "input": [ "text", @@ -223371,39 +215385,60 @@ ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 1050000, + "output": 128000 }, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, "attachment": true, - "open_weights": true, - "release_date": "2026-07-29", - "last_updated": "2026-07-29", + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-03-05", + "last_updated": "2026-03-05", "type": "chat" }, { - "id": "gemini-2.5-flash-preview-09-2025-thinking", - "name": "Gemini 2.5 Flash Preview (09/2025) – Thinking", - "display_name": "Gemini 2.5 Flash Preview (09/2025) – Thinking", + "id": "azure/gpt-5", + "name": "GPT-5 (Azure)", + "display_name": "GPT-5 (Azure)", "modalities": { "input": [ "text", - "image", - "audio", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 400000, + "output": 128000 }, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -223413,113 +215448,180 @@ "reasoning": { "supported": true, "default_enabled": true, - "mode": "budget", - "budget": { - "default": -1, - "min": 0, - "max": 24576, - "auto": -1, - "off": 0, - "unit": "tokens" - }, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] + "mode": "effort", + "effort": "medium", + "effort_options": [ + "minimal", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "release_date": "2025-09-25", - "last_updated": "2025-09-25", + "knowledge": "2024-09-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "auto-model-premium", - "name": "Auto model (Premium)", - "display_name": "Auto model (Premium)", + "id": "azure/gpt-6.1-sol", + "name": "GPT-6.1 Sol (Azure)", + "display_name": "GPT-6.1 Sol (Azure)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 1000000 + "context": 1050000, + "output": 128000 }, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + }, + "attachment": true, "open_weights": false, - "release_date": "2025-04-16", - "last_updated": "2024-06-01", + "knowledge": "2026-04-30", + "release_date": "2026-09-29", + "last_updated": "2026-09-29", "type": "chat" }, { - "id": "gemma-4-26b-a4b-it-musica", - "name": "Musica", - "display_name": "Musica", + "id": "azure/gpt-5.2-codex", + "name": "GPT-5.2 Codex (Azure)", + "display_name": "GPT-5.2 Codex (Azure)", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 400000, + "output": 128000 }, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, "attachment": true, - "open_weights": true, - "release_date": "2026-07-29", - "last_updated": "2026-07-29", + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2025-12-11", + "last_updated": "2025-12-11", "type": "chat" }, { - "id": "pokee-isaac", - "name": "Pokee-Isaac 28B", - "display_name": "Pokee-Isaac 28B", + "id": "azure/gpt-5.2", + "name": "GPT-5.2 (Azure)", + "display_name": "GPT-5.2 (Azure)", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 10000000, - "output": 60000 + "context": 400000, + "output": 128000 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, "open_weights": false, - "release_date": "2026-08-04", - "last_updated": "2026-08-04", + "knowledge": "2025-08-31", + "release_date": "2025-12-11", + "last_updated": "2025-12-11", "type": "chat" }, { - "id": "glm-4.1v-thinking-flash", - "name": "GLM 4.1V Thinking Flash", - "display_name": "GLM 4.1V Thinking Flash", + "id": "azure/gpt-5.4-nano", + "name": "GPT-5.4 Nano (Azure)", + "display_name": "GPT-5.4 Nano (Azure)", "modalities": { "input": [ "text", @@ -223530,29 +215632,52 @@ ] }, "limit": { - "context": 64000, - "output": 8192 + "context": 400000, + "output": 128000 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } }, "attachment": true, "open_weights": false, - "release_date": "2025-07-09", - "last_updated": "2025-07-09", + "knowledge": "2025-08-31", + "release_date": "2026-03-17", + "last_updated": "2026-03-17", "type": "chat" }, { - "id": "gemini-2.5-flash-nothinking", - "name": "Gemini 2.5 Flash (No Thinking)", - "display_name": "Gemini 2.5 Flash (No Thinking)", + "id": "azure/gpt-5.5", + "name": "GPT-5.5 (Azure)", + "display_name": "GPT-5.5 (Azure)", "modalities": { "input": [ "text", "image", - "video", - "audio", "pdf" ], "output": [ @@ -223560,10 +215685,11 @@ ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 1050000, + "output": 128000 }, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { "supported": true, "default": true @@ -223572,128 +215698,170 @@ "reasoning": { "supported": true, "default_enabled": true, - "mode": "budget", - "budget": { - "default": -1, - "min": 0, - "max": 24576, - "auto": -1, - "off": 0, - "unit": "tokens" - }, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "release_date": "2025-06-05", - "last_updated": "2025-06-05", + "knowledge": "2025-12-01", + "release_date": "2026-04-23", + "last_updated": "2026-04-23", "type": "chat" }, { - "id": "doubao-seed-2-0-code-preview-260215", - "name": "Doubao Seed 2.0 Code Preview", - "display_name": "Doubao Seed 2.0 Code Preview", + "id": "azure/gpt-4.1-mini", + "name": "GPT-4.1 Mini (Azure)", + "display_name": "GPT-4.1 Mini (Azure)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 128000 + "context": 1000000, + "output": 32768 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-02-14", - "last_updated": "2026-02-14", + "knowledge": "2024-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", "type": "chat" }, { - "id": "gemma-4-31b-it-gemsicle", - "name": "Gemsicle", - "display_name": "Gemsicle", + "id": "azure/gpt-6-astra", + "name": "GPT-6 Astra (Azure)", + "display_name": "GPT-6 Astra (Azure)", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 1050000, + "output": 128000 }, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + }, "attachment": true, - "open_weights": true, - "release_date": "2026-07-29", - "last_updated": "2026-07-29", + "open_weights": false, + "knowledge": "2026-04-30", + "release_date": "2026-09-04", + "last_updated": "2026-09-04", "type": "chat" }, { - "id": "gemma-4-12b-it-semancer", - "name": "Gemma 4 12B Semancer", - "display_name": "Gemma 4 12B Semancer", + "id": "azure/gpt-5-nano", + "name": "GPT-5 Nano (Azure)", + "display_name": "GPT-5 Nano (Azure)", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 400000, + "output": 128000 }, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": true, - "open_weights": true, - "release_date": "2026-09-09", - "last_updated": "2026-09-09", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "minimal", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": false, + "open_weights": false, + "knowledge": "2024-05-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "Gemma-4-31B-Fabled", - "name": "Gemma 4 31B Fabled (ArliAI)", - "display_name": "Gemma 4 31B Fabled (ArliAI)", + "id": "consensusprotocol/gpt-oss-20b", + "name": "GPT OSS 20B (Consensus Protocol)", + "display_name": "GPT OSS 20B (Consensus Protocol)", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 128000, + "output": 32768 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -223701,35 +215869,38 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ - "none", + "low", + "medium", "high" ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-05-02", - "last_updated": "2026-05-02", + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "Gemma-4-31B-SDFT-Heretic-RP", - "name": "Gemma 4 31B SDFT Heretic RP", - "display_name": "Gemma 4 31B SDFT Heretic RP", + "id": "consensusprotocol/deepseek-v4-flash", + "name": "DeepSeek V4 Flash (Consensus Protocol)", + "display_name": "DeepSeek V4 Flash (Consensus Protocol)", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1000000, + "output": 384000 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -223737,22 +215908,37 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", "effort_options": [ - "none", - "high" + "low", + "high", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-05-15", - "last_updated": "2026-05-15", + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "gemma-4-26b-a4b-it-luminous", - "name": "Luminous Mirror", - "display_name": "Luminous Mirror", + "id": "consensusprotocol/deepseek-v4.1-flash", + "name": "DeepSeek V4.1 Flash (Consensus Protocol)", + "display_name": "DeepSeek V4.1 Flash (Consensus Protocol)", "modalities": { "input": [ "text", @@ -223763,51 +215949,79 @@ ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 1048576, + "output": 384000 }, + "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "low", + "high", + "xhigh", + "max" + ] + } }, "attachment": true, "open_weights": true, - "release_date": "2026-07-29", - "last_updated": "2026-07-29", + "knowledge": "2025-05", + "release_date": "2026-09-10", + "last_updated": "2026-09-10", "type": "chat" }, { - "id": "gemma-4-31b-it-scarlet", - "name": "Gemma 4 31B Scarlet", - "display_name": "Gemma 4 31B Scarlet", + "id": "consensusprotocol/minimax-m3", + "name": "MiniMax M3 (Consensus Protocol)", + "display_name": "MiniMax M3 (Consensus Protocol)", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 1048576, + "output": 512000 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": true, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "none", + "minimal", + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + }, + "attachment": false, "open_weights": true, - "release_date": "2026-10-08", - "last_updated": "2026-10-08", + "release_date": "2026-06-01", + "last_updated": "2026-06-01", "type": "chat" }, { - "id": "deepseek-v3-0324", - "name": "DeepSeek Chat 0324", - "display_name": "DeepSeek Chat 0324", + "id": "consensusprotocol/gemma-4-31b-it", + "name": "Gemma 4 31B IT (Consensus Protocol)", + "display_name": "Gemma 4 31B IT (Consensus Protocol)", "modalities": { "input": [ "text" @@ -223817,37 +216031,52 @@ ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 262144, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "none", + "high", + "xhigh", + "max" + ] + } }, "attachment": false, "open_weights": true, - "release_date": "2025-03-24", - "last_updated": "2025-03-24", + "knowledge": "2025-01", + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "Gemma-4-31B-Novelist", - "name": "Gemma 4 31B Novelist (ArliAI)", - "display_name": "Gemma 4 31B Novelist (ArliAI)", + "id": "consensusprotocol/Qwen3.8-27B", + "name": "Qwen3.8 27B (Consensus Protocol)", + "display_name": "Qwen3.8 27B (Consensus Protocol)", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 262000, + "output": 32768 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -223856,21 +216085,22 @@ "extra_capabilities": { "reasoning": { "effort_options": [ - "none", - "high" + "low", + "medium", + "xhigh" ] } }, "attachment": true, "open_weights": true, - "release_date": "2026-05-15", - "last_updated": "2026-05-15", + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "claw-medium", - "name": "Claw Medium", - "display_name": "Claw Medium", + "id": "consensusprotocol/mimo-v2.6-flash", + "name": "MiMo V2.6 Flash (Consensus Protocol)", + "display_name": "MiMo V2.6 Flash (Consensus Protocol)", "modalities": { "input": [ "text" @@ -223883,6 +216113,7 @@ "context": 1048576, "output": 131072 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -223891,145 +216122,243 @@ "extra_capabilities": { "reasoning": { "effort_options": [ + "none", + "minimal", "low", + "medium", "high", + "xhigh", "max" ] } }, "attachment": false, - "open_weights": false, - "release_date": "2026-05-11", - "last_updated": "2026-05-11", + "open_weights": true, + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "gemma-4-31b-it-isometry", - "name": "Isometry", - "display_name": "Isometry", + "id": "consensusprotocol/glm-5.3-flash", + "name": "GLM-5.3 Flash (Consensus Protocol)", + "display_name": "GLM-5.3 Flash (Consensus Protocol)", "modalities": { "input": [ "text", - "image" + "image", + "video", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 1048576, + "output": 131072 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "low", + "high", + "max" + ] + } + }, "attachment": true, "open_weights": true, - "release_date": "2026-07-29", - "last_updated": "2026-07-29", + "release_date": "2026-08-26", + "last_updated": "2026-08-26", "type": "chat" }, { - "id": "gemma-4-26b-a4b-it-moonlight", - "name": "Moonlight Dusk", - "display_name": "Moonlight Dusk", + "id": "aws-bedrock/claude-sonnet-4-5", + "name": "Claude Sonnet 4.5 (AWS Bedrock)", + "display_name": "Claude Sonnet 4.5 (AWS Bedrock)", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 200000, + "output": 8192 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + ] + } }, "attachment": true, - "open_weights": true, - "release_date": "2026-07-29", - "last_updated": "2026-07-29", + "open_weights": false, + "knowledge": "2025-07-31", + "release_date": "2025-09-29", + "last_updated": "2025-09-29", "type": "chat" }, { - "id": "fastgpt", - "name": "Web Answer", - "display_name": "Web Answer", + "id": "aws-bedrock/claude-fable-5", + "name": "Claude Fable 5 (AWS Bedrock)", + "display_name": "Claude Fable 5 (AWS Bedrock)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 32768, - "output": 32768 + "context": 1000000, + "output": 128000 }, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", + "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", + "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." + ] + } + }, + "attachment": true, "open_weights": false, - "release_date": "2025-12-23", - "last_updated": "2024-01-01", + "knowledge": "2026-01-31", + "release_date": "2026-06-09", + "last_updated": "2026-06-09", "type": "chat" }, { - "id": "gemma-4-26b-a4b-it-chimeraxheretic", - "name": "Gemma 4 26B A4B Chimera X Heretic", - "display_name": "Gemma 4 26B A4B Chimera X Heretic", + "id": "aws-bedrock/claude-haiku-4-5", + "name": "Claude Haiku 4.5 (AWS Bedrock)", + "display_name": "Claude Haiku 4.5 (AWS Bedrock)", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 200000, + "output": 64000 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + ] + } }, "attachment": true, - "open_weights": true, - "release_date": "2026-10-08", - "last_updated": "2026-10-08", + "open_weights": false, + "knowledge": "2025-02-28", + "release_date": "2025-10-15", + "last_updated": "2025-10-15", "type": "chat" }, { - "id": "agnes-3.0-flash", - "name": "Agnes 3.0 Flash", - "display_name": "Agnes 3.0 Flash", + "id": "aws-bedrock/grok-4-3", + "name": "Grok 4.3 (AWS Bedrock)", + "display_name": "Grok 4.3 (AWS Bedrock)", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 524288, - "output": 65536 + "context": 1000000, + "output": 131072 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -224037,22 +216366,28 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "effort_options": [ + "none", + "low", + "medium", + "high" + ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-09-09", - "last_updated": "2026-09-09", + "release_date": "2026-04-17", + "last_updated": "2026-04-17", "type": "chat" }, { - "id": "kimi-k2-instruct-fast", - "name": "Kimi K2 0711 Fast", - "display_name": "Kimi K2 0711 Fast", + "id": "aws-bedrock/claude-sonnet-4-6", + "name": "Claude Sonnet 4.6 (AWS Bedrock)", + "display_name": "Claude Sonnet 4.6 (AWS Bedrock)", "modalities": { "input": [ "text", + "image", "pdf" ], "output": [ @@ -224060,89 +216395,167 @@ ] }, "limit": { - "context": 131072, - "output": 16384 + "context": 1000000, + "output": 64000 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." + ] + } }, "attachment": true, - "open_weights": true, - "release_date": "2025-07-11", - "last_updated": "2025-07-11", + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-02-17", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "synth-2.5-flash", - "name": "Synth 2.5 Flash Preview", - "display_name": "Synth 2.5 Flash Preview", + "id": "aws-bedrock/grok-4-7", + "name": "Grok 4.7 (AWS Bedrock)", + "display_name": "Grok 4.7 (AWS Bedrock)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 30000, - "output": 30000 + "context": 524288, + "output": 524288 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "high", + "xhigh" + ] + } + }, + "attachment": true, "open_weights": false, - "release_date": "2026-09-05", - "last_updated": "2026-09-05", + "knowledge": "2026-05", + "release_date": "2026-09-21", + "last_updated": "2026-09-21", "type": "chat" }, { - "id": "doubao-1.5-pro-256k", - "name": "Doubao 1.5 Pro 256k", - "display_name": "Doubao 1.5 Pro 256k", + "id": "aws-bedrock/claude-opus-4-7", + "name": "Claude Opus 4.7 (AWS Bedrock)", + "display_name": "Claude Opus 4.7 (AWS Bedrock)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 16384 + "context": 1000000, + "output": 128000 }, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." + ] + } + }, + "attachment": true, "open_weights": false, - "release_date": "2025-03-12", - "last_updated": "2025-03-12", + "knowledge": "2026-01-31", + "release_date": "2026-04-16", + "last_updated": "2026-04-16", "type": "chat" }, { - "id": "Gemma-4-31B-Gembrain-X-Core", - "name": "Gemma 4 31B Gembrain X Core", - "display_name": "Gemma 4 31B Gembrain X Core", + "id": "aws-bedrock/claude-fable-5-1", + "name": "Claude Fable 5.1 (AWS Bedrock)", + "display_name": "Claude Fable 5.1 (AWS Bedrock)", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1000000, + "output": 128000 }, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -224150,22 +216563,41 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", "effort_options": [ - "none", - "high" + "low", + "medium", + "high", + "xhigh", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", + "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", + "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-05-15", - "last_updated": "2026-05-15", + "open_weights": false, + "knowledge": "2026-06", + "release_date": "2026-09-01", + "last_updated": "2026-09-01", "type": "chat" }, { - "id": "gemma-4-31b-it-novelist", - "name": "Novelist", - "display_name": "Novelist", + "id": "aws-bedrock/grok-4-6", + "name": "Grok 4.6 (AWS Bedrock)", + "display_name": "Grok 4.6 (AWS Bedrock)", "modalities": { "input": [ "text", @@ -224176,27 +216608,41 @@ ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 500000, + "output": 500000 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "high", + "xhigh" + ] + } + }, "attachment": true, - "open_weights": true, - "release_date": "2026-07-29", - "last_updated": "2026-07-29", + "open_weights": false, + "knowledge": "2026-02-01", + "release_date": "2026-08-12", + "last_updated": "2026-08-12", "type": "chat" }, { - "id": "auto-model", - "name": "Auto model", - "display_name": "Auto model", + "id": "aws-bedrock/claude-opus-5-5", + "name": "Claude Opus 5.5 (AWS Bedrock)", + "display_name": "Claude Opus 5.5 (AWS Bedrock)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" @@ -224204,25 +216650,40 @@ }, "limit": { "context": 1000000, - "output": 1000000 + "output": 128000 }, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + }, + "attachment": true, "open_weights": false, - "release_date": "2025-04-16", - "last_updated": "2024-06-01", + "knowledge": "2026-06", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "asi1-mini", - "name": "ASI1 Mini", - "display_name": "ASI1 Mini", + "id": "aws-bedrock/claude-opus-4-6", + "name": "Claude Opus 4.6 (AWS Bedrock)", + "display_name": "Claude Opus 4.6 (AWS Bedrock)", "modalities": { "input": [ "text", + "image", "pdf" ], "output": [ @@ -224230,77 +216691,116 @@ ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 1000000, + "output": 128000 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." + ] + } }, "attachment": true, "open_weights": false, - "release_date": "2025-03-25", - "last_updated": "2025-03-25", + "knowledge": "2025-05-31", + "release_date": "2026-02-05", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "gemini-2.5-pro", - "name": "Gemini 2.5 Pro", - "display_name": "Gemini 2.5 Pro", + "id": "aws-bedrock/claude-opus-4-8", + "name": "Claude Opus 4.8 (AWS Bedrock)", + "display_name": "Claude Opus 4.8 (AWS Bedrock)", "modalities": { "input": [ "text", "image", - "video", - "audio" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "budget", - "budget": { - "default": -1, - "min": 128, - "max": 32768, - "auto": -1, - "unit": "tokens" - }, + "default_enabled": false, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], + "interleaved": true, "summaries": true, - "visibility": "summary", + "visibility": "omitted", "continuation": [ - "thought_signatures" + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-06-17", - "last_updated": "2025-06-17", + "knowledge": "2026-01", + "release_date": "2026-05-28", + "last_updated": "2026-05-28", "type": "chat" }, { - "id": "longcat-2.0", - "name": "LongCat 2.0", - "display_name": "LongCat 2.0", + "id": "aws-bedrock/claude-opus-5", + "name": "Claude Opus 5 (AWS Bedrock)", + "display_name": "Claude Opus 5 (AWS Bedrock)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" @@ -224308,67 +216808,95 @@ }, "limit": { "context": 1000000, - "output": 131072 + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-06-30", - "last_updated": "2026-06-30", + "attachment": true, + "open_weights": false, + "knowledge": "2026-05", + "release_date": "2026-07-24", + "last_updated": "2026-07-24", "type": "chat" }, { - "id": "Gemma-4-31B-Cognitive-Unshackled", - "name": "Gemma 4 31B Cognitive Unshackled", - "display_name": "Gemma 4 31B Cognitive Unshackled", + "id": "aws-bedrock/claude-haiku-4-5-20251001", + "name": "Claude Haiku 4.5 (2025-10-01) (AWS Bedrock)", + "display_name": "Claude Haiku 4.5 (2025-10-01) (AWS Bedrock)", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 16384 + "context": 200000, + "output": 64000 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "none", - "high" + "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-05-01", - "last_updated": "2026-05-01", + "open_weights": false, + "knowledge": "2025-02-28", + "release_date": "2025-10-15", + "last_updated": "2025-10-15", "type": "chat" }, { - "id": "auto-model-standard", - "name": "Auto model (Standard)", - "display_name": "Auto model (Standard)", + "id": "aws-bedrock/claude-haiku-5-5", + "name": "Claude Haiku 5.5 (AWS Bedrock)", + "display_name": "Claude Haiku 5.5 (AWS Bedrock)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" @@ -224376,22 +216904,37 @@ }, "limit": { "context": 1000000, - "output": 1000000 + "output": 128000 }, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + }, + "attachment": true, "open_weights": false, - "release_date": "2025-04-16", - "last_updated": "2024-06-01", + "knowledge": "2026-06", + "release_date": "2026-10-07", + "last_updated": "2026-10-07", "type": "chat" }, { - "id": "qvq-max", - "name": "Qwen: QvQ Max", - "display_name": "Qwen: QvQ Max", + "id": "aws-bedrock/llama-4-scout-17b-instruct", + "name": "Llama 4 Scout 17B Instruct (AWS Bedrock)", + "display_name": "Llama 4 Scout 17B Instruct (AWS Bedrock)", "modalities": { "input": [ "text", @@ -224402,36 +216945,40 @@ ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 8192, + "output": 2048 }, + "temperature": true, "tool_call": false, "reasoning": { "supported": false }, "attachment": true, "open_weights": true, - "release_date": "2025-03-28", - "last_updated": "2025-03-28", + "knowledge": "2024-08", + "release_date": "2025-04-05", + "last_updated": "2025-04-05", "type": "chat" }, { - "id": "Gemma-4-31B-Queen", - "name": "Gemma 4 31B Queen", - "display_name": "Gemma 4 31B Queen", + "id": "aws-bedrock/claude-sonnet-5-5", + "name": "Claude Sonnet 5.5 (AWS Bedrock)", + "display_name": "Claude Sonnet 5.5 (AWS Bedrock)", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 16384 + "context": 1000000, + "output": 128000 }, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -224440,60 +216987,84 @@ "extra_capabilities": { "reasoning": { "effort_options": [ - "none", - "high" + "low", + "medium", + "high", + "xhigh", + "max" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-05-01", - "last_updated": "2026-05-01", + "open_weights": false, + "knowledge": "2026-06", + "release_date": "2026-09-28", + "last_updated": "2026-09-28", "type": "chat" }, { - "id": "celeris-1", - "name": "Celeris 1", - "display_name": "Celeris 1", + "id": "aws-bedrock/claude-sonnet-5", + "name": "Claude Sonnet 5 (AWS Bedrock)", + "display_name": "Claude Sonnet 5 (AWS Bedrock)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 1000000, + "output": 128000 }, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + }, + "attachment": true, "open_weights": false, - "release_date": "2026-07-25", - "last_updated": "2026-07-25", + "knowledge": "2026-01-31", + "release_date": "2026-06-30", + "last_updated": "2026-06-30", "type": "chat" }, { - "id": "Gemma-4-31B-GarnetV2", - "name": "Gemma 4 31B Garnet V2", - "display_name": "Gemma 4 31B Garnet V2", + "id": "aws-bedrock/kimi-k3", + "name": "Kimi K3 (AWS Bedrock)", + "display_name": "Kimi K3 (AWS Bedrock)", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 16384 + "context": 1048576, + "output": 1048576 }, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -224501,22 +217072,56 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ "none", - "high" + "low", + "medium", + "high", + "xhigh", + "max" ] } }, "attachment": true, "open_weights": true, - "release_date": "2026-05-01", - "last_updated": "2026-05-01", + "release_date": "2026-07-16", + "last_updated": "2026-07-16", + "type": "chat" + }, + { + "id": "aws-bedrock/llama-4-maverick-17b-instruct", + "name": "Llama 4 Maverick 17B Instruct (AWS Bedrock)", + "display_name": "Llama 4 Maverick 17B Instruct (AWS Bedrock)", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 8192, + "output": 2048 + }, + "temperature": true, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": true, + "knowledge": "2024-08", + "release_date": "2025-04-05", + "last_updated": "2025-04-05", "type": "chat" }, { - "id": "glm-4-plus-0111", - "name": "GLM 4 Plus 0111", - "display_name": "GLM 4 Plus 0111", + "id": "aws-bedrock/llama-3.1-70b-instruct", + "name": "Llama 3.1 70B Instruct (AWS Bedrock)", + "display_name": "Llama 3.1 70B Instruct (AWS Bedrock)", "modalities": { "input": [ "text" @@ -224527,197 +217132,304 @@ }, "limit": { "context": 128000, - "output": 4096 + "output": 2048 }, + "temperature": true, "tool_call": false, "reasoning": { "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2025-02-19", - "last_updated": "2025-02-19", + "open_weights": true, + "knowledge": "2023-12", + "release_date": "2024-07-23", + "last_updated": "2024-07-23", "type": "chat" }, { - "id": "Gemma-4-31B-Dark-Gemistry", - "name": "Gemma 4 31B Dark Gemistry", - "display_name": "Gemma 4 31B Dark Gemistry", + "id": "aws-bedrock/claude-sonnet-4-5-20250929", + "name": "Claude Sonnet 4.5 (2025-09-29) (AWS Bedrock)", + "display_name": "Claude Sonnet 4.5 (2025-09-29) (AWS Bedrock)", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 200000, + "output": 8192 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "none", - "high" + "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-05-15", - "last_updated": "2026-05-15", + "open_weights": false, + "knowledge": "2025-07-31", + "release_date": "2025-09-29", + "last_updated": "2025-09-29", "type": "chat" }, { - "id": "holo3-35b-a3b:thinking", - "name": "Holo3-35B-A3B Thinking", - "display_name": "Holo3-35B-A3B Thinking", + "id": "aws-bedrock/claude-opus-4-5-20251101", + "name": "Claude Opus 4.5 (AWS Bedrock)", + "display_name": "Claude Opus 4.5 (AWS Bedrock)", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 65536, - "output": 8192 + "context": 200000, + "output": 32000 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", + "effort_options": [ + "low", + "medium", + "high" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." + ] + } }, "attachment": true, - "open_weights": true, - "release_date": "2024-01-01", - "last_updated": "2024-01-01", + "open_weights": false, + "knowledge": "2025-05", + "release_date": "2025-11-24", + "last_updated": "2025-11-24", "type": "chat" }, { - "id": "auto-model-basic", - "name": "Auto model (Basic)", - "display_name": "Auto model (Basic)", + "id": "fireworks/deepseek-v4.1-flash", + "name": "DeepSeek V4.1 Flash (Fireworks AI)", + "display_name": "DeepSeek V4.1 Flash (Fireworks AI)", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 1000000 + "context": 1048576, + "output": 393216 }, + "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": false, - "release_date": "2025-04-16", - "last_updated": "2024-06-01", + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + }, + "attachment": true, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-09-10", + "last_updated": "2026-09-10", "type": "chat" }, { - "id": "gemini-2.0-pro-reasoner", - "name": "Gemini 2.0 Pro Reasoner", - "display_name": "Gemini 2.0 Pro Reasoner", + "id": "fireworks/glm-5.3", + "name": "GLM-5.3 (Fireworks AI)", + "display_name": "GLM-5.3 (Fireworks AI)", "modalities": { "input": [ - "text", - "audio" + "text" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 65536 + "context": 1048576, + "output": 131072 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, - "open_weights": false, - "release_date": "2024-01-01", - "last_updated": "2025-02-05", + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "xhigh", + "max" + ] + } + }, + "attachment": false, + "open_weights": true, + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "doubao-seed-2-0-pro-260215", - "name": "Doubao Seed 2.0 Pro", - "display_name": "Doubao Seed 2.0 Pro", + "id": "fireworks/kimi-k3-fast", + "name": "Kimi K3 Fast (Fireworks AI)", + "display_name": "Kimi K3 Fast (Fireworks AI)", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 128000 + "context": 1040384, + "output": 1040384 }, "temperature": false, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": false, - "release_date": "2026-02-14", - "last_updated": "2026-02-14", + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + }, + "attachment": true, + "open_weights": true, + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" }, { - "id": "mistral-code-latest", - "name": "Mistral Code Latest", - "display_name": "Mistral Code Latest", + "id": "fireworks/kimi-k3", + "name": "Kimi K3 (Fireworks AI)", + "display_name": "Kimi K3 (Fireworks AI)", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 32768 + "context": 1040384, + "output": 1040384 }, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": false, - "release_date": "2026-06-02", - "last_updated": "2026-06-02", + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + }, + "attachment": true, + "open_weights": true, + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" }, { - "id": "gemini-2.5-flash-lite-preview-09-2025", - "name": "Gemini 2.5 Flash Lite Preview (09/2025)", - "display_name": "Gemini 2.5 Flash Lite Preview (09/2025)", + "id": "fireworks/glm-5.3-flash", + "name": "GLM-5.3 Flash (Fireworks AI)", + "display_name": "GLM-5.3 Flash (Fireworks AI)", "modalities": { "input": [ "text", "image", - "audio", + "video", "pdf" ], "output": [ @@ -224726,72 +217438,81 @@ }, "limit": { "context": 1048576, - "output": 65536 + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "default": -1, - "min": 512, - "max": 24576, - "auto": -1, - "unit": "tokens" - }, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" + "effort_options": [ + "xhigh", + "max" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-09-25", - "last_updated": "2025-09-25", + "open_weights": true, + "release_date": "2026-08-26", + "last_updated": "2026-08-26", "type": "chat" }, { - "id": "gemma-4-31b-it-gembrain", - "name": "Gembrain", - "display_name": "Gembrain", + "id": "cerebras/gpt-oss-120b", + "name": "GPT OSS 120B (Cerebras)", + "display_name": "GPT OSS 120B (Cerebras)", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, + "context": 131072, "output": 32768 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": true, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "low", + "medium", + "high" + ] + } + }, + "attachment": false, "open_weights": true, - "release_date": "2026-07-29", - "last_updated": "2026-07-29", + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" - }, + } + ] + }, + "kimi-code-plan-cn": { + "id": "kimi-code-plan-cn", + "name": "Kimi For Coding (kimi.com)", + "display_name": "Kimi For Coding (kimi.com)", + "api": "https://api.kimi.com/coding/v1", + "doc": "https://www.kimi.com/code/docs/en/kimi-code/models.html", + "models": [ { - "id": "Gemma-4-31B-Gembrain-uncensored-heretic", - "name": "Gemma 4 31B Gembrain Uncensored Heretic", - "display_name": "Gemma 4 31B Gembrain Uncensored Heretic", + "id": "k3-256k", + "name": "Kimi K3-256K", + "display_name": "Kimi K3-256K", "modalities": { "input": [ "text", @@ -224803,8 +217524,9 @@ }, "limit": { "context": 262144, - "output": 262144 + "output": 131072 }, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -224812,149 +217534,228 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ "none", - "high" + "low", + "high", + "max" ] } }, "attachment": true, "open_weights": true, - "release_date": "2026-05-15", - "last_updated": "2026-05-15", + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" }, { - "id": "glm-4-air-0111", - "name": "GLM 4 Air 0111", - "display_name": "GLM 4 Air 0111", + "id": "kimi-for-coding-highspeed", + "name": "Kimi For Coding HighSpeed", + "display_name": "Kimi For Coding HighSpeed", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 262144, + "output": 32768 }, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": false, - "release_date": "2025-01-11", - "last_updated": "2025-01-11", + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": true, + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-06-12", + "last_updated": "2026-06-12", "type": "chat" }, { - "id": "doubao-1.5-vision-pro-32k", - "name": "Doubao 1.5 Vision Pro 32k", - "display_name": "Doubao 1.5 Vision Pro 32k", + "id": "k3.1-pro-highspeed", + "name": "Kimi K3.1 Pro Highspeed", + "display_name": "Kimi K3.1 Pro Highspeed", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 32000, - "output": 8192 + "context": 1048576, + "output": 131072 }, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "low", + "high", + "max" + ] + } }, "attachment": true, "open_weights": false, - "release_date": "2024-11-20", - "last_updated": "2025-01-22", + "release_date": "2026-10-23", + "last_updated": "2026-10-23", "type": "chat" }, { - "id": "ernie-5.0-thinking-preview", - "name": "Ernie 5.0 Thinking Preview", - "display_name": "Ernie 5.0 Thinking Preview", + "id": "kimi-for-coding", + "name": "Kimi K2.8 Preview", + "display_name": "Kimi K2.8 Preview", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 1048576, + "output": 32768 }, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "none", + "low", + "high", + "max" + ] } }, "attachment": true, "open_weights": false, - "release_date": "2025-11-18", - "last_updated": "2025-11-18", + "release_date": "2026-09-11", + "last_updated": "2026-09-11", "type": "chat" }, { - "id": "longcat-2.0:thinking", - "name": "LongCat 2.0 Thinking", - "display_name": "LongCat 2.0 Thinking", + "id": "k3", + "name": "Kimi K3", + "display_name": "Kimi K3", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, + "context": 1048576, "output": 131072 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "none", + "low", + "high", + "max" + ] + } + }, + "attachment": true, "open_weights": true, - "release_date": "2026-06-30", - "last_updated": "2026-06-30", + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" }, { - "id": "Gemma-4-31B-StyleTune", - "name": "Gemma 4 31B StyleTune", - "display_name": "Gemma 4 31B StyleTune", + "id": "k3.1-pro", + "name": "Kimi K3.1 Pro", + "display_name": "Kimi K3.1 Pro", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1048576, + "output": 131072 }, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -224962,35 +217763,52 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ - "none", - "high" + "low", + "high", + "max" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-05-15", - "last_updated": "2026-05-15", + "open_weights": false, + "release_date": "2026-10-23", + "last_updated": "2026-10-23", "type": "chat" - }, + } + ] + }, + "minimax-coding-plan": { + "id": "minimax-coding-plan", + "name": "MiniMax Token Plan (minimax.io)", + "display_name": "MiniMax Token Plan (minimax.io)", + "api": "https://api.minimax.io/anthropic/v1", + "doc": "https://platform.minimax.io/docs/token-plan/intro", + "models": [ { - "id": "Qwen3.5-27B-Queen-Derestricted", - "name": "Qwen3.5 27B Queen Derestricted", - "display_name": "Qwen3.5 27B Queen Derestricted", + "id": "MiniMax-M2.7", + "name": "MiniMax-M2.7", + "display_name": "MiniMax-M2.7", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 16384 + "context": 204800, + "output": 131072 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -225004,23 +217822,60 @@ "visibility": "summary", "continuation": [ "thinking_blocks" - ], + ] + } + }, + "attachment": false, + "open_weights": true, + "release_date": "2026-03-18", + "last_updated": "2026-03-18", + "type": "chat" + }, + { + "id": "MiniMax-M3.1-Flash-Preview", + "name": "MiniMax-M3.1-Flash-Preview", + "display_name": "MiniMax-M3.1-Flash-Preview", + "modalities": { + "input": [ + "text", + "image", + "video" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1000000, + "output": 512000 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { "effort_options": [ - "none", - "high" + "low", + "medium", + "high", + "xhigh", + "max" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-04-30", - "last_updated": "2026-04-30", + "open_weights": false, + "release_date": "2026-09-27", + "last_updated": "2026-09-27", "type": "chat" }, { - "id": "nano-gpt-help", - "name": "NanoGPT Help", - "display_name": "NanoGPT Help", + "id": "MiniMax-M2", + "name": "MiniMax-M2", + "display_name": "MiniMax-M2", "modalities": { "input": [ "text" @@ -225030,23 +217885,25 @@ ] }, "limit": { - "context": 6000, - "output": 512 + "context": 204800, + "output": 131072 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": false, - "open_weights": false, - "release_date": "2026-06-06", - "last_updated": "2026-06-06", + "open_weights": true, + "release_date": "2025-10-27", + "last_updated": "2025-10-27", "type": "chat" }, { - "id": "MiniMax-M1", - "name": "MiniMax M1", - "display_name": "MiniMax M1", + "id": "MiniMax-M2.5", + "name": "MiniMax-M2.5", + "display_name": "MiniMax-M2.5", "modalities": { "input": [ "text" @@ -225056,37 +217913,43 @@ ] }, "limit": { - "context": 1000000, + "context": 204800, "output": 131072 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": false, "open_weights": true, - "release_date": "2025-01-08", - "last_updated": "2025-06-16", + "release_date": "2026-02-12", + "last_updated": "2026-02-12", "type": "chat" }, { - "id": "gemini-2.5-flash", - "name": "Gemini 2.5 Flash", - "display_name": "Gemini 2.5 Flash", + "id": "MiniMax-M3.1-Flash", + "name": "MiniMax-M3.1-Flash", + "display_name": "MiniMax-M3.1-Flash", "modalities": { "input": [ "text", "image", - "video", - "audio" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 1000000, + "output": 524288 }, "temperature": true, "tool_call": true, @@ -225096,48 +217959,40 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "budget", - "budget": { - "default": -1, - "min": 0, - "max": 24576, - "auto": -1, - "off": 0, - "unit": "tokens" - }, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-06-17", - "last_updated": "2025-06-17", + "release_date": "2026-10-19", + "last_updated": "2026-10-19", "type": "chat" }, { - "id": "Qwen3.5-27B-Claude-4.6-Opus-Reasoning-Distilled-Derestricted-Lite", - "name": "Qwen3.5 27B Claude 4.6 Opus Reasoning Distilled Derestricted Lite", - "display_name": "Qwen3.5 27B Claude 4.6 Opus Reasoning Distilled Derestricted Lite", + "id": "MiniMax-M3", + "name": "MiniMax-M3", + "display_name": "MiniMax-M3", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1000000, + "output": 524288 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -225145,29 +218000,19 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "none", - "high" - ] + "supported": true } }, "attachment": true, "open_weights": true, - "release_date": "2026-05-15", - "last_updated": "2026-05-15", + "release_date": "2026-06-01", + "last_updated": "2026-06-25", "type": "chat" }, { - "id": "hermes-medium", - "name": "Hermes Medium", - "display_name": "Hermes Medium", + "id": "MiniMax-M2.1", + "name": "MiniMax-M2.1", + "display_name": "MiniMax-M2.1", "modalities": { "input": [ "text" @@ -225177,9 +218022,10 @@ ] }, "limit": { - "context": 1048576, + "context": 204800, "output": 131072 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -225187,118 +218033,115 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "low", - "high", - "max" - ] + "supported": true } }, "attachment": false, - "open_weights": false, - "release_date": "2026-05-11", - "last_updated": "2026-05-11", + "open_weights": true, + "release_date": "2025-12-23", + "last_updated": "2025-12-23", "type": "chat" }, { - "id": "Gemma-4-26B-A4B-MeroMero", - "name": "Gemma 4 26B A4B MeroMero", - "display_name": "Gemma 4 26B A4B MeroMero", + "id": "MiniMax-M2.5-highspeed", + "name": "MiniMax-M2.5-highspeed", + "display_name": "MiniMax-M2.5-highspeed", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 204800, + "output": 131072 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": true, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": false, "open_weights": true, - "release_date": "2026-07-29", - "last_updated": "2026-08-26", + "release_date": "2026-02-13", + "last_updated": "2026-02-13", "type": "chat" }, { - "id": "gemini-2.5-flash-lite-preview-09-2025-thinking", - "name": "Gemini 2.5 Flash Lite Preview (09/2025) – Thinking", - "display_name": "Gemini 2.5 Flash Lite Preview (09/2025) – Thinking", + "id": "MiniMax-M2.7-highspeed", + "name": "MiniMax-M2.7-highspeed", + "display_name": "MiniMax-M2.7-highspeed", "modalities": { "input": [ - "text", - "image", - "audio", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 204800, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "default": -1, - "min": 512, - "max": 24576, - "auto": -1, - "unit": "tokens" - }, + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-09-25", - "last_updated": "2025-09-25", + "attachment": false, + "open_weights": true, + "release_date": "2026-03-18", + "last_updated": "2026-03-18", "type": "chat" - }, + } + ] + }, + "the-grid-ai": { + "id": "the-grid-ai", + "name": "The Grid AI", + "display_name": "The Grid AI", + "api": "https://api.thegrid.ai/v1", + "doc": "https://thegrid.ai/docs", + "models": [ { - "id": "gemini-2.5-pro-preview-06-05", - "name": "Gemini 2.5 Pro Preview 0605", - "display_name": "Gemini 2.5 Pro Preview 0605", + "id": "code-max", + "name": "Code Max", + "display_name": "Code Max", "modalities": { "input": [ "text", - "image", - "audio" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 1000000, + "output": 128000 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { "supported": true, "default": true @@ -225306,61 +218149,75 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "budget", - "budget": { - "default": -1, - "min": 128, - "max": 32768, - "auto": -1, - "unit": "tokens" - }, + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" + ], + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-01-31", - "release_date": "2025-06-05", - "last_updated": "2025-06-05", + "release_date": "2026-05-04", + "last_updated": "2026-07-30", "type": "chat" }, { - "id": "gemma-4-26b-a4b-it-darksoul", - "name": "Dark Soul", - "display_name": "Dark Soul", + "id": "code-standard", + "name": "Code Standard", + "display_name": "Code Standard", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 128000, + "output": 65536 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": true, - "open_weights": true, - "release_date": "2026-07-29", - "last_updated": "2026-07-29", + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "low", + "medium", + "high" + ] + } + }, + "attachment": false, + "open_weights": false, + "release_date": "2026-05-04", + "last_updated": "2026-10-06", "type": "chat" }, { - "id": "Gemma-4-31B-MeroMero", - "name": "Gemma 4 31B MeroMero", - "display_name": "Gemma 4 31B MeroMero", + "id": "claude-opus-latest", + "name": "Claude Opus Latest", + "display_name": "Claude Opus Latest", "modalities": { "input": [ "text", @@ -225371,9 +218228,10 @@ ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1000000, + "output": 128000 }, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -225381,49 +218239,76 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ - "none", - "high" + "low", + "medium", + "high", + "xhigh", + "max" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-05-02", - "last_updated": "2026-05-02", + "open_weights": false, + "release_date": "2026-07-06", + "last_updated": "2026-07-30", "type": "chat" }, { - "id": "deepseek-chat-cheaper", - "name": "DeepSeek V3/Chat Cheaper", - "display_name": "DeepSeek V3/Chat Cheaper", + "id": "text-prime", + "name": "Text Prime", + "display_name": "Text Prime", "modalities": { "input": [ - "text", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 196608, + "output": 131072 }, + "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, - "open_weights": true, - "release_date": "2025-04-15", - "last_updated": "2025-04-15", + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "low", + "medium", + "high" + ] + } + }, + "attachment": false, + "open_weights": false, + "release_date": "2026-02-26", + "last_updated": "2026-07-15", "type": "chat" }, { - "id": "gemini-3-pro-image-preview", - "name": "Gemini 3 Pro Image", - "display_name": "Gemini 3 Pro Image", + "id": "gemini-pro-latest", + "name": "Gemini Pro Latest", + "display_name": "Gemini Pro Latest", "modalities": { "input": [ "text", @@ -225434,11 +218319,11 @@ ] }, "limit": { - "context": 65536, - "output": 32768 + "context": 1000000, + "output": 65536 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { "supported": true, "default": true @@ -225446,58 +218331,73 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "low", - "high" - ], + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" + ], + "effort_options": [ + "low", + "medium", + "high" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-11-20", - "last_updated": "2025-11-20" + "release_date": "2026-07-06", + "last_updated": "2026-07-06", + "type": "chat" }, { - "id": "gemma-4-12b-it-station-keeper", - "name": "Gemma 4 12B StationKeeper", - "display_name": "Gemma 4 12B StationKeeper", + "id": "deepseek-pro-latest", + "name": "DeepSeek Pro Latest", + "display_name": "DeepSeek Pro Latest", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 1000000, + "output": 384000 }, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": true, - "open_weights": true, - "release_date": "2026-09-09", - "last_updated": "2026-09-09", + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "low", + "medium", + "high" + ] + } + }, + "attachment": false, + "open_weights": false, + "release_date": "2026-07-06", + "last_updated": "2026-07-06", "type": "chat" }, { - "id": "Qwen3.5-27B-Claude-4.6-Opus-Reasoning-Distilled-Derestricted", - "name": "Qwen3.5 27B Claude 4.6 Opus Reasoning Distilled Derestricted", - "display_name": "Qwen3.5 27B Claude 4.6 Opus Reasoning Distilled Derestricted", + "id": "agent-max", + "name": "Agent Max", + "display_name": "Agent Max", "modalities": { "input": [ "text", @@ -225508,9 +218408,10 @@ ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1000000, + "output": 128000 }, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -225526,21 +218427,24 @@ "thinking_blocks" ], "effort_options": [ - "none", - "high" + "low", + "medium", + "high", + "xhigh", + "max" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-05-15", - "last_updated": "2026-05-15", + "open_weights": false, + "release_date": "2026-05-04", + "last_updated": "2026-07-30", "type": "chat" }, { - "id": "Meta-Llama-3-1-8B-Instruct-FP8", - "name": "Llama 3.1 8B (decentralized)", - "display_name": "Llama 3.1 8B (decentralized)", + "id": "agent-standard", + "name": "Agent Standard", + "display_name": "Agent Standard", "modalities": { "input": [ "text" @@ -225551,22 +218455,40 @@ }, "limit": { "context": 128000, - "output": 16384 + "output": 65536 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "low", + "medium", + "high" + ] + } }, "attachment": false, - "open_weights": true, - "release_date": "2024-01-01", - "last_updated": "2024-07-23", + "open_weights": false, + "release_date": "2026-05-04", + "last_updated": "2026-10-06", "type": "chat" }, { - "id": "glm-z1-airx", - "name": "GLM Z1 AirX", - "display_name": "GLM Z1 AirX", + "id": "text-standard", + "name": "Text Standard", + "display_name": "Text Standard", "modalities": { "input": [ "text" @@ -225576,23 +218498,41 @@ ] }, "limit": { - "context": 32000, - "output": 16384 + "context": 128000, + "output": 65536 }, + "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "low", + "medium", + "high" + ] + } }, "attachment": false, "open_weights": false, - "release_date": "2025-04-15", - "last_updated": "2025-04-15", + "release_date": "2026-02-26", + "last_updated": "2026-10-06", "type": "chat" }, { - "id": "gemma-4-12b-it", - "name": "Gemma 4 12B Instruct", - "display_name": "Gemma 4 12B Instruct", + "id": "text-max", + "name": "Text Max", + "display_name": "Text Max", "modalities": { "input": [ "text", @@ -225603,67 +218543,56 @@ ] }, "limit": { - "context": 131072, - "output": 32768 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": true, - "release_date": "2026-06-09", - "last_updated": "2026-06-09", - "type": "chat" - }, - { - "id": "mercury-2", - "name": "Mercury 2", - "display_name": "Mercury 2", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 128000, - "output": 50000 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + }, + "attachment": true, "open_weights": false, - "release_date": "2026-02-24", - "last_updated": "2026-02-24", + "release_date": "2026-02-26", + "last_updated": "2026-07-30", "type": "chat" }, { - "id": "gemini-2.5-flash-preview-09-2025", - "name": "Gemini 2.5 Flash Preview (09/2025)", - "display_name": "Gemini 2.5 Flash Preview (09/2025)", + "id": "code-prime", + "name": "Code Prime", + "display_name": "Code Prime", "modalities": { "input": [ - "text", - "image", - "audio", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 196608, + "output": 131072 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -225672,37 +218601,32 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "budget", - "budget": { - "default": -1, - "min": 0, - "max": 24576, - "auto": -1, - "off": 0, - "unit": "tokens" - }, + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" + ], + "effort_options": [ + "low", + "medium", + "high" ] } }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2025-09-25", - "last_updated": "2025-09-25", + "release_date": "2026-05-04", + "last_updated": "2026-07-15", "type": "chat" }, { - "id": "Gemma-4-31B-DarkIdol", - "name": "Gemma 4 31B DarkIdol", - "display_name": "Gemma 4 31B DarkIdol", + "id": "bytedance-pro-latest", + "name": "ByteDance Pro Latest", + "display_name": "ByteDance Pro Latest", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" @@ -225710,8 +218634,9 @@ }, "limit": { "context": 262144, - "output": 16384 + "output": 131072 }, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -225719,22 +218644,30 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ - "none", + "low", + "medium", "high" ] } }, - "attachment": true, - "open_weights": true, - "release_date": "2026-05-01", - "last_updated": "2026-05-01", + "attachment": false, + "open_weights": false, + "release_date": "2026-07-06", + "last_updated": "2026-07-06", "type": "chat" }, { - "id": "doubao-1.5-pro-32k", - "name": "Doubao 1.5 Pro 32k", - "display_name": "Doubao 1.5 Pro 32k", + "id": "minimax-latest", + "name": "MiniMax Latest", + "display_name": "MiniMax Latest", "modalities": { "input": [ "text" @@ -225744,23 +218677,41 @@ ] }, "limit": { - "context": 32000, - "output": 8192 + "context": 1000000, + "output": 512000 }, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "low", + "medium", + "high" + ] + } }, "attachment": false, "open_weights": false, - "release_date": "2024-11-20", - "last_updated": "2025-01-22", + "release_date": "2026-07-06", + "last_updated": "2026-07-06", "type": "chat" }, { - "id": "sarvam-105b", - "name": "Sarvam 105B", - "display_name": "Sarvam 105B", + "id": "agent-prime", + "name": "Agent Prime", + "display_name": "Agent Prime", "modalities": { "input": [ "text" @@ -225770,8 +218721,8 @@ ] }, "limit": { - "context": 131072, - "output": 4096 + "context": 196608, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -225781,6 +218732,13 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ "low", "medium", @@ -225789,30 +218747,30 @@ } }, "attachment": false, - "open_weights": true, - "release_date": "2026-02-18", - "last_updated": "2026-02-18", + "open_weights": false, + "release_date": "2026-05-04", + "last_updated": "2026-07-15", "type": "chat" }, { - "id": "gemini-2.5-pro-preview-05-06", - "name": "Gemini 2.5 Pro Preview 0506", - "display_name": "Gemini 2.5 Pro Preview 0506", + "id": "gpt-sol-latest", + "name": "GPT Sol Latest", + "display_name": "GPT Sol Latest", "modalities": { "input": [ "text", - "image", - "audio" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 1000000, + "output": 128000 }, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { "supported": true, "default": true @@ -225820,63 +218778,77 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "budget", - "budget": { - "default": -1, - "min": 128, - "max": 32768, - "auto": -1, - "unit": "tokens" - }, + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" + ], + "effort_options": [ + "low", + "medium", + "high" ] } }, "attachment": true, "open_weights": false, - "release_date": "2025-05-06", - "last_updated": "2025-05-06", + "release_date": "2026-07-06", + "last_updated": "2026-07-06", "type": "chat" }, { - "id": "gemma-4-26b-a4b-it-chimerax", - "name": "Chimera X", - "display_name": "Chimera X", + "id": "glm-latest", + "name": "GLM Latest", + "display_name": "GLM Latest", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 1048576, + "output": 131072 }, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": true, - "open_weights": true, - "release_date": "2026-07-29", - "last_updated": "2026-07-29", + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "low", + "high", + "max" + ] + } + }, + "attachment": false, + "open_weights": false, + "release_date": "2026-07-06", + "last_updated": "2026-08-18", "type": "chat" }, { - "id": "claw-low", - "name": "Claw Low", - "display_name": "Claw Low", + "id": "kimi-latest", + "name": "Kimi Latest", + "display_name": "Kimi Latest", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" @@ -225884,8 +218856,9 @@ }, "limit": { "context": 1048576, - "output": 131072 + "output": 943718 }, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -225893,6 +218866,13 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ "low", "high", @@ -225900,29 +218880,42 @@ ] } }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-05-11", - "last_updated": "2026-05-11", + "release_date": "2026-07-06", + "last_updated": "2026-07-06", "type": "chat" - }, + } + ] + }, + "meta": { + "id": "meta", + "name": "Meta", + "display_name": "Meta", + "api": "https://api.meta.ai/v1", + "doc": "https://dev.meta.ai/docs", + "models": [ { - "id": "Gemma-4-31B-Animus-V14.1", - "name": "Gemma 4 31B Animus V14.1", - "display_name": "Gemma 4 31B Animus V14.1", + "id": "muse-spark-1.2", + "name": "Muse Spark 1.2", + "display_name": "Muse Spark 1.2", "modalities": { "input": [ "text", - "image" + "image", + "video", + "pdf", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1048576, + "output": 131072 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -225930,53 +218923,75 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ - "none", - "high" + "minimal", + "low", + "medium", + "high", + "xhigh" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-05-15", - "last_updated": "2026-05-15", + "open_weights": false, + "release_date": "2026-08-05", + "last_updated": "2026-08-05", "type": "chat" }, { - "id": "Gemma-4-31B-MeroMero-v2:thinking", - "name": "Gemma 4 31B MeroMero v2 Thinking", - "display_name": "Gemma 4 31B MeroMero v2 Thinking", + "id": "muse-spark-1.2-contributor", + "name": "Muse Spark 1.2 Contributor", + "display_name": "Muse Spark 1.2 Contributor", "modalities": { "input": [ "text", - "image" + "image", + "video", + "pdf", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 1048576, + "output": 131072 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] + } + }, "attachment": true, - "open_weights": true, - "release_date": "2026-07-29", - "last_updated": "2026-08-24", + "open_weights": false, + "release_date": "2026-08-05", + "last_updated": "2026-08-05", "type": "chat" }, { - "id": "claw-high", - "name": "Claw High", - "display_name": "Claw High", + "id": "muse-spark-1.1", + "name": "Muse Spark 1.1", + "display_name": "Muse Spark 1.1", "modalities": { "input": [ - "text" + "text", + "image", + "pdf", + "video" ], "output": [ "text" @@ -225986,6 +219001,7 @@ "context": 1048576, "output": 131072 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -225993,77 +219009,76 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ + "minimal", "low", + "medium", "high", - "max" + "xhigh" ] } }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-05-11", - "last_updated": "2026-05-11", + "release_date": "2026-04-08", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "gemini-2.5-flash-preview-05-20:thinking", - "name": "Gemini 2.5 Flash 0520 Thinking", - "display_name": "Gemini 2.5 Flash 0520 Thinking", + "id": "muse-wonder-1.0", + "name": "Muse Wonder", + "display_name": "Muse Wonder", "modalities": { "input": [ "text", - "image" + "image", + "video", + "pdf", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 1048000, - "output": 65536 + "context": 1048576, + "output": 131072 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "budget", - "budget": { - "default": -1, - "min": 0, - "max": 24576, - "auto": -1, - "off": 0, - "unit": "tokens" - }, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" + "effort_options": [ + "minimal", + "low", + "medium", + "high", + "xhigh", + "max" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-05-20", - "last_updated": "2025-05-20", + "release_date": "2026-10-12", + "last_updated": "2026-10-12", "type": "chat" }, { - "id": "gemini-2.0-pro-exp-02-05", - "name": "Gemini 2.0 Pro 0205", - "display_name": "Gemini 2.0 Pro 0205", + "id": "muse-spark-1.3-contributor", + "name": "Muse Spark 1.3 Contributor", + "display_name": "Muse Spark 1.3 Contributor", "modalities": { "input": [ "text", "image", + "video", + "pdf", "audio" ], "output": [ @@ -226071,28 +219086,42 @@ ] }, "limit": { - "context": 2097152, - "output": 8192 + "context": 1048576, + "output": 131072 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] + } }, "attachment": true, "open_weights": false, - "release_date": "2025-02-05", - "last_updated": "2025-02-05", + "release_date": "2026-09-02", + "last_updated": "2026-09-02", "type": "chat" }, { - "id": "gemini-2.5-flash-lite", - "name": "Gemini 2.5 Flash Lite", - "display_name": "Gemini 2.5 Flash Lite", + "id": "muse-spark-1.3", + "name": "Muse Spark 1.3", + "display_name": "Muse Spark 1.3", "modalities": { "input": [ "text", "image", "video", + "pdf", "audio" ], "output": [ @@ -226101,57 +219130,62 @@ }, "limit": { "context": 1048576, - "output": 65536 + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "default": -1, - "min": 512, - "max": 24576, - "auto": -1, - "unit": "tokens" - }, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" + "effort_options": [ + "minimal", + "low", + "medium", + "high", + "xhigh", + "max" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-06-17", - "last_updated": "2025-06-17", + "release_date": "2026-09-02", + "last_updated": "2026-09-02", "type": "chat" - }, + } + ] + }, + "bee": { + "id": "bee", + "name": "Bee by HEOSSI", + "display_name": "Bee by HEOSSI", + "api": "https://api.bee.heossi.com/bee", + "doc": "https://bee.heossi.com/docs/sdks", + "models": [ { - "id": "gemma-4-12b-it-starry-ocean", - "name": "Gemma 4 12B Starry Ocean", - "display_name": "Gemma 4 12B Starry Ocean", + "id": "bee-brood", + "name": "Bee Brood 1.0", + "display_name": "Bee Brood 1.0", "modalities": { "input": [ "text", - "image" + "image", + "video", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 131072 + "context": 262144, + "output": 16384 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -226160,54 +219194,59 @@ "extra_capabilities": { "reasoning": { "effort_options": [ - "none", - "high" + "low", + "medium", + "high", + "xhigh", + "max" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-10-15", - "last_updated": "2026-10-15", + "open_weights": false, + "release_date": "2026-07-10", + "last_updated": "2026-09-28", "type": "chat" }, { - "id": "qwen3-vl-235b-a22b-instruct-original", - "name": "Qwen3 VL 235B A22B Instruct Original", - "display_name": "Qwen3 VL 235B A22B Instruct Original", + "id": "bee-cell", + "name": "Bee Cell 1.0", + "display_name": "Bee Cell 1.0", "modalities": { "input": [ "text", - "image" + "image", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 32768, - "output": 32768 + "context": 131072, + "output": 8192 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, "attachment": true, - "open_weights": true, - "knowledge": "2025-03-31", - "release_date": "2025-09-23", - "last_updated": "2025-09-23", + "open_weights": false, + "release_date": "2026-07-10", + "last_updated": "2026-09-28", "type": "chat" }, { - "id": "Qwen3.5-27B-Blossom-V6.4-Derestricted", - "name": "Qwen3.5 27B Blossom V6.4 Derestricted", - "display_name": "Qwen3.5 27B Blossom V6.4 Derestricted", + "id": "bee-comb", + "name": "Bee Comb 2.0", + "display_name": "Bee Comb 2.0", "modalities": { "input": [ "text", - "image" + "image", + "video", + "audio" ], "output": [ "text" @@ -226215,8 +219254,9 @@ }, "limit": { "context": 262144, - "output": 262144 + "output": 16384 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -226224,33 +219264,31 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ - "none", - "high" + "low", + "medium", + "high", + "xhigh", + "max" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-05-15", - "last_updated": "2026-05-15", + "open_weights": false, + "release_date": "2026-07-10", + "last_updated": "2026-09-28", "type": "chat" }, { - "id": "gemma-4-31b-it-darkidol", - "name": "DarkIdol", - "display_name": "DarkIdol", + "id": "bee-buzz", + "name": "Bee Buzz 1.0", + "display_name": "Bee Buzz 1.0", "modalities": { "input": [ "text", - "image" + "image", + "video", + "audio" ], "output": [ "text" @@ -226258,27 +219296,41 @@ }, "limit": { "context": 262144, - "output": 32768 + "output": 24576 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + }, "attachment": true, - "open_weights": true, - "release_date": "2026-07-29", - "last_updated": "2026-07-29", + "open_weights": false, + "release_date": "2026-07-10", + "last_updated": "2026-09-28", "type": "chat" }, { - "id": "Gemma-4-31B-Isometry-RP", - "name": "Gemma 4 31B Isometry RP", - "display_name": "Gemma 4 31B Isometry RP", + "id": "bee-hive", + "name": "Bee Hive 1.0", + "display_name": "Bee Hive 1.0", "modalities": { "input": [ "text", - "image" + "image", + "video", + "audio" ], "output": [ "text" @@ -226286,8 +219338,9 @@ }, "limit": { "context": 262144, - "output": 262144 + "output": 32768 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -226296,47 +219349,24 @@ "extra_capabilities": { "reasoning": { "effort_options": [ - "none", - "high" + "low", + "medium", + "high", + "xhigh", + "max" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-05-15", - "last_updated": "2026-05-15", - "type": "chat" - }, - { - "id": "universal-summarizer", - "name": "Universal Summarizer", - "display_name": "Universal Summarizer", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 32768, - "output": 32768 - }, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, "open_weights": false, - "release_date": "2025-12-23", - "last_updated": "2024-01-01", + "release_date": "2026-07-10", + "last_updated": "2026-09-28", "type": "chat" }, { - "id": "gemini-2.5-pro-exp-03-25", - "name": "Gemini 2.5 Pro Experimental 0325", - "display_name": "Gemini 2.5 Pro Experimental 0325", + "id": "bee-swarm", + "name": "Bee Swarm 1.0", + "display_name": "Bee Swarm 1.0", "modalities": { "input": [ "text", @@ -226348,8 +219378,8 @@ ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 1000000, + "output": 64000 }, "tool_call": false, "reasoning": { @@ -226358,99 +219388,111 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "budget", - "budget": { - "default": -1, - "min": 128, - "max": 32768, - "auto": -1, - "unit": "tokens" - }, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" ] } }, "attachment": true, "open_weights": false, - "release_date": "2025-03-25", - "last_updated": "2025-03-25", + "release_date": "2026-07-10", + "last_updated": "2026-09-28", "type": "chat" - }, + } + ] + }, + "tensorx": { + "id": "tensorx", + "name": "TensorX", + "display_name": "TensorX", + "api": "https://api.tensorx.ai/v1", + "doc": "https://docs.tensorx.ai/", + "models": [ { - "id": "doubao-seed-2-0-lite-260215", - "name": "Doubao Seed 2.0 Lite", - "display_name": "Doubao Seed 2.0 Lite", + "id": "moonshotai/kimi-k2.7-code", + "name": "Kimi K2.7 Code", + "display_name": "Kimi K2.7 Code", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 32000 + "context": 262144, + "output": 262144 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { "supported": true } }, - "attachment": false, - "open_weights": false, - "release_date": "2026-02-14", - "last_updated": "2026-02-14", + "attachment": true, + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-06-12", + "last_updated": "2026-06-12", "type": "chat" }, { - "id": "ernie-5.1", - "name": "ERNIE 5.1", - "display_name": "ERNIE 5.1", + "id": "moonshotai/kimi-k2.6", + "name": "Kimi K2.6", + "display_name": "Kimi K2.6", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 119000, - "output": 64000 + "context": 262144, + "output": 262144 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { "supported": true } }, - "attachment": false, - "open_weights": false, - "release_date": "2026-05-10", - "last_updated": "2026-05-10", + "attachment": true, + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-04-20", + "last_updated": "2026-04-20", "type": "chat" }, { - "id": "hermes-high", - "name": "Hermes High", - "display_name": "Hermes High", + "id": "moonshotai/kimi-k3", + "name": "Kimi K3", + "display_name": "Kimi K3", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" @@ -226460,6 +219502,7 @@ "context": 1048576, "output": 131072 }, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -226467,49 +219510,61 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "low", - "high", - "max" - ] + "supported": true } }, - "attachment": false, - "open_weights": false, - "release_date": "2026-05-11", - "last_updated": "2026-05-11", + "attachment": true, + "open_weights": true, + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" }, { - "id": "synth-2.5-pro", - "name": "Synth 2.5 Pro Preview", - "display_name": "Synth 2.5 Pro Preview", + "id": "moonshotai/kimi-k2.5", + "name": "Kimi K2.5", + "display_name": "Kimi K2.5", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 30000, - "output": 30000 + "context": 262144, + "output": 262144 }, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": false, - "release_date": "2026-09-05", - "last_updated": "2026-09-05", + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": true, + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-01-27", + "last_updated": "2026-01-27", "type": "chat" }, { - "id": "glm-4-long", - "name": "GLM-4 Long", - "display_name": "GLM-4 Long", + "id": "deepseek/deepseek-v4-flash-0731", + "name": "DeepSeek V4 Flash 0731", + "display_name": "DeepSeek V4 Flash 0731", "modalities": { "input": [ "text" @@ -226519,23 +219574,35 @@ ] }, "limit": { - "context": 1000000, - "output": 4095 + "context": 1048576, + "output": 384000 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "high", + "max" + ] + } }, "attachment": false, - "open_weights": false, - "release_date": "2024-01-01", - "last_updated": "2024-08-01", + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-07-31", + "last_updated": "2026-07-31", "type": "chat" }, { - "id": "Gemma-4-26B-A4B-MeroMero:thinking", - "name": "Gemma 4 26B A4B MeroMero Thinking", - "display_name": "Gemma 4 26B A4B MeroMero Thinking", + "id": "deepseek/deepseek-v4.1-flash", + "name": "DeepSeek V4.1 Flash", + "display_name": "DeepSeek V4.1 Flash", "modalities": { "input": [ "text", @@ -226546,29 +219613,38 @@ ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 1048576, + "output": 384000 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "high", + "max" + ] + } + }, "attachment": true, "open_weights": true, - "release_date": "2026-07-29", - "last_updated": "2026-08-26", + "knowledge": "2025-05", + "release_date": "2026-09-10", + "last_updated": "2026-09-10", "type": "chat" }, { - "id": "gemini-2.5-flash-lite-preview-06-17", - "name": "Gemini 2.5 Flash Lite Preview", - "display_name": "Gemini 2.5 Flash Lite Preview", + "id": "deepseek/deepseek-v4-pro", + "name": "DeepSeek V4 Pro", + "display_name": "DeepSeek V4 Pro", "modalities": { "input": [ - "text", - "image", - "audio" + "text" ], "output": [ "text" @@ -226576,70 +219652,47 @@ }, "limit": { "context": 1048576, - "output": 65536 + "output": 384000 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "default": -1, - "min": 512, - "max": 24576, - "auto": -1, - "unit": "tokens" - }, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "high", + "max" + ], + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" + ], + "notes": [ + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-06-17", - "last_updated": "2025-06-17", - "type": "chat" - }, - { - "id": "venice-uncensored", - "name": "Venice Uncensored", - "display_name": "Venice Uncensored", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 128000, - "output": 8192 - }, - "tool_call": false, - "reasoning": { - "supported": false - }, "attachment": false, "open_weights": true, - "release_date": "2025-10-01", - "last_updated": "2025-02-24", + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "phi-4-multimodal-instruct", - "name": "Phi 4 Multimodal", - "display_name": "Phi 4 Multimodal", + "id": "deepseek/deepseek-v3.2", + "name": "DeepSeek V3.2", + "display_name": "DeepSeek V3.2", "modalities": { "input": [ "text" @@ -226649,67 +219702,54 @@ ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 163840, + "output": 163840 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "none", + "minimal", + "low", + "medium", + "high", + "xhigh", + "max" + ] + } }, "attachment": false, "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-02-26", - "last_updated": "2025-02-26", + "knowledge": "2025-05", + "release_date": "2025-12-01", + "last_updated": "2025-12-01", "type": "chat" }, { - "id": "glm-4.1v-thinking-flashx", - "name": "GLM 4.1V Thinking FlashX", - "display_name": "GLM 4.1V Thinking FlashX", + "id": "deepseek/deepseek-r1-0528", + "name": "DeepSeek R1-0528", + "display_name": "DeepSeek R1-0528", "modalities": { "input": [ - "text", - "image" - ], - "output": [ "text" - ] - }, - "limit": { - "context": 64000, - "output": 8192 - }, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": false, - "release_date": "2025-07-09", - "last_updated": "2025-07-09", - "type": "chat" - }, - { - "id": "gemini-2.5-flash-preview-04-17:thinking", - "name": "Gemini 2.5 Flash Preview Thinking", - "display_name": "Gemini 2.5 Flash Preview Thinking", - "modalities": { - "input": [ - "text", - "image", - "audio" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 164000, + "output": 8192 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": true, "default": true @@ -226717,33 +219757,33 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "budget", - "budget": { - "default": -1, - "min": 0, - "max": 24576, - "auto": -1, - "off": 0, - "unit": "tokens" - }, + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" + ], + "effort_options": [ + "minimal", + "low", + "medium", + "high", + "xhigh", + "max" ] } }, - "attachment": true, - "open_weights": false, - "release_date": "2025-04-17", - "last_updated": "2025-04-17", + "attachment": false, + "open_weights": true, + "knowledge": "2024-07", + "release_date": "2025-05-28", + "last_updated": "2025-05-28", "type": "chat" }, { - "id": "mercury-coder-small", - "name": "Mercury Coder Small", - "display_name": "Mercury Coder Small", + "id": "deepseek/deepseek-v4-pro-0813", + "name": "DeepSeek V4 Pro 0813", + "display_name": "DeepSeek V4 Pro 0813", "modalities": { "input": [ "text" @@ -226753,23 +219793,34 @@ ] }, "limit": { - "context": 32768, - "output": 16384 + "context": 1048576, + "output": 64000 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "high", + "max" + ] + } }, "attachment": false, - "open_weights": false, - "release_date": "2024-01-01", - "last_updated": "2024-01-01", + "open_weights": true, + "release_date": "2026-08-13", + "last_updated": "2026-08-22", "type": "chat" }, { - "id": "ernie-5.1:thinking", - "name": "ERNIE 5.1 Thinking", - "display_name": "ERNIE 5.1 Thinking", + "id": "z-ai/glm-5.2", + "name": "GLM-5.2", + "display_name": "GLM-5.2", "modalities": { "input": [ "text" @@ -226779,64 +219830,91 @@ ] }, "limit": { - "context": 119000, - "output": 64000 + "context": 1048576, + "output": 131072 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": false, - "open_weights": false, - "release_date": "2026-05-10", - "last_updated": "2026-05-10", + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "high", + "max" + ] + } + }, + "attachment": false, + "open_weights": true, + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "doubao-seed-2-0-mini-260215", - "name": "Doubao Seed 2.0 Mini", - "display_name": "Doubao Seed 2.0 Mini", + "id": "z-ai/glm-5v-turbo", + "name": "GLM-5V-Turbo", + "display_name": "GLM-5V-Turbo", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 32000 + "context": 202752, + "output": 131072 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "minimal", + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + }, + "attachment": true, "open_weights": false, - "release_date": "2026-02-14", - "last_updated": "2026-02-14", + "release_date": "2026-04-01", + "last_updated": "2026-04-01", "type": "chat" }, { - "id": "Gemma-4-31B-Agares-v1", - "name": "Gemma 4 31B Agares v1", - "display_name": "Gemma 4 31B Agares v1", + "id": "z-ai/glm-5.3", + "name": "GLM-5.3", + "display_name": "GLM-5.3", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1048576, + "output": 64000 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -226844,50 +219922,57 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ - "none", - "high" + "low", + "high", + "max" ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-05-15", - "last_updated": "2026-05-15", + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "holo3-35b-a3b", - "name": "Holo3-35B-A3B", - "display_name": "Holo3-35B-A3B", + "id": "z-ai/glm-5-turbo", + "name": "GLM-5-Turbo", + "display_name": "GLM-5-Turbo", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 65536, - "output": 8192 + "context": 202752, + "output": 131072 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": true, - "open_weights": true, - "release_date": "2024-01-01", - "last_updated": "2024-01-01", + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": false, + "open_weights": false, + "release_date": "2026-03-16", + "last_updated": "2026-03-16", "type": "chat" }, { - "id": "GLM-4.6-Derestricted-v5", - "name": "GLM 4.6 Derestricted v5", - "display_name": "GLM 4.6 Derestricted v5", + "id": "z-ai/glm-5", + "name": "GLM-5", + "display_name": "GLM-5", "modalities": { "input": [ "text" @@ -226897,9 +219982,10 @@ ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 202752, + "output": 202752 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -226907,35 +219993,50 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ "none", - "high" + "minimal", + "low", + "medium", + "high", + "xhigh", + "max" ] } }, "attachment": false, "open_weights": true, - "release_date": "2025-12-23", - "last_updated": "2025-12-23", + "release_date": "2026-02-12", + "last_updated": "2026-02-12", "type": "chat" }, { - "id": "Gemma-4-31B-K1-v5", - "name": "Gemma 4 31B K1 v5", - "display_name": "Gemma 4 31B K1 v5", + "id": "z-ai/glm-5.3-flash", + "name": "GLM-5.3-Flash", + "display_name": "GLM-5.3-Flash", "modalities": { "input": [ "text", - "image" + "image", + "video", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1048576, + "output": 64000 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -226943,22 +220044,24 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ - "none", - "high" + "low", + "high", + "max" ] } }, "attachment": true, "open_weights": true, - "release_date": "2026-05-02", - "last_updated": "2026-05-02", + "release_date": "2026-08-26", + "last_updated": "2026-08-26", "type": "chat" }, { - "id": "mistral-code-agent-latest", - "name": "Mistral Code Agent Latest", - "display_name": "Mistral Code Agent Latest", + "id": "z-ai/glm-5.1", + "name": "GLM-5.1", + "display_name": "GLM-5.1", "modalities": { "input": [ "text" @@ -226968,83 +220071,109 @@ ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 202752, + "output": 202752 }, + "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": false, "open_weights": true, - "release_date": "2026-06-02", - "last_updated": "2026-06-02", + "release_date": "2026-04-07", + "last_updated": "2026-04-07", "type": "chat" }, { - "id": "gemma-4-26b-a4b-it-shadowsiren", - "name": "Shadow Siren", - "display_name": "Shadow Siren", + "id": "minimax/minimax-m3", + "name": "MiniMax-M3", + "display_name": "MiniMax-M3", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 1048576, + "output": 131072 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, "attachment": true, "open_weights": true, - "release_date": "2026-07-29", - "last_updated": "2026-07-29", + "release_date": "2026-06-01", + "last_updated": "2026-06-01", "type": "chat" }, { - "id": "Gemma-4-31B-MeroMero-v2", - "name": "Gemma 4 31B MeroMero v2", - "display_name": "Gemma 4 31B MeroMero v2", + "id": "minimax/minimax-m2.5", + "name": "MiniMax-M2.5", + "display_name": "MiniMax-M2.5", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 196608, + "output": 65536 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": true, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "minimal", + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + }, + "attachment": false, "open_weights": true, - "release_date": "2026-07-29", - "last_updated": "2026-08-23", + "release_date": "2026-02-12", + "last_updated": "2026-02-12", "type": "chat" }, { - "id": "Gemma-4-31B-Claude-4.6-Opus-Reasoning-Distilled", - "name": "Gemma 4 31B Claude 4.6 Opus Reasoning Distilled", - "display_name": "Gemma 4 31B Claude 4.6 Opus Reasoning Distilled", + "id": "qwen/qwen3.8-2.4t-a95b", + "name": "Qwen3.8 2.4T A95B", + "display_name": "Qwen3.8 2.4T A95B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" @@ -227052,8 +220181,9 @@ }, "limit": { "context": 262144, - "output": 16384 + "output": 64000 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -227061,37 +220191,40 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ - "none", - "high" + "low", + "medium", + "xhigh" ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-05-01", - "last_updated": "2026-05-01", + "release_date": "2026-08-12", + "last_updated": "2026-08-12", "type": "chat" }, { - "id": "gemini-2.5-pro-preview-03-25", - "name": "Gemini 2.5 Pro Preview 0325", - "display_name": "Gemini 2.5 Pro Preview 0325", + "id": "qwen/qwen3.5-9b", + "name": "Qwen3.5 9B", + "display_name": "Qwen3.5 9B", "modalities": { "input": [ "text", "image", - "audio" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1048576, + "context": 262144, "output": 65536 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": true, "default": true @@ -227099,47 +220232,49 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "budget", - "budget": { - "default": -1, - "min": 128, - "max": 32768, - "auto": -1, - "unit": "tokens" - }, + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" + ], + "effort_options": [ + "none", + "minimal", + "low", + "medium", + "high", + "xhigh", + "max" ] } }, "attachment": true, - "open_weights": false, - "release_date": "2025-03-25", - "last_updated": "2025-03-25", + "open_weights": true, + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" }, { - "id": "gemini-2.5-flash-preview-04-17", - "name": "Gemini 2.5 Flash Preview", - "display_name": "Gemini 2.5 Flash Preview", + "id": "qwen/qwen3.5-122b-a10b", + "name": "Qwen3.5 122B-A10B", + "display_name": "Qwen3.5 122B-A10B", "modalities": { "input": [ "text", "image", - "audio" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 262144, + "output": 262144 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": true, "default": true @@ -227147,45 +220282,48 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "budget", - "budget": { - "default": -1, - "min": 0, - "max": 24576, - "auto": -1, - "off": 0, - "unit": "tokens" - }, + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" + ], + "effort_options": [ + "none", + "minimal", + "low", + "medium", + "high", + "xhigh", + "max" ] } }, "attachment": true, - "open_weights": false, - "release_date": "2025-04-17", - "last_updated": "2025-04-17", + "open_weights": true, + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" }, { - "id": "hermes-low", - "name": "Hermes Low", - "display_name": "Hermes Low", + "id": "qwen/qwen3.8-27b", + "name": "Qwen3.8 27B", + "display_name": "Qwen3.8 27B", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 262144, + "output": 32768 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -227195,25 +220333,26 @@ "reasoning": { "effort_options": [ "low", - "high", - "max" + "medium", + "xhigh" ] } }, - "attachment": false, - "open_weights": false, - "release_date": "2026-05-11", - "last_updated": "2026-05-11", + "attachment": true, + "open_weights": true, + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "gemma-4-26b-a4b-it-opusdistill", - "name": "Opus Distill", - "display_name": "Opus Distill", + "id": "qwen/qwen3.8-flash-next", + "name": "Qwen3.8 Flash Next", + "display_name": "Qwen3.8 Flash Next", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" @@ -227221,49 +220360,33 @@ }, "limit": { "context": 262144, - "output": 32768 + "output": 64000 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": true, - "open_weights": true, - "release_date": "2026-07-29", - "last_updated": "2026-07-29", - "type": "chat" - }, - { - "id": "inflatebot/MN-12B-Mag-Mell-R1", - "name": "Mag Mell R1", - "display_name": "Mag Mell R1", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 16384, - "output": 8192 - }, - "tool_call": false, - "reasoning": { - "supported": false + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "xhigh" + ] + } }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2024-01-01", - "last_updated": "2024-07-01", + "release_date": "2026-08-27", + "last_updated": "2026-08-27", "type": "chat" }, { - "id": "failspy/Meta-Llama-3-70B-Instruct-abliterated-v3.5", - "name": "Llama 3 70B abliterated", - "display_name": "Llama 3 70B abliterated", + "id": "qwen/qwen3-235b-a22b-2507", + "name": "Qwen3 235B-A22B-2507", + "display_name": "Qwen3 235B-A22B-2507", "modalities": { "input": [ "text" @@ -227273,23 +220396,34 @@ ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 131000, + "output": 262144 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": false }, "attachment": false, "open_weights": true, - "release_date": "2025-07-26", - "last_updated": "2025-07-26", + "knowledge": "2025-06-30", + "release_date": "2025-07-21", + "last_updated": "2025-07-21", "type": "chat" - }, + } + ] + }, + "inco": { + "id": "inco", + "name": "Inco", + "display_name": "Inco", + "api": "https://api.inco.ai/v1", + "doc": "https://platform.inco.ai/docs", + "models": [ { - "id": "NousResearch/hermes-3-llama-3.1-70b", - "name": "Hermes 3 70B", - "display_name": "Hermes 3 70B", + "id": "glm-5.3:fast", + "name": "GLM-5.3 Fast", + "display_name": "GLM-5.3 Fast", "modalities": { "input": [ "text" @@ -227299,53 +220433,77 @@ ] }, "limit": { - "context": 65536, - "output": 8192 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, "open_weights": true, - "knowledge": "2023-12-31", - "release_date": "2024-08-18", - "last_updated": "2024-08-18", + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "NousResearch/hermes-4-405b:thinking", - "name": "Hermes 4 Large (Thinking)", - "display_name": "Hermes 4 Large (Thinking)", + "id": "deepseek-v4.1-flash:fast", + "name": "DeepSeek V4.1 Flash", + "display_name": "DeepSeek V4.1 Flash", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 1000000, + "output": 384000 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": true, "open_weights": true, - "knowledge": "2024-08-31", - "release_date": "2025-08-26", - "last_updated": "2025-08-26", + "knowledge": "2025-05", + "release_date": "2026-09-10", + "last_updated": "2026-09-10", "type": "chat" }, { - "id": "NousResearch/hermes-4-405b", - "name": "Hermes 4 Large", - "display_name": "Hermes 4 Large", + "id": "glm-5.3", + "name": "GLM-5.3", + "display_name": "GLM-5.3", "modalities": { "input": [ "text" @@ -227355,88 +220513,91 @@ ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 1000000, + "output": 131072 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-08-31", - "release_date": "2025-08-26", - "last_updated": "2025-08-26", - "type": "chat" - }, - { - "id": "shisa-ai/shisa-v2-llama3.3-70b", - "name": "Shisa V2 Llama 3.3 70B", - "display_name": "Shisa V2 Llama 3.3 70B", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 128000, - "output": 16384 + "supported": true, + "default": true }, - "tool_call": false, - "reasoning": { - "supported": false + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, "open_weights": true, - "release_date": "2025-07-26", - "last_updated": "2025-07-26", + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "shisa-ai/shisa-v2.1-llama3.3-70b", - "name": "Shisa V2.1 Llama 3.3 70B", - "display_name": "Shisa V2.1 Llama 3.3 70B", + "id": "kimi-k3:fast", + "name": "Kimi K3", + "display_name": "Kimi K3", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 32768, - "output": 4096 + "context": 1048576, + "output": 131072 }, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": true, "open_weights": true, - "release_date": "2024-01-01", - "last_updated": "2024-12-06", + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" }, { - "id": "aleph-alpha/kolibri-1", - "name": "Kolibri 1", - "display_name": "Kolibri 1", + "id": "glm-5.3-flash:fast", + "name": "GLM-5.3-Flash", + "display_name": "GLM-5.3-Flash", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 1048576 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -227446,82 +220607,116 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "high" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2026-06-18", - "release_date": "2026-10-03", - "last_updated": "2026-10-03", + "release_date": "2026-08-26", + "last_updated": "2026-08-26", "type": "chat" }, { - "id": "reka/reka-edge-2603", - "name": "Reka Edge 2603", - "display_name": "Reka Edge 2603", + "id": "minimax-m3", + "name": "MiniMax-M3", + "display_name": "MiniMax-M3", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 16384, - "output": 16384 + "context": 1048576, + "output": 512000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": true, "open_weights": true, - "release_date": "2026-03-11", - "last_updated": "2026-03-11", + "release_date": "2026-06-01", + "last_updated": "2026-06-01", "type": "chat" }, { - "id": "reka/reka-flash-3", - "name": "Reka Flash 3", - "display_name": "Reka Flash 3", + "id": "minimax-m3:fast", + "name": "MiniMax M3 Fast", + "display_name": "MiniMax M3 Fast", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 65536, - "output": 65536 + "context": 1048576, + "output": 512000 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": true, "open_weights": true, - "knowledge": "2025-01-31", - "release_date": "2025-03-10", - "last_updated": "2025-03-10", + "release_date": "2026-06-01", + "last_updated": "2026-06-01", "type": "chat" - }, + } + ] + }, + "nan": { + "id": "nan", + "name": "NaN", + "display_name": "NaN", + "api": "https://api.nan.builders/v1", + "doc": "https://nan.builders/docs/models", + "models": [ { - "id": "abliteration-ai/abliterated-model", - "name": "Abliterated Model", - "display_name": "Abliterated Model", + "id": "gemma4", + "name": "Gemma 4 26B A4B IT", + "display_name": "Gemma 4 26B A4B IT", "modalities": { "input": [ "text", @@ -227533,9 +220728,10 @@ }, "limit": { "context": 262144, - "output": 262134 + "output": 32768 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": true, "default": true @@ -227544,25 +220740,23 @@ "reasoning": { "effort_options": [ "none", - "minimal", "low", "medium", "high", - "xhigh", "max" ] } }, "attachment": true, - "open_weights": false, - "release_date": "2026-08-27", - "last_updated": "2026-08-27", + "open_weights": true, + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "abliteration-ai/abliterated-model-large-flash", - "name": "Abliterated Large Flash", - "display_name": "Abliterated Large Flash", + "id": "deepseek-v4-flash", + "name": "DeepSeek V4.1 Flash", + "display_name": "DeepSeek V4.1 Flash", "modalities": { "input": [ "text", @@ -227573,9 +220767,10 @@ ] }, "limit": { - "context": 1048576, - "output": 262144 + "context": 1000000, + "output": 384000 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -227583,39 +220778,51 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", "effort_options": [ - "none", - "minimal", "low", - "medium", "high", - "xhigh", "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, "attachment": true, - "open_weights": false, - "release_date": "2026-10-23", - "last_updated": "2026-10-23", + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-09-10", + "last_updated": "2026-09-10", "type": "chat" }, { - "id": "abliteration-ai/abliterated-model-large-v2", - "name": "Abliterated Model Large V2", - "display_name": "Abliterated Model Large V2", + "id": "glm5.3-flash", + "name": "GLM-5.3-Flash", + "display_name": "GLM-5.3-Flash", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 999990 + "context": 1000000, + "output": 131072 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -227624,34 +220831,39 @@ "extra_capabilities": { "reasoning": { "effort_options": [ + "minimal", "low", + "medium", "high", + "xhigh", "max" ] } }, - "attachment": false, - "open_weights": false, - "release_date": "2026-08-31", - "last_updated": "2026-08-31", + "attachment": true, + "open_weights": true, + "release_date": "2026-08-26", + "last_updated": "2026-08-26", "type": "chat" }, { - "id": "abliteration-ai/abliterated-model-large", - "name": "Abliterated Model Large", - "display_name": "Abliterated Model Large", + "id": "qwen3.6", + "name": "Qwen3.6 35B-A3B", + "display_name": "Qwen3.6 35B-A3B", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 999990 + "context": 262144, + "output": 65536 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -227661,204 +220873,54 @@ "reasoning": { "effort_options": [ "none", - "minimal", "low", "medium", "high", - "xhigh", "max" ] } }, - "attachment": false, - "open_weights": false, - "release_date": "2026-08-27", - "last_updated": "2026-08-27", - "type": "chat" - }, - { - "id": "nothingiisreal/L3.1-70B-Celeste-V0.1-BF16", - "name": "Llama 3.1 70B Celeste v0.1", - "display_name": "Llama 3.1 70B Celeste v0.1", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 32768, - "output": 16384 - }, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": true, - "release_date": "2024-01-01", - "last_updated": "2024-07-23", - "type": "chat" - }, - { - "id": "EVA-UNIT-01/EVA-Qwen2.5-32B-v0.2", - "name": "EVA-Qwen2.5-32B-v0.2", - "display_name": "EVA-Qwen2.5-32B-v0.2", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 16384, - "output": 8192 - }, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": true, - "release_date": "2025-07-26", - "last_updated": "2025-07-26", - "type": "chat" - }, - { - "id": "EVA-UNIT-01/EVA-LLaMA-3.33-70B-v0.0", - "name": "EVA Llama 3.33 70B", - "display_name": "EVA Llama 3.33 70B", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 32768, - "output": 16384 - }, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": true, - "release_date": "2025-07-26", - "last_updated": "2025-07-26", - "type": "chat" - }, - { - "id": "EVA-UNIT-01/EVA-LLaMA-3.33-70B-v0.1", - "name": "EVA-LLaMA-3.33-70B-v0.1", - "display_name": "EVA-LLaMA-3.33-70B-v0.1", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 32768, - "output": 16384 - }, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2025-09-25", - "last_updated": "2025-09-25", + "release_date": "2026-04-17", + "last_updated": "2026-04-17", "type": "chat" }, { - "id": "EVA-UNIT-01/EVA-Qwen2.5-72B-v0.2", - "name": "EVA-Qwen2.5-72B-v0.2", - "display_name": "EVA-Qwen2.5-72B-v0.2", + "id": "qwen-image-2.1", + "name": "Qwen-Image-2.1", + "display_name": "Qwen-Image-2.1", "modalities": { "input": [ "text" ], "output": [ - "text" + "image" ] }, "limit": { - "context": 16384, + "context": 8192, "output": 8192 }, + "temperature": false, "tool_call": false, "reasoning": { "supported": false }, "attachment": false, "open_weights": true, - "release_date": "2025-09-25", - "last_updated": "2025-09-25", - "type": "chat" - }, - { - "id": "meta/muse-spark-1.3-contributor", - "name": "Muse Spark 1.3 Contributor", - "display_name": "Muse Spark 1.3 Contributor", - "modalities": { - "input": [ - "text", - "image", - "video", - "audio", - "pdf" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 1048576, - "output": 943718 - }, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "minimal", - "low", - "medium", - "high", - "xhigh" - ] - } - }, - "attachment": true, - "open_weights": false, - "release_date": "2026-09-02", - "last_updated": "2026-09-02", - "type": "chat" + "release_date": "2026-09-14", + "last_updated": "2026-09-21" }, { - "id": "meta/muse-wonder", - "name": "Muse Wonder", - "display_name": "Muse Wonder", + "id": "mimo-v2.6-flash", + "name": "MiMo-V2.6-Flash", + "display_name": "MiMo-V2.6-Flash", "modalities": { "input": [ "text", "image", - "video", - "audio", - "pdf" + "audio" ], "output": [ "text" @@ -227866,8 +220928,9 @@ }, "limit": { "context": 1048576, - "output": 1048576 + "output": 131072 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -227876,32 +220939,27 @@ "extra_capabilities": { "reasoning": { "effort_options": [ - "minimal", + "none", "low", "medium", "high", - "xhigh", "max" ] } }, "attachment": true, - "open_weights": false, - "release_date": "2026-10-12", - "last_updated": "2026-10-12", + "open_weights": true, + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "meta/muse-spark-1.2-contributor", - "name": "Muse Spark 1.2 Contributor (Data Used for Training)", - "display_name": "Muse Spark 1.2 Contributor (Data Used for Training)", + "id": "glm5.3", + "name": "GLM-5.3", + "display_name": "GLM-5.3", "modalities": { "input": [ - "text", - "image", - "video", - "audio", - "pdf" + "text" ], "output": [ "text" @@ -227909,8 +220967,9 @@ }, "limit": { "context": 1000000, - "output": 65536 + "output": 131072 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -227923,20 +220982,21 @@ "low", "medium", "high", - "xhigh" + "xhigh", + "max" ] } }, - "attachment": true, - "open_weights": false, - "release_date": "2026-08-05", - "last_updated": "2026-08-05", + "attachment": false, + "open_weights": true, + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "meta/muse-spark-open", - "name": "Muse Spark Open", - "display_name": "Muse Spark Open", + "id": "qwen3.8-flash", + "name": "Qwen3.8 Flash", + "display_name": "Qwen3.8 Flash", "modalities": { "input": [ "text", @@ -227958,32 +221018,40 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ + "none", + "minimal", "low", "medium", "high", - "xhigh" + "xhigh", + "max" ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2026-01-04", - "release_date": "2026-10-15", - "last_updated": "2026-10-15", + "open_weights": false, + "release_date": "2026-08-26", + "last_updated": "2026-08-26", "type": "chat" - }, + } + ] + }, + "munito": { + "id": "munito", + "name": "Munito AI", + "display_name": "Munito AI", + "api": "https://api.munito.ai/inference/v1", + "doc": "https://docs.munito.ai/models", + "models": [ { - "id": "meta/muse-spark-1.3", - "name": "Muse Spark 1.3", - "display_name": "Muse Spark 1.3", + "id": "aleph-alpha/kolibri-1", + "name": "Kolibri 1", + "display_name": "Kolibri 1", "modalities": { "input": [ - "text", - "image", - "video", - "pdf", - "audio" + "text" ], "output": [ "text" @@ -228002,40 +221070,44 @@ "extra_capabilities": { "reasoning": { "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ - "minimal", + "none", "low", "medium", - "high", - "xhigh" + "high" ] } }, - "attachment": true, - "open_weights": false, - "release_date": "2026-09-02", - "last_updated": "2026-09-02", + "attachment": false, + "open_weights": true, + "knowledge": "2026-06-18", + "release_date": "2026-10-03", + "last_updated": "2026-10-03", "type": "chat" }, { - "id": "meta/muse-spark-1.2", - "name": "Muse Spark 1.2", - "display_name": "Muse Spark 1.2", + "id": "zai-org/glm-5.3-flash", + "name": "GLM-5.3-Flash", + "display_name": "GLM-5.3-Flash", "modalities": { "input": [ "text", "image", - "video", - "pdf", - "audio" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 1048576, + "output": 943718 }, "temperature": true, "tool_call": true, @@ -228046,42 +221118,43 @@ "extra_capabilities": { "reasoning": { "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ - "minimal", "low", - "medium", "high", - "xhigh" + "max" ] } }, "attachment": true, - "open_weights": false, - "release_date": "2026-08-05", - "last_updated": "2026-08-05", + "open_weights": true, + "release_date": "2026-08-26", + "last_updated": "2026-08-26", "type": "chat" }, { - "id": "meta/muse-spark-1.1", - "name": "Muse Spark 1.1", - "display_name": "Muse Spark 1.1", + "id": "deepseek-ai/deepseek-v4-flash", + "name": "DeepSeek V4 Flash 0731", + "display_name": "DeepSeek V4 Flash 0731", "modalities": { "input": [ - "text", - "image", - "video", - "audio" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 1048576, + "output": 943718 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, "default": true @@ -228089,25 +221162,36 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", "effort_options": [ - "minimal", "low", - "medium", "high", - "xhigh" + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, - "attachment": true, - "open_weights": false, - "release_date": "2026-04-08", - "last_updated": "2026-07-09", + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-07-31", + "last_updated": "2026-07-31", "type": "chat" }, { - "id": "meta/muse-glimmer-30b", - "name": "Muse Glimmer 30B", - "display_name": "Muse Glimmer 30B", + "id": "deepseek-ai/deepseek-v4.1-flash-1017", + "name": "DeepSeek V4.1 Flash 1017", + "display_name": "DeepSeek V4.1 Flash 1017", "modalities": { "input": [ "text", @@ -228118,8 +221202,8 @@ ] }, "limit": { - "context": 131072, - "output": 117964 + "context": 1048576, + "output": 943718 }, "temperature": true, "tool_call": true, @@ -228129,38 +221213,45 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ - "minimal", + "none", "low", - "medium", "high", - "xhigh" + "max" ] } }, "attachment": true, "open_weights": true, - "knowledge": "2026-01-04", - "release_date": "2026-08-10", - "last_updated": "2026-08-10", + "knowledge": "2025-05", + "release_date": "2026-10-17", + "last_updated": "2026-10-17", "type": "chat" }, { - "id": "fireworks/ember-1", - "name": "Ember 1", - "display_name": "Ember 1", + "id": "qwen/qwen3.8-27b", + "name": "Qwen3.8 27B", + "display_name": "Qwen3.8 27B", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 262144, + "output": 235929 }, "temperature": true, "tool_call": true, @@ -228170,115 +221261,154 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ "none", "low", - "high", - "max" + "medium", + "xhigh" ] } }, "attachment": true, - "open_weights": false, - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "open_weights": true, + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" - }, + } + ] + }, + "commandcode": { + "id": "commandcode", + "name": "CommandCode", + "display_name": "CommandCode", + "api": "https://api.commandcode.ai/provider/v1", + "doc": "https://commandcode.ai/docs/provider", + "models": [ { - "id": "meganova-ai/manta-flash-1.0", - "name": "Manta Flash 1.0", - "display_name": "Manta Flash 1.0", + "id": "gpt-6.1-terra", + "name": "GPT-6.1 Terra", + "display_name": "GPT-6.1 Terra", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 16384, - "output": 16384 + "context": 1050000, + "output": 128000 }, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": false, - "release_date": "2025-09-20", - "last_updated": "2025-12-20", - "type": "chat" - }, - { - "id": "meganova-ai/manta-mini-1.0", - "name": "Manta Mini 1.0", - "display_name": "Manta Mini 1.0", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 8192, - "output": 8192 + "supported": true, + "default": true }, - "tool_call": false, - "reasoning": { - "supported": false + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2025-09-20", - "last_updated": "2025-12-20", + "knowledge": "2026-06-01", + "release_date": "2026-10-26", + "last_updated": "2026-10-26", "type": "chat" }, { - "id": "meganova-ai/manta-pro-1.0", - "name": "Manta Pro 1.0", - "display_name": "Manta Pro 1.0", + "id": "claude-fable-5", + "name": "Claude Fable 5", + "display_name": "Claude Fable 5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 65536, - "output": 32768 + "context": 1000000, + "output": 128000 }, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", + "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", + "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." + ] + } + }, + "attachment": true, "open_weights": false, - "release_date": "2025-09-20", - "last_updated": "2025-12-20", + "knowledge": "2026-01-31", + "release_date": "2026-06-09", + "last_updated": "2026-06-09", "type": "chat" }, { - "id": "ibm-granite/granite-4.2-8b", - "name": "Granite 4.2 8B", - "display_name": "Granite 4.2 8B", + "id": "gpt-5.6-terra", + "name": "GPT-5.6 Terra", + "display_name": "GPT-5.6 Terra", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 117964 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -228286,141 +221416,165 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ "none", "low", + "medium", + "high", + "xhigh", + "max" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", "high" - ] + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-08-25", - "last_updated": "2026-08-25", - "type": "chat" - }, - { - "id": "MiniMaxAI/MiniMax-M1-80k", - "name": "MiniMax M1 80K", - "display_name": "MiniMax M1 80K", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 1000000, - "output": 131072 - }, - "temperature": true, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": true, - "release_date": "2025-06-17", - "last_updated": "2025-06-17", + "attachment": true, + "open_weights": false, + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "inclusionai/ling-3.0-flash-vl", - "name": "Ling 3.0 Flash VL", - "display_name": "Ling 3.0 Flash VL", + "id": "gpt-5.4", + "name": "GPT-5.4", + "display_name": "GPT-5.4", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 400000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", "effort_options": [ "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ "low", "medium", "high" - ] + ], + "visibility": "hidden" } }, "attachment": true, - "open_weights": true, - "release_date": "2026-09-10", - "last_updated": "2026-09-10", + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-03-05", + "last_updated": "2026-03-05", "type": "chat" }, { - "id": "inclusionai/ling-3.1-flash", - "name": "Ling 3.1 Flash", - "display_name": "Ling 3.1 Flash", + "id": "claude-sonnet-4-6", + "name": "Claude Sonnet 4.6", + "display_name": "Claude Sonnet 4.6", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 1000000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", "effort_options": [ - "none", "low", "medium", - "high" + "high", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-09-29", - "last_updated": "2026-09-29", + "attachment": true, + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-02-17", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "inclusionai/ling-3.0-flash:thinking", - "name": "Ling 3.0 Flash Thinking", - "display_name": "Ling 3.0 Flash Thinking", + "id": "gpt-5.6-sol", + "name": "GPT-5.6 Sol", + "display_name": "GPT-5.6 Sol", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -228428,53 +221582,90 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ "none", - "minimal", "low", "medium", "high", - "xhigh" - ] + "xhigh", + "max" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-07-23", - "last_updated": "2026-07-23", + "attachment": true, + "open_weights": false, + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "inclusionai/ling-3.0-flash", - "name": "Ling 3.0 Flash", - "display_name": "Ling 3.0 Flash", + "id": "gpt-5.4-mini", + "name": "GPT-5.4 mini", + "display_name": "GPT-5.4 mini", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 400000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false }, - "attachment": false, - "open_weights": true, - "release_date": "2026-07-23", - "last_updated": "2026-07-23", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-03-17", + "last_updated": "2026-03-17", "type": "chat" }, { - "id": "sakana/fugu-max", - "name": "Fugu Max", - "display_name": "Fugu Max", + "id": "gpt-5.6-luna", + "name": "GPT-5.6 Luna", + "display_name": "GPT-5.6 Luna", "modalities": { "input": [ "text", @@ -228486,7 +221677,7 @@ ] }, "limit": { - "context": 1000000, + "context": 1050000, "output": 128000 }, "temperature": false, @@ -228497,27 +221688,43 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ + "none", + "low", + "medium", "high", "xhigh", "max" - ] + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "release_date": "2026-09-11", - "last_updated": "2026-09-11", + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "sakana/fugu-ultra", - "name": "Fugu Ultra", - "display_name": "Fugu Ultra", + "id": "claude-opus-4-7", + "name": "Claude Opus 4.7", + "display_name": "Claude Opus 4.7", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" @@ -228525,37 +221732,56 @@ }, "limit": { "context": 1000000, - "output": 16384 + "output": 128000 }, "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "high", "effort_options": [ + "low", + "medium", "high", "xhigh", "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-06-15", - "last_updated": "2026-06-15", + "knowledge": "2026-01-31", + "release_date": "2026-04-16", + "last_updated": "2026-04-16", "type": "chat" }, { - "id": "sakana/fugu-ultra-v1.1", - "name": "Fugu Ultra v1.1", - "display_name": "Fugu Ultra v1.1", + "id": "claude-fable-5-1", + "name": "Claude Fable 5.1", + "display_name": "Claude Fable 5.1", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" @@ -228563,8 +221789,9 @@ }, "limit": { "context": 1000000, - "output": 16384 + "output": 128000 }, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -228572,245 +221799,182 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", "effort_options": [ + "low", + "medium", "high", "xhigh", "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", + "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", + "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-07-24", - "last_updated": "2026-07-24", - "type": "chat" - }, - { - "id": "Sao10K/L3-8B-Stheno-v3.2", - "name": "Sao10K Stheno 8b", - "display_name": "Sao10K Stheno 8b", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 16384, - "output": 8192 - }, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": true, - "release_date": "2024-01-01", - "last_updated": "2024-11-29", - "type": "chat" - }, - { - "id": "Sao10K/L3.1-70B-Hanami-x1", - "name": "Llama 3.1 70B Hanami", - "display_name": "Llama 3.1 70B Hanami", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 32768, - "output": 16384 - }, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": true, - "release_date": "2024-01-01", - "last_updated": "2024-07-23", - "type": "chat" - }, - { - "id": "Sao10K/L3.3-70B-Euryale-v2.3", - "name": "Llama 3.3 70B Euryale", - "display_name": "Llama 3.3 70B Euryale", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 20480, - "output": 16384 - }, - "temperature": true, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": true, - "knowledge": "2023-12-31", - "release_date": "2024-12-18", - "last_updated": "2024-12-18", + "knowledge": "2026-06", + "release_date": "2026-09-01", + "last_updated": "2026-09-01", "type": "chat" }, { - "id": "Sao10K/L3.1-70B-Euryale-v2.2", - "name": "Llama 3.1 70B Euryale", - "display_name": "Llama 3.1 70B Euryale", + "id": "gpt-5.3-codex", + "name": "GPT-5.3 Codex", + "display_name": "GPT-5.3 Codex", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 20480, - "output": 16384 + "context": 400000, + "output": 128000 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": true, - "knowledge": "2023-12-31", - "release_date": "2024-08-28", - "last_updated": "2024-08-28", - "type": "chat" - }, - { - "id": "THUDM/GLM-4-32B-0414", - "name": "GLM 4 32B 0414", - "display_name": "GLM 4 32B 0414", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 128000, - "output": 65536 + "supported": true, + "default": true }, - "tool_call": false, - "reasoning": { - "supported": false + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } }, - "attachment": false, - "open_weights": true, - "release_date": "2024-01-01", - "last_updated": "2025-04-14", + "attachment": true, + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-02-05", + "last_updated": "2026-02-05", "type": "chat" }, { - "id": "THUDM/GLM-4-9B-0414", - "name": "GLM 4 9B 0414", - "display_name": "GLM 4 9B 0414", + "id": "gpt-6-luna", + "name": "GPT-6 Luna", + "display_name": "GPT-6 Luna", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 32000, - "output": 8000 + "context": 1050000, + "output": 128000 }, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": true, - "release_date": "2024-01-01", - "last_updated": "2025-04-14", - "type": "chat" - }, - { - "id": "THUDM/GLM-Z1-9B-0414", - "name": "GLM Z1 9B 0414", - "display_name": "GLM Z1 9B 0414", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 32000, - "output": 8000 + "supported": true, + "default": true }, - "tool_call": false, - "reasoning": { - "supported": false + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } }, - "attachment": false, - "open_weights": true, - "release_date": "2024-01-01", - "last_updated": "2025-04-14", + "attachment": true, + "open_weights": false, + "knowledge": "2026-05-18", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "nvidia/nemotron-3.5-content-safety", - "name": "Nemotron 3.5 Content Safety", - "display_name": "Nemotron 3.5 Content Safety", + "id": "claude-opus-5-5", + "name": "Claude Opus 5.5", + "display_name": "Claude Opus 5.5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 1000000, + "output": 128000 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { - "supported": true + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-06-02", - "last_updated": "2026-06-02", + "attachment": true, + "open_weights": false, + "knowledge": "2026-06", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "nvidia/nemotron-3.5-lightning:thinking", - "name": "Nvidia Nemotron 3.5 Lightning Thinking", - "display_name": "Nvidia Nemotron 3.5 Lightning Thinking", + "id": "claude-opus-4-8", + "name": "Claude Opus 4.8", + "display_name": "Claude Opus 4.8", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" @@ -228818,103 +221982,161 @@ }, "limit": { "context": 1000000, - "output": 65536 + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "high", "effort_options": [ - "none", - "high" + "low", + "medium", + "high", + "xhigh", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-09", - "release_date": "2026-08-11", - "last_updated": "2026-08-11", + "attachment": true, + "open_weights": false, + "knowledge": "2026-01", + "release_date": "2026-05-28", + "last_updated": "2026-05-28", "type": "chat" }, { - "id": "nvidia/nemotron-3-nano-30b-a3b", - "name": "Nvidia Nemotron 3 Nano 30B", - "display_name": "Nvidia Nemotron 3 Nano 30B", + "id": "claude-opus-5", + "name": "Claude Opus 5", + "display_name": "Claude Opus 5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 235929 + "context": 1000000, + "output": 128000 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-06-25", - "release_date": "2025-12-15", - "last_updated": "2025-12-15", + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2026-05", + "release_date": "2026-07-24", + "last_updated": "2026-07-24", "type": "chat" }, { - "id": "nvidia/nemotron-3-ultra-550b-a55b:thinking", - "name": "Nvidia Nemotron 3 Ultra 550B Thinking", - "display_name": "Nvidia Nemotron 3 Ultra 550B Thinking", + "id": "claude-haiku-4-5-20251001", + "name": "Claude Haiku 4.5", + "display_name": "Claude Haiku 4.5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-09", - "release_date": "2026-06-04", - "last_updated": "2026-06-04", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-02-28", + "release_date": "2025-10-15", + "last_updated": "2025-10-15", "type": "chat" }, { - "id": "nvidia/nemotron-3.5-lightning", - "name": "Nvidia Nemotron 3.5 Lightning", - "display_name": "Nvidia Nemotron 3.5 Lightning", + "id": "gpt-6-sol", + "name": "GPT-6 Sol", + "display_name": "GPT-6 Sol", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -228922,27 +222144,31 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ - "none", - "high" + "low", + "medium", + "high", + "xhigh", + "max" ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-09", - "release_date": "2026-08-11", - "last_updated": "2026-08-11", + "attachment": true, + "open_weights": false, + "knowledge": "2026-04-20", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "nvidia/nemotron-3-ultra-550b-a55b", - "name": "Nvidia Nemotron 3 Ultra 550B", - "display_name": "Nvidia Nemotron 3 Ultra 550B", + "id": "claude-haiku-5-5", + "name": "Claude Haiku 5.5", + "display_name": "Claude Haiku 5.5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" @@ -228950,9 +222176,9 @@ }, "limit": { "context": 1000000, - "output": 65536 + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -228960,64 +222186,83 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-09", - "release_date": "2026-06-04", - "last_updated": "2026-06-04", + "attachment": true, + "open_weights": false, + "knowledge": "2026-06", + "release_date": "2026-10-07", + "last_updated": "2026-10-07", "type": "chat" }, { - "id": "nvidia/nemotron-3-super-120b-a12b:thinking", - "name": "Nvidia Nemotron 3 Super 120B Thinking", - "display_name": "Nvidia Nemotron 3 Super 120B Thinking", + "id": "gpt-6.1-sol", + "name": "GPT-6.1 Sol", + "display_name": "GPT-6.1 Sol", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 16384 + "context": 1050000, + "output": 128000 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-06", - "release_date": "2026-03-11", - "last_updated": "2026-03-11", + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2026-04-30", + "release_date": "2026-09-29", + "last_updated": "2026-09-29", "type": "chat" }, { - "id": "nvidia/nemotron-3.5-super-vl", - "name": "Nvidia Nemotron 3.5 Super VL", - "display_name": "Nvidia Nemotron 3.5 Super VL", + "id": "claude-sonnet-5-5", + "name": "Claude Sonnet 5.5", + "display_name": "Claude Sonnet 5.5", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 16384 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -229026,105 +222271,163 @@ "extra_capabilities": { "reasoning": { "effort_options": [ - "none", + "low", "medium", - "high" + "high", + "xhigh", + "max" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-10-15", - "last_updated": "2026-10-15", + "open_weights": false, + "knowledge": "2026-06", + "release_date": "2026-09-28", + "last_updated": "2026-09-28", "type": "chat" }, { - "id": "nvidia/nemotron-3-super-120b-a12b", - "name": "Nvidia Nemotron 3 Super 120B", - "display_name": "Nvidia Nemotron 3 Super 120B", + "id": "claude-sonnet-5", + "name": "Claude Sonnet 5", + "display_name": "Claude Sonnet 5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 16384 + "context": 1000000, + "output": 128000 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-06", - "release_date": "2026-03-11", - "last_updated": "2026-03-11", + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2026-01-31", + "release_date": "2026-06-30", + "last_updated": "2026-06-30", "type": "chat" }, { - "id": "nvidia/Llama-3.3-Nemotron-Super-49B-v1", - "name": "Nvidia Nemotron Super 49B", - "display_name": "Nvidia Nemotron Super 49B", + "id": "gpt-5.5", + "name": "GPT-5.5", + "display_name": "GPT-5.5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 400000, + "output": 128000 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "release_date": "2025-03-18", - "last_updated": "2025-03-18", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-12-01", + "release_date": "2026-04-23", + "last_updated": "2026-04-23", "type": "chat" }, { - "id": "nvidia/Llama-3.1-Nemotron-70B-Instruct-HF", - "name": "Nvidia Nemotron 70b", - "display_name": "Nvidia Nemotron 70b", + "id": "gpt-6-astra", + "name": "GPT-6 Astra", + "display_name": "GPT-6 Astra", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 16384, - "output": 8192 + "context": 1050000, + "output": 128000 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "release_date": "2025-04-15", - "last_updated": "2025-04-15", + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2026-04-30", + "release_date": "2026-09-04", + "last_updated": "2026-09-04", "type": "chat" }, { - "id": "nex-agi/nex-n2.5-pro", - "name": "Nex N2.5 Pro", - "display_name": "Nex N2.5 Pro", + "id": "xai/grok-4.6", + "name": "Grok 4.6", + "display_name": "Grok 4.6", "modalities": { "input": [ "text", @@ -229135,9 +222438,10 @@ ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 500000, + "output": 500000 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -229145,23 +222449,26 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ - "none", + "low", "medium", - "high" + "high", + "xhigh" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "open_weights": false, + "knowledge": "2026-02-01", + "release_date": "2026-08-12", + "last_updated": "2026-08-12", "type": "chat" }, { - "id": "nex-agi/nex-n2.5-mini", - "name": "Nex N2.5 Mini", - "display_name": "Nex N2.5 Mini", + "id": "xai/grok-4.5", + "name": "Grok 4.5", + "display_name": "Grok 4.5", "modalities": { "input": [ "text", @@ -229172,72 +222479,48 @@ ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 500000, + "output": 500000 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ - "none", + "low", "medium", "high" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-09-22", - "last_updated": "2026-09-22", - "type": "chat" - }, - { - "id": "ReadyArt/MS3.2-The-Omega-Directive-24B-Unslop-v2.0", - "name": "Omega Directive 24B Unslop v2.0", - "display_name": "Omega Directive 24B Unslop v2.0", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 32768, - "output": 32768 - }, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": true, - "release_date": "2025-12-08", - "last_updated": "2025-12-08", + "open_weights": false, + "release_date": "2026-07-08", + "last_updated": "2026-07-08", "type": "chat" }, { - "id": "google/gemma-4-26b-a4b-it:thinking", - "name": "Gemma 4 26B A4B Thinking", - "display_name": "Gemma 4 26B A4B Thinking", + "id": "xai/grok-4.7", + "name": "Grok 4.7", + "display_name": "Grok 4.7", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 131072 + "context": 500000, + "output": 500000 }, "temperature": true, "tool_call": true, @@ -229245,84 +222528,78 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "high", + "xhigh" + ] + } + }, "attachment": true, - "open_weights": true, - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "open_weights": false, + "knowledge": "2026-05", + "release_date": "2026-09-21", + "last_updated": "2026-09-21", "type": "chat" }, { - "id": "google/gemini-3-flash-preview-thinking", - "name": "Gemini 3 Flash Thinking", - "display_name": "Gemini 3 Flash Thinking", + "id": "moonshotai/Kimi-K2.7-Code", + "name": "Kimi K2.7 Code", + "display_name": "Kimi K2.7 Code", "modalities": { "input": [ "text", "image", - "video", - "audio" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 256000, + "output": 256000 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", - "low", - "medium", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] + "supported": true } }, "attachment": true, - "open_weights": false, + "open_weights": true, "knowledge": "2025-01", - "release_date": "2025-12-17", - "last_updated": "2025-12-17", + "release_date": "2026-06-12", + "last_updated": "2026-06-12", "type": "chat" }, { - "id": "google/gemini-flash-latest", - "name": "Gemini Flash Latest", - "display_name": "Gemini Flash Latest", + "id": "moonshotai/Kimi-K3", + "name": "Kimi K3", + "display_name": "Kimi K3", "modalities": { "input": [ "text", "image", - "video", - "audio", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 1000000, + "output": 131072 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -229330,66 +222607,71 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ - "minimal", "low", - "medium", - "high" + "high", + "max" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-08-13", - "last_updated": "2026-08-13", + "open_weights": true, + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" }, { - "id": "google/gemma-4-26b-a4b-it-cybersecurity", - "name": "Gemma 4 26B A4B Cybersecurity", - "display_name": "Gemma 4 26B A4B Cybersecurity", + "id": "moonshotai/Kimi-K2.7-Code-Highspeed", + "name": "Kimi K2.7 Code Highspeed", + "display_name": "Kimi K2.7 Code Highspeed", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 262000, + "output": 262000 }, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, "attachment": true, "open_weights": true, - "release_date": "2026-09-19", - "last_updated": "2026-09-19", + "knowledge": "2025-01", + "release_date": "2026-06-12", + "last_updated": "2026-06-12", "type": "chat" }, { - "id": "google/gemma-4-31b-it", - "name": "Gemma 4 31B", - "display_name": "Gemma 4 31B", + "id": "deepseek/deepseek-v4-flash", + "name": "DeepSeek V4 Flash", + "display_name": "DeepSeek V4 Flash", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 131072 + "context": 1000000, + "output": 384000 }, "temperature": true, "tool_call": true, @@ -229399,37 +222681,51 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "high", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." + ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "google/gemini-4-argon", - "name": "Gemini 4 Argon", - "display_name": "Gemini 4 Argon", + "id": "deepseek/deepseek-v4.1-flash", + "name": "DeepSeek V4.1 Flash", + "display_name": "DeepSeek V4.1 Flash", "modalities": { "input": [ "text", - "image", - "video", - "audio", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 1000000, + "output": 384000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -229437,38 +222733,36 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ "low", - "medium", - "high" + "high", + "max" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-10-13", - "last_updated": "2026-10-13", + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-09-10", + "last_updated": "2026-09-10", "type": "chat" }, { - "id": "google/gemini-3.5-flash", - "name": "Gemini 3.5 Flash", - "display_name": "Gemini 3.5 Flash", + "id": "deepseek/deepseek-v4-flash-fast", + "name": "DeepSeek V4 Flash Fast", + "display_name": "DeepSeek V4 Flash Fast", "modalities": { "input": [ - "text", - "image", - "video", - "audio" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 1000000, + "output": 384000 }, "temperature": true, "tool_call": true, @@ -229478,49 +222772,38 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", + "effort_options": [ "low", - "medium", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" + "high", + "max" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-05-19", - "last_updated": "2026-05-19", + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "google/gemini-pro-latest", - "name": "Gemini Pro Latest", - "display_name": "Gemini Pro Latest", + "id": "deepseek/deepseek-v4.1-flash-fast", + "name": "DeepSeek V4.1 Flash Fast", + "display_name": "DeepSeek V4.1 Flash Fast", "modalities": { "input": [ "text", - "image", - "video", - "audio" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 1000000, + "output": 384000 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -229530,38 +222813,37 @@ "reasoning": { "effort_options": [ "low", - "medium", - "high" + "high", + "max" ] } }, "attachment": true, - "open_weights": false, - "release_date": "2026-03-29", - "last_updated": "2026-03-29", + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-09-10", + "last_updated": "2026-09-10", "type": "chat" }, { - "id": "google/gemini-3.5-flash-thinking", - "name": "Gemini 3.5 Flash Thinking", - "display_name": "Gemini 3.5 Flash Thinking", + "id": "deepseek/deepseek-v4-flash-vision-exp", + "name": "DeepSeek V4 Flash Vision Exp", + "display_name": "DeepSeek V4 Flash Vision Exp", "modalities": { "input": [ "text", - "image", - "video", - "audio" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 1000000, + "output": 384000 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, "default": true @@ -229570,46 +222852,45 @@ "reasoning": { "supported": true, "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", + "mode": "effort", + "effort": "high", + "effort_options": [ "low", - "medium", - "high" + "high", + "max" ], + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" + ], + "notes": [ + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-05-19", - "last_updated": "2026-05-19", + "open_weights": true, + "release_date": "2026-08-21", + "last_updated": "2026-09-01", "type": "chat" }, { - "id": "google/gemini-3.1-pro-preview-high", - "name": "Gemini 3.1 Pro (Preview High)", - "display_name": "Gemini 3.1 Pro (Preview High)", + "id": "deepseek/deepseek-v4-pro", + "name": "DeepSeek V4 Pro", + "display_name": "DeepSeek V4 Pro", "modalities": { "input": [ - "text", - "image", - "video", - "audio" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 1000000, + "output": 384000 }, "temperature": true, "tool_call": true, @@ -229621,43 +222902,46 @@ "reasoning": { "supported": true, "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ + "mode": "effort", + "effort": "high", + "effort_options": [ "low", - "high" + "high", + "max" ], + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" + ], + "notes": [ + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-02-19", - "last_updated": "2026-02-19", + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "google/gemma-4-31b-it:thinking", - "name": "Gemma 4 31B Thinking", - "display_name": "Gemma 4 31B Thinking", + "id": "nvidia/nemotron-3-ultra-550b-a55b", + "name": "Nemotron 3 Ultra 550B A55B", + "display_name": "Nemotron 3 Ultra 550B A55B", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 131072 + "context": 1000000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -229665,23 +222949,27 @@ "supported": true, "default": true }, - "attachment": true, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": false, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "knowledge": "2025-09", + "release_date": "2026-06-04", + "last_updated": "2026-06-04", "type": "chat" }, { - "id": "google/gemini-3.5-flash-lite", - "name": "Gemini 3.5 Flash Lite", - "display_name": "Gemini 3.5 Flash Lite", + "id": "z-ai/glm-5.3-flashx", + "name": "GLM-5.3-FlashX", + "display_name": "GLM-5.3-FlashX", "modalities": { "input": [ "text", "image", "video", - "audio", "pdf" ], "output": [ @@ -229689,8 +222977,8 @@ ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -229700,40 +222988,37 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ - "minimal", "low", - "medium", - "high" + "high", + "max" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-07-21", - "last_updated": "2026-07-21", + "open_weights": true, + "release_date": "2026-08-26", + "last_updated": "2026-08-26", "type": "chat" }, { - "id": "google/gemini-3.1-pro-preview", - "name": "Gemini 3.1 Pro (Preview)", - "display_name": "Gemini 3.1 Pro (Preview)", + "id": "z-ai/glm-5.3-flash", + "name": "GLM-5.3-Flash", + "display_name": "GLM-5.3-Flash", "modalities": { "input": [ "text", "image", "video", - "audio" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -229744,74 +223029,37 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ + "effort_options": [ "low", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" + "high", + "max" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-02-19", - "last_updated": "2026-02-19", - "type": "chat" - }, - { - "id": "google/gemma4-31b-splituntied", - "name": "Gemma 4 31B Split-Untied", - "display_name": "Gemma 4 31B Split-Untied", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 262144, - "output": 32768 - }, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": false, "open_weights": true, - "release_date": "2026-09-17", - "last_updated": "2026-09-17", + "release_date": "2026-08-26", + "last_updated": "2026-08-26", "type": "chat" }, { - "id": "google/gemini-3.8-flash", - "name": "Gemini 3.8 Flash", - "display_name": "Gemini 3.8 Flash", + "id": "sakana/fugu-ultra", + "name": "Fugu Ultra", + "display_name": "Fugu Ultra", "modalities": { "input": [ "text", - "image", - "video", - "audio", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -229819,47 +223067,37 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", - "low", - "medium", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" + "effort_options": [ + "high", + "xhigh" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-09-02", - "last_updated": "2026-09-02", + "release_date": "2026-06-15", + "last_updated": "2026-06-15", "type": "chat" }, { - "id": "google/diffusiongemma", - "name": "DiffusionGemma", - "display_name": "DiffusionGemma", + "id": "mistral/mistral-large-4", + "name": "Mistral Large 4", + "display_name": "Mistral Large 4", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 524288, + "output": 262144 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, "default": true @@ -229867,37 +223105,31 @@ "extra_capabilities": { "reasoning": { "effort_options": [ - "none", - "xhigh" + "high" ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-06-09", - "last_updated": "2026-07-15", + "attachment": true, + "open_weights": false, + "release_date": "2026-10-06", + "last_updated": "2026-10-06", "type": "chat" }, { - "id": "google/gemini-3.7-flash", - "name": "Gemini 3.7 Flash", - "display_name": "Gemini 3.7 Flash", + "id": "MiniMaxAI/MiniMax-M2.7", + "name": "MiniMax-M2.7", + "display_name": "MiniMax-M2.7", "modalities": { "input": [ - "text", - "image", - "video", - "audio", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 200000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -229908,48 +223140,35 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", - "low", - "medium", - "high" - ], + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-08-13", - "last_updated": "2026-08-13", + "attachment": false, + "open_weights": true, + "release_date": "2026-03-18", + "last_updated": "2026-03-18", "type": "chat" }, { - "id": "google/gemini-flash-lite-latest", - "name": "Gemini Flash Lite Latest", - "display_name": "Gemini Flash Lite Latest", + "id": "MiniMaxAI/MiniMax-M2.5", + "name": "MiniMax-M2.5", + "display_name": "MiniMax-M2.5", "modalities": { "input": [ - "text", - "image", - "video", - "audio", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 200000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -229959,39 +223178,32 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "minimal", - "low", - "medium", - "high" - ] + "supported": true } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-07-21", - "last_updated": "2026-07-21", + "attachment": false, + "open_weights": true, + "release_date": "2026-02-12", + "last_updated": "2026-02-12", "type": "chat" }, { - "id": "google/gemini-3-flash-preview", - "name": "Gemini 3 Flash (Preview)", - "display_name": "Gemini 3 Flash (Preview)", + "id": "MiniMaxAI/MiniMax-M3", + "name": "MiniMax-M3", + "display_name": "MiniMax-M3", "modalities": { "input": [ "text", "image", - "video", - "audio" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 1000000, + "output": 512000 }, "temperature": true, "tool_call": true, @@ -230001,49 +223213,30 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", - "low", - "medium", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] + "supported": true } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-12-17", - "last_updated": "2025-12-17", + "open_weights": true, + "release_date": "2026-06-01", + "last_updated": "2026-06-01", "type": "chat" }, { - "id": "google/gemini-3.6-flash", - "name": "Gemini 3.6 Flash", - "display_name": "Gemini 3.6 Flash", + "id": "stepfun/Step-3.5-Flash", + "name": "Step 3.5 Flash", + "display_name": "Step 3.5 Flash", "modalities": { "input": [ - "text", - "image", - "video", - "audio", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 256000, + "output": 256000 }, "temperature": true, "tool_call": true, @@ -230053,47 +223246,36 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", + "effort_options": [ "low", - "medium", "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-07-21", - "last_updated": "2026-07-21", + "attachment": false, + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-01-29", + "last_updated": "2026-02-13", "type": "chat" }, { - "id": "google/gemini-3.1-pro-preview-low", - "name": "Gemini 3.1 Pro (Preview Low)", - "display_name": "Gemini 3.1 Pro (Preview Low)", + "id": "stepfun/Step-3.7-Flash", + "name": "Step 3.7 Flash", + "display_name": "Step 3.7 Flash", "modalities": { "input": [ "text", "image", - "audio" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 256000, + "output": 256000 }, "temperature": true, "tool_call": true, @@ -230103,46 +223285,37 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ + "effort_options": [ "low", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" + "medium", + "high" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-02-19", - "last_updated": "2026-02-19", + "open_weights": true, + "knowledge": "2026-03-01", + "release_date": "2026-05-29", + "last_updated": "2026-05-29", "type": "chat" }, { - "id": "google/gemini-3.1-pro-preview-customtools", - "name": "Gemini 3.1 Pro (Preview Custom Tools)", - "display_name": "Gemini 3.1 Pro (Preview Custom Tools)", + "id": "stepfun/Step-5-Preview", + "name": "Step 5 Preview", + "display_name": "Step 5 Preview", "modalities": { "input": [ "text", "image", - "video", - "audio" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 1000000, + "output": 1000000 }, "temperature": true, "tool_call": true, @@ -230152,38 +223325,28 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ + "effort_options": [ "low", + "medium", "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-02-19", - "last_updated": "2026-02-19", + "open_weights": true, + "release_date": "2026-09-16", + "last_updated": "2026-09-20", "type": "chat" }, { - "id": "google/gemini-3.1-flash-lite", - "name": "Gemini 3.1 Flash Lite", - "display_name": "Gemini 3.1 Flash Lite", + "id": "Qwen/Qwen3.8-Max-0902", + "name": "Qwen3.8 Max 0902", + "display_name": "Qwen3.8 Max 0902", "modalities": { "input": [ "text", "image", "video", - "audio", "pdf" ], "output": [ @@ -230191,8 +223354,8 @@ ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -230202,30 +223365,28 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ - "minimal", "low", "medium", - "high" + "xhigh" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-05-07", - "last_updated": "2026-05-07", + "release_date": "2026-09-02", + "last_updated": "2026-09-02", "type": "chat" }, { - "id": "google/gemma-4-26b-a4b-it", - "name": "Gemma 4 26B A4B", - "display_name": "Gemma 4 26B A4B", + "id": "Qwen/Qwen3.8-Omni-Flash", + "name": "Qwen3.8 Omni Flash", + "display_name": "Qwen3.8 Omni Flash", "modalities": { "input": [ "text", "image", + "audio", "video" ], "output": [ @@ -230233,7 +223394,7 @@ ] }, "limit": { - "context": 262144, + "context": 1000000, "output": 131072 }, "temperature": true, @@ -230244,77 +223405,107 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "effort_options": [ + "low", + "medium", + "xhigh" + ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "open_weights": false, + "release_date": "2026-09-17", + "last_updated": "2026-09-17", "type": "chat" }, { - "id": "deepcogito/cogito-v1-preview-qwen-32B", - "name": "Cogito v1 Preview Qwen 32B", - "display_name": "Cogito v1 Preview Qwen 32B", + "id": "Qwen/Qwen3.8-27B", + "name": "Qwen3.8 27B", + "display_name": "Qwen3.8 27B", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 128000, + "context": 262144, "output": 32768 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "xhigh" + ] + } + }, + "attachment": true, "open_weights": true, - "release_date": "2025-05-10", - "last_updated": "2025-05-10", + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "unsloth/gemma-3-27b-it", - "name": "Gemma 3 27B IT", - "display_name": "Gemma 3 27B IT", + "id": "Qwen/Qwen3.8-Flash", + "name": "Qwen3.8 Flash", + "display_name": "Qwen3.8 Flash", "modalities": { "input": [ "text", - "pdf" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 96000 + "context": 1000000, + "output": 131072 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "low", + "medium", + "xhigh" + ] + } }, "attachment": true, - "open_weights": true, - "knowledge": "2024-08", - "release_date": "2025-03-12", - "last_updated": "2025-03-12", + "open_weights": false, + "release_date": "2026-08-26", + "last_updated": "2026-08-26", "type": "chat" }, { - "id": "unsloth/gemma-3-12b-it", - "name": "Gemma 3 12B IT", - "display_name": "Gemma 3 12B IT", + "id": "Qwen/Qwen3.8-Max", + "name": "Qwen3.8 Max", + "display_name": "Qwen3.8 Max", "modalities": { "input": [ "text", + "image", + "video", "pdf" ], "output": [ @@ -230322,147 +223513,219 @@ ] }, "limit": { - "context": 131072, - "output": 16384 + "context": 1000000, + "output": 131072 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "low", + "medium", + "xhigh" + ] + } }, "attachment": true, - "open_weights": true, - "knowledge": "2024-08", - "release_date": "2025-03-12", - "last_updated": "2025-03-12", + "open_weights": false, + "release_date": "2026-08-03", + "last_updated": "2026-08-03", "type": "chat" }, { - "id": "unsloth/gemma-3-4b-it", - "name": "Gemma 3 4B IT", - "display_name": "Gemma 3 4B IT", + "id": "meta/muse-spark-1.2", + "name": "Muse Spark 1.2", + "display_name": "Muse Spark 1.2", "modalities": { "input": [ "text", - "pdf" + "image", + "video", + "pdf", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 1048576, + "output": 131072 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "low", + "medium", + "high", + "xhigh" + ] + } }, "attachment": true, - "open_weights": true, - "knowledge": "2024-08", - "release_date": "2025-03-12", - "last_updated": "2025-03-12", + "open_weights": false, + "release_date": "2026-08-05", + "last_updated": "2026-08-05", "type": "chat" }, { - "id": "minimax/minimax-m2", - "name": "MiniMax M2", - "display_name": "MiniMax M2", + "id": "meta/muse-spark-1.2-contributor", + "name": "Muse Spark 1.2 (Contributor)", + "display_name": "Muse Spark 1.2 (Contributor)", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "pdf", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 200000, + "context": 1048576, "output": 131072 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": false, - "open_weights": true, - "release_date": "2025-10-27", - "last_updated": "2025-10-27", + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "high", + "xhigh" + ] + } + }, + "attachment": true, + "open_weights": false, + "release_date": "2026-08-05", + "last_updated": "2026-08-05", "type": "chat" }, { - "id": "minimax/minimax-latest", - "name": "MiniMax Latest", - "display_name": "MiniMax Latest", + "id": "meta/muse-spark-1.1", + "name": "Muse Spark 1.1", + "display_name": "Muse Spark 1.1", "modalities": { "input": [ "text", - "image" + "image", + "pdf", + "video" ], "output": [ "text" ] }, "limit": { - "context": 512000, - "output": 80000 + "context": 1048576, + "output": 131072 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "low", + "medium", + "high", + "xhigh" + ] + } + }, "attachment": true, - "open_weights": true, - "release_date": "2026-05-03", - "last_updated": "2026-05-03", + "open_weights": false, + "release_date": "2026-04-08", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "minimax/minimax-m2.7-turbo", - "name": "MiniMax M2.7 Turbo", - "display_name": "MiniMax M2.7 Turbo", + "id": "meta/muse-wonder-1.0", + "name": "Muse Wonder", + "display_name": "Muse Wonder", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "pdf", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 204800, + "context": 1048576, "output": 131072 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": false, - "open_weights": true, - "release_date": "2026-03-18", - "last_updated": "2026-03-18", + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + }, + "attachment": true, + "open_weights": false, + "release_date": "2026-10-12", + "last_updated": "2026-10-12", "type": "chat" }, { - "id": "minimax/minimax-m2.5", - "name": "MiniMax M2.5", - "display_name": "MiniMax M2.5", + "id": "meta/muse-spark-1.3-contributor", + "name": "Muse Spark 1.3 (Contributor)", + "display_name": "Muse Spark 1.3 (Contributor)", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "pdf", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 204800, + "context": 1048576, "output": 131072 }, "temperature": true, @@ -230473,24 +223736,31 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "effort_options": [ + "low", + "medium", + "high", + "xhigh" + ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-02-12", - "last_updated": "2026-02-12", + "attachment": true, + "open_weights": false, + "release_date": "2026-09-02", + "last_updated": "2026-09-02", "type": "chat" }, { - "id": "minimax/minimax-m3.1-flash", - "name": "MiniMax M3.1 Flash", - "display_name": "MiniMax M3.1 Flash", + "id": "meta/muse-spark-1.3", + "name": "Muse Spark 1.3", + "display_name": "Muse Spark 1.3", "modalities": { "input": [ "text", "image", - "video" + "video", + "pdf", + "audio" ], "output": [ "text" @@ -230498,7 +223768,7 @@ }, "limit": { "context": 1048576, - "output": 524288 + "output": 131072 }, "temperature": true, "tool_call": true, @@ -230508,6 +223778,7 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ "low", "medium", @@ -230519,41 +223790,50 @@ }, "attachment": true, "open_weights": false, - "release_date": "2026-10-19", - "last_updated": "2026-10-19", + "release_date": "2026-09-02", + "last_updated": "2026-09-02", "type": "chat" }, { - "id": "minimax/minimax-01", - "name": "MiniMax 01", - "display_name": "MiniMax 01", + "id": "tencent/hy4-preview", + "name": "Hy4 preview", + "display_name": "Hy4 preview", "modalities": { "input": [ - "text", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000192, - "output": 16384 + "context": 1024000, + "output": 64000 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, - "open_weights": false, - "release_date": "2024-01-01", - "last_updated": "2025-01-15", + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "high" + ] + } + }, + "attachment": false, + "open_weights": true, + "release_date": "2026-08-28", + "last_updated": "2026-08-28", "type": "chat" }, { - "id": "minimax/minimax-m2-her", - "name": "MiniMax M2-her", - "display_name": "MiniMax M2-her", + "id": "tencent/hy3-paid", + "name": "Hy3", + "display_name": "Hy3", "modalities": { "input": [ "text" @@ -230563,35 +223843,46 @@ ] }, "limit": { - "context": 65532, - "output": 2048 + "context": 256000, + "output": 128000 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "high" + ] + } }, "attachment": false, - "open_weights": false, - "release_date": "2026-01-23", - "last_updated": "2026-01-23", + "open_weights": true, + "release_date": "2026-07-06", + "last_updated": "2026-07-06", "type": "chat" }, { - "id": "minimax/minimax-m2.1", - "name": "MiniMax M2.1", - "display_name": "MiniMax M2.1", + "id": "thinkingmachines/inkling", + "name": "Inkling", + "display_name": "Inkling", "modalities": { "input": [ - "text" + "text", + "image", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 131072 + "context": 256000, + "output": 256000 }, "temperature": true, "tool_call": true, @@ -230601,52 +223892,64 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "effort_options": [ + "low", + "medium", + "high", + "max" + ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2025-12-23", - "last_updated": "2025-12-23", + "release_date": "2026-07-15", + "last_updated": "2026-07-15", "type": "chat" }, { - "id": "minimax/minimax-m3", - "name": "MiniMax M3", - "display_name": "MiniMax M3", + "id": "thinkingmachines/inkling-small", + "name": "Inkling Small", + "display_name": "Inkling Small", "modalities": { "input": [ "text", - "image" + "image", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 512000, - "output": 80000 + "context": 1000000, + "output": 1000000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true + "effort_options": [ + "low", + "medium", + "high", + "max" + ] } }, "attachment": true, "open_weights": true, - "release_date": "2026-06-01", - "last_updated": "2026-06-01", + "release_date": "2026-07-30", + "last_updated": "2026-07-30", "type": "chat" }, { - "id": "minimax/minimax-m2.7", - "name": "MiniMax M2.7", - "display_name": "MiniMax M2.7", + "id": "zai-org/GLM-5.2", + "name": "GLM-5.2", + "display_name": "GLM-5.2", "modalities": { "input": [ "text" @@ -230656,7 +223959,7 @@ ] }, "limit": { - "context": 204800, + "context": 1000000, "output": 131072 }, "temperature": true, @@ -230668,36 +223971,33 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "high", + "max" ] } }, "attachment": false, "open_weights": true, - "release_date": "2026-03-18", - "last_updated": "2026-03-18", + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "minimax/minimax-m3:thinking", - "name": "MiniMax M3 Thinking", - "display_name": "MiniMax M3 Thinking", + "id": "zai-org/GLM-5.2-Fast", + "name": "GLM-5.2-Fast", + "display_name": "GLM-5.2-Fast", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 512000, - "output": 80000 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -230705,16 +224005,24 @@ "supported": true, "default": true }, - "attachment": true, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "high", + "max" + ] + } + }, + "attachment": false, "open_weights": true, - "release_date": "2026-06-01", - "last_updated": "2026-06-01", + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "Gryphe/MythoMax-L2-13b", - "name": "MythoMax 13B", - "display_name": "MythoMax 13B", + "id": "zai-org/GLM-5.3", + "name": "GLM-5.3", + "display_name": "GLM-5.3", "modalities": { "input": [ "text" @@ -230724,36 +224032,52 @@ ] }, "limit": { - "context": 4096, - "output": 3686 + "context": 1000000, + "output": 131072 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "low", + "high", + "max" + ] + } }, "attachment": false, "open_weights": true, - "release_date": "2023-08-10", - "last_updated": "2023-08-10", + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "heabsy/cyberheabsy", - "name": "CyberHeabsy", - "display_name": "CyberHeabsy", + "id": "google/gemini-3.5-flash-lite", + "name": "Gemini 3.5 Flash Lite", + "display_name": "Gemini 3.5 Flash Lite", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, + "context": 1000000, "output": 65536 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -230761,37 +224085,42 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ - "none", "low", "medium", "high" ] } }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-09-27", - "last_updated": "2026-09-27", + "knowledge": "2026-03", + "release_date": "2026-07-21", + "last_updated": "2026-07-21", "type": "chat" }, { - "id": "heabsy/qwen3.8-27b-uncensored-fast", - "name": "Qwen 3.8 27B Uncensored Fast by Heabsy", - "display_name": "Qwen 3.8 27B Uncensored Fast by Heabsy", + "id": "google/gemini-3.1-flash-lite", + "name": "Gemini 3.1 Flash Lite", + "display_name": "Gemini 3.1 Flash Lite", "modalities": { "input": [ "text", - "image" + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 524288, - "output": 235929 + "context": 1000000, + "output": 65536 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -230799,62 +224128,82 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ - "none", + "low", + "medium", "high" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-10-16", - "last_updated": "2026-10-16", + "knowledge": "2025-01", + "release_date": "2026-05-07", + "last_updated": "2026-05-07", "type": "chat" }, { - "id": "speakleash/Bielik-11B-v3.0-Instruct", - "name": "Bielik 11B v3.0", - "display_name": "Bielik 11B v3.0", + "id": "google/gemini-4-argon", + "name": "Gemini 4 Argon", + "display_name": "Gemini 4 Argon", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 32768, - "output": 32768 + "context": 1000000, + "output": 65536 }, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "release_date": "2026-10-15", - "last_updated": "2026-10-15", + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "high" + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2026-03", + "release_date": "2026-10-13", + "last_updated": "2026-10-13", "type": "chat" }, { - "id": "perceptron/perceptron-mk1.5", - "name": "Perceptron Mk1.5", - "display_name": "Perceptron Mk1.5", + "id": "google/gemini-3.7-flash", + "name": "Gemini 3.7 Flash", + "display_name": "Gemini 3.7 Flash", "modalities": { "input": [ "text", "image", "video", - "audio" + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 36864, - "output": 8192 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -230864,112 +224213,144 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "none", + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ "minimal", "low", "medium", "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-09-25", - "last_updated": "2026-09-25", + "knowledge": "2026-03", + "release_date": "2026-08-13", + "last_updated": "2026-08-13", "type": "chat" }, { - "id": "perceptron/perceptron-mk1", - "name": "Perceptron Mk1", - "display_name": "Perceptron Mk1", + "id": "google/gemini-3.5-flash", + "name": "Gemini 3.5 Flash", + "display_name": "Gemini 3.5 Flash", "modalities": { "input": [ "text", "image", - "video" + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 32768, - "output": 8192 + "context": 1000000, + "output": 65536 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", + "low", + "medium", + "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] + } + }, "attachment": true, "open_weights": false, - "release_date": "2026-05-12", - "last_updated": "2026-05-12", - "type": "chat" - }, - { - "id": "Salesforce/Llama-xLAM-2-70b-fc-r", - "name": "Llama-xLAM-2 70B fc-r", - "display_name": "Llama-xLAM-2 70B fc-r", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 128000, - "output": 16384 - }, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": true, - "release_date": "2025-04-13", - "last_updated": "2025-04-13", + "knowledge": "2025-01", + "release_date": "2026-05-19", + "last_updated": "2026-05-19", "type": "chat" }, { - "id": "cohere/command-r-plus-08-2024", - "name": "Cohere: Command R+", - "display_name": "Cohere: Command R+", + "id": "google/gemini-3.8-flash", + "name": "Gemini 3.8 Flash", + "display_name": "Gemini 3.8 Flash", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 1000000, + "output": 65536 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-06-01", - "release_date": "2024-08-30", - "last_updated": "2024-08-30", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", + "low", + "medium", + "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] + } + }, + "attachment": true, + "open_weights": false, + "release_date": "2026-09-02", + "last_updated": "2026-09-02", "type": "chat" }, { - "id": "nanogpt/coding-router:max", - "name": "Coding Router Max", - "display_name": "Coding Router Max", + "id": "google/gemini-3.6-flash", + "name": "Gemini 3.6 Flash", + "display_name": "Gemini 3.6 Flash", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio", + "pdf" ], "output": [ "text" @@ -230977,23 +224358,44 @@ }, "limit": { "context": 1000000, - "output": 128000 + "output": 65536 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", + "low", + "medium", + "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] + } + }, + "attachment": true, "open_weights": false, - "release_date": "2026-05-12", - "last_updated": "2026-05-12", + "knowledge": "2026-03", + "release_date": "2026-07-21", + "last_updated": "2026-07-21", "type": "chat" }, { - "id": "nanogpt/coding-router:low", - "name": "Coding Router Low", - "display_name": "Coding Router Low", + "id": "inclusionai/ling-3.1-flash:free", + "name": "Ling 3.1 Flash", + "display_name": "Ling 3.1 Flash", "modalities": { "input": [ "text" @@ -231003,27 +224405,49 @@ ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 262144, + "output": 32768 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "high" + ] + } + }, "attachment": false, - "open_weights": false, - "release_date": "2026-05-12", - "last_updated": "2026-05-12", + "open_weights": true, + "release_date": "2026-09-29", + "last_updated": "2026-09-29", "type": "chat" - }, + } + ] + }, + "nova": { + "id": "nova", + "name": "Nova", + "display_name": "Nova", + "api": "https://api.nova.amazon.com/v1", + "doc": "https://nova.amazon.com/dev/documentation", + "models": [ { - "id": "nanogpt/coding-router:medium", - "name": "Coding Router Medium", - "display_name": "Coding Router Medium", + "id": "nova-2-pro-v1", + "name": "Nova 2 Pro", + "display_name": "Nova 2 Pro", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "pdf" ], "output": [ "text" @@ -231031,26 +224455,30 @@ }, "limit": { "context": 1000000, - "output": 128000 + "output": 64000 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-05-12", - "last_updated": "2026-05-12", + "release_date": "2025-12-03", + "last_updated": "2026-01-03", "type": "chat" }, { - "id": "nanogpt/coding-router:high", - "name": "Coding Router High", - "display_name": "Coding Router High", + "id": "nova-2-lite-v1", + "name": "Nova 2 Lite", + "display_name": "Nova 2 Lite", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "pdf" ], "output": [ "text" @@ -231058,23 +224486,43 @@ }, "limit": { "context": 1000000, - "output": 128000 + "output": 64000 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "high" + ] + } + }, + "attachment": true, "open_weights": false, - "release_date": "2026-05-12", - "last_updated": "2026-05-12", + "knowledge": "2025-10", + "release_date": "2025-12-02", + "last_updated": "2025-12-02", "type": "chat" - }, + } + ] + }, + "crossmodel": { + "id": "crossmodel", + "name": "CrossModel", + "display_name": "CrossModel", + "api": "https://api.crossmodel.ai/v1", + "doc": "https://www.crossmodel.ai/docs", + "models": [ { - "id": "nanogpt/coding-router", - "name": "Coding Router", - "display_name": "Coding Router", + "id": "deepseek/deepseek-v4-flash", + "name": "DeepSeek V4 Flash", + "display_name": "DeepSeek V4 Flash", "modalities": { "input": [ "text" @@ -231085,77 +224533,140 @@ }, "limit": { "context": 1000000, - "output": 128000 + "output": 384000 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "high", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." + ] + } + }, "attachment": false, - "open_weights": false, - "release_date": "2026-05-12", - "last_updated": "2026-05-12", + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "moonshotai/kimi-k2-instruct-0711", - "name": "Kimi K2 0711", - "display_name": "Kimi K2 0711", + "id": "deepseek/deepseek-v4.1-flash", + "name": "DeepSeek V4.1 Flash", + "display_name": "DeepSeek V4.1 Flash", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 1000000, + "output": 384000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + }, + "attachment": true, "open_weights": true, - "release_date": "2025-07-11", - "last_updated": "2025-07-11", + "knowledge": "2025-05", + "release_date": "2026-09-10", + "last_updated": "2026-09-10", "type": "chat" }, { - "id": "moonshotai/kimi-k2-instruct", - "name": "Kimi K2 Instruct", - "display_name": "Kimi K2 Instruct", + "id": "deepseek/deepseek-v4-flash-vision-exp", + "name": "DeepSeek V4 Flash Vision Exp", + "display_name": "DeepSeek V4 Flash Vision Exp", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 8192 + "context": 1000000, + "output": 384000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "high", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." + ] + } }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2025-07-11", - "last_updated": "2025-07-11", + "release_date": "2026-08-21", + "last_updated": "2026-09-01", "type": "chat" }, { - "id": "moonshotai/Kimi-K2-Instruct-0905", - "name": "Kimi K2 0905", - "display_name": "Kimi K2 0905", + "id": "deepseek/deepseek-v4-pro", + "name": "DeepSeek V4 Pro", + "display_name": "DeepSeek V4 Pro", "modalities": { "input": [ "text" @@ -231165,24 +224676,48 @@ ] }, "limit": { - "context": 262144, - "output": 100352 + "context": 1000000, + "output": 384000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "high", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." + ] + } }, "attachment": false, "open_weights": true, - "release_date": "2025-09-05", - "last_updated": "2025-09-05", + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "moonshotai/kimi-k2.7-code", - "name": "Kimi K2.7 Code", - "display_name": "Kimi K2.7 Code", + "id": "openai/gpt-5.6-terra", + "name": "GPT-5.6 Terra", + "display_name": "GPT-5.6 Terra", "modalities": { "input": [ "text", @@ -231193,8 +224728,8 @@ ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 1050000, + "output": 128000 }, "temperature": false, "tool_call": true, @@ -231204,58 +224739,90 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-06-12", - "last_updated": "2026-06-12", + "open_weights": false, + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "moonshotai/kimi-latest", - "name": "Kimi Latest", - "display_name": "Kimi Latest", + "id": "openai/gpt-5.4", + "name": "GPT-5.4", + "display_name": "GPT-5.4", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 943718 + "context": 1050000, + "output": 128000 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", "effort_options": [ + "none", "low", + "medium", "high", - "max" - ] + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "release_date": "2026-05-03", - "last_updated": "2026-05-03", + "knowledge": "2025-08-31", + "release_date": "2026-03-05", + "last_updated": "2026-03-05", "type": "chat" }, { - "id": "moonshotai/kimi-k2.6:thinking", - "name": "Kimi K2.6 Thinking", - "display_name": "Kimi K2.6 Thinking", + "id": "openai/gpt-5.6-sol", + "name": "GPT-5.6 Sol", + "display_name": "GPT-5.6 Sol", "modalities": { "input": [ "text", @@ -231266,66 +224833,101 @@ ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-20", - "last_updated": "2026-04-20", + "open_weights": false, + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "moonshotai/kimi-k2-thinking", - "name": "Kimi K2 Thinking", - "display_name": "Kimi K2 Thinking", + "id": "openai/gpt-5.4-mini", + "name": "GPT-5.4 mini", + "display_name": "GPT-5.4 mini", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 98304 + "context": 400000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-08", - "release_date": "2025-11-06", - "last_updated": "2025-11-06", + "attachment": true, + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-03-17", + "last_updated": "2026-03-17", "type": "chat" }, { - "id": "moonshotai/kimi-k2.5:thinking", - "name": "Kimi K2.5 Thinking", - "display_name": "Kimi K2.5 Thinking", + "id": "openai/gpt-5.6-luna", + "name": "GPT-5.6 Luna", + "display_name": "GPT-5.6 Luna", "modalities": { "input": [ "text", @@ -231336,8 +224938,8 @@ ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 1050000, + "output": 128000 }, "temperature": false, "tool_call": true, @@ -231345,17 +224947,40 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-01-27", - "last_updated": "2026-01-27", + "open_weights": false, + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "moonshotai/kimi-k2.6", - "name": "Kimi K2.6", - "display_name": "Kimi K2.6", + "id": "openai/gpt-6-luna", + "name": "GPT-6 Luna", + "display_name": "GPT-6 Luna", "modalities": { "input": [ "text", @@ -231366,43 +224991,50 @@ ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-20", - "last_updated": "2026-04-20", + "open_weights": false, + "knowledge": "2026-05-18", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "moonshotai/kimi-k3", - "name": "Kimi K3", - "display_name": "Kimi K3", + "id": "openai/gpt-6-sol", + "name": "GPT-6 Sol", + "display_name": "GPT-6 Sol", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 943718 + "context": 1050000, + "output": 128000 }, "temperature": false, "tool_call": true, @@ -231412,38 +225044,41 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ + "none", "low", + "medium", "high", + "xhigh", "max" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-16", + "open_weights": false, + "knowledge": "2026-04-20", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "moonshotai/kimi-k3.1-pro-highspeed", - "name": "Kimi K3.1 Pro Highspeed", - "display_name": "Kimi K3.1 Pro Highspeed", + "id": "openai/gpt-6.1-sol", + "name": "GPT-6.1 Sol", + "display_name": "GPT-6.1 Sol", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 1048576 + "context": 1050000, + "output": 128000 }, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -231453,60 +225088,76 @@ "reasoning": { "effort_options": [ "low", + "medium", "high", + "xhigh", "max" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-10-24", - "last_updated": "2026-10-24", + "knowledge": "2026-04-30", + "release_date": "2026-09-29", + "last_updated": "2026-09-29", "type": "chat" }, { - "id": "moonshotai/kimi-k3.1-pro", - "name": "Kimi K3.1 Pro", - "display_name": "Kimi K3.1 Pro", + "id": "openai/gpt-5.4-nano", + "name": "GPT-5.4 nano", + "display_name": "GPT-5.4 nano", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 1048576 + "context": 400000, + "output": 128000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", "effort_options": [ + "none", "low", + "medium", "high", - "max" - ] + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "release_date": "2026-10-23", - "last_updated": "2026-10-23", + "knowledge": "2025-08-31", + "release_date": "2026-03-17", + "last_updated": "2026-03-17", "type": "chat" }, { - "id": "moonshotai/kimi-k2.7-code-highspeed", - "name": "Kimi K2.7 Code High-Speed", - "display_name": "Kimi K2.7 Code High-Speed", + "id": "openai/gpt-5.5-pro", + "name": "GPT-5.5 Pro", + "display_name": "GPT-5.5 Pro", "modalities": { "input": [ "text", @@ -231517,8 +225168,8 @@ ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 1050000, + "output": 128000 }, "temperature": false, "tool_call": true, @@ -231528,20 +225179,25 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "effort_options": [ + "medium", + "high", + "xhigh" + ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-06-12", - "last_updated": "2026-06-12", + "open_weights": false, + "knowledge": "2025-12-01", + "release_date": "2026-04-23", + "last_updated": "2026-04-23", "type": "chat" }, { - "id": "moonshotai/kimi-k2.5", - "name": "Kimi K2.5", - "display_name": "Kimi K2.5", + "id": "openai/gpt-5.5", + "name": "GPT-5.5", + "display_name": "GPT-5.5", "modalities": { "input": [ "text", @@ -231552,157 +225208,205 @@ ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 1050000, + "output": 128000 }, "temperature": false, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-01-27", - "last_updated": "2026-01-27", + "open_weights": false, + "knowledge": "2025-12-01", + "release_date": "2026-04-23", + "last_updated": "2026-04-23", "type": "chat" }, { - "id": "anthracite-org/magnum-v4-72b", - "name": "Magnum v4 72B", - "display_name": "Magnum v4 72B", + "id": "openai/gpt-4o-mini", + "name": "GPT-4o mini", + "display_name": "GPT-4o mini", "modalities": { "input": [ "text", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 16384, - "output": 8192 + "context": 128000, + "output": 16384 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, "attachment": true, - "open_weights": true, - "knowledge": "2024-06-30", - "release_date": "2024-10-22", - "last_updated": "2024-10-22", + "open_weights": false, + "knowledge": "2023-09", + "release_date": "2024-07-18", + "last_updated": "2024-07-18", "type": "chat" }, { - "id": "anthracite-org/magnum-v2-72b", - "name": "Magnum V2 72B", - "display_name": "Magnum V2 72B", + "id": "openai/gpt-6-astra", + "name": "GPT-6 Astra", + "display_name": "GPT-6 Astra", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 16384, - "output": 8192 + "context": 1050000, + "output": 128000 }, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "release_date": "2024-01-01", - "last_updated": "2024-07-01", + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2026-04-30", + "release_date": "2026-09-04", + "last_updated": "2026-09-04", "type": "chat" }, { - "id": "lightonai/LightOnOCR-2-1B", - "name": "LightOnOCR 2", - "display_name": "LightOnOCR 2", + "id": "moonshot/kimi-k2.7-code", + "name": "Kimi K2.7 Code", + "display_name": "Kimi K2.7 Code", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 32768, - "output": 8192 + "context": 262000, + "output": 262000 }, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": true, "open_weights": true, - "release_date": "2026-09-10", - "last_updated": "2026-09-10", + "knowledge": "2025-01", + "release_date": "2026-06-12", + "last_updated": "2026-06-12", "type": "chat" }, { - "id": "liquid/lfm-2.5-24b-a2b", - "name": "LFM2.5 24B A2B", - "display_name": "LFM2.5 24B A2B", + "id": "moonshot/kimi-k2.6", + "name": "Kimi K2.6", + "display_name": "Kimi K2.6", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 262000, + "output": 262000 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": false, - "open_weights": false, - "release_date": "2026-10-14", - "last_updated": "2026-10-14", + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": true, + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-04-20", + "last_updated": "2026-04-20", "type": "chat" }, { - "id": "liquid/lfm-2.5-2.6b", - "name": "LFM2.5 2.6B", - "display_name": "LFM2.5 2.6B", + "id": "moonshot/kimi-k3", + "name": "Kimi K3", + "display_name": "Kimi K3", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 32768 + "context": 1048576, + "output": 1048576 }, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -231712,24 +225416,22 @@ "reasoning": { "supported": true, "effort_options": [ - "minimal", "low", - "medium", "high", - "xhigh" + "max" ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-08-12", - "last_updated": "2026-08-12", + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" }, { - "id": "Doctor-Shotgun/MS3.2-24B-Magnum-Diamond", - "name": "MS3.2 24B Magnum Diamond", - "display_name": "MS3.2 24B Magnum Diamond", + "id": "z-ai/glm-5.2", + "name": "GLM-5.2", + "display_name": "GLM-5.2", "modalities": { "input": [ "text" @@ -231739,23 +225441,30 @@ ] }, "limit": { - "context": 32768, - "output": 32768 + "context": 1000000, + "output": 128000 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": false, "open_weights": true, - "release_date": "2025-11-24", - "last_updated": "2025-11-24", + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "reflection/beam-1.0", - "name": "Beam 1.0 501B A23B", - "display_name": "Beam 1.0 501B A23B", + "id": "z-ai/glm-5.3", + "name": "GLM-5.3", + "display_name": "GLM-5.3", "modalities": { "input": [ "text" @@ -231765,8 +225474,8 @@ ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 1000000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -231776,39 +225485,35 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ "low", - "medium", "high", - "xhigh", "max" ] } }, "attachment": false, "open_weights": true, - "knowledge": "2026-06-30", - "release_date": "2026-10-05", - "last_updated": "2026-10-16", + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "stepfun/step-5-preview", - "name": "Step 5 Preview", - "display_name": "Step 5 Preview", + "id": "z-ai/glm-5-turbo", + "name": "GLM-5-Turbo", + "display_name": "GLM-5-Turbo", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 1000000 + "context": 200000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -231818,36 +225523,30 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "low", - "medium", - "high" - ] + "supported": true } }, - "attachment": true, - "open_weights": true, - "release_date": "2026-09-16", - "last_updated": "2026-09-20", + "attachment": false, + "open_weights": false, + "release_date": "2026-03-16", + "last_updated": "2026-03-16", "type": "chat" }, { - "id": "stepfun/step-3.7-flash:thinking", - "name": "Step 3.7 Flash Thinking", - "display_name": "Step 3.7 Flash Thinking", + "id": "z-ai/glm-5", + "name": "GLM-5", + "display_name": "GLM-5", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 256000 + "context": 200000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -231857,79 +225556,105 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "high" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2026-03-01", - "release_date": "2026-05-29", - "last_updated": "2026-05-29", + "release_date": "2026-02-12", + "last_updated": "2026-02-12", "type": "chat" }, { - "id": "unbiased/pareto-26.10", - "name": "Pareto 26.10", - "display_name": "Pareto 26.10", + "id": "z-ai/glm-5.3-flash", + "name": "GLM-5.3-Flash", + "display_name": "GLM-5.3-Flash", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 1000000, + "output": 128000 }, + "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "low", + "high", + "max" + ] + } }, "attachment": true, - "open_weights": false, - "release_date": "2026-10-01", - "last_updated": "2026-10-01", + "open_weights": true, + "release_date": "2026-08-26", + "last_updated": "2026-08-26", "type": "chat" }, { - "id": "unbiased/pareto-26.9", - "name": "Pareto 26.9", - "display_name": "Pareto 26.9", + "id": "z-ai/glm-4.7", + "name": "GLM-4.7", + "display_name": "GLM-4.7", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 131072 + "context": 200000, + "output": 128000 }, + "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, - "open_weights": false, - "release_date": "2026-09-18", - "last_updated": "2026-09-18", + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-12-22", + "last_updated": "2025-12-22", "type": "chat" }, { - "id": "upstage/solar-pro4", - "name": "Solar Pro 4", - "display_name": "Solar Pro 4", + "id": "z-ai/glm-5.1", + "name": "GLM-5.1", + "display_name": "GLM-5.1", "modalities": { "input": [ "text" @@ -231939,35 +225664,43 @@ ] }, "limit": { - "context": 524288, - "output": 131072 + "context": 200000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": false, - "open_weights": false, - "knowledge": "2026-02", - "release_date": "2026-08-06", - "last_updated": "2026-08-06", + "open_weights": true, + "release_date": "2026-04-07", + "last_updated": "2026-04-07", "type": "chat" }, { - "id": "upstage/solar-pro4:thinking", - "name": "Solar Pro 4 Thinking", - "display_name": "Solar Pro 4 Thinking", + "id": "xiaomi/mimo-v2.6-pro", + "name": "MiMo-V2.6-Pro", + "display_name": "MiMo-V2.6-Pro", "modalities": { "input": [ - "text" + "text", + "image", + "audio", + "video" ], "output": [ "text" ] }, "limit": { - "context": 524288, + "context": 1048576, "output": 131072 }, "temperature": true, @@ -231986,45 +225719,57 @@ ] } }, - "attachment": false, - "open_weights": false, - "knowledge": "2026-02", - "release_date": "2026-08-06", - "last_updated": "2026-08-06", + "attachment": true, + "open_weights": true, + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "upstage/solar-mini4", - "name": "Solar Mini 4", - "display_name": "Solar Mini 4", + "id": "xiaomi/mimo-v2.6-flash", + "name": "MiMo-V2.6-Flash", + "display_name": "MiMo-V2.6-Flash", "modalities": { "input": [ - "text" + "text", + "image", + "audio", + "video" ], "output": [ "text" ] }, "limit": { - "context": 524288, + "context": 1048576, "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": false, - "knowledge": "2026-02", + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "low", + "medium", + "high" + ] + } + }, + "attachment": true, + "open_weights": true, "release_date": "2026-09-22", "last_updated": "2026-09-22", "type": "chat" }, { - "id": "upstage/solar-mini4:thinking", - "name": "Solar Mini 4 Thinking", - "display_name": "Solar Mini 4 Thinking", + "id": "tencent/hy3", + "name": "Hy3", + "display_name": "Hy3", "modalities": { "input": [ "text" @@ -232034,7 +225779,7 @@ ] }, "limit": { - "context": 524288, + "context": 262144, "output": 131072 }, "temperature": true, @@ -232045,25 +225790,24 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ "none", "low", - "medium", "high" ] } }, "attachment": false, - "open_weights": false, - "knowledge": "2026-02", - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "open_weights": true, + "release_date": "2026-07-06", + "last_updated": "2026-07-06", "type": "chat" }, { - "id": "upstage/solar-pro-3", - "name": "Solar Pro 3", - "display_name": "Solar Pro 3", + "id": "tencent/hy4-preview", + "name": "Hy4 preview", + "display_name": "Hy4 preview", "modalities": { "input": [ "text" @@ -232073,38 +225817,10 @@ ] }, "limit": { - "context": 131072, - "output": 117964 + "context": 1048576, + "output": 65536 }, "temperature": true, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": false, - "knowledge": "2025-07", - "release_date": "2026-01-26", - "last_updated": "2026-03-23", - "type": "chat" - }, - { - "id": "x-ai/grok-4.20-multi-agent", - "name": "Grok 4.20 Multi-Agent", - "display_name": "Grok 4.20 Multi-Agent", - "modalities": { - "input": [ - "text", - "image" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 2000000, - "output": 131072 - }, "tool_call": true, "reasoning": { "supported": true, @@ -232112,36 +225828,37 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ - "low", - "medium", - "high", - "xhigh" + "none", + "high" ] } }, - "attachment": true, - "open_weights": false, - "release_date": "2026-03-31", - "last_updated": "2026-03-31", + "attachment": false, + "open_weights": true, + "release_date": "2026-08-28", + "last_updated": "2026-08-28", "type": "chat" }, { - "id": "x-ai/grok-4.3", - "name": "Grok 4.3", - "display_name": "Grok 4.3", + "id": "gemini/gemini-3.1-pro-preview", + "name": "Gemini 3.1 Pro Preview", + "display_name": "Gemini 3.1 Pro Preview", "modalities": { "input": [ "text", - "image" + "image", + "audio", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 900000 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -232152,35 +225869,45 @@ "extra_capabilities": { "reasoning": { "supported": true, - "effort_options": [ + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ "low", - "medium", "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-04-17", - "last_updated": "2026-04-17", + "knowledge": "2025-01", + "release_date": "2026-02-19", + "last_updated": "2026-02-19", "type": "chat" }, { - "id": "x-ai/grok-4.5", - "name": "Grok 4.5", - "display_name": "Grok 4.5", + "id": "gemini/gemini-3-flash-preview", + "name": "Gemini 3 Flash Preview", + "display_name": "Gemini 3 Flash Preview", "modalities": { "input": [ "text", - "image" + "image", + "video", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 500000, - "output": 450000 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -232191,36 +225918,49 @@ "extra_capabilities": { "reasoning": { "supported": true, - "effort_options": [ + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", "low", "medium", "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-07-08", - "last_updated": "2026-07-08", + "knowledge": "2025-01", + "release_date": "2025-12-17", + "last_updated": "2025-12-17", "type": "chat" }, { - "id": "x-ai/grok-4.20", - "name": "Grok 4.20", - "display_name": "Grok 4.20", + "id": "gemini/gemini-2.5-pro", + "name": "Gemini 2.5 Pro", + "display_name": "Gemini 2.5 Pro", "modalities": { "input": [ "text", - "image" + "image", + "audio", + "video" ], "output": [ "text" ] }, "limit": { - "context": 2000000, - "output": 131072 + "context": 1048576, + "output": 65536 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -232228,35 +225968,48 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "low", - "medium", - "high" + "supported": true, + "default_enabled": true, + "mode": "budget", + "budget": { + "default": -1, + "min": 128, + "max": 32768, + "auto": -1, + "unit": "tokens" + }, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-03-31", - "last_updated": "2026-03-31", + "knowledge": "2025-01", + "release_date": "2025-06-17", + "last_updated": "2025-06-17", "type": "chat" }, { - "id": "x-ai/grok-4.7", - "name": "Grok 4.7", - "display_name": "Grok 4.7", + "id": "gemini/gemini-3.5-flash-lite", + "name": "Gemini 3.5 Flash Lite", + "display_name": "Gemini 3.5 Flash Lite", "modalities": { "input": [ "text", - "image" + "image", + "audio", + "video" ], "output": [ "text" ] }, "limit": { - "context": 500000, - "output": 500000 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -232266,38 +226019,42 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ + "minimal", "low", "medium", - "high", - "xhigh" + "high" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-05", - "release_date": "2026-09-21", - "last_updated": "2026-09-21", + "knowledge": "2026-03", + "release_date": "2026-07-21", + "last_updated": "2026-07-21", "type": "chat" }, { - "id": "x-ai/grok-latest", - "name": "Grok Latest", - "display_name": "Grok Latest", + "id": "gemini/gemini-2.5-flash", + "name": "Gemini 2.5 Flash", + "display_name": "Gemini 2.5 Flash", "modalities": { "input": [ "text", - "image" + "image", + "video", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 500000, - "output": 450000 + "context": 1048576, + "output": 65536 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -232305,38 +226062,51 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "xhigh" + "supported": true, + "default_enabled": true, + "mode": "budget", + "budget": { + "default": -1, + "min": 0, + "max": 24576, + "auto": -1, + "off": 0, + "unit": "tokens" + }, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-05-03", - "last_updated": "2026-05-03", + "knowledge": "2025-01", + "release_date": "2025-06-17", + "last_updated": "2025-06-17", "type": "chat" }, { - "id": "x-ai/grok-build-0.1", - "name": "Grok Build 0.1", - "display_name": "Grok Build 0.1", + "id": "gemini/gemini-4-argon", + "name": "Gemini 4 Argon", + "display_name": "Gemini 4 Argon", "modalities": { "input": [ "text", - "image" + "image", + "audio", + "video" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 230400 + "context": 1048576, + "output": 65536 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -232344,8 +226114,9 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ + "none", + "minimal", "low", "medium", "high" @@ -232354,26 +226125,29 @@ }, "attachment": true, "open_weights": false, - "release_date": "2026-04-16", - "last_updated": "2026-04-16", + "knowledge": "2026-03", + "release_date": "2026-10-13", + "last_updated": "2026-10-13", "type": "chat" }, { - "id": "x-ai/grok-4.6", - "name": "Grok 4.6", - "display_name": "Grok 4.6", + "id": "gemini/gemini-3.7-flash", + "name": "Gemini 3.7 Flash", + "display_name": "Gemini 3.7 Flash", "modalities": { "input": [ "text", - "image" + "image", + "audio", + "video" ], "output": [ "text" ] }, "limit": { - "context": 500000, - "output": 450000 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -232384,221 +226158,100 @@ "extra_capabilities": { "reasoning": { "supported": true, - "effort_options": [ + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", "low", "medium", - "high", - "xhigh" + "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-02-01", - "release_date": "2026-08-12", - "last_updated": "2026-08-12", - "type": "chat" - }, - { - "id": "featherless-ai/Qwerky-72B", - "name": "Qwerky 72B", - "display_name": "Qwerky 72B", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 32000, - "output": 8192 - }, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": true, - "release_date": "2024-01-01", - "last_updated": "2025-03-20", - "type": "chat" - }, - { - "id": "aisingapore/Qwen-SEA-LION-v4-32B-IT", - "name": "Qwen SEA-LION v4 32B", - "display_name": "Qwen SEA-LION v4 32B", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 131072, - "output": 131072 - }, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": true, - "release_date": "2026-10-15", - "last_updated": "2026-10-15", + "knowledge": "2026-03", + "release_date": "2026-08-13", + "last_updated": "2026-08-13", "type": "chat" }, { - "id": "aisingapore/Gemma-SEA-LION-v4-27B-IT", - "name": "Gemma SEA-LION v4 27B", - "display_name": "Gemma SEA-LION v4 27B", + "id": "gemini/gemini-2.5-flash-lite", + "name": "Gemini 2.5 Flash-Lite", + "display_name": "Gemini 2.5 Flash-Lite", "modalities": { "input": [ - "text" + "text", + "image", + "audio", + "video" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 128000 + "context": 1048576, + "output": 65536 }, "temperature": true, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": true, - "release_date": "2025-09-23", - "last_updated": "2025-09-23", - "type": "chat" - }, - { - "id": "Steelskull/L3.3-Electra-R1-70b", - "name": "Steelskull Electra R1 70b", - "display_name": "Steelskull Electra R1 70b", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 32768, - "output": 16384 - }, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": true, - "release_date": "2024-01-01", - "last_updated": "2024-12-06", - "type": "chat" - }, - { - "id": "Steelskull/L3.3-MS-Nevoria-70b", - "name": "Steelskull Nevoria 70b", - "display_name": "Steelskull Nevoria 70b", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 32768, - "output": 16384 - }, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": true, - "release_date": "2024-01-01", - "last_updated": "2024-12-06", - "type": "chat" - }, - { - "id": "Steelskull/L3.3-Cu-Mai-R1-70b", - "name": "Llama 3.3 70B Cu Mai", - "display_name": "Llama 3.3 70B Cu Mai", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 32768, - "output": 16384 - }, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": true, - "release_date": "2024-01-01", - "last_updated": "2024-12-06", - "type": "chat" - }, - { - "id": "Steelskull/L3.3-Nevoria-R1-70b", - "name": "Steelskull Nevoria R1 70b", - "display_name": "Steelskull Nevoria R1 70b", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 32768, - "output": 16384 + "supported": true, + "default": false }, - "tool_call": false, - "reasoning": { - "supported": false + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "default": -1, + "min": 512, + "max": 24576, + "auto": -1, + "unit": "tokens" + }, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] + } }, - "attachment": false, - "open_weights": true, - "release_date": "2024-01-01", - "last_updated": "2024-12-06", + "attachment": true, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2025-06-17", + "last_updated": "2025-06-17", "type": "chat" }, { - "id": "prism-ml/ternary-bonsai-2-27b", - "name": "Ternary Bonsai 2 27B", - "display_name": "Ternary Bonsai 2 27B", + "id": "gemini/gemini-3.5-flash", + "name": "Gemini 3.5 Flash", + "display_name": "Gemini 3.5 Flash", "modalities": { "input": [ "text", - "image" + "image", + "audio", + "video" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 1048576, + "output": 65536 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -232606,114 +226259,146 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", + "low", "medium", - "xhigh" + "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-09-18", - "last_updated": "2026-09-18", + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2026-05-19", + "last_updated": "2026-05-19", "type": "chat" }, { - "id": "prism-ml/ternary-bonsai-2-9b", - "name": "Ternary Bonsai2 9B", - "display_name": "Ternary Bonsai2 9B", + "id": "gemini/gemini-3.8-flash", + "name": "Gemini 3.8 Flash", + "display_name": "Gemini 3.8 Flash", "modalities": { "input": [ - "text" + "text", + "image", + "audio", + "video" ], "output": [ "text" ] }, "limit": { - "context": 262144, + "context": 1048576, "output": 65536 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": false, - "open_weights": true, - "release_date": "2026-10-23", - "last_updated": "2026-10-23", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", + "low", + "medium", + "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] + } + }, + "attachment": true, + "open_weights": false, + "release_date": "2026-09-02", + "last_updated": "2026-09-02", "type": "chat" }, { - "id": "openai/gpt-5.2", - "name": "GPT 5.2", - "display_name": "GPT 5.2", + "id": "gemini/gemini-3.6-flash", + "name": "Gemini 3.6 Flash", + "display_name": "Gemini 3.6 Flash", "modalities": { "input": [ "text", "image", - "pdf" + "audio", + "video" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", "low", "medium", "high" ], - "visibility": "hidden" + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2025-12-11", - "last_updated": "2025-12-11", + "knowledge": "2026-03", + "release_date": "2026-07-21", + "last_updated": "2026-07-21", "type": "chat" }, { - "id": "openai/gpt-5.6-luna-pro", - "name": "GPT 5.6 Luna Pro", - "display_name": "GPT 5.6 Luna Pro", + "id": "anthropic/claude-fable-5", + "name": "Claude Fable 5", + "display_name": "Claude Fable 5", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1050000, + "context": 1000000, "output": 128000 }, "temperature": false, @@ -232724,40 +226409,53 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", "effort_options": [ - "none", "low", "medium", "high", "xhigh", "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", + "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", + "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "knowledge": "2026-01-31", + "release_date": "2026-06-09", + "last_updated": "2026-06-09", "type": "chat" }, { - "id": "openai/gpt-5.4-mini", - "name": "GPT 5.4 Mini", - "display_name": "GPT 5.4 Mini", + "id": "anthropic/claude-haiku-4-5", + "name": "Claude Haiku 4.5 (latest)", + "display_name": "Claude Haiku 4.5 (latest)", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, @@ -232769,141 +226467,148 @@ "reasoning": { "supported": true, "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ], - "visibility": "hidden" + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-17", - "last_updated": "2026-03-17", + "knowledge": "2025-02-28", + "release_date": "2025-10-15", + "last_updated": "2025-10-15", "type": "chat" }, { - "id": "openai/gpt-5.6-sol", - "name": "GPT 5.6 Sol", - "display_name": "GPT 5.6 Sol", + "id": "anthropic/claude-sonnet-4-6", + "name": "Claude Sonnet 4.6", + "display_name": "Claude Sonnet 4.6", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1050000, + "context": 1000000, "output": 128000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", "effort_options": [ - "none", "low", "medium", "high", - "xhigh", "max" ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ], - "visibility": "hidden" + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "knowledge": "2025-08-31", + "release_date": "2026-02-17", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "openai/gpt-5.2-codex", - "name": "GPT 5.2 Codex", - "display_name": "GPT 5.2 Codex", + "id": "anthropic/claude-opus-4-7", + "name": "Claude Opus 4.7", + "display_name": "Claude Opus 4.7", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 400000, + "context": 1000000, "output": 128000 }, "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, + "default_enabled": false, "mode": "effort", - "effort": "medium", + "effort": "high", "effort_options": [ "low", "medium", "high", - "xhigh" + "xhigh", + "max" ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" ], - "visibility": "hidden" + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2025-12-11", - "last_updated": "2025-12-11", + "knowledge": "2026-01-31", + "release_date": "2026-04-16", + "last_updated": "2026-04-16", "type": "chat" }, { - "id": "openai/gpt-5-nano", - "name": "GPT 5 Nano", - "display_name": "GPT 5 Nano", + "id": "anthropic/claude-fable-5-1", + "name": "Claude Fable 5.1", + "display_name": "Claude Fable 5.1", "modalities": { "input": [ "text", @@ -232914,11 +226619,11 @@ ] }, "limit": { - "context": 400000, + "context": 1000000, "output": 128000 }, "temperature": false, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, "default": true @@ -232928,44 +226633,50 @@ "supported": true, "default_enabled": true, "mode": "effort", - "effort": "medium", + "effort": "high", "effort_options": [ - "minimal", "low", "medium", - "high" + "high", + "xhigh", + "max" ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" ], - "visibility": "hidden" + "notes": [ + "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", + "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", + "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2024-05-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "knowledge": "2026-06", + "release_date": "2026-09-01", + "last_updated": "2026-09-01", "type": "chat" }, { - "id": "openai/o3-pro-2025-06-10", - "name": "OpenAI o3-pro (2025-06-10)", - "display_name": "OpenAI o3-pro (2025-06-10)", + "id": "anthropic/claude-opus-5-5", + "name": "Claude Opus 5.5", + "display_name": "Claude Opus 5.5", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 1000000, + "output": 128000 }, "temperature": false, "tool_call": true, @@ -232975,29 +226686,26 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", "effort_options": [ "low", "medium", - "high" - ], - "visibility": "hidden" + "high", + "xhigh", + "max" + ] } }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2024-05", - "release_date": "2025-06-10", - "last_updated": "2025-06-10", + "knowledge": "2026-06", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "openai/gpt-4o", - "name": "GPT-4o", - "display_name": "GPT-4o", + "id": "anthropic/claude-opus-4-8", + "name": "Claude Opus 4.8", + "display_name": "Claude Opus 4.8", "modalities": { "input": [ "text", @@ -233008,126 +226716,106 @@ ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": false, - "knowledge": "2023-09", - "release_date": "2024-05-13", - "last_updated": "2024-08-06", - "type": "chat" - }, - { - "id": "openai/gpt-oss-safeguard-20b", - "name": "GPT OSS Safeguard 20B", - "display_name": "GPT OSS Safeguard 20B", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 128000, - "output": 16384 - }, - "temperature": true, - "tool_call": false, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "high", "effort_options": [ "low", "medium", - "high" + "high", + "xhigh", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2025-10-29", - "last_updated": "2025-10-29", + "attachment": true, + "open_weights": false, + "knowledge": "2026-01", + "release_date": "2026-05-28", + "last_updated": "2026-05-28", "type": "chat" }, { - "id": "openai/gpt-5.4-nano", - "name": "GPT 5.4 Nano", - "display_name": "GPT 5.4 Nano", + "id": "anthropic/claude-opus-5", + "name": "Claude Opus 5", + "display_name": "Claude Opus 5", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 400000, + "context": 1000000, "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", "effort_options": [ - "none", "low", "medium", "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "xhigh", + "max" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-17", - "last_updated": "2026-03-17", + "knowledge": "2026-05", + "release_date": "2026-07-24", + "last_updated": "2026-07-24", "type": "chat" }, { - "id": "openai/o3-mini-low", - "name": "OpenAI o3-mini (Low)", - "display_name": "OpenAI o3-mini (Low)", + "id": "anthropic/claude-haiku-5-5", + "name": "Claude Haiku 5.5", + "display_name": "Claude Haiku 5.5", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 1000000, + "output": 128000 }, "temperature": false, "tool_call": true, @@ -233137,69 +226825,37 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", "effort_options": [ "low", "medium", - "high" - ], - "visibility": "hidden" + "high", + "xhigh", + "max" + ] } }, - "attachment": false, - "open_weights": false, - "knowledge": "2024-05", - "release_date": "2024-12-20", - "last_updated": "2025-01-29", - "type": "chat" - }, - { - "id": "openai/gpt-3.5-turbo", - "name": "GPT-3.5 Turbo", - "display_name": "GPT-3.5 Turbo", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 16385, - "output": 4096 - }, - "temperature": true, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2021-09-01", - "release_date": "2023-03-01", - "last_updated": "2023-11-06", + "knowledge": "2026-06", + "release_date": "2026-10-07", + "last_updated": "2026-10-07", "type": "chat" }, { - "id": "openai/gpt-5.6-luna", - "name": "GPT 5.6 Luna", - "display_name": "GPT 5.6 Luna", + "id": "anthropic/claude-sonnet-5-5", + "name": "Claude Sonnet 5.5", + "display_name": "Claude Sonnet 5.5", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1050000, + "context": 1000000, "output": 128000 }, "temperature": false, @@ -233210,90 +226866,68 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", "effort_options": [ - "none", "low", "medium", "high", "xhigh", "max" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "knowledge": "2026-06", + "release_date": "2026-09-28", + "last_updated": "2026-09-28", "type": "chat" }, { - "id": "openai/gpt-5.1-codex-max", - "name": "GPT 5.1 Codex Max", - "display_name": "GPT 5.1 Codex Max", + "id": "anthropic/claude-sonnet-5", + "name": "Claude Sonnet 5", + "display_name": "Claude Sonnet 5", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 400000, + "context": 1000000, "output": 128000 }, "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", "effort_options": [ - "none", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ "low", "medium", - "high" - ], - "visibility": "hidden" + "high", + "xhigh", + "max" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-11-13", - "last_updated": "2025-11-13", + "knowledge": "2026-01-31", + "release_date": "2026-06-30", + "last_updated": "2026-06-30", "type": "chat" }, { - "id": "openai/o3-mini", - "name": "OpenAI o3-mini", - "display_name": "OpenAI o3-mini", + "id": "minimax/minimax-m2.7", + "name": "MiniMax-M2.7", + "display_name": "MiniMax-M2.7", "modalities": { "input": [ "text" @@ -233303,10 +226937,10 @@ ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 204800, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -233315,43 +226949,39 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": false, - "open_weights": false, - "knowledge": "2024-05", - "release_date": "2024-12-20", - "last_updated": "2025-01-29", + "open_weights": true, + "release_date": "2026-03-18", + "last_updated": "2026-03-18", "type": "chat" }, { - "id": "openai/gpt-5.6-terra", - "name": "GPT 5.6 Terra", - "display_name": "GPT 5.6 Terra", + "id": "minimax/minimax-m3", + "name": "MiniMax-M3", + "display_name": "MiniMax-M3", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1024000, + "output": 512000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -233359,52 +226989,35 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "supported": true } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "open_weights": true, + "release_date": "2026-06-01", + "last_updated": "2026-06-01", "type": "chat" }, { - "id": "openai/o3", - "name": "OpenAI o3", - "display_name": "OpenAI o3", + "id": "qwen/qwen3.6-plus", + "name": "Qwen3.6 Plus", + "display_name": "Qwen3.6 Plus", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 1000000, + "output": 65536 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": true, "default": true @@ -233412,87 +227025,73 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2024-05", - "release_date": "2025-04-16", - "last_updated": "2025-04-16", + "knowledge": "2025-04", + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "openai/o1-pro", - "name": "OpenAI o1 Pro", - "display_name": "OpenAI o1 Pro", + "id": "qwen/qwen3.7-max", + "name": "Qwen3.7 Max", + "display_name": "Qwen3.7 Max", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 1000000, + "output": 65536 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "supported": true } }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2023-09", - "release_date": "2025-03-19", - "last_updated": "2025-03-19", + "release_date": "2026-05-21", + "last_updated": "2026-05-21", "type": "chat" }, { - "id": "openai/gpt-sol-latest", - "name": "GPT Sol Latest", - "display_name": "GPT Sol Latest", + "id": "qwen/qwen3.7-flash", + "name": "Qwen3.7 Flash", + "display_name": "Qwen3.7 Flash", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1000000, + "output": 65536 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -233500,39 +227099,34 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ] + "supported": true } }, "attachment": true, "open_weights": false, - "release_date": "2026-09-11", - "last_updated": "2026-09-11", + "release_date": "2026-07-15", + "last_updated": "2026-07-15", "type": "chat" }, { - "id": "openai/gpt-astra-latest", - "name": "GPT Astra Latest", - "display_name": "GPT Astra Latest", + "id": "qwen/qwen3.8-max", + "name": "Qwen3.8 Max", + "display_name": "Qwen3.8 Max", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1000000, + "output": 131072 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -233540,39 +227134,39 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ "low", "medium", - "high", - "xhigh", - "max" + "xhigh" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-09-11", - "last_updated": "2026-09-11", + "release_date": "2026-08-03", + "last_updated": "2026-08-03", "type": "chat" }, { - "id": "openai/gpt-luna-latest", - "name": "GPT Luna Latest", - "display_name": "GPT Luna Latest", + "id": "qwen/qwen3.6-flash", + "name": "Qwen3.6 Flash", + "display_name": "Qwen3.6 Flash", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1000000, + "output": 65536 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -233580,86 +227174,80 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-09-11", - "last_updated": "2026-09-11", + "release_date": "2026-04-27", + "last_updated": "2026-04-27", "type": "chat" }, { - "id": "openai/gpt-5-pro", - "name": "GPT 5 Pro", - "display_name": "GPT 5 Pro", + "id": "qwen/qwen3.8-omni-flash", + "name": "Qwen3.8 Omni Flash", + "display_name": "Qwen3.8 Omni Flash", "modalities": { "input": [ "text", - "image" + "image", + "audio", + "video" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 1000000, + "output": 131072 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "fixed", - "effort": "high", - "verbosity": "medium", - "verbosity_options": [ + "effort_options": [ "low", "medium", - "high" - ], - "visibility": "hidden" + "xhigh" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-10-06", - "last_updated": "2025-10-06", + "release_date": "2026-09-17", + "last_updated": "2026-09-17", "type": "chat" }, { - "id": "openai/gpt-6-sol", - "name": "GPT 6 Sol", - "display_name": "GPT 6 Sol", + "id": "qwen/qwen3.7-plus", + "name": "Qwen3.7 Plus", + "display_name": "Qwen3.7 Plus", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1000000, + "output": 64000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -233667,42 +227255,35 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ] + "supported": true } }, "attachment": true, "open_weights": false, - "knowledge": "2026-04-20", - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "knowledge": "2025-04", + "release_date": "2026-06-02", + "last_updated": "2026-06-02", "type": "chat" }, { - "id": "openai/gpt-5.6-sol-pro", - "name": "GPT 5.6 Sol Pro", - "display_name": "GPT 5.6 Sol Pro", + "id": "qwen/qwen3.8-flash", + "name": "Qwen3.8 Flash", + "display_name": "Qwen3.8 Flash", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1000000, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -233710,40 +227291,36 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ - "none", "low", "medium", - "high", - "xhigh", - "max" + "xhigh" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "release_date": "2026-08-26", + "last_updated": "2026-08-26", "type": "chat" }, { - "id": "openai/gpt-5.3-codex", - "name": "GPT 5.3 Codex", - "display_name": "GPT 5.3 Codex", + "id": "x-ai/grok-build-0.1", + "name": "Grok Build 0.1", + "display_name": "Grok Build 0.1", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 256000, + "output": 256000 }, "temperature": true, "tool_call": true, @@ -233753,49 +227330,33 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "supported": true } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-05", - "last_updated": "2026-02-05", + "release_date": "2026-04-16", + "last_updated": "2026-04-16", "type": "chat" }, { - "id": "openai/o4-mini-high", - "name": "OpenAI o4-mini high", - "display_name": "OpenAI o4-mini high", + "id": "x-ai/grok-4.6", + "name": "Grok 4.6", + "display_name": "Grok 4.6", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 500000, + "output": 500000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -233804,43 +227365,39 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", "effort_options": [ "low", "medium", - "high" - ], - "visibility": "hidden" + "high", + "xhigh" + ] } }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2024-05", - "release_date": "2025-04-16", - "last_updated": "2025-04-16", + "knowledge": "2026-02-01", + "release_date": "2026-08-12", + "last_updated": "2026-08-12", "type": "chat" }, { - "id": "openai/gpt-6.1-sol", - "name": "GPT 6.1 Sol", - "display_name": "GPT 6.1 Sol", + "id": "x-ai/grok-4.5", + "name": "Grok 4.5", + "display_name": "Grok 4.5", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 500000, + "output": 500000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -233848,40 +227405,38 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ "low", "medium", - "high", - "xhigh", - "max" + "high" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-04-30", - "release_date": "2026-09-29", - "last_updated": "2026-09-29", + "release_date": "2026-07-08", + "last_updated": "2026-07-08", "type": "chat" }, { - "id": "openai/gpt-6-luna-pro", - "name": "GPT 6 Luna Pro", - "display_name": "GPT 6 Luna Pro", + "id": "x-ai/grok-4.3", + "name": "Grok 4.3", + "display_name": "Grok 4.3", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1000000, + "output": 1000000 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -233889,39 +227444,39 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ + "none", "low", "medium", - "high", - "xhigh", - "max" + "high" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "release_date": "2026-04-17", + "last_updated": "2026-04-17", "type": "chat" }, { - "id": "openai/gpt-terra-latest", - "name": "GPT Terra Latest", - "display_name": "GPT Terra Latest", + "id": "x-ai/grok-4.7", + "name": "Grok 4.7", + "display_name": "Grok 4.7", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 500000, + "output": 500000 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -233930,29 +227485,38 @@ "extra_capabilities": { "reasoning": { "effort_options": [ - "none", "low", "medium", "high", - "xhigh", - "max" + "xhigh" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-09-11", - "last_updated": "2026-09-11", + "knowledge": "2026-05", + "release_date": "2026-09-21", + "last_updated": "2026-09-21", "type": "chat" - }, + } + ] + }, + "google-vertex": { + "id": "google-vertex", + "name": "Vertex", + "display_name": "Vertex", + "doc": "https://cloud.google.com/vertex-ai/generative-ai/docs/models", + "models": [ { - "id": "openai/gpt-latest", - "name": "GPT Latest", - "display_name": "GPT Latest", + "id": "gemini-3.1-pro-preview", + "name": "Gemini 3.1 Pro Preview", + "display_name": "Gemini 3.1 Pro Preview", "modalities": { "input": [ "text", "image", + "video", + "audio", "pdf" ], "output": [ @@ -233960,9 +227524,10 @@ ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1048576, + "output": 65536 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -233970,29 +227535,38 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ "low", - "medium", - "high", - "xhigh", - "max" + "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-03-29", - "last_updated": "2026-03-29", + "knowledge": "2025-01", + "release_date": "2026-02-19", + "last_updated": "2026-02-19", "type": "chat" }, { - "id": "openai/gpt-5.4", - "name": "GPT 5.4", - "display_name": "GPT 5.4", + "id": "gemini-3-flash-preview", + "name": "Gemini 3 Flash Preview", + "display_name": "Gemini 3 Flash Preview", "modalities": { "input": [ "text", "image", + "video", + "audio", "pdf" ], "output": [ @@ -234000,48 +227574,45 @@ ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", "low", "medium", "high" ], - "visibility": "hidden" + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-05", - "last_updated": "2026-03-05", + "knowledge": "2025-01", + "release_date": "2025-12-17", + "last_updated": "2025-12-17", "type": "chat" }, { - "id": "openai/gpt-4o-2024-11-20", - "name": "GPT-4o (2024-11-20)", - "display_name": "GPT-4o (2024-11-20)", + "id": "mistral-small-2503", + "name": "Mistral Small 3.1 24B", + "display_name": "Mistral Small 3.1 24B", "modalities": { "input": [ "text", @@ -234061,20 +227632,22 @@ "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2023-09", - "release_date": "2024-11-20", - "last_updated": "2024-11-20", + "open_weights": true, + "knowledge": "2024-06", + "release_date": "2025-03-17", + "last_updated": "2025-03-17", "type": "chat" }, { - "id": "openai/gpt-5.6-terra-pro", - "name": "GPT 5.6 Terra Pro", - "display_name": "GPT 5.6 Terra Pro", + "id": "gemini-3.1-pro-preview-customtools", + "name": "Gemini 3.1 Pro Preview Custom Tools", + "display_name": "Gemini 3.1 Pro Preview Custom Tools", "modalities": { "input": [ "text", "image", + "video", + "audio", "pdf" ], "output": [ @@ -234082,10 +227655,10 @@ ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1048576, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -234093,31 +227666,38 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "none", + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ "low", - "medium", - "high", - "xhigh", - "max" + "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "knowledge": "2025-01", + "release_date": "2026-02-19", + "last_updated": "2026-02-19", "type": "chat" }, { - "id": "openai/gpt-5.1", - "name": "GPT 5.1", - "display_name": "GPT 5.1", + "id": "gemini-2.5-pro", + "name": "Gemini 2.5 Pro", + "display_name": "Gemini 2.5 Pro", "modalities": { "input": [ "text", "image", + "audio", + "video", "pdf" ], "output": [ @@ -234125,51 +227705,51 @@ ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "default_enabled": true, + "mode": "budget", + "budget": { + "default": -1, + "min": 128, + "max": 32768, + "auto": -1, + "unit": "tokens" + }, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-11-13", - "last_updated": "2025-11-13", + "knowledge": "2025-01", + "release_date": "2025-06-17", + "last_updated": "2025-06-17", "type": "chat" }, { - "id": "openai/gpt-chat-latest", - "name": "GPT Chat Latest", - "display_name": "GPT Chat Latest", + "id": "gemini-3.5-flash-lite", + "name": "Gemini 3.5 Flash Lite", + "display_name": "Gemini 3.5 Flash Lite", "modalities": { "input": [ "text", "image", + "video", + "audio", "pdf" ], "output": [ @@ -234177,9 +227757,10 @@ ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1048576, + "output": 65536 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -234189,139 +227770,161 @@ "reasoning": { "supported": true, "effort_options": [ - "none", + "minimal", "low", "medium", - "high", - "xhigh", - "max" + "high" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-05-03", - "last_updated": "2026-05-03", + "knowledge": "2026-03", + "release_date": "2026-07-21", + "last_updated": "2026-07-21", "type": "chat" }, { - "id": "openai/gpt-6.1-sol-pro", - "name": "GPT 6.1 Sol Pro", - "display_name": "GPT 6.1 Sol Pro", + "id": "gemini-2.5-pro-tts", + "name": "Gemini 2.5 Pro TTS", + "display_name": "Gemini 2.5 Pro TTS", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ - "text" + "audio" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 32768, + "output": 16384 }, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" + "supported": true, + "default_enabled": true, + "mode": "budget", + "budget": { + "default": -1, + "min": 128, + "max": 32768, + "auto": -1, + "unit": "tokens" + }, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" ] } }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2026-09-29", - "last_updated": "2026-09-29", - "type": "chat" + "knowledge": "2025-01", + "release_date": "2025-09-30", + "last_updated": "2025-12-10" }, { - "id": "openai/gpt-4o-2024-08-06", - "name": "GPT-4o (2024-08-06)", - "display_name": "GPT-4o (2024-08-06)", + "id": "gemini-embedding-001", + "name": "Gemini Embedding 001", + "display_name": "Gemini Embedding 001", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 2048, + "output": 1 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2023-09", - "release_date": "2024-08-06", - "last_updated": "2024-08-06", - "type": "chat" + "knowledge": "2025-05", + "release_date": "2025-05-20", + "last_updated": "2025-05-20", + "type": "embedding" }, { - "id": "openai/gpt-4.1-mini", - "name": "GPT 4.1 Mini", - "display_name": "GPT 4.1 Mini", + "id": "gemini-3.1-flash-lite", + "name": "Gemini 3.1 Flash Lite", + "display_name": "Gemini 3.1 Flash Lite", "modalities": { "input": [ "text", - "image" + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1047576, - "output": 32768 + "context": 1048576, + "output": 65536 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "minimal", + "low", + "medium", + "high" + ] + } }, "attachment": true, "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-04-14", - "last_updated": "2025-04-14", + "knowledge": "2025-01", + "release_date": "2026-05-07", + "last_updated": "2026-05-07", "type": "chat" }, { - "id": "openai/gpt-6-astra", - "name": "GPT 6 Astra", - "display_name": "GPT 6 Astra", + "id": "gemini-3.1-flash-image", + "name": "Nano Banana 2", + "display_name": "Nano Banana 2", "modalities": { "input": [ "text", "image", + "video", "pdf" ], "output": [ - "text" + "text", + "image" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 131072, + "output": 32768 }, - "temperature": false, - "tool_call": true, + "temperature": true, + "tool_call": false, "reasoning": { "supported": true, "default": true @@ -234330,68 +227933,56 @@ "reasoning": { "supported": true, "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" + "minimal", + "high" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-04-30", - "release_date": "2026-09-04", - "last_updated": "2026-09-04", - "type": "chat" + "knowledge": "2025-01", + "release_date": "2026-05-28", + "last_updated": "2026-05-28" }, { - "id": "openai/gpt-oss-120b", - "name": "GPT OSS 120B", - "display_name": "GPT OSS 120B", + "id": "mistral-medium-3", + "name": "Mistral Medium 3", + "display_name": "Mistral Medium 3", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 131072, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "low", - "medium", - "high" - ] - } + "supported": false }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "attachment": true, + "open_weights": false, + "knowledge": "2025-05", + "release_date": "2025-05-07", + "last_updated": "2025-05-07", "type": "chat" }, { - "id": "openai/gpt-5.5", - "name": "GPT 5.5", - "display_name": "GPT 5.5", + "id": "gemini-2.5-flash", + "name": "Gemini 2.5 Flash", + "display_name": "Gemini 2.5 Flash", "modalities": { "input": [ "text", "image", + "audio", + "video", "pdf" ], "output": [ @@ -234399,10 +227990,10 @@ ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1048576, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -234412,38 +228003,36 @@ "reasoning": { "supported": true, "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "mode": "budget", + "budget": { + "default": -1, + "min": 0, + "max": 24576, + "auto": -1, + "off": 0, + "unit": "tokens" + }, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-12-01", - "release_date": "2026-04-23", - "last_updated": "2026-04-23", + "knowledge": "2025-01", + "release_date": "2025-06-17", + "last_updated": "2025-06-17", "type": "chat" }, { - "id": "openai/gpt-4o-mini", - "name": "GPT-4o mini", - "display_name": "GPT-4o mini", + "id": "codestral-2", + "name": "Codestral 2", + "display_name": "Codestral 2", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" @@ -234451,38 +228040,39 @@ }, "limit": { "context": 128000, - "output": 16384 + "output": 8192 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2023-09", - "release_date": "2024-07-18", - "last_updated": "2024-07-18", + "release_date": "2025-07-30", + "last_updated": "2025-07-30", "type": "chat" }, { - "id": "openai/gpt-5-mini", - "name": "GPT 5 Mini", - "display_name": "GPT 5 Mini", + "id": "gemini-3-pro-image", + "name": "Nano Banana Pro", + "display_name": "Nano Banana Pro", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ - "text" + "text", + "image" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 65536, + "output": 32768 }, - "temperature": false, + "temperature": true, "tool_call": false, "reasoning": { "supported": true, @@ -234492,87 +228082,86 @@ "reasoning": { "supported": true, "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "minimal", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ + "mode": "level", + "level": "high", + "level_options": [ "low", - "medium", "high" ], - "visibility": "hidden" + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2024-05-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", - "type": "chat" + "knowledge": "2025-01", + "release_date": "2026-05-28", + "last_updated": "2026-05-28" }, { - "id": "openai/gpt-oss-20b", - "name": "GPT OSS 20B", - "display_name": "GPT OSS 20B", + "id": "gemini-nano-banana-2.1", + "name": "Nano Banana 2.1", + "display_name": "Nano Banana 2.1", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "pdf" ], "output": [ - "text" + "text", + "image" ] }, "limit": { "context": 131072, - "output": 16384 + "output": 32768 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ - "low", + "minimal", "medium", "high" ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", - "type": "chat" + "attachment": true, + "open_weights": false, + "release_date": "2026-10-06", + "last_updated": "2026-10-06" }, { - "id": "openai/gpt-6-sol-pro", - "name": "GPT 6 Sol Pro", - "display_name": "GPT 6 Sol Pro", + "id": "gemini-3.1-flash-lite-image", + "name": "Nano Banana 2 Lite", + "display_name": "Nano Banana 2 Lite", "modalities": { "input": [ "text", "image", + "video", "pdf" ], "output": [ - "text" + "text", + "image" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 65536, + "output": 4096 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -234580,25 +228169,23 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" + "minimal", + "high" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-09-22", - "last_updated": "2026-09-22", - "type": "chat" + "knowledge": "2025-01", + "release_date": "2026-06-30", + "last_updated": "2026-06-30" }, { - "id": "openai/gpt-5", - "name": "GPT 5", - "display_name": "GPT 5", + "id": "gemini-2.5-flash-image", + "name": "Nano Banana", + "display_name": "Nano Banana", "modalities": { "input": [ "text", @@ -234606,55 +228193,35 @@ "pdf" ], "output": [ - "text" + "text", + "image" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 32768, + "output": 32768 }, - "temperature": false, - "tool_call": true, + "temperature": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "minimal", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", - "type": "chat" + "knowledge": "2024-06", + "release_date": "2025-08-26", + "last_updated": "2025-08-26" }, { - "id": "openai/gpt-6-luna", - "name": "GPT 6 Luna", - "display_name": "GPT 6 Luna", + "id": "gemini-4-argon", + "name": "Gemini 4 Argon", + "display_name": "Gemini 4 Argon", "modalities": { "input": [ "text", "image", + "video", + "audio", "pdf" ], "output": [ @@ -234662,8 +228229,8 @@ ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1048576, + "output": 65536 }, "temperature": false, "tool_call": true, @@ -234674,30 +228241,56 @@ "extra_capabilities": { "reasoning": { "effort_options": [ - "none", "low", "medium", - "high", - "xhigh", - "max" + "high" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-05-18", - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "knowledge": "2026-03", + "release_date": "2026-10-13", + "last_updated": "2026-10-13", "type": "chat" }, { - "id": "openai/gpt-4.1", - "name": "GPT 4.1", - "display_name": "GPT 4.1", + "id": "gemini-2.5-flash-tts", + "name": "Gemini 2.5 Flash TTS", + "display_name": "Gemini 2.5 Flash TTS", + "modalities": { + "input": [ + "text" + ], + "output": [ + "audio" + ] + }, + "limit": { + "context": 32768, + "output": 16384 + }, + "temperature": false, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2025-09-30", + "last_updated": "2025-12-10" + }, + { + "id": "gemini-3.7-flash", + "name": "Gemini 3.7 Flash", + "display_name": "Gemini 3.7 Flash", "modalities": { "input": [ "text", "image", + "video", + "audio", "pdf" ], "output": [ @@ -234705,40 +228298,63 @@ ] }, "limit": { - "context": 1047576, - "output": 32768 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", + "low", + "medium", + "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] + } }, "attachment": true, "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-04-14", - "last_updated": "2025-04-14", + "knowledge": "2026-03", + "release_date": "2026-08-13", + "last_updated": "2026-08-13", "type": "chat" }, { - "id": "openai/gpt-5.1-codex-mini", - "name": "GPT 5.1 Codex Mini", - "display_name": "GPT 5.1 Codex Mini", + "id": "gemini-2.5-flash-lite", + "name": "Gemini 2.5 Flash-Lite", + "display_name": "Gemini 2.5 Flash-Lite", "modalities": { "input": [ "text", - "image" + "image", + "audio", + "video", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 1048576, + "output": 65536 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": true, "default": false @@ -234747,48 +228363,50 @@ "reasoning": { "supported": true, "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "mode": "budget", + "budget": { + "default": -1, + "min": 512, + "max": 24576, + "auto": -1, + "unit": "tokens" + }, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-11-13", - "last_updated": "2025-11-13", + "knowledge": "2025-01", + "release_date": "2025-06-17", + "last_updated": "2025-06-17", "type": "chat" }, { - "id": "openai/o1", - "name": "OpenAI o1", - "display_name": "OpenAI o1", + "id": "gemini-3.5-flash", + "name": "Gemini 3.5 Flash", + "display_name": "Gemini 3.5 Flash", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 1048576, + "output": 65536 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": true, "default": true @@ -234797,81 +228415,89 @@ "reasoning": { "supported": true, "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ + "mode": "level", + "level": "high", + "level_options": [ + "minimal", "low", "medium", "high" ], - "visibility": "hidden" + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] } }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2023-09", - "release_date": "2024-12-05", - "last_updated": "2024-12-05", + "knowledge": "2025-01", + "release_date": "2026-05-19", + "last_updated": "2026-05-19", "type": "chat" }, { - "id": "openai/gpt-5.1-2025-11-13", - "name": "GPT-5.1 (2025-11-13)", - "display_name": "GPT-5.1 (2025-11-13)", + "id": "gemini-3.8-flash", + "name": "Gemini 3.8 Flash", + "display_name": "Gemini 3.8 Flash", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", "low", "medium", "high" ], - "visibility": "hidden" + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] } }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-11-13", - "last_updated": "2025-11-13", + "release_date": "2026-09-02", + "last_updated": "2026-09-02", "type": "chat" }, { - "id": "openai/gpt-4.1-nano", - "name": "GPT 4.1 Nano", - "display_name": "GPT 4.1 Nano", + "id": "gemini-3.6-flash", + "name": "Gemini 3.6 Flash", + "display_name": "Gemini 3.6 Flash", "modalities": { "input": [ "text", "image", + "video", + "audio", "pdf" ], "output": [ @@ -234879,38 +228505,10 @@ ] }, "limit": { - "context": 1047576, - "output": 32768 + "context": 1048576, + "output": 65536 }, "temperature": true, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-04-14", - "last_updated": "2025-04-14", - "type": "chat" - }, - { - "id": "openai/o3-mini-high", - "name": "OpenAI o3-mini (High)", - "display_name": "OpenAI o3-mini (High)", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 200000, - "output": 100000 - }, - "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -234920,41 +228518,46 @@ "reasoning": { "supported": true, "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ + "mode": "level", + "level": "high", + "level_options": [ + "minimal", "low", "medium", "high" ], - "visibility": "hidden" + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] } }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2024-05", - "release_date": "2024-12-20", - "last_updated": "2025-01-29", + "knowledge": "2026-03", + "release_date": "2026-07-21", + "last_updated": "2026-07-21", "type": "chat" }, { - "id": "openai/gpt-6-astra-pro", - "name": "GPT 6 Astra Pro", - "display_name": "GPT 6 Astra Pro", + "id": "xai/grok-4.6", + "name": "Grok 4.6", + "display_name": "Grok 4.6", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 524288, + "output": 500000 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -234962,68 +228565,54 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ "low", "medium", - "high", - "xhigh", - "max" + "high" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-09-04", - "last_updated": "2026-09-04", + "knowledge": "2026-02-01", + "release_date": "2026-08-12", + "last_updated": "2026-08-12", "type": "chat" }, { - "id": "openai/o4-mini", - "name": "OpenAI o4-mini", - "display_name": "OpenAI o4-mini", + "id": "xai/grok-4.20-reasoning", + "name": "Grok 4.20 (Reasoning)", + "display_name": "Grok 4.20 (Reasoning)", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 2000000, + "output": 30000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } - }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2024-05", - "release_date": "2025-04-16", - "last_updated": "2025-04-16", + "release_date": "2026-03-09", + "last_updated": "2026-03-09", "type": "chat" }, { - "id": "openai/gpt-5.1-codex", - "name": "GPT 5.1 Codex", - "display_name": "GPT 5.1 Codex", + "id": "xai/grok-4.1-fast-non-reasoning", + "name": "Grok 4.1 Fast", + "display_name": "Grok 4.1 Fast", "modalities": { "input": [ "text", @@ -235034,47 +228623,24 @@ ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 128000, + "output": 30000 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-11-13", - "last_updated": "2025-11-13", + "release_date": "2025-11-19", + "last_updated": "2025-11-19", "type": "chat" }, { - "id": "openai/gpt-4-turbo", - "name": "GPT-4 Turbo", - "display_name": "GPT-4 Turbo", + "id": "xai/grok-4.20-non-reasoning", + "name": "Grok 4.20 (Non-Reasoning)", + "display_name": "Grok 4.20 (Non-Reasoning)", "modalities": { "input": [ "text", @@ -235085,107 +228651,126 @@ ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 2000000, + "output": 30000 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2023-12", - "release_date": "2023-11-06", - "last_updated": "2024-04-09", + "release_date": "2026-03-09", + "last_updated": "2026-03-09", "type": "chat" }, { - "id": "aion-labs/aion-3.5", - "name": "AionLabs: Aion 3.5", - "display_name": "AionLabs: Aion 3.5", + "id": "xai/grok-4.1-fast-reasoning", + "name": "Grok 4.1 Fast (Reasoning)", + "display_name": "Grok 4.1 Fast (Reasoning)", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 128000, + "output": 30000 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-09-23", - "last_updated": "2026-09-23", + "release_date": "2025-11-19", + "last_updated": "2025-11-19", "type": "chat" }, { - "id": "aion-labs/aion-3.5-mini", - "name": "AionLabs: Aion 3.5 Mini", - "display_name": "AionLabs: Aion 3.5 Mini", + "id": "xai/grok-4.3", + "name": "Grok 4.3", + "display_name": "Grok 4.3", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 200000, + "output": 30000 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": true, "open_weights": false, - "release_date": "2026-09-23", - "last_updated": "2026-09-23", + "release_date": "2026-04-17", + "last_updated": "2026-04-17", "type": "chat" }, { - "id": "aion-labs/aion-rp-llama-3.1-8b", - "name": "Llama 3.1 8b (uncensored)", - "display_name": "Llama 3.1 8b (uncensored)", + "id": "xai/grok-4.7", + "name": "Grok 4.7", + "display_name": "Grok 4.7", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 32768, - "output": 16384 + "context": 524288, + "output": 500000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2023-12-31", - "release_date": "2025-02-04", - "last_updated": "2025-02-04", + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "high" + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2026-05", + "release_date": "2026-09-21", + "last_updated": "2026-09-21", "type": "chat" }, { - "id": "aion-labs/aion-3.0", - "name": "AionLabs: Aion 3.0", - "display_name": "AionLabs: Aion 3.0", + "id": "moonshotai/kimi-k2-thinking-maas", + "name": "Kimi K2 Thinking", + "display_name": "Kimi K2 Thinking", "modalities": { "input": [ "text" @@ -235195,8 +228780,8 @@ ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, @@ -235204,16 +228789,28 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, "attachment": false, - "open_weights": false, - "release_date": "2026-05-05", - "last_updated": "2026-05-05", + "open_weights": true, + "knowledge": "2024-08", + "release_date": "2025-11-13", + "last_updated": "2025-11-13", "type": "chat" }, { - "id": "aion-labs/aion-2.0", - "name": "AionLabs: Aion-2.0", - "display_name": "AionLabs: Aion-2.0", + "id": "openai/gpt-oss-20b-maas", + "name": "GPT OSS 20B", + "display_name": "GPT OSS 20B", "modalities": { "input": [ "text" @@ -235229,18 +228826,28 @@ "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "high" + ] + } }, "attachment": false, - "open_weights": false, - "release_date": "2025-12-21", - "last_updated": "2025-12-21", + "open_weights": true, + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "aion-labs/aion-3.0-mini", - "name": "AionLabs: Aion 3.0 Mini", - "display_name": "AionLabs: Aion 3.0 Mini", + "id": "openai/gpt-oss-120b-maas", + "name": "GPT OSS 120B", + "display_name": "GPT OSS 120B", "modalities": { "input": [ "text" @@ -235251,7 +228858,7 @@ }, "limit": { "context": 131072, - "output": 32768 + "output": 131072 }, "temperature": true, "tool_call": true, @@ -235259,16 +228866,26 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "high" + ] + } + }, "attachment": false, - "open_weights": false, - "release_date": "2026-05-14", - "last_updated": "2026-05-14", + "open_weights": true, + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "GalrionSoftworks/MN-LooseCannon-12B-v1", - "name": "MN-LooseCannon-12B-v1", - "display_name": "MN-LooseCannon-12B-v1", + "id": "meta/llama-3.3-70b-instruct-maas", + "name": "Llama 3.3 70B Instruct", + "display_name": "Llama 3.3 70B Instruct", "modalities": { "input": [ "text" @@ -235278,64 +228895,66 @@ ] }, "limit": { - "context": 16384, + "context": 128000, "output": 8192 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": false }, "attachment": false, "open_weights": true, - "release_date": "2024-01-01", - "last_updated": "2024-07-01", + "knowledge": "2023-12", + "release_date": "2025-04-29", + "last_updated": "2025-04-29", "type": "chat" }, { - "id": "undi95/remm-slerp-l2-13b", - "name": "ReMM SLERP 13B", - "display_name": "ReMM SLERP 13B", + "id": "meta/llama-4-scout-17b-16e-instruct-maas", + "name": "Llama 4 Scout 17B Instruct", + "display_name": "Llama 4 Scout 17B Instruct", "modalities": { "input": [ "text", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 6144, - "output": 4096 + "context": 1310720, + "output": 8192 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, "attachment": true, "open_weights": true, - "knowledge": "2023-06-30", - "release_date": "2023-07-22", - "last_updated": "2023-07-22", + "knowledge": "2024-08", + "release_date": "2025-04-05", + "last_updated": "2025-04-05", "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-V3.1", - "name": "DeepSeek V3.1", - "display_name": "DeepSeek V3.1", + "id": "meta/llama-4-maverick-17b-128e-instruct-maas", + "name": "Llama 4 Maverick 17B 128E Instruct", + "display_name": "Llama 4 Maverick 17B 128E Instruct", "modalities": { "input": [ "text", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 65536 + "context": 524288, + "output": 8192 }, "temperature": true, "tool_call": true, @@ -235344,14 +228963,15 @@ }, "attachment": true, "open_weights": true, - "release_date": "2025-08-21", - "last_updated": "2025-08-21", + "knowledge": "2024-08", + "release_date": "2025-04-29", + "last_updated": "2025-04-29", "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-V3.1:thinking", - "name": "DeepSeek V3.1 Thinking", - "display_name": "DeepSeek V3.1 Thinking", + "id": "zai-org/glm-5.2-maas", + "name": "GLM-5.2", + "display_name": "GLM-5.2", "modalities": { "input": [ "text" @@ -235361,24 +228981,36 @@ ] }, "limit": { - "context": 128000, - "output": 65536 + "context": 1000000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, "open_weights": true, - "release_date": "2025-08-21", - "last_updated": "2025-08-21", + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-R1-0528", - "name": "DeepSeek R1 0528", - "display_name": "DeepSeek R1 0528", + "id": "zai-org/glm-4.7-maas", + "name": "GLM-4.7", + "display_name": "GLM-4.7", "modalities": { "input": [ "text" @@ -235388,8 +229020,8 @@ ] }, "limit": { - "context": 163840, - "output": 32768 + "context": 200000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -235410,14 +229042,15 @@ }, "attachment": false, "open_weights": true, - "release_date": "2025-05-28", - "last_updated": "2025-05-28", + "knowledge": "2025-04", + "release_date": "2026-01-06", + "last_updated": "2026-01-06", "type": "chat" }, { - "id": "deepseek-ai/deepseek-v3.2-exp-thinking", - "name": "DeepSeek V3.2 Exp Thinking", - "display_name": "DeepSeek V3.2 Exp Thinking", + "id": "zai-org/glm-5-maas", + "name": "GLM-5", + "display_name": "GLM-5", "modalities": { "input": [ "text" @@ -235427,24 +229060,36 @@ ] }, "limit": { - "context": 163840, - "output": 65536 + "context": 200000, + "output": 128000 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, "attachment": false, "open_weights": true, - "release_date": "2024-01-01", - "last_updated": "2025-09-29", + "release_date": "2026-02-12", + "last_updated": "2026-02-12", "type": "chat" }, { - "id": "deepseek-ai/deepseek-v3.2-exp", - "name": "DeepSeek V3.2 Exp", - "display_name": "DeepSeek V3.2 Exp", + "id": "deepseek-ai/deepseek-v3.1-maas", + "name": "DeepSeek V3.1", + "display_name": "DeepSeek V3.1", "modalities": { "input": [ "text" @@ -235455,22 +229100,24 @@ }, "limit": { "context": 163840, - "output": 65536 + "output": 32768 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": false, "open_weights": true, - "release_date": "2024-01-01", - "last_updated": "2025-09-29", + "release_date": "2025-08-28", + "last_updated": "2025-08-28", "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-V3.1-Terminus", - "name": "DeepSeek V3.1 Terminus", - "display_name": "DeepSeek V3.1 Terminus", + "id": "deepseek-ai/deepseek-v3.2-maas", + "name": "DeepSeek V3.2", + "display_name": "DeepSeek V3.2", "modalities": { "input": [ "text" @@ -235480,23 +229127,76 @@ ] }, "limit": { - "context": 128000, + "context": 163840, "output": 65536 }, + "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, "open_weights": true, - "release_date": "2025-08-02", - "last_updated": "2025-08-02", + "release_date": "2025-12-17", + "last_updated": "2026-04-04", "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-V3.1-Terminus:thinking", - "name": "DeepSeek V3.1 Terminus (Thinking)", - "display_name": "DeepSeek V3.1 Terminus (Thinking)", + "id": "google/gemma-4-26b-a4b-it-maas", + "name": "Gemma 4 26B A4B IT", + "display_name": "Gemma 4 26B A4B IT", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 262144, + "output": 128000 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": true, + "open_weights": true, + "release_date": "2026-04-02", + "last_updated": "2026-04-02", + "type": "chat" + }, + { + "id": "qwen/qwen3-235b-a22b-instruct-2507-maas", + "name": "Qwen3 235B A22B Instruct", + "display_name": "Qwen3 235B A22B Instruct", "modalities": { "input": [ "text" @@ -235506,36 +229206,44 @@ ] }, "limit": { - "context": 128000, - "output": 65536 + "context": 262144, + "output": 16384 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": false }, "attachment": false, "open_weights": true, - "release_date": "2024-01-01", - "last_updated": "2025-09-22", + "release_date": "2025-08-13", + "last_updated": "2025-08-13", "type": "chat" - }, + } + ] + }, + "tencent-token-plan": { + "id": "tencent-token-plan", + "name": "Tencent Token Plan", + "display_name": "Tencent Token Plan", + "api": "https://api.lkeap.cloud.tencent.com/plan/v3", + "doc": "https://cloud.tencent.com/document/product/1823/130060", + "models": [ { - "id": "qwen/qwen3.7-plus:thinking", - "name": "Qwen3.7 Plus Thinking", - "display_name": "Qwen3.7 Plus Thinking", + "id": "hy3", + "name": "Hy3", + "display_name": "Hy3", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 983616, - "output": 65536 + "context": 256000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -235545,36 +229253,34 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ "none", "high" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-04", - "release_date": "2026-06-02", - "last_updated": "2026-06-02", + "attachment": false, + "open_weights": true, + "release_date": "2026-07-06", + "last_updated": "2026-07-06", "type": "chat" }, { - "id": "qwen/qwen3.6-27b:thinking", - "name": "Qwen3.6 27B Thinking", - "display_name": "Qwen3.6 27B Thinking", + "id": "hy4-preview", + "name": "Hy4 preview", + "display_name": "Hy4 preview", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 1024000, + "output": 64000 }, "temperature": true, "tool_call": true, @@ -235585,54 +229291,59 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "none", + "high" ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-04-22", - "last_updated": "2026-04-22", + "release_date": "2026-08-28", + "last_updated": "2026-08-28", "type": "chat" - }, + } + ] + }, + "watsonx": { + "id": "watsonx", + "name": "watsonx.ai", + "display_name": "watsonx.ai", + "doc": "https://www.ibm.com/docs/en/watsonx/saas?topic=solutions-supported-foundation-models", + "models": [ { - "id": "qwen/qwen3.8-27b", - "name": "Qwen3.8 27B", - "display_name": "Qwen3.8 27B", + "id": "meta-llama/llama-4-maverick-17b-128e-instruct-fp8", + "name": "Llama 4 Maverick 17B 128E Instruct FP8", + "display_name": "Llama 4 Maverick 17B 128E Instruct FP8", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 32768 + "context": 131072, + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": true, "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "knowledge": "2024-08", + "release_date": "2025-04-05", + "last_updated": "2025-04-05", "type": "chat" }, { - "id": "qwen/qwen3-30b-a3b-instruct-2507", - "name": "Qwen3 30B A3B Instruct 2507", - "display_name": "Qwen3 30B A3B Instruct 2507", + "id": "meta-llama/llama-3-3-70b-instruct", + "name": "Llama-3.3-70B-Instruct", + "display_name": "Llama-3.3-70B-Instruct", "modalities": { "input": [ "text" @@ -235642,37 +229353,36 @@ ] }, "limit": { - "context": 256000, - "output": 32768 + "context": 131072, + "output": 4096 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, "attachment": false, "open_weights": true, - "release_date": "2025-07-28", - "last_updated": "2025-07-28", + "knowledge": "2023-12", + "release_date": "2024-12-06", + "last_updated": "2024-12-06", "type": "chat" }, { - "id": "qwen/qwen3.6-35b-a3b:thinking", - "name": "Qwen3.6 35B A3B Thinking", - "display_name": "Qwen3.6 35B A3B Thinking", + "id": "openai/gpt-oss-120b", + "name": "GPT OSS 120B", + "display_name": "GPT OSS 120B", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 16384 + "context": 131072, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -235683,108 +229393,129 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "low", + "medium", + "high" ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-04-17", - "last_updated": "2026-04-17", + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "qwen/qwen3.8-27b-swift", - "name": "Qwen 3.8 27B Swift", - "display_name": "Qwen 3.8 27B Swift", + "id": "ibm/granite-4-h-small", + "name": "Granite-4.0-H-Small", + "display_name": "Granite-4.0-H-Small", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 131072, + "output": 131072 }, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-10-05", - "last_updated": "2026-10-05", + "release_date": "2025-10-02", + "last_updated": "2025-10-02", "type": "chat" }, { - "id": "qwen/qwen3-next-80b-a3b-instruct", - "name": "Qwen3 Next 80B A3B (Instruct)", - "display_name": "Qwen3 Next 80B A3B (Instruct)", + "id": "mistralai/mistral-small-3-1-24b-instruct-2503", + "name": "Mistral Small 3.1 24B", + "display_name": "Mistral Small 3.1 24B", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 131072, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-09", - "last_updated": "2025-09", + "knowledge": "2024-06", + "release_date": "2025-03-17", + "last_updated": "2025-03-17", "type": "chat" - }, + } + ] + }, + "standardcompute": { + "id": "standardcompute", + "name": "Standard Compute", + "display_name": "Standard Compute", + "api": "https://api.stdcmpt.com/v1", + "doc": "https://docs.standardcompute.com/models", + "models": [ { - "id": "qwen/qwen3-coder-30b-a3b-instruct", - "name": "Qwen3 Coder 30B A3B Instruct", - "display_name": "Qwen3 Coder 30B A3B Instruct", + "id": "standardcompute", + "name": "Standard Compute", + "display_name": "Standard Compute", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 65536 + "context": 1000000, + "output": 50000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-07-31", - "last_updated": "2025-07-31", + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": true, + "open_weights": false, + "release_date": "2026-03-01", + "last_updated": "2026-10-13", "type": "chat" }, { - "id": "qwen/qwen3.5-397b-a17b", - "name": "Qwen3.5 397B A17B", - "display_name": "Qwen3.5 397B A17B", + "id": "moonshotai/kimi-k3", + "name": "Kimi K3", + "display_name": "Kimi K3", "modalities": { "input": [ "text", @@ -235796,13 +229527,59 @@ ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 1048576, + "output": 50000 + }, + "temperature": false, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "none", + "low", + "high", + "max" + ] + } + }, + "attachment": true, + "open_weights": true, + "release_date": "2026-07-16", + "last_updated": "2026-07-16", + "type": "chat" + }, + { + "id": "deepseek/deepseek-v4-flash-0731", + "name": "DeepSeek V4 Flash 0731", + "display_name": "DeepSeek V4 Flash 0731", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1000000, + "output": 50000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { @@ -235812,72 +229589,89 @@ "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "effort_options": [ + "none", + "low", + "high", + "max" ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-02-15", - "last_updated": "2026-02-15", + "knowledge": "2025-05", + "release_date": "2026-07-31", + "last_updated": "2026-07-31", "type": "chat" }, { - "id": "qwen/qwen3.6-35b-a3b", - "name": "Qwen3.6 35B A3B", - "display_name": "Qwen3.6 35B A3B", + "id": "deepseek/deepseek-v4-flash", + "name": "DeepSeek V4 Flash", + "display_name": "DeepSeek V4 Flash", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 16384 + "context": 1000000, + "output": 50000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "high", + "max" + ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "notes": [ + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-04-17", - "last_updated": "2026-04-17", + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "qwen/qwen3.7-plus", - "name": "Qwen3.7 Plus", - "display_name": "Qwen3.7 Plus", + "id": "deepseek/deepseek-v4.1-flash", + "name": "DeepSeek V4.1 Flash", + "display_name": "DeepSeek V4.1 Flash", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 991808, - "output": 65536 + "context": 1000000, + "output": 50000 }, "temperature": true, "tool_call": true, @@ -235888,51 +229682,82 @@ "extra_capabilities": { "reasoning": { "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ "none", - "high" + "low", + "high", + "max" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-04", - "release_date": "2026-06-02", - "last_updated": "2026-06-02", + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-09-10", + "last_updated": "2026-09-10", "type": "chat" }, { - "id": "qwen/qwen3.8-27b-darkidol", - "name": "Qwen 3.8 27B DarkIdol", - "display_name": "Qwen 3.8 27B DarkIdol", + "id": "deepseek/deepseek-v4-pro", + "name": "DeepSeek V4 Pro", + "display_name": "DeepSeek V4 Pro", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 1000000, + "output": 50000 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": true, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "high", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." + ] + } + }, + "attachment": false, "open_weights": true, - "release_date": "2026-10-05", - "last_updated": "2026-10-05", + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "qwen/qwen3.7-max:thinking", - "name": "Qwen3.7 Max Thinking", - "display_name": "Qwen3.7 Max Thinking", + "id": "deepseek/deepseek-v4-pro-0813", + "name": "DeepSeek V4 Pro 0813", + "display_name": "DeepSeek V4 Pro 0813", "modalities": { "input": [ "text" @@ -235943,7 +229768,7 @@ }, "limit": { "context": 1000000, - "output": 65536 + "output": 50000 }, "temperature": true, "tool_call": true, @@ -235953,93 +229778,105 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ "none", - "high" + "low", + "high", + "max" ] } }, "attachment": false, - "open_weights": false, - "release_date": "2026-05-21", - "last_updated": "2026-05-21", + "open_weights": true, + "release_date": "2026-08-13", + "last_updated": "2026-08-22", "type": "chat" }, { - "id": "qwen/qwen3.8-27b-kimiko", - "name": "Qwen 3.8 27B Kimiko", - "display_name": "Qwen 3.8 27B Kimiko", + "id": "openai/gpt-5.6-terra", + "name": "GPT-5.6 Terra", + "display_name": "GPT-5.6 Terra", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 1050000, + "output": 50000 }, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": true, - "open_weights": true, - "release_date": "2026-10-05", - "last_updated": "2026-10-05", - "type": "chat" - }, - { - "id": "qwen/qwen-max", - "name": "Qwen 2.5 Max", - "display_name": "Qwen 2.5 Max", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 32000, - "output": 8192 - }, - "temperature": true, - "tool_call": false, - "reasoning": { - "supported": false + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2024-04", - "release_date": "2024-04-03", - "last_updated": "2025-01-25", + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "qwen/qwen3.5-397b-a17b:thinking", - "name": "Qwen3.5 397B A17B Thinking", - "display_name": "Qwen3.5 397B A17B Thinking", + "id": "openai/gpt-5.6-sol", + "name": "GPT-5.6 Sol", + "display_name": "GPT-5.6 Sol", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 1050000, + "output": 50000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -236048,6 +229885,23 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], "interleaved": true, "summaries": true, "visibility": "summary", @@ -236057,50 +229911,79 @@ } }, "attachment": true, - "open_weights": true, - "release_date": "2026-02-15", - "last_updated": "2026-02-15", + "open_weights": false, + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "qwen/qwen3.8-27b:thinking", - "name": "Qwen3.8 27B Thinking", - "display_name": "Qwen3.8 27B Thinking", + "id": "openai/gpt-5.6-luna", + "name": "GPT-5.6 Luna", + "display_name": "GPT-5.6 Luna", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 32768 + "context": 1050000, + "output": 50000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, "attachment": true, - "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "open_weights": false, + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "qwen/qwen3.8-max:thinking", - "name": "Qwen3.8 Max Thinking", - "display_name": "Qwen3.8 Max Thinking", + "id": "openai/gpt-6-luna", + "name": "GPT-6 Luna", + "display_name": "GPT-6 Luna", "modalities": { "input": [ "text", "image", - "video", "pdf" ], "output": [ @@ -236108,10 +229991,10 @@ ] }, "limit": { - "context": 991000, - "output": 131072 + "context": 1050000, + "output": 50000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -236119,42 +230002,53 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ + "none", "low", "medium", "high", + "xhigh", "max" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-08-03", - "last_updated": "2026-08-03", + "knowledge": "2026-05-18", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "qwen/qwen3.5-35b-a3b", - "name": "Qwen3.5 35B A3B", - "display_name": "Qwen3.5 35B A3B", + "id": "openai/gpt-6-astra", + "name": "GPT-6 Astra", + "display_name": "GPT-6 Astra", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 260096, - "output": 65536 + "context": 1050000, + "output": 50000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { @@ -236164,19 +230058,27 @@ "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-02-23", - "last_updated": "2026-02-23", + "open_weights": false, + "knowledge": "2026-04-30", + "release_date": "2026-09-04", + "last_updated": "2026-09-04", "type": "chat" }, { - "id": "qwen/qwen3-235b-a22b-thinking-2507", - "name": "Qwen 3 235b A22B 2507 Thinking", - "display_name": "Qwen 3 235b A22B 2507 Thinking", + "id": "z-ai/glm-5.2", + "name": "GLM-5.2", + "display_name": "GLM-5.2", "modalities": { "input": [ "text" @@ -236186,13 +230088,14 @@ ] }, "limit": { - "context": 131072, - "output": 81920 + "context": 1000000, + "output": 50000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { @@ -236202,48 +230105,24 @@ "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "effort_options": [ + "none", + "high", + "xhigh" ] } }, "attachment": false, "open_weights": true, - "release_date": "2025-07-25", - "last_updated": "2025-07-25", - "type": "chat" - }, - { - "id": "qwen/qwen3-vl-235b-a22b-instruct", - "name": "Qwen3 VL 235B A22B Instruct", - "display_name": "Qwen3 VL 235B A22B Instruct", - "modalities": { - "input": [ - "text", - "image" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 131072, - "output": 32768 - }, - "temperature": true, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": true, - "knowledge": "2025-03-31", - "release_date": "2025-09-23", - "last_updated": "2025-09-23", + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "qwen/qwen3.6-max-preview", - "name": "Qwen3.6 Max Preview", - "display_name": "Qwen3.6 Max Preview", + "id": "z-ai/glm-5.3", + "name": "GLM-5.3", + "display_name": "GLM-5.3", "modalities": { "input": [ "text" @@ -236253,13 +230132,14 @@ ] }, "limit": { - "context": 245760, - "output": 65536 + "context": 1000000, + "output": 50000 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { @@ -236269,20 +230149,24 @@ "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "effort_options": [ + "low", + "high", + "max" ] } }, "attachment": false, - "open_weights": false, - "knowledge": "2025-04", - "release_date": "2026-04-20", - "last_updated": "2026-04-20", + "open_weights": true, + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "qwen/qwen3.8-max", - "name": "Qwen3.8 Max", - "display_name": "Qwen3.8 Max", + "id": "z-ai/glm-5.3-flash", + "name": "GLM-5.3-Flash", + "display_name": "GLM-5.3-Flash", "modalities": { "input": [ "text", @@ -236295,46 +230179,61 @@ ] }, "limit": { - "context": 991000, - "output": 65536 + "context": 1000000, + "output": 50000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "low", + "high", + "max" + ] } }, "attachment": true, - "open_weights": false, - "release_date": "2026-08-03", - "last_updated": "2026-08-03", + "open_weights": true, + "release_date": "2026-08-26", + "last_updated": "2026-08-26", "type": "chat" }, { - "id": "qwen/qwen3-235b-a22b", - "name": "Qwen 3 235b A22B", - "display_name": "Qwen 3 235b A22B", + "id": "xiaomi/mimo-v2.6-pro", + "name": "MiMo-V2.6-Pro", + "display_name": "MiMo-V2.6-Pro", "modalities": { "input": [ "text", - "pdf" + "image", + "audio", + "video" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 16384 + "context": 1048576, + "output": 50000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { @@ -236349,28 +230248,25 @@ }, "attachment": true, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-04-28", - "last_updated": "2025-04-28", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "qwen/qwen3.8-max-prime", - "name": "Qwen3.8 Max Prime", - "display_name": "Qwen3.8 Max Prime", + "id": "xiaomi/mimo-v2.5-pro", + "name": "MiMo-V2.5-Pro", + "display_name": "MiMo-V2.5-Pro", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 1048576, + "output": 50000 }, "temperature": true, "tool_call": true, @@ -236380,97 +230276,127 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "minimal", - "low", - "medium", - "high", - "xhigh" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, - "attachment": true, - "open_weights": false, - "release_date": "2026-09-23", - "last_updated": "2026-09-23", + "attachment": false, + "open_weights": true, + "knowledge": "2024-12", + "release_date": "2026-04-22", + "last_updated": "2026-04-22", "type": "chat" }, { - "id": "qwen/qwen3.8-27b-novelist", - "name": "Qwen 3.8 27B Novelist", - "display_name": "Qwen 3.8 27B Novelist", + "id": "xiaomi/mimo-v2.5", + "name": "MiMo-V2.5", + "display_name": "MiMo-V2.5", "modalities": { "input": [ "text", - "image" + "image", + "audio", + "video" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 1048576, + "output": 50000 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, "attachment": true, "open_weights": true, - "release_date": "2026-10-05", - "last_updated": "2026-10-05", + "knowledge": "2024-12", + "release_date": "2026-04-22", + "last_updated": "2026-04-22", "type": "chat" }, { - "id": "qwen/qwen3-coder-next", - "name": "Qwen3 Coder Next", - "display_name": "Qwen3 Coder Next", + "id": "xiaomi/mimo-v2.6-flash", + "name": "MiMo-V2.6-Flash", + "display_name": "MiMo-V2.6-Flash", "modalities": { "input": [ - "text" + "text", + "image", + "audio", + "video" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 1048576, + "output": 50000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": true, "open_weights": true, - "knowledge": "2025-09", - "release_date": "2026-02-03", - "last_updated": "2026-02-03", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "qwen/qwen3.5-flash:thinking", - "name": "Qwen3.5 Flash Thinking", - "display_name": "Qwen3.5 Flash Thinking", + "id": "anthropic/claude-opus-5.5", + "name": "Claude Opus 5.5", + "display_name": "Claude Opus 5.5", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 991808, - "output": 65536 + "context": 1000000, + "output": 50000 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { "supported": true, "default": true @@ -236483,132 +230409,153 @@ "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-02-23", - "last_updated": "2026-02-23", - "type": "chat" - }, - { - "id": "qwen/qwen2.5-coder-32b-instruct", - "name": "Qwen 2.5 Coder 32b", - "display_name": "Qwen 2.5 Coder 32b", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 32000, - "output": 8192 - }, - "temperature": true, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": true, - "release_date": "2024-11-12", - "last_updated": "2024-11-12", + "knowledge": "2026-06", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "qwen/qwen3.5-27b", - "name": "Qwen3.5 27B", - "display_name": "Qwen3.5 27B", + "id": "anthropic/claude-fable-5", + "name": "Claude Fable 5", + "display_name": "Claude Fable 5", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 260096, - "output": 65536 + "context": 1000000, + "output": 50000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", + "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", + "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-02-23", - "last_updated": "2026-02-23", + "open_weights": false, + "knowledge": "2026-01-31", + "release_date": "2026-06-09", + "last_updated": "2026-06-09", "type": "chat" }, { - "id": "qwen/qwen3.8-27b-fable", - "name": "Qwen 3.8 27B Fable", - "display_name": "Qwen 3.8 27B Fable", + "id": "anthropic/claude-haiku-5.5", + "name": "Claude Haiku 5.5", + "display_name": "Claude Haiku 5.5", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 524288, - "output": 32768 + "context": 1000000, + "output": 50000 }, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + }, "attachment": true, - "open_weights": true, - "release_date": "2026-07-29", - "last_updated": "2026-08-28", + "open_weights": false, + "knowledge": "2026-06", + "release_date": "2026-10-07", + "last_updated": "2026-10-07", "type": "chat" }, { - "id": "qwen/qwen3.5-plus", - "name": "Qwen3.5 Plus", - "display_name": "Qwen3.5 Plus", + "id": "anthropic/claude-opus-5", + "name": "Claude Opus 5", + "display_name": "Claude Opus 5", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 983616, - "output": 65536 + "context": 1000000, + "output": 50000 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { @@ -236618,38 +230565,47 @@ "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-04", - "release_date": "2026-02-16", - "last_updated": "2026-02-16", + "knowledge": "2026-05", + "release_date": "2026-07-24", + "last_updated": "2026-07-24", "type": "chat" }, { - "id": "qwen/qwen3.5-flash", - "name": "Qwen3.5 Flash", - "display_name": "Qwen3.5 Flash", + "id": "anthropic/claude-sonnet-5", + "name": "Claude Sonnet 5", + "display_name": "Claude Sonnet 5", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 991808, - "output": 65536 + "context": 1000000, + "output": 50000 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { @@ -236659,34 +230615,43 @@ "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-02-23", - "last_updated": "2026-02-23", + "knowledge": "2026-01-31", + "release_date": "2026-06-30", + "last_updated": "2026-06-30", "type": "chat" }, { - "id": "qwen/qwen3.7-flash", - "name": "Qwen3.7 Flash", - "display_name": "Qwen3.7 Flash", + "id": "anthropic/claude-sonnet-5.5", + "name": "Claude Sonnet 5.5", + "display_name": "Claude Sonnet 5.5", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 991808, - "output": 65536 + "context": 1000000, + "output": 50000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -236695,59 +230660,89 @@ "extra_capabilities": { "reasoning": { "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ - "none", - "high" + "low", + "medium", + "high", + "xhigh", + "max" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-07-15", - "last_updated": "2026-07-15", + "knowledge": "2026-06", + "release_date": "2026-09-28", + "last_updated": "2026-09-28", "type": "chat" }, { - "id": "qwen/qwen3-14b", - "name": "Qwen 3 14b", - "display_name": "Qwen 3 14b", + "id": "anthropic/claude-fable-5.1", + "name": "Claude Fable 5.1", + "display_name": "Claude Fable 5.1", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 41000, - "output": 32768 + "context": 1000000, + "output": 50000 }, + "temperature": false, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", + "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", + "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2024-01-01", - "last_updated": "2024-01-01", + "attachment": true, + "open_weights": false, + "knowledge": "2026-06", + "release_date": "2026-09-01", + "last_updated": "2026-09-01", "type": "chat" }, { - "id": "qwen/qwen3.6-plus", - "name": "Qwen 3.6 Plus", - "display_name": "Qwen 3.6 Plus", + "id": "minimax/minimax-m3", + "name": "MiniMax-M3", + "display_name": "MiniMax-M3", "modalities": { "input": [ "text", @@ -236759,13 +230754,14 @@ ] }, "limit": { - "context": 991808, - "output": 65536 + "context": 1048576, + "output": 50000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { @@ -236779,16 +230775,15 @@ } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-04", - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "open_weights": true, + "release_date": "2026-06-01", + "last_updated": "2026-06-01", "type": "chat" }, { - "id": "qwen/qwen3.8-27b-kiwen", - "name": "Qwen 3.8 27B Kiwen", - "display_name": "Qwen 3.8 27B Kiwen", + "id": "mistralai/mistral-large-4-0", + "name": "Mistral Large 4", + "display_name": "Mistral Large 4", "modalities": { "input": [ "text", @@ -236799,46 +230794,72 @@ ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 1048576, + "output": 50000 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "none", + "high" + ] + } + }, "attachment": true, - "open_weights": true, - "release_date": "2026-10-05", - "last_updated": "2026-10-05", + "open_weights": false, + "release_date": "2026-10-06", + "last_updated": "2026-10-06", "type": "chat" }, { - "id": "qwen/qwen3.6-flash", - "name": "Qwen3.6 Flash", - "display_name": "Qwen3.6 Flash", + "id": "google/gemini-3.1-pro-preview", + "name": "Gemini 3.1 Pro Preview", + "display_name": "Gemini 3.1 Pro Preview", "modalities": { "input": [ "text", "image", - "video" + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 991808, - "output": 65536 + "context": 1048576, + "output": 50000 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "low", + "high" + ], "interleaved": true, "summaries": true, "visibility": "summary", @@ -236849,58 +230870,86 @@ }, "attachment": true, "open_weights": false, - "release_date": "2026-04-27", - "last_updated": "2026-04-27", + "knowledge": "2025-01", + "release_date": "2026-02-19", + "last_updated": "2026-02-19", "type": "chat" }, { - "id": "qwen/qwen3-coder-flash", - "name": "Qwen3 Coder Flash", - "display_name": "Qwen3 Coder Flash", + "id": "google/gemini-2.5-pro", + "name": "Gemini 2.5 Pro", + "display_name": "Gemini 2.5 Pro", "modalities": { "input": [ - "text" + "text", + "image", + "audio", + "video", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 65536 + "context": 1048576, + "output": 50000 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "budget", + "budget": { + "default": -1, + "min": 128, + "max": 32768, + "auto": -1, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": true, "open_weights": false, - "knowledge": "2025-04", - "release_date": "2025-07-28", - "last_updated": "2025-07-28", + "knowledge": "2025-01", + "release_date": "2025-06-17", + "last_updated": "2025-06-17", "type": "chat" }, { - "id": "qwen/qwen3.5-plus:thinking", - "name": "Qwen3.5 Plus Thinking", - "display_name": "Qwen3.5 Plus Thinking", + "id": "google/gemini-3.5-flash-lite", + "name": "Gemini 3.5 Flash Lite", + "display_name": "Gemini 3.5 Flash Lite", "modalities": { "input": [ "text", "image", - "video" + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 983616, - "output": 65536 + "context": 1048576, + "output": 50000 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, "default": true @@ -236913,40 +230962,61 @@ "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "effort_options": [ + "minimal", + "low", + "medium", + "high" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-04", - "release_date": "2026-02-16", - "last_updated": "2026-02-16", + "knowledge": "2026-03", + "release_date": "2026-07-21", + "last_updated": "2026-07-21", "type": "chat" }, { - "id": "qwen/qwen-turbo", - "name": "Qwen Turbo", - "display_name": "Qwen Turbo", + "id": "google/gemini-2.5-flash", + "name": "Gemini 2.5 Flash", + "display_name": "Gemini 2.5 Flash", "modalities": { "input": [ - "text" + "text", + "image", + "audio", + "video", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 8192 + "context": 1048576, + "output": 50000 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "budget", + "budget": { + "default": -1, + "min": 0, + "max": 24576, + "auto": -1, + "off": 0, + "unit": "tokens" + }, "interleaved": true, "summaries": true, "visibility": "summary", @@ -236955,37 +231025,51 @@ ] } }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2024-04", - "release_date": "2024-11-01", - "last_updated": "2025-04-28", + "knowledge": "2025-01", + "release_date": "2025-06-17", + "last_updated": "2025-06-17", "type": "chat" }, { - "id": "qwen/qwen3-max", - "name": "Qwen3 Max", - "display_name": "Qwen3 Max", + "id": "google/gemini-3.8-flash", + "name": "Gemini 3.8 Flash", + "display_name": "Gemini 3.8 Flash", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 32768 + "context": 1048576, + "output": 50000 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", + "low", + "medium", + "high" + ], "interleaved": true, "summaries": true, "visibility": "summary", @@ -236994,11 +231078,10 @@ ] } }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2025-04", - "release_date": "2025-09-23", - "last_updated": "2025-09-23", + "release_date": "2026-09-02", + "last_updated": "2026-09-02", "type": "chat" }, { @@ -237015,7 +231098,7 @@ }, "limit": { "context": 1000000, - "output": 65536 + "output": 50000 }, "temperature": true, "tool_call": true, @@ -237026,9 +231109,11 @@ "extra_capabilities": { "reasoning": { "supported": true, - "effort_options": [ - "none", - "high" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, @@ -237039,26 +231124,28 @@ "type": "chat" }, { - "id": "qwen/qwen3-32b", - "name": "Qwen 3 32b", - "display_name": "Qwen 3 32b", + "id": "qwen/qwen3.7-flash", + "name": "Qwen3.7 Flash", + "display_name": "Qwen3.7 Flash", "modalities": { "input": [ "text", - "pdf" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 41000, - "output": 32768 + "context": 1000000, + "output": 50000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { @@ -237072,31 +231159,34 @@ } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-04-28", - "last_updated": "2025-04-28", + "open_weights": false, + "release_date": "2026-07-15", + "last_updated": "2026-07-15", "type": "chat" }, { - "id": "qwen/qwen3-max-2026-01-23", - "name": "Qwen3 Max 2026-01-23", - "display_name": "Qwen3 Max 2026-01-23", + "id": "qwen/qwen3.7-plus", + "name": "Qwen3.7 Plus", + "display_name": "Qwen3.7 Plus", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 32768 + "context": 1000000, + "output": 50000 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { @@ -237109,72 +231199,112 @@ ] } }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-01-26", - "last_updated": "2026-01-26", + "knowledge": "2025-04", + "release_date": "2026-06-02", + "last_updated": "2026-06-02", "type": "chat" }, { - "id": "qwen/qwen3.8-27b-antislop", - "name": "Qwen 3.8 27B Antislop", - "display_name": "Qwen 3.8 27B Antislop", + "id": "qwen/qwen3.8-flash", + "name": "Qwen3.8 Flash", + "display_name": "Qwen3.8 Flash", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 1000000, + "output": 50000 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "low", + "medium", + "xhigh" + ] + } + }, "attachment": true, - "open_weights": true, - "release_date": "2026-10-05", - "last_updated": "2026-10-05", + "open_weights": false, + "release_date": "2026-08-26", + "last_updated": "2026-08-26", "type": "chat" }, { - "id": "qwen/qwen3.8-27b-queen", - "name": "Qwen 3.8 27B Queen", - "display_name": "Qwen 3.8 27B Queen", + "id": "qwen/qwen3.8-max-0902", + "name": "Qwen3.8 Max 0902", + "display_name": "Qwen3.8 Max 0902", "modalities": { "input": [ "text", - "image" + "image", + "video", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 524288, - "output": 32768 + "context": 1000000, + "output": 50000 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] + } + }, "attachment": true, - "open_weights": true, - "release_date": "2026-09-09", - "last_updated": "2026-09-09", + "open_weights": false, + "release_date": "2026-09-02", + "last_updated": "2026-09-02", "type": "chat" }, { - "id": "qwen/qwen3.6-27b", - "name": "Qwen3.6 27B", - "display_name": "Qwen3.6 27B", + "id": "qwen/qwen3.8-27b", + "name": "Qwen3.8 27B", + "display_name": "Qwen3.8 27B", "modalities": { "input": [ "text", @@ -237187,12 +231317,13 @@ }, "limit": { "context": 262144, - "output": 65536 + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { @@ -237202,133 +231333,218 @@ "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "effort_options": [ + "none", + "low", + "medium", + "xhigh" ] } }, "attachment": true, "open_weights": true, - "release_date": "2026-04-22", - "last_updated": "2026-04-22", + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "qwen/qwen3.5-omni-plus", - "name": "Qwen3.5 Omni Plus", - "display_name": "Qwen3.5 Omni Plus", + "id": "x-ai/grok-4.3", + "name": "Grok 4.3", + "display_name": "Grok 4.3", "modalities": { "input": [ "text", "image", - "video", - "audio" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 983616, - "output": 65536 + "context": 1000000, + "output": 30000 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "none", + "low", + "medium", + "high" + ] + } }, "attachment": true, "open_weights": false, - "release_date": "2026-03-30", - "last_updated": "2026-03-30", + "release_date": "2026-04-17", + "last_updated": "2026-04-17", "type": "chat" - }, + } + ] + }, + "unorouter": { + "id": "unorouter", + "name": "UnoRouter", + "display_name": "UnoRouter", + "api": "https://api.unorouter.com/v1", + "doc": "https://unorouter.com/models", + "models": [ { - "id": "qwen/qwen3.8-27b-uncensored", - "name": "Qwen 3.8 27B Uncensored", - "display_name": "Qwen 3.8 27B Uncensored", + "id": "glm-5.2", + "name": "GLM-5.2", + "display_name": "GLM-5.2", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 1000000, + "output": 131072 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": true, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": false, "open_weights": true, - "release_date": "2026-07-29", - "last_updated": "2026-08-21", + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "qwen/qwen3.8-27b-fimi", - "name": "Qwen 3.8 27B Fimi", - "display_name": "Qwen 3.8 27B Fimi", + "id": "deepseek-v4-flash", + "name": "DeepSeek V4 Flash", + "display_name": "DeepSeek V4 Flash", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 1000000, + "output": 384000 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": true, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "high", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." + ] + } + }, + "attachment": false, "open_weights": true, - "release_date": "2026-10-05", - "last_updated": "2026-10-05", + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "qwen/qwen3.5-omni-flash", - "name": "Qwen3.5 Omni Flash", - "display_name": "Qwen3.5 Omni Flash", + "id": "gpt-5.4", + "name": "GPT-5.4", + "display_name": "GPT-5.4", "modalities": { "input": [ "text", "image", - "video", - "audio" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 49152, - "output": 16384 + "context": 1050000, + "output": 128000 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } }, "attachment": true, "open_weights": false, - "release_date": "2026-03-30", - "last_updated": "2026-03-30", + "knowledge": "2025-08-31", + "release_date": "2026-03-05", + "last_updated": "2026-03-05", "type": "chat" }, { - "id": "qwen/qwen3-next-80b-a3b-thinking", - "name": "Qwen3 Next 80B A3B (Thinking)", - "display_name": "Qwen3 Next 80B A3B (Thinking)", + "id": "minimax-m2.7", + "name": "MiniMax-M2.7", + "display_name": "MiniMax-M2.7", "modalities": { "input": [ "text" @@ -237338,13 +231554,14 @@ ] }, "limit": { - "context": 256000, - "output": 32768 + "context": 204800, + "output": 131072 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { @@ -237359,43 +231576,43 @@ }, "attachment": false, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-09", - "last_updated": "2025-09", + "release_date": "2026-03-18", + "last_updated": "2026-03-18", "type": "chat" }, { - "id": "qwen/qwen3.8-27b-hemmingway", - "name": "Qwen 3.8 27B Hemingway", - "display_name": "Qwen 3.8 27B Hemingway", + "id": "deepseek-v4-pro:free", + "name": "DeepSeek V4 Pro", + "display_name": "DeepSeek V4 Pro", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 1000000, + "output": 384000 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-09-21", - "last_updated": "2026-09-21", + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "qwen/qwen-plus", - "name": "Qwen Plus", - "display_name": "Qwen Plus", + "id": "minimax-m2.7:free", + "name": "MiniMax-M2.7", + "display_name": "MiniMax-M2.7", "modalities": { "input": [ "text" @@ -237405,37 +231622,25 @@ ] }, "limit": { - "context": 995904, - "output": 32768 + "context": 204800, + "output": 131072 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, "attachment": false, - "open_weights": false, - "knowledge": "2024-04", - "release_date": "2024-01-25", - "last_updated": "2025-09-11", + "open_weights": true, + "release_date": "2026-03-18", + "last_updated": "2026-03-18", "type": "chat" }, { - "id": "qwen/qwen3.5-9b", - "name": "Qwen3.5 9B", - "display_name": "Qwen3.5 9B", + "id": "step-3.7-flash:free", + "name": "Step 3.7 Flash", + "display_name": "Step 3.7 Flash", "modalities": { "input": [ "text", @@ -237447,8 +231652,8 @@ ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 256000, + "output": 256000 }, "temperature": true, "tool_call": true, @@ -237456,54 +231661,17 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, - "attachment": true, - "open_weights": true, - "release_date": "2026-02-23", - "last_updated": "2026-02-23", - "type": "chat" - }, - { - "id": "qwen/qwen2.5-vl-72b-instruct", - "name": "Qwen25 VL 72b", - "display_name": "Qwen25 VL 72b", - "modalities": { - "input": [ - "text", - "image" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 32000, - "output": 32000 - }, - "tool_call": false, - "reasoning": { - "supported": false - }, "attachment": true, "open_weights": true, - "release_date": "2025-05-10", - "last_updated": "2025-05-10", + "knowledge": "2026-03-01", + "release_date": "2026-05-29", + "last_updated": "2026-05-29", "type": "chat" }, { - "id": "qwen/qwen3-coder", - "name": "Qwen 3 Coder 480B", - "display_name": "Qwen 3 Coder 480B", + "id": "glm-4.5-flash:free", + "name": "GLM-4.5-Flash", + "display_name": "GLM-4.5-Flash", "modalities": { "input": [ "text" @@ -237513,30 +231681,30 @@ ] }, "limit": { - "context": 262000, - "output": 65536 + "context": 131072, + "output": 98304 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": false, - "open_weights": true, + "open_weights": false, "knowledge": "2025-04", - "release_date": "2025-07-22", - "last_updated": "2025-07-22", + "release_date": "2025-07-28", + "last_updated": "2025-07-28", "type": "chat" }, { - "id": "qwen/qwen3.8-max-0902", - "name": "Qwen3.8 Max 0902", - "display_name": "Qwen3.8 Max 0902", + "id": "claude-opus-4-8", + "name": "Claude Opus 4.8", + "display_name": "Claude Opus 4.8", "modalities": { "input": [ "text", "image", - "video", "pdf" ], "output": [ @@ -237544,36 +231712,52 @@ ] }, "limit": { - "context": 991808, - "output": 131072 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "high", "effort_options": [ - "none", "low", "medium", "high", + "xhigh", "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-09-02", - "last_updated": "2026-09-02", + "knowledge": "2026-01", + "release_date": "2026-05-28", + "last_updated": "2026-05-28", "type": "chat" }, { - "id": "qwen/qwen3.8-27b-synthia", - "name": "Qwen 3.8 27B Synthia", - "display_name": "Qwen 3.8 27B Synthia", + "id": "deepseek-v4-flash:free", + "name": "DeepSeek V4 Flash", + "display_name": "DeepSeek V4 Flash", "modalities": { "input": [ "text" @@ -237583,143 +231767,166 @@ ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 1000000, + "output": 384000 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": false, "open_weights": true, - "release_date": "2026-10-05", - "last_updated": "2026-10-05", + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "qwen/qwen3.5-35b-a3b:thinking", - "name": "Qwen3.5 35B A3B Thinking", - "display_name": "Qwen3.5 35B A3B Thinking", + "id": "claude-haiku-4-5-20251001", + "name": "Claude Haiku 4.5", + "display_name": "Claude Haiku 4.5", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 260096, - "output": 65536 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-02-23", - "last_updated": "2026-02-23", + "open_weights": false, + "knowledge": "2025-02-28", + "release_date": "2025-10-15", + "last_updated": "2025-10-15", "type": "chat" }, { - "id": "qwen/qwen3-vl-235b-a22b-thinking", - "name": "Qwen3 VL 235B A22B Thinking", - "display_name": "Qwen3 VL 235B A22B Thinking", + "id": "kimi-k2.6", + "name": "Kimi K2.6", + "display_name": "Kimi K2.6", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 262144, + "output": 262144 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, "attachment": true, "open_weights": true, - "knowledge": "2025-03-31", - "release_date": "2025-09-23", - "last_updated": "2025-09-23", + "knowledge": "2025-01", + "release_date": "2026-04-20", + "last_updated": "2026-04-20", "type": "chat" }, { - "id": "qwen/qwen3.7-flash:thinking", - "name": "Qwen3.7 Flash Thinking", - "display_name": "Qwen3.7 Flash Thinking", + "id": "gpt-5.2", + "name": "GPT-5.2", + "display_name": "GPT-5.2", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 983616, - "output": 65536 + "context": 400000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", "effort_options": [ "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", "high" - ] + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "release_date": "2026-07-15", - "last_updated": "2026-07-15", + "knowledge": "2025-08-31", + "release_date": "2025-12-11", + "last_updated": "2025-12-11", "type": "chat" }, { - "id": "qwen/qwen3.8-27b-cybersecurity", - "name": "Qwen 3.8 27B Cybersecurity", - "display_name": "Qwen 3.8 27B Cybersecurity", + "id": "gemma-4-31b-it:free", + "name": "Gemma 4 31B IT", + "display_name": "Gemma 4 31B IT", "modalities": { "input": [ "text", @@ -237733,6 +231940,7 @@ "context": 262144, "output": 32768 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -237740,44 +231948,51 @@ }, "attachment": true, "open_weights": true, - "release_date": "2026-09-19", - "last_updated": "2026-09-19", + "knowledge": "2025-01", + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "qwen/qwen3.5-27b:thinking", - "name": "Qwen3.5 27B Thinking", - "display_name": "Qwen3.5 27B Thinking", + "id": "claude-sonnet-5", + "name": "Claude Sonnet 5", + "display_name": "Claude Sonnet 5", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 260096, - "output": 65536 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, "attachment": true, - "open_weights": true, - "release_date": "2026-02-23", - "last_updated": "2026-02-23", + "open_weights": false, + "knowledge": "2026-01-31", + "release_date": "2026-06-30", + "last_updated": "2026-06-30", "type": "chat" }, { - "id": "qwen/qwen3-235b-a22b-instruct-2507", - "name": "Qwen 3 235b A22B 2507", - "display_name": "Qwen 3 235b A22B 2507", + "id": "deepseek-v4-pro", + "name": "DeepSeek V4 Pro", + "display_name": "DeepSeek V4 Pro", "modalities": { "input": [ "text" @@ -237787,62 +232002,79 @@ ] }, "limit": { - "context": 262144, - "output": 16384 + "context": 1000000, + "output": 384000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "high", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." + ] + } }, "attachment": false, "open_weights": true, - "release_date": "2025-07-21", - "last_updated": "2025-07-21", + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "qwen/qwen3.5-122b-a10b", - "name": "Qwen3.5 122B A10B", - "display_name": "Qwen3.5 122B A10B", + "id": "gpt-5.5:free", + "name": "GPT-5.5", + "display_name": "GPT-5.5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "release_date": "2026-02-23", - "last_updated": "2026-02-23", + "attachment": true, + "open_weights": false, + "knowledge": "2025-12-01", + "release_date": "2026-04-23", + "last_updated": "2026-04-23", "type": "chat" }, { - "id": "qwen/qwen3-8b", - "name": "Qwen 3 8B", - "display_name": "Qwen 3 8B", + "id": "nemotron-3-ultra-550b-a55b:free", + "name": "Nemotron 3 Ultra 550B A55B", + "display_name": "Nemotron 3 Ultra 550B A55B", "modalities": { "input": [ "text" @@ -237852,76 +232084,72 @@ ] }, "limit": { - "context": 41000, - "output": 32768 + "context": 1000000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": true, + "default": true }, "attachment": false, "open_weights": true, - "release_date": "2025-04-29", - "last_updated": "2025-04-29", + "knowledge": "2025-09", + "release_date": "2026-06-04", + "last_updated": "2026-06-04", "type": "chat" }, { - "id": "qwen/qwen3.8-27b-uncensored:thinking", - "name": "Qwen 3.8 27B Uncensored Thinking", - "display_name": "Qwen 3.8 27B Uncensored Thinking", + "id": "gpt-5.4:free", + "name": "GPT-5.4", + "display_name": "GPT-5.4", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 1050000, + "output": 128000 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, "attachment": true, - "open_weights": true, - "release_date": "2026-07-29", - "last_updated": "2026-08-25", + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-03-05", + "last_updated": "2026-03-05", "type": "chat" }, { - "id": "qwen/qwen3.5-122b-a10b:thinking", - "name": "Qwen3.5 122B A10B Thinking", - "display_name": "Qwen3.5 122B A10B Thinking", + "id": "gpt-5.5", + "name": "GPT-5.5", + "display_name": "GPT-5.5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -237930,36 +232158,45 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-02-23", - "last_updated": "2026-02-23", + "attachment": true, + "open_weights": false, + "knowledge": "2025-12-01", + "release_date": "2026-04-23", + "last_updated": "2026-04-23", "type": "chat" }, { - "id": "qwen/qwen3.8-flash", - "name": "Qwen3.8 Flash", - "display_name": "Qwen3.8 Flash", + "id": "glm-5.2:free", + "name": "GLM-5.2", + "display_name": "GLM-5.2", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 991808, + "context": 1000000, "output": 131072 }, "temperature": true, @@ -237968,39 +232205,31 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "none", - "high" - ] - } - }, - "attachment": true, - "open_weights": false, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", + "attachment": false, + "open_weights": true, + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "qwen/qwen3.8-omni-flash", - "name": "Qwen3.8 Omni Flash", - "display_name": "Qwen3.8 Omni Flash", + "id": "gemini-3.5-flash", + "name": "Gemini 3.5 Flash", + "display_name": "Gemini 3.5 Flash", "modalities": { "input": [ "text", "image", + "video", "audio", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 991808, - "output": 131072 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -238010,126 +232239,155 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "none", + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", + "low", + "medium", "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-09-17", - "last_updated": "2026-09-17", + "knowledge": "2025-01", + "release_date": "2026-05-19", + "last_updated": "2026-05-19", "type": "chat" }, { - "id": "qwen/qwen-2.5-72b-instruct", - "name": "Qwen2.5 72B", - "display_name": "Qwen2.5 72B", + "id": "qwen3.5-397b-a17b:free", + "name": "Qwen3.5 397B-A17B", + "display_name": "Qwen3.5 397B-A17B", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 262144, + "output": 65536 }, + "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": true, "open_weights": true, - "release_date": "2025-07-03", - "last_updated": "2025-07-03", + "release_date": "2026-02-15", + "last_updated": "2026-02-15", "type": "chat" - }, + } + ] + }, + "sap-ai-core": { + "id": "sap-ai-core", + "name": "SAP AI Core", + "display_name": "SAP AI Core", + "doc": "https://help.sap.com/docs/sap-ai-core", + "models": [ { - "id": "qwen/qwen-long", - "name": "Qwen Long 10M", - "display_name": "Qwen Long 10M", + "id": "amazon--nova-micro", + "name": "amazon--nova-micro", + "display_name": "amazon--nova-micro", "modalities": { "input": [ - "text", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 10000000, + "context": 128000, "output": 8192 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2024-08-01", - "last_updated": "2024-08-01", + "knowledge": "2024-10", + "release_date": "2024-12-03", + "last_updated": "2024-12-03", "type": "chat" }, { - "id": "qwen/qwen3-30b-a3b", - "name": "Qwen3 30B A3B", - "display_name": "Qwen3 30B A3B", + "id": "gpt-4.1-nano", + "name": "gpt-4.1-nano", + "display_name": "gpt-4.1-nano", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 41000, + "context": 1047576, "output": 32768 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, - "attachment": false, - "open_weights": true, - "release_date": "2025-04-28", - "last_updated": "2025-04-28", + "attachment": true, + "open_weights": false, + "knowledge": "2024-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", "type": "chat" }, { - "id": "tencent/hy3", - "name": "Tencent Hy3", - "display_name": "Tencent Hy3", + "id": "gpt-5.6-terra", + "name": "gpt-5.6-terra", + "display_name": "gpt-5.6-terra", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, + "context": 1050000, "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -238138,117 +232396,185 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ "none", "low", + "medium", + "high", + "xhigh", + "max" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", "high" - ] + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-07-06", - "last_updated": "2026-07-06", + "attachment": true, + "open_weights": false, + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "tencent/hy4-preview", - "name": "Tencent Hy4 Preview", - "display_name": "Tencent Hy4 Preview", + "id": "gpt-5.4", + "name": "gpt-5.4", + "display_name": "gpt-5.4", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 64000 + "context": 1050000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", "effort_options": [ "none", "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", "high" - ] + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-08-28", - "last_updated": "2026-08-28", + "attachment": true, + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-03-05", + "last_updated": "2026-03-05", "type": "chat" }, { - "id": "moondream/moondream3-preview", - "name": "Moondream 3 Preview", - "display_name": "Moondream 3 Preview", + "id": "anthropic--claude-4.6-sonnet", + "name": "anthropic--claude-4.6-sonnet", + "display_name": "anthropic--claude-4.6-sonnet", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 32000, - "output": 4096 + "context": 1000000, + "output": 64000 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "high", + "max" + ] + } + }, "attachment": true, "open_weights": false, - "release_date": "2026-10-16", - "last_updated": "2026-10-16", + "knowledge": "2025-08-31", + "release_date": "2026-02-17", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "moondream/moondream3.1-9b-a2b", - "name": "Moondream 3.1 9B A2B", - "display_name": "Moondream 3.1 9B A2B", + "id": "gpt-5.6-sol", + "name": "gpt-5.6-sol", + "display_name": "gpt-5.6-sol", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 32000, - "output": 4096 + "context": 1050000, + "output": 128000 }, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, "attachment": true, "open_weights": false, - "release_date": "2026-10-16", - "last_updated": "2026-10-16", + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "inference-net/schematron-v2-small", - "name": "Schematron V2 Small", - "display_name": "Schematron V2 Small", + "id": "sap-abap-1", + "name": "sap-abap-1", + "display_name": "sap-abap-1", "modalities": { "input": [ "text" @@ -238258,160 +232584,137 @@ ] }, "limit": { - "context": 128000, + "context": 32768, "output": 4096 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, "attachment": false, "open_weights": false, - "release_date": "2026-04-16", - "last_updated": "2026-04-16", + "release_date": "2025-11-26", + "last_updated": "2025-11-26", "type": "chat" }, { - "id": "inference-net/schematron-v2-turbo", - "name": "Schematron V2 Turbo", - "display_name": "Schematron V2 Turbo", + "id": "gemini-2.5-pro", + "name": "gemini-2.5-pro", + "display_name": "gemini-2.5-pro", "modalities": { "input": [ - "text" + "text", + "image", + "audio", + "video", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 1048576, + "output": 65536 }, "temperature": true, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": false, - "release_date": "2026-04-16", - "last_updated": "2026-04-16", - "type": "chat" - }, - { - "id": "huihui-ai/Llama-3.3-70B-Instruct-abliterated", - "name": "Llama 3.3 70B Instruct abliterated", - "display_name": "Llama 3.3 70B Instruct abliterated", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 32768, - "output": 16384 - }, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": true, - "release_date": "2025-08-08", - "last_updated": "2025-08-08", - "type": "chat" - }, - { - "id": "huihui-ai/DeepSeek-R1-Distill-Qwen-32B-abliterated", - "name": "DeepSeek R1 Qwen Abliterated", - "display_name": "DeepSeek R1 Qwen Abliterated", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 16384, - "output": 8192 - }, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": false, - "open_weights": true, - "release_date": "2024-01-01", - "last_updated": "2025-01-20", - "type": "chat" - }, - { - "id": "huihui-ai/Qwen2.5-32B-Instruct-abliterated", - "name": "Qwen 2.5 32B Abliterated", - "display_name": "Qwen 2.5 32B Abliterated", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 32768, - "output": 8192 - }, - "tool_call": false, - "reasoning": { - "supported": false + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "budget", + "budget": { + "default": -1, + "min": 128, + "max": 32768, + "auto": -1, + "unit": "tokens" + }, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] + } }, - "attachment": false, - "open_weights": true, - "release_date": "2025-01-06", - "last_updated": "2025-01-06", + "attachment": true, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2025-06-17", + "last_updated": "2025-06-17", "type": "chat" }, { - "id": "huihui-ai/DeepSeek-R1-Distill-Llama-70B-abliterated", - "name": "DeepSeek R1 Llama 70B Abliterated", - "display_name": "DeepSeek R1 Llama 70B Abliterated", + "id": "gpt-5.6-luna", + "name": "gpt-5.6-luna", + "display_name": "gpt-5.6-luna", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 16384, - "output": 8192 + "context": 1050000, + "output": 128000 }, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": false, - "open_weights": true, - "release_date": "2024-01-01", - "last_updated": "2025-01-20", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "poolside/laguna-s-2.1", - "name": "Laguna S 2.1", - "display_name": "Laguna S 2.1", + "id": "gemini-3.5-flash-lite", + "name": "Gemini 3.5 Flash Lite", + "display_name": "Gemini 3.5 Flash Lite", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio", + "pdf" ], "output": [ "text" @@ -238419,7 +232722,7 @@ }, "limit": { "context": 1048576, - "output": 131072 + "output": 65536 }, "temperature": true, "tool_call": true, @@ -238429,30 +232732,38 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "effort_options": [ + "minimal", + "low", + "medium", + "high" + ] } }, - "attachment": false, - "open_weights": true, + "attachment": true, + "open_weights": false, + "knowledge": "2026-03", "release_date": "2026-07-21", "last_updated": "2026-07-21", "type": "chat" }, { - "id": "poolside/laguna-s-2.1:thinking", - "name": "Laguna S 2.1 Thinking", - "display_name": "Laguna S 2.1 Thinking", + "id": "mistralai--mistral-medium", + "name": "Mistral Medium 3.5", + "display_name": "Mistral Medium 3.5", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, @@ -238460,16 +232771,24 @@ "supported": true, "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "high" + ] + } + }, + "attachment": true, "open_weights": true, - "release_date": "2026-07-21", - "last_updated": "2026-07-21", + "release_date": "2026-04-29", + "last_updated": "2026-04-29", "type": "chat" }, { - "id": "z-ai/glm-5.1", - "name": "GLM 5.1", - "display_name": "GLM 5.1", + "id": "sonar", + "name": "sonar", + "display_name": "sonar", "modalities": { "input": [ "text" @@ -238479,47 +232798,40 @@ ] }, "limit": { - "context": 200000, - "output": 131072 + "context": 128000, + "output": 4096 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "none", - "high" - ] - } + "supported": false }, "attachment": false, - "open_weights": true, - "release_date": "2026-04-07", - "last_updated": "2026-04-07", + "open_weights": false, + "knowledge": "2025-09-01", + "release_date": "2024-01-01", + "last_updated": "2025-09-01", "type": "chat" }, { - "id": "z-ai/glm-4.6:thinking", - "name": "GLM 4.6 Thinking", - "display_name": "GLM 4.6 Thinking", + "id": "anthropic--claude-4.8-opus", + "name": "anthropic--claude-4.8-opus", + "display_name": "anthropic--claude-4.8-opus", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 65535 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -238528,87 +232840,86 @@ "extra_capabilities": { "reasoning": { "effort_options": [ - "none", - "high" + "low", + "medium", + "high", + "xhigh", + "max" ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-09-30", - "last_updated": "2025-09-30", + "attachment": true, + "open_weights": false, + "knowledge": "2026-01", + "release_date": "2026-05-28", + "last_updated": "2026-05-28", "type": "chat" }, { - "id": "z-ai/glm-5v-turbo", - "name": "GLM 5V Turbo", - "display_name": "GLM 5V Turbo", + "id": "anthropic--claude-4-sonnet", + "name": "anthropic--claude-4-sonnet", + "display_name": "anthropic--claude-4-sonnet", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 202800, - "output": 131072 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": true, "open_weights": false, - "release_date": "2026-04-01", - "last_updated": "2026-04-01", + "knowledge": "2025-03-31", + "release_date": "2025-05-22", + "last_updated": "2025-05-22", "type": "chat" }, { - "id": "z-ai/glm-5.3-flash-uncensored", - "name": "GLM 5.3 Flash Uncensored", - "display_name": "GLM 5.3 Flash Uncensored", + "id": "gpt-4.1", + "name": "gpt-4.1", + "display_name": "gpt-4.1", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, + "context": 1047576, "output": 32768 }, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "high" - ] - } + "supported": false }, "attachment": true, - "open_weights": true, - "release_date": "2026-07-29", - "last_updated": "2026-08-27", + "open_weights": false, + "knowledge": "2024-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", "type": "chat" }, { - "id": "z-ai/glm-5-original:thinking", - "name": "GLM 5 Original Thinking", - "display_name": "GLM 5 Original Thinking", + "id": "gemini-embedding", + "name": "Gemini Embedding 001", + "display_name": "Gemini Embedding 001", "modalities": { "input": [ "text" @@ -238618,25 +232929,25 @@ ] }, "limit": { - "context": 200000, - "output": 128000 + "context": 2048, + "output": 1 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, - "open_weights": true, - "release_date": "2026-02-12", - "last_updated": "2026-02-12", - "type": "chat" + "open_weights": false, + "knowledge": "2025-05", + "release_date": "2025-05-20", + "last_updated": "2025-05-20", + "type": "embedding" }, { - "id": "z-ai/glm-5", - "name": "GLM 5", - "display_name": "GLM 5", + "id": "sonar-deep-research", + "name": "sonar-deep-research", + "display_name": "sonar-deep-research", "modalities": { "input": [ "text" @@ -238646,47 +232957,51 @@ ] }, "limit": { - "context": 200000, - "output": 128000 + "context": 128000, + "output": 32768 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "minimal", + "low", + "medium", + "high" ] } }, "attachment": false, - "open_weights": true, - "release_date": "2026-02-12", - "last_updated": "2026-02-12", + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2025-02-01", + "last_updated": "2025-09-01", "type": "chat" }, { - "id": "z-ai/glm-4.6", - "name": "GLM 4.6", - "display_name": "GLM 4.6", + "id": "gemini-3.1-flash-lite", + "name": "gemini-3.1-flash-lite", + "display_name": "gemini-3.1-flash-lite", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 65535 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -238698,55 +233013,56 @@ "reasoning": { "supported": true, "effort_options": [ - "none", + "minimal", + "low", + "medium", "high" ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-09-30", - "last_updated": "2025-09-30", + "attachment": true, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2026-05-07", + "last_updated": "2026-05-07", "type": "chat" }, { - "id": "z-ai/glm-4.5v:thinking", - "name": "GLM 4.5V Thinking", - "display_name": "GLM 4.5V Thinking", + "id": "text-embedding-3-small", + "name": "text-embedding-3-small", + "display_name": "text-embedding-3-small", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 65536, - "output": 16384 + "context": 8191, + "output": 1536 }, - "temperature": true, + "temperature": false, "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": true, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-08-11", - "last_updated": "2025-08-11", - "type": "chat" + "attachment": false, + "open_weights": false, + "release_date": "2024-01-25", + "last_updated": "2024-01-25", + "type": "embedding" }, { - "id": "z-ai/glm-4.7-original:thinking", - "name": "GLM 4.7 Original Thinking", - "display_name": "GLM 4.7 Original Thinking", + "id": "anthropic--claude-4.5-sonnet", + "name": "anthropic--claude-4.5-sonnet", + "display_name": "anthropic--claude-4.5-sonnet", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" @@ -238754,7 +233070,7 @@ }, "limit": { "context": 200000, - "output": 65535 + "output": 64000 }, "temperature": true, "tool_call": true, @@ -238762,59 +233078,93 @@ "supported": true, "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-12-22", - "last_updated": "2025-12-22", + "attachment": true, + "open_weights": false, + "knowledge": "2025-07-31", + "release_date": "2025-09-29", + "last_updated": "2025-09-29", "type": "chat" }, { - "id": "z-ai/glm-4.6-original", - "name": "GLM 4.6 Original", - "display_name": "GLM 4.6 Original", + "id": "gemini-embedding-2", + "name": "Gemini Embedding 2", + "display_name": "Gemini Embedding 2", "modalities": { "input": [ + "text", + "image", + "audio", + "video", + "pdf" + ], + "output": [ "text" + ] + }, + "limit": { + "context": 8192, + "output": 3072 + }, + "temperature": false, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-11", + "release_date": "2026-04-22", + "last_updated": "2026-04-22", + "type": "embedding" + }, + { + "id": "mistralai--mistral-medium-instruct", + "name": "mistralai--mistral-medium-instruct", + "display_name": "mistralai--mistral-medium-instruct", + "modalities": { + "input": [ + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 65535 + "context": 128000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-09-30", - "last_updated": "2025-09-30", + "attachment": true, + "open_weights": false, + "knowledge": "2025-05", + "release_date": "2025-05-07", + "last_updated": "2025-05-07", "type": "chat" }, { - "id": "z-ai/glm-5.3-flash-cybersecurity", - "name": "GLM 5.3 Flash Cybersecurity", - "display_name": "GLM 5.3 Flash Cybersecurity", + "id": "gpt-6-luna", + "name": "GPT-6 Luna", + "display_name": "GPT-6 Luna", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 32768 + "context": 1050000, + "output": 128000 }, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -238823,51 +233173,53 @@ "extra_capabilities": { "reasoning": { "effort_options": [ + "none", "low", + "medium", "high", + "xhigh", "max" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-09-19", - "last_updated": "2026-09-19", + "open_weights": false, + "knowledge": "2026-05-18", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "z-ai/glm-4.6v-original", - "name": "GLM 4.6V Original", - "display_name": "GLM 4.6V Original", + "id": "nvidia--llama-nemotron-embed-1b", + "name": "Llama Nemotron Embed 1B v2", + "display_name": "Llama Nemotron Embed 1B v2", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 24000 + "context": 8192, + "output": 2048 }, - "temperature": true, + "temperature": false, "tool_call": false, "reasoning": { "supported": false }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-12-08", - "last_updated": "2025-12-08", - "type": "chat" + "release_date": "2025-10-16", + "last_updated": "2025-10-16", + "type": "embedding" }, { - "id": "z-ai/glm-5v-turbo:thinking", - "name": "GLM 5V Turbo Thinking", - "display_name": "GLM 5V Turbo Thinking", + "id": "amazon--nova-pro", + "name": "amazon--nova-pro", + "display_name": "amazon--nova-pro", "modalities": { "input": [ "text", @@ -238879,28 +233231,81 @@ ] }, "limit": { - "context": 202800, - "output": 131072 + "context": 300000, + "output": 8192 }, "temperature": true, "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": false, + "knowledge": "2024-10", + "release_date": "2024-12-03", + "last_updated": "2024-12-03", + "type": "chat" + }, + { + "id": "gpt-5-mini", + "name": "gpt-5-mini", + "display_name": "gpt-5-mini", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 400000, + "output": 128000 + }, + "temperature": false, + "tool_call": true, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "minimal", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, "attachment": true, "open_weights": false, - "release_date": "2026-04-01", - "last_updated": "2026-04-01", + "knowledge": "2024-05-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "z-ai/glm-5-original", - "name": "GLM 5 Original", - "display_name": "GLM 5 Original", + "id": "anthropic--claude-4.5-opus", + "name": "anthropic--claude-4.5-opus", + "display_name": "anthropic--claude-4.5-opus", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" @@ -238908,7 +233313,7 @@ }, "limit": { "context": 200000, - "output": 128000 + "output": 64000 }, "temperature": true, "tool_call": true, @@ -238916,19 +233321,31 @@ "supported": true, "default": true }, - "attachment": false, - "open_weights": true, - "release_date": "2026-02-12", - "last_updated": "2026-02-12", + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "high" + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-05", + "release_date": "2025-11-24", + "last_updated": "2025-11-24", "type": "chat" }, { - "id": "z-ai/glm-4.7-flash:thinking", - "name": "GLM 4.7 Flash Thinking", - "display_name": "GLM 4.7 Flash Thinking", + "id": "anthropic--claude-4-opus", + "name": "anthropic--claude-4-opus", + "display_name": "anthropic--claude-4-opus", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" @@ -238936,7 +233353,7 @@ }, "limit": { "context": 200000, - "output": 128000 + "output": 32000 }, "temperature": true, "tool_call": true, @@ -238944,21 +233361,24 @@ "supported": true, "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2026-01-19", - "last_updated": "2026-01-19", + "attachment": true, + "open_weights": false, + "knowledge": "2025-03-31", + "release_date": "2025-05-22", + "last_updated": "2025-05-22", "type": "chat" }, { - "id": "z-ai/glm-5.3-flash-apex", - "name": "Apex Flash 1", - "display_name": "Apex Flash 1", + "id": "gemini-2.5-flash", + "name": "gemini-2.5-flash", + "display_name": "gemini-2.5-flash", "modalities": { "input": [ "text", - "image" + "image", + "audio", + "video", + "pdf" ], "output": [ "text" @@ -238966,8 +233386,9 @@ }, "limit": { "context": 1048576, - "output": 32768 + "output": 65536 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -238975,63 +233396,101 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "low", - "high", - "max" + "supported": true, + "default_enabled": true, + "mode": "budget", + "budget": { + "default": -1, + "min": 0, + "max": 24576, + "auto": -1, + "off": 0, + "unit": "tokens" + }, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-10-05", - "last_updated": "2026-10-05", + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2025-06-17", + "last_updated": "2025-06-17", "type": "chat" }, { - "id": "z-ai/glm-5:thinking", - "name": "GLM 5 Thinking", - "display_name": "GLM 5 Thinking", + "id": "gpt-5", + "name": "gpt-5", + "display_name": "gpt-5", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 200000, + "context": 400000, "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": false, - "open_weights": true, - "release_date": "2026-02-12", - "last_updated": "2026-02-12", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "minimal", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2024-09-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "z-ai/glm-5.3-uncensored", - "name": "GLM 5.3 Uncensored", - "display_name": "GLM 5.3 Uncensored", + "id": "gpt-6.1-sol", + "name": "GPT-6.1 Sol", + "display_name": "GPT-6.1 Sol", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 1050000, + "output": 128000 }, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -239041,24 +233500,29 @@ "reasoning": { "effort_options": [ "low", + "medium", "high", + "xhigh", "max" ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-09-26", - "last_updated": "2026-09-26", + "attachment": true, + "open_weights": false, + "knowledge": "2026-04-30", + "release_date": "2026-09-29", + "last_updated": "2026-09-29", "type": "chat" }, { - "id": "z-ai/glm-4.7-original", - "name": "GLM 4.7 Original", - "display_name": "GLM 4.7 Original", + "id": "anthropic--claude-3-haiku", + "name": "anthropic--claude-3-haiku", + "display_name": "anthropic--claude-3-haiku", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" @@ -239066,38 +233530,39 @@ }, "limit": { "context": 200000, - "output": 65535 + "output": 4096 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-12-22", - "last_updated": "2025-12-22", + "attachment": true, + "open_weights": false, + "knowledge": "2023-08-31", + "release_date": "2024-03-13", + "last_updated": "2024-03-13", "type": "chat" }, { - "id": "z-ai/glm-5.3-flash-apex-abliterated", - "name": "Apex Flash 1 Abliterated", - "display_name": "Apex Flash 1 Abliterated", + "id": "anthropic--claude-4.7-opus", + "name": "anthropic--claude-4.7-opus", + "display_name": "anthropic--claude-4.7-opus", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 32768 + "context": 1000000, + "output": 128000 }, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -239107,96 +233572,117 @@ "reasoning": { "effort_options": [ "low", + "medium", "high", + "xhigh", "max" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-10-05", - "last_updated": "2026-10-05", + "open_weights": false, + "knowledge": "2026-01-31", + "release_date": "2026-04-16", + "last_updated": "2026-04-16", "type": "chat" }, { - "id": "z-ai/glm-5.3", - "name": "GLM 5.3", - "display_name": "GLM 5.3", + "id": "gpt-5.2", + "name": "gpt-5.2", + "display_name": "gpt-5.2", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 400000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", "effort_options": [ + "none", "low", + "medium", "high", - "max" - ] + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "attachment": true, + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2025-12-11", + "last_updated": "2025-12-11", "type": "chat" }, { - "id": "z-ai/GLM-4.6-turbo", - "name": "GLM 4.6 Turbo", - "display_name": "GLM 4.6 Turbo", + "id": "sonar-pro", + "name": "sonar-pro", + "display_name": "sonar-pro", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 200000, + "output": 8192 }, + "temperature": true, "tool_call": false, "reasoning": { "supported": false }, - "attachment": false, - "open_weights": true, - "release_date": "2025-10-02", - "last_updated": "2025-10-02", + "attachment": true, + "open_weights": false, + "knowledge": "2025-09-01", + "release_date": "2024-01-01", + "last_updated": "2025-09-01", "type": "chat" }, { - "id": "z-ai/glm-4.7:thinking", - "name": "GLM 4.7 Thinking", - "display_name": "GLM 4.7 Thinking", + "id": "mistralai--mistral-small", + "name": "mistralai--mistral-small", + "display_name": "mistralai--mistral-small", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 65535 + "context": 128000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -239204,28 +233690,38 @@ "supported": true, "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "high" + ] + } + }, + "attachment": true, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-12-22", - "last_updated": "2025-12-22", + "knowledge": "2025-06", + "release_date": "2026-03-16", + "last_updated": "2026-03-16", "type": "chat" }, { - "id": "z-ai/GLM-4.5-Air:thinking", - "name": "GLM 4.5 Air (Thinking)", - "display_name": "GLM 4.5 Air (Thinking)", + "id": "anthropic--claude-4.6-opus", + "name": "anthropic--claude-4.6-opus", + "display_name": "anthropic--claude-4.6-opus", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 98304 + "context": 1000000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -239233,110 +233729,110 @@ "supported": true, "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-07-28", - "last_updated": "2025-07-28", + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "high", + "max" + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-05-31", + "release_date": "2026-02-05", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "z-ai/glm-latest", - "name": "GLM Latest", - "display_name": "GLM Latest", + "id": "anthropic--claude-4.5-haiku", + "name": "anthropic--claude-4.5-haiku", + "display_name": "anthropic--claude-4.5-haiku", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 200000, + "output": 64000 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": false, - "open_weights": true, - "release_date": "2026-05-03", - "last_updated": "2026-05-03", + "attachment": true, + "open_weights": false, + "knowledge": "2025-02-28", + "release_date": "2025-10-15", + "last_updated": "2025-10-15", "type": "chat" }, { - "id": "z-ai/glm-5.1:thinking", - "name": "GLM 5.1 Thinking", - "display_name": "GLM 5.1 Thinking", + "id": "gemini-2.5-flash-lite", + "name": "gemini-2.5-flash-lite", + "display_name": "gemini-2.5-flash-lite", "modalities": { "input": [ - "text" + "text", + "image", + "audio", + "video", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 131072 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "none", - "high" + "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "default": -1, + "min": 512, + "max": 24576, + "auto": -1, + "unit": "tokens" + }, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-04-07", - "last_updated": "2026-04-07", - "type": "chat" - }, - { - "id": "z-ai/glm-4.6v", - "name": "GLM 4.6V", - "display_name": "GLM 4.6V", - "modalities": { - "input": [ - "text", - "image", - "video" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 128000, - "output": 24000 - }, - "temperature": true, - "tool_call": false, - "reasoning": { - "supported": false - }, "attachment": true, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-12-08", - "last_updated": "2025-12-08", + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2025-06-17", + "last_updated": "2025-06-17", "type": "chat" }, { - "id": "z-ai/glm-5.3:thinking", - "name": "GLM 5.3 Thinking", - "display_name": "GLM 5.3 Thinking", + "id": "cohere--command-a-reasoning", + "name": "cohere--command-a-reasoning", + "display_name": "cohere--command-a-reasoning", "modalities": { "input": [ "text" @@ -239346,8 +233842,8 @@ ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 256000, + "output": 32000 }, "temperature": true, "tool_call": true, @@ -239358,61 +233854,80 @@ "extra_capabilities": { "reasoning": { "effort_options": [ - "high", - "max" + "none", + "minimal", + "low", + "medium", + "high" ] } }, "attachment": false, "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "knowledge": "2024-06-01", + "release_date": "2025-08-21", + "last_updated": "2025-08-21", "type": "chat" }, { - "id": "z-ai/GLM-4.6-turbo:thinking", - "name": "GLM 4.6 Turbo (Thinking)", - "display_name": "GLM 4.6 Turbo (Thinking)", + "id": "amazon--nova-lite", + "name": "amazon--nova-lite", + "display_name": "amazon--nova-lite", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 1000000, + "output": 64000 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": false, - "open_weights": true, - "release_date": "2025-10-02", - "last_updated": "2025-10-02", + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "high" + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-10", + "release_date": "2025-12-02", + "last_updated": "2025-12-01", "type": "chat" }, { - "id": "z-ai/glm-5.2:thinking", - "name": "GLM 5.2 Thinking", - "display_name": "GLM 5.2 Thinking", + "id": "gpt-5.5", + "name": "gpt-5.5", + "display_name": "gpt-5.5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -239420,25 +233935,43 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ + "low", + "medium", "high", - "max" - ] + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "attachment": true, + "open_weights": false, + "knowledge": "2025-12-01", + "release_date": "2026-04-23", + "last_updated": "2026-04-23", "type": "chat" }, { - "id": "z-ai/glm-5.2", - "name": "GLM 5.2", - "display_name": "GLM 5.2", + "id": "gemini-3.5-flash", + "name": "gemini-3.5-flash", + "display_name": "gemini-3.5-flash", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio", + "pdf" ], "output": [ "text" @@ -239446,7 +233979,7 @@ }, "limit": { "context": 1048576, - "output": 131072 + "output": 65536 }, "temperature": true, "tool_call": true, @@ -239457,23 +233990,33 @@ "extra_capabilities": { "reasoning": { "supported": true, - "effort_options": [ - "none", - "high", - "max" + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", + "low", + "medium", + "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "attachment": true, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2026-05-19", + "last_updated": "2026-05-19", "type": "chat" }, { - "id": "z-ai/GLM-4.5:thinking", - "name": "GLM 4.5 (Thinking)", - "display_name": "GLM 4.5 (Thinking)", + "id": "text-embedding-3-large", + "name": "text-embedding-3-large", + "display_name": "text-embedding-3-large", "modalities": { "input": [ "text" @@ -239483,61 +234026,88 @@ ] }, "limit": { - "context": 128000, - "output": 65536 + "context": 8191, + "output": 3072 }, - "temperature": true, + "temperature": false, "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-07-28", - "last_updated": "2025-07-28", - "type": "chat" + "open_weights": false, + "release_date": "2024-01-25", + "last_updated": "2024-01-25", + "type": "embedding" }, { - "id": "z-ai/glm-4.5v", - "name": "GLM 4.5V", - "display_name": "GLM 4.5V", + "id": "gpt-4.1-mini", + "name": "gpt-4.1-mini", + "display_name": "gpt-4.1-mini", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 65536, - "output": 16384 + "context": 1047576, + "output": 32768 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": true, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-08-11", - "last_updated": "2025-08-11", + "open_weights": false, + "knowledge": "2024-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", "type": "chat" }, { - "id": "z-ai/glm-5.3-flash", - "name": "GLM 5.3 Flash", - "display_name": "GLM 5.3 Flash", + "id": "amazon--titan-embed-text", + "name": "amazon--titan-embed-text", + "display_name": "amazon--titan-embed-text", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 8192, + "output": 1536 + }, + "temperature": false, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": false, + "release_date": "2024-04-30", + "last_updated": "2024-04-30", + "type": "chat" + }, + { + "id": "gemini-3.8-flash", + "name": "Gemini 3.8 Flash", + "display_name": "Gemini 3.8 Flash", "modalities": { "input": [ "text", "image", - "video" + "video", + "audio", + "pdf" ], "output": [ "text" @@ -239545,7 +234115,7 @@ }, "limit": { "context": 1048576, - "output": 131072 + "output": 65536 }, "temperature": true, "tool_call": true, @@ -239556,68 +234126,89 @@ "extra_capabilities": { "reasoning": { "supported": true, - "effort_options": [ + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", "low", - "high", - "max" + "medium", + "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", + "open_weights": false, + "release_date": "2026-09-02", + "last_updated": "2026-09-02", "type": "chat" }, { - "id": "z-ai/glm-5-turbo", - "name": "GLM 5 Turbo", - "display_name": "GLM 5 Turbo", + "id": "gpt-6-astra", + "name": "GPT-6 Astra", + "display_name": "GPT-6 Astra", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 202800, - "output": 131072 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] } }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-03-16", - "last_updated": "2026-03-16", + "knowledge": "2026-04-30", + "release_date": "2026-09-04", + "last_updated": "2026-09-04", "type": "chat" }, { - "id": "z-ai/glm-4.7", - "name": "GLM 4.7", - "display_name": "GLM 4.7", + "id": "gpt-5-nano", + "name": "gpt-5-nano", + "display_name": "gpt-5-nano", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 65535 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -239626,53 +234217,87 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "minimal", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-12-22", - "last_updated": "2025-12-22", + "attachment": true, + "open_weights": false, + "knowledge": "2024-05-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "z-ai/GLM-4.5-Air", - "name": "GLM 4.5 Air", - "display_name": "GLM 4.5 Air", + "id": "gemini-3.6-flash", + "name": "Gemini 3.6 Flash", + "display_name": "Gemini 3.6 Flash", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 98304 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-07-28", - "last_updated": "2025-07-28", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", + "low", + "medium", + "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2026-03", + "release_date": "2026-07-21", + "last_updated": "2026-07-21", "type": "chat" }, { - "id": "z-ai/glm-4.5", - "name": "GLM 4.5", - "display_name": "GLM 4.5", + "id": "nvidia--llama-3.2-nv-embedqa-1b", + "name": "nvidia--llama-3.2-nv-embedqa-1b", + "display_name": "nvidia--llama-3.2-nv-embedqa-1b", "modalities": { "input": [ "text" @@ -239682,38 +234307,47 @@ ] }, "limit": { - "context": 128000, - "output": 65536 + "context": 8192, + "output": 4096 }, - "temperature": true, + "temperature": false, "tool_call": false, "reasoning": { "supported": false }, "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-07-28", - "last_updated": "2025-07-28", + "open_weights": false, + "release_date": "2024-09-25", + "last_updated": "2024-09-25", "type": "chat" - }, + } + ] + }, + "ainetcafe": { + "id": "ainetcafe", + "name": "ainetcafe", + "display_name": "ainetcafe", + "api": "https://microquickjs.com/v1", + "doc": "https://ainetcafe.com/k3/guides/", + "models": [ { - "id": "z-ai/glm-4.7-flash", - "name": "GLM 4.7 Flash", - "display_name": "GLM 4.7 Flash", + "id": "Kimi-K3", + "name": "Kimi K3", + "display_name": "Kimi K3", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 128000 + "context": 262144, + "output": 32768 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -239721,20 +234355,39 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "low", + "high", + "max" + ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2026-01-19", - "last_updated": "2026-01-19", + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" - }, + } + ] + }, + "jalapeno": { + "id": "jalapeno", + "name": "Jalapeno Cloud", + "display_name": "Jalapeno Cloud", + "api": "https://api.jalapeno-cloud.ai/v1", + "doc": "https://www.jalapeno-cloud.ai/docs/", + "models": [ { - "id": "MarinaraSpaghetti/NemoMix-Unleashed-12B", - "name": "NemoMix 12B Unleashed", - "display_name": "NemoMix 12B Unleashed", + "id": "Qwen3-Next-80B-A3B-Thinking", + "name": "Qwen3-Next 80B-A3B (Thinking)", + "display_name": "Qwen3-Next 80B-A3B (Thinking)", "modalities": { "input": [ "text" @@ -239744,78 +234397,83 @@ ] }, "limit": { - "context": 32768, - "output": 8192 + "context": 262144, + "output": 32768 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": true, - "release_date": "2024-01-01", - "last_updated": "2024-07-01", - "type": "chat" - }, - { - "id": "mlabonne/NeuralDaredevil-8B-abliterated", - "name": "Neural Daredevil 8B abliterated", - "display_name": "Neural Daredevil 8B abliterated", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 8192, - "output": 8192 + "supported": true, + "default": true }, - "tool_call": false, - "reasoning": { - "supported": false + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, "open_weights": true, - "release_date": "2024-01-01", - "last_updated": "2024-12-01", + "knowledge": "2025-04", + "release_date": "2025-09", + "last_updated": "2025-09", "type": "chat" }, { - "id": "LLM360/K2-Think", - "name": "K2-Think", - "display_name": "K2-Think", + "id": "Qwen3-VL-235B-A22B-Thinking", + "name": "Qwen3 VL 235B A22B Thinking", + "display_name": "Qwen3 VL 235B A22B Thinking", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 128000, + "context": 131072, "output": 32768 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": true, "open_weights": true, - "release_date": "2025-07-26", - "last_updated": "2025-07-26", + "knowledge": "2025-03-31", + "release_date": "2025-09-23", + "last_updated": "2025-09-23", "type": "chat" }, { - "id": "arcee-ai/trinity-large-thinking", - "name": "Trinity Large Thinking", - "display_name": "Trinity Large Thinking", + "id": "Qwen3.5-122B-A10B", + "name": "Qwen3.5 122B-A10B", + "display_name": "Qwen3.5 122B-A10B", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" @@ -239823,7 +234481,7 @@ }, "limit": { "context": 262144, - "output": 80000 + "output": 65536 }, "temperature": true, "tool_call": true, @@ -239831,28 +234489,38 @@ "supported": true, "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": true, "open_weights": true, - "release_date": "2026-04-01", - "last_updated": "2026-05-28", + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" }, { - "id": "deepseek/deepseek-v3.2:thinking", - "name": "DeepSeek V3.2 Thinking", - "display_name": "DeepSeek V3.2 Thinking", + "id": "GLM-5.2", + "name": "GLM-5.2", + "display_name": "GLM-5.2", "modalities": { "input": [ - "text", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 163000, - "output": 65536 + "context": 1048576, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -239860,17 +234528,27 @@ "supported": true, "default": true }, - "attachment": true, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, "open_weights": true, - "knowledge": "2024-07", - "release_date": "2025-12-01", - "last_updated": "2025-12-01", + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "deepseek/deepseek-v4-flash", - "name": "DeepSeek V4 Flash", - "display_name": "DeepSeek V4 Flash", + "id": "GLM-5.1", + "name": "GLM-5.1", + "display_name": "GLM-5.1", "modalities": { "input": [ "text" @@ -239880,8 +234558,8 @@ ] }, "limit": { - "context": 1048576, - "output": 384000 + "context": 202752, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -239892,48 +234570,39 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "high", - "max" - ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, "attachment": false, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "release_date": "2026-04-07", + "last_updated": "2026-04-07", "type": "chat" }, { - "id": "deepseek/deepseek-v4.1-flash-uncensored:thinking", - "name": "DeepSeek V4.1 Flash Uncensored Thinking", - "display_name": "DeepSeek V4.1 Flash Uncensored Thinking", + "id": "Qwen3.5-397B-A17B", + "name": "Qwen3.5 397B-A17B", + "display_name": "Qwen3.5 397B-A17B", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1048576, + "context": 262144, "output": 65536 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -239941,38 +234610,40 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "high" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-10-01", - "last_updated": "2026-10-01", + "release_date": "2026-02-15", + "last_updated": "2026-02-15", "type": "chat" }, { - "id": "deepseek/deepseek-v4.1-flash:thinking", - "name": "DeepSeek V4.1 Flash Thinking", - "display_name": "DeepSeek V4.1 Flash Thinking", + "id": "Kimi-K2.7-Code", + "name": "Kimi K2.7 Code", + "display_name": "Kimi K2.7 Code", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 271360, + "output": 262144 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -239980,28 +234651,31 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "none", - "low", - "high", - "max" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, "attachment": true, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-09-10", - "last_updated": "2026-09-10", + "knowledge": "2025-01", + "release_date": "2026-06-12", + "last_updated": "2026-06-12", "type": "chat" }, { - "id": "deepseek/deepseek-v4-pro:thinking", - "name": "DeepSeek V4 Pro (Thinking)", - "display_name": "DeepSeek V4 Pro (Thinking)", + "id": "Kimi-K3", + "name": "Kimi K3", + "display_name": "Kimi K3", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" @@ -240009,9 +234683,9 @@ }, "limit": { "context": 1048576, - "output": 384000 + "output": 131072 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -240019,37 +234693,40 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "none", - "high", - "max" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" }, { - "id": "deepseek/deepseek-v4-flash-0423", - "name": "DeepSeek V4 Flash 0423", - "display_name": "DeepSeek V4 Flash 0423", + "id": "Kimi-K2.5", + "name": "Kimi K2.5", + "display_name": "Kimi K2.5", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 384000 + "context": 262144, + "output": 180224 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -240057,25 +234734,26 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "none", - "low", - "high", - "max" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-23", - "last_updated": "2026-04-23", + "knowledge": "2025-01", + "release_date": "2026-01-27", + "last_updated": "2026-01-27", "type": "chat" }, { - "id": "deepseek/deepseek-v4-flash:thinking", - "name": "DeepSeek V4 Flash (Thinking)", - "display_name": "DeepSeek V4 Flash (Thinking)", + "id": "DeepSeek-V4-Pro", + "name": "DeepSeek V4 Pro", + "display_name": "DeepSeek V4 Pro", "modalities": { "input": [ "text" @@ -240096,10 +234774,23 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", "effort_options": [ - "none", + "low", "high", "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, @@ -240111,9 +234802,9 @@ "type": "chat" }, { - "id": "deepseek/deepseek-v4-pro", - "name": "DeepSeek V4 Pro", - "display_name": "DeepSeek V4 Pro", + "id": "DeepSeek-V4-Flash", + "name": "DeepSeek V4 Flash", + "display_name": "DeepSeek V4 Flash", "modalities": { "input": [ "text" @@ -240162,9 +234853,9 @@ "type": "chat" }, { - "id": "deepseek/deepseek-v4-pro-0813", - "name": "DeepSeek V4 Pro 0813", - "display_name": "DeepSeek V4 Pro 0813", + "id": "Qwen3-Next-80B-A3B-Instruct", + "name": "Qwen3-Next 80B-A3B Instruct", + "display_name": "Qwen3-Next 80B-A3B Instruct", "modalities": { "input": [ "text" @@ -240174,47 +234865,38 @@ ] }, "limit": { - "context": 1048576, - "output": 384000 + "context": 129024, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "none", - "low", - "high", - "max" - ] - } + "supported": false }, "attachment": false, "open_weights": true, - "release_date": "2026-08-13", - "last_updated": "2026-08-22", + "knowledge": "2025-04", + "release_date": "2025-09", + "last_updated": "2025-09", "type": "chat" }, { - "id": "deepseek/deepseek-v4-flash-0423:thinking", - "name": "DeepSeek V4 Flash 0423 (Thinking)", - "display_name": "DeepSeek V4 Flash 0423 (Thinking)", + "id": "MiniMax-M3", + "name": "MiniMax-M3", + "display_name": "MiniMax-M3", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 384000 + "context": 524288, + "output": 512000 }, "temperature": true, "tool_call": true, @@ -240224,25 +234906,25 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "none", - "low", - "high", - "max" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-23", - "last_updated": "2026-04-23", + "release_date": "2026-06-01", + "last_updated": "2026-06-01", "type": "chat" }, { - "id": "deepseek/deepseek-v4-flash-vision-exp", - "name": "DeepSeek V4 Flash Vision Exp", - "display_name": "DeepSeek V4 Flash Vision Exp", + "id": "Qwen3-VL-235B-A22B-Instruct", + "name": "Qwen3 VL 235B A22B Instruct", + "display_name": "Qwen3 VL 235B A22B Instruct", "modalities": { "input": [ "text", @@ -240253,8 +234935,38 @@ ] }, "limit": { - "context": 1048576, - "output": 384000 + "context": 129024, + "output": 32768 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": true, + "knowledge": "2025-03-31", + "release_date": "2025-09-23", + "last_updated": "2025-09-23", + "type": "chat" + }, + { + "id": "Qwen3.5-27B", + "name": "Qwen3.5 27B", + "display_name": "Qwen3.5 27B", + "modalities": { + "input": [ + "text", + "image", + "video" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 262144, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -240265,47 +234977,39 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "high", - "max" - ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, "attachment": true, "open_weights": true, - "release_date": "2026-08-21", - "last_updated": "2026-09-01", + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" }, { - "id": "deepseek/deepseek-latest", - "name": "DeepSeek Latest", - "display_name": "DeepSeek Latest", + "id": "Qwen3.5-35B-A3B", + "name": "Qwen3.5 35B-A3B", + "display_name": "Qwen3.5 35B-A3B", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 384000 + "context": 262144, + "output": 65536 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -240313,24 +235017,25 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "none", - "low", - "high", - "max" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-05-03", - "last_updated": "2026-05-03", + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" }, { - "id": "deepseek/deepseek-v4-pro-0813:thinking", - "name": "DeepSeek V4 Pro 0813 Thinking", - "display_name": "DeepSeek V4 Pro 0813 Thinking", + "id": "Hy3", + "name": "Hy3", + "display_name": "Hy3", "modalities": { "input": [ "text" @@ -240340,8 +235045,8 @@ ] }, "limit": { - "context": 1048576, - "output": 384000 + "context": 202752, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -240351,37 +235056,47 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "none", - "low", - "high", - "max" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, "attachment": false, "open_weights": true, - "release_date": "2026-08-13", - "last_updated": "2026-08-22", + "release_date": "2026-07-06", + "last_updated": "2026-07-06", "type": "chat" - }, + } + ] + }, + "databricks": { + "id": "databricks", + "name": "Databricks", + "display_name": "Databricks", + "api": "https://${DATABRICKS_HOST}/ai-gateway/mlflow/v1", + "doc": "https://docs.databricks.com/aws/en/machine-learning/foundation-models/", + "models": [ { - "id": "deepseek/deepseek-v4-flash-latest", - "name": "DeepSeek V4 Flash Latest", - "display_name": "DeepSeek V4 Flash Latest", + "id": "databricks-gpt-oss-20b", + "name": "GPT OSS 20B", + "display_name": "GPT OSS 20B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 393216 + "context": 131072, + "output": 25000 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -240390,35 +235105,37 @@ "extra_capabilities": { "reasoning": { "effort_options": [ - "none", "low", - "high", - "max" + "medium", + "high" ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-08-02", - "last_updated": "2026-08-02", + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "deepseek/deepseek-v4.1-flash-uncensored", - "name": "DeepSeek V4.1 Flash Uncensored", - "display_name": "DeepSeek V4.1 Flash Uncensored", + "id": "databricks-gpt-5", + "name": "GPT-5", + "display_name": "GPT-5", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 400000, + "output": 128000 }, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -240427,36 +235144,39 @@ "extra_capabilities": { "reasoning": { "effort_options": [ - "none", + "minimal", "low", "medium", "high" ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-10-01", - "last_updated": "2026-10-01", + "attachment": true, + "open_weights": false, + "knowledge": "2024-09-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "deepseek/deepseek-v4-flash-0731", - "name": "DeepSeek V4 Flash 0731", - "display_name": "DeepSeek V4 Flash 0731", + "id": "databricks-gpt-5-6-terra", + "name": "GPT-5.6 Terra", + "display_name": "GPT-5.6 Terra", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -240464,29 +235184,30 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ - "none", "low", - "high", - "max" + "medium", + "high" ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-07-31", - "last_updated": "2026-07-31", + "attachment": true, + "open_weights": false, + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "deepseek/deepseek-v4-flash-0731:thinking", - "name": "DeepSeek V4 Flash 0731 (Thinking)", - "display_name": "DeepSeek V4 Flash 0731 (Thinking)", + "id": "databricks-gemini-3-5-flash", + "name": "Gemini 3.5 Flash", + "display_name": "Gemini 3.5 Flash", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio" ], "output": [ "text" @@ -240494,7 +235215,7 @@ }, "limit": { "context": 1048576, - "output": 131072 + "output": 65536 }, "temperature": true, "tool_call": true, @@ -240505,64 +235226,81 @@ "extra_capabilities": { "reasoning": { "effort_options": [ - "none", + "minimal", "low", - "high", - "max" + "medium", + "high" ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-07-31", - "last_updated": "2026-07-31", + "attachment": true, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2026-05-19", + "last_updated": "2026-05-19", "type": "chat" }, { - "id": "deepseek/deepseek-v4.1-flash-1017", - "name": "DeepSeek V4.1 Flash 1017", - "display_name": "DeepSeek V4.1 Flash 1017", + "id": "databricks-claude-opus-4-7", + "name": "Claude Opus 4.7", + "display_name": "Claude Opus 4.7", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 393216 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "high", "effort_options": [ - "none", "low", + "medium", "high", + "xhigh", "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-10-17", - "last_updated": "2026-10-17", + "open_weights": false, + "knowledge": "2026-01-31", + "release_date": "2026-04-16", + "last_updated": "2026-04-16", "type": "chat" }, { - "id": "deepseek/deepseek-v4.1-flash", - "name": "DeepSeek V4.1 Flash", - "display_name": "DeepSeek V4.1 Flash", + "id": "databricks-gpt-5-4-nano", + "name": "GPT-5.4 nano", + "display_name": "GPT-5.4 nano", "modalities": { "input": [ "text", @@ -240573,8 +235311,8 @@ ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 400000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -240584,40 +235322,39 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ - "none", "low", - "high", - "max" + "medium", + "high" ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-09-10", - "last_updated": "2026-09-10", + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-03-17", + "last_updated": "2026-03-17", "type": "chat" }, { - "id": "deepseek/deepseek-v4.1-flash-1017:thinking", - "name": "DeepSeek V4.1 Flash 1017 Thinking", - "display_name": "DeepSeek V4.1 Flash 1017 Thinking", + "id": "databricks-gpt-5-6-sol", + "name": "GPT-5.6 Sol", + "display_name": "GPT-5.6 Sol", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 393216 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -240626,70 +235363,79 @@ "extra_capabilities": { "reasoning": { "effort_options": [ - "none", "low", + "medium", "high", "max" ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-10-17", - "last_updated": "2026-10-17", + "open_weights": false, + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "deepseek/deepseek-v3.2", - "name": "DeepSeek V3.2", - "display_name": "DeepSeek V3.2", + "id": "databricks-gpt-5-nano", + "name": "GPT-5 Nano", + "display_name": "GPT-5 Nano", "modalities": { "input": [ "text", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 163000, - "output": 65536 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true + "effort_options": [ + "minimal", + "low", + "medium", + "high" + ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2024-07", - "release_date": "2025-12-01", - "last_updated": "2025-12-01", + "open_weights": false, + "knowledge": "2024-05-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "xingchen-agi/xing4.0-29b-a4b", - "name": "Xing 4.0 29B A4B", - "display_name": "Xing 4.0 29B A4B", + "id": "databricks-gpt-5-4", + "name": "GPT-5.4", + "display_name": "GPT-5.4", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1050000, + "output": 128000 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -240698,26 +235444,23 @@ "extra_capabilities": { "reasoning": { "effort_options": [ - "none", - "minimal", "low", "medium", - "high", - "xhigh", - "max" + "high" ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-10-24", - "last_updated": "2026-10-24", + "attachment": true, + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-03-05", + "last_updated": "2026-03-05", "type": "chat" }, { - "id": "anthropic/claude-opus-4.6:thinking:max", - "name": "Claude 4.6 Opus Thinking Max", - "display_name": "Claude 4.6 Opus Thinking Max", + "id": "databricks-claude-opus-4-6", + "name": "Claude Opus 4.6", + "display_name": "Claude Opus 4.6", "modalities": { "input": [ "text", @@ -240736,12 +235479,12 @@ "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, + "default_enabled": false, "mode": "mixed", "budget": { "min": 1024, @@ -240774,9 +235517,9 @@ "type": "chat" }, { - "id": "anthropic/claude-haiku-5.5", - "name": "Claude Haiku 5.5", - "display_name": "Claude Haiku 5.5", + "id": "databricks-gpt-5-5", + "name": "GPT-5.5", + "display_name": "GPT-5.5", "modalities": { "input": [ "text", @@ -240788,7 +235531,7 @@ ] }, "limit": { - "context": 1000000, + "context": 1050000, "output": 128000 }, "temperature": false, @@ -240802,27 +235545,27 @@ "effort_options": [ "low", "medium", - "high", - "xhigh", - "max" + "high" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-10-07", - "last_updated": "2026-10-07", + "knowledge": "2025-12-01", + "release_date": "2026-04-23", + "last_updated": "2026-04-23", "type": "chat" }, { - "id": "anthropic/claude-haiku-latest", - "name": "Claude Haiku Latest", - "display_name": "Claude Haiku Latest", + "id": "databricks-gemini-3-flash", + "name": "Gemini 3 Flash Preview", + "display_name": "Gemini 3 Flash Preview", "modalities": { "input": [ "text", "image", + "video", + "audio", "pdf" ], "output": [ @@ -240830,9 +235573,10 @@ ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 1048576, + "output": 65536 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -240841,144 +235585,108 @@ "extra_capabilities": { "reasoning": { "effort_options": [ + "minimal", "low", "medium", - "high", - "xhigh", - "max" + "high" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-03-29", - "last_updated": "2026-03-29", + "knowledge": "2025-01", + "release_date": "2025-12-17", + "last_updated": "2025-12-17", "type": "chat" }, { - "id": "anthropic/claude-opus-4.7", - "name": "Claude 4.7 Opus", - "display_name": "Claude 4.7 Opus", + "id": "databricks-gpt-oss-120b", + "name": "GPT OSS 120B", + "display_name": "GPT OSS 120B", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 131072, + "output": 25000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "high", "effort_options": [ "low", "medium", - "high", - "xhigh", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." + "high" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-04-16", - "last_updated": "2026-04-16", + "attachment": false, + "open_weights": true, + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "anthropic/claude-opus-4.6", - "name": "Claude 4.6 Opus", - "display_name": "Claude 4.6 Opus", + "id": "databricks-gpt-5-2", + "name": "GPT-5.2", + "display_name": "GPT-5.2", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, + "context": 400000, "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", "effort_options": [ + "none", "low", "medium", - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." + "high" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-05-31", - "release_date": "2026-02-05", - "last_updated": "2026-03-13", + "knowledge": "2025-08-31", + "release_date": "2025-12-11", + "last_updated": "2025-12-11", "type": "chat" }, { - "id": "anthropic/claude-opus-4.1:thinking:1024", - "name": "Claude 4.1 Opus Thinking (1K)", - "display_name": "Claude 4.1 Opus Thinking (1K)", + "id": "databricks-gemini-2-5-flash", + "name": "Gemini 2.5 Flash", + "display_name": "Gemini 2.5 Flash", "modalities": { "input": [ "text", "image", + "audio", + "video", "pdf" ], "output": [ @@ -240986,8 +235694,8 @@ ] }, "limit": { - "context": 200000, - "output": 32000 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -240995,38 +235703,17 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." - ] - } - }, "attachment": true, "open_weights": false, - "knowledge": "2025-03-31", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "knowledge": "2025-01", + "release_date": "2025-06-17", + "last_updated": "2025-06-17", "type": "chat" }, { - "id": "anthropic/claude-opus-4.5:thinking", - "name": "Claude 4.5 Opus Thinking", - "display_name": "Claude 4.5 Opus Thinking", + "id": "databricks-claude-opus-4-5", + "name": "Claude Opus 4.5 (latest)", + "display_name": "Claude Opus 4.5 (latest)", "modalities": { "input": [ "text", @@ -241045,12 +235732,12 @@ "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, + "default_enabled": false, "mode": "mixed", "budget": { "min": 1024, @@ -241082,14 +235769,12 @@ "type": "chat" }, { - "id": "anthropic/claude-opus-4.6:thinking:low", - "name": "Claude 4.6 Opus Thinking Low", - "display_name": "Claude 4.6 Opus Thinking Low", + "id": "databricks-glm-5-2", + "name": "GLM-5.2", + "display_name": "GLM-5.2", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" @@ -241097,7 +235782,7 @@ }, "limit": { "context": 1000000, - "output": 128000 + "output": 131072 }, "temperature": true, "tool_call": true, @@ -241107,43 +235792,23 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", "effort_options": [ - "low", - "medium", + "none", "high", "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-05-31", - "release_date": "2026-02-05", - "last_updated": "2026-03-13", + "attachment": false, + "open_weights": true, + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "anthropic/claude-opus-4.7:thinking", - "name": "Claude 4.7 Opus Thinking", - "display_name": "Claude 4.7 Opus Thinking", + "id": "databricks-claude-sonnet-4-5", + "name": "Claude Sonnet 4.5 (latest)", + "display_name": "Claude Sonnet 4.5 (latest)", "modalities": { "input": [ "text", @@ -241155,87 +235820,78 @@ ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 200000, + "output": 64000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, "interleaved": true, "summaries": true, - "visibility": "omitted", + "visibility": "summary", "continuation": [ "thinking_blocks" ], "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-04-16", - "last_updated": "2026-04-16", + "knowledge": "2025-07-31", + "release_date": "2025-09-29", + "last_updated": "2025-09-29", "type": "chat" }, { - "id": "anthropic/claude-sonnet-5", - "name": "Claude Sonnet 5", - "display_name": "Claude Sonnet 5", + "id": "databricks-kimi-k2-7-code", + "name": "Kimi K2.7 Code", + "display_name": "Kimi K2.7 Code", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 262144, + "output": 262144 }, "temperature": false, "tool_call": true, "reasoning": { - "supported": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": true, + "default": true }, "attachment": true, - "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-30", - "last_updated": "2026-06-30", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-06-12", + "last_updated": "2026-06-12", "type": "chat" }, { - "id": "anthropic/claude-opus-4.8:thinking", - "name": "Claude Opus 4.8 Thinking", - "display_name": "Claude Opus 4.8 Thinking", + "id": "databricks-claude-haiku-4-5", + "name": "Claude Haiku 4.5 (latest)", + "display_name": "Claude Haiku 4.5 (latest)", "modalities": { "input": [ "text", @@ -241247,52 +235903,47 @@ ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 200000, + "output": 64000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, "interleaved": true, "summaries": true, - "visibility": "omitted", + "visibility": "summary", "continuation": [ "thinking_blocks" ], "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-01", - "release_date": "2026-05-28", - "last_updated": "2026-05-28", + "knowledge": "2025-02-28", + "release_date": "2025-10-15", + "last_updated": "2025-10-15", "type": "chat" }, { - "id": "anthropic/claude-haiku-4.5", - "name": "Claude Haiku 4.5", - "display_name": "Claude Haiku 4.5", + "id": "databricks-claude-sonnet-4-6", + "name": "Claude Sonnet 4.6", + "display_name": "Claude Sonnet 4.6", "modalities": { "input": [ "text", @@ -241304,7 +235955,7 @@ ] }, "limit": { - "context": 200000, + "context": 1000000, "output": 64000 }, "temperature": true, @@ -241317,11 +235968,18 @@ "reasoning": { "supported": true, "default_enabled": false, - "mode": "budget", + "mode": "mixed", "budget": { "min": 1024, "unit": "tokens" }, + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "max" + ], "interleaved": true, "summaries": true, "visibility": "summary", @@ -241329,26 +235987,28 @@ "thinking_blocks" ], "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-02-28", - "release_date": "2025-10-15", - "last_updated": "2025-10-15", + "knowledge": "2025-08-31", + "release_date": "2026-02-17", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "anthropic/claude-opus-4.1:thinking:32768", - "name": "Claude 4.1 Opus Thinking (32K)", - "display_name": "Claude 4.1 Opus Thinking (32K)", + "id": "databricks-gemini-3-1-flash-lite", + "name": "Gemini 3.1 Flash Lite Preview", + "display_name": "Gemini 3.1 Flash Lite Preview", "modalities": { "input": [ "text", "image", + "video", + "audio", "pdf" ], "output": [ @@ -241356,8 +236016,8 @@ ] }, "limit": { - "context": 200000, - "output": 32000 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -241367,40 +236027,31 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + "effort_options": [ + "minimal", + "low", + "medium", + "high" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-03-31", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "knowledge": "2025-01", + "release_date": "2026-03-03", + "last_updated": "2026-03-03", "type": "chat" }, { - "id": "anthropic/claude-opus-4.8", - "name": "Claude Opus 4.8", - "display_name": "Claude Opus 4.8", + "id": "databricks-gemini-3-pro", + "name": "Gemini 3 Pro Preview", + "display_name": "Gemini 3 Pro Preview", "modalities": { "input": [ "text", "image", + "video", + "audio", "pdf" ], "output": [ @@ -241408,52 +236059,118 @@ ] }, "limit": { - "context": 1000000, + "context": 1048576, + "output": 65536 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "high" + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2025-11-18", + "last_updated": "2025-11-18", + "type": "chat" + }, + { + "id": "databricks-gemini-3-1-pro", + "name": "Gemini 3.1 Pro Preview", + "display_name": "Gemini 3.1 Pro Preview", + "modalities": { + "input": [ + "text", + "image", + "video", + "audio", + "pdf" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1048576, + "output": 65536 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "minimal", + "low", + "medium", + "high" + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2026-02-19", + "last_updated": "2026-02-19", + "type": "chat" + }, + { + "id": "databricks-gpt-5-1", + "name": "GPT-5.1", + "display_name": "GPT-5.1", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 400000, "output": 128000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "high", "effort_options": [ + "none", "low", "medium", - "high", - "xhigh", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." + "high" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-01", - "release_date": "2026-05-28", - "last_updated": "2026-05-28", + "knowledge": "2024-09-30", + "release_date": "2025-11-13", + "last_updated": "2025-11-13", "type": "chat" }, { - "id": "anthropic/claude-sonnet-4.6:thinking", - "name": "Claude Sonnet 4.6 Thinking", - "display_name": "Claude Sonnet 4.6 Thinking", + "id": "databricks-claude-opus-4-1", + "name": "Claude Opus 4.1 (latest)", + "display_name": "Claude Opus 4.1 (latest)", "modalities": { "input": [ "text", @@ -241465,31 +236182,24 @@ ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 200000, + "output": 32000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "mixed", + "default_enabled": false, + "mode": "budget", "budget": { "min": 1024, "unit": "tokens" }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "max" - ], "interleaved": true, "summaries": true, "visibility": "summary", @@ -241497,37 +236207,36 @@ "thinking_blocks" ], "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-17", - "last_updated": "2026-03-13", + "knowledge": "2025-03-31", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "anthropic/claude-sonnet-5.5:thinking", - "name": "Claude Sonnet 5.5 Thinking", - "display_name": "Claude Sonnet 5.5 Thinking", + "id": "databricks-gpt-5-4-mini", + "name": "GPT-5.4 mini", + "display_name": "GPT-5.4 mini", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, + "context": 400000, "output": 128000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -241535,32 +236244,30 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, "effort_options": [ "low", "medium", - "high", - "xhigh", - "max" + "high" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-09-28", - "last_updated": "2026-09-28", + "knowledge": "2025-08-31", + "release_date": "2026-03-17", + "last_updated": "2026-03-17", "type": "chat" }, { - "id": "anthropic/claude-opus-4.1:thinking:8192", - "name": "Claude 4.1 Opus Thinking (8K)", - "display_name": "Claude 4.1 Opus Thinking (8K)", + "id": "databricks-gemini-2-5-pro", + "name": "Gemini 2.5 Pro", + "display_name": "Gemini 2.5 Pro", "modalities": { "input": [ "text", "image", + "audio", + "video", "pdf" ], "output": [ @@ -241568,8 +236275,8 @@ ] }, "limit": { - "context": 200000, - "output": 32000 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -241577,38 +236284,17 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." - ] - } - }, "attachment": true, "open_weights": false, - "knowledge": "2025-03-31", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "knowledge": "2025-01", + "release_date": "2025-06-17", + "last_updated": "2025-06-17", "type": "chat" }, { - "id": "anthropic/claude-haiku-4.5:thinking", - "name": "Claude Haiku 4.5 Thinking", - "display_name": "Claude Haiku 4.5 Thinking", + "id": "databricks-gpt-5-6-luna", + "name": "GPT-5.6 Luna", + "display_name": "GPT-5.6 Luna", "modalities": { "input": [ "text", @@ -241620,10 +236306,10 @@ ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -241631,48 +236317,35 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + "effort_options": [ + "low", + "medium", + "high" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-02-28", - "release_date": "2025-10-15", - "last_updated": "2025-10-15", + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "anthropic/claude-opus-5.5", - "name": "Claude Opus 5.5", - "display_name": "Claude Opus 5.5", + "id": "databricks-gpt-5-mini", + "name": "GPT-5 Mini", + "display_name": "GPT-5 Mini", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, + "context": 400000, "output": 128000 }, "temperature": false, @@ -241684,25 +236357,24 @@ "extra_capabilities": { "reasoning": { "effort_options": [ + "minimal", "low", "medium", - "high", - "xhigh", - "max" + "high" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "knowledge": "2024-05-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "anthropic/claude-fable-latest", - "name": "Claude Fable Latest", - "display_name": "Claude Fable Latest", + "id": "databricks-claude-sonnet-4", + "name": "Claude Sonnet 4", + "display_name": "Claude Sonnet 4", "modalities": { "input": [ "text", @@ -241714,65 +236386,135 @@ ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 200000, + "output": 64000 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, "interleaved": true, "summaries": true, - "visibility": "omitted", + "visibility": "summary", "continuation": [ "thinking_blocks" ], "notes": [ - "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", - "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", - "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-06-09", - "last_updated": "2026-06-09", + "knowledge": "2025-03-31", + "release_date": "2025-05-22", + "last_updated": "2025-05-22", + "type": "chat" + } + ] + }, + "ai21": { + "id": "ai21", + "name": "AI21 Labs", + "display_name": "AI21 Labs", + "api": "https://api.ai21.com/studio/v1", + "doc": "https://docs.ai21.com/docs/jamba-foundation-models", + "models": [ + { + "id": "jamba-large", + "name": "Jamba Large", + "display_name": "Jamba Large", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 256000, + "output": 4096 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "knowledge": "2024-08-22", + "release_date": "2025-07-03", + "last_updated": "2025-07-03", "type": "chat" }, { - "id": "anthropic/claude-opus-latest", - "name": "Claude Opus Latest", - "display_name": "Claude Opus Latest", + "id": "jamba-mini", + "name": "Jamba Mini", + "display_name": "Jamba Mini", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 256000, + "output": 4096 }, + "temperature": true, "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "knowledge": "2024-08-22", + "release_date": "2026-01-08", + "last_updated": "2026-01-08", + "type": "chat" + } + ] + }, + "perplexity": { + "id": "perplexity", + "name": "Perplexity", + "display_name": "Perplexity", + "doc": "https://docs.perplexity.ai", + "models": [ + { + "id": "sonar-reasoning-pro", + "name": "Sonar Reasoning Pro", + "display_name": "Sonar Reasoning Pro", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 128000, + "output": 4096 + }, + "temperature": true, + "tool_call": false, "reasoning": { "supported": true, "default": true @@ -241780,81 +236522,129 @@ "extra_capabilities": { "reasoning": { "effort_options": [ + "minimal", "low", "medium", - "high", - "xhigh", - "max" + "high" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-03-29", - "last_updated": "2026-03-29", + "knowledge": "2025-09-01", + "release_date": "2024-01-01", + "last_updated": "2025-09-01", "type": "chat" }, { - "id": "anthropic/claude-fable-5.1", - "name": "Claude Fable 5.1", - "display_name": "Claude Fable 5.1", + "id": "sonar", + "name": "Sonar", + "display_name": "Sonar", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 128000, + "output": 4096 + }, + "temperature": true, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": false, + "knowledge": "2025-09-01", + "release_date": "2024-01-01", + "last_updated": "2025-09-01", + "type": "chat" + }, + { + "id": "sonar-deep-research", + "name": "Perplexity Sonar Deep Research", + "display_name": "Perplexity Sonar Deep Research", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 128000, + "output": 32768 }, "temperature": false, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", "effort_options": [ + "minimal", "low", "medium", - "high", - "xhigh", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", - "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", - "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." + "high" ] } }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-09-01", - "last_updated": "2026-09-01", + "knowledge": "2025-01", + "release_date": "2025-02-01", + "last_updated": "2025-09-01", "type": "chat" }, { - "id": "anthropic/claude-opus-4.1", - "name": "Claude 4.1 Opus", - "display_name": "Claude 4.1 Opus", + "id": "sonar-pro", + "name": "Sonar Pro", + "display_name": "Sonar Pro", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 200000, + "output": 8192 + }, + "temperature": true, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-09-01", + "release_date": "2024-01-01", + "last_updated": "2025-09-01", + "type": "chat" + } + ] + }, + "trustedrouter": { + "id": "trustedrouter", + "name": "TrustedRouter", + "display_name": "TrustedRouter", + "api": "https://api.trustedrouter.com/v1", + "doc": "https://trustedrouter.com/docs", + "models": [ + { + "id": "trustedrouter/zdr", + "name": "Zero Data Retention", + "display_name": "Zero Data Retention", "modalities": { "input": [ "text", @@ -241866,47 +236656,35 @@ ] }, "limit": { - "context": 200000, - "output": 32000 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + "effort_options": [ + "none", + "low", + "medium", + "high" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-03-31", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "release_date": "2026-06-01", + "last_updated": "2026-06-27", "type": "chat" }, { - "id": "anthropic/claude-opus-5", - "name": "Claude Opus 5", - "display_name": "Claude Opus 5", + "id": "trustedrouter/auto", + "name": "Auto", + "display_name": "Auto", "modalities": { "input": [ "text", @@ -241919,9 +236697,9 @@ }, "limit": { "context": 1000000, - "output": 128000 + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -241931,25 +236709,23 @@ "reasoning": { "supported": true, "effort_options": [ + "none", "low", "medium", - "high", - "xhigh", - "max" + "high" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-05", - "release_date": "2026-07-24", - "last_updated": "2026-07-24", + "release_date": "2026-05-01", + "last_updated": "2026-06-27", "type": "chat" }, { - "id": "anthropic/claude-sonnet-4.5:thinking", - "name": "Claude Sonnet 4.5 Thinking", - "display_name": "Claude Sonnet 4.5 Thinking", + "id": "trustedrouter/cheap", + "name": "Cheap", + "display_name": "Cheap", "modalities": { "input": [ "text", @@ -241961,8 +236737,8 @@ ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -241972,36 +236748,24 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + "effort_options": [ + "none", + "low", + "medium", + "high" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-07-31", - "release_date": "2025-09-29", - "last_updated": "2025-09-29", + "release_date": "2026-05-01", + "last_updated": "2026-06-27", "type": "chat" }, { - "id": "anthropic/claude-opus-4.6:thinking:medium", - "name": "Claude 4.6 Opus Thinking Medium", - "display_name": "Claude 4.6 Opus Thinking Medium", + "id": "trustedrouter/e2e", + "name": "End-to-End Encrypted", + "display_name": "End-to-End Encrypted", "modalities": { "input": [ "text", @@ -242014,7 +236778,7 @@ }, "limit": { "context": 1000000, - "output": 128000 + "output": 131072 }, "temperature": true, "tool_call": true, @@ -242024,43 +236788,24 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", "effort_options": [ + "none", "low", "medium", - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." + "high" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-05-31", - "release_date": "2026-02-05", - "last_updated": "2026-03-13", + "release_date": "2026-06-01", + "last_updated": "2026-06-27", "type": "chat" }, { - "id": "anthropic/claude-opus-4.6:thinking", - "name": "Claude 4.6 Opus Thinking", - "display_name": "Claude 4.6 Opus Thinking", + "id": "trustedrouter/synth-code", + "name": "Synth Code", + "display_name": "Synth Code", "modalities": { "input": [ "text", @@ -242073,7 +236818,7 @@ }, "limit": { "context": 1000000, - "output": 128000 + "output": 131072 }, "temperature": true, "tool_call": true, @@ -242083,43 +236828,24 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", "effort_options": [ + "none", "low", "medium", - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." + "high" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-05-31", - "release_date": "2026-02-05", - "last_updated": "2026-03-13", + "release_date": "2026-06-20", + "last_updated": "2026-06-27", "type": "chat" }, { - "id": "anthropic/claude-opus-4.5", - "name": "Claude 4.5 Opus", - "display_name": "Claude 4.5 Opus", + "id": "trustedrouter/fast", + "name": "Fast", + "display_name": "Fast", "modalities": { "input": [ "text", @@ -242131,53 +236857,35 @@ ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", "effort_options": [ + "none", "low", "medium", "high" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-05", - "release_date": "2025-11-24", - "last_updated": "2025-11-24", + "release_date": "2026-06-01", + "last_updated": "2026-06-27", "type": "chat" }, { - "id": "anthropic/claude-sonnet-5:thinking", - "name": "Claude Sonnet 5 Thinking", - "display_name": "Claude Sonnet 5 Thinking", + "id": "trustedrouter/synth", + "name": "Synth", + "display_name": "Synth", "modalities": { "input": [ "text", @@ -242190,9 +236898,9 @@ }, "limit": { "context": 1000000, - "output": 128000 + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -242200,144 +236908,117 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, "effort_options": [ + "none", "low", "medium", - "high", - "xhigh", - "max" + "high" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-30", - "last_updated": "2026-06-30", + "release_date": "2026-06-20", + "last_updated": "2026-06-27", "type": "chat" - }, + } + ] + }, + "agnes": { + "id": "agnes", + "name": "Agnes AI", + "display_name": "Agnes AI", + "api": "https://apihub.agnes-ai.com/v1", + "doc": "https://agnes-ai.com/doc", + "models": [ { - "id": "anthropic/claude-sonnet-4.6", - "name": "Claude Sonnet 4.6", - "display_name": "Claude Sonnet 4.6", + "id": "agnes-2.0-flash", + "name": "Agnes 2.0 Flash", + "display_name": "Agnes 2.0 Flash", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 512000, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "max" - ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-17", - "last_updated": "2026-03-13", + "release_date": "2026-05-25", + "last_updated": "2026-05-25", "type": "chat" }, { - "id": "anthropic/claude-sonnet-4.5", - "name": "Claude Sonnet 4.5", - "display_name": "Claude Sonnet 4.5", + "id": "agnes-2.5-flash", + "name": "Agnes 2.5 Flash", + "display_name": "Agnes 2.5 Flash", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 512000, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-07-31", - "release_date": "2025-09-29", - "last_updated": "2025-09-29", + "release_date": "2026-07", + "last_updated": "2026-07", "type": "chat" }, { - "id": "anthropic/claude-sonnet-5.5", - "name": "Claude Sonnet 5.5", - "display_name": "Claude Sonnet 5.5", + "id": "agnes-2.5-pro-alpha", + "name": "Agnes 2.5 Pro Alpha", + "display_name": "Agnes 2.5 Pro Alpha", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" @@ -242345,9 +237026,9 @@ }, "limit": { "context": 1000000, - "output": 128000 + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -242355,37 +237036,37 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "low", - "medium", - "high" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-09-28", - "last_updated": "2026-09-28", + "open_weights": true, + "release_date": "2026-07-24", + "last_updated": "2026-07-24", "type": "chat" }, { - "id": "anthropic/claude-opus-4.1:thinking", - "name": "Claude 4.1 Opus Thinking", - "display_name": "Claude 4.1 Opus Thinking", + "id": "agnes-3.0-flash", + "name": "Agnes 3.0 Flash", + "display_name": "Agnes 3.0 Flash", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 32000 + "context": 512000, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -242396,73 +237077,60 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-03-31", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "release_date": "2026-09", + "last_updated": "2026-09", "type": "chat" - }, + } + ] + }, + "302ai": { + "id": "302ai", + "name": "302.AI", + "display_name": "302.AI", + "api": "https://api.302.ai/v1", + "doc": "https://doc.302.ai", + "models": [ { - "id": "anthropic/claude-sonnet-latest", - "name": "Claude Sonnet Latest", - "display_name": "Claude Sonnet Latest", + "id": "gpt-4.1-nano", + "name": "gpt-4.1-nano", + "display_name": "gpt-4.1-nano", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 1047576, + "output": 32768 }, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ] - } + "supported": false }, "attachment": true, "open_weights": false, - "release_date": "2026-03-01", - "last_updated": "2026-03-01", + "knowledge": "2024-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", "type": "chat" }, { - "id": "anthropic/claude-fable-5", + "id": "claude-fable-5", "name": "Claude Fable 5", "display_name": "Claude Fable 5", "modalities": { @@ -242519,35 +237187,59 @@ "type": "chat" }, { - "id": "LatitudeGames/Wayfarer-Large-70B-Llama-3.3", - "name": "Llama 3.3 70B Wayfarer", - "display_name": "Llama 3.3 70B Wayfarer", + "id": "gemini-3.1-pro-preview", + "name": "Gemini 3.1 Pro Preview", + "display_name": "Gemini 3.1 Pro Preview", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 32768, - "output": 16384 + "context": 1048576, + "output": 65536 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "release_date": "2025-02-20", - "last_updated": "2025-02-20", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "low", + "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2026-02-19", + "last_updated": "2026-02-19", "type": "chat" }, { - "id": "abacusai/Dracarys-72B-Instruct", - "name": "Llama 3.1 70B Dracarys 2", - "display_name": "Llama 3.1 70B Dracarys 2", + "id": "kimi-k2-0905-preview", + "name": "kimi-k2-0905-preview", + "display_name": "kimi-k2-0905-preview", "modalities": { "input": [ "text" @@ -242557,178 +237249,259 @@ ] }, "limit": { - "context": 32768, - "output": 8192 + "context": 262144, + "output": 262144 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": false }, "attachment": false, "open_weights": true, - "release_date": "2025-08-02", - "last_updated": "2025-08-02", + "knowledge": "2025-06", + "release_date": "2025-09-05", + "last_updated": "2025-09-05", "type": "chat" }, { - "id": "baseten/Kimi-K2-Instruct-FP4", - "name": "Kimi K2 0711 Instruct FP4", - "display_name": "Kimi K2 0711 Instruct FP4", + "id": "claude-haiku-4-5", + "name": "claude-haiku-4-5", + "display_name": "claude-haiku-4-5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 131072 + "context": 200000, + "output": 64000 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false }, - "attachment": false, - "open_weights": true, - "release_date": "2024-01-01", - "last_updated": "2025-07-11", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-02-28", + "release_date": "2025-10-15", + "last_updated": "2025-10-15", "type": "chat" }, { - "id": "VongolaChouko/Starcannon-Unleashed-12B-v1.0", - "name": "Mistral Nemo Starcannon 12b v1", - "display_name": "Mistral Nemo Starcannon 12b v1", + "id": "gemini-3-flash-preview", + "name": "gemini-3-flash-preview", + "display_name": "gemini-3-flash-preview", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 16384, - "output": 8192 + "context": 1000000, + "output": 65536 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "release_date": "2024-01-01", - "last_updated": "2024-07-01", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", + "low", + "medium", + "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-06", + "release_date": "2025-12-17", + "last_updated": "2025-12-17", "type": "chat" }, { - "id": "stepfun-ai/step-3.5-flash-2603", - "name": "Step 3.5 Flash 2603", - "display_name": "Step 3.5 Flash 2603", + "id": "qwen3.6-plus", + "name": "Qwen3.6 Plus", + "display_name": "Qwen3.6 Plus", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 262144, + "context": 1000000, "output": 65536 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "low", - "medium", - "high" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-01", + "attachment": true, + "open_weights": false, + "knowledge": "2025-04", "release_date": "2026-04-02", "last_updated": "2026-04-02", "type": "chat" }, { - "id": "stepfun-ai/step-3.5-flash", - "name": "Step 3.5 Flash", - "display_name": "Step 3.5 Flash", + "id": "gpt-5.6-terra", + "name": "GPT-5.6 Terra", + "display_name": "GPT-5.6 Terra", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 1050000, + "output": 128000 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ], + "verbosity": "medium", + "verbosity_options": [ "low", "medium", "high" - ] + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-01-29", - "last_updated": "2026-02-13", + "attachment": true, + "open_weights": false, + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "pamanseau/OpenReasoning-Nemotron-32B", - "name": "OpenReasoning Nemotron 32B", - "display_name": "OpenReasoning Nemotron 32B", + "id": "claude-opus-5-thinking", + "name": "claude-opus-5-thinking", + "display_name": "claude-opus-5-thinking", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 32768, - "output": 65536 + "context": 1000000, + "output": 128000 }, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": false, - "open_weights": true, - "release_date": "2025-08-21", - "last_updated": "2025-08-21", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2026-05", + "release_date": "2026-07-24", + "last_updated": "2026-07-24", "type": "chat" }, { - "id": "TheDrummer/Anubis-70B-v1.1", - "name": "Anubis 70B v1.1", - "display_name": "Anubis 70B v1.1", + "id": "glm-5.2", + "name": "GLM-5.2", + "display_name": "GLM-5.2", "modalities": { "input": [ "text" @@ -242738,160 +237511,290 @@ ] }, "limit": { - "context": 32000, - "output": 16384 + "context": 1000000, + "output": 131072 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "high", + "max" + ] + } }, "attachment": false, "open_weights": true, - "release_date": "2024-01-01", - "last_updated": "2024-01-01", + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "TheDrummer/Cydonia-24B-v4", - "name": "The Drummer Cydonia 24B v4", - "display_name": "The Drummer Cydonia 24B v4", + "id": "gpt-5.4", + "name": "gpt-5.4", + "display_name": "gpt-5.4", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 32768, - "output": 32768 + "context": 1050000, + "output": 128000 }, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false }, - "attachment": false, - "open_weights": true, - "release_date": "2025-07-22", - "last_updated": "2025-07-22", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-03-05", + "last_updated": "2026-03-05", "type": "chat" }, { - "id": "TheDrummer/Artemis-v1.1", - "name": "TheDrummer/Artemis v1.1", - "display_name": "TheDrummer/Artemis v1.1", + "id": "claude-sonnet-4-6", + "name": "claude-sonnet-4-6", + "display_name": "claude-sonnet-4-6", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 1000000, + "output": 64000 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." + ] + } }, "attachment": true, - "open_weights": true, - "release_date": "2026-09-06", - "last_updated": "2026-09-06", + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-02-17", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "TheDrummer/Cydonia-24B-v4.1", - "name": "The Drummer Cydonia 24B v4.1", - "display_name": "The Drummer Cydonia 24B v4.1", + "id": "gpt-5.6-sol", + "name": "GPT-5.6 Sol", + "display_name": "GPT-5.6 Sol", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 117964 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-04-30", - "release_date": "2025-09-27", - "last_updated": "2025-09-27", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "TheDrummer/Magidonia-24B-v4.3", - "name": "The Drummer Magidonia 24B v4.3", - "display_name": "The Drummer Magidonia 24B v4.3", + "id": "gpt-5.4-mini", + "name": "gpt-5.4-mini", + "display_name": "gpt-5.4-mini", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 32768, - "output": 32768 + "context": 400000, + "output": 128000 }, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false }, - "attachment": false, - "open_weights": true, - "release_date": "2025-12-25", - "last_updated": "2025-12-25", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-03-17", + "last_updated": "2026-03-17", "type": "chat" }, { - "id": "TheDrummer/Anubis-70B-v1", - "name": "Anubis 70B v1", - "display_name": "Anubis 70B v1", + "id": "doubao-seed-1-6-vision-250815", + "name": "doubao-seed-1-6-vision-250815", + "display_name": "doubao-seed-1-6-vision-250815", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 65536, - "output": 16384 + "context": 256000, + "output": 32000 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, - "open_weights": true, - "release_date": "2024-01-01", - "last_updated": "2024-01-01", + "attachment": true, + "open_weights": false, + "release_date": "2025-08-15", + "last_updated": "2025-08-15", "type": "chat" }, { - "id": "TheDrummer/skyfall-36b-v2", - "name": "TheDrummer Skyfall 36B V2", - "display_name": "TheDrummer Skyfall 36B V2", + "id": "gpt-4o", + "name": "gpt-4o", + "display_name": "gpt-4o", "modalities": { "input": [ "text", + "image", "pdf" ], "output": [ @@ -242899,156 +237802,201 @@ ] }, "limit": { - "context": 32768, - "output": 29491 + "context": 128000, + "output": 16384 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, "attachment": true, - "open_weights": true, - "knowledge": "2024-06-30", - "release_date": "2025-03-10", - "last_updated": "2025-03-10", + "open_weights": false, + "knowledge": "2023-09", + "release_date": "2024-05-13", + "last_updated": "2024-08-06", "type": "chat" }, { - "id": "TheDrummer/Cydonia-24B-v2", - "name": "The Drummer Cydonia 24B v2", - "display_name": "The Drummer Cydonia 24B v2", + "id": "grok-4-fast-non-reasoning", + "name": "grok-4-fast-non-reasoning", + "display_name": "grok-4-fast-non-reasoning", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 32768, - "output": 32768 + "context": 2000000, + "output": 30000 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, - "open_weights": true, - "release_date": "2025-02-17", - "last_updated": "2025-02-17", + "attachment": true, + "open_weights": false, + "knowledge": "2025-06", + "release_date": "2025-12-18", + "last_updated": "2025-12-18", "type": "chat" }, { - "id": "TheDrummer/Rocinante-12B-v1.1", - "name": "Rocinante 12b", - "display_name": "Rocinante 12b", + "id": "gemini-2.5-pro", + "name": "gemini-2.5-pro", + "display_name": "gemini-2.5-pro", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 16384, - "output": 8192 + "context": 1000000, + "output": 65536 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "release_date": "2024-01-01", - "last_updated": "2024-01-01", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "budget", + "budget": { + "default": -1, + "min": 128, + "max": 32768, + "auto": -1, + "unit": "tokens" + }, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2025-06-17", + "last_updated": "2025-06-17", "type": "chat" }, { - "id": "TheDrummer/UnslopNemo-12B-v4.1", - "name": "UnslopNemo 12b v4", - "display_name": "UnslopNemo 12b v4", + "id": "grok-4-1-fast-reasoning", + "name": "grok-4-1-fast-reasoning", + "display_name": "grok-4-1-fast-reasoning", "modalities": { "input": [ "text", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 8192, - "output": 26214 + "context": 2000000, + "output": 30000 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": true, - "open_weights": true, - "release_date": "2024-01-01", - "last_updated": "2024-01-01", + "open_weights": false, + "knowledge": "2025-06", + "release_date": "2025-11-19", + "last_updated": "2025-11-19", "type": "chat" }, { - "id": "TheDrummer/Cydonia-24B-v4.3", - "name": "The Drummer Cydonia 24B v4.3", - "display_name": "The Drummer Cydonia 24B v4.3", + "id": "grok-4.20-beta-0309-reasoning", + "name": "grok-4.20-beta-0309-reasoning", + "display_name": "grok-4.20-beta-0309-reasoning", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 2000000, + "output": 30000 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "release_date": "2025-12-25", - "last_updated": "2025-12-25", + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": true, + "open_weights": false, + "release_date": "2026-03-09", + "last_updated": "2026-03-09", "type": "chat" }, { - "id": "soob3123/Veiled-Calla-12B", - "name": "Veiled Calla 12B", - "display_name": "Veiled Calla 12B", + "id": "gemini-2.0-flash-lite", + "name": "gemini-2.0-flash-lite", + "display_name": "gemini-2.0-flash-lite", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 32768, + "context": 2000000, "output": 8192 }, + "temperature": true, "tool_call": false, "reasoning": { "supported": false }, - "attachment": false, - "open_weights": true, - "release_date": "2025-04-13", - "last_updated": "2025-04-13", + "attachment": true, + "open_weights": false, + "knowledge": "2024-11", + "release_date": "2024-12-11", + "last_updated": "2024-12-11", "type": "chat" }, { - "id": "soob3123/amoral-gemma3-27B-v2", - "name": "Amoral Gemma3 27B v2", - "display_name": "Amoral Gemma3 27B v2", + "id": "MiniMax-M2.7", + "name": "MiniMax-M2.7", + "display_name": "MiniMax-M2.7", "modalities": { "input": [ "text" @@ -243058,88 +238006,146 @@ ] }, "limit": { - "context": 32768, - "output": 8192 + "context": 204800, + "output": 131072 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, "open_weights": true, - "release_date": "2025-05-23", - "last_updated": "2025-05-23", + "release_date": "2026-03-18", + "last_updated": "2026-03-18", "type": "chat" }, { - "id": "soob3123/GrayLine-Qwen3-8B", - "name": "Grayline Qwen3 8B", - "display_name": "Grayline Qwen3 8B", + "id": "gpt-5.6-luna", + "name": "GPT-5.6 Luna", + "display_name": "GPT-5.6 Luna", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 32768, - "output": 32768 + "context": 1050000, + "output": 128000 }, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "release_date": "2025-09-25", - "last_updated": "2025-09-25", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "mistralai/codestral-2508", - "name": "Codestral 2508", - "display_name": "Codestral 2508", + "id": "grok-4.6", + "name": "Grok 4.6", + "display_name": "Grok 4.6", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 32768 + "context": 500000, + "output": 500000 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "low", + "medium", + "high", + "xhigh" + ] + } + }, + "attachment": true, "open_weights": false, - "release_date": "2025-07-30", - "last_updated": "2025-07-30", + "knowledge": "2026-02-01", + "release_date": "2026-08-12", + "last_updated": "2026-08-12", "type": "chat" }, { - "id": "mistralai/mistral-large-4", - "name": "Mistral Large 4", - "display_name": "Mistral Large 4", + "id": "gemini-3.5-flash-lite", + "name": "Gemini 3.5 Flash Lite", + "display_name": "Gemini 3.5 Flash Lite", "modalities": { "input": [ "text", - "image" + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 524288, - "output": 262144 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -243149,22 +238155,26 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ - "none", + "minimal", + "low", + "medium", "high" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-10-06", - "last_updated": "2026-10-06", + "knowledge": "2026-03", + "release_date": "2026-07-21", + "last_updated": "2026-07-21", "type": "chat" }, { - "id": "mistralai/mistral-small-3.1-24b-instruct", - "name": "Mistral Small 3.1 24B (2503)", - "display_name": "Mistral Small 3.1 24B (2503)", + "id": "gemini-3-pro-preview", + "name": "gemini-3-pro-preview", + "display_name": "gemini-3-pro-preview", "modalities": { "input": [ "text", @@ -243175,137 +238185,243 @@ ] }, "limit": { - "context": 128000, - "output": 102400 + "context": 1000000, + "output": 64000 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "low", + "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] + } }, "attachment": true, - "open_weights": true, - "knowledge": "2023-10-31", - "release_date": "2025-03-17", - "last_updated": "2025-03-17", + "open_weights": false, + "knowledge": "2025-06", + "release_date": "2025-11-18", + "last_updated": "2025-11-18", "type": "chat" }, { - "id": "mistralai/mistral-medium-3.1", - "name": "Mistral Medium 3.1", - "display_name": "Mistral Medium 3.1", + "id": "gpt-5.6-luna-pro", + "name": "gpt-5.6-luna-pro", + "display_name": "gpt-5.6-luna-pro", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 1050000, + "output": 128000 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + }, + "attachment": true, "open_weights": false, - "knowledge": "2025-06-30", - "release_date": "2025-08-12", - "last_updated": "2025-08-12", + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "mistralai/devstral-2-123b-instruct-2512", - "name": "Devstral 2 123B", - "display_name": "Devstral 2 123B", + "id": "gemini-2.5-flash-lite-preview-09-2025", + "name": "gemini-2.5-flash-lite-preview-09-2025", + "display_name": "gemini-2.5-flash-lite-preview-09-2025", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, + "context": 1000000, "output": 65536 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-12", - "release_date": "2025-12-09", - "last_updated": "2025-12-09", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "default": -1, + "min": 512, + "max": 24576, + "auto": -1, + "unit": "tokens" + }, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2025-09-26", + "last_updated": "2025-09-26", "type": "chat" }, { - "id": "mistralai/ministral-3b-2512", - "name": "Ministral 3B", - "display_name": "Ministral 3B", + "id": "claude-opus-4-1-20250805-thinking", + "name": "claude-opus-4-1-20250805-thinking", + "display_name": "claude-opus-4-1-20250805-thinking", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 200000, + "output": 32000 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "release_date": "2025-12-02", - "last_updated": "2025-12-02", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-03-31", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "mistralai/mistral-medium-3", - "name": "Mistral Medium 3", - "display_name": "Mistral Medium 3", + "id": "claude-opus-4-7", + "name": "claude-opus-4-7", + "display_name": "claude-opus-4-7", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 1000000, + "output": 128000 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." + ] + } }, "attachment": true, "open_weights": false, - "knowledge": "2025-03-31", - "release_date": "2025-05-07", - "last_updated": "2025-05-07", + "knowledge": "2026-01-31", + "release_date": "2026-04-16", + "last_updated": "2026-04-16", "type": "chat" }, { - "id": "mistralai/ministral-14b-2512", - "name": "Ministral 14B", - "display_name": "Ministral 14B", + "id": "MiniMax-M2", + "name": "MiniMax-M2", + "display_name": "MiniMax-M2", "modalities": { "input": [ "text" @@ -243315,24 +238431,24 @@ ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 1000000, + "output": 128000 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, "attachment": false, "open_weights": true, - "release_date": "2025-12-02", - "last_updated": "2025-12-02", + "release_date": "2025-10-27", + "last_updated": "2025-10-27", "type": "chat" }, { - "id": "mistralai/ministral-14b-instruct-2512", - "name": "Ministral 3 14B", - "display_name": "Ministral 3 14B", + "id": "gpt-5.2-chat-latest", + "name": "gpt-5.2-chat-latest", + "display_name": "gpt-5.2-chat-latest", "modalities": { "input": [ "text", @@ -243343,24 +238459,33 @@ ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 128000, + "output": 16384 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "medium" + ] + } }, "attachment": true, - "open_weights": true, - "release_date": "2025-12-02", - "last_updated": "2025-12-02", + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2025-12-11", + "last_updated": "2025-12-11", "type": "chat" }, { - "id": "mistralai/mistral-small-4-119b-2603", - "name": "Mistral Small 4 119B", - "display_name": "Mistral Small 4 119B", + "id": "grok-4.5", + "name": "Grok 4.5", + "display_name": "Grok 4.5", "modalities": { "input": [ "text", @@ -243371,8 +238496,8 @@ ] }, "limit": { - "context": 262144, - "output": 16384 + "context": 500000, + "output": 500000 }, "temperature": true, "tool_call": true, @@ -243380,17 +238505,26 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "low", + "medium", + "high" + ] + } + }, "attachment": true, - "open_weights": true, - "knowledge": "2025-06", - "release_date": "2026-03-16", - "last_updated": "2026-03-16", + "open_weights": false, + "release_date": "2026-07-08", + "last_updated": "2026-07-08", "type": "chat" }, { - "id": "mistralai/mistral-nemo-instruct-2407", - "name": "Mistral Nemo", - "display_name": "Mistral Nemo", + "id": "MiniMax-M2.5", + "name": "MiniMax-M2.5", + "display_name": "MiniMax-M2.5", "modalities": { "input": [ "text" @@ -243400,51 +238534,71 @@ ] }, "limit": { - "context": 16384, - "output": 8192 + "context": 204800, + "output": 131072 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": false, "open_weights": true, - "knowledge": "2024-07", - "release_date": "2024-07-18", - "last_updated": "2024-07-18", + "release_date": "2026-02-12", + "last_updated": "2026-02-12", "type": "chat" }, { - "id": "mistralai/devstral-small-2505", - "name": "Mistral Devstral Small 2505", - "display_name": "Mistral Devstral Small 2505", + "id": "qwen3.5-35b-a3b", + "name": "Qwen3.5 35B-A3B", + "display_name": "Qwen3.5 35B-A3B", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 32768, - "output": 8192 + "context": 262144, + "output": 65536 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": true, "open_weights": true, - "release_date": "2025-08-02", - "last_updated": "2025-08-02", + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" }, { - "id": "mistralai/mistral-small-24b-instruct-2501", - "name": "Mistral Small 24B", - "display_name": "Mistral Small 24B", + "id": "kimi-k2-thinking", + "name": "kimi-k2-thinking", + "display_name": "kimi-k2-thinking", "modalities": { "input": [ "text" @@ -243454,38 +238608,54 @@ ] }, "limit": { - "context": 32768, - "output": 8192 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2023-10-31", - "release_date": "2025-01-30", - "last_updated": "2025-01-30", + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, + "open_weights": true, + "knowledge": "2025-06", + "release_date": "2025-11-06", + "last_updated": "2025-11-06", "type": "chat" }, { - "id": "mistralai/mistral-medium-3.5", - "name": "Mistral Medium 3.5", - "display_name": "Mistral Medium 3.5", + "id": "glm-5v-turbo", + "name": "GLM-5V-Turbo", + "display_name": "GLM-5V-Turbo", "modalities": { "input": [ "text", - "image" + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 32768 + "context": 200000, + "output": 131072 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -243493,92 +238663,127 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "none", - "high" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-04-29", - "last_updated": "2026-04-29", + "open_weights": false, + "release_date": "2026-04-01", + "last_updated": "2026-04-01", "type": "chat" }, { - "id": "mistralai/mistral-large", - "name": "Mistral Large 2411", - "display_name": "Mistral Large 2411", + "id": "gpt-4.1", + "name": "gpt-4.1", + "display_name": "gpt-4.1", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 102400 + "context": 1047576, + "output": 32768 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2024-11-30", - "release_date": "2024-02-26", - "last_updated": "2024-02-26", + "knowledge": "2024-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", "type": "chat" }, { - "id": "mistralai/mistral-small-3.2-24b-instruct", - "name": "Mistral Small 3.2 24B (2506)", - "display_name": "Mistral Small 3.2 24B (2506)", + "id": "claude-opus-4-7-thinking", + "name": "claude-opus-4-7-thinking", + "display_name": "claude-opus-4-7-thinking", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 1000000, + "output": 128000 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2023-10-31", - "release_date": "2025-06-20", - "last_updated": "2025-06-20", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2026-01-31", + "release_date": "2026-04-16", + "last_updated": "2026-04-16", "type": "chat" }, { - "id": "mistralai/mistral-small-4-119b-2603:thinking", - "name": "Mistral Small 4 119B Thinking", - "display_name": "Mistral Small 4 119B Thinking", + "id": "claude-fable-5-1", + "name": "Claude Fable 5.1", + "display_name": "Claude Fable 5.1", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 16384 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -243586,36 +238791,56 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", "effort_options": [ - "none", - "high" + "low", + "medium", + "high", + "xhigh", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", + "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", + "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-06", - "release_date": "2026-03-16", - "last_updated": "2026-03-16", + "open_weights": false, + "knowledge": "2026-06", + "release_date": "2026-09-01", + "last_updated": "2026-09-01", "type": "chat" }, { - "id": "mistralai/mistral-medium-3.5:thinking", - "name": "Mistral Medium 3.5 Thinking", - "display_name": "Mistral Medium 3.5 Thinking", + "id": "gpt-5.6-sol-pro", + "name": "gpt-5.6-sol-pro", + "display_name": "gpt-5.6-sol-pro", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 32768 + "context": 1050000, + "output": 128000 }, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -243625,20 +238850,25 @@ "reasoning": { "effort_options": [ "none", - "high" + "low", + "medium", + "high", + "xhigh", + "max" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-04-30", - "last_updated": "2026-04-30", + "open_weights": false, + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "mistralai/mixtral-8x22b-instruct-v0.1", - "name": "Mixtral 8x22B", - "display_name": "Mixtral 8x22B", + "id": "glm-5.3", + "name": "GLM-5.3", + "display_name": "GLM-5.3", "modalities": { "input": [ "text" @@ -243648,106 +238878,165 @@ ] }, "limit": { - "context": 65536, - "output": 52428 + "context": 1000000, + "output": 131072 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "low", + "high", + "max" + ] + } }, "attachment": false, "open_weights": true, - "knowledge": "2024-01-31", - "release_date": "2024-04-17", - "last_updated": "2024-04-17", + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "mistralai/ministral-8b-2512", - "name": "Ministral 8B", - "display_name": "Ministral 8B", + "id": "claude-opus-4-1-20250805", + "name": "claude-opus-4-1-20250805", + "display_name": "claude-opus-4-1-20250805", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 200000, + "output": 32000 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false }, - "attachment": false, - "open_weights": true, - "release_date": "2025-12-02", - "last_updated": "2025-12-02", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-03-31", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "mistralai/mistral-saba", - "name": "Mistral Saba", - "display_name": "Mistral Saba", + "id": "gemini-3.1-flash-lite-preview", + "name": "Gemini 3.1 Flash Lite Preview", + "display_name": "Gemini 3.1 Flash Lite Preview", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 32768, - "output": 26214 + "context": 1048576, + "output": 65536 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "minimal", + "low", + "medium", + "high" + ] + } + }, + "attachment": true, "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-02-17", - "last_updated": "2025-02-17", + "knowledge": "2025-01", + "release_date": "2026-03-03", + "last_updated": "2026-03-03", "type": "chat" }, { - "id": "NeverSleep/Lumimaid-v0.2-70B", - "name": "Lumimaid v0.2", - "display_name": "Lumimaid v0.2", + "id": "mistral-large-2512", + "name": "mistral-large-2512", + "display_name": "mistral-large-2512", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 16384, - "output": 8192 + "context": 128000, + "output": 262144 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2024-01-01", - "last_updated": "2024-07-01", + "knowledge": "2024-12", + "release_date": "2025-12-02", + "last_updated": "2025-12-02", "type": "chat" }, { - "id": "meta-llama/llama-3.3-70b-instruct", - "name": "Llama 3.3 70b Instruct", - "display_name": "Llama 3.3 70b Instruct", + "id": "qwen3-235b-a22b", + "name": "Qwen3-235B-A22B", + "display_name": "Qwen3-235B-A22B", "modalities": { "input": [ "text" @@ -243757,29 +239046,43 @@ ] }, "limit": { - "context": 131072, + "context": 128000, "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, "open_weights": true, - "knowledge": "2023-12", - "release_date": "2024-12-06", - "last_updated": "2024-12-06", + "knowledge": "2025-04", + "release_date": "2025-04-28", + "last_updated": "2025-04-28", "type": "chat" }, { - "id": "meta-llama/llama-4-maverick", - "name": "Llama 4 Maverick", - "display_name": "Llama 4 Maverick", + "id": "gemini-3.1-flash-lite", + "name": "Gemini 3.1 Flash Lite", + "display_name": "Gemini 3.1 Flash Lite", "modalities": { "input": [ "text", - "image" + "image", + "video", + "audio", + "pdf" ], "output": [ "text" @@ -243792,59 +239095,74 @@ "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "minimal", + "low", + "medium", + "high" + ] + } }, "attachment": true, - "open_weights": true, - "knowledge": "2024-08", - "release_date": "2025-04-05", - "last_updated": "2025-04-05", + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2026-05-07", + "last_updated": "2026-05-07", "type": "chat" }, { - "id": "meta-llama/llama-3.2-3b-instruct", - "name": "Llama 3.2 3b Instruct", - "display_name": "Llama 3.2 3b Instruct", + "id": "qwen3.7-max", + "name": "Qwen3.7 Max", + "display_name": "Qwen3.7 Max", "modalities": { "input": [ - "text", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 1000000, + "output": 131072 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, - "open_weights": true, - "knowledge": "2023-12", - "release_date": "2024-09-25", - "last_updated": "2024-09-25", + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": false, + "open_weights": false, + "release_date": "2026-05-21", + "last_updated": "2026-05-21", "type": "chat" }, { - "id": "meta-llama/llama-4-scout", - "name": "Llama 4 Scout", - "display_name": "Llama 4 Scout", + "id": "qwen3-max-2025-09-23", + "name": "qwen3-max-2025-09-23", + "display_name": "qwen3-max-2025-09-23", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 328000, + "context": 258048, "output": 65536 }, "temperature": true, @@ -243852,130 +239170,199 @@ "reasoning": { "supported": false }, - "attachment": true, - "open_weights": true, - "knowledge": "2024-08", - "release_date": "2025-04-05", - "last_updated": "2025-04-05", + "attachment": false, + "open_weights": false, + "knowledge": "2025-04", + "release_date": "2025-09-23", + "last_updated": "2025-09-23", "type": "chat" }, { - "id": "meta-llama/llama-3.1-8b-instruct", - "name": "Llama 3.1 8b Instruct", - "display_name": "Llama 3.1 8b Instruct", + "id": "qwen3.5-plus", + "name": "Qwen3.5 Plus", + "display_name": "Qwen3.5 Plus", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 16384 + "context": 1000000, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2023-12", - "release_date": "2024-07-23", - "last_updated": "2024-07-23", + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-04", + "release_date": "2026-02-16", + "last_updated": "2026-02-16", "type": "chat" }, { - "id": "elorian/glimpse", - "name": "Elorian Glimpse", - "display_name": "Elorian Glimpse", + "id": "glm-5-turbo", + "name": "glm-5-turbo", + "display_name": "glm-5-turbo", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 256000 + "context": 200000, + "output": 131072 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": true, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, "open_weights": false, - "release_date": "2026-10-17", - "last_updated": "2026-10-17", + "release_date": "2026-03-16", + "last_updated": "2026-03-16", "type": "chat" }, { - "id": "amazon/nova-pro-v1", - "name": "Amazon Nova Pro 1.0", - "display_name": "Amazon Nova Pro 1.0", + "id": "gpt-5.1", + "name": "gpt-5.1", + "display_name": "gpt-5.1", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 300000, - "output": 32000 + "context": 400000, + "output": 128000 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, "open_weights": false, - "knowledge": "2024-10-31", - "release_date": "2024-12-05", - "last_updated": "2024-12-05", + "knowledge": "2024-09-30", + "release_date": "2025-11-13", + "last_updated": "2025-11-13", "type": "chat" }, { - "id": "amazon/nova-lite-v1", - "name": "Amazon Nova Lite 1.0", - "display_name": "Amazon Nova Lite 1.0", + "id": "gemini-2.5-flash-nothink", + "name": "gemini-2.5-flash-nothink", + "display_name": "gemini-2.5-flash-nothink", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 300000, - "output": 5120 + "context": 1000000, + "output": 65536 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "budget", + "budget": { + "default": -1, + "min": 0, + "max": 24576, + "auto": -1, + "off": 0, + "unit": "tokens" + }, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] + } + }, + "attachment": true, "open_weights": false, - "knowledge": "2024-10-31", - "release_date": "2024-12-05", - "last_updated": "2024-12-05", + "knowledge": "2025-01", + "release_date": "2025-06-17", + "last_updated": "2025-06-17", "type": "chat" }, { - "id": "amazon/nova-2-lite-v1", - "name": "Amazon Nova 2 Lite", - "display_name": "Amazon Nova 2 Lite", + "id": "glm-4.5", + "name": "GLM-4.5", + "display_name": "GLM-4.5", "modalities": { "input": [ "text" @@ -243985,40 +239372,41 @@ ] }, "limit": { - "context": 1000000, - "output": 65535 + "context": 131072, + "output": 98304 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": false, - "open_weights": false, - "knowledge": "2025-10", - "release_date": "2025-12-02", - "last_updated": "2025-12-02", + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-07-28", + "last_updated": "2025-07-28", "type": "chat" }, { - "id": "thinkingmachines/inkling:thinking", - "name": "Inkling Thinking", - "display_name": "Inkling Thinking", + "id": "kimi-k3.1-pro", + "name": "Kimi K3.1 Pro", + "display_name": "Kimi K3.1 Pro", "modalities": { "input": [ "text", "image", - "audio" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1040000, - "output": 32768 + "context": 1048576, + "output": 131072 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -244026,38 +239414,45 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ - "minimal", + "none", "low", - "medium", "high", - "xhigh" + "max" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-07-15", - "last_updated": "2026-07-15", + "open_weights": false, + "release_date": "2026-10-23", + "last_updated": "2026-10-23", "type": "chat" }, { - "id": "thinkingmachines/Inkling-Small:thinking", - "name": "Inkling Small Thinking", - "display_name": "Inkling Small Thinking", + "id": "qwen3.8-max", + "name": "Qwen3.8 Max", + "display_name": "Qwen3.8 Max", "modalities": { "input": [ "text", "image", - "audio" + "video", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 524288, - "output": 32768 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -244067,86 +239462,121 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ - "minimal", "low", "medium", - "high", - "max" + "xhigh" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-07-30", - "last_updated": "2026-07-30", + "open_weights": false, + "release_date": "2026-08-03", + "last_updated": "2026-08-03", "type": "chat" }, { - "id": "thinkingmachines/Inkling-Small", - "name": "Inkling Small", - "display_name": "Inkling Small", + "id": "gpt-6-luna", + "name": "GPT-6 Luna", + "display_name": "GPT-6 Luna", "modalities": { "input": [ "text", "image", - "audio" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 524288, - "output": 32768 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ] + } }, "attachment": true, - "open_weights": true, - "release_date": "2026-07-30", - "last_updated": "2026-07-30", + "open_weights": false, + "knowledge": "2026-05-18", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "thinkingmachines/inkling", - "name": "Inkling", - "display_name": "Inkling", + "id": "claude-opus-5-5", + "name": "Claude Opus 5.5", + "display_name": "Claude Opus 5.5", "modalities": { "input": [ "text", "image", - "audio" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048000, - "output": 32768 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } }, "attachment": true, - "open_weights": true, - "release_date": "2026-07-15", - "last_updated": "2026-07-15", + "open_weights": false, + "knowledge": "2026-06", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "microsoft/wizardlm-2-8x22b", - "name": "WizardLM-2 8x22B", - "display_name": "WizardLM-2 8x22B", + "id": "gemini-3.5-flash-thinking", + "name": "gemini-3.5-flash-thinking", + "display_name": "gemini-3.5-flash-thinking", "modalities": { "input": [ "text", + "image", + "video", + "audio", "pdf" ], "output": [ @@ -244154,225 +239584,245 @@ ] }, "limit": { - "context": 65536, - "output": 8192 + "context": 1048576, + "output": 65536 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", + "low", + "medium", + "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] + } }, "attachment": true, - "open_weights": true, - "release_date": "2024-04-15", - "last_updated": "2024-04-15", + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2026-05-19", + "last_updated": "2026-05-19", "type": "chat" }, { - "id": "bytedance-seed/seed-2.0-code", - "name": "ByteDance Seed 2.0 Code", - "display_name": "ByteDance Seed 2.0 Code", + "id": "claude-opus-4-8", + "name": "Claude Opus 4.8", + "display_name": "Claude Opus 4.8", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 131072 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "high", "effort_options": [ - "none", "low", "medium", - "high" + "high", + "xhigh", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-02-14", - "last_updated": "2026-02-14", + "knowledge": "2026-01", + "release_date": "2026-05-28", + "last_updated": "2026-05-28", "type": "chat" }, { - "id": "bytedance-seed/seed-2.0-lite", - "name": "ByteDance Seed 2.0 Lite", - "display_name": "ByteDance Seed 2.0 Lite", + "id": "doubao-seed-1-6-thinking-250715", + "name": "doubao-seed-1-6-thinking-250715", + "display_name": "doubao-seed-1-6-thinking-250715", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 131072 + "context": 256000, + "output": 16000 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": true, "open_weights": false, - "release_date": "2026-02-14", - "last_updated": "2026-02-14", + "release_date": "2025-07-15", + "last_updated": "2025-07-15", "type": "chat" }, { - "id": "bytedance-seed/seed-2-1-turbo", - "name": "ByteDance Seed 2.1 Turbo", - "display_name": "ByteDance Seed 2.1 Turbo", + "id": "doubao-seed-1-8-251215", + "name": "doubao-seed-1-8-251215", + "display_name": "doubao-seed-1-8-251215", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 235929 + "context": 224000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": true, "open_weights": false, - "release_date": "2026-06-23", - "last_updated": "2026-06-23", + "release_date": "2025-12-28", + "last_updated": "2025-12-28", "type": "chat" }, { - "id": "bytedance/doubao-seed-character", - "name": "Doubao Seed Character", - "display_name": "Doubao Seed Character", + "id": "kimi-k2.7-code", + "name": "Kimi K2.7 Code", + "display_name": "Kimi K2.7 Code", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 32768 + "context": 262144, + "output": 262144 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "none", - "high" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, "attachment": true, - "open_weights": false, - "release_date": "2026-06-23", - "last_updated": "2026-06-23", - "type": "chat" - }, - { - "id": "bytedance/doubao-seed-2.1-pro", - "name": "Doubao Seed 2.1 Pro", - "display_name": "Doubao Seed 2.1 Pro", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 256000, - "output": 128000 - }, - "temperature": true, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": false, - "release_date": "2026-06-23", - "last_updated": "2026-06-23", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-06-12", + "last_updated": "2026-06-12", "type": "chat" }, { - "id": "bytedance/doubao-seed-2.1-turbo", - "name": "Doubao Seed 2.1 Turbo", - "display_name": "Doubao Seed 2.1 Turbo", + "id": "glm-4.6v", + "name": "GLM-4.6V", + "display_name": "GLM-4.6V", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 128000 + "context": 128000, + "output": 32768 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": false, - "release_date": "2026-06-23", - "last_updated": "2026-06-23", + "attachment": true, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-12-08", + "last_updated": "2025-12-08", "type": "chat" }, { - "id": "TEE/glm-5.1", - "name": "GLM 5.1 TEE", - "display_name": "GLM 5.1 TEE", + "id": "qwen3.6-flash", + "name": "Qwen3.6 Flash", + "display_name": "Qwen3.6 Flash", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 202752, - "output": 65535 + "context": 1000000, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -244383,65 +239833,90 @@ "extra_capabilities": { "reasoning": { "supported": true, - "effort_options": [ - "none", - "high" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-04-07", - "last_updated": "2026-04-07", + "attachment": true, + "open_weights": false, + "release_date": "2026-04-27", + "last_updated": "2026-04-27", "type": "chat" }, { - "id": "TEE/qwen3.8-27b", - "name": "Qwen3.8 27B TEE", - "display_name": "Qwen3.8 27B TEE", + "id": "gpt-5-mini", + "name": "gpt-5-mini", + "display_name": "gpt-5-mini", "modalities": { "input": [ - "text", - "image", - "video" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "minimal", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, "attachment": true, - "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "open_weights": false, + "knowledge": "2024-05-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "TEE/glm-5.1-thinking", - "name": "GLM 5.1 Thinking TEE", - "display_name": "GLM 5.1 Thinking TEE", + "id": "claude-opus-5", + "name": "Claude Opus 5", + "display_name": "Claude Opus 5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 202752, - "output": 65535 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -244449,63 +239924,84 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ - "none", - "high" + "low", + "medium", + "high", + "xhigh", + "max" ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-04-07", - "last_updated": "2026-04-07", + "attachment": true, + "open_weights": false, + "knowledge": "2026-05", + "release_date": "2026-07-24", + "last_updated": "2026-07-24", "type": "chat" }, { - "id": "TEE/qwen3.5-397b-a17b", - "name": "Qwen3.5 397B A17B TEE", - "display_name": "Qwen3.5 397B A17B TEE", + "id": "claude-haiku-4-5-20251001", + "name": "claude-haiku-4-5-20251001", + "display_name": "claude-haiku-4-5-20251001", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 200000, + "output": 64000 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-02-15", - "last_updated": "2026-02-15", + "attachment": true, + "open_weights": false, + "knowledge": "2025-02-28", + "release_date": "2025-10-15", + "last_updated": "2025-10-15", "type": "chat" }, { - "id": "TEE/qwen3.6-35b-a3b", - "name": "Qwen3.6 35B A3B TEE", - "display_name": "Qwen3.6 35B A3B TEE", + "id": "qwen3.6-35b-a3b", + "name": "Qwen3.6 35B-A3B", + "display_name": "Qwen3.6 35B-A3B", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" @@ -244513,12 +240009,13 @@ }, "limit": { "context": 262144, - "output": 262144 + "output": 65536 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { @@ -244531,93 +240028,88 @@ ] } }, - "attachment": false, + "attachment": true, "open_weights": true, "release_date": "2026-04-17", "last_updated": "2026-04-17", "type": "chat" }, { - "id": "TEE/gemma4-31b", - "name": "Gemma 4 31B", - "display_name": "Gemma 4 31B", + "id": "deepseek-v3.2-thinking", + "name": "DeepSeek-V3.2-Thinking", + "display_name": "DeepSeek-V3.2-Thinking", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 131072 + "context": 128000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "knowledge": "2024-12", + "release_date": "2025-12-01", + "last_updated": "2025-12-01", "type": "chat" }, { - "id": "TEE/kimi-k2.7-code", - "name": "Kimi K2.7 Code TEE", - "display_name": "Kimi K2.7 Code TEE", + "id": "qwen3.7-max-2026-06-08", + "name": "qwen3.7-max-2026-06-08", + "display_name": "qwen3.7-max-2026-06-08", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 1000000, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, - "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-06-12", - "last_updated": "2026-06-12", + "attachment": false, + "open_weights": false, + "release_date": "2026-05-21", + "last_updated": "2026-05-21", "type": "chat" }, { - "id": "TEE/gemma-4-31b-it", - "name": "Gemma 4 31B IT TEE", - "display_name": "Gemma 4 31B IT TEE", + "id": "gpt-6-sol", + "name": "GPT-6 Sol", + "display_name": "GPT-6 Sol", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -244625,23 +240117,31 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "attachment": true, + "open_weights": false, + "knowledge": "2026-04-20", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "TEE/llama3-3-70b", - "name": "Llama 3.3 70B", - "display_name": "Llama 3.3 70B", + "id": "ministral-14b-2512", + "name": "ministral-14b-2512", + "display_name": "ministral-14b-2512", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" @@ -244649,115 +240149,86 @@ }, "limit": { "context": 128000, - "output": 16384 + "output": 128000 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2023-12", - "release_date": "2024-12-06", - "last_updated": "2024-12-06", + "knowledge": "2024-12", + "release_date": "2025-12-02", + "last_updated": "2025-12-02", "type": "chat" }, { - "id": "TEE/qwen3.5-27b", - "name": "Qwen3.5 27B TEE", - "display_name": "Qwen3.5 27B TEE", + "id": "gemini-2.5-flash", + "name": "gemini-2.5-flash", + "display_name": "gemini-2.5-flash", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, + "context": 1000000, "output": 65536 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": true, + "mode": "budget", + "budget": { + "default": -1, + "min": 0, + "max": 24576, + "auto": -1, + "off": 0, + "unit": "tokens" + }, "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" + "thought_signatures" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-02-23", - "last_updated": "2026-02-23", - "type": "chat" - }, - { - "id": "TEE/nemotron-3.5-lightning", - "name": "Nvidia Nemotron 3.5 Lightning TEE", - "display_name": "Nvidia Nemotron 3.5 Lightning TEE", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 262144, - "output": 65536 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "none", - "low", - "medium", - "high" - ] - } - }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-09", - "release_date": "2026-08-11", - "last_updated": "2026-08-11", + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2025-06-17", + "last_updated": "2025-06-17", "type": "chat" }, { - "id": "TEE/glm-5.3", - "name": "GLM 5.3 TEE", - "display_name": "GLM 5.3 TEE", + "id": "deepseek-flash", + "name": "DeepSeek V4.1 Flash", + "display_name": "DeepSeek V4.1 Flash", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 1000000, + "output": 384000 }, "temperature": true, "tool_call": true, @@ -244768,6 +240239,12 @@ "extra_capabilities": { "reasoning": { "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ "low", "high", @@ -244775,16 +240252,17 @@ ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "knowledge": "2025-05", + "release_date": "2026-09-10", + "last_updated": "2026-09-10", "type": "chat" }, { - "id": "TEE/kimi-k2.6", - "name": "Kimi K2.6 TEE", - "display_name": "Kimi K2.6 TEE", + "id": "grok-4-fast-reasoning", + "name": "grok-4-fast-reasoning", + "display_name": "grok-4-fast-reasoning", "modalities": { "input": [ "text", @@ -244795,42 +240273,39 @@ ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 2000000, + "output": 30000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": true, + "default": true }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-20", - "last_updated": "2026-04-20", + "open_weights": false, + "knowledge": "2025-06", + "release_date": "2025-12-18", + "last_updated": "2025-12-18", "type": "chat" }, { - "id": "TEE/kimi-k3", - "name": "Kimi K3 TEE", - "display_name": "Kimi K3 TEE", + "id": "claude-haiku-5-5", + "name": "Claude Haiku 5.5", + "display_name": "Claude Haiku 5.5", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65535 + "context": 1000000, + "output": 128000 }, "temperature": false, "tool_call": true, @@ -244840,24 +240315,26 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ "low", + "medium", "high", + "xhigh", "max" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-16", + "open_weights": false, + "knowledge": "2026-06", + "release_date": "2026-10-07", + "last_updated": "2026-10-07", "type": "chat" }, { - "id": "TEE/qwen3.6-27b", - "name": "Qwen3.6 27B TEE", - "display_name": "Qwen3.6 27B TEE", + "id": "gpt-5", + "name": "gpt-5", + "display_name": "gpt-5", "modalities": { "input": [ "text", @@ -244868,11 +240345,11 @@ ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 400000, + "output": 128000 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { "supported": true, "default": true @@ -244880,24 +240357,35 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "minimal", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, - "open_weights": true, - "release_date": "2026-04-22", - "last_updated": "2026-04-22", + "open_weights": false, + "knowledge": "2024-09-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "TEE/glm-5.2:thinking", - "name": "GLM 5.2 Thinking TEE", - "display_name": "GLM 5.2 Thinking TEE", + "id": "glm-4.6", + "name": "glm-4.6", + "display_name": "glm-4.6", "modalities": { "input": [ "text" @@ -244907,7 +240395,7 @@ ] }, "limit": { - "context": 1048576, + "context": 204800, "output": 131072 }, "temperature": true, @@ -244918,29 +240406,25 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ] + "supported": true } }, "attachment": false, "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "knowledge": "2025-04", + "release_date": "2025-09-30", + "last_updated": "2025-09-30", "type": "chat" }, { - "id": "TEE/gemma4-31b:thinking", - "name": "Gemma 4 31B Thinking TEE", - "display_name": "Gemma 4 31B Thinking TEE", + "id": "kimi-k2.6", + "name": "Kimi K2.6", + "display_name": "Kimi K2.6", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" @@ -244948,7 +240432,7 @@ }, "limit": { "context": 262144, - "output": 131072 + "output": 262144 }, "temperature": true, "tool_call": true, @@ -244956,28 +240440,42 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, "attachment": true, "open_weights": true, "knowledge": "2025-01", - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "release_date": "2026-04-20", + "last_updated": "2026-04-20", "type": "chat" }, { - "id": "TEE/gpt-oss-120b", - "name": "GPT-OSS 120B TEE", - "display_name": "GPT-OSS 120B TEE", + "id": "gemini-3.1-flash-image-preview", + "name": "gemini-3.1-flash-image-preview", + "display_name": "gemini-3.1-flash-image-preview", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ - "text" + "text", + "image" ] }, "limit": { "context": 131072, - "output": 16384 + "output": 32768 }, "temperature": true, "tool_call": false, @@ -244989,30 +240487,31 @@ "supported": true } }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", - "type": "chat" + "attachment": true, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2026-02-26", + "last_updated": "2026-02-26" }, { - "id": "TEE/glm-5.2", - "name": "GLM 5.2 TEE", - "display_name": "GLM 5.2 TEE", + "id": "gpt-6.1-sol", + "name": "GPT-6.1 Sol", + "display_name": "GPT-6.1 Sol", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -245020,19 +240519,26 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "attachment": true, + "open_weights": false, + "knowledge": "2026-04-30", + "release_date": "2026-09-29", + "last_updated": "2026-09-29", "type": "chat" }, { - "id": "TEE/deepseek-v4.1-flash", - "name": "DeepSeek V4.1 Flash TEE", - "display_name": "DeepSeek V4.1 Flash TEE", + "id": "gpt-5.1-chat-latest", + "name": "gpt-5.1-chat-latest", + "display_name": "gpt-5.1-chat-latest", "modalities": { "input": [ "text", @@ -245043,10 +240549,10 @@ ] }, "limit": { - "context": 1048576, - "output": 384000 + "context": 128000, + "output": 16384 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -245054,56 +240560,50 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ - "none", - "low", - "medium", - "high", - "max" + "medium" ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-09-10", - "last_updated": "2026-09-10", + "open_weights": false, + "knowledge": "2024-09-30", + "release_date": "2025-11-13", + "last_updated": "2025-11-13", "type": "chat" }, { - "id": "TEE/qwen2.5-vl-72b-instruct", - "name": "Qwen2.5 VL 72B TEE", - "display_name": "Qwen2.5 VL 72B TEE", + "id": "qwen3-coder-480b-a35b-instruct", + "name": "qwen3-coder-480b-a35b-instruct", + "display_name": "qwen3-coder-480b-a35b-instruct", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 65536, - "output": 8192 + "context": 262144, + "output": 65536 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2024-04", - "release_date": "2025-01-26", - "last_updated": "2025-01-26", + "knowledge": "2025-04", + "release_date": "2025-07-22", + "last_updated": "2025-07-22", "type": "chat" }, { - "id": "TEE/glm-5.3-flash", - "name": "GLM 5.3 Flash TEE", - "display_name": "GLM 5.3 Flash TEE", + "id": "gpt-5.2", + "name": "gpt-5.2", + "display_name": "gpt-5.2", "modalities": { "input": [ "text", @@ -245114,94 +240614,125 @@ ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", "effort_options": [ + "none", "low", + "medium", "high", - "max" - ] + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, - "open_weights": true, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2025-12-11", + "last_updated": "2025-12-11", "type": "chat" }, { - "id": "TEE/deepseek-v3.2", - "name": "DeepSeek V3.2 TEE", - "display_name": "DeepSeek V3.2 TEE", + "id": "claude-sonnet-5-5", + "name": "Claude Sonnet 5.5", + "display_name": "Claude Sonnet 5.5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 164000, - "output": 65536 + "context": 1000000, + "output": 128000 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-07", - "release_date": "2025-12-01", - "last_updated": "2025-12-01", + "attachment": true, + "open_weights": false, + "knowledge": "2026-06", + "release_date": "2026-09-28", + "last_updated": "2026-09-28", "type": "chat" }, { - "id": "TEE/gemma-4-26b-a4b-uncensored", - "name": "Gemma 4 26B A4B Uncensored TEE", - "display_name": "Gemma 4 26B A4B Uncensored TEE", + "id": "MiniMax-M3", + "name": "MiniMax-M3", + "display_name": "MiniMax-M3", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 65536, - "output": 65536 + "context": 1048576, + "output": 512000 }, + "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": true, "open_weights": true, - "release_date": "2026-05-23", - "last_updated": "2026-05-23", + "release_date": "2026-06-01", + "last_updated": "2026-06-01", "type": "chat" }, { - "id": "ornith-ai/ornith-1.5-35b-a3b", - "name": "Ornith 1.5 35B", - "display_name": "Ornith 1.5 35B", + "id": "gpt-5-pro", + "name": "gpt-5-pro", + "display_name": "gpt-5-pro", "modalities": { "input": [ "text", @@ -245212,37 +240743,56 @@ ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 400000, + "output": 272000 }, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "fixed", + "effort": "high", + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, "attachment": true, - "open_weights": true, - "release_date": "2026-07-29", - "last_updated": "2026-08-20", + "open_weights": false, + "knowledge": "2024-09-30", + "release_date": "2025-10-06", + "last_updated": "2025-10-06", "type": "chat" }, { - "id": "ornith-ai/ornith-1.5-122b", - "name": "Ornith 1.5 122B", - "display_name": "Ornith 1.5 122B", + "id": "glm-4.5v", + "name": "GLM-4.5V", + "display_name": "GLM-4.5V", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 64000, + "output": 16384 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -245250,55 +240800,73 @@ }, "attachment": true, "open_weights": true, - "release_date": "2026-10-20", - "last_updated": "2026-10-20", + "knowledge": "2025-04", + "release_date": "2025-08-11", + "last_updated": "2025-08-11", "type": "chat" }, { - "id": "ornith-ai/ornith-1.5-35b-a3b:thinking", - "name": "Ornith 1.5 35B Thinking", - "display_name": "Ornith 1.5 35B Thinking", + "id": "claude-sonnet-5", + "name": "Claude Sonnet 5", + "display_name": "Claude Sonnet 5", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 1000000, + "output": 128000 }, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + }, "attachment": true, - "open_weights": true, - "release_date": "2026-07-29", - "last_updated": "2026-08-20", + "open_weights": false, + "knowledge": "2026-01-31", + "release_date": "2026-06-30", + "last_updated": "2026-06-30", "type": "chat" }, { - "id": "inception/mercury-3", - "name": "Mercury 3", - "display_name": "Mercury 3", + "id": "o3", + "name": "o3", + "display_name": "o3", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 200000, + "output": 100000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -245306,62 +240874,110 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ - "none", "low", "medium", "high" - ] + ], + "visibility": "hidden" } }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-10-16", - "last_updated": "2026-10-20", + "knowledge": "2024-05", + "release_date": "2025-04-16", + "last_updated": "2025-04-16", "type": "chat" }, { - "id": "inception/mercury-2.5-preview", - "name": "Mercury 2.5 Preview", - "display_name": "Mercury 2.5 Preview", + "id": "gemini-2.5-flash-image", + "name": "gemini-2.5-flash-image", + "display_name": "gemini-2.5-flash-image", "modalities": { "input": [ - "text" + "text", + "image" + ], + "output": [ + "text", + "image" + ] + }, + "limit": { + "context": 32768, + "output": 32768 + }, + "temperature": true, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2025-08-26", + "last_updated": "2025-08-26" + }, + { + "id": "gpt-5.4-nano", + "name": "gpt-5.4-nano", + "display_name": "gpt-5.4-nano", + "modalities": { + "input": [ + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 260000, - "output": 65536 + "context": 400000, + "output": 128000 }, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", "effort_options": [ "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ "low", "medium", "high" - ] + ], + "visibility": "hidden" } }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-09-01", - "last_updated": "2026-09-01", + "knowledge": "2025-08-31", + "release_date": "2026-03-17", + "last_updated": "2026-03-17", "type": "chat" }, { - "id": "Envoid/Llama-3.05-Nemotron-Tenyxchat-Storybreaker-70B", - "name": "Nemotron Tenyxchat Storybreaker 70b", - "display_name": "Nemotron Tenyxchat Storybreaker 70b", + "id": "MiniMax-M2.1", + "name": "MiniMax-M2.1", + "display_name": "MiniMax-M2.1", "modalities": { "input": [ "text" @@ -245371,23 +240987,30 @@ ] }, "limit": { - "context": 16384, - "output": 8192 + "context": 204800, + "output": 131072 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": false, "open_weights": true, - "release_date": "2024-01-01", - "last_updated": "2024-12-01", + "release_date": "2025-12-23", + "last_updated": "2025-12-23", "type": "chat" }, { - "id": "Envoid/Llama-3.05-NT-Storybreaker-Ministral-70B", - "name": "Llama 3.05 Storybreaker Ministral 70b", - "display_name": "Llama 3.05 Storybreaker Ministral 70b", + "id": "deepseek-v3.2", + "name": "deepseek-v3.2", + "display_name": "deepseek-v3.2", "modalities": { "input": [ "text" @@ -245397,77 +241020,42 @@ ] }, "limit": { - "context": 16384, + "context": 128000, "output": 8192 }, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": true, - "release_date": "2024-01-01", - "last_updated": "2024-12-01", - "type": "chat" - }, - { - "id": "xiaomi/mimo-v2.5", - "name": "MiMo V2.5", - "display_name": "MiMo V2.5", - "modalities": { - "input": [ - "text", - "image", - "audio", - "video" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 1048576, - "output": 131072 - }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": true }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "none", - "high" - ] + "supported": true } }, - "attachment": true, + "attachment": false, "open_weights": true, "knowledge": "2024-12", - "release_date": "2026-04-22", - "last_updated": "2026-04-22", + "release_date": "2025-12-01", + "last_updated": "2025-12-01", "type": "chat" }, { - "id": "xiaomi/mimo-v2.6-pro", - "name": "MiMo V2.6 Pro", - "display_name": "MiMo V2.6 Pro", + "id": "gemini-2.5-flash-preview-09-2025", + "name": "gemini-2.5-flash-preview-09-2025", + "display_name": "gemini-2.5-flash-preview-09-2025", "modalities": { "input": [ "text", - "image", - "audio", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 1000000, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -245477,36 +241065,47 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "none", - "high" + "supported": true, + "default_enabled": true, + "mode": "budget", + "budget": { + "default": -1, + "min": 0, + "max": 24576, + "auto": -1, + "off": 0, + "unit": "tokens" + }, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2025-09-26", + "last_updated": "2025-09-26", "type": "chat" }, { - "id": "xiaomi/mimo-v2.6-pro-ultraspeed", - "name": "MiMo V2.6 Pro UltraSpeed", - "display_name": "MiMo V2.6 Pro UltraSpeed", + "id": "gpt-5-thinking", + "name": "gpt-5-thinking", + "display_name": "gpt-5-thinking", "modalities": { "input": [ "text", - "image", - "audio", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 400000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -245514,68 +241113,71 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "high" - ] - } - }, "attachment": true, - "open_weights": true, - "release_date": "2026-09-21", - "last_updated": "2026-09-21", + "open_weights": false, + "knowledge": "2024-10", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "xiaomi/mimo-v2.5:thinking", - "name": "MiMo V2.5 Thinking", - "display_name": "MiMo V2.5 Thinking", + "id": "gemini-3-pro-image-preview", + "name": "gemini-3-pro-image-preview", + "display_name": "gemini-3-pro-image-preview", "modalities": { "input": [ "text", - "image", - "audio", - "video" + "image" ], "output": [ - "text" + "text", + "image" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 32768, + "output": 64000 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "none", + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "low", "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2024-12", - "release_date": "2026-04-22", - "last_updated": "2026-04-22", - "type": "chat" + "open_weights": false, + "knowledge": "2025-06", + "release_date": "2025-11-20", + "last_updated": "2025-11-20" }, { - "id": "xiaomi/mimo-v2.6-flash-abliterated", - "name": "MiMo V2.6 Flash Abliterated", - "display_name": "MiMo V2.6 Flash Abliterated", + "id": "gemini-4-argon", + "name": "Gemini 4 Argon", + "display_name": "Gemini 4 Argon", "modalities": { "input": [ "text", - "image" + "image", + "video", + "audio", + "pdf" ], "output": [ "text" @@ -245585,6 +241187,7 @@ "context": 1048576, "output": 65536 }, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -245593,21 +241196,23 @@ "extra_capabilities": { "reasoning": { "effort_options": [ - "none", + "low", + "medium", "high" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-09-25", - "last_updated": "2026-09-25", + "open_weights": false, + "knowledge": "2026-03", + "release_date": "2026-10-13", + "last_updated": "2026-10-13", "type": "chat" }, { - "id": "xiaomi/mimo-v2.6-flash-uncensored", - "name": "MiMo V2.6 Flash Uncensored", - "display_name": "MiMo V2.6 Flash Uncensored", + "id": "gpt-5.3-chat-latest", + "name": "GPT-5.3 Chat (latest)", + "display_name": "GPT-5.3 Chat (latest)", "modalities": { "input": [ "text", @@ -245618,74 +241223,61 @@ ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 128000, + "output": 16384 }, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "high" - ] - } + "supported": false }, "attachment": true, - "open_weights": true, - "release_date": "2026-09-25", - "last_updated": "2026-09-25", + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-03-03", + "last_updated": "2026-03-03", "type": "chat" }, { - "id": "xiaomi/mimo-v2.5-pro:thinking", - "name": "MiMo V2.5 Pro Thinking", - "display_name": "MiMo V2.5 Pro Thinking", + "id": "grok-4.1", + "name": "grok-4.1", + "display_name": "grok-4.1", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "high" - ] - } + "supported": false }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-12", - "release_date": "2026-04-22", - "last_updated": "2026-04-22", + "attachment": true, + "open_weights": false, + "knowledge": "2025-06", + "release_date": "2025-11-18", + "last_updated": "2025-11-18", "type": "chat" }, { - "id": "xiaomi/mimo-v2.5-pro", - "name": "MiMo V2.5 Pro", - "display_name": "MiMo V2.5 Pro", + "id": "gemini-3.7-flash", + "name": "Gemini 3.7 Flash", + "display_name": "Gemini 3.7 Flash", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio", + "pdf" ], "output": [ "text" @@ -245693,7 +241285,7 @@ }, "limit": { "context": 1048576, - "output": 131072 + "output": 65536 }, "temperature": true, "tool_call": true, @@ -245703,36 +241295,47 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "none", + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", + "low", + "medium", "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-12", - "release_date": "2026-04-22", - "last_updated": "2026-04-22", + "attachment": true, + "open_weights": false, + "knowledge": "2026-03", + "release_date": "2026-08-13", + "last_updated": "2026-08-13", "type": "chat" }, { - "id": "xiaomi/mimo-v2.6-flash-uncensored:thinking", - "name": "MiMo V2.6 Flash Uncensored Thinking", - "display_name": "MiMo V2.6 Flash Uncensored Thinking", + "id": "glm-5", + "name": "glm-5", + "display_name": "glm-5", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 204800, + "output": 131072 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -245740,26 +241343,29 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "max" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-09-26", - "last_updated": "2026-09-26", + "release_date": "2026-02-12", + "last_updated": "2026-02-12", "type": "chat" }, { - "id": "xiaomi/mimo-v2.6-flash", - "name": "MiMo V2.6 Flash", - "display_name": "MiMo V2.6 Flash", + "id": "qwen3.7-plus", + "name": "Qwen3.7 Plus", + "display_name": "Qwen3.7 Plus", "modalities": { "input": [ "text", "image", - "audio", "video" ], "output": [ @@ -245767,8 +241373,8 @@ ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 1000000, + "output": 64000 }, "temperature": true, "tool_call": true, @@ -245778,44 +241384,35 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "none", - "high" - ] + "supported": true } }, "attachment": true, - "open_weights": true, - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "open_weights": false, + "knowledge": "2025-04", + "release_date": "2026-06-02", + "last_updated": "2026-06-02", "type": "chat" - } - ] - }, - "drun": { - "id": "drun", - "name": "D.Run (China)", - "display_name": "D.Run (China)", - "api": "https://chat.d.run/v1", - "doc": "https://www.d.run", - "models": [ + }, { - "id": "public/minimax-m25", - "name": "MiniMax M2.5", - "display_name": "MiniMax M2.5", + "id": "kimi-k3", + "name": "Kimi K3", + "display_name": "Kimi K3", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 204800, + "context": 1048576, "output": 131072 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -245829,19 +241426,24 @@ "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "effort_options": [ + "low", + "high", + "max" ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-02-12", - "last_updated": "2026-02-12", + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" }, { - "id": "public/deepseek-v3", - "name": "DeepSeek V3", - "display_name": "DeepSeek V3", + "id": "qwen3-235b-a22b-instruct-2507", + "name": "qwen3-235b-a22b-instruct-2507", + "display_name": "qwen3-235b-a22b-instruct-2507", "modalities": { "input": [ "text" @@ -245851,8 +241453,8 @@ ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 128000, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -245861,26 +241463,28 @@ }, "attachment": false, "open_weights": true, - "knowledge": "2024-07", - "release_date": "2024-12-26", - "last_updated": "2024-12-26", + "knowledge": "2025-04", + "release_date": "2025-07-21", + "last_updated": "2025-07-21", "type": "chat" }, { - "id": "public/deepseek-r1", - "name": "DeepSeek R1", - "display_name": "DeepSeek R1", + "id": "qwen3.8-flash", + "name": "Qwen3.8 Flash", + "display_name": "Qwen3.8 Flash", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 32000 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -245896,41 +241500,37 @@ "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "effort_options": [ + "low", + "medium", + "xhigh" ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-12", - "release_date": "2025-01-20", - "last_updated": "2025-05-29", + "attachment": true, + "open_weights": false, + "release_date": "2026-08-26", + "last_updated": "2026-08-26", "type": "chat" - } - ] - }, - "snowflake-cortex": { - "id": "snowflake-cortex", - "name": "Snowflake Cortex", - "display_name": "Snowflake Cortex", - "api": "https://${SNOWFLAKE_ACCOUNT}.snowflakecomputing.com/api/v2/cortex/v1", - "doc": "https://docs.snowflake.com/en/user-guide/snowflake-cortex/cortex-rest-api", - "models": [ + }, { - "id": "openai-gpt-5.6-sol", - "name": "GPT-5.6 Sol", - "display_name": "GPT-5.6 Sol", + "id": "kimi-k2.5", + "name": "Kimi K2.5", + "display_name": "Kimi K2.5", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 262144, + "output": 262144 }, "temperature": false, "tool_call": true, @@ -245940,58 +241540,90 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "none", - "minimal", - "low", - "medium", - "high" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-01-27", + "last_updated": "2026-01-27", "type": "chat" }, { - "id": "snowflake-llama3.3-70b", - "name": "Llama-3.3-70B-Instruct", - "display_name": "Llama-3.3-70B-Instruct", + "id": "claude-sonnet-4-6-thinking", + "name": "claude-sonnet-4-6-thinking", + "display_name": "claude-sonnet-4-6-thinking", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 1000000, + "output": 64000 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2023-12", - "release_date": "2024-12-06", - "last_updated": "2024-12-06", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-02-17", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "claude-opus-4-7", - "name": "Claude Opus 4.7", - "display_name": "Claude Opus 4.7", + "id": "grok-4.3", + "name": "Grok 4.3", + "display_name": "Grok 4.3", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" @@ -245999,116 +241631,104 @@ }, "limit": { "context": 1000000, - "output": 128000 + "output": 30000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "high", "effort_options": [ + "none", "low", "medium", - "high", - "xhigh", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." + "high" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-04-16", - "last_updated": "2026-04-16", + "release_date": "2026-04-17", + "last_updated": "2026-04-17", "type": "chat" }, { - "id": "claude-sonnet-4-5", - "name": "Claude Sonnet 4.5 (latest)", - "display_name": "Claude Sonnet 4.5 (latest)", + "id": "gpt-5.5", + "name": "GPT-5.5", + "display_name": "GPT-5.5", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high", + "xhigh" ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." - ] + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2025-07-31", - "release_date": "2025-09-29", - "last_updated": "2025-09-29", + "knowledge": "2025-12-01", + "release_date": "2026-04-23", + "last_updated": "2026-04-23", "type": "chat" }, { - "id": "openai-gpt-5", - "name": "GPT-5", - "display_name": "GPT-5", + "id": "gemini-3.5-flash", + "name": "Gemini 3.5 Flash", + "display_name": "Gemini 3.5 Flash", "modalities": { "input": [ "text", - "image" + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 272000, - "output": 8192 + "context": 1048576, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -246116,81 +241736,79 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "none", + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ "minimal", "low", "medium", "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "knowledge": "2025-01", + "release_date": "2026-05-19", + "last_updated": "2026-05-19", "type": "chat" }, { - "id": "claude-haiku-4-5", - "name": "Claude Haiku 4.5 (latest)", - "display_name": "Claude Haiku 4.5 (latest)", + "id": "qwen3-30b-a3b", + "name": "Qwen3-30B-A3B", + "display_name": "Qwen3-30B-A3B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 128000, + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": false + "supported": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-02-28", - "release_date": "2025-10-15", - "last_updated": "2025-10-15", + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-04-28", + "last_updated": "2025-04-28", "type": "chat" }, { - "id": "claude-sonnet-5", - "name": "Claude Sonnet 5", - "display_name": "Claude Sonnet 5", + "id": "glm-5.3-flash", + "name": "GLM-5.3-Flash", + "display_name": "GLM-5.3-Flash", "modalities": { "input": [ "text", - "image" + "image", + "video", + "pdf" ], "output": [ "text" @@ -246198,9 +241816,9 @@ }, "limit": { "context": 1000000, - "output": 64000 + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -246208,34 +241826,43 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "low", + "high", + "max" + ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-30", - "last_updated": "2026-06-30", + "open_weights": true, + "release_date": "2026-08-26", + "last_updated": "2026-08-26", "type": "chat" }, { - "id": "openai-gpt-5-mini", - "name": "GPT-5 Mini", - "display_name": "GPT-5 Mini", + "id": "glm-4.7", + "name": "glm-4.7", + "display_name": "glm-4.7", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 272000, - "output": 8192 + "context": 204800, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -246243,38 +241870,39 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "none", - "minimal", - "low", - "medium", - "high" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-05-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-12-22", + "last_updated": "2025-12-22", "type": "chat" }, { - "id": "openai-gpt-4.1", - "name": "GPT-4.1", - "display_name": "GPT-4.1", + "id": "gpt-4.1-mini", + "name": "gpt-4.1-mini", + "display_name": "gpt-4.1-mini", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 32000 + "context": 1047576, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -246289,13 +241917,14 @@ "type": "chat" }, { - "id": "claude-opus-4-5", - "name": "Claude Opus 4.5 (latest)", - "display_name": "Claude Opus 4.5 (latest)", + "id": "claude-sonnet-4-5-20250929", + "name": "claude-sonnet-4-5-20250929", + "display_name": "claude-sonnet-4-5-20250929", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" @@ -246315,17 +241944,11 @@ "reasoning": { "supported": true, "default_enabled": false, - "mode": "mixed", + "mode": "budget", "budget": { "min": 1024, "unit": "tokens" }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high" - ], "interleaved": true, "summaries": true, "visibility": "summary", @@ -246333,36 +241956,39 @@ "thinking_blocks" ], "notes": [ - "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-05", - "release_date": "2025-11-24", - "last_updated": "2025-11-24", + "knowledge": "2025-07-31", + "release_date": "2025-09-29", + "last_updated": "2025-09-29", "type": "chat" }, { - "id": "openai-gpt-5.6-terra", - "name": "GPT-5.6 Terra", - "display_name": "GPT-5.6 Terra", + "id": "gemini-3.8-flash", + "name": "Gemini 3.8 Flash", + "display_name": "Gemini 3.8 Flash", "modalities": { "input": [ "text", - "image" + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1048576, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -246370,30 +241996,38 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "none", + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ "minimal", "low", "medium", "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "release_date": "2026-09-02", + "last_updated": "2026-09-02", "type": "chat" }, { - "id": "openai-gpt-5.4", - "name": "GPT-5.4", - "display_name": "GPT-5.4", + "id": "gpt-6-astra", + "name": "GPT-6 Astra", + "display_name": "GPT-6 Astra", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" @@ -246403,7 +242037,7 @@ "context": 1050000, "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -246411,65 +242045,39 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ - "none", - "minimal", "low", "medium", - "high" + "high", + "xhigh", + "max" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-05", - "last_updated": "2026-03-05", - "type": "chat" - }, - { - "id": "mistral-large2", - "name": "Mistral Large 2407", - "display_name": "Mistral Large 2407", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 128000, - "output": 8192 - }, - "temperature": true, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-03-31", - "release_date": "2024-07-24", - "last_updated": "2024-07-24", + "knowledge": "2026-04-30", + "release_date": "2026-09-04", + "last_updated": "2026-09-04", "type": "chat" }, { - "id": "claude-opus-5", - "name": "Claude Opus 5", - "display_name": "Claude Opus 5", + "id": "gpt-5.6-terra-pro", + "name": "gpt-5.6-terra-pro", + "display_name": "gpt-5.6-terra-pro", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, + "context": 1050000, "output": 128000 }, "temperature": false, @@ -246480,34 +242088,40 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-05", - "release_date": "2026-07-24", - "last_updated": "2026-07-24", + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "openai-gpt-5-nano", - "name": "GPT-5 Nano", - "display_name": "GPT-5 Nano", + "id": "glm-5.1", + "name": "GLM-5.1", + "display_name": "GLM-5.1", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 272000, - "output": 8192 + "context": 200000, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -246515,38 +242129,40 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "none", - "minimal", - "low", - "medium", - "high" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-05-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "attachment": false, + "open_weights": true, + "release_date": "2026-04-07", + "last_updated": "2026-04-07", "type": "chat" }, { - "id": "openai-gpt-5.1", - "name": "GPT-5.1", - "display_name": "GPT-5.1", + "id": "gemini-3.6-flash", + "name": "Gemini 3.6 Flash", + "display_name": "Gemini 3.6 Flash", "modalities": { "input": [ "text", - "image" + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 272000, - "output": 8192 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -246556,37 +242172,46 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "none", + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ "minimal", "low", "medium", "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-11-13", - "last_updated": "2025-11-13", + "knowledge": "2026-03", + "release_date": "2026-07-21", + "last_updated": "2026-07-21", "type": "chat" }, { - "id": "claude-sonnet-4-6", - "name": "Claude Sonnet 4.6", - "display_name": "Claude Sonnet 4.6", + "id": "claude-opus-4-5-20251101", + "name": "claude-opus-4-5-20251101", + "display_name": "claude-opus-4-5-20251101", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, + "context": 200000, "output": 64000 }, "temperature": true, @@ -246608,8 +242233,7 @@ "effort_options": [ "low", "medium", - "high", - "max" + "high" ], "interleaved": true, "summaries": true, @@ -246618,75 +242242,35 @@ "thinking_blocks" ], "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." - ] - } - }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-17", - "last_updated": "2026-03-13", - "type": "chat" - }, - { - "id": "openai-gpt-5.5", - "name": "GPT-5.5", - "display_name": "GPT-5.5", - "modalities": { - "input": [ - "text", - "image" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 1050000, - "output": 128000 - }, - "temperature": false, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "minimal", - "low", - "medium", - "high" + "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-12-01", - "release_date": "2026-04-23", - "last_updated": "2026-04-23", + "knowledge": "2025-03-31", + "release_date": "2025-11-24", + "last_updated": "2025-11-24", "type": "chat" }, { - "id": "openai-gpt-5.2", - "name": "GPT-5.2", - "display_name": "GPT-5.2", + "id": "grok-4.7", + "name": "Grok 4.7", + "display_name": "Grok 4.7", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 500000, + "output": 500000 }, "temperature": true, "tool_call": true, @@ -246696,61 +242280,61 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ - "none", - "minimal", "low", "medium", - "high" + "high", + "xhigh" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2025-12-11", - "last_updated": "2025-12-11", + "knowledge": "2026-05", + "release_date": "2026-09-21", + "last_updated": "2026-09-21", "type": "chat" }, { - "id": "claude-opus-4-6", - "name": "Claude Opus 4.6", - "display_name": "Claude Opus 4.6", + "id": "claude-sonnet-4-5-20250929-thinking", + "name": "claude-sonnet-4-5-20250929-thinking", + "display_name": "claude-sonnet-4-5-20250929-thinking", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "mixed", + "default_enabled": true, + "mode": "budget", "budget": { "min": 1024, "unit": "tokens" }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "max" - ], "interleaved": true, "summaries": true, "visibility": "summary", @@ -246758,29 +242342,25 @@ "thinking_blocks" ], "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-05-31", - "release_date": "2026-02-05", - "last_updated": "2026-03-13", + "knowledge": "2025-03", + "release_date": "2025-09-29", + "last_updated": "2025-09-29", "type": "chat" }, { - "id": "gemini-3.1-pro", - "name": "Gemini 3.1 Pro Preview", - "display_name": "Gemini 3.1 Pro Preview", + "id": "MiniMax-M1", + "name": "MiniMax-M1", + "display_name": "MiniMax-M1", "modalities": { "input": [ - "text", - "image", - "video", - "audio", - "pdf" + "text" ], "output": [ "text" @@ -246788,42 +242368,32 @@ }, "limit": { "context": 1000000, - "output": 64000 + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "low", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-02-19", - "last_updated": "2026-02-19", + "release_date": "2025-06-16", + "last_updated": "2025-06-16", "type": "chat" - }, + } + ] + }, + "infomaniak": { + "id": "infomaniak", + "name": "Infomaniak", + "display_name": "Infomaniak", + "api": "https://api.infomaniak.com/2/ai/${INFOMANIAK_PRODUCT_ID}/openai/v1", + "doc": "https://www.infomaniak.com/en/hosting/ai-services/open-source-models", + "models": [ { - "id": "deepseek-r1", - "name": "DeepSeek-R1", - "display_name": "DeepSeek-R1", + "id": "mini_lm_l12_v2", + "name": "All-MiniLM-L12-v2", + "display_name": "All-MiniLM-L12-v2", "modalities": { "input": [ "text" @@ -246833,78 +242403,51 @@ ] }, "limit": { - "context": 128000, - "output": 32768 + "context": 128, + "output": 384 }, - "temperature": true, + "temperature": false, "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": false, "open_weights": true, - "knowledge": "2024-07", - "release_date": "2025-01-20", - "last_updated": "2025-05-29", - "type": "chat" + "release_date": "2021-08-30", + "last_updated": "2021-08-30", + "type": "embedding" }, { - "id": "openai-gpt-5.6-luna", - "name": "GPT-5.6 Luna", - "display_name": "GPT-5.6 Luna", + "id": "bge_multilingual_gemma2", + "name": "BGE Multilingual Gemma2", + "display_name": "BGE Multilingual Gemma2", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 8000, + "output": 3584 }, "temperature": false, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "minimal", - "low", - "medium", - "high" - ] - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", - "type": "chat" + "attachment": false, + "open_weights": true, + "release_date": "2024-07-25", + "last_updated": "2026-08-01", + "type": "embedding" }, { - "id": "claude-opus-4-8", - "name": "Claude Opus 4.8", - "display_name": "Claude Opus 4.8", + "id": "moonshotai/Kimi-K2.6", + "name": "Kimi K2.6", + "display_name": "Kimi K2.6", "modalities": { "input": [ "text", @@ -246915,129 +242458,72 @@ ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 256000, + "output": 256000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." - ] + "interleaved": true } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-01", - "release_date": "2026-05-28", - "last_updated": "2026-05-28", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-04-20", + "last_updated": "2026-04-20", "type": "chat" }, { - "id": "claude-fable-5", - "name": "Claude Fable 5", - "display_name": "Claude Fable 5", + "id": "swiss-ai/Apertus-v1.5-70B", + "name": "Apertus v1.5 70B", + "display_name": "Apertus v1.5 70B", "modalities": { "input": [ "text", - "image" + "image", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 100000, + "output": 8192 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", - "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", - "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." - ] - } + "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-09", - "last_updated": "2026-06-09", + "open_weights": true, + "release_date": "2026-07-24", + "last_updated": "2026-08-01", "type": "chat" - } - ] - }, - "tinfoil": { - "id": "tinfoil", - "name": "Tinfoil", - "display_name": "Tinfoil", - "api": "https://inference.tinfoil.sh/v1", - "doc": "https://docs.tinfoil.sh", - "models": [ + }, { - "id": "deepseek-v4-1-flash", - "name": "DeepSeek V4.1 Flash", - "display_name": "DeepSeek V4.1 Flash", + "id": "nvidia/NVIDIA-Nemotron-3-Nano-30B-A3B-FP8", + "name": "Nemotron 3 Nano 30B A3B FP8", + "display_name": "Nemotron 3 Nano 30B A3B FP8", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 384000 + "context": 1000000, + "output": 262144 }, "temperature": true, "tool_call": true, @@ -247047,28 +242533,21 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "none", - "minimal", - "low", - "medium", - "high", - "xhigh", - "max" - ] + "supported": true, + "interleaved": true } }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-09-10", - "last_updated": "2026-09-10", + "knowledge": "2025-06-25", + "release_date": "2025-12-15", + "last_updated": "2025-12-15", "type": "chat" }, { - "id": "gemma4-31b", - "name": "Gemma 4 31B IT", - "display_name": "Gemma 4 31B IT", + "id": "Qwen/Qwen3.5-122B-A10B-FP8", + "name": "Qwen3.5 122B-A10B FP8", + "display_name": "Qwen3.5 122B-A10B FP8", "modalities": { "input": [ "text", @@ -247079,8 +242558,8 @@ ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 200000, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -247090,99 +242569,107 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "none", - "minimal", - "low", - "medium", - "high", - "xhigh", - "max" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, "attachment": true, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" }, { - "id": "llama3-3-70b", - "name": "Llama-3.3-70B-Instruct", - "display_name": "Llama-3.3-70B-Instruct", + "id": "Qwen/Qwen3.5-397B-A17B-FP8", + "name": "Qwen3.5 397B-A17B FP8", + "display_name": "Qwen3.5 397B-A17B FP8", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 4096 + "context": 200000, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": true, "open_weights": true, - "knowledge": "2023-12", - "release_date": "2024-12-06", - "last_updated": "2024-12-06", + "release_date": "2026-02-15", + "last_updated": "2026-02-15", "type": "chat" }, { - "id": "gpt-oss-safeguard-120b", - "name": "gpt-oss-safeguard-120b", - "display_name": "gpt-oss-safeguard-120b", + "id": "mistralai/Ministral-3-14B-Instruct-2512", + "name": "Ministral 3 14B Instruct", + "display_name": "Ministral 3 14B Instruct", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 100000, + "output": 25600 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-10-29", - "last_updated": "2025-10-29", + "release_date": "2025-12-02", + "last_updated": "2025-12-02", "type": "chat" }, { - "id": "kimi-k3", - "name": "Kimi K3", - "display_name": "Kimi K3", + "id": "mistralai/Mistral-Small-4-119B-2603", + "name": "Mistral Small 4", + "display_name": "Mistral Small 4", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 131072 + "context": 256000, + "output": 256000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -247191,23 +242678,20 @@ "extra_capabilities": { "reasoning": { "supported": true, - "effort_options": [ - "low", - "high", - "max" - ] + "interleaved": true } }, "attachment": true, "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-16", + "knowledge": "2025-06", + "release_date": "2026-03-16", + "last_updated": "2026-03-16", "type": "chat" }, { - "id": "nomic-embed-text", - "name": "Nomic Embed Text v1.5", - "display_name": "Nomic Embed Text v1.5", + "id": "google/gemma-4-31B-it", + "name": "Gemma 4 31B IT", + "display_name": "Gemma 4 31B IT", "modalities": { "input": [ "text" @@ -247217,24 +242701,40 @@ ] }, "limit": { - "context": 8192, - "output": 768 + "context": 100000, + "output": 32768 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": false, "open_weights": true, - "release_date": "2024-02", - "last_updated": "2024-02", + "knowledge": "2025-01", + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" - }, + } + ] + }, + "minimax-cn": { + "id": "minimax-cn", + "name": "MiniMax (minimax.cn)", + "display_name": "MiniMax (minimax.cn)", + "api": "https://api.minimax.cn/anthropic/v1", + "doc": "https://platform.minimaxi.com/docs/guides/quickstart", + "models": [ { - "id": "gpt-oss-120b", - "name": "gpt-oss-120b", - "display_name": "gpt-oss-120b", + "id": "MiniMax-M2.7", + "name": "MiniMax-M2.7", + "display_name": "MiniMax-M2.7", "modalities": { "input": [ "text" @@ -247244,8 +242744,8 @@ ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 204800, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -247256,24 +242756,24 @@ "extra_capabilities": { "reasoning": { "supported": true, - "effort_options": [ - "low", - "medium", - "high" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, "attachment": false, "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "release_date": "2026-03-18", + "last_updated": "2026-03-18", "type": "chat" }, { - "id": "glm-5-3", - "name": "GLM-5.3", - "display_name": "GLM-5.3", + "id": "MiniMax-M2", + "name": "MiniMax-M2", + "display_name": "MiniMax-M2", "modalities": { "input": [ "text" @@ -247283,7 +242783,7 @@ ] }, "limit": { - "context": 1048576, + "context": 204800, "output": 131072 }, "temperature": true, @@ -247292,48 +242792,26 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "high", - "max" - ] - } - }, "attachment": false, "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "release_date": "2025-10-27", + "last_updated": "2025-10-27", "type": "chat" - } - ] - }, - "orcarouter": { - "id": "orcarouter", - "name": "OrcaRouter", - "display_name": "OrcaRouter", - "api": "https://api.orcarouter.ai/v1", - "doc": "https://docs.orcarouter.ai", - "models": [ + }, { - "id": "meta/muse-spark-1.2", - "name": "Muse Spark 1.2", - "display_name": "Muse Spark 1.2", + "id": "MiniMax-M2.5", + "name": "MiniMax-M2.5", + "display_name": "MiniMax-M2.5", "modalities": { "input": [ - "text", - "image", - "video", - "pdf", - "audio" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, + "context": 204800, "output": 131072 }, "temperature": true, @@ -247344,31 +242822,23 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "effort_options": [ - "minimal", - "low", - "medium", - "high", - "xhigh" - ] + "supported": true } }, - "attachment": true, - "open_weights": false, - "release_date": "2026-08-05", - "last_updated": "2026-08-05", + "attachment": false, + "open_weights": true, + "release_date": "2026-02-12", + "last_updated": "2026-02-12", "type": "chat" }, { - "id": "meta/muse-spark-1.1", - "name": "Muse Spark 1.1", - "display_name": "Muse Spark 1.1", + "id": "MiniMax-M3.1-Flash", + "name": "MiniMax-M3.1-Flash", + "display_name": "MiniMax-M3.1-Flash", "modalities": { "input": [ "text", "image", - "pdf", "video" ], "output": [ @@ -247376,8 +242846,8 @@ ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 1000000, + "output": 524288 }, "temperature": true, "tool_call": true, @@ -247387,41 +242857,38 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ - "minimal", "low", "medium", "high", - "xhigh" + "xhigh", + "max" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-04-08", - "last_updated": "2026-07-09", + "release_date": "2026-10-19", + "last_updated": "2026-10-19", "type": "chat" }, { - "id": "google/gemini-flash-latest", - "name": "Gemini Flash Latest", - "display_name": "Gemini Flash Latest", + "id": "MiniMax-M3", + "name": "MiniMax-M3", + "display_name": "MiniMax-M3", "modalities": { "input": [ "text", "image", - "video", - "audio", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 1000000, + "output": 524288 }, "temperature": true, "tool_call": true, @@ -247431,36 +242898,30 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "low", - "medium", - "high" - ] + "supported": true } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-08-13", - "last_updated": "2026-08-13", + "open_weights": true, + "release_date": "2026-06-01", + "last_updated": "2026-06-25", "type": "chat" }, { - "id": "google/gemma-4-31b-it", - "name": "Gemma 4 31B IT", - "display_name": "Gemma 4 31B IT", + "id": "MiniMax-M2.1", + "name": "MiniMax-M2.1", + "display_name": "MiniMax-M2.1", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 204800, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -247473,32 +242934,27 @@ "supported": true } }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "release_date": "2025-12-23", + "last_updated": "2025-12-23", "type": "chat" }, { - "id": "google/gemini-2.5-pro", - "name": "Gemini 2.5 Pro", - "display_name": "Gemini 2.5 Pro", + "id": "MiniMax-M2.5-highspeed", + "name": "MiniMax-M2.5-highspeed", + "display_name": "MiniMax-M2.5-highspeed", "modalities": { "input": [ - "text", - "image", - "audio", - "video", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 204800, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -247508,49 +242964,30 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "budget", - "budget": { - "default": -1, - "min": 128, - "max": 32768, - "auto": -1, - "unit": "tokens" - }, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] + "supported": true } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-06-17", - "last_updated": "2025-06-17", + "attachment": false, + "open_weights": true, + "release_date": "2026-02-13", + "last_updated": "2026-02-13", "type": "chat" }, { - "id": "google/gemini-3.5-flash", - "name": "Gemini 3.5 Flash", - "display_name": "Gemini 3.5 Flash", + "id": "MiniMax-M2.7-highspeed", + "name": "MiniMax-M2.7-highspeed", + "display_name": "MiniMax-M2.7-highspeed", "modalities": { "input": [ - "text", - "image", - "video", - "audio", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 204800, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -247561,48 +242998,45 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", - "low", - "medium", - "high" - ], + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-05-19", - "last_updated": "2026-05-19", + "attachment": false, + "open_weights": true, + "release_date": "2026-03-18", + "last_updated": "2026-03-18", "type": "chat" - }, + } + ] + }, + "thinkingmachines": { + "id": "thinkingmachines", + "name": "Thinking Machines", + "display_name": "Thinking Machines", + "api": "https://tinker.thinkingmachines.dev/services/tinker-prod/anthropic/api/v1", + "doc": "https://tinker-docs.thinkingmachines.ai/tinker/compatible-apis/anthropic/", + "models": [ { - "id": "google/gemini-3.5-flash-lite", - "name": "Gemini 3.5 Flash Lite", - "display_name": "Gemini 3.5 Flash Lite", + "id": "moonshotai/Kimi-K2.6", + "name": "Kimi K2.6", + "display_name": "Kimi K2.6", "modalities": { "input": [ "text", - "image", - "video", - "audio", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 32768, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -247612,32 +243046,24 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "effort_options": [ - "minimal", - "low", - "medium", - "high" - ] + "supported": true } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-07-21", - "last_updated": "2026-07-21", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-04-20", + "last_updated": "2026-04-20", "type": "chat" }, { - "id": "google/gemini-robotics-er-1.6-preview", - "name": "Gemini Robotics-ER 1.6 Preview", - "display_name": "Gemini Robotics-ER 1.6 Preview", + "id": "moonshotai/Kimi-K2.6:peft:131072", + "name": "Kimi K2.6", + "display_name": "Kimi K2.6", "modalities": { "input": [ "text", - "image", - "video", - "audio" + "image" ], "output": [ "text" @@ -247645,7 +243071,7 @@ }, "limit": { "context": 131072, - "output": 65536 + "output": 131072 }, "temperature": true, "tool_call": true, @@ -247654,31 +243080,27 @@ "default": true }, "attachment": true, - "open_weights": false, + "open_weights": true, "knowledge": "2025-01", - "release_date": "2026-04-14", - "last_updated": "2026-04-14", + "release_date": "2026-04-20", + "last_updated": "2026-04-20", "type": "chat" }, { - "id": "google/gemini-3.1-pro-preview", - "name": "Gemini 3.1 Pro Preview", - "display_name": "Gemini 3.1 Pro Preview", + "id": "openai/gpt-oss-20b", + "name": "GPT OSS 20B", + "display_name": "GPT OSS 20B", "modalities": { "input": [ - "text", - "image", - "video", - "audio", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 32768, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -247688,47 +243110,31 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "low", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] + "supported": true } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-02-19", - "last_updated": "2026-02-19", + "attachment": false, + "open_weights": true, + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "google/gemini-2.5-flash", - "name": "Gemini 2.5 Flash", - "display_name": "Gemini 2.5 Flash", + "id": "openai/gpt-oss-120b:peft:131072", + "name": "GPT OSS 120B", + "display_name": "GPT OSS 120B", "modalities": { "input": [ - "text", - "image", - "audio", - "video", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 131072, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -247736,52 +243142,28 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "budget", - "budget": { - "default": -1, - "min": 0, - "max": 24576, - "auto": -1, - "off": 0, - "unit": "tokens" - }, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] - } - }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-06-17", - "last_updated": "2025-06-17", + "attachment": false, + "open_weights": true, + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "google/gemini-flash-lite-latest", - "name": "Gemini Flash-Lite Latest", - "display_name": "Gemini Flash-Lite Latest", + "id": "openai/gpt-oss-120b", + "name": "GPT OSS 120B", + "display_name": "GPT OSS 120B", "modalities": { "input": [ - "text", - "image", - "video", - "audio", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 32768, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -247791,91 +243173,30 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "minimal", - "low", - "medium", - "high" - ] + "supported": true } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-07-21", - "last_updated": "2026-07-21", + "attachment": false, + "open_weights": true, + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "google/gemini-2.5-flash-lite", - "name": "Gemini 2.5 Flash-Lite", - "display_name": "Gemini 2.5 Flash-Lite", + "id": "nvidia/NVIDIA-Nemotron-3-Ultra-550B-A55B-BF16", + "name": "Nemotron 3 Ultra 550B A55B", + "display_name": "Nemotron 3 Ultra 550B A55B", "modalities": { "input": [ - "text", - "image", - "audio", - "video", - "pdf" - ], - "output": [ "text" - ] - }, - "limit": { - "context": 1048576, - "output": 65536 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "default": -1, - "min": 512, - "max": 24576, - "auto": -1, - "unit": "tokens" - }, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] - } - }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-06-17", - "last_updated": "2025-06-17", - "type": "chat" - }, - { - "id": "google/gemini-3-flash-preview", - "name": "Gemini 3 Flash Preview", - "display_name": "Gemini 3 Flash Preview", - "modalities": { - "input": [ - "text", - "image", - "video", - "audio", - "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, + "context": 65536, "output": 65536 }, "temperature": true, @@ -247884,51 +243205,28 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", - "low", - "medium", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] - } - }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-12-17", - "last_updated": "2025-12-17", + "attachment": false, + "open_weights": true, + "knowledge": "2025-09", + "release_date": "2026-06-04", + "last_updated": "2026-06-04", "type": "chat" }, { - "id": "google/gemini-3.6-flash", - "name": "Gemini 3.6 Flash", - "display_name": "Gemini 3.6 Flash", + "id": "nvidia/NVIDIA-Nemotron-3-Ultra-550B-A55B-BF16:peft:262144", + "name": "Nemotron 3 Ultra 550B A55B", + "display_name": "Nemotron 3 Ultra 550B A55B", "modalities": { "input": [ - "text", - "image", - "video", - "audio", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, @@ -247936,51 +243234,29 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", - "low", - "medium", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] - } - }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-07-21", - "last_updated": "2026-07-21", + "attachment": false, + "open_weights": true, + "knowledge": "2025-09", + "release_date": "2026-06-04", + "last_updated": "2026-06-04", "type": "chat" }, { - "id": "google/gemini-3.1-flash-lite-preview", - "name": "Gemini 3.1 Flash Lite Preview", - "display_name": "Gemini 3.1 Flash Lite Preview", + "id": "nvidia/NVIDIA-Nemotron-3.5-Super-VL-120B-A12B-BF16:peft:262144", + "name": "Nemotron 3.5 Super VL 120B A12B", + "display_name": "Nemotron 3.5 Super VL 120B A12B", "modalities": { "input": [ "text", - "image", - "video", - "audio", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, @@ -247988,41 +243264,27 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "minimal", - "low", - "medium", - "high" - ] - } - }, "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-03-03", - "last_updated": "2026-03-03", + "open_weights": true, + "release_date": "2026-10-15", + "last_updated": "2026-10-15", "type": "chat" }, { - "id": "google/gemini-3.1-pro-preview-customtools", - "name": "Gemini 3.1 Pro Preview Custom Tools", - "display_name": "Gemini 3.1 Pro Preview Custom Tools", + "id": "nvidia/NVIDIA-Nemotron-3.5-Super-VL-120B-A12B-BF16", + "name": "Nemotron 3.5 Super VL 120B A12B", + "display_name": "Nemotron 3.5 Super VL 120B A12B", "modalities": { "input": [ "text", - "image", - "video", - "audio", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, + "context": 65536, "output": 65536 }, "temperature": true, @@ -248031,49 +243293,27 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "low", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] - } - }, "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-02-19", - "last_updated": "2026-02-19", + "open_weights": true, + "release_date": "2026-10-15", + "last_updated": "2026-10-15", "type": "chat" }, { - "id": "google/gemini-3.1-flash-lite", - "name": "Gemini 3.1 Flash Lite", - "display_name": "Gemini 3.1 Flash Lite", + "id": "nvidia/NVIDIA-Nemotron-3.5-Lightning-30B-A3B-BF16:peft:262144", + "name": "Nemotron 3.5 Lightning 30B A3B", + "display_name": "Nemotron 3.5 Lightning 30B A3B", "modalities": { "input": [ - "text", - "image", - "video", - "audio", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, @@ -248081,32 +243321,20 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "minimal", - "low", - "medium", - "high" - ] - } - }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-05-07", - "last_updated": "2026-05-07", + "attachment": false, + "open_weights": true, + "knowledge": "2025-09", + "release_date": "2026-08-11", + "last_updated": "2026-08-11", "type": "chat" }, { - "id": "google/gemma-4-26b-a4b-it", - "name": "Gemma 4 26B A4B IT", - "display_name": "Gemma 4 26B A4B IT", + "id": "nvidia/NVIDIA-Nemotron-3-Super-120B-A12B-BF16:peft:262144", + "name": "Nemotron 3 Super 120B A12B", + "display_name": "Nemotron 3 Super 120B A12B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" @@ -248114,7 +243342,7 @@ }, "limit": { "context": 262144, - "output": 32768 + "output": 262144 }, "temperature": true, "tool_call": true, @@ -248122,21 +243350,17 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "knowledge": "2025-06", + "release_date": "2026-03-11", + "last_updated": "2026-03-11", "type": "chat" }, { - "id": "minimax/minimax-m2.5", - "name": "MiniMax-M2.5", - "display_name": "MiniMax-M2.5", + "id": "nvidia/NVIDIA-Nemotron-3.5-Lightning-30B-A3B-BF16", + "name": "Nemotron 3.5 Lightning 30B A3B", + "display_name": "Nemotron 3.5 Lightning 30B A3B", "modalities": { "input": [ "text" @@ -248146,8 +243370,8 @@ ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 65536, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -248155,21 +243379,17 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, "attachment": false, "open_weights": true, - "release_date": "2026-02-12", - "last_updated": "2026-02-12", + "knowledge": "2025-09", + "release_date": "2026-08-11", + "last_updated": "2026-08-11", "type": "chat" }, { - "id": "minimax/minimax-m2.5-highspeed", - "name": "MiniMax-M2.5-highspeed", - "display_name": "MiniMax-M2.5-highspeed", + "id": "nvidia/NVIDIA-Nemotron-3-Super-120B-A12B-BF16", + "name": "Nemotron 3 Super 120B A12B", + "display_name": "Nemotron 3 Super 120B A12B", "modalities": { "input": [ "text" @@ -248179,8 +243399,8 @@ ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 65536, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -248188,34 +243408,28 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, "attachment": false, "open_weights": true, - "release_date": "2026-02-13", - "last_updated": "2026-02-13", + "knowledge": "2025-06", + "release_date": "2026-03-11", + "last_updated": "2026-03-11", "type": "chat" }, { - "id": "minimax/minimax-m3", - "name": "MiniMax-M3", - "display_name": "MiniMax-M3", + "id": "nvidia/NVIDIA-Nemotron-3-Nano-30B-A3B-BF16", + "name": "Nemotron 3 Nano 30B A3B", + "display_name": "Nemotron 3 Nano 30B A3B", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 512000 + "context": 65536, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -248223,32 +243437,29 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-06-01", - "last_updated": "2026-06-01", + "knowledge": "2025-06-25", + "release_date": "2025-12-15", + "last_updated": "2025-12-15", "type": "chat" }, { - "id": "minimax/minimax-m2.7", - "name": "MiniMax-M2.7", - "display_name": "MiniMax-M2.7", + "id": "Qwen/Qwen3.5-397B-A17B:peft:262144", + "name": "Qwen3.5 397B-A17B", + "display_name": "Qwen3.5 397B-A17B", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, @@ -248267,16 +243478,16 @@ ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-03-18", - "last_updated": "2026-03-18", + "release_date": "2026-02-15", + "last_updated": "2026-02-15", "type": "chat" }, { - "id": "minimax/minimax-m2.7-highspeed", - "name": "MiniMax-M2.7-highspeed", - "display_name": "MiniMax-M2.7-highspeed", + "id": "Qwen/Qwen3.5-35B-A3B-Base", + "name": "Qwen3.5 35B-A3B Base", + "display_name": "Qwen3.5 35B-A3B Base", "modalities": { "input": [ "text" @@ -248286,14 +243497,13 @@ ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 65536, + "output": 65536 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": true }, "extra_capabilities": { "reasoning": { @@ -248308,14 +243518,14 @@ }, "attachment": false, "open_weights": true, - "release_date": "2026-03-18", - "last_updated": "2026-03-18", + "release_date": "2026-02-24", + "last_updated": "2026-02-24", "type": "chat" }, { - "id": "openai/gpt-5.2", - "name": "GPT-5.2", - "display_name": "GPT-5.2", + "id": "Qwen/Qwen3.6-35B-A3B", + "name": "Qwen3.6 35B-A3B", + "display_name": "Qwen3.6 35B-A3B", "modalities": { "input": [ "text", @@ -248326,48 +243536,36 @@ ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 65536, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2025-12-11", - "last_updated": "2025-12-11", + "open_weights": true, + "release_date": "2026-04-17", + "last_updated": "2026-04-17", "type": "chat" }, { - "id": "openai/gpt-5.4-mini", - "name": "GPT-5.4 mini", - "display_name": "GPT-5.4 mini", + "id": "Qwen/Qwen3.5-9B", + "name": "Qwen3.5 9B", + "display_name": "Qwen3.5 9B", "modalities": { "input": [ "text", @@ -248378,117 +243576,79 @@ ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 65536, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-17", - "last_updated": "2026-03-17", + "open_weights": true, + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" }, { - "id": "openai/gpt-5.6-sol", - "name": "GPT-5.6 Sol", - "display_name": "GPT-5.6 Sol", + "id": "Qwen/Qwen3.8-27B:peft:262144", + "name": "Qwen3.8 27B", + "display_name": "Qwen3.8 27B", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 262144, + "output": 262144 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } - }, "attachment": true, - "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "open_weights": true, + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "openai/gpt-5.2-codex", - "name": "GPT-5.2 Codex", - "display_name": "GPT-5.2 Codex", + "id": "Qwen/Qwen3.5-397B-A17B", + "name": "Qwen3.5 397B-A17B", + "display_name": "Qwen3.5 397B-A17B", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 65536, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -248497,76 +243657,53 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2025-12-11", - "last_updated": "2025-12-11", + "open_weights": true, + "release_date": "2026-02-15", + "last_updated": "2026-02-15", "type": "chat" }, { - "id": "openai/gpt-5.5-pro", - "name": "GPT-5.5 Pro", - "display_name": "GPT-5.5 Pro", + "id": "Qwen/Qwen3.5-4B:peft:262144", + "name": "Qwen3.5 4B", + "display_name": "Qwen3.5 4B", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 100000 + "context": 262144, + "output": 262144 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "medium", - "high", - "xhigh" - ] - } - }, "attachment": true, - "open_weights": false, - "knowledge": "2025-12-01", - "release_date": "2026-04-23", - "last_updated": "2026-04-23", + "open_weights": true, + "release_date": "2026-03-02", + "last_updated": "2026-03-02", "type": "chat" }, { - "id": "openai/gpt-5-nano", - "name": "GPT-5 Nano", - "display_name": "GPT-5 Nano", + "id": "Qwen/Qwen3.6-35B-A3B:peft:262144", + "name": "Qwen3.6 35B-A3B", + "display_name": "Qwen3.6 35B-A3B", "modalities": { "input": [ "text", @@ -248577,10 +243714,10 @@ ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 262144, + "output": 262144 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -248589,35 +243726,24 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "minimal", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2024-05-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "open_weights": true, + "release_date": "2026-04-17", + "last_updated": "2026-04-17", "type": "chat" }, { - "id": "openai/gpt-5-chat-latest", - "name": "GPT-5 Chat (latest)", - "display_name": "GPT-5 Chat (latest)", + "id": "Qwen/Qwen3.8-27B", + "name": "Qwen3.8 27B", + "display_name": "Qwen3.8 27B", "modalities": { "input": [ "text", @@ -248628,158 +243754,64 @@ ] }, "limit": { - "context": 400000, - "output": 100000 - }, - "temperature": false, - "tool_call": false, - "reasoning": { - "supported": true, - "default": true - }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", - "type": "chat" - }, - { - "id": "openai/gpt-4o", - "name": "GPT-4o", - "display_name": "GPT-4o", - "modalities": { - "input": [ - "text", - "image", - "pdf" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 128000, - "output": 16384 + "context": 65536, + "output": 65536 }, "temperature": true, "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": false, - "knowledge": "2023-09", - "release_date": "2024-05-13", - "last_updated": "2024-08-06", - "type": "chat" - }, - { - "id": "openai/gpt-5.2-pro", - "name": "GPT-5.2 Pro", - "display_name": "GPT-5.2 Pro", - "modalities": { - "input": [ - "text", - "image" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 400000, - "output": 128000 - }, - "temperature": false, - "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } - }, "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2025-12-11", - "last_updated": "2025-12-11", + "open_weights": true, + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "openai/gpt-5.4-nano", - "name": "GPT-5.4 nano", - "display_name": "GPT-5.4 nano", + "id": "Qwen/Qwen3-8B", + "name": "Qwen3 8B", + "display_name": "Qwen3 8B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 32768, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-17", - "last_updated": "2026-03-17", + "attachment": false, + "open_weights": true, + "release_date": "2025-04-29", + "last_updated": "2025-04-29", "type": "chat" }, { - "id": "openai/gpt-3.5-turbo", - "name": "GPT-3.5-turbo", - "display_name": "GPT-3.5-turbo", + "id": "Qwen/Qwen3.5-9B-Base", + "name": "Qwen3.5 9B Base", + "display_name": "Qwen3.5 9B Base", "modalities": { "input": [ "text" @@ -248789,94 +243821,49 @@ ] }, "limit": { - "context": 16385, - "output": 4096 + "context": 65536, + "output": 65536 }, "temperature": true, "tool_call": false, "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": false, - "knowledge": "2021-09-01", - "release_date": "2023-03-01", - "last_updated": "2023-11-06", - "type": "chat" - }, - { - "id": "openai/gpt-5.6-luna", - "name": "GPT-5.6 Luna", - "display_name": "GPT-5.6 Luna", - "modalities": { - "input": [ - "text", - "image", - "pdf" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 1050000, - "output": 128000 - }, - "temperature": false, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true + "supported": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "attachment": false, + "open_weights": true, + "release_date": "2026-02-26", + "last_updated": "2026-02-26", "type": "chat" }, { - "id": "openai/gpt-5.6-terra", - "name": "GPT-5.6 Terra", - "display_name": "GPT-5.6 Terra", + "id": "Qwen/Qwen3.6-27B", + "name": "Qwen3.6 27B", + "display_name": "Qwen3.6 27B", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 65536, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -248885,37 +243872,24 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "open_weights": true, + "release_date": "2026-04-22", + "last_updated": "2026-04-22", "type": "chat" }, { - "id": "openai/gpt-4o-2024-05-13", - "name": "GPT-4o (2024-05-13)", - "display_name": "GPT-4o (2024-05-13)", + "id": "Qwen/Qwen3.5-4B", + "name": "Qwen3.5 4B", + "display_name": "Qwen3.5 4B", "modalities": { "input": [ "text", @@ -248926,40 +243900,11 @@ ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 65536, + "output": 65536 }, "temperature": true, "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": false, - "knowledge": "2023-09", - "release_date": "2024-05-13", - "last_updated": "2024-05-13", - "type": "chat" - }, - { - "id": "openai/gpt-5-pro", - "name": "GPT-5 Pro", - "display_name": "GPT-5 Pro", - "modalities": { - "input": [ - "text", - "image" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 400000, - "output": 272000 - }, - "temperature": false, - "tool_call": true, "reasoning": { "supported": true, "default": true @@ -248967,42 +243912,36 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "fixed", - "effort": "high", - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-10-06", - "last_updated": "2025-10-06", + "open_weights": true, + "release_date": "2026-03-02", + "last_updated": "2026-03-02", "type": "chat" }, { - "id": "openai/gpt-5.3-codex", - "name": "GPT-5.3 Codex", - "display_name": "GPT-5.3 Codex", + "id": "thinkingmachines/Inkling-Small:peft:262144", + "name": "Inkling Small", + "display_name": "Inkling Small", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, @@ -249012,118 +243951,65 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", "effort_options": [ "low", "medium", "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "xhigh", + "max" + ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-05", - "last_updated": "2026-02-05", + "open_weights": true, + "release_date": "2026-07-30", + "last_updated": "2026-07-30", "type": "chat" }, { - "id": "openai/gpt-5.4", - "name": "GPT-5.4", - "display_name": "GPT-5.4", + "id": "thinkingmachines/Inkling:peft:262144", + "name": "Inkling (256K)", + "display_name": "Inkling (256K)", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", "effort_options": [ - "none", "low", "medium", "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "xhigh", + "max" + ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-05", - "last_updated": "2026-03-05", - "type": "chat" - }, - { - "id": "openai/gpt-4o-2024-11-20", - "name": "GPT-4o (2024-11-20)", - "display_name": "GPT-4o (2024-11-20)", - "modalities": { - "input": [ - "text", - "image" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 128000, - "output": 16384 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": false, - "knowledge": "2023-09", - "release_date": "2024-11-20", - "last_updated": "2024-11-20", + "open_weights": true, + "release_date": "2026-07-15", + "last_updated": "2026-07-15", "type": "chat" }, { - "id": "openai/gpt-5.1", - "name": "GPT-5.1", - "display_name": "GPT-5.1", + "id": "thinkingmachines/Inkling:peft:262144:sampling-nvfp4", + "name": "Inkling", + "display_name": "Inkling", "modalities": { "input": [ "text", @@ -249134,47 +244020,36 @@ ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", "effort_options": [ - "none", "low", "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "high", + "xhigh", + "max" + ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-11-13", - "last_updated": "2025-11-13", + "open_weights": true, + "release_date": "2026-07-15", + "last_updated": "2026-07-15", "type": "chat" }, { - "id": "openai/gpt-4o-2024-08-06", - "name": "GPT-4o (2024-08-06)", - "display_name": "GPT-4o (2024-08-06)", + "id": "thinkingmachines/Inkling-Small:peft:262144:sampling-nvfp4", + "name": "Inkling Small", + "display_name": "Inkling Small", "modalities": { "input": [ "text", @@ -249185,66 +244060,8 @@ ] }, "limit": { - "context": 128000, - "output": 16384 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": false, - "knowledge": "2023-09", - "release_date": "2024-08-06", - "last_updated": "2024-08-06", - "type": "chat" - }, - { - "id": "openai/gpt-4.1-mini", - "name": "GPT-4.1 mini", - "display_name": "GPT-4.1 mini", - "modalities": { - "input": [ - "text", - "image", - "pdf" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 1047576, - "output": 32768 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-04-14", - "last_updated": "2025-04-14", - "type": "chat" - }, - { - "id": "openai/gpt-oss-120b", - "name": "GPT OSS 120B", - "display_name": "GPT OSS 120B", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 131072, - "output": 32768 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, @@ -249254,40 +244071,39 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ "low", "medium", - "high" + "high", + "xhigh", + "max" ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "release_date": "2026-07-30", + "last_updated": "2026-07-30", "type": "chat" }, { - "id": "openai/gpt-5.5", - "name": "GPT-5.5", - "display_name": "GPT-5.5", + "id": "thinkingmachines/Inkling", + "name": "Inkling", + "display_name": "Inkling", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 65536, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -249295,66 +244111,25 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", "effort_options": [ "low", "medium", "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "xhigh", + "max" + ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-12-01", - "release_date": "2026-04-23", - "last_updated": "2026-04-23", - "type": "chat" - }, - { - "id": "openai/gpt-4o-mini", - "name": "GPT-4o mini", - "display_name": "GPT-4o mini", - "modalities": { - "input": [ - "text", - "image", - "pdf" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 128000, - "output": 16384 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": false, - "knowledge": "2023-09", - "release_date": "2024-07-18", - "last_updated": "2024-07-18", + "open_weights": true, + "release_date": "2026-07-15", + "last_updated": "2026-07-15", "type": "chat" }, { - "id": "openai/gpt-5-mini", - "name": "GPT-5 Mini", - "display_name": "GPT-5 Mini", + "id": "thinkingmachines/Inkling-Small", + "name": "Inkling Small", + "display_name": "Inkling Small", "modalities": { "input": [ "text", @@ -249365,10 +244140,10 @@ ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 65536, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -249376,276 +244151,241 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", "effort_options": [ - "minimal", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ "low", "medium", - "high" - ], - "visibility": "hidden" + "high", + "xhigh", + "max" + ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2024-05-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "open_weights": true, + "release_date": "2026-07-30", + "last_updated": "2026-07-30", "type": "chat" }, { - "id": "openai/gpt-5", - "name": "GPT-5", - "display_name": "GPT-5", + "id": "zai-org/GLM-5.3-Flash:peft:262144", + "name": "GLM-5.3-Flash", + "display_name": "GLM-5.3-Flash", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 262144, + "output": 262144 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "minimal", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } - }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "attachment": false, + "open_weights": true, + "release_date": "2026-08-26", + "last_updated": "2026-08-26", "type": "chat" }, { - "id": "openai/gpt-4.1", - "name": "GPT-4.1", - "display_name": "GPT-4.1", + "id": "zai-org/GLM-5.3:peft:262144", + "name": "GLM-5.3", + "display_name": "GLM-5.3", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1047576, - "output": 32768 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-04-14", - "last_updated": "2025-04-14", + "attachment": false, + "open_weights": true, + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "openai/gpt-5.1-codex-mini", - "name": "GPT-5.1 Codex mini", - "display_name": "GPT-5.1 Codex mini", + "id": "deepseek-ai/DeepSeek-V3.1", + "name": "DeepSeek-V3.1", + "display_name": "DeepSeek-V3.1", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 32768, + "output": 32768 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "default": true }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-11-13", - "last_updated": "2025-11-13", + "attachment": false, + "open_weights": true, + "release_date": "2025-08-21", + "last_updated": "2025-08-21", "type": "chat" }, { - "id": "openai/gpt-5.2-chat-latest", - "name": "GPT-5.2 Chat", - "display_name": "GPT-5.2 Chat", + "id": "deepseek-ai/DeepSeek-V4.1-Flash-1017:peft:262144", + "name": "DeepSeek V4.1 Flash 1017", + "display_name": "DeepSeek V4.1 Flash 1017", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 262144, + "output": 262144 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "medium" - ] - } - }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2025-12-11", - "last_updated": "2025-12-11", + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-10-17", + "last_updated": "2026-10-17", "type": "chat" }, { - "id": "openai/gpt-4.1-nano", - "name": "GPT-4.1 nano", - "display_name": "GPT-4.1 nano", + "id": "deepseek-ai/DeepSeek-V4.1-Flash:peft:262144", + "name": "DeepSeek V4.1 Flash", + "display_name": "DeepSeek V4.1 Flash", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1047576, - "output": 32768 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-04-14", - "last_updated": "2025-04-14", + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-09-10", + "last_updated": "2026-09-10", "type": "chat" - }, + } + ] + }, + "daoxe": { + "id": "daoxe", + "name": "DaoXE", + "display_name": "DaoXE", + "api": "https://daoxe.com/v1", + "doc": "https://daoxe.com/pricing", + "models": [ { - "id": "openai/gpt-4", - "name": "GPT-4", - "display_name": "GPT-4", + "id": "gemini-3.1-pro-preview", + "name": "Gemini 3.1 Pro Preview", + "display_name": "Gemini 3.1 Pro Preview", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "low", + "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] + } + }, + "attachment": true, "open_weights": false, - "knowledge": "2023-11", - "release_date": "2023-11-06", - "last_updated": "2024-04-09", + "knowledge": "2025-01", + "release_date": "2026-02-19", + "last_updated": "2026-02-19", "type": "chat" }, { - "id": "openai/gpt-5.1-codex", - "name": "GPT-5.1 Codex", - "display_name": "GPT-5.1 Codex", + "id": "gpt-5.4", + "name": "GPT-5.4", + "display_name": "GPT-5.4", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 400000, + "context": 1050000, "output": 128000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -249661,7 +244401,8 @@ "none", "low", "medium", - "high" + "high", + "xhigh" ], "verbosity": "medium", "verbosity_options": [ @@ -249674,94 +244415,74 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-11-13", - "last_updated": "2025-11-13", + "knowledge": "2025-08-31", + "release_date": "2026-03-05", + "last_updated": "2026-03-05", "type": "chat" }, { - "id": "openai/gpt-4-turbo", - "name": "GPT-4 Turbo", - "display_name": "GPT-4 Turbo", + "id": "claude-sonnet-4-6", + "name": "Claude Sonnet 4.6", + "display_name": "Claude Sonnet 4.6", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 1000000, + "output": 64000 }, "temperature": true, "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": false, - "knowledge": "2023-12", - "release_date": "2023-11-06", - "last_updated": "2024-04-09", - "type": "chat" - }, - { - "id": "openai/gpt-5.4-pro", - "name": "GPT-5.4 Pro", - "display_name": "GPT-5.4 Pro", - "modalities": { - "input": [ - "text", - "image" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 1050000, - "output": 128000 - }, - "temperature": false, - "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, "effort": "high", "effort_options": [ + "low", "medium", "high", - "xhigh" + "max" ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ], - "visibility": "hidden" + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." + ] } }, "attachment": true, "open_weights": false, "knowledge": "2025-08-31", - "release_date": "2026-03-05", - "last_updated": "2026-03-05", + "release_date": "2026-02-17", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "openai/gpt-5.1-chat-latest", - "name": "GPT-5.1 Chat", - "display_name": "GPT-5.1 Chat", + "id": "grok-4.5", + "name": "Grok 4.5", + "display_name": "Grok 4.5", "modalities": { "input": [ "text", @@ -249772,107 +244493,144 @@ ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 500000, + "output": 500000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "low", + "medium", + "high" + ] + } + }, "attachment": true, "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-11-13", - "last_updated": "2025-11-13", + "release_date": "2026-07-08", + "last_updated": "2026-07-08", "type": "chat" }, { - "id": "qwen/qwen3.8-27b", - "name": "Qwen3.8 27B", - "display_name": "Qwen3.8 27B", + "id": "claude-opus-4-8", + "name": "Claude Opus 4.8", + "display_name": "Claude Opus 4.8", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "high", "effort_options": [ - "none", "low", "medium", - "xhigh" + "high", + "xhigh", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "open_weights": false, + "knowledge": "2026-01", + "release_date": "2026-05-28", + "last_updated": "2026-05-28", "type": "chat" }, { - "id": "qwen/qwen3.5-397b-a17b", - "name": "Qwen3.5 397B-A17B", - "display_name": "Qwen3.5 397B-A17B", + "id": "claude-haiku-4-5-20251001", + "name": "Claude Haiku 4.5", + "display_name": "Claude Haiku 4.5", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-02-15", - "last_updated": "2026-02-15", + "open_weights": false, + "knowledge": "2025-02-28", + "release_date": "2025-10-15", + "last_updated": "2025-10-15", "type": "chat" }, { - "id": "qwen/qwen3.6-35b-a3b", - "name": "Qwen3.6 35B-A3B", - "display_name": "Qwen3.6 35B-A3B", + "id": "kimi-k2.5", + "name": "Kimi K2.5", + "display_name": "Kimi K2.5", "modalities": { "input": [ "text", @@ -249885,9 +244643,9 @@ }, "limit": { "context": 262144, - "output": 65536 + "output": 262144 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -249901,24 +244659,30 @@ "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "effort_options": [ + "low", + "medium", + "high" ] } }, "attachment": true, "open_weights": true, - "release_date": "2026-04-17", - "last_updated": "2026-04-17", + "knowledge": "2025-01", + "release_date": "2026-01-27", + "last_updated": "2026-01-27", "type": "chat" }, { - "id": "qwen/qwen3.7-plus", - "name": "Qwen3.7 Plus", - "display_name": "Qwen3.7 Plus", + "id": "grok-4.3", + "name": "Grok 4.3", + "display_name": "Grok 4.3", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" @@ -249926,7 +244690,7 @@ }, "limit": { "context": 1000000, - "output": 64000 + "output": 30000 }, "temperature": true, "tool_call": true, @@ -249936,35 +244700,39 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "effort_options": [ + "low", + "medium", + "high" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-04", - "release_date": "2026-06-02", - "last_updated": "2026-06-02", + "release_date": "2026-04-17", + "last_updated": "2026-04-17", "type": "chat" }, { - "id": "qwen/qwen3.5-35b-a3b", - "name": "Qwen3.5 35B-A3B", - "display_name": "Qwen3.5 35B-A3B", + "id": "gpt-5.5", + "name": "GPT-5.5", + "display_name": "GPT-5.5", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -249973,66 +244741,83 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, - "open_weights": true, - "release_date": "2026-02-23", - "last_updated": "2026-02-23", + "open_weights": false, + "knowledge": "2025-12-01", + "release_date": "2026-04-23", + "last_updated": "2026-04-23", "type": "chat" - }, + } + ] + }, + "xiaomi-token-plan-cn": { + "id": "xiaomi-token-plan-cn", + "name": "Xiaomi Token Plan (China)", + "display_name": "Xiaomi Token Plan (China)", + "api": "https://token-plan-cn.xiaomimimo.com/v1", + "doc": "https://platform.xiaomimimo.com/#/docs", + "models": [ { - "id": "qwen/qwen3-vl-235b-a22b-instruct", - "name": "Qwen3 VL 235B A22B Instruct", - "display_name": "Qwen3 VL 235B A22B Instruct", + "id": "mimo-v2.5-tts-voicedesign", + "name": "MiMo-V2.5-TTS-VoiceDesign", + "display_name": "MiMo-V2.5-TTS-VoiceDesign", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ - "text" + "audio" ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 8192, + "output": 8192 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { "supported": false }, - "attachment": true, - "open_weights": true, - "knowledge": "2025-03-31", - "release_date": "2025-09-23", - "last_updated": "2025-09-23", - "type": "chat" + "attachment": false, + "open_weights": false, + "release_date": "2026-04-22", + "last_updated": "2026-04-22" }, { - "id": "qwen/qwen3.8-max", - "name": "Qwen3.8 Max", - "display_name": "Qwen3.8 Max", + "id": "mimo-v2.6-pro", + "name": "MiMo-V2.6-Pro", + "display_name": "MiMo-V2.6-Pro", "modalities": { "input": [ "text", "image", - "video", - "pdf" + "audio", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, + "context": 1048576, "output": 131072 }, "temperature": true, @@ -250049,37 +244834,30 @@ "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "effort_options": [ - "low", - "medium", - "xhigh" ] } }, "attachment": true, - "open_weights": false, - "release_date": "2026-08-03", - "last_updated": "2026-08-03", + "open_weights": true, + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "qwen/qwen3.5-27b", - "name": "Qwen3.5 27B", - "display_name": "Qwen3.5 27B", + "id": "mimo-v2.5-pro", + "name": "MiMo-V2.5-Pro", + "display_name": "MiMo-V2.5-Pro", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 1048576, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -250098,20 +244876,22 @@ ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-02-23", - "last_updated": "2026-02-23", + "knowledge": "2024-12", + "release_date": "2026-04-22", + "last_updated": "2026-04-22", "type": "chat" }, { - "id": "qwen/qwen3.5-plus", - "name": "Qwen3.5 Plus", - "display_name": "Qwen3.5 Plus", + "id": "mimo-v2.5", + "name": "MiMo-V2.5", + "display_name": "MiMo-V2.5", "modalities": { "input": [ "text", "image", + "audio", "video" ], "output": [ @@ -250119,8 +244899,8 @@ ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 1048576, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -250140,20 +244920,21 @@ } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-04", - "release_date": "2026-02-16", - "last_updated": "2026-02-16", + "open_weights": true, + "knowledge": "2024-12", + "release_date": "2026-04-22", + "last_updated": "2026-04-22", "type": "chat" }, { - "id": "qwen/qwen3.5-flash", - "name": "Qwen3.5 Flash", - "display_name": "Qwen3.5 Flash", + "id": "mimo-v2.6-flash", + "name": "MiMo-V2.6-Flash", + "display_name": "MiMo-V2.6-Flash", "modalities": { "input": [ "text", "image", + "audio", "video" ], "output": [ @@ -250161,8 +244942,8 @@ ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 1048576, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -250182,28 +244963,88 @@ } }, "attachment": true, - "open_weights": false, - "release_date": "2026-02-23", - "last_updated": "2026-02-23", + "open_weights": true, + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "qwen/qwen3.7-flash", - "name": "Qwen3.7 Flash", - "display_name": "Qwen3.7 Flash", + "id": "mimo-v2.5-tts", + "name": "MiMo-V2.5-TTS", + "display_name": "MiMo-V2.5-TTS", + "modalities": { + "input": [ + "text" + ], + "output": [ + "audio" + ] + }, + "limit": { + "context": 8192, + "output": 8192 + }, + "temperature": false, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": false, + "release_date": "2026-04-22", + "last_updated": "2026-04-22" + }, + { + "id": "mimo-v2.5-tts-voiceclone", + "name": "MiMo-V2.5-TTS-VoiceClone", + "display_name": "MiMo-V2.5-TTS-VoiceClone", + "modalities": { + "input": [ + "text" + ], + "output": [ + "audio" + ] + }, + "limit": { + "context": 8192, + "output": 8192 + }, + "temperature": false, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": false, + "release_date": "2026-04-22", + "last_updated": "2026-04-22" + } + ] + }, + "hetzner": { + "id": "hetzner", + "name": "Hetzner", + "display_name": "Hetzner", + "api": "https://inference.hetzner.com/api/v1", + "doc": "https://experiments.hetzner.com/docs/inference", + "models": [ + { + "id": "Qwen3.8-27B", + "name": "Qwen3.8-27B", + "display_name": "Qwen3.8-27B", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, @@ -250211,34 +245052,28 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, "attachment": true, - "open_weights": false, - "release_date": "2026-07-15", - "last_updated": "2026-07-15", + "open_weights": true, + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "qwen/qwen3.6-plus", - "name": "Qwen3.6 Plus", - "display_name": "Qwen3.6 Plus", + "id": "Qwen/Qwen3.6-35B-A3B-FP8", + "name": "Qwen3.6 35B A3B FP8", + "display_name": "Qwen3.6 35B A3B FP8", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, @@ -250258,29 +245093,35 @@ } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-04", - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "open_weights": true, + "release_date": "2026-04-17", + "last_updated": "2026-04-17", "type": "chat" - }, + } + ] + }, + "reflection": { + "id": "reflection", + "name": "Reflection", + "display_name": "Reflection", + "api": "https://api.reflection.ai/openai/v1", + "doc": "https://developers.reflection.ai/models", + "models": [ { - "id": "qwen/qwen3.6-flash", - "name": "Qwen3.6 Flash", - "display_name": "Qwen3.6 Flash", + "id": "Beam-1.0-501B-A23B", + "name": "Beam 1.0 501B A23B", + "display_name": "Beam 1.0 501B A23B", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 1048576, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -250296,19 +245137,36 @@ "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" ] } }, - "attachment": true, - "open_weights": false, - "release_date": "2026-04-27", - "last_updated": "2026-04-27", + "attachment": false, + "open_weights": true, + "knowledge": "2026-06-30", + "release_date": "2026-10-05", + "last_updated": "2026-10-16", "type": "chat" - }, + } + ] + }, + "blueclaw": { + "id": "blueclaw", + "name": "Blue Claw", + "display_name": "Blue Claw", + "api": "https://openai.blueclaw.network/v1", + "doc": "https://blueclaw.network", + "models": [ { - "id": "qwen/qwen3-max", - "name": "Qwen3 Max", - "display_name": "Qwen3 Max", + "id": "Qwen3.8-27B", + "name": "Qwen3.8 27B", + "display_name": "Qwen3.8 27B", "modalities": { "input": [ "text" @@ -250318,49 +245176,58 @@ ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 131072, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "low", + "medium", + "xhigh" ] } }, "attachment": false, - "open_weights": false, - "knowledge": "2025-04", - "release_date": "2025-09-23", - "last_updated": "2025-09-23", + "open_weights": true, + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" - }, + } + ] + }, + "ofox": { + "id": "ofox", + "name": "Ofox", + "display_name": "Ofox", + "api": "https://api.ofox.ai/v1", + "doc": "https://ofox.ai/docs", + "models": [ { - "id": "qwen/qwen3.7-max", - "name": "Qwen3.7 Max", - "display_name": "Qwen3.7 Max", + "id": "moonshotai/kimi-k2.7-code-highspeed", + "name": "Kimi K2.7 Code Highspeed", + "display_name": "Kimi K2.7 Code Highspeed", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 262144, + "output": 262144 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -250371,16 +245238,17 @@ "supported": true } }, - "attachment": false, - "open_weights": false, - "release_date": "2026-05-21", - "last_updated": "2026-05-21", + "attachment": true, + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-06-12", + "last_updated": "2026-06-12", "type": "chat" }, { - "id": "qwen/qwen3-vl-235b-a22b-thinking", - "name": "Qwen3 VL 235B A22B Thinking", - "display_name": "Qwen3 VL 235B A22B Thinking", + "id": "moonshotai/kimi-k3.1-pro", + "name": "Kimi K3.1 Pro", + "display_name": "Kimi K3.1 Pro", "modalities": { "input": [ "text", @@ -250391,10 +245259,10 @@ ] }, "limit": { - "context": 131072, - "output": 40960 + "context": 1048576, + "output": 131072 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -250402,26 +245270,23 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "low", + "high", + "max" ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-03-31", - "release_date": "2025-09-23", - "last_updated": "2025-09-23", + "open_weights": false, + "release_date": "2026-10-23", + "last_updated": "2026-10-23", "type": "chat" }, { - "id": "qwen/qwen3.5-122b-a10b", - "name": "Qwen3.5 122B-A10B", - "display_name": "Qwen3.5 122B-A10B", + "id": "moonshotai/kimi-k2.7-code", + "name": "Kimi K2.7 Code", + "display_name": "Kimi K2.7 Code", "modalities": { "input": [ "text", @@ -250434,9 +245299,9 @@ }, "limit": { "context": 262144, - "output": 65536 + "output": 262144 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -250444,36 +245309,33 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, "attachment": true, "open_weights": true, - "release_date": "2026-02-23", - "last_updated": "2026-02-23", + "knowledge": "2025-01", + "release_date": "2026-06-12", + "last_updated": "2026-06-12", "type": "chat" }, { - "id": "tencent/hy3", - "name": "Hy3", - "display_name": "Hy3", + "id": "moonshotai/kimi-k2.6", + "name": "Kimi K2.6", + "display_name": "Kimi K2.6", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 128000 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, @@ -250483,37 +245345,35 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "effort_options": [ - "none", - "low", - "high" - ] + "supported": true } }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-07-06", - "last_updated": "2026-07-06", + "knowledge": "2025-01", + "release_date": "2026-04-20", + "last_updated": "2026-04-20", "type": "chat" }, { - "id": "tencent/hy3-free", - "name": "Hy3 (free)", - "display_name": "Hy3 (free)", + "id": "moonshotai/kimi-k3", + "name": "Kimi K3", + "display_name": "Kimi K3", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 128000 + "context": 1048576, + "output": 131072 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -250521,24 +245381,19 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "effort_options": [ - "none", - "low", - "high" - ] + "supported": true } }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-07-06", - "last_updated": "2026-07-06", + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" }, { - "id": "z-ai/glm-5.1", - "name": "GLM-5.1", - "display_name": "GLM-5.1", + "id": "deepseek/deepseek-v4-flash-0731", + "name": "DeepSeek V4 Flash 0731", + "display_name": "DeepSeek V4 Flash 0731", "modalities": { "input": [ "text" @@ -250548,8 +245403,8 @@ ] }, "limit": { - "context": 200000, - "output": 131072 + "context": 1000000, + "output": 384000 }, "temperature": true, "tool_call": true, @@ -250560,24 +245415,24 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "low", + "high", + "max" ] } }, "attachment": false, "open_weights": true, - "release_date": "2026-04-07", - "last_updated": "2026-04-07", + "knowledge": "2025-05", + "release_date": "2026-07-31", + "last_updated": "2026-07-31", "type": "chat" }, { - "id": "z-ai/glm-5", - "name": "GLM-5", - "display_name": "GLM-5", + "id": "deepseek/deepseek-v4-flash", + "name": "DeepSeek V4 Flash", + "display_name": "DeepSeek V4 Flash", "modalities": { "input": [ "text" @@ -250587,8 +245442,8 @@ ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 1000000, + "output": 384000 }, "temperature": true, "tool_call": true, @@ -250599,35 +245454,48 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "high", + "max" + ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "notes": [ + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, "attachment": false, "open_weights": true, - "release_date": "2026-02-12", - "last_updated": "2026-02-12", + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "z-ai/glm-4.6", - "name": "GLM-4.6", - "display_name": "GLM-4.6", + "id": "deepseek/deepseek-v4.1-flash", + "name": "DeepSeek V4.1 Flash", + "display_name": "DeepSeek V4.1 Flash", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 1000000, + "output": 384000 }, "temperature": true, "tool_call": true, @@ -250637,20 +245505,25 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "effort_options": [ + "low", + "high", + "max" + ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-09-30", - "last_updated": "2025-09-30", + "knowledge": "2025-05", + "release_date": "2026-09-10", + "last_updated": "2026-09-10", "type": "chat" }, { - "id": "z-ai/glm-4.5-air", - "name": "GLM-4.5-Air", - "display_name": "GLM-4.5-Air", + "id": "deepseek/deepseek-v4-pro-0423", + "name": "DeepSeek V4 Pro 0423", + "display_name": "DeepSeek V4 Pro 0423", "modalities": { "input": [ "text" @@ -250660,8 +245533,8 @@ ] }, "limit": { - "context": 131072, - "output": 98304 + "context": 1000000, + "output": 384000 }, "temperature": true, "tool_call": true, @@ -250669,17 +245542,25 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "high", + "max" + ] + } + }, "attachment": false, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-07-28", - "last_updated": "2025-07-28", + "knowledge": "2025-05", + "release_date": "2026-04-23", + "last_updated": "2026-04-23", "type": "chat" }, { - "id": "z-ai/glm-5.3", - "name": "GLM-5.3", - "display_name": "GLM-5.3", + "id": "deepseek/deepseek-v4-flash-0423", + "name": "DeepSeek V4 Flash 0423", + "display_name": "DeepSeek V4 Flash 0423", "modalities": { "input": [ "text" @@ -250690,7 +245571,7 @@ }, "limit": { "context": 1000000, - "output": 131072 + "output": 384000 }, "temperature": true, "tool_call": true, @@ -250700,13 +245581,6 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ "low", "high", @@ -250716,14 +245590,15 @@ }, "attachment": false, "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "knowledge": "2025-05", + "release_date": "2026-04-23", + "last_updated": "2026-04-23", "type": "chat" }, { - "id": "z-ai/glm-5.2", - "name": "GLM-5.2", - "display_name": "GLM-5.2", + "id": "deepseek/deepseek-v4-pro", + "name": "DeepSeek V4 Pro", + "display_name": "DeepSeek V4 Pro", "modalities": { "input": [ "text" @@ -250734,7 +245609,7 @@ }, "limit": { "context": 1000000, - "output": 131072 + "output": 384000 }, "temperature": true, "tool_call": true, @@ -250745,34 +245620,40 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "high", + "max" + ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" ], - "effort_options": [ - "high", - "max" + "notes": [ + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, "attachment": false, "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "z-ai/glm-5.3-flash", - "name": "GLM-5.3-Flash", - "display_name": "GLM-5.3-Flash", + "id": "deepseek/deepseek-v4.1-flash-1017", + "name": "DeepSeek V4.1 Flash 1017", + "display_name": "DeepSeek V4.1 Flash 1017", "modalities": { "input": [ "text", - "image", - "video", - "pdf" + "image" ], "output": [ "text" @@ -250780,7 +245661,7 @@ }, "limit": { "context": 1000000, - "output": 128000 + "output": 384000 }, "temperature": true, "tool_call": true, @@ -250790,13 +245671,6 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ "low", "high", @@ -250806,14 +245680,15 @@ }, "attachment": true, "open_weights": true, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", + "knowledge": "2025-05", + "release_date": "2026-10-17", + "last_updated": "2026-10-17", "type": "chat" }, { - "id": "z-ai/glm-4.7", - "name": "GLM-4.7", - "display_name": "GLM-4.7", + "id": "deepseek/deepseek-v3.2", + "name": "DeepSeek V3.2", + "display_name": "DeepSeek V3.2", "modalities": { "input": [ "text" @@ -250823,8 +245698,8 @@ ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 128000, + "output": 32000 }, "temperature": true, "tool_call": true, @@ -250834,32 +245709,23 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, "attachment": false, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-12-22", - "last_updated": "2025-12-22", + "knowledge": "2024-07", + "release_date": "2025-12-01", + "last_updated": "2025-12-01", "type": "chat" }, { - "id": "z-ai/glm-5.3-flash-free", - "name": "GLM-5.3-Flash (free)", - "display_name": "GLM-5.3-Flash (free)", + "id": "deepseek/deepseek-v4-pro-0813", + "name": "DeepSeek V4 Pro 0813", + "display_name": "DeepSeek V4 Pro 0813", "modalities": { "input": [ - "text", - "image", - "video", - "pdf" + "text" ], "output": [ "text" @@ -250867,7 +245733,7 @@ }, "limit": { "context": 1000000, - "output": 128000 + "output": 384000 }, "temperature": true, "tool_call": true, @@ -250878,71 +245744,80 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ - "low", "high", "max" ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", + "release_date": "2026-08-13", + "last_updated": "2026-08-22", "type": "chat" }, { - "id": "z-ai/glm-4.5", - "name": "GLM-4.5", - "display_name": "GLM-4.5", + "id": "openai/gpt-6.1-terra", + "name": "GPT-6.1 Terra", + "display_name": "GPT-6.1 Terra", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 98304 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-07-28", - "last_updated": "2025-07-28", + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2026-06-01", + "release_date": "2026-10-26", + "last_updated": "2026-10-26", "type": "chat" }, { - "id": "orcarouter/fusion-flash", - "name": "OrcaRouter Fusion Flash", - "display_name": "OrcaRouter Fusion Flash", + "id": "openai/gpt-5.6-terra", + "name": "GPT-5.6 Terra", + "display_name": "GPT-5.6 Terra", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 200000, + "context": 1050000, "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -250950,23 +245825,38 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ], + "verbosity": "medium", + "verbosity_options": [ "low", "medium", "high" - ] + ], + "visibility": "hidden" } }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-06-15", - "last_updated": "2026-06-15", + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "orcarouter/fusion-mini", - "name": "OrcaRouter Fusion Mini", - "display_name": "OrcaRouter Fusion Mini", + "id": "openai/gpt-5.4", + "name": "GPT-5.4", + "display_name": "GPT-5.4", "modalities": { "input": [ "text", @@ -250978,175 +245868,250 @@ ] }, "limit": { - "context": 1000000, + "context": 1050000, "output": 128000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ "low", "medium", "high" - ] + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "release_date": "2026-06-15", - "last_updated": "2026-06-15", + "knowledge": "2025-08-31", + "release_date": "2026-03-05", + "last_updated": "2026-03-05", "type": "chat" }, { - "id": "orcarouter/auto", - "name": "OrcaRouter Auto", - "display_name": "OrcaRouter Auto", + "id": "openai/gpt-5.6-sol", + "name": "GPT-5.6 Sol", + "display_name": "GPT-5.6 Sol", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "release_date": "2025-01-01", - "last_updated": "2026-05-14", + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "orcarouter/fusion", - "name": "OrcaRouter Fusion", - "display_name": "OrcaRouter Fusion", + "id": "openai/gpt-5.4-mini", + "name": "GPT-5.4 mini", + "display_name": "GPT-5.4 mini", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, + "context": 400000, "output": 128000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ "low", "medium", "high" - ] + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "release_date": "2026-06-15", - "last_updated": "2026-06-15", + "knowledge": "2025-08-31", + "release_date": "2026-03-17", + "last_updated": "2026-03-17", "type": "chat" }, { - "id": "orcarouter/free", - "name": "OrcaRouter Free", - "display_name": "OrcaRouter Free", + "id": "openai/gpt-4o", + "name": "GPT-4o", + "display_name": "GPT-4o", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 65536, - "output": 32768 + "context": 128000, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-08-27", - "last_updated": "2026-08-27", + "knowledge": "2023-09", + "release_date": "2024-05-13", + "last_updated": "2024-08-06", "type": "chat" }, { - "id": "deepseek/deepseek-chat", - "name": "DeepSeek Chat", - "display_name": "DeepSeek Chat", + "id": "openai/gpt-5.1-codex-mini", + "name": "GPT-5.1 Codex mini", + "display_name": "GPT-5.1 Codex mini", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 256000, + "output": 65536 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-09", - "release_date": "2025-12-01", - "last_updated": "2026-02-28", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2024-09-30", + "release_date": "2025-11-13", + "last_updated": "2025-11-13", "type": "chat" }, { - "id": "deepseek/deepseek-v4-flash", - "name": "DeepSeek V4 Flash", - "display_name": "DeepSeek V4 Flash", + "id": "openai/gpt-5.6-luna", + "name": "GPT-5.6 Luna", + "display_name": "GPT-5.6 Luna", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -251157,45 +246122,78 @@ "supported": true, "default_enabled": true, "mode": "effort", - "effort": "high", + "effort": "medium", "effort_options": [ + "none", "low", + "medium", "high", + "xhigh", "max" ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" ], - "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." - ] + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "attachment": true, + "open_weights": false, + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "deepseek/deepseek-reasoner", - "name": "DeepSeek Reasoner", - "display_name": "DeepSeek Reasoner", + "id": "openai/gpt-4.1", + "name": "GPT-4.1", + "display_name": "GPT-4.1", "modalities": { "input": [ + "text", + "image", + "pdf" + ], + "output": [ "text" + ] + }, + "limit": { + "context": 1047576, + "output": 32768 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": false, + "knowledge": "2024-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", + "type": "chat" + }, + { + "id": "openai/gpt-5.3-codex", + "name": "GPT-5.3 Codex", + "display_name": "GPT-5.3 Codex", + "modalities": { + "input": [ + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 400000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -251206,89 +246204,101 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-09", - "release_date": "2025-12-01", - "last_updated": "2026-02-28", + "attachment": true, + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-02-05", + "last_updated": "2026-02-05", "type": "chat" }, { - "id": "deepseek/deepseek-v4-pro", - "name": "DeepSeek V4 Pro", - "display_name": "DeepSeek V4 Pro", + "id": "openai/gpt-5.1", + "name": "GPT-5.1", + "display_name": "GPT-5.1", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 400000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, + "default_enabled": false, "mode": "effort", - "effort": "high", + "effort": "none", "effort_options": [ + "none", "low", - "high", - "max" + "medium", + "high" ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" ], - "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." - ] + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "attachment": true, + "open_weights": false, + "knowledge": "2024-09-30", + "release_date": "2025-11-13", + "last_updated": "2025-11-13", "type": "chat" }, { - "id": "deepseek/deepseek-v4-pro-0813", - "name": "DeepSeek V4 Pro 0813", - "display_name": "DeepSeek V4 Pro 0813", + "id": "openai/gpt-6-luna", + "name": "GPT-6 Luna", + "display_name": "GPT-6 Luna", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -251296,29 +246306,27 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ + "none", + "low", + "medium", "high", + "xhigh", "max" ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-08-13", - "last_updated": "2026-08-22", + "attachment": true, + "open_weights": false, + "knowledge": "2026-05-18", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "deepseek/deepseek-v4-flash-vision-exp", - "name": "DeepSeek V4 Flash Vision Exp", - "display_name": "DeepSeek V4 Flash Vision Exp", + "id": "openai/gpt-5-mini", + "name": "GPT-5 Mini", + "display_name": "GPT-5 Mini", "modalities": { "input": [ "text", @@ -251329,10 +246337,10 @@ ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 256000, + "output": 32768 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -251343,46 +246351,48 @@ "supported": true, "default_enabled": true, "mode": "effort", - "effort": "high", + "effort": "medium", "effort_options": [ + "minimal", "low", - "high", - "max" + "medium", + "high" ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" ], - "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." - ] + "visibility": "hidden" } }, "attachment": true, - "open_weights": true, - "release_date": "2026-08-21", - "last_updated": "2026-09-01", + "open_weights": false, + "knowledge": "2024-05-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "deepseek/deepseek-v4-flash-0731", - "name": "DeepSeek V4 Flash 0731", - "display_name": "DeepSeek V4 Flash 0731", + "id": "openai/gpt-6-sol", + "name": "GPT-6 Sol", + "display_name": "GPT-6 Sol", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -251390,44 +246400,41 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ + "none", "low", + "medium", "high", + "xhigh", "max" ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-07-31", - "last_updated": "2026-07-31", + "attachment": true, + "open_weights": false, + "knowledge": "2026-04-20", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "deepseek/deepseek-v4-flash-free", - "name": "DeepSeek V4 Flash (free)", - "display_name": "DeepSeek V4 Flash (free)", + "id": "openai/gpt-5.4-pro", + "name": "GPT-5.4 Pro", + "display_name": "GPT-5.4 Pro", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -251436,42 +246443,45 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], + "default_enabled": true, + "mode": "effort", + "effort": "high", "effort_options": [ - "low", + "medium", "high", - "max" - ] + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "attachment": true, + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-03-05", + "last_updated": "2026-03-05", "type": "chat" }, { - "id": "anthropic/claude-opus-4.7", - "name": "Claude Opus 4.7", - "display_name": "Claude Opus 4.7", + "id": "openai/gpt-5.1-codex-max", + "name": "GPT-5.1 Codex Max", + "display_name": "GPT-5.1 Codex Max", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, + "context": 256000, "output": 128000 }, "temperature": false, @@ -251485,97 +246495,84 @@ "supported": true, "default_enabled": false, "mode": "effort", - "effort": "high", + "effort": "none", "effort_options": [ + "none", "low", "medium", - "high", - "xhigh", - "max" + "high" ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." - ] + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-04-16", - "last_updated": "2026-04-16", + "knowledge": "2024-09-30", + "release_date": "2025-11-13", + "last_updated": "2025-11-13", "type": "chat" }, { - "id": "anthropic/claude-opus-4.6", - "name": "Claude Opus 4.6", - "display_name": "Claude Opus 4.6", + "id": "openai/gpt-5", + "name": "GPT-5", + "display_name": "GPT-5", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, + "context": 400000, "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ + "minimal", "low", "medium", - "high", - "max" + "high" ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." - ] + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2025-05-31", - "release_date": "2026-02-05", - "last_updated": "2026-03-13", + "knowledge": "2024-09-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "anthropic/claude-sonnet-5", - "name": "Claude Sonnet 5", - "display_name": "Claude Sonnet 5", + "id": "openai/gpt-6.1-sol", + "name": "GPT-6.1 Sol", + "display_name": "GPT-6.1 Sol", "modalities": { "input": [ "text", @@ -251587,7 +246584,7 @@ ] }, "limit": { - "context": 1000000, + "context": 1050000, "output": 128000 }, "temperature": false, @@ -251598,25 +246595,26 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ "low", "medium", - "high" + "high", + "xhigh", + "max" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-30", - "last_updated": "2026-06-30", + "knowledge": "2026-04-30", + "release_date": "2026-09-29", + "last_updated": "2026-09-29", "type": "chat" }, { - "id": "anthropic/claude-haiku-4.5", - "name": "Claude Haiku 4.5 (latest)", - "display_name": "Claude Haiku 4.5 (latest)", + "id": "openai/gpt-5.2-codex", + "name": "GPT-5.2 Codex", + "display_name": "GPT-5.2 Codex", "modalities": { "input": [ "text", @@ -251628,62 +246626,61 @@ ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high", + "xhigh" ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." - ] + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2025-02-28", - "release_date": "2025-10-15", - "last_updated": "2025-10-15", + "knowledge": "2025-08-31", + "release_date": "2025-12-11", + "last_updated": "2025-12-11", "type": "chat" }, { - "id": "anthropic/claude-opus-4.8", - "name": "Claude Opus 4.8", - "display_name": "Claude Opus 4.8", + "id": "openai/gpt-5.2", + "name": "GPT-5.2", + "display_name": "GPT-5.2", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, + "context": 400000, "output": 128000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -251694,79 +246691,86 @@ "supported": true, "default_enabled": false, "mode": "effort", - "effort": "high", + "effort": "none", "effort_options": [ + "none", "low", "medium", "high", - "xhigh", - "max" + "xhigh" ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." - ] + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2026-01", - "release_date": "2026-05-28", - "last_updated": "2026-05-28", + "knowledge": "2025-08-31", + "release_date": "2025-12-11", + "last_updated": "2025-12-11", "type": "chat" }, { - "id": "anthropic/claude-opus-5", - "name": "Claude Opus 5", - "display_name": "Claude Opus 5", + "id": "openai/gpt-5.4-nano", + "name": "GPT-5.4 nano", + "display_name": "GPT-5.4 nano", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, + "context": 400000, "output": 128000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ "low", "medium", "high" - ] + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2026-05", - "release_date": "2026-07-24", - "last_updated": "2026-07-24", + "knowledge": "2025-08-31", + "release_date": "2026-03-17", + "last_updated": "2026-03-17", "type": "chat" }, { - "id": "anthropic/claude-opus-4.5", - "name": "Claude Opus 4.5 (latest)", - "display_name": "Claude Opus 4.5 (latest)", + "id": "openai/gpt-5.5", + "name": "GPT-5.5", + "display_name": "GPT-5.5", "modalities": { "input": [ "text", @@ -251778,53 +246782,47 @@ ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ "low", "medium", - "high" + "high", + "xhigh" ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" ], - "notes": [ - "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." - ] + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2025-05", - "release_date": "2025-11-24", - "last_updated": "2025-11-24", + "knowledge": "2025-12-01", + "release_date": "2026-04-23", + "last_updated": "2026-04-23", "type": "chat" }, { - "id": "anthropic/claude-sonnet-4.6", - "name": "Claude Sonnet 4.6", - "display_name": "Claude Sonnet 4.6", + "id": "openai/gpt-4.1-mini", + "name": "GPT-4.1 mini", + "display_name": "GPT-4.1 mini", "modalities": { "input": [ "text", @@ -251836,54 +246834,25 @@ ] }, "limit": { - "context": 1000000, - "output": 64000 + "context": 1047576, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." - ] - } + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-17", - "last_updated": "2026-03-13", + "knowledge": "2024-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", "type": "chat" }, { - "id": "anthropic/claude-sonnet-4.5", - "name": "Claude Sonnet 4.5 (latest)", - "display_name": "Claude Sonnet 4.5 (latest)", + "id": "openai/gpt-4o-mini", + "name": "GPT-4o mini", + "display_name": "GPT-4o mini", "modalities": { "input": [ "text", @@ -251895,47 +246864,25 @@ ] }, "limit": { - "context": 1000000, - "output": 64000 + "context": 128000, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." - ] - } + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2025-07-31", - "release_date": "2025-09-29", - "last_updated": "2025-09-29", + "knowledge": "2023-09", + "release_date": "2024-07-18", + "last_updated": "2024-07-18", "type": "chat" }, { - "id": "anthropic/claude-fable-5", - "name": "Claude Fable 5", - "display_name": "Claude Fable 5", + "id": "openai/gpt-6-astra", + "name": "GPT-6 Astra", + "display_name": "GPT-6 Astra", "modalities": { "input": [ "text", @@ -251947,7 +246894,7 @@ ] }, "limit": { - "context": 1000000, + "context": 1050000, "output": 128000 }, "temperature": false, @@ -251959,53 +246906,38 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", "effort_options": [ "low", "medium", "high", "xhigh", "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", - "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", - "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-09", - "last_updated": "2026-06-09", + "knowledge": "2026-04-30", + "release_date": "2026-09-04", + "last_updated": "2026-09-04", "type": "chat" }, { - "id": "kimi/kimi-k2.7-code", - "name": "Kimi K2.7 Code", - "display_name": "Kimi K2.7 Code", + "id": "openai/gpt-5-nano", + "name": "GPT-5 Nano", + "display_name": "GPT-5 Nano", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 400000, + "output": 128000 }, "temperature": false, "tool_call": true, @@ -252016,25 +246948,35 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "minimal", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-06-12", - "last_updated": "2026-06-12", + "open_weights": false, + "knowledge": "2024-05-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "kimi/kimi-k2.6", - "name": "Kimi K2.6", - "display_name": "Kimi K2.6", + "id": "volcengine/doubao-seed-character", + "name": "Seed Character", + "display_name": "Seed Character", "modalities": { "input": [ "text", @@ -252046,8 +246988,8 @@ ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 256000, + "output": 256000 }, "temperature": true, "tool_call": true, @@ -252055,28 +246997,16 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-20", - "last_updated": "2026-04-20", + "open_weights": false, + "release_date": "2026-06-23", + "last_updated": "2026-06-23", "type": "chat" }, { - "id": "kimi/kimi-k3", - "name": "Kimi K3", - "display_name": "Kimi K3", + "id": "volcengine/doubao-seed-2.1-turbo", + "name": "Seed 2.1 Turbo", + "display_name": "Seed 2.1 Turbo", "modalities": { "input": [ "text", @@ -252088,41 +247018,25 @@ ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 256000, + "output": 256000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "low", - "high", - "max" - ] - } - }, "attachment": true, - "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-16", + "open_weights": false, + "release_date": "2026-06-23", + "last_updated": "2026-06-23", "type": "chat" }, { - "id": "kimi/kimi-k2.5", - "name": "Kimi K2.5", - "display_name": "Kimi K2.5", + "id": "volcengine/doubao-seed-2.1-pro", + "name": "Seed 2.1 Pro", + "display_name": "Seed 2.1 Pro", "modalities": { "input": [ "text", @@ -252134,50 +247048,38 @@ ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 256000, + "output": 256000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-01-27", - "last_updated": "2026-01-27", + "open_weights": false, + "release_date": "2026-06-23", + "last_updated": "2026-06-23", "type": "chat" }, { - "id": "grok/grok-4.3", - "name": "Grok 4.3", - "display_name": "Grok 4.3", + "id": "volcengine/doubao-seed-2.0-lite", + "name": "Seed 2.0 Lite", + "display_name": "Seed 2.0 Lite", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 30000 + "context": 256000, + "output": 32000 }, "temperature": true, "tool_call": true, @@ -252185,39 +247087,29 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "none", - "low", - "medium", - "high" - ] - } - }, "attachment": true, "open_weights": false, - "release_date": "2026-04-17", - "last_updated": "2026-04-17", + "release_date": "2026-02-14", + "last_updated": "2026-02-14", "type": "chat" }, { - "id": "grok/grok-4.5", - "name": "Grok 4.5", - "display_name": "Grok 4.5", + "id": "volcengine/doubao-seed-2.0-mini", + "name": "Seed 2.0 Mini", + "display_name": "Seed 2.0 Mini", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 500000, - "output": 500000 + "context": 256000, + "output": 32000 }, "temperature": true, "tool_call": true, @@ -252225,188 +247117,109 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "low", - "medium", - "high" - ] - } - }, "attachment": true, "open_weights": false, - "release_date": "2026-07-08", - "last_updated": "2026-07-08", + "release_date": "2026-02-14", + "last_updated": "2026-02-14", "type": "chat" }, { - "id": "grok/grok-4.6", - "name": "Grok 4.6", - "display_name": "Grok 4.6", + "id": "volcengine/doubao-seed-2.0-pro", + "name": "Seed 2.0 Pro", + "display_name": "Seed 2.0 Pro", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 500000, - "output": 500000 + "context": 256000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ] - } - }, "attachment": true, "open_weights": false, - "knowledge": "2026-02-01", - "release_date": "2026-08-12", - "last_updated": "2026-08-12", + "release_date": "2026-02-14", + "last_updated": "2026-02-14", "type": "chat" - } - ] - }, - "azure-cognitive-services": { - "id": "azure-cognitive-services", - "name": "Azure Cognitive Services", - "display_name": "Azure Cognitive Services", - "doc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", - "models": [ + }, { - "id": "llama-3.3-70b-instruct", - "name": "Llama-3.3-70B-Instruct", - "display_name": "Llama-3.3-70B-Instruct", + "id": "volcengine/doubao-seed-2.0-code", + "name": "Seed 2.0 Code", + "display_name": "Seed 2.0 Code", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 32768 + "context": 256000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": true, - "knowledge": "2023-12", - "release_date": "2024-12-06", - "last_updated": "2024-12-06", - "type": "chat" - }, - { - "id": "gpt-image-2.5-flare", - "name": "GPT Image 2.5 Flare", - "display_name": "GPT Image 2.5 Flare", - "modalities": { - "input": [ - "text", - "image" - ], - "output": [ - "image" - ] - }, - "limit": { - "context": 8192, - "output": 8192 - }, - "temperature": false, - "tool_call": false, - "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": true, "open_weights": false, - "release_date": "2026-09-08", - "last_updated": "2026-09-08" + "release_date": "2026-02-14", + "last_updated": "2026-02-14", + "type": "chat" }, { - "id": "gpt-5.2", - "name": "GPT-5.2", - "display_name": "GPT-5.2", + "id": "volcengine/doubao-seed-evolving", + "name": "Seed Evolving", + "display_name": "Seed Evolving", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 256000, + "output": 256000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "default": true }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2025-12-11", - "last_updated": "2025-12-11", + "release_date": "2026-06-23", + "last_updated": "2026-06-23", "type": "chat" }, { - "id": "claude-haiku-5-5", - "name": "Claude Haiku 5.5", - "display_name": "Claude Haiku 5.5", + "id": "z-ai/glm-5.2", + "name": "GLM-5.2", + "display_name": "GLM-5.2", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" @@ -252414,9 +247227,9 @@ }, "limit": { "context": 1000000, - "output": 128000 + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -252424,30 +247237,28 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ - "low", - "medium", "high", - "xhigh", "max" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-10-07", - "last_updated": "2026-10-07", + "attachment": false, + "open_weights": true, + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "gpt-5.4-mini", - "name": "GPT-5.4 Mini", - "display_name": "GPT-5.4 Mini", + "id": "z-ai/glm-5v-turbo", + "name": "GLM-5V-Turbo", + "display_name": "GLM-5V-Turbo", "modalities": { "input": [ "text", "image", + "video", "pdf" ], "output": [ @@ -252455,52 +247266,30 @@ ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 200000, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "default": true }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-17", - "last_updated": "2026-03-17", + "release_date": "2026-04-01", + "last_updated": "2026-04-01", "type": "chat" }, { - "id": "claude-opus-4-7", - "name": "Claude Opus 4.7", - "display_name": "Claude Opus 4.7", + "id": "z-ai/glm-5.3-flashx", + "name": "GLM-5.3-FlashX", + "display_name": "GLM-5.3-FlashX", "modalities": { "input": [ "text", "image", + "video", "pdf" ], "output": [ @@ -252509,157 +247298,100 @@ }, "limit": { "context": 1000000, - "output": 128000 + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "high", "effort_options": [ "low", - "medium", "high", - "xhigh", "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-04-16", - "last_updated": "2026-04-16", + "open_weights": true, + "release_date": "2026-08-26", + "last_updated": "2026-08-26", "type": "chat" }, { - "id": "claude-sonnet-4-5", - "name": "Claude Sonnet 4.5", - "display_name": "Claude Sonnet 4.5", + "id": "z-ai/glm-5.3", + "name": "GLM-5.3", + "display_name": "GLM-5.3", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + "effort_options": [ + "low", + "high", + "max" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-07-31", - "release_date": "2025-11-18", - "last_updated": "2025-11-18", + "attachment": false, + "open_weights": true, + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "gpt-5.6-sol", - "name": "GPT-5.6 Sol", - "display_name": "GPT-5.6 Sol", + "id": "z-ai/glm-4.7-flashx", + "name": "GLM-4.7-FlashX", + "display_name": "GLM-4.7-FlashX", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, + "context": 200000, "output": 128000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } - }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2026-01-19", + "last_updated": "2026-01-19", "type": "chat" }, { - "id": "phi-4-mini-reasoning", - "name": "Phi-4-mini-reasoning", - "display_name": "Phi-4-mini-reasoning", + "id": "z-ai/glm-5-turbo", + "name": "GLM-5-Turbo", + "display_name": "GLM-5-Turbo", "modalities": { "input": [ "text" @@ -252669,8 +247401,8 @@ ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 200000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -252678,17 +247410,21 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, "attachment": false, - "open_weights": true, - "knowledge": "2023-10", - "release_date": "2024-12-11", - "last_updated": "2024-12-11", + "open_weights": false, + "release_date": "2026-03-16", + "last_updated": "2026-03-16", "type": "chat" }, { - "id": "phi-4-reasoning", - "name": "Phi-4-reasoning", - "display_name": "Phi-4-reasoning", + "id": "z-ai/glm-4.6", + "name": "GLM-4.6", + "display_name": "GLM-4.6", "modalities": { "input": [ "text" @@ -252698,26 +247434,31 @@ ] }, "limit": { - "context": 32000, - "output": 4096 + "context": 204800, + "output": 131072 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, "attachment": false, "open_weights": true, - "knowledge": "2023-10", - "release_date": "2024-12-11", - "last_updated": "2024-12-11", + "knowledge": "2025-04", + "release_date": "2025-09-30", + "last_updated": "2025-09-30", "type": "chat" }, { - "id": "deepseek-v4-flash", - "name": "DeepSeek-V4-Flash", - "display_name": "DeepSeek-V4-Flash", + "id": "z-ai/glm-5", + "name": "GLM-5", + "display_name": "GLM-5", "modalities": { "input": [ "text" @@ -252727,8 +247468,8 @@ ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 204800, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -252739,40 +247480,29 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "high", - "max" - ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, "attachment": false, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "release_date": "2026-02-12", + "last_updated": "2026-02-12", "type": "chat" }, { - "id": "gpt-5.2-codex", - "name": "GPT-5.2 Codex", - "display_name": "GPT-5.2 Codex", + "id": "z-ai/glm-5.3-flash", + "name": "GLM-5.3-Flash", + "display_name": "GLM-5.3-Flash", "modalities": { "input": [ "text", "image", + "video", "pdf" ], "output": [ @@ -252780,10 +247510,10 @@ ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 1000000, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -252792,35 +247522,23 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", "effort_options": [ "low", - "medium", "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "max" + ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-01-14", - "last_updated": "2026-01-14", + "open_weights": true, + "release_date": "2026-08-26", + "last_updated": "2026-08-26", "type": "chat" }, { - "id": "text-embedding-3-large", - "name": "text-embedding-3-large", - "display_name": "text-embedding-3-large", + "id": "z-ai/glm-4.7", + "name": "GLM-4.7", + "display_name": "GLM-4.7", "modalities": { "input": [ "text" @@ -252830,23 +247548,37 @@ ] }, "limit": { - "context": 8192, - "output": 3072 + "context": 204800, + "output": 131072 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, - "open_weights": false, - "release_date": "2024-01-25", - "last_updated": "2024-01-25", - "type": "embedding" + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-12-22", + "last_updated": "2025-12-22", + "type": "chat" }, { - "id": "grok-4-20-non-reasoning", - "name": "Grok 4.20 (Non-Reasoning)", - "display_name": "Grok 4.20 (Non-Reasoning)", + "id": "z-ai/glm-5.1", + "name": "GLM-5.1", + "display_name": "GLM-5.1", "modalities": { "input": [ "text" @@ -252856,13 +247588,14 @@ ] }, "limit": { - "context": 262000, - "output": 8192 + "context": 200000, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { @@ -252870,31 +247603,30 @@ } }, "attachment": false, - "open_weights": false, - "knowledge": "2025-09", - "release_date": "2026-04-08", - "last_updated": "2026-04-08", + "open_weights": true, + "release_date": "2026-04-07", + "last_updated": "2026-04-07", "type": "chat" }, { - "id": "gpt-5-nano", - "name": "GPT-5 Nano", - "display_name": "GPT-5 Nano", + "id": "bailian/qwen3.6-plus", + "name": "Qwen3.6 Plus", + "display_name": "Qwen3.6 Plus", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 1000000, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -252903,35 +247635,25 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "minimal", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2024-05-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "knowledge": "2025-04", + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "deepseek-v3.2-speciale", - "name": "DeepSeek-V3.2-Speciale", - "display_name": "DeepSeek-V3.2-Speciale", + "id": "bailian/qwen3-coder-next", + "name": "Qwen3 Coder Next", + "display_name": "Qwen3 Coder Next", "modalities": { "input": [ "text" @@ -252941,204 +247663,274 @@ ] }, "limit": { - "context": 128000, - "output": 128000 + "context": 262144, + "output": 65536 }, "temperature": true, - "tool_call": false, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "knowledge": "2025-09", + "release_date": "2026-02-03", + "last_updated": "2026-02-03", + "type": "chat" + }, + { + "id": "bailian/qwen3-max", + "name": "Qwen3 Max", + "display_name": "Qwen3 Max", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 262144, + "output": 65536 + }, + "temperature": true, + "tool_call": true, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, "attachment": false, - "open_weights": true, - "knowledge": "2024-07", - "release_date": "2025-12-01", - "last_updated": "2025-12-01", + "open_weights": false, + "knowledge": "2025-04", + "release_date": "2025-09-23", + "last_updated": "2025-09-23", "type": "chat" }, { - "id": "llama-4-scout-17b-16e-instruct", - "name": "Llama 4 Scout 17B 16E Instruct", - "display_name": "Llama 4 Scout 17B 16E Instruct", + "id": "bailian/qwen3.5-35b-a3b", + "name": "Qwen3.5 35B-A3B", + "display_name": "Qwen3.5 35B-A3B", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 262144, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": true, "open_weights": true, - "knowledge": "2024-08", - "release_date": "2025-04-05", - "last_updated": "2025-04-05", + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" }, { - "id": "gpt-4o", - "name": "GPT-4o", - "display_name": "GPT-4o", + "id": "bailian/qwen3.6-27b", + "name": "Qwen3.6 27B", + "display_name": "Qwen3.6 27B", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 256000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": true, + "open_weights": true, + "release_date": "2026-04-22", + "last_updated": "2026-04-22", + "type": "chat" + }, + { + "id": "bailian/qwen3.7-max", + "name": "Qwen3.7 Max", + "display_name": "Qwen3.7 Max", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1000000, + "output": 131072 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": false, "open_weights": false, - "knowledge": "2023-09", - "release_date": "2024-05-13", - "last_updated": "2024-08-06", + "release_date": "2026-05-21", + "last_updated": "2026-05-21", "type": "chat" }, { - "id": "claude-haiku-4-5", - "name": "Claude Haiku 4.5", - "display_name": "Claude Haiku 4.5", + "id": "bailian/qwen3.5-plus", + "name": "Qwen3.5 Plus", + "display_name": "Qwen3.5 Plus", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 1000000, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-02-28", - "release_date": "2025-11-18", - "last_updated": "2025-11-18", + "knowledge": "2025-04", + "release_date": "2026-02-16", + "last_updated": "2026-02-16", "type": "chat" }, { - "id": "gpt-5.4-nano", - "name": "GPT-5.4 Nano", - "display_name": "GPT-5.4 Nano", + "id": "bailian/qwen-plus", + "name": "Qwen Plus", + "display_name": "Qwen Plus", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 1000000, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": false + "supported": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-17", - "last_updated": "2026-03-17", + "knowledge": "2024-04", + "release_date": "2024-01-25", + "last_updated": "2025-09-11", "type": "chat" }, { - "id": "kimi-k2.7-code", - "name": "Kimi K2.7 Code", - "display_name": "Kimi K2.7 Code", + "id": "bailian/qwen-flash", + "name": "Qwen Flash", + "display_name": "Qwen Flash", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1000000, + "output": 32768 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -253155,21 +247947,22 @@ ] } }, - "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-06-12", - "last_updated": "2026-06-12", + "attachment": false, + "open_weights": false, + "knowledge": "2024-04", + "release_date": "2025-07-28", + "last_updated": "2025-07-28", "type": "chat" }, { - "id": "claude-sonnet-5-5", - "name": "Claude Sonnet 5.5", - "display_name": "Claude Sonnet 5.5", + "id": "bailian/qwen3.8-max", + "name": "Qwen3.8 Max", + "display_name": "Qwen3.8 Max", "modalities": { "input": [ "text", "image", + "video", "pdf" ], "output": [ @@ -253178,9 +247971,9 @@ }, "limit": { "context": 1000000, - "output": 128000 + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -253188,83 +247981,57 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ "low", "medium", - "high", - "xhigh", - "max" + "xhigh" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-09-28", - "last_updated": "2026-09-28", + "release_date": "2026-08-03", + "last_updated": "2026-08-03", "type": "chat" }, { - "id": "gpt-5.6-luna", - "name": "GPT-5.6 Luna", - "display_name": "GPT-5.6 Luna", + "id": "bailian/qwen-max", + "name": "Qwen Max", + "display_name": "Qwen Max", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 32768, + "output": 8192 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "knowledge": "2024-04", + "release_date": "2024-04-03", + "last_updated": "2025-01-25", "type": "chat" }, { - "id": "deepseek-v4-pro", - "name": "DeepSeek-V4-Pro", - "display_name": "DeepSeek-V4-Pro", + "id": "bailian/qwen3.6-flash", + "name": "Qwen3.6 Flash", + "display_name": "Qwen3.6 Flash", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" @@ -253272,7 +248039,7 @@ }, "limit": { "context": 1000000, - "output": 384000 + "output": 65536 }, "temperature": true, "tool_call": true, @@ -253283,88 +248050,52 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "high", - "max" - ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "attachment": true, + "open_weights": false, + "release_date": "2026-04-27", + "last_updated": "2026-04-27", "type": "chat" }, { - "id": "gpt-5.1-codex-max", - "name": "GPT-5.1 Codex Max", - "display_name": "GPT-5.1 Codex Max", + "id": "bailian/qwen3-coder-plus", + "name": "Qwen3 Coder Plus", + "display_name": "Qwen3 Coder Plus", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 1048576, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-11-13", - "last_updated": "2025-11-13", + "knowledge": "2025-04", + "release_date": "2025-07-23", + "last_updated": "2025-07-23", "type": "chat" }, { - "id": "phi-4", - "name": "Phi-4", - "display_name": "Phi-4", + "id": "bailian/qwen3-coder-flash", + "name": "Qwen3 Coder Flash", + "display_name": "Qwen3 Coder Flash", "modalities": { "input": [ "text" @@ -253374,30 +248105,30 @@ ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 1000000, + "output": 65536 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, "attachment": false, - "open_weights": true, - "knowledge": "2023-10", - "release_date": "2024-12-11", - "last_updated": "2024-12-11", + "open_weights": false, + "knowledge": "2025-04", + "release_date": "2025-07-28", + "last_updated": "2025-07-28", "type": "chat" }, { - "id": "claude-fable-5-1", - "name": "Claude Fable 5.1", - "display_name": "Claude Fable 5.1", + "id": "bailian/qwen3.5-flash", + "name": "Qwen3.5 Flash", + "display_name": "Qwen3.5 Flash", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" @@ -253405,9 +248136,9 @@ }, "limit": { "context": 1000000, - "output": 128000 + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -253416,55 +248147,38 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], "interleaved": true, "summaries": true, - "visibility": "omitted", + "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", - "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", - "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-09-01", - "last_updated": "2026-09-01", + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" }, { - "id": "claude-sonnet-5", - "name": "Claude Sonnet 5", - "display_name": "Claude Sonnet 5", + "id": "bailian/qwen3.5-397b-a17b", + "name": "Qwen3.5 397B-A17B", + "display_name": "Qwen3.5 397B-A17B", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 256000, + "output": 64000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -253473,26 +248187,24 @@ "extra_capabilities": { "reasoning": { "supported": true, - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-30", - "last_updated": "2026-06-30", + "open_weights": true, + "release_date": "2026-02-15", + "last_updated": "2026-02-15", "type": "chat" }, { - "id": "o3-mini", - "name": "o3-mini", - "display_name": "o3-mini", + "id": "bailian/qwen-turbo", + "name": "Qwen Turbo", + "display_name": "Qwen Turbo", "modalities": { "input": [ "text" @@ -253502,83 +248214,91 @@ ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 128000, + "output": 16384 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": false, "open_weights": false, - "knowledge": "2024-05", - "release_date": "2024-12-20", - "last_updated": "2025-01-29", + "knowledge": "2024-04", + "release_date": "2024-11-01", + "last_updated": "2025-04-28", "type": "chat" }, { - "id": "ministral-3b", - "name": "Ministral 3B", - "display_name": "Ministral 3B", + "id": "bailian/qwen3.5-27b", + "name": "Qwen3.5 27B", + "display_name": "Qwen3.5 27B", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 262144, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": true, "open_weights": true, - "knowledge": "2024-03", - "release_date": "2024-10-22", - "last_updated": "2024-10-22", + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" }, { - "id": "gpt-5.6-terra", - "name": "GPT-5.6 Terra", - "display_name": "GPT-5.6 Terra", + "id": "bailian/qwen3.5-122b-a10b", + "name": "Qwen3.5 122B-A10B", + "display_name": "Qwen3.5 122B-A10B", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 256000, + "output": 64000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -253587,77 +248307,73 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "open_weights": true, + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" }, { - "id": "mistral-small-2503", - "name": "Mistral Small 3.1", - "display_name": "Mistral Small 3.1", + "id": "bailian/qwen3.7-plus", + "name": "Qwen3.7 Plus", + "display_name": "Qwen3.7 Plus", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 32768 + "context": 1000000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": true, "open_weights": false, - "knowledge": "2024-09", - "release_date": "2025-03-01", - "last_updated": "2025-03-01", + "knowledge": "2025-04", + "release_date": "2026-06-02", + "last_updated": "2026-06-02", "type": "chat" }, { - "id": "grok-4-20-reasoning", - "name": "Grok 4.20 (Reasoning)", - "display_name": "Grok 4.20 (Reasoning)", + "id": "bailian/qwen3.8-flash", + "name": "Qwen3.8 Flash", + "display_name": "Qwen3.8 Flash", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 262000, - "output": 8192 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -253670,21 +248386,21 @@ "supported": true } }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2025-09", - "release_date": "2026-04-08", - "last_updated": "2026-04-08", + "release_date": "2026-08-26", + "last_updated": "2026-08-26", "type": "chat" }, { - "id": "o3", - "name": "o3", - "display_name": "o3", + "id": "bailian/qwen3.8-max-0902", + "name": "Qwen3.8 Max 0902", + "display_name": "Qwen3.8 Max 0902", "modalities": { "input": [ "text", "image", + "video", "pdf" ], "output": [ @@ -253692,10 +248408,10 @@ ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 1000000, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -253703,69 +248419,64 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", "effort_options": [ "low", "medium", - "high" - ], - "visibility": "hidden" + "xhigh" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2024-05", - "release_date": "2025-04-16", - "last_updated": "2025-04-16", + "release_date": "2026-09-02", + "last_updated": "2026-09-02", "type": "chat" }, { - "id": "gpt-image-1", - "name": "GPT-Image-1", - "display_name": "GPT-Image-1", + "id": "bailian/qwen3.8-27b", + "name": "Qwen3.8 27B", + "display_name": "Qwen3.8 27B", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ - "image" + "text" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 1131072, + "output": 131072 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": true, - "open_weights": false, - "release_date": "2025-04-24", - "last_updated": "2025-04-24" + "open_weights": true, + "release_date": "2026-08-14", + "last_updated": "2026-08-14", + "type": "chat" }, { - "id": "grok-4.7", - "name": "Grok 4.7", - "display_name": "Grok 4.7", + "id": "bailian/qwen3.6-max-preview", + "name": "Qwen3.6 Max Preview", + "display_name": "Qwen3.6 Max Preview", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 500000, - "output": 500000 + "context": 262144, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -253775,76 +248486,53 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "xhigh" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-05", - "release_date": "2026-09-21", - "last_updated": "2026-09-21", - "type": "chat" - }, - { - "id": "text-embedding-ada-002", - "name": "text-embedding-ada-002", - "display_name": "text-embedding-ada-002", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 8192, - "output": 1536 - }, - "tool_call": false, - "reasoning": { - "supported": false - }, "attachment": false, "open_weights": false, - "release_date": "2022-12-15", - "last_updated": "2022-12-15", - "type": "embedding" + "knowledge": "2025-04", + "release_date": "2026-04-20", + "last_updated": "2026-04-20", + "type": "chat" }, { - "id": "gpt-image-2.5-sunburst", - "name": "GPT Image 2.5 Sunburst", - "display_name": "GPT Image 2.5 Sunburst", + "id": "bailian/qwen-vl-max", + "name": "Qwen-VL Max", + "display_name": "Qwen-VL Max", "modalities": { "input": [ "text", "image" ], "output": [ - "image" + "text" ] }, "limit": { - "context": 8192, + "context": 131072, "output": 8192 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": false }, "attachment": true, "open_weights": false, - "release_date": "2026-09-08", - "last_updated": "2026-09-08" + "knowledge": "2024-04", + "release_date": "2024-04-08", + "last_updated": "2025-08-13", + "type": "chat" }, { - "id": "claude-opus-5-5", + "id": "anthropic/claude-opus-5.5", "name": "Claude Opus 5.5", "display_name": "Claude Opus 5.5", "modalities": { @@ -253886,9 +248574,9 @@ "type": "chat" }, { - "id": "gpt-5-pro", - "name": "GPT-5 Pro", - "display_name": "GPT-5 Pro", + "id": "anthropic/claude-fable-5", + "name": "Claude Fable 5", + "display_name": "Claude Fable 5", "modalities": { "input": [ "text", @@ -253900,7 +248588,7 @@ ] }, "limit": { - "context": 400000, + "context": 1000000, "output": 128000 }, "temperature": false, @@ -253913,28 +248601,39 @@ "reasoning": { "supported": true, "default_enabled": true, - "mode": "fixed", + "mode": "effort", "effort": "high", - "verbosity": "medium", - "verbosity_options": [ + "effort_options": [ "low", "medium", - "high" + "high", + "xhigh", + "max" ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", + "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", + "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-10-06", - "last_updated": "2025-10-06", + "knowledge": "2026-01-31", + "release_date": "2026-06-09", + "last_updated": "2026-06-09", "type": "chat" }, { - "id": "gpt-6-sol", - "name": "GPT-6 Sol", - "display_name": "GPT-6 Sol", + "id": "anthropic/claude-opus-4.6", + "name": "Claude Opus 4.6", + "display_name": "Claude Opus 4.6", "modalities": { "input": [ "text", @@ -253946,67 +248645,106 @@ ] }, "limit": { - "context": 1050000, + "context": 1000000, "output": 128000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", "effort_options": [ - "none", "low", "medium", "high", - "xhigh", "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-04-20", - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "knowledge": "2025-05-31", + "release_date": "2026-02-05", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "mistral-medium-2505", - "name": "Mistral Medium 3", - "display_name": "Mistral Medium 3", + "id": "anthropic/claude-haiku-4.5", + "name": "Claude Haiku 4.5 (latest)", + "display_name": "Claude Haiku 4.5 (latest)", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 128000 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + ] + } }, "attachment": true, "open_weights": false, - "knowledge": "2025-05", - "release_date": "2025-05-07", - "last_updated": "2025-05-07", + "knowledge": "2025-02-28", + "release_date": "2025-10-15", + "last_updated": "2025-10-15", "type": "chat" }, { - "id": "gpt-5.3-codex", - "name": "GPT-5.3 Codex", - "display_name": "GPT-5.3 Codex", + "id": "anthropic/claude-opus-4.8", + "name": "Claude Opus 4.8", + "display_name": "Claude Opus 4.8", "modalities": { "input": [ "text", @@ -254018,47 +248756,52 @@ ] }, "limit": { - "context": 400000, + "context": 1000000, "output": 128000 }, "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, + "default_enabled": false, "mode": "effort", - "effort": "medium", + "effort": "high", "effort_options": [ "low", "medium", "high", - "xhigh" + "xhigh", + "max" ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" ], - "visibility": "hidden" + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-24", - "last_updated": "2026-02-24", + "knowledge": "2026-01", + "release_date": "2026-05-28", + "last_updated": "2026-05-28", "type": "chat" }, { - "id": "gpt-6.1-sol", - "name": "GPT-6.1 Sol", - "display_name": "GPT-6.1 Sol", + "id": "anthropic/claude-haiku-5.5", + "name": "Claude Haiku 5.5", + "display_name": "Claude Haiku 5.5", "modalities": { "input": [ "text", @@ -254070,7 +248813,7 @@ ] }, "limit": { - "context": 1050000, + "context": 1000000, "output": 128000 }, "temperature": false, @@ -254092,45 +248835,72 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2026-04-30", - "release_date": "2026-09-29", - "last_updated": "2026-09-29", + "knowledge": "2026-06", + "release_date": "2026-10-07", + "last_updated": "2026-10-07", "type": "chat" }, { - "id": "phi-4-multimodal", - "name": "Phi-4-multimodal", - "display_name": "Phi-4-multimodal", + "id": "anthropic/claude-opus-4.7", + "name": "Claude Opus 4.7", + "display_name": "Claude Opus 4.7", "modalities": { "input": [ "text", "image", - "audio" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 1000000, + "output": 128000 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." + ] + } }, "attachment": true, - "open_weights": true, - "knowledge": "2023-10", - "release_date": "2024-12-11", - "last_updated": "2024-12-11", + "open_weights": false, + "knowledge": "2026-01-31", + "release_date": "2026-04-16", + "last_updated": "2026-04-16", "type": "chat" }, { - "id": "claude-opus-4-5", - "name": "Claude Opus 4.5", - "display_name": "Claude Opus 4.5", + "id": "anthropic/claude-sonnet-4.6", + "name": "Claude Sonnet 4.6", + "display_name": "Claude Sonnet 4.6", "modalities": { "input": [ "text", @@ -254142,8 +248912,8 @@ ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 1000000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -254164,7 +248934,8 @@ "effort_options": [ "low", "medium", - "high" + "high", + "max" ], "interleaved": true, "summaries": true, @@ -254173,134 +248944,207 @@ "thinking_blocks" ], "notes": [ - "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-03-31", - "release_date": "2025-11-24", - "last_updated": "2025-08-01", + "knowledge": "2025-08-31", + "release_date": "2026-02-17", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "gpt-3.5-turbo-1106", - "name": "GPT-3.5 Turbo 1106", - "display_name": "GPT-3.5 Turbo 1106", + "id": "anthropic/claude-opus-5", + "name": "Claude Opus 5", + "display_name": "Claude Opus 5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 16384, - "output": 4096 + "context": 1000000, + "output": 128000 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + }, + "attachment": true, "open_weights": false, - "knowledge": "2021-08", - "release_date": "2023-11-06", - "last_updated": "2023-11-06", + "knowledge": "2026-05", + "release_date": "2026-07-24", + "last_updated": "2026-07-24", "type": "chat" }, { - "id": "phi-4-reasoning-plus", - "name": "Phi-4-reasoning-plus", - "display_name": "Phi-4-reasoning-plus", + "id": "anthropic/claude-sonnet-5", + "name": "Claude Sonnet 5", + "display_name": "Claude Sonnet 5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 32000, - "output": 4096 + "context": 1000000, + "output": 128000 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2023-10", - "release_date": "2024-12-11", - "last_updated": "2024-12-11", + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2026-01-31", + "release_date": "2026-06-30", + "last_updated": "2026-06-30", "type": "chat" }, { - "id": "gpt-image-2", - "name": "GPT-Image-2", - "display_name": "GPT-Image-2", + "id": "anthropic/claude-sonnet-5.5", + "name": "Claude Sonnet 5.5", + "display_name": "Claude Sonnet 5.5", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ - "image" + "text" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 1000000, + "output": 128000 }, "temperature": false, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } }, "attachment": true, "open_weights": false, - "release_date": "2026-04-21", - "last_updated": "2026-04-21" + "knowledge": "2026-06", + "release_date": "2026-09-28", + "last_updated": "2026-09-28", + "type": "chat" }, { - "id": "gpt-3.5-turbo-0125", - "name": "GPT-3.5 Turbo 0125", - "display_name": "GPT-3.5 Turbo 0125", + "id": "anthropic/claude-fable-5.1", + "name": "Claude Fable 5.1", + "display_name": "Claude Fable 5.1", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 16384, - "output": 4096 + "context": 1000000, + "output": 128000 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": false, - "knowledge": "2021-08", - "release_date": "2024-01-25", - "last_updated": "2024-01-25", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", + "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", + "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2026-06", + "release_date": "2026-09-01", + "last_updated": "2026-09-01", "type": "chat" }, { - "id": "gpt-5.4", - "name": "GPT-5.4", - "display_name": "GPT-5.4", + "id": "anthropic/claude-opus-4.5", + "name": "Claude Opus 4.5 (latest)", + "display_name": "Claude Opus 4.5 (latest)", "modalities": { "input": [ "text", @@ -254312,8 +249156,8 @@ ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, @@ -254325,35 +249169,40 @@ "reasoning": { "supported": true, "default_enabled": false, - "mode": "effort", - "effort": "none", + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ "low", "medium", "high" ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-05", - "last_updated": "2026-03-05", + "knowledge": "2025-05", + "release_date": "2025-11-24", + "last_updated": "2025-11-24", "type": "chat" }, { - "id": "gpt-5-codex", - "name": "GPT-5-Codex", - "display_name": "GPT-5-Codex", + "id": "anthropic/claude-sonnet-4.5", + "name": "Claude Sonnet 4.5 (latest)", + "display_name": "Claude Sonnet 4.5 (latest)", "modalities": { "input": [ "text", @@ -254365,59 +249214,58 @@ ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 200000, + "output": 64000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "minimal", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ], - "visibility": "hidden" + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-09-15", - "last_updated": "2025-09-15", + "knowledge": "2025-07-31", + "release_date": "2025-09-29", + "last_updated": "2025-09-29", "type": "chat" }, { - "id": "kimi-k2.6", - "name": "Kimi K2.6", - "display_name": "Kimi K2.6", + "id": "minimax/minimax-m2.7", + "name": "MiniMax-M2.7", + "display_name": "MiniMax-M2.7", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 204800, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -254428,32 +249276,35 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-20", - "last_updated": "2026-04-20", + "release_date": "2026-03-18", + "last_updated": "2026-03-18", "type": "chat" }, { - "id": "grok-4-1-fast-reasoning", - "name": "Grok 4.1 Fast (Reasoning)", - "display_name": "Grok 4.1 Fast (Reasoning)", + "id": "minimax/minimax-m2.7-highspeed", + "name": "MiniMax-M2.7-highspeed", + "display_name": "MiniMax-M2.7-highspeed", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 204800, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -254463,125 +249314,101 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, - "attachment": true, - "open_weights": false, - "release_date": "2025-06-27", - "last_updated": "2025-06-27", + "attachment": false, + "open_weights": true, + "release_date": "2026-03-18", + "last_updated": "2026-03-18", "type": "chat" }, { - "id": "gpt-5.1", - "name": "GPT-5.1", - "display_name": "GPT-5.1", + "id": "minimax/minimax-m3", + "name": "MiniMax-M3", + "display_name": "MiniMax-M3", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 1048576, + "output": 512000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "supported": true } }, "attachment": true, - "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-11-14", - "last_updated": "2025-11-14", + "open_weights": true, + "release_date": "2026-06-01", + "last_updated": "2026-06-01", "type": "chat" }, { - "id": "gpt-chat-latest", - "name": "GPT Chat Latest", - "display_name": "GPT Chat Latest", + "id": "minimax/minimax-m2.1-lightning", + "name": "MiniMax-M2.1 Lightning", + "display_name": "MiniMax-M2.1 Lightning", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 204800, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "medium" - ] - } - }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-12-01", - "release_date": "2026-05-05", - "last_updated": "2026-05-28", + "attachment": false, + "open_weights": true, + "release_date": "2025-12-23", + "last_updated": "2025-12-23", "type": "chat" }, { - "id": "codex-mini", - "name": "Codex Mini", - "display_name": "Codex Mini", + "id": "minimax/minimax-m2.5", + "name": "MiniMax-M2.5", + "display_name": "MiniMax-M2.5", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 204800, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -254589,138 +249416,91 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "low", - "medium", - "high" - ] + "supported": true } }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-05-16", - "last_updated": "2025-05-16", + "attachment": false, + "open_weights": true, + "release_date": "2026-02-12", + "last_updated": "2026-02-12", "type": "chat" }, { - "id": "claude-opus-5", - "name": "Claude Opus 5", - "display_name": "Claude Opus 5", + "id": "minimax/minimax-m2.5-lightning", + "name": "MiniMax-M2.5 Lightning", + "display_name": "MiniMax-M2.5 Lightning", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 204800, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ] - } - }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-05", - "release_date": "2026-07-24", - "last_updated": "2026-07-24", + "attachment": false, + "open_weights": true, + "release_date": "2026-02-13", + "last_updated": "2026-02-13", "type": "chat" }, { - "id": "claude-sonnet-4-6", - "name": "Claude Sonnet 4.6", - "display_name": "Claude Sonnet 4.6", + "id": "minimax/minimax-m2.1", + "name": "MiniMax-M2.1", + "display_name": "MiniMax-M2.1", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 64000 + "context": 204800, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." - ] + "supported": true } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-17", - "last_updated": "2026-03-13", + "attachment": false, + "open_weights": true, + "release_date": "2025-12-23", + "last_updated": "2025-12-23", "type": "chat" }, { - "id": "kimi-k2.5", - "name": "Kimi K2.5", - "display_name": "Kimi K2.5", + "id": "minimax/m2-her", + "name": "MiniMax-M2 Her", + "display_name": "MiniMax-M2 Her", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 65536, + "output": 2048 }, "temperature": true, "tool_call": true, @@ -254728,62 +249508,50 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, - "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-01-27", - "last_updated": "2026-01-27", + "attachment": false, + "open_weights": false, + "release_date": "2026-01-23", + "last_updated": "2026-01-23", "type": "chat" }, { - "id": "gpt-4.1-mini", - "name": "GPT-4.1 mini", - "display_name": "GPT-4.1 mini", + "id": "minimax/minimax-m2", + "name": "MiniMax-M2", + "display_name": "MiniMax-M2", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1047576, - "output": 32768 + "context": 204800, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-04-14", - "last_updated": "2025-04-14", + "attachment": false, + "open_weights": true, + "release_date": "2025-10-27", + "last_updated": "2025-10-27", "type": "chat" }, { - "id": "gpt-6-astra", - "name": "GPT-6 Astra", - "display_name": "GPT-6 Astra", + "id": "google/gemini-3.1-pro-preview", + "name": "Gemini 3.1 Pro Preview", + "display_name": "Gemini 3.1 Pro Preview", "modalities": { "input": [ "text", "image", + "video", + "audio", "pdf" ], "output": [ @@ -254791,10 +249559,10 @@ ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1048576, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -254803,88 +249571,141 @@ "extra_capabilities": { "reasoning": { "supported": true, - "effort_options": [ - "none", + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ "low", - "medium", - "high", - "xhigh", - "max" + "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-04-30", - "release_date": "2026-09-04", - "last_updated": "2026-09-04", + "knowledge": "2025-01", + "release_date": "2026-02-19", + "last_updated": "2026-02-19", "type": "chat" }, { - "id": "grok-4-1-fast-non-reasoning", - "name": "Grok 4.1 Fast (Non-Reasoning)", - "display_name": "Grok 4.1 Fast (Non-Reasoning)", + "id": "google/gemini-3-flash-preview", + "name": "Gemini 3 Flash Preview", + "display_name": "Gemini 3 Flash Preview", "modalities": { "input": [ "text", - "image" + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", + "low", + "medium", + "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] + } }, "attachment": true, "open_weights": false, - "release_date": "2025-06-27", - "last_updated": "2025-06-27", + "knowledge": "2025-01", + "release_date": "2025-12-17", + "last_updated": "2025-12-17", "type": "chat" }, { - "id": "llama-4-maverick-17b-128e-instruct-fp8", - "name": "Llama 4 Maverick 17B 128E Instruct FP8", - "display_name": "Llama 4 Maverick 17B 128E Instruct FP8", + "id": "google/gemini-2.5-pro", + "name": "Gemini 2.5 Pro", + "display_name": "Gemini 2.5 Pro", "modalities": { "input": [ "text", - "image" + "image", + "audio", + "video", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 16384 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "budget", + "budget": { + "default": -1, + "min": 128, + "max": 32768, + "auto": -1, + "unit": "tokens" + }, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] + } }, "attachment": true, - "open_weights": true, - "knowledge": "2024-08", - "release_date": "2025-04-05", - "last_updated": "2025-04-05", + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2025-06-17", + "last_updated": "2025-06-17", "type": "chat" }, { - "id": "gpt-5.5", - "name": "GPT-5.5", - "display_name": "GPT-5.5", + "id": "google/gemini-3.5-flash-lite", + "name": "Gemini 3.5 Flash Lite", + "display_name": "Gemini 3.5 Flash Lite", "modalities": { "input": [ "text", "image", + "video", + "audio", "pdf" ], "output": [ @@ -254892,10 +249713,10 @@ ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1048576, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -254904,39 +249725,31 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ + "minimal", "low", "medium", "high" - ], - "visibility": "hidden" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-12-01", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "knowledge": "2026-03", + "release_date": "2026-07-21", + "last_updated": "2026-07-21", "type": "chat" }, { - "id": "gpt-4o-mini", - "name": "GPT-4o mini", - "display_name": "GPT-4o mini", + "id": "google/gemini-3.1-flash-lite", + "name": "Gemini 3.1 Flash Lite", + "display_name": "Gemini 3.1 Flash Lite", "modalities": { "input": [ "text", "image", + "video", + "audio", "pdf" ], "output": [ @@ -254944,37 +249757,52 @@ ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "minimal", + "low", + "medium", + "high" + ] + } }, "attachment": true, "open_weights": false, - "knowledge": "2023-09", - "release_date": "2024-07-18", - "last_updated": "2024-07-18", + "knowledge": "2025-01", + "release_date": "2026-05-07", + "last_updated": "2026-05-07", "type": "chat" }, { - "id": "deepseek-v4.1-flash", - "name": "DeepSeek-V4.1-Flash", - "display_name": "DeepSeek-V4.1-Flash", + "id": "google/gemini-2.5-flash", + "name": "Gemini 2.5 Flash", + "display_name": "Gemini 2.5 Flash", "modalities": { "input": [ "text", - "image" + "image", + "audio", + "video", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -254985,35 +249813,40 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": true, + "mode": "budget", + "budget": { + "default": -1, + "min": 0, + "max": 24576, + "auto": -1, + "off": 0, + "unit": "tokens" + }, "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "none", - "low", - "high", - "max" + "thought_signatures" ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-09-10", - "last_updated": "2026-09-10", + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2025-06-17", + "last_updated": "2025-06-17", "type": "chat" }, { - "id": "claude-opus-4-6", - "name": "Claude Opus 4.6", - "display_name": "Claude Opus 4.6", + "id": "google/gemini-4-argon", + "name": "Gemini 4 Argon", + "display_name": "Gemini 4 Argon", "modalities": { "input": [ "text", "image", + "video", + "audio", "pdf" ], "output": [ @@ -255021,58 +249854,41 @@ ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 1048576, + "output": 65536 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", "effort_options": [ "low", "medium", - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." + "high" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-05-31", - "release_date": "2026-02-05", - "last_updated": "2026-07-17", + "knowledge": "2026-03", + "release_date": "2026-10-13", + "last_updated": "2026-10-13", "type": "chat" }, { - "id": "gpt-5-mini", - "name": "GPT-5 Mini", - "display_name": "GPT-5 Mini", + "id": "google/gemini-3.7-flash", + "name": "Gemini 3.7 Flash", + "display_name": "Gemini 3.7 Flash", "modalities": { "input": [ "text", "image", + "video", + "audio", "pdf" ], "output": [ @@ -255080,10 +249896,10 @@ ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 1048576, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -255093,94 +249909,90 @@ "reasoning": { "supported": true, "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ + "mode": "level", + "level": "high", + "level_options": [ "minimal", "low", "medium", "high" ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2024-05-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "knowledge": "2026-03", + "release_date": "2026-08-13", + "last_updated": "2026-08-13", "type": "chat" }, { - "id": "codestral-2501", - "name": "Codestral 25.01", - "display_name": "Codestral 25.01", + "id": "google/gemini-2.5-flash-lite", + "name": "Gemini 2.5 Flash-Lite", + "display_name": "Gemini 2.5 Flash-Lite", "modalities": { "input": [ - "text" + "text", + "image", + "audio", + "video", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 256000 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": false, - "knowledge": "2024-03", - "release_date": "2025-01-01", - "last_updated": "2025-01-01", - "type": "chat" - }, - { - "id": "gpt-3.5-turbo-instruct", - "name": "GPT-3.5 Turbo Instruct", - "display_name": "GPT-3.5 Turbo Instruct", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 4096, - "output": 4096 + "supported": true, + "default": false }, - "temperature": true, - "tool_call": false, - "reasoning": { - "supported": false + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "default": -1, + "min": 512, + "max": 24576, + "auto": -1, + "unit": "tokens" + }, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] + } }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2021-08", - "release_date": "2023-09-21", - "last_updated": "2023-09-21", + "knowledge": "2025-01", + "release_date": "2025-06-17", + "last_updated": "2025-06-17", "type": "chat" }, { - "id": "gpt-5", - "name": "GPT-5", - "display_name": "GPT-5", + "id": "google/gemini-3.5-flash", + "name": "Gemini 3.5 Flash", + "display_name": "Gemini 3.5 Flash", "modalities": { "input": [ "text", "image", + "video", + "audio", "pdf" ], "output": [ @@ -255188,10 +250000,10 @@ ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 1048576, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -255201,65 +250013,88 @@ "reasoning": { "supported": true, "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ + "mode": "level", + "level": "high", + "level_options": [ "minimal", "low", "medium", "high" ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "knowledge": "2025-01", + "release_date": "2026-05-19", + "last_updated": "2026-05-19", "type": "chat" }, { - "id": "model-router", - "name": "Model Router", - "display_name": "Model Router", + "id": "google/gemini-3.8-flash", + "name": "Gemini 3.8 Flash", + "display_name": "Gemini 3.8 Flash", "modalities": { "input": [ "text", - "image" + "image", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 16384 + "context": 1000000, + "output": 65536 }, + "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", + "low", + "medium", + "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] + } }, "attachment": true, "open_weights": false, - "release_date": "2025-05-19", - "last_updated": "2025-11-18", + "release_date": "2026-09-02", + "last_updated": "2026-09-02", "type": "chat" }, { - "id": "gpt-6-luna", - "name": "GPT-6 Luna", - "display_name": "GPT-6 Luna", + "id": "google/gemini-3.6-flash", + "name": "Gemini 3.6 Flash", + "display_name": "Gemini 3.6 Flash", "modalities": { "input": [ "text", "image", + "video", + "audio", "pdf" ], "output": [ @@ -255267,10 +250102,10 @@ ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1048576, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -255278,57 +250113,76 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "none", + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", "low", "medium", - "high", - "xhigh", - "max" + "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-05-18", - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "knowledge": "2026-03", + "release_date": "2026-07-21", + "last_updated": "2026-07-21", "type": "chat" }, { - "id": "gpt-4.1", - "name": "GPT-4.1", - "display_name": "GPT-4.1", + "id": "qwen/qwen3.6-plus", + "name": "Qwen3.6 Plus", + "display_name": "Qwen3.6 Plus", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1047576, - "output": 32768 + "context": 1000000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": true, "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-04-14", - "last_updated": "2025-04-14", + "knowledge": "2025-04", + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "cohere-embed-v3-english", - "name": "Embed v3 English", - "display_name": "Embed v3 English", + "id": "qwen/qwen3-coder-next", + "name": "Qwen3 Coder Next", + "display_name": "Qwen3 Coder Next", "modalities": { "input": [ "text" @@ -255338,24 +250192,25 @@ ] }, "limit": { - "context": 512, - "output": 1024 + "context": 256000, + "output": 64000 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": false }, "attachment": false, "open_weights": true, - "release_date": "2023-11-07", - "last_updated": "2023-11-07", - "type": "embedding" + "knowledge": "2025-09", + "release_date": "2026-02-03", + "last_updated": "2026-02-03", + "type": "chat" }, { - "id": "deepseek-v3.2", - "name": "DeepSeek-V3.2", - "display_name": "DeepSeek-V3.2", + "id": "qwen/qwen3-max", + "name": "Qwen3 Max", + "display_name": "Qwen3 Max", "modalities": { "input": [ "text" @@ -255365,8 +250220,8 @@ ] }, "limit": { - "context": 128000, - "output": 128000 + "context": 256000, + "output": 64000 }, "temperature": true, "tool_call": true, @@ -255376,20 +250231,26 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": false, - "open_weights": true, - "knowledge": "2024-07", - "release_date": "2025-12-01", - "last_updated": "2025-12-01", + "open_weights": false, + "knowledge": "2025-04", + "release_date": "2025-09-23", + "last_updated": "2025-09-23", "type": "chat" }, { - "id": "grok-4.6", - "name": "Grok 4.6", - "display_name": "Grok 4.6", + "id": "qwen/qwen3.5-35b-a3b", + "name": "Qwen3.5 35B-A3B", + "display_name": "Qwen3.5 35B-A3B", "modalities": { "input": [ "text", @@ -255400,8 +250261,8 @@ ] }, "limit": { - "context": 200000, - "output": 128000 + "context": 256000, + "output": 64000 }, "temperature": true, "tool_call": true, @@ -255412,139 +250273,143 @@ "extra_capabilities": { "reasoning": { "supported": true, - "effort_options": [ - "low", - "medium", - "high", - "xhigh" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-02-01", - "release_date": "2026-08-12", - "last_updated": "2026-08-12", + "open_weights": true, + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" }, { - "id": "gpt-4-turbo-vision", - "name": "GPT-4 Turbo Vision", - "display_name": "GPT-4 Turbo Vision", + "id": "qwen/qwen3.6-27b", + "name": "Qwen3.6 27B", + "display_name": "Qwen3.6 27B", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 256000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": true, - "open_weights": false, - "knowledge": "2023-11", - "release_date": "2023-11-06", - "last_updated": "2024-04-09", + "open_weights": true, + "release_date": "2026-04-22", + "last_updated": "2026-04-22", "type": "chat" }, { - "id": "cohere-embed-v-4-0", - "name": "Embed v4", - "display_name": "Embed v4", + "id": "qwen/qwen3.7-max", + "name": "Qwen3.7 Max", + "display_name": "Qwen3.7 Max", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 1536 + "context": 1064000, + "output": 64000 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, - "open_weights": true, - "release_date": "2025-04-15", - "last_updated": "2025-04-15", - "type": "embedding" + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": false, + "open_weights": false, + "release_date": "2026-05-21", + "last_updated": "2026-05-21", + "type": "chat" }, { - "id": "gpt-5.1-codex-mini", - "name": "GPT-5.1 Codex Mini", - "display_name": "GPT-5.1 Codex Mini", + "id": "qwen/qwen3.5-plus", + "name": "Qwen3.5 Plus", + "display_name": "Qwen3.5 Plus", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 1000000, + "output": 64000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-11-14", - "last_updated": "2025-11-14", + "knowledge": "2025-04", + "release_date": "2026-02-16", + "last_updated": "2026-02-16", "type": "chat" }, { - "id": "claude-mythos-5", - "name": "Claude Mythos 5", - "display_name": "Claude Mythos 5", + "id": "qwen/qwen-plus", + "name": "Qwen Plus", + "display_name": "Qwen Plus", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" @@ -255552,56 +250417,38 @@ }, "limit": { "context": 1000000, - "output": 128000 + "output": 32000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], "interleaved": true, "summaries": true, - "visibility": "omitted", + "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", - "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", - "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." ] } }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-09", - "last_updated": "2026-06-09", + "knowledge": "2024-04", + "release_date": "2024-01-25", + "last_updated": "2025-09-11", "type": "chat" }, { - "id": "claude-opus-4-8", - "name": "Claude Opus 4.8", - "display_name": "Claude Opus 4.8", + "id": "qwen/qwen-flash", + "name": "Qwen Flash", + "display_name": "Qwen Flash", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" @@ -255609,55 +250456,41 @@ }, "limit": { "context": 1000000, - "output": 128000 + "output": 32000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], "interleaved": true, "summaries": true, - "visibility": "omitted", + "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-12-31", - "release_date": "2026-05-28", - "last_updated": "2026-05-28", + "knowledge": "2024-04", + "release_date": "2025-07-28", + "last_updated": "2025-07-28", "type": "chat" }, { - "id": "o1", - "name": "o1", - "display_name": "o1", + "id": "qwen/qwen3.8-max", + "name": "Qwen3.8 Max", + "display_name": "Qwen3.8 Max", "modalities": { "input": [ "text", "image", + "video", "pdf" ], "output": [ @@ -255665,10 +250498,10 @@ ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 1000000, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -255677,28 +250510,23 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", "effort_options": [ "low", "medium", - "high" - ], - "visibility": "hidden" + "xhigh" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2023-09", - "release_date": "2024-12-05", - "last_updated": "2024-12-05", + "release_date": "2026-08-03", + "last_updated": "2026-08-03", "type": "chat" }, { - "id": "cohere-embed-v3-multilingual", - "name": "Embed v3 Multilingual", - "display_name": "Embed v3 Multilingual", + "id": "qwen/qwen-max", + "name": "Qwen Max", + "display_name": "Qwen Max", "modalities": { "input": [ "text" @@ -255708,99 +250536,94 @@ ] }, "limit": { - "context": 512, - "output": 1024 + "context": 32000, + "output": 8000 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": false }, "attachment": false, - "open_weights": true, - "release_date": "2023-11-07", - "last_updated": "2023-11-07", - "type": "embedding" + "open_weights": false, + "knowledge": "2024-04", + "release_date": "2024-04-03", + "last_updated": "2025-01-25", + "type": "chat" }, { - "id": "gpt-4.1-nano", - "name": "GPT-4.1 nano", - "display_name": "GPT-4.1 nano", + "id": "qwen/qwen3.6-flash", + "name": "Qwen3.6 Flash", + "display_name": "Qwen3.6 Flash", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1047576, - "output": 32768 + "context": 1000000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": true, "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-04-14", - "last_updated": "2025-04-14", + "release_date": "2026-04-27", + "last_updated": "2026-04-27", "type": "chat" }, { - "id": "o4-mini", - "name": "o4-mini", - "display_name": "o4-mini", + "id": "qwen/qwen3-coder-plus", + "name": "Qwen3 Coder Plus", + "display_name": "Qwen3 Coder Plus", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 1000000, + "output": 64000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2024-05", - "release_date": "2025-04-16", - "last_updated": "2025-04-16", + "knowledge": "2025-04", + "release_date": "2025-07-23", + "last_updated": "2025-07-23", "type": "chat" }, { - "id": "text-embedding-3-small", - "name": "text-embedding-3-small", - "display_name": "text-embedding-3-small", + "id": "qwen/qwen3-coder-flash", + "name": "Qwen3 Coder Flash", + "display_name": "Qwen3 Coder Flash", "modalities": { "input": [ "text" @@ -255810,75 +250633,66 @@ ] }, "limit": { - "context": 8192, - "output": 1536 + "context": 1000000, + "output": 64000 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": false }, "attachment": false, "open_weights": false, - "release_date": "2024-01-25", - "last_updated": "2024-01-25", - "type": "embedding" + "knowledge": "2025-04", + "release_date": "2025-07-28", + "last_updated": "2025-07-28", + "type": "chat" }, { - "id": "gpt-5.1-codex", - "name": "GPT-5.1 Codex", - "display_name": "GPT-5.1 Codex", + "id": "qwen/qwen3.5-flash", + "name": "Qwen3.5 Flash", + "display_name": "Qwen3.5 Flash", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 1000000, + "output": 64000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-11-14", - "last_updated": "2025-11-14", + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" }, { - "id": "gpt-4-turbo", - "name": "GPT-4 Turbo", - "display_name": "GPT-4 Turbo", + "id": "qwen/qwen3.5-397b-a17b", + "name": "Qwen3.5 397B-A17B", + "display_name": "Qwen3.5 397B-A17B", "modalities": { "input": [ "text", @@ -255889,125 +250703,129 @@ ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 256000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": true, - "open_weights": false, - "knowledge": "2023-12", - "release_date": "2023-11-06", - "last_updated": "2024-04-09", + "open_weights": true, + "release_date": "2026-02-15", + "last_updated": "2026-02-15", "type": "chat" }, { - "id": "claude-fable-5", - "name": "Claude Fable 5", - "display_name": "Claude Fable 5", + "id": "qwen/qwen-turbo", + "name": "Qwen Turbo", + "display_name": "Qwen Turbo", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 128000, + "output": 16000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], "interleaved": true, "summaries": true, - "visibility": "omitted", + "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", - "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", - "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." ] } }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-09", - "last_updated": "2026-06-09", + "knowledge": "2024-04", + "release_date": "2024-11-01", + "last_updated": "2025-04-28", "type": "chat" }, { - "id": "phi-4-mini", - "name": "Phi-4-mini", - "display_name": "Phi-4-mini", + "id": "qwen/qwen3.5-27b", + "name": "Qwen3.5 27B", + "display_name": "Qwen3.5 27B", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 256000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": true, "open_weights": true, - "knowledge": "2023-10", - "release_date": "2024-12-11", - "last_updated": "2024-12-11", + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" }, { - "id": "gpt-5.4-pro", - "name": "GPT-5.4 Pro", - "display_name": "GPT-5.4 Pro", + "id": "qwen/qwen3.5-122b-a10b", + "name": "Qwen3.5 122B-A10B", + "display_name": "Qwen3.5 122B-A10B", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 256000, + "output": 64000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -256016,45 +250834,37 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-05", - "last_updated": "2026-03-05", + "open_weights": true, + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" }, { - "id": "cohere-command-a", - "name": "Command A", - "display_name": "Command A", + "id": "qwen/qwen3.7-plus", + "name": "Qwen3.7 Plus", + "display_name": "Qwen3.7 Plus", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 1064000, + "output": 64000 }, "temperature": true, "tool_call": true, @@ -256062,57 +250872,63 @@ "supported": true, "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-06-01", - "release_date": "2025-03-13", - "last_updated": "2025-03-13", + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-04", + "release_date": "2026-06-02", + "last_updated": "2026-06-02", "type": "chat" }, { - "id": "gpt-image-1.5", - "name": "GPT-Image-1.5", - "display_name": "GPT-Image-1.5", + "id": "qwen/qwen3.8-flash", + "name": "Qwen3.8 Flash", + "display_name": "Qwen3.8 Flash", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ - "text", - "image" + "text" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 1000000, + "output": 131072 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": true, "open_weights": false, - "release_date": "2025-11-25", - "last_updated": "2025-11-25" - } - ] - }, - "zai-coding-plan": { - "id": "zai-coding-plan", - "name": "Z.AI Coding Plan", - "display_name": "Z.AI Coding Plan", - "api": "https://api.z.ai/api/coding/paas/v4", - "doc": "https://docs.z.ai/devpack/overview", - "models": [ + "release_date": "2026-08-26", + "last_updated": "2026-08-26", + "type": "chat" + }, { - "id": "glm-5.2-highspeed", - "name": "GLM-5.2 Highspeed", - "display_name": "GLM-5.2 Highspeed", + "id": "qwen/qwen3.8-max-0902", + "name": "Qwen3.8 Max 0902", + "display_name": "Qwen3.8 Max 0902", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "pdf" ], "output": [ "text" @@ -256130,39 +250946,35 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ - "high", - "max" + "low", + "medium", + "xhigh" ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "attachment": true, + "open_weights": false, + "release_date": "2026-09-02", + "last_updated": "2026-09-02", "type": "chat" }, { - "id": "glm-5.3-highspeed", - "name": "GLM-5.3 Highspeed", - "display_name": "GLM-5.3 Highspeed", + "id": "qwen/qwen3.8-27b", + "name": "Qwen3.8 27B", + "display_name": "Qwen3.8 27B", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, + "context": 1131072, "output": 131072 }, "temperature": true, @@ -256171,32 +250983,16 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "low", - "high", - "max" - ] - } - }, - "attachment": false, + "attachment": true, "open_weights": true, "release_date": "2026-08-14", "last_updated": "2026-08-14", "type": "chat" }, { - "id": "glm-5.3", - "name": "GLM-5.3", - "display_name": "GLM-5.3", + "id": "qwen/qwen3.6-max-preview", + "name": "Qwen3.6 Max Preview", + "display_name": "Qwen3.6 Max Preview", "modalities": { "input": [ "text" @@ -256206,8 +251002,8 @@ ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 256000, + "output": 64000 }, "temperature": true, "tool_call": true, @@ -256223,35 +251019,61 @@ "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "effort_options": [ - "low", - "high", - "max" ] } }, "attachment": false, - "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "open_weights": false, + "knowledge": "2025-04", + "release_date": "2026-04-20", + "last_updated": "2026-04-20", "type": "chat" }, { - "id": "glm-5.2", - "name": "GLM-5.2", - "display_name": "GLM-5.2", + "id": "qwen/qwen-vl-max", + "name": "Qwen-VL Max", + "display_name": "Qwen-VL Max", "modalities": { "input": [ + "text", + "image" + ], + "output": [ "text" + ] + }, + "limit": { + "context": 128000, + "output": 8000 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": false, + "knowledge": "2024-04", + "release_date": "2024-04-08", + "last_updated": "2025-08-13", + "type": "chat" + }, + { + "id": "x-ai/grok-4.6", + "name": "Grok 4.6", + "display_name": "Grok 4.6", + "modalities": { + "input": [ + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 500000, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -256262,42 +251084,37 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ + "low", + "medium", "high", - "max" + "xhigh" ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "attachment": true, + "open_weights": false, + "knowledge": "2026-02-01", + "release_date": "2026-08-12", + "last_updated": "2026-08-12", "type": "chat" }, { - "id": "glm-5.3-flash", - "name": "GLM-5.3-Flash", - "display_name": "GLM-5.3-Flash", + "id": "x-ai/grok-4.5", + "name": "Grok 4.5", + "display_name": "Grok 4.5", "modalities": { "input": [ "text", - "image", - "video", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 500000, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -256308,40 +251125,36 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ "low", - "high", - "max" + "medium", + "high" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", + "open_weights": false, + "release_date": "2026-07-08", + "last_updated": "2026-07-08", "type": "chat" }, { - "id": "glm-5-turbo", - "name": "GLM-5-Turbo", - "display_name": "GLM-5-Turbo", + "id": "x-ai/grok-4.20", + "name": "Grok 4.20 (Reasoning)", + "display_name": "Grok 4.20 (Reasoning)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 131072 + "context": 2000000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -256349,80 +251162,49 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-03-16", - "last_updated": "2026-03-16", + "release_date": "2026-03-09", + "last_updated": "2026-03-09", "type": "chat" }, { - "id": "glm-4.7", - "name": "GLM-4.7", - "display_name": "GLM-4.7", + "id": "x-ai/grok-4.1-fast", + "name": "Grok 4.1 Fast", + "display_name": "Grok 4.1 Fast", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 2000000, + "output": 30000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-12-22", - "last_updated": "2025-12-22", + "attachment": true, + "open_weights": false, + "release_date": "2025-11-19", + "last_updated": "2025-11-19", "type": "chat" - } - ] - }, - "agnes": { - "id": "agnes", - "name": "Agnes AI", - "display_name": "Agnes AI", - "api": "https://apihub.agnes-ai.com/v1", - "doc": "https://agnes-ai.com/doc", - "models": [ + }, { - "id": "agnes-2.5-pro-alpha", - "name": "Agnes 2.5 Pro Alpha", - "display_name": "Agnes 2.5 Pro Alpha", + "id": "x-ai/grok-4.3", + "name": "Grok 4.3", + "display_name": "Grok 4.3", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" @@ -256430,7 +251212,7 @@ }, "limit": { "context": 1000000, - "output": 65536 + "output": 30000 }, "temperature": true, "tool_call": true, @@ -256441,35 +251223,36 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "none", + "low", + "medium", + "high" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-07-24", - "last_updated": "2026-07-24", + "open_weights": false, + "release_date": "2026-04-17", + "last_updated": "2026-04-17", "type": "chat" }, { - "id": "agnes-2.5-flash", - "name": "Agnes 2.5 Flash", - "display_name": "Agnes 2.5 Flash", + "id": "x-ai/grok-4.7", + "name": "Grok 4.7", + "display_name": "Grok 4.7", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 512000, + "context": 500000, "output": 65536 }, "temperature": true, @@ -256480,37 +251263,45 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "low", + "medium", + "high", + "xhigh" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-07", - "last_updated": "2026-07", + "knowledge": "2026-05", + "release_date": "2026-09-21", + "last_updated": "2026-09-21", "type": "chat" - }, + } + ] + }, + "zai-coding-plan": { + "id": "zai-coding-plan", + "name": "Z.AI Coding Plan", + "display_name": "Z.AI Coding Plan", + "api": "https://api.z.ai/api/coding/paas/v4", + "doc": "https://docs.z.ai/devpack/overview", + "models": [ { - "id": "agnes-2.0-flash", - "name": "Agnes 2.0 Flash", - "display_name": "Agnes 2.0 Flash", + "id": "glm-5.2", + "name": "GLM-5.2", + "display_name": "GLM-5.2", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 512000, - "output": 65536 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -256526,31 +251317,34 @@ "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "effort_options": [ + "high", + "max" ] } }, - "attachment": true, - "open_weights": false, - "release_date": "2026-05-25", - "last_updated": "2026-05-25", + "attachment": false, + "open_weights": true, + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "agnes-3.0-flash", - "name": "Agnes 3.0 Flash", - "display_name": "Agnes 3.0 Flash", + "id": "glm-5.3", + "name": "GLM-5.3", + "display_name": "GLM-5.3", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 512000, - "output": 65536 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -256566,40 +251360,35 @@ "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "effort_options": [ + "low", + "high", + "max" ] } }, - "attachment": true, - "open_weights": false, - "release_date": "2026-09", - "last_updated": "2026-09", + "attachment": false, + "open_weights": true, + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" - } - ] - }, - "deepseek": { - "id": "deepseek", - "name": "DeepSeek", - "display_name": "DeepSeek", - "api": "https://api.deepseek.com", - "doc": "https://api-docs.deepseek.com/quick_start/pricing", - "models": [ + }, { - "id": "deepseek-v4-flash", - "name": "DeepSeek V4 Flash", - "display_name": "DeepSeek V4 Flash", + "id": "glm-5-turbo", + "name": "GLM-5-Turbo", + "display_name": "GLM-5-Turbo", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 393216 + "context": 200000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -256610,36 +251399,24 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "high", - "max" - ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, - "attachment": true, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-10-17", - "last_updated": "2026-10-17", + "attachment": false, + "open_weights": false, + "release_date": "2026-03-16", + "last_updated": "2026-03-16", "type": "chat" }, { - "id": "deepseek-v4-pro", - "name": "DeepSeek V4 Pro", - "display_name": "DeepSeek V4 Pro", + "id": "glm-5.3-highspeed", + "name": "GLM-5.3 Highspeed", + "display_name": "GLM-5.3 Highspeed", "modalities": { "input": [ "text" @@ -256649,51 +251426,47 @@ ] }, "limit": { - "context": 1048576, - "output": 393216 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "high", - "max" - ], + }, + "extra_capabilities": { + "reasoning": { + "supported": true, "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" ], - "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." + "effort_options": [ + "low", + "high", + "max" ] } }, "attachment": false, "open_weights": true, - "release_date": "2026-08-13", - "last_updated": "2026-08-22", + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "deepseek-v4-flash-vision-exp", - "name": "DeepSeek V4 Flash Vision Exp", - "display_name": "DeepSeek V4 Flash Vision Exp", + "id": "glm-5.3-flash", + "name": "GLM-5.3-Flash", + "display_name": "GLM-5.3-Flash", "modalities": { "input": [ "text", - "image" + "image", + "video", + "pdf" ], "output": [ "text" @@ -256701,7 +251474,7 @@ }, "limit": { "context": 1000000, - "output": 384000 + "output": 131072 }, "temperature": true, "tool_call": true, @@ -256712,48 +251485,40 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "high", - "max" - ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" ], - "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." + "effort_options": [ + "low", + "high", + "max" ] } }, "attachment": true, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-08-21", - "last_updated": "2026-08-21", + "release_date": "2026-08-26", + "last_updated": "2026-08-26", "type": "chat" }, { - "id": "deepseek-flash", - "name": "DeepSeek V4.1 Flash", - "display_name": "DeepSeek V4.1 Flash", + "id": "glm-4.7", + "name": "GLM-4.7", + "display_name": "GLM-4.7", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 204800, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -256769,47 +251534,30 @@ "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "effort_options": [ - "low", - "high", - "max" ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-09-10", - "last_updated": "2026-09-10", + "knowledge": "2025-04", + "release_date": "2025-12-22", + "last_updated": "2025-12-22", "type": "chat" - } - ] - }, - "xiaomi-token-plan-sgp": { - "id": "xiaomi-token-plan-sgp", - "name": "Xiaomi Token Plan (Singapore)", - "display_name": "Xiaomi Token Plan (Singapore)", - "api": "https://token-plan-sgp.xiaomimimo.com/v1", - "doc": "https://platform.xiaomimimo.com/#/docs", - "models": [ + }, { - "id": "mimo-v2.6-pro", - "name": "MiMo-V2.6-Pro", - "display_name": "MiMo-V2.6-Pro", + "id": "glm-5.2-highspeed", + "name": "GLM-5.2 Highspeed", + "display_name": "GLM-5.2 Highspeed", "modalities": { "input": [ - "text", - "image", - "audio", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, + "context": 1000000, "output": 131072 }, "temperature": true, @@ -256826,35 +251574,47 @@ "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "effort_options": [ + "high", + "max" ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" - }, + } + ] + }, + "kenari": { + "id": "kenari", + "name": "Kenari", + "display_name": "Kenari", + "api": "https://kenari.id/v1", + "doc": "https://kenari.id/docs", + "models": [ { - "id": "mimo-v2.6-flash", - "name": "MiMo-V2.6-Flash", - "display_name": "MiMo-V2.6-Flash", + "id": "claude-fable-5", + "name": "Claude Fable 5", + "display_name": "Claude Fable 5", "modalities": { "input": [ "text", "image", - "audio", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -256863,24 +251623,40 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], "interleaved": true, "summaries": true, - "visibility": "summary", + "visibility": "omitted", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", + "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", + "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "open_weights": false, + "knowledge": "2026-01-31", + "release_date": "2026-06-09", + "last_updated": "2026-06-09", "type": "chat" }, { - "id": "mimo-v2.5-tts-voicedesign", - "name": "MiMo-V2.5-TTS-VoiceDesign", - "display_name": "MiMo-V2.5-TTS-VoiceDesign", + "id": "gemini-3-1-flash-tts", + "name": "Gemini 3.1 Flash TTS Preview", + "display_name": "Gemini 3.1 Flash TTS Preview", "modalities": { "input": [ "text" @@ -256891,22 +251667,23 @@ }, "limit": { "context": 8192, - "output": 8192 + "output": 16384 }, - "temperature": false, + "temperature": true, "tool_call": false, "reasoning": { "supported": false }, "attachment": false, "open_weights": false, - "release_date": "2026-04-22", - "last_updated": "2026-04-22" + "knowledge": "2025-01", + "release_date": "2026-04-15", + "last_updated": "2026-04-15" }, { - "id": "mimo-v2.5-pro", - "name": "MiMo-V2.5-Pro", - "display_name": "MiMo-V2.5-Pro", + "id": "gpt-oss-20b", + "name": "GPT OSS 20B", + "display_name": "GPT OSS 20B", "modalities": { "input": [ "text" @@ -256916,8 +251693,8 @@ ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 131072, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -256928,91 +251705,102 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "low", + "medium", + "high" ] } }, "attachment": false, "open_weights": true, - "knowledge": "2024-12", - "release_date": "2026-04-22", - "last_updated": "2026-04-22", + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "mimo-v2.5-tts-voiceclone", - "name": "MiMo-V2.5-TTS-VoiceClone", - "display_name": "MiMo-V2.5-TTS-VoiceClone", + "id": "hy3", + "name": "Hy3", + "display_name": "Hy3", "modalities": { "input": [ "text" ], "output": [ - "audio" + "text" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 256000, + "output": 128000 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "none", + "low", + "high" + ] + } }, "attachment": false, - "open_weights": false, - "release_date": "2026-04-22", - "last_updated": "2026-04-22" + "open_weights": true, + "release_date": "2026-07-06", + "last_updated": "2026-07-06", + "type": "chat" }, { - "id": "mimo-v2.5-tts", - "name": "MiMo-V2.5-TTS", - "display_name": "MiMo-V2.5-TTS", + "id": "mistral-large:free", + "name": "Mistral Large (Free)", + "display_name": "Mistral Large (Free)", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ - "audio" + "text" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 262144, + "output": 262144 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, - "open_weights": false, - "release_date": "2026-04-22", - "last_updated": "2026-04-22" + "attachment": true, + "open_weights": true, + "knowledge": "2024-11", + "release_date": "2024-11-01", + "last_updated": "2025-12-02", + "type": "chat" }, { - "id": "mimo-v2.5", - "name": "MiMo-V2.5", - "display_name": "MiMo-V2.5", + "id": "deepseek-v4-flash", + "name": "DeepSeek V4 Flash", + "display_name": "DeepSeek V4 Flash", "modalities": { "input": [ - "text", - "image", - "audio", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 1000000, + "output": 384000 }, "temperature": true, "tool_call": true, @@ -257023,33 +251811,36 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "high", + "max" + ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "notes": [ + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2024-12", - "release_date": "2026-04-22", - "last_updated": "2026-04-22", + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" - } - ] - }, - "anthropic": { - "id": "anthropic", - "name": "Anthropic", - "display_name": "Anthropic", - "doc": "https://docs.anthropic.com/en/docs/about-claude/models", - "models": [ + }, { - "id": "claude-haiku-5-5", - "name": "Claude Haiku 5.5", - "display_name": "Claude Haiku 5.5", + "id": "claude-sonnet-4-6", + "name": "Claude Sonnet 4.6", + "display_name": "Claude Sonnet 4.6", "modalities": { "input": [ "text", @@ -257062,149 +251853,162 @@ }, "limit": { "context": 1000000, - "output": 128000 + "output": 64000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", "effort_options": [ "low", "medium", "high", - "xhigh", "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-10-07", - "last_updated": "2026-10-07", + "knowledge": "2025-08-31", + "release_date": "2026-02-17", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "claude-haiku-4-5-20251001", - "name": "Claude Haiku 4.5", - "display_name": "Claude Haiku 4.5", + "id": "grok-imagine-image", + "name": "Grok Imagine Image", + "display_name": "Grok Imagine Image", "modalities": { "input": [ "text", - "image", - "pdf" + "image" + ], + "output": [ + "image" + ] + }, + "limit": { + "context": 16000, + "output": 8192 + }, + "temperature": false, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": false, + "release_date": "2026-01-28", + "last_updated": "2026-01-28" + }, + { + "id": "deepseek-v4-1-flash", + "name": "DeepSeek V4.1 Flash", + "display_name": "DeepSeek V4.1 Flash", + "modalities": { + "input": [ + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 1000000, + "output": 384000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + "effort_options": [ + "none", + "low", + "high", + "max" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-02-28", - "release_date": "2025-10-15", - "last_updated": "2025-10-15", + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-09-10", + "last_updated": "2026-09-10", "type": "chat" }, { - "id": "claude-opus-4-7", - "name": "Claude Opus 4.7", - "display_name": "Claude Opus 4.7", + "id": "hy3:free", + "name": "Hy3 (Free)", + "display_name": "Hy3 (Free)", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, + "context": 256000, "output": 128000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "high", "effort_options": [ + "none", "low", - "medium", - "high", - "xhigh", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." + "high" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-04-14", - "last_updated": "2026-04-16", + "attachment": false, + "open_weights": true, + "release_date": "2026-07-06", + "last_updated": "2026-07-06", "type": "chat" }, { - "id": "claude-sonnet-4-5", - "name": "Claude Sonnet 4.5 (latest)", - "display_name": "Claude Sonnet 4.5 (latest)", + "id": "glm-5-3-flash", + "name": "GLM-5.3-Flash", + "display_name": "GLM-5.3-Flash", "modalities": { "input": [ "text", "image", + "video", "pdf" ], "output": [ @@ -257212,60 +252016,46 @@ ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + "effort_options": [ + "low", + "high", + "max" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-07-31", - "release_date": "2025-09-29", - "last_updated": "2025-09-29", + "open_weights": true, + "release_date": "2026-08-26", + "last_updated": "2026-08-26", "type": "chat" }, { - "id": "claude-haiku-4-5", - "name": "Claude Haiku 4.5 (latest)", - "display_name": "Claude Haiku 4.5 (latest)", + "id": "gpt-5-4-mini", + "name": "GPT-5.4 mini", + "display_name": "GPT-5.4 mini", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 400000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -257277,38 +252067,41 @@ "reasoning": { "supported": true, "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." - ] + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2025-02-28", - "release_date": "2025-10-15", - "last_updated": "2025-10-15", + "knowledge": "2025-08-31", + "release_date": "2026-03-17", + "last_updated": "2026-03-17", "type": "chat" }, { - "id": "claude-sonnet-5-5", - "name": "Claude Sonnet 5.5", - "display_name": "Claude Sonnet 5.5", + "id": "gemini-2-5-flash-lite", + "name": "Gemini 2.5 Flash-Lite", + "display_name": "Gemini 2.5 Flash-Lite", "modalities": { "input": [ "text", "image", + "audio", + "video", "pdf" ], "output": [ @@ -257316,37 +252109,26 @@ ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 1048576, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ] - } - }, "attachment": true, "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-09-28", - "last_updated": "2026-09-28", + "knowledge": "2025-01", + "release_date": "2025-06-17", + "last_updated": "2025-06-17", "type": "chat" }, { - "id": "claude-fable-5-1", - "name": "Claude Fable 5.1", - "display_name": "Claude Fable 5.1", + "id": "claude-opus-4-7", + "name": "Claude Opus 4.7", + "display_name": "Claude Opus 4.7", "modalities": { "input": [ "text", @@ -257365,12 +252147,12 @@ "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, + "default_enabled": false, "mode": "effort", "effort": "high", "effort_options": [ @@ -257387,38 +252169,38 @@ "thinking_blocks" ], "notes": [ - "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", - "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", - "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-09-01", - "last_updated": "2026-09-01", + "knowledge": "2026-01-31", + "release_date": "2026-04-16", + "last_updated": "2026-04-16", "type": "chat" }, { - "id": "claude-sonnet-5", - "name": "Claude Sonnet 5", - "display_name": "Claude Sonnet 5", + "id": "nano-banana-2-lite", + "name": "Nano Banana 2 Lite", + "display_name": "Nano Banana 2 Lite", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ - "text" + "text", + "image" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 65536, + "output": 4096 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -257426,42 +252208,36 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" + "minimal", + "high" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-29", - "last_updated": "2026-06-30", - "type": "chat" + "knowledge": "2025-01", + "release_date": "2026-06-30", + "last_updated": "2026-06-30" }, { - "id": "claude-opus-5-5", - "name": "Claude Opus 5.5", - "display_name": "Claude Opus 5.5", + "id": "mistral-medium-3-5:free", + "name": "Mistral Medium 3.5 (Free)", + "display_name": "Mistral Medium 3.5 (Free)", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 262144, + "output": 262144 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -257470,29 +252246,26 @@ "extra_capabilities": { "reasoning": { "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" + "none", + "high" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "open_weights": true, + "release_date": "2026-04-29", + "last_updated": "2026-04-29", "type": "chat" }, { - "id": "claude-opus-4-5", - "name": "Claude Opus 4.5 (latest)", - "display_name": "Claude Opus 4.5 (latest)", + "id": "qwen3-8-max", + "name": "Qwen3.8 Max", + "display_name": "Qwen3.8 Max", "modalities": { "input": [ "text", "image", + "video", "pdf" ], "output": [ @@ -257500,381 +252273,301 @@ ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", "effort_options": [ "low", "medium", - "high" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." + "xhigh" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-05", - "release_date": "2025-11-24", - "last_updated": "2025-11-24", + "release_date": "2026-08-03", + "last_updated": "2026-08-03", "type": "chat" }, { - "id": "claude-opus-5", - "name": "Claude Opus 5", - "display_name": "Claude Opus 5", + "id": "minimax-m2-7", + "name": "MiniMax-M2.7", + "display_name": "MiniMax-M2.7", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 204800, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ] - } - }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-05", - "release_date": "2026-07-24", - "last_updated": "2026-07-24", + "attachment": false, + "open_weights": true, + "release_date": "2026-03-18", + "last_updated": "2026-03-18", "type": "chat" }, { - "id": "claude-sonnet-4-6", - "name": "Claude Sonnet 4.6", - "display_name": "Claude Sonnet 4.6", + "id": "grok-4-6", + "name": "Grok 4.6", + "display_name": "Grok 4.6", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 500000, + "output": 500000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", "effort_options": [ "low", "medium", "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." + "xhigh" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-17", - "last_updated": "2026-03-13", + "knowledge": "2026-02-01", + "release_date": "2026-08-12", + "last_updated": "2026-08-12", "type": "chat" }, { - "id": "claude-opus-4-5-20251101", - "name": "Claude Opus 4.5", - "display_name": "Claude Opus 4.5", + "id": "step-3-7-flash", + "name": "Step 3.7 Flash", + "display_name": "Step 3.7 Flash", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 256000, + "output": 256000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", "effort_options": [ "low", "medium", "high" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-05", - "release_date": "2025-11-24", - "last_updated": "2025-11-01", + "open_weights": true, + "knowledge": "2026-03-01", + "release_date": "2026-05-29", + "last_updated": "2026-05-29", "type": "chat" }, { - "id": "claude-opus-4-6", - "name": "Claude Opus 4.6", - "display_name": "Claude Opus 4.6", + "id": "kimi-k2-7-code", + "name": "Kimi K2.7 Code", + "display_name": "Kimi K2.7 Code", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 262144, + "output": 262144 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." - ] - } + "default": true }, "attachment": true, - "open_weights": false, - "knowledge": "2025-05-31", - "release_date": "2026-02-04", - "last_updated": "2026-03-13", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-06-12", + "last_updated": "2026-06-12", "type": "chat" }, { - "id": "claude-opus-4-8", - "name": "Claude Opus 4.8", - "display_name": "Claude Opus 4.8", + "id": "kimi-k2-7-code:free", + "name": "Kimi K2.7 Code (Free)", + "display_name": "Kimi K2.7 Code (Free)", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 262144, + "output": 262144 }, "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." - ] - } + "default": true }, "attachment": true, - "open_weights": false, - "knowledge": "2026-01", - "release_date": "2026-05-28", - "last_updated": "2026-05-28", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-06-12", + "last_updated": "2026-06-12", "type": "chat" }, { - "id": "claude-sonnet-4-5-20250929", - "name": "Claude Sonnet 4.5", - "display_name": "Claude Sonnet 4.5", + "id": "glm-5-1", + "name": "GLM-5.1", + "display_name": "GLM-5.1", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 200000, + "output": 131072 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "attachment": false, + "open_weights": true, + "release_date": "2026-04-07", + "last_updated": "2026-04-07", + "type": "chat" + }, + { + "id": "kimi-k2-6:free", + "name": "Kimi K2.6 (Free)", + "display_name": "Kimi K2.6 (Free)", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true + }, + "attachment": true, + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-04-20", + "last_updated": "2026-04-20", + "type": "chat" + }, + { + "id": "nano-banana-pro", + "name": "Nano Banana Pro", + "display_name": "Nano Banana Pro", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text", + "image" + ] + }, + "limit": { + "context": 65536, + "output": 32768 + }, + "temperature": true, + "tool_call": false, + "reasoning": { + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + "effort_options": [ + "low", + "high" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-07-31", - "release_date": "2025-09-29", - "last_updated": "2025-09-29", - "type": "chat" + "knowledge": "2025-01", + "release_date": "2026-05-28", + "last_updated": "2026-05-28" }, { - "id": "claude-fable-5", - "name": "Claude Fable 5", - "display_name": "Claude Fable 5", + "id": "claude-opus-4-8", + "name": "Claude Opus 4.8", + "display_name": "Claude Opus 4.8", "modalities": { "input": [ "text", @@ -257893,12 +252586,12 @@ "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, + "default_enabled": false, "mode": "effort", "effort": "high", "effort_options": [ @@ -257915,42 +252608,37 @@ "thinking_blocks" ], "notes": [ - "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", - "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", - "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-06-07", - "last_updated": "2026-06-09", + "knowledge": "2026-01", + "release_date": "2026-05-28", + "last_updated": "2026-05-28", "type": "chat" - } - ] - }, - "salad-cloud": { - "id": "salad-cloud", - "name": "SaladCloud AI Gateway", - "display_name": "SaladCloud AI Gateway", - "doc": "https://docs.salad.com/ai-gateway/explanation/overview", - "models": [ + }, { - "id": "qwen3.6-35b-a3b", - "name": "Qwen3.6 35B-A3B", - "display_name": "Qwen3.6 35B-A3B", + "id": "mimo-v2-5:free", + "name": "MiMo-V2.5 (Free)", + "display_name": "MiMo-V2.5 (Free)", "modalities": { "input": [ "text", - "image" + "image", + "audio", + "video" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1048576, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -257958,47 +252646,30 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, "attachment": true, "open_weights": true, - "release_date": "2026-04-17", - "last_updated": "2026-04-17", + "knowledge": "2024-12", + "release_date": "2026-04-22", + "last_updated": "2026-04-22", "type": "chat" - } - ] - }, - "zai": { - "id": "zai", - "name": "Z.AI", - "display_name": "Z.AI", - "api": "https://api.z.ai/api/paas/v4", - "doc": "https://docs.z.ai/guides/overview/pricing", - "models": [ + }, { - "id": "glm-5.1", - "name": "GLM-5.1", - "display_name": "GLM-5.1", + "id": "qwen3-7-plus", + "name": "Qwen3.7 Plus", + "display_name": "Qwen3.7 Plus", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 131072 + "context": 1000000, + "output": 64000 }, "temperature": true, "tool_call": true, @@ -258006,32 +252677,23 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, - "attachment": false, - "open_weights": true, - "release_date": "2026-04-07", - "last_updated": "2026-04-07", + "attachment": true, + "open_weights": false, + "knowledge": "2025-04", + "release_date": "2026-06-02", + "last_updated": "2026-06-02", "type": "chat" }, { - "id": "glm-5v-turbo", - "name": "GLM-5V-Turbo", - "display_name": "GLM-5V-Turbo", + "id": "gemini-3-5-flash", + "name": "Gemini 3.5 Flash", + "display_name": "Gemini 3.5 Flash", "modalities": { "input": [ "text", "image", "video", + "audio", "pdf" ], "output": [ @@ -258039,8 +252701,8 @@ ] }, "limit": { - "context": 200000, - "output": 131072 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -258050,25 +252712,25 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "minimal", + "low", + "medium", + "high" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-04-01", - "last_updated": "2026-04-01", + "knowledge": "2025-01", + "release_date": "2026-05-19", + "last_updated": "2026-05-19", "type": "chat" }, { - "id": "glm-5", - "name": "GLM-5", - "display_name": "GLM-5", + "id": "minimax-m2-7-highspeed", + "name": "MiniMax-M2.7-highspeed", + "display_name": "MiniMax-M2.7-highspeed", "modalities": { "input": [ "text" @@ -258087,40 +252749,69 @@ "supported": true, "default": true }, + "attachment": false, + "open_weights": true, + "release_date": "2026-03-18", + "last_updated": "2026-03-18", + "type": "chat" + }, + { + "id": "deepseek-v4-flash:free", + "name": "DeepSeek V4 Flash (Free)", + "display_name": "DeepSeek V4 Flash (Free)", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1000000, + "output": 384000 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "low", + "high", + "max" ] } }, "attachment": false, "open_weights": true, - "release_date": "2026-02-12", - "last_updated": "2026-02-12", + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "glm-4.6", - "name": "GLM-4.6", - "display_name": "GLM-4.6", + "id": "claude-opus-5", + "name": "Claude Opus 5", + "display_name": "Claude Opus 5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -258129,36 +252820,41 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-09-30", - "last_updated": "2025-09-30", + "attachment": true, + "open_weights": false, + "knowledge": "2026-05", + "release_date": "2026-07-24", + "last_updated": "2026-07-24", "type": "chat" }, { - "id": "glm-4.5-air", - "name": "GLM-4.5-Air", - "display_name": "GLM-4.5-Air", + "id": "gemini-3-6-flash", + "name": "Gemini 3.6 Flash", + "display_name": "Gemini 3.6 Flash", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 98304 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -258168,39 +252864,40 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "minimal", + "low", + "medium", + "high" ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-07-28", - "last_updated": "2025-07-28", + "attachment": true, + "open_weights": false, + "knowledge": "2026-03", + "release_date": "2026-07-21", + "last_updated": "2026-07-21", "type": "chat" }, { - "id": "glm-5.3", - "name": "GLM-5.3", - "display_name": "GLM-5.3", + "id": "gpt-5-5", + "name": "GPT-5.5", + "display_name": "GPT-5.5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -258209,42 +252906,50 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ "low", + "medium", "high", - "max" - ] + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "attachment": true, + "open_weights": false, + "knowledge": "2025-12-01", + "release_date": "2026-04-23", + "last_updated": "2026-04-23", "type": "chat" }, { - "id": "glm-4.6v", - "name": "GLM-4.6V", - "display_name": "GLM-4.6V", + "id": "gemini-3-1-pro", + "name": "Gemini 3.1 Pro Preview", + "display_name": "Gemini 3.1 Pro Preview", "modalities": { "input": [ "text", "image", - "video" + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 32768 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -258254,26 +252959,24 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "low", + "medium", + "high" ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-12-08", - "last_updated": "2025-12-08", + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2026-02-19", + "last_updated": "2026-02-19", "type": "chat" }, { - "id": "glm-5.2", - "name": "GLM-5.2", - "display_name": "GLM-5.2", + "id": "nemotron-3-super-120b-a12b", + "name": "Nemotron 3 Super 120B A12B", + "display_name": "Nemotron 3 Super 120B A12B", "modalities": { "input": [ "text" @@ -258283,8 +252986,8 @@ ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, @@ -258294,29 +252997,24 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ - "high", - "max" + "none", + "low", + "medium" ] } }, "attachment": false, "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "knowledge": "2025-06", + "release_date": "2026-03-11", + "last_updated": "2026-03-11", "type": "chat" }, { - "id": "glm-4.7-flashx", - "name": "GLM-4.7-FlashX", - "display_name": "GLM-4.7-FlashX", + "id": "gpt-oss-120b", + "name": "GPT OSS 120B", + "display_name": "GPT OSS 120B", "modalities": { "input": [ "text" @@ -258326,8 +253024,8 @@ ] }, "limit": { - "context": 200000, - "output": 131072 + "context": 131072, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -258338,25 +253036,24 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "low", + "medium", + "high" ] } }, "attachment": false, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2026-01-19", - "last_updated": "2026-01-19", + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "glm-5.3-flashx", - "name": "GLM-5.3-FlashX", - "display_name": "GLM-5.3-FlashX", + "id": "nano-banana-2", + "name": "Nano Banana 2", + "display_name": "Nano Banana 2", "modalities": { "input": [ "text", @@ -258365,45 +253062,38 @@ "pdf" ], "output": [ - "text" + "text", + "image" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 131072, + "output": 32768 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ - "low", - "high", - "max" + "minimal", + "high" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-09-18", - "last_updated": "2026-09-18", - "type": "chat" + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2026-05-28", + "last_updated": "2026-05-28" }, { - "id": "glm-4.5v", - "name": "GLM-4.5V", - "display_name": "GLM-4.5V", + "id": "kimi-k2-6", + "name": "Kimi K2.6", + "display_name": "Kimi K2.6", "modalities": { "input": [ "text", @@ -258415,8 +253105,8 @@ ] }, "limit": { - "context": 64000, - "output": 16384 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, @@ -258424,33 +253114,23 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, "attachment": true, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-08-11", - "last_updated": "2025-08-11", + "knowledge": "2025-01", + "release_date": "2026-04-20", + "last_updated": "2026-04-20", "type": "chat" }, { - "id": "glm-5.3-flash", - "name": "GLM-5.3-Flash", - "display_name": "GLM-5.3-Flash", + "id": "gemini-3-1-flash-lite", + "name": "Gemini 3.1 Flash Lite", + "display_name": "Gemini 3.1 Flash Lite", "modalities": { "input": [ "text", "image", "video", + "audio", "pdf" ], "output": [ @@ -258458,8 +253138,8 @@ ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -258469,30 +253149,52 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ + "minimal", "low", - "high", - "max" + "medium", + "high" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2026-05-07", + "last_updated": "2026-05-07", "type": "chat" }, { - "id": "glm-5-turbo", - "name": "GLM-5-Turbo", - "display_name": "GLM-5-Turbo", + "id": "grok-imagine-image-2-0", + "name": "Grok Imagine Image 2.0", + "display_name": "Grok Imagine Image 2.0", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "image" + ] + }, + "limit": { + "context": 64000, + "output": 8192 + }, + "temperature": false, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": false, + "release_date": "2026-08-07", + "last_updated": "2026-08-07" + }, + { + "id": "glm-4-7-flash:free", + "name": "GLM-4.7-Flash (Free)", + "display_name": "GLM-4.7-Flash (Free)", "modalities": { "input": [ "text" @@ -258511,38 +253213,30 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, "attachment": false, - "open_weights": false, - "release_date": "2026-03-16", - "last_updated": "2026-03-16", + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2026-01-19", + "last_updated": "2026-01-19", "type": "chat" }, { - "id": "glm-4.7", - "name": "GLM-4.7", - "display_name": "GLM-4.7", + "id": "minimax-m3", + "name": "MiniMax-M3", + "display_name": "MiniMax-M3", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 1048576, + "output": 512000 }, "temperature": true, "tool_call": true, @@ -258552,26 +253246,19 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-12-22", - "last_updated": "2025-12-22", + "release_date": "2026-06-01", + "last_updated": "2026-06-01", "type": "chat" }, { - "id": "glm-4.5", - "name": "GLM-4.5", - "display_name": "GLM-4.5", + "id": "glm-5-2", + "name": "GLM-5.2", + "display_name": "GLM-5.2", "modalities": { "input": [ "text" @@ -258581,8 +253268,8 @@ ] }, "limit": { - "context": 131072, - "output": 98304 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -258592,39 +253279,38 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "none", + "high", + "xhigh" ] } }, "attachment": false, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-07-28", - "last_updated": "2025-07-28", + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "glm-4.5-flash", - "name": "GLM-4.5-Flash", - "display_name": "GLM-4.5-Flash", + "id": "gpt-5-6-luna", + "name": "GPT-5.6 Luna", + "display_name": "GPT-5.6 Luna", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 98304 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -258633,25 +253319,37 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2025-04", - "release_date": "2025-07-28", - "last_updated": "2025-07-28", + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "glm-4.7-flash", - "name": "GLM-4.7-Flash", - "display_name": "GLM-4.7-Flash", + "id": "nemotron-3-nano-30b-a3b", + "name": "Nemotron 3 Nano 30B A3B", + "display_name": "Nemotron 3 Nano 30B A3B", "modalities": { "input": [ "text" @@ -258661,8 +253359,8 @@ ] }, "limit": { - "context": 200000, - "output": 131072 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, @@ -258670,40 +253368,28 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, "attachment": false, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2026-01-19", - "last_updated": "2026-01-19", + "knowledge": "2025-06-25", + "release_date": "2025-12-15", + "last_updated": "2025-12-15", "type": "chat" }, { - "id": "glm-4.6v-flash", - "name": "GLM-4.6V-Flash", - "display_name": "GLM-4.6V-Flash", + "id": "gemma-4-31b-it", + "name": "Gemma 4 31B IT", + "display_name": "Gemma 4 31B IT", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 128000, + "context": 262144, "output": 32768 }, "temperature": true, @@ -258714,34 +253400,20 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, "attachment": true, "open_weights": true, - "release_date": "2025-12-08", - "last_updated": "2025-12-08", + "knowledge": "2025-01", + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" - } - ] - }, - "model-oracle-ai": { - "id": "model-oracle-ai", - "name": "Model Oracle AI", - "display_name": "Model Oracle AI", - "api": "https://api.modeloracle.com/api/v1", - "doc": "https://modeloracle.com/setup/", - "models": [ + }, { - "id": "gpt-5.4-mini", - "name": "GPT-5.4 mini", - "display_name": "GPT-5.4 mini", + "id": "grok-4-5", + "name": "Grok 4.5", + "display_name": "Grok 4.5", "modalities": { "input": [ "text", @@ -258752,100 +253424,72 @@ ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 500000, + "output": 500000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ "low", "medium", "high" - ], - "visibility": "hidden" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-17", - "last_updated": "2026-03-17", + "release_date": "2026-07-08", + "last_updated": "2026-07-08", "type": "chat" }, { - "id": "gpt-5.4-nano", - "name": "GPT-5.4 nano", - "display_name": "GPT-5.4 nano", + "id": "nemotron-3-super-120b-a12b:free", + "name": "Nemotron 3 Super 120B A12B (Free)", + "display_name": "Nemotron 3 Super 120B A12B (Free)", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", "effort_options": [ "none", "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "medium" + ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-17", - "last_updated": "2026-03-17", + "attachment": false, + "open_weights": true, + "knowledge": "2025-06", + "release_date": "2026-03-11", + "last_updated": "2026-03-11", "type": "chat" }, { - "id": "deepseek-v4-pro", - "name": "DeepSeek V4 Pro", - "display_name": "DeepSeek V4 Pro", + "id": "glm-5-3", + "name": "GLM-5.3", + "display_name": "GLM-5.3", "modalities": { "input": [ "text" @@ -258856,7 +253500,7 @@ }, "limit": { "context": 1000000, - "output": 384000 + "output": 131072 }, "temperature": true, "tool_call": true, @@ -258866,31 +253510,17 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", "effort_options": [ "low", "high", "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, "attachment": false, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { @@ -258937,14 +253567,12 @@ "type": "chat" }, { - "id": "auto", - "name": "Auto", - "display_name": "Auto", + "id": "deepseek-v4-pro", + "name": "DeepSeek V4 Pro", + "display_name": "DeepSeek V4 Pro", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" @@ -258952,7 +253580,7 @@ }, "limit": { "context": 1000000, - "output": 128000 + "output": 384000 }, "temperature": true, "tool_call": true, @@ -258963,84 +253591,97 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", "effort_options": [ - "none", - "minimal", "low", - "medium", "high", - "xhigh", "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, - "attachment": true, - "open_weights": false, - "release_date": "2026-06-29", - "last_updated": "2026-07-07", + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "claude-haiku-4.5", - "name": "Claude Haiku 4.5 (latest)", - "display_name": "Claude Haiku 4.5 (latest)", + "id": "mimo-v2-5", + "name": "MiMo-V2.5", + "display_name": "MiMo-V2.5", "modalities": { "input": [ "text", "image", - "pdf" + "audio", + "video" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 1048576, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." - ] - } + "default": true }, "attachment": true, - "open_weights": false, - "knowledge": "2025-02-28", - "release_date": "2025-10-15", - "last_updated": "2025-10-15", + "open_weights": true, + "knowledge": "2024-12", + "release_date": "2026-04-22", + "last_updated": "2026-04-22", "type": "chat" }, { - "id": "claude-opus-4.8", - "name": "Claude Opus 4.8", - "display_name": "Claude Opus 4.8", + "id": "whisper-large-v3-turbo", + "name": "Whisper Large v3 Turbo", + "display_name": "Whisper Large v3 Turbo", "modalities": { "input": [ - "text", - "image", - "pdf" + "audio" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 448, + "output": 448 + }, + "temperature": true, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": true, + "release_date": "2024-10-01", + "last_updated": "2024-10-01" + }, + { + "id": "nemotron-3-ultra-550b-a55b", + "name": "Nemotron 3 Ultra 550B A55B", + "display_name": "Nemotron 3 Ultra 550B A55B", + "modalities": { + "input": [ + "text" ], "output": [ "text" @@ -259050,145 +253691,110 @@ "context": 1000000, "output": 128000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." - ] + "supported": true } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-01", - "release_date": "2026-05-28", - "last_updated": "2026-05-28", + "attachment": false, + "open_weights": true, + "knowledge": "2025-09", + "release_date": "2026-06-04", + "last_updated": "2026-06-04", "type": "chat" }, { - "id": "gpt-5.4", - "name": "GPT-5.4", - "display_name": "GPT-5.4", + "id": "mimo-v2-5-pro", + "name": "MiMo-V2.5-Pro", + "display_name": "MiMo-V2.5-Pro", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1048576, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "default": true }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-05", - "last_updated": "2026-03-05", + "attachment": false, + "open_weights": true, + "knowledge": "2024-12", + "release_date": "2026-04-22", + "last_updated": "2026-04-22", "type": "chat" }, { - "id": "gpt-4.1-mini", - "name": "GPT-4.1 mini", - "display_name": "GPT-4.1 mini", + "id": "step-3-7-flash:free", + "name": "Step 3.7 Flash (Free)", + "display_name": "Step 3.7 Flash (Free)", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1047576, - "output": 32768 + "context": 256000, + "output": 256000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "high" + ] + } }, "attachment": true, - "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-04-14", - "last_updated": "2025-04-14", + "open_weights": true, + "knowledge": "2026-03-01", + "release_date": "2026-05-29", + "last_updated": "2026-05-29", "type": "chat" }, { - "id": "gpt-5.5", - "name": "GPT-5.5", - "display_name": "GPT-5.5", + "id": "kimi-k3", + "name": "Kimi K3", + "display_name": "Kimi K3", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1048576, + "output": 131072 }, "temperature": false, "tool_call": true, @@ -259199,46 +253805,38 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", "effort_options": [ "low", - "medium", "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "max" + ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-12-01", - "release_date": "2026-04-23", - "last_updated": "2026-04-23", + "open_weights": true, + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" }, { - "id": "glm-5.2", - "name": "GLM-5.2", - "display_name": "GLM-5.2", + "id": "gemini-3-7-flash", + "name": "Gemini 3.7 Flash", + "display_name": "Gemini 3.7 Flash", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -259248,41 +253846,63 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ - "none", - "high", - "xhigh" + "low", + "medium", + "high" ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "attachment": true, + "open_weights": false, + "knowledge": "2026-03", + "release_date": "2026-08-13", + "last_updated": "2026-08-13", "type": "chat" }, { - "id": "gpt-5", - "name": "GPT-5", - "display_name": "GPT-5", + "id": "gpt-image-2", + "name": "GPT-Image-2", + "display_name": "GPT-Image-2", "modalities": { "input": [ "text", "image" ], + "output": [ + "image" + ] + }, + "limit": { + "context": 272000, + "output": 16384 + }, + "temperature": false, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": false, + "release_date": "2026-04-21", + "last_updated": "2026-04-21" + }, + { + "id": "gpt-5-6-sol", + "name": "GPT-5.6 Sol", + "display_name": "GPT-5.6 Sol", + "modalities": { + "input": [ + "text", + "image", + "pdf" + ], "output": [ "text" ] }, "limit": { - "context": 400000, + "context": 1050000, "output": 128000 }, "temperature": false, @@ -259298,10 +253918,12 @@ "mode": "effort", "effort": "medium", "effort_options": [ - "minimal", + "none", "low", "medium", - "high" + "high", + "xhigh", + "max" ], "verbosity": "medium", "verbosity_options": [ @@ -259314,19 +253936,21 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "gpt-4.1", - "name": "GPT-4.1", - "display_name": "GPT-4.1", + "id": "gemini-2-5-flash", + "name": "Gemini 2.5 Flash", + "display_name": "Gemini 2.5 Flash", "modalities": { "input": [ "text", "image", + "audio", + "video", "pdf" ], "output": [ @@ -259334,37 +253958,39 @@ ] }, "limit": { - "context": 1047576, - "output": 32768 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": true, "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-04-14", - "last_updated": "2025-04-14", + "knowledge": "2025-01", + "release_date": "2025-06-17", + "last_updated": "2025-06-17", "type": "chat" }, { - "id": "o4-mini", - "name": "o4-mini", - "display_name": "o4-mini", + "id": "gpt-5-6-terra", + "name": "GPT-5.6 Terra", + "display_name": "GPT-5.6 Terra", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 1050000, + "output": 128000 }, "temperature": false, "tool_call": true, @@ -259379,6 +254005,15 @@ "mode": "effort", "effort": "medium", "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ], + "verbosity": "medium", + "verbosity_options": [ "low", "medium", "high" @@ -259388,15 +254023,15 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2024-05", - "release_date": "2025-04-16", - "last_updated": "2025-04-16", + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "claude-fable-5", - "name": "Claude Fable 5", - "display_name": "Claude Fable 5", + "id": "grok-build-0-1", + "name": "Grok Build 0.1", + "display_name": "Grok Build 0.1", "modalities": { "input": [ "text", @@ -259408,65 +254043,37 @@ ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 256000, + "output": 256000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", - "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", - "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." - ] - } - }, "attachment": true, "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-09", - "last_updated": "2026-06-09", + "release_date": "2026-04-16", + "last_updated": "2026-04-16", "type": "chat" } ] }, - "hyper": { - "id": "hyper", - "name": "Charm Hyper", - "display_name": "Charm Hyper", - "api": "https://hyper.charm.land/v1", - "doc": "https://hyper.charm.land", + "bothub": { + "id": "bothub", + "name": "Bothub", + "display_name": "Bothub", + "api": "https://openai.bothub.ru/v1", + "doc": "https://bothub.ru/models", "models": [ { - "id": "qwen3.8-27b", - "name": "Qwen3.8 27B", - "display_name": "Qwen3.8 27B", + "id": "deepseek-v4-flash-0731", + "name": "DeepSeek V4 Flash 0731", + "display_name": "DeepSeek V4 Flash 0731", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" @@ -259474,7 +254081,7 @@ }, "limit": { "context": 1000000, - "output": 128000 + "output": 384000 }, "temperature": true, "tool_call": true, @@ -259484,39 +254091,42 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "interleaved": true, "effort_options": [ "none", - "minimal", "low", - "medium", - "high" + "high", + "max" ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "knowledge": "2025-05", + "release_date": "2026-07-31", + "last_updated": "2026-07-31", "type": "chat" }, { - "id": "qwen3.7-plus", - "name": "Qwen3.7 Plus", - "display_name": "Qwen3.7 Plus", + "id": "gpt-5.6-luna", + "name": "GPT-5.6 Luna", + "display_name": "GPT-5.6 Luna", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 64000 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -259525,65 +254135,41 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ "none", - "minimal", + "low", + "medium", + "high", + "xhigh", + "max" + ], + "verbosity": "medium", + "verbosity_options": [ "low", "medium", "high" - ] + ], + "interleaved": true, + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2025-04", - "release_date": "2026-06-02", - "last_updated": "2026-06-02", + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "kimi-k2.7-code", - "name": "Kimi K2.7 Code", - "display_name": "Kimi K2.7 Code", + "id": "glm-5.3", + "name": "GLM-5.3", + "display_name": "GLM-5.3", "modalities": { "input": [ - "text", - "image" - ], - "output": [ "text" - ] - }, - "limit": { - "context": 256000, - "output": 16000 - }, - "temperature": false, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, - "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-06-12", - "last_updated": "2026-06-12", - "type": "chat" - }, - { - "id": "qwen3.8-max", - "name": "Qwen3.8 Max Preview", - "display_name": "Qwen3.8 Max Preview", - "modalities": { - "input": [ - "text", - "image" ], "output": [ "text" @@ -259591,7 +254177,7 @@ }, "limit": { "context": 1000000, - "output": 65536 + "output": 131072 }, "temperature": true, "tool_call": true, @@ -259602,36 +254188,39 @@ "extra_capabilities": { "reasoning": { "supported": true, + "interleaved": true, "effort_options": [ - "none", - "minimal", "low", - "medium", - "high" + "high", + "max" ] } }, - "attachment": true, - "open_weights": false, - "release_date": "2026-07-19", - "last_updated": "2026-07-19", + "attachment": false, + "open_weights": true, + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "deepseek-v4-pro-0813", - "name": "DeepSeek V4 Pro 0813", - "display_name": "DeepSeek V4 Pro 0813", + "id": "muse-spark-1.3-contributor", + "name": "Muse Spark 1.3 Contributor", + "display_name": "Muse Spark 1.3 Contributor", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "pdf", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 262144 + "context": 1048576, + "output": 943718 }, "temperature": true, "tool_call": true, @@ -259642,26 +254231,30 @@ "extra_capabilities": { "reasoning": { "supported": true, + "interleaved": true, "effort_options": [ + "minimal", "low", + "medium", "high", - "max" + "xhigh" ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-08-13", - "last_updated": "2026-08-22", + "attachment": true, + "open_weights": false, + "release_date": "2026-09-02", + "last_updated": "2026-09-02", "type": "chat" }, { - "id": "kimi-k2-thinking", - "name": "Kimi K2 Thinking", - "display_name": "Kimi K2 Thinking", + "id": "gemma-4-31b-it:free", + "name": "Gemma 4 31B IT (free)", + "display_name": "Gemma 4 31B IT (free)", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" @@ -259669,7 +254262,7 @@ }, "limit": { "context": 262144, - "output": 26214 + "output": 32768 }, "temperature": true, "tool_call": true, @@ -259680,29 +254273,23 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "interleaved": true } }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2024-08", - "release_date": "2025-11-06", - "last_updated": "2025-11-06", + "knowledge": "2025-01", + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "qwen3.7-flash", - "name": "Qwen3.7 Flash", - "display_name": "Qwen3.7 Flash", + "id": "nemotron-3-ultra-550b-a55b:free", + "name": "Nemotron 3 Ultra (free)", + "display_name": "Nemotron 3 Ultra (free)", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" @@ -259710,7 +254297,7 @@ }, "limit": { "context": 1000000, - "output": 64000 + "output": 128000 }, "temperature": true, "tool_call": true, @@ -259721,28 +254308,31 @@ "extra_capabilities": { "reasoning": { "supported": true, + "interleaved": true, "effort_options": [ "none", - "minimal", - "low", "medium", "high" ] } }, - "attachment": true, - "open_weights": false, - "release_date": "2026-07-15", - "last_updated": "2026-07-15", + "attachment": false, + "open_weights": true, + "knowledge": "2025-09", + "release_date": "2026-06-04", + "last_updated": "2026-06-04", "type": "chat" }, { - "id": "glm-5.3", - "name": "GLM-5.3", - "display_name": "GLM-5.3", + "id": "glm-5.3-flash", + "name": "GLM-5.3-Flash", + "display_name": "GLM-5.3-Flash", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "pdf" ], "output": [ "text" @@ -259750,7 +254340,7 @@ }, "limit": { "context": 1000000, - "output": 128000 + "output": 131072 }, "temperature": true, "tool_call": true, @@ -259761,6 +254351,7 @@ "extra_capabilities": { "reasoning": { "supported": true, + "interleaved": true, "effort_options": [ "low", "high", @@ -259768,16 +254359,16 @@ ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "release_date": "2026-08-26", + "last_updated": "2026-08-26", "type": "chat" }, { - "id": "deepseek-v4-flash-0731", - "name": "DeepSeek V4 Flash 0731", - "display_name": "DeepSeek V4 Flash 0731", + "id": "deepseek-v4-pro-0813", + "name": "DeepSeek V4 Pro 0813", + "display_name": "DeepSeek V4 Pro 0813", "modalities": { "input": [ "text" @@ -259799,8 +254390,9 @@ "extra_capabilities": { "reasoning": { "supported": true, + "interleaved": true, "effort_options": [ - "low", + "none", "high", "max" ] @@ -259808,15 +254400,23 @@ }, "attachment": false, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-07-31", - "last_updated": "2026-07-31", + "release_date": "2026-08-13", + "last_updated": "2026-08-22", "type": "chat" - }, + } + ] + }, + "stackit": { + "id": "stackit", + "name": "STACKIT", + "display_name": "STACKIT", + "api": "https://api.openai-compat.model-serving.eu01.onstackit.cloud/v1", + "doc": "https://docs.stackit.cloud/products/data-and-ai/ai-model-serving/basics/available-shared-models", + "models": [ { - "id": "qwen3.7-max", - "name": "Qwen3.7 Max", - "display_name": "Qwen3.7 Max", + "id": "intfloat/e5-mistral-7b-instruct", + "name": "E5 Mistral 7B", + "display_name": "E5 Mistral 7B", "modalities": { "input": [ "text" @@ -259826,51 +254426,37 @@ ] }, "limit": { - "context": 1000000, - "output": 64000 + "context": 4096, + "output": 4096 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "none", - "minimal", - "low", - "medium", - "high" - ] - } + "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2026-05-21", - "last_updated": "2026-05-21", - "type": "chat" + "open_weights": true, + "release_date": "2023-12-11", + "last_updated": "2023-12-11", + "type": "embedding" }, { - "id": "kimi-k3", - "name": "Kimi K3", - "display_name": "Kimi K3", + "id": "openai/gpt-oss-20b", + "name": "GPT OSS 20B", + "display_name": "GPT OSS 20B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 16000 + "context": 131072, + "output": 8192 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -259878,36 +254464,31 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "effort_options": [ - "low", - "high", - "max" - ] + "supported": true } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-16", + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "deepseek-v4.1-flash-1017", - "name": "DeepSeek V4.1 Flash 1017", - "display_name": "DeepSeek V4.1 Flash 1017", + "id": "openai/gpt-oss-120b", + "name": "GPT OSS 120B", + "display_name": "GPT OSS 120B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 262144 + "context": 131000, + "output": 8192 }, "temperature": true, "tool_call": true, @@ -259917,24 +254498,25 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ "low", - "high", - "max" + "medium", + "high" ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-10-17", - "last_updated": "2026-10-17", + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "gpt-oss-120b", - "name": "GPT OSS 120B", - "display_name": "GPT OSS 120B", + "id": "cortecs/Llama-3.3-70B-Instruct-FP8-Dynamic", + "name": "Llama 3.3 70B", + "display_name": "Llama 3.3 70B", "modalities": { "input": [ "text" @@ -259944,36 +254526,25 @@ ] }, "limit": { - "context": 131072, - "output": 13107 + "context": 128000, + "output": 4096 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "low", - "medium", - "high" - ] - } + "supported": false }, "attachment": false, "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "knowledge": "2023-12", + "release_date": "2024-12-06", + "last_updated": "2024-12-06", "type": "chat" }, { - "id": "inkling", - "name": "Inkling", - "display_name": "Inkling", + "id": "Qwen/Qwen3-VL-235B-A22B-Instruct-FP8", + "name": "Qwen3-VL 235B", + "display_name": "Qwen3-VL 235B", "modalities": { "input": [ "text", @@ -259984,34 +254555,25 @@ ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 218000, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high" - ] - } + "supported": false }, "attachment": true, "open_weights": true, - "release_date": "2026-07-15", - "last_updated": "2026-07-15", + "knowledge": "2025-03-31", + "release_date": "2025-09-23", + "last_updated": "2025-09-23", "type": "chat" }, { - "id": "glm-5.2", - "name": "GLM-5.2", - "display_name": "GLM-5.2", + "id": "Qwen/Qwen3.6-27B", + "name": "Qwen3.6 27B", + "display_name": "Qwen3.6 27B", "modalities": { "input": [ "text" @@ -260021,34 +254583,35 @@ ] }, "limit": { - "context": 1000000, - "output": 32768 + "context": 262144, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": true }, "extra_capabilities": { "reasoning": { "supported": true, - "effort_options": [ - "high", - "xhigh" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, "attachment": false, "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "release_date": "2026-04-22", + "last_updated": "2026-04-22", "type": "chat" }, { - "id": "deepseek-v4.1-flash", - "name": "DeepSeek V4.1 Flash", - "display_name": "DeepSeek V4.1 Flash", + "id": "Qwen/Qwen3-VL-Embedding-8B", + "name": "Qwen3-VL Embedding 8B", + "display_name": "Qwen3-VL Embedding 8B", "modalities": { "input": [ "text", @@ -260059,36 +254622,24 @@ ] }, "limit": { - "context": 1048576, - "output": 262144 + "context": 32000, + "output": 4096 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "low", - "high", - "max" - ] - } + "supported": false }, "attachment": true, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-09-10", - "last_updated": "2026-09-10", - "type": "chat" + "release_date": "2026-02-05", + "last_updated": "2026-02-05", + "type": "embedding" }, { - "id": "minimax-m3", - "name": "MiniMax-M3", - "display_name": "MiniMax-M3", + "id": "google/gemma-3-27b-it", + "name": "Gemma 3 27B", + "display_name": "Gemma 3 27B", "modalities": { "input": [ "text", @@ -260099,39 +254650,37 @@ ] }, "limit": { - "context": 512000, - "output": 512000 + "context": 37000, + "output": 4096 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "low", - "medium", - "high" - ] - } + "supported": false }, "attachment": true, "open_weights": true, - "release_date": "2026-06-01", - "last_updated": "2026-06-01", + "knowledge": "2024-08", + "release_date": "2025-03-12", + "last_updated": "2025-03-12", "type": "chat" - }, + } + ] + }, + "longcat": { + "id": "longcat", + "name": "LongCat", + "display_name": "LongCat", + "api": "https://api.longcat.chat/openai", + "doc": "https://longcat.chat/platform/docs/", + "models": [ { - "id": "glm-5.3-flash", - "name": "GLM-5.3-Flash", - "display_name": "GLM-5.3-Flash", + "id": "LongCat-2.0", + "name": "LongCat-2.0", + "display_name": "LongCat-2.0", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" @@ -260141,7 +254690,7 @@ "context": 1048576, "output": 131072 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -260150,36 +254699,38 @@ "extra_capabilities": { "reasoning": { "supported": true, - "effort_options": [ - "low", - "high", - "max" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", + "release_date": "2026-06-30", + "last_updated": "2026-06-30", "type": "chat" }, { - "id": "minimax-m2.7", - "name": "MiniMax-M2.7", - "display_name": "MiniMax-M2.7", + "id": "LongCat-2.5-Preview", + "name": "LongCat-2.5-Preview", + "display_name": "LongCat-2.5-Preview", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 262100, - "output": 6553 + "context": 1048576, + "output": 262144 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -260196,29 +254747,40 @@ ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-03-18", - "last_updated": "2026-03-18", + "attachment": true, + "open_weights": false, + "release_date": "2026-09-25", + "last_updated": "2026-09-25", "type": "chat" - }, + } + ] + }, + "wallaby": { + "id": "wallaby", + "name": "Wallaby", + "display_name": "Wallaby", + "api": "https://api.wallabytoken.com/v1", + "doc": "https://wallabytoken.com/docs", + "models": [ { - "id": "qwen3.8-2.4t-a95b", - "name": "Qwen3.8 2.4T A95B", - "display_name": "Qwen3.8 2.4T A95B", + "id": "moonshotai/kimi-k3", + "name": "Kimi K3", + "display_name": "Kimi K3", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 1048576, + "output": 131072 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -260227,71 +254789,83 @@ "extra_capabilities": { "reasoning": { "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ - "minimal", "low", "medium", - "high" + "high", + "max" ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-08-12", - "last_updated": "2026-08-12", + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" - }, + } + ] + }, + "azure-cognitive-services": { + "id": "azure-cognitive-services", + "name": "Azure Cognitive Services", + "display_name": "Azure Cognitive Services", + "doc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", + "models": [ { - "id": "gemma-4-26b-a4b-it", - "name": "Gemma 4 26B A4B IT", - "display_name": "Gemma 4 26B A4B IT", + "id": "gpt-4.1-nano", + "name": "GPT-4.1 nano", + "display_name": "GPT-4.1 nano", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 25600 + "context": 1047576, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, - "attachment": false, - "open_weights": true, - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "attachment": true, + "open_weights": false, + "knowledge": "2024-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", "type": "chat" }, { - "id": "qwen3.8-flash", - "name": "Qwen3.8 Flash", - "display_name": "Qwen3.8 Flash", + "id": "gpt-6.1-terra", + "name": "GPT-6.1 Terra", + "display_name": "GPT-6.1 Terra", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, + "context": 1050000, "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -260299,26 +254873,27 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ "none", - "minimal", "low", "medium", - "high" + "high", + "xhigh", + "max" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", + "knowledge": "2026-06-01", + "release_date": "2026-10-26", + "last_updated": "2026-10-26", "type": "chat" }, { - "id": "prism", - "name": "Prism", - "display_name": "Prism", + "id": "llama-4-scout-17b-16e-instruct", + "name": "Llama 4 Scout 17B 16E Instruct", + "display_name": "Llama 4 Scout 17B 16E Instruct", "modalities": { "input": [ "text", @@ -260329,88 +254904,92 @@ ] }, "limit": { - "context": 1000000, - "output": 16000 + "context": 128000, + "output": 8192 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": false }, "attachment": true, - "open_weights": false, - "release_date": "1970-01-01", - "last_updated": "2026-10-15", + "open_weights": true, + "knowledge": "2024-08", + "release_date": "2025-04-05", + "last_updated": "2025-04-05", "type": "chat" - } - ] - }, - "lilac": { - "id": "lilac", - "name": "Lilac", - "display_name": "Lilac", - "api": "https://api.getlilac.com/v1", - "doc": "https://docs.getlilac.com/inference/models", - "models": [ + }, { - "id": "google/gemma-4-31b-it", - "name": "Gemma 4 31B IT", - "display_name": "Gemma 4 31B IT", + "id": "claude-sonnet-4-5", + "name": "Claude Sonnet 4.5", + "display_name": "Claude Sonnet 4.5", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262100, - "output": 262100 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "open_weights": false, + "knowledge": "2025-07-31", + "release_date": "2025-11-18", + "last_updated": "2025-11-18", "type": "chat" }, { - "id": "moonshotai/kimi-k2.6", - "name": "Kimi K2.6", - "display_name": "Kimi K2.6", + "id": "claude-fable-5", + "name": "Claude Fable 5", + "display_name": "Claude Fable 5", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -260419,125 +254998,164 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], "interleaved": true, "summaries": true, - "visibility": "summary", + "visibility": "omitted", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", + "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", + "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-20", - "last_updated": "2026-04-20", + "open_weights": false, + "knowledge": "2026-01-31", + "release_date": "2026-06-09", + "last_updated": "2026-06-09", "type": "chat" }, { - "id": "zai-org/glm-5.2", - "name": "GLM 5.2", - "display_name": "GLM 5.2", + "id": "gpt-4-turbo", + "name": "GPT-4 Turbo", + "display_name": "GPT-4 Turbo", "modalities": { "input": [ + "text", + "image" + ], + "output": [ "text" + ] + }, + "limit": { + "context": 128000, + "output": 4096 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": false, + "knowledge": "2023-12", + "release_date": "2023-11-06", + "last_updated": "2024-04-09", + "type": "chat" + }, + { + "id": "claude-haiku-4-5", + "name": "Claude Haiku 4.5", + "display_name": "Claude Haiku 4.5", + "modalities": { + "input": [ + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 524288, - "output": 524288 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" ], - "effort_options": [ - "high", - "max" + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] - } - }, - "attachment": false, - "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-02-28", + "release_date": "2025-11-18", + "last_updated": "2025-11-18", "type": "chat" }, { - "id": "minimaxai/minimax-m3", - "name": "MiniMax M3", - "display_name": "MiniMax M3", + "id": "phi-4-mini", + "name": "Phi-4-mini", + "display_name": "Phi-4-mini", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 1048576 + "context": 128000, + "output": 4096 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-06-01", - "last_updated": "2026-06-01", + "knowledge": "2023-10", + "release_date": "2024-12-11", + "last_updated": "2024-12-11", "type": "chat" - } - ] - }, - "baseten": { - "id": "baseten", - "name": "Baseten", - "display_name": "Baseten", - "api": "https://inference.baseten.co/v1", - "doc": "https://docs.baseten.co/inference/model-apis/overview", - "models": [ + }, { - "id": "nvidia/NVIDIA-Nemotron-3-Ultra-550B-A55B", - "name": "Nemotron Ultra", - "display_name": "Nemotron Ultra", + "id": "gpt-5.6-terra", + "name": "GPT-5.6 Terra", + "display_name": "GPT-5.6 Terra", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 202800, - "output": 202800 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -260546,29 +255164,37 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ "none", + "low", + "medium", + "high", + "xhigh", + "max" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", "high" - ] + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-09", - "release_date": "2026-06-04", - "last_updated": "2026-06-04", + "attachment": true, + "open_weights": false, + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "moonshotai/Kimi-K3", - "name": "Kimi K3", - "display_name": "Kimi K3", + "id": "mistral-small-2503", + "name": "Mistral Small 3.1", + "display_name": "Mistral Small 3.1", "modalities": { "input": [ "text", @@ -260579,42 +255205,25 @@ ] }, "limit": { - "context": 1048576, - "output": 262144 + "context": 128000, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "none", - "low", - "high", - "max" - ] - } + "supported": false }, "attachment": true, - "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-16", + "open_weights": false, + "knowledge": "2024-09", + "release_date": "2025-03-01", + "last_updated": "2025-03-01", "type": "chat" }, { - "id": "openai/gpt-oss-120b", - "name": "OpenAI GPT 120B", - "display_name": "OpenAI GPT 120B", + "id": "deepseek-v4-flash", + "name": "DeepSeek-V4-Flash", + "display_name": "DeepSeek-V4-Flash", "modalities": { "input": [ "text" @@ -260624,8 +255233,8 @@ ] }, "limit": { - "context": 128072, - "output": 128072 + "context": 1000000, + "output": 384000 }, "temperature": true, "tool_call": true, @@ -260636,132 +255245,163 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "high", + "max" + ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" ], - "effort_options": [ - "none", - "minimal", - "low", - "medium", - "high", - "xhigh", - "max" + "notes": [ + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, "attachment": false, "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "zai-org/GLM-5.2-Fast", - "name": "GLM 5.2 Fast", - "display_name": "GLM 5.2 Fast", + "id": "gpt-5.4", + "name": "GPT-5.4", + "display_name": "GPT-5.4", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 262144 + "context": 1050000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], + "default_enabled": false, + "mode": "effort", + "effort": "none", "effort_options": [ "none", "low", + "medium", "high", - "max" - ] + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, - "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-03-05", + "last_updated": "2026-03-05", "type": "chat" }, { - "id": "zai-org/GLM-5.3-Fast", - "name": "GLM 5.3 Fast", - "display_name": "GLM 5.3 Fast", + "id": "claude-sonnet-4-6", + "name": "Claude Sonnet 4.6", + "display_name": "Claude Sonnet 4.6", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 262144 + "context": 1000000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", "effort_options": [ "low", + "medium", "high", "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-02-17", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "zai-org/GLM-5.3", - "name": "GLM 5.3", - "display_name": "GLM 5.3", + "id": "gpt-5.6-sol", + "name": "GPT-5.6 Sol", + "display_name": "GPT-5.6 Sol", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 262144 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -260770,131 +255410,132 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ + "none", "low", + "medium", "high", + "xhigh", "max" - ] + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, - "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "open_weights": false, + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "zai-org/GLM-5.2", - "name": "GLM 5.2", - "display_name": "GLM 5.2", + "id": "gpt-5.4-mini", + "name": "GPT-5.4 Mini", + "display_name": "GPT-5.4 Mini", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 262144 + "context": 400000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], + "default_enabled": false, + "mode": "effort", + "effort": "none", "effort_options": [ "none", "low", + "medium", "high", - "max" - ] + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, - "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-03-17", + "last_updated": "2026-03-17", "type": "chat" }, { - "id": "zai-org/GLM-5.3-Flash", - "name": "GLM 5.3 Flash", - "display_name": "GLM 5.3 Flash", + "id": "gpt-4o", + "name": "GPT-4o", + "display_name": "GPT-4o", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 128000, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "low", - "high", - "max" - ] - } + "supported": false }, "attachment": true, - "open_weights": true, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", + "open_weights": false, + "knowledge": "2023-09", + "release_date": "2024-05-13", + "last_updated": "2024-08-06", "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-V4-Pro-0813", - "name": "DeepSeek V4 Pro 0813", - "display_name": "DeepSeek V4 Pro 0813", + "id": "deepseek-v4.1-flash", + "name": "DeepSeek-V4.1-Flash", + "display_name": "DeepSeek-V4.1-Flash", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 262144 + "context": 1000000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -260919,108 +255560,98 @@ ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-08-13", - "last_updated": "2026-08-22", + "knowledge": "2025-05", + "release_date": "2026-09-10", + "last_updated": "2026-09-10", "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-V4.1-Flash-Fast", - "name": "DeepSeek V4.1 Flash Fast", - "display_name": "DeepSeek V4.1 Flash Fast", + "id": "gpt-5.1-codex-mini", + "name": "GPT-5.1 Codex Mini", + "display_name": "GPT-5.1 Codex Mini", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 32768 + "context": 400000, + "output": 128000 }, "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], + "default_enabled": false, + "mode": "effort", + "effort": "none", "effort_options": [ "none", - "high", - "max" - ] + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-09-10", - "last_updated": "2026-09-10", + "open_weights": false, + "knowledge": "2024-09-30", + "release_date": "2025-11-14", + "last_updated": "2025-11-14", "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-V4-Flash-0731", - "name": "DeepSeek V4 Flash 0731", - "display_name": "DeepSeek V4 Flash 0731", + "id": "llama-4-maverick-17b-128e-instruct-fp8", + "name": "Llama 4 Maverick 17B 128E Instruct FP8", + "display_name": "Llama 4 Maverick 17B 128E Instruct FP8", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 384000 + "context": 1000000, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "none", - "low", - "high", - "max" - ] - } + "supported": false }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-07-31", - "last_updated": "2026-07-31", + "knowledge": "2024-08", + "release_date": "2025-04-05", + "last_updated": "2025-04-05", "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-V4.1-Flash-1017-Fast", - "name": "DeepSeek V4.1 Flash 1017 Fast", - "display_name": "DeepSeek V4.1 Flash 1017 Fast", + "id": "grok-4-1-fast-reasoning", + "name": "Grok 4.1 Fast (Reasoning)", + "display_name": "Grok 4.1 Fast (Reasoning)", "modalities": { "input": [ "text", @@ -261031,8 +255662,8 @@ ] }, "limit": { - "context": 1048576, - "output": 262144 + "context": 128000, + "output": 8192 }, "temperature": true, "tool_call": true, @@ -261042,47 +255673,34 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "none", - "low", - "medium", - "high", - "max" - ] + "supported": true } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-10-17", - "last_updated": "2026-10-17", + "open_weights": false, + "release_date": "2025-06-27", + "last_updated": "2025-06-27", "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-V4.1-Flash-1017", - "name": "DeepSeek V4.1 Flash 1017", - "display_name": "DeepSeek V4.1 Flash 1017", + "id": "gpt-5.6-luna", + "name": "GPT-5.6 Luna", + "display_name": "GPT-5.6 Luna", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 262144 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -261091,32 +255709,37 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ "none", "low", "medium", "high", + "xhigh", "max" - ] + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-10-17", - "last_updated": "2026-10-17", + "open_weights": false, + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-V4.1-Flash", - "name": "DeepSeek V4.1 Flash", - "display_name": "DeepSeek V4.1 Flash", + "id": "grok-4.6", + "name": "Grok 4.6", + "display_name": "Grok 4.6", "modalities": { "input": [ "text", @@ -261127,8 +255750,8 @@ ] }, "limit": { - "context": 1048576, - "output": 32768 + "context": 200000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -261139,65 +255762,54 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ - "none", + "low", + "medium", "high", - "max" + "xhigh" ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-09-10", - "last_updated": "2026-09-10", + "open_weights": false, + "knowledge": "2026-02-01", + "release_date": "2026-08-12", + "last_updated": "2026-08-12", "type": "chat" - } - ] - }, - "privatemode-ai": { - "id": "privatemode-ai", - "name": "Privatemode AI", - "display_name": "Privatemode AI", - "api": "http://localhost:8080/v1", - "doc": "https://docs.privatemode.ai/api/overview", - "models": [ + }, { - "id": "whisper-large-v3", - "name": "Whisper large-v3", - "display_name": "Whisper large-v3", + "id": "mistral-medium-2505", + "name": "Mistral Medium 3", + "display_name": "Mistral Medium 3", "modalities": { "input": [ - "audio" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 448, - "output": 4096 + "context": 128000, + "output": 128000 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, "attachment": true, - "open_weights": true, - "release_date": "2023-11-06", - "last_updated": "2023-11-06" + "open_weights": false, + "knowledge": "2025-05", + "release_date": "2025-05-07", + "last_updated": "2025-05-07", + "type": "chat" }, { - "id": "qwen3-embedding-4b", - "name": "Qwen3-Embedding 4B", - "display_name": "Qwen3-Embedding 4B", + "id": "phi-4-reasoning-plus", + "name": "Phi-4-reasoning-plus", + "display_name": "Phi-4-reasoning-plus", "modalities": { "input": [ "text" @@ -261208,168 +255820,197 @@ }, "limit": { "context": 32000, - "output": 2560 + "output": 4096 }, - "temperature": false, + "temperature": true, "tool_call": false, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": false, "open_weights": true, - "knowledge": "2025-06", - "release_date": "2025-06-05", - "last_updated": "2025-06-05", - "type": "embedding" + "knowledge": "2023-10", + "release_date": "2024-12-11", + "last_updated": "2024-12-11", + "type": "chat" }, { - "id": "kimi-latest", - "name": "Kimi (latest)", - "display_name": "Kimi (latest)", + "id": "claude-opus-4-7", + "name": "Claude Opus 4.7", + "display_name": "Claude Opus 4.7", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 262144 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." + ] + } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-20", - "last_updated": "2026-04-20", + "open_weights": false, + "knowledge": "2026-01-31", + "release_date": "2026-04-16", + "last_updated": "2026-04-16", "type": "chat" }, { - "id": "glm-5.3", - "name": "GLM-5.3", - "display_name": "GLM-5.3", + "id": "gpt-5.1-codex", + "name": "GPT-5.1 Codex", + "display_name": "GPT-5.1 Codex", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", "effort_options": [ + "none", "low", - "high", - "max" - ] + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "attachment": true, + "open_weights": false, + "knowledge": "2024-09-30", + "release_date": "2025-11-14", + "last_updated": "2025-11-14", "type": "chat" }, { - "id": "glm-latest", - "name": "GLM (latest)", - "display_name": "GLM (latest)", + "id": "gpt-4.1", + "name": "GPT-4.1", + "display_name": "GPT-4.1", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 1047576, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "high", - "max" - ] - } + "supported": false }, - "attachment": false, - "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "attachment": true, + "open_weights": false, + "knowledge": "2024-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", "type": "chat" }, { - "id": "kimi-k2.6", - "name": "Kimi K2.6", - "display_name": "Kimi K2.6", + "id": "gpt-image-1.5", + "name": "GPT-Image-1.5", + "display_name": "GPT-Image-1.5", "modalities": { "input": [ "text", "image" ], "output": [ - "text" + "text", + "image" ] }, "limit": { - "context": 256000, - "output": 262144 + "context": 8192, + "output": 8192 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-20", - "last_updated": "2026-04-20", - "type": "chat" + "open_weights": false, + "release_date": "2025-11-25", + "last_updated": "2025-11-25" }, { - "id": "glm-flash-latest", - "name": "GLM Flash (latest)", - "display_name": "GLM Flash (latest)", + "id": "claude-fable-5-1", + "name": "Claude Fable 5.1", + "display_name": "Claude Fable 5.1", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" @@ -261377,9 +256018,9 @@ }, "limit": { "context": 1000000, - "output": 131072 + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -261387,49 +256028,69 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", "effort_options": [ "low", + "medium", "high", + "xhigh", "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", + "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", + "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", + "open_weights": false, + "knowledge": "2026-06", + "release_date": "2026-09-01", + "last_updated": "2026-09-01", "type": "chat" }, { - "id": "voxtral-mini-3b", - "name": "Voxtral Mini 3B", - "display_name": "Voxtral Mini 3B", + "id": "gpt-3.5-turbo-1106", + "name": "GPT-3.5 Turbo 1106", + "display_name": "GPT-3.5 Turbo 1106", "modalities": { "input": [ - "audio" + "text" ], "output": [ "text" ] }, "limit": { - "context": 32000, - "output": 32000 + "context": 16384, + "output": 4096 }, "temperature": true, "tool_call": false, "reasoning": { "supported": false }, - "attachment": true, - "open_weights": true, - "release_date": "2025-07-15", - "last_updated": "2025-07-15" + "attachment": false, + "open_weights": false, + "knowledge": "2021-08", + "release_date": "2023-11-06", + "last_updated": "2023-11-06", + "type": "chat" }, { - "id": "gpt-oss-120b", - "name": "gpt-oss-120b", - "display_name": "gpt-oss-120b", + "id": "text-embedding-3-small", + "name": "text-embedding-3-small", + "display_name": "text-embedding-3-small", "modalities": { "input": [ "text" @@ -261439,126 +256100,144 @@ ] }, "limit": { - "context": 128000, - "output": 32768 + "context": 8192, + "output": 1536 }, - "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "low", - "medium", - "high" - ] - } + "supported": false }, "attachment": false, - "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", - "type": "chat" + "open_weights": false, + "release_date": "2024-01-25", + "last_updated": "2024-01-25", + "type": "embedding" }, { - "id": "glm-5.3-flash", - "name": "GLM-5.3-Flash", - "display_name": "GLM-5.3-Flash", + "id": "gpt-image-2.5-flare", + "name": "GPT Image 2.5 Flare", + "display_name": "GPT Image 2.5 Flare", "modalities": { "input": [ "text", "image" ], "output": [ - "text" + "image" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 8192, + "output": 8192 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "low", - "high", - "max" - ] - } + "supported": false }, "attachment": true, - "open_weights": true, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", - "type": "chat" + "open_weights": false, + "release_date": "2026-09-08", + "last_updated": "2026-09-08" }, { - "id": "deepseek-ocr-2", - "name": "DeepSeek OCR 2", - "display_name": "DeepSeek OCR 2", + "id": "cohere-embed-v3-english", + "name": "Embed v3 English", + "display_name": "Embed v3 English", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 512, + "output": 1024 }, - "temperature": true, + "temperature": false, "tool_call": false, "reasoning": { "supported": false }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-01-27", - "last_updated": "2026-01-27", + "release_date": "2023-11-07", + "last_updated": "2023-11-07", + "type": "embedding" + }, + { + "id": "gpt-5.3-codex", + "name": "GPT-5.3 Codex", + "display_name": "GPT-5.3 Codex", + "modalities": { + "input": [ + "text", + "image", + "pdf" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 400000, + "output": 128000 + }, + "temperature": false, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-02-24", + "last_updated": "2026-02-24", "type": "chat" - } - ] - }, - "umans-ai-coding-plan": { - "id": "umans-ai-coding-plan", - "name": "Umans AI Coding Plan", - "display_name": "Umans AI Coding Plan", - "api": "https://api.code.umans.ai/v1", - "doc": "https://app.umans.ai/offers/code/docs", - "models": [ + }, { - "id": "umans-deepseek-v4.1-flash", - "name": "DeepSeek V4.1 Flash", - "display_name": "DeepSeek V4.1 Flash", + "id": "claude-mythos-5", + "name": "Claude Mythos 5", + "display_name": "Claude Mythos 5", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 393215 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -261567,88 +256246,105 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], "interleaved": true, "summaries": true, - "visibility": "summary", + "visibility": "omitted", "continuation": [ "thinking_blocks" ], - "effort_options": [ - "low", - "high", - "max" + "notes": [ + "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", + "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", + "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-10-17", - "last_updated": "2026-10-17", + "open_weights": false, + "knowledge": "2026-01-31", + "release_date": "2026-06-09", + "last_updated": "2026-06-09", "type": "chat" }, { - "id": "umans-qwen3.6-35b-a3b", - "name": "Qwen3.6 35B A3B", - "display_name": "Qwen3.6 35B A3B", + "id": "gpt-5.1", + "name": "GPT-5.1", + "display_name": "GPT-5.1", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 400000, + "output": 128000 }, "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], + "default_enabled": false, + "mode": "effort", + "effort": "none", "effort_options": [ + "none", "low", "medium", "high" - ] + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, - "open_weights": true, - "release_date": "2026-04-17", - "last_updated": "2026-04-17", + "open_weights": false, + "knowledge": "2024-09-30", + "release_date": "2025-11-14", + "last_updated": "2025-11-14", "type": "chat" }, { - "id": "umans-coder", - "name": "Umans Coder", - "display_name": "Umans Coder", + "id": "gpt-chat-latest", + "name": "GPT Chat Latest", + "display_name": "GPT Chat Latest", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131071 + "context": 400000, + "output": 128000 }, "temperature": false, "tool_call": true, @@ -261659,29 +256355,22 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ - "low", - "high", - "max" + "medium" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", + "open_weights": false, + "knowledge": "2025-12-01", + "release_date": "2026-05-05", + "last_updated": "2026-05-28", "type": "chat" }, { - "id": "umans-deepseek-v4.1-flash-1017", - "name": "DeepSeek V4.1 Flash 1017", - "display_name": "DeepSeek V4.1 Flash 1017", + "id": "gpt-4-turbo-vision", + "name": "GPT-4 Turbo Vision", + "display_name": "GPT-4 Turbo Vision", "modalities": { "input": [ "text", @@ -261692,100 +256381,66 @@ ] }, "limit": { - "context": 1048576, - "output": 393215 + "context": 128000, + "output": 4096 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "low", - "high", - "max" - ] - } + "supported": false }, "attachment": true, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-10-17", - "last_updated": "2026-10-17", + "open_weights": false, + "knowledge": "2023-11", + "release_date": "2023-11-06", + "last_updated": "2024-04-09", "type": "chat" }, { - "id": "umans-glm-5.3-flash", - "name": "GLM 5.3 Flash", - "display_name": "GLM 5.3 Flash", + "id": "gpt-3.5-turbo-instruct", + "name": "GPT-3.5 Turbo Instruct", + "display_name": "GPT-3.5 Turbo Instruct", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131071 + "context": 4096, + "output": 4096 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "low", - "high", - "max" - ] - } + "supported": false }, - "attachment": true, - "open_weights": true, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", + "attachment": false, + "open_weights": false, + "knowledge": "2021-08", + "release_date": "2023-09-21", + "last_updated": "2023-09-21", "type": "chat" }, { - "id": "umans-kimi-k3", - "name": "Kimi K3", - "display_name": "Kimi K3", + "id": "gpt-6-luna", + "name": "GPT-6 Luna", + "display_name": "GPT-6 Luna", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 1050000, + "output": 128000 }, "temperature": false, "tool_call": true, @@ -261795,42 +256450,40 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ + "none", "low", + "medium", "high", + "xhigh", "max" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-16", + "open_weights": false, + "knowledge": "2026-05-18", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "umans-flash", - "name": "Umans Flash", - "display_name": "Umans Flash", + "id": "claude-opus-5-5", + "name": "Claude Opus 5.5", + "display_name": "Claude Opus 5.5", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1000000, + "output": 128000 }, "temperature": false, "tool_call": true, @@ -261840,88 +256493,100 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ "low", "medium", - "high" + "high", + "xhigh", + "max" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-04-17", - "last_updated": "2026-04-17", + "open_weights": false, + "knowledge": "2026-06", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "umans-deepseek-v4-flash-0731", - "name": "DeepSeek V4 Flash", - "display_name": "DeepSeek V4 Flash", + "id": "claude-opus-4-6", + "name": "Claude Opus 4.6", + "display_name": "Claude Opus 4.6", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 393215 + "context": 1000000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "max" + ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" ], - "effort_options": [ - "low", - "high", - "max" + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-07-31", - "last_updated": "2026-07-31", + "attachment": true, + "open_weights": false, + "knowledge": "2025-05-31", + "release_date": "2026-02-05", + "last_updated": "2026-07-17", "type": "chat" }, { - "id": "umans-glm-5.3", - "name": "GLM 5.3", - "display_name": "GLM 5.3", + "id": "gpt-5-codex", + "name": "GPT-5-Codex", + "display_name": "GPT-5-Codex", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131071 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -261930,42 +256595,40 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ + "minimal", "low", - "high", - "max" - ] + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "attachment": true, + "open_weights": false, + "knowledge": "2024-09-30", + "release_date": "2025-09-15", + "last_updated": "2025-09-15", "type": "chat" - } - ] - }, - "standardcompute": { - "id": "standardcompute", - "name": "Standard Compute", - "display_name": "Standard Compute", - "api": "https://api.stdcmpt.com/v1", - "doc": "https://docs.standardcompute.com/models", - "models": [ + }, { - "id": "standardcompute", - "name": "Standard Compute", - "display_name": "Standard Compute", + "id": "claude-opus-4-8", + "name": "Claude Opus 4.8", + "display_name": "Claude Opus 4.8", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" @@ -261973,52 +256636,65 @@ }, "limit": { "context": 1000000, - "output": 50000 + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], "interleaved": true, "summaries": true, - "visibility": "summary", + "visibility": "omitted", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-03-01", - "last_updated": "2026-10-13", + "knowledge": "2025-12-31", + "release_date": "2026-05-28", + "last_updated": "2026-05-28", "type": "chat" }, { - "id": "google/gemini-2.5-pro", - "name": "Gemini 2.5 Pro", - "display_name": "Gemini 2.5 Pro", + "id": "kimi-k2.7-code", + "name": "Kimi K2.7 Code", + "display_name": "Kimi K2.7 Code", "modalities": { "input": [ "text", - "image", - "audio", - "video", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 50000 + "context": 262144, + "output": 262144 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -262027,15 +256703,6 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "budget", - "budget": { - "default": -1, - "min": 128, - "max": 32768, - "auto": -1, - "unit": "tokens" - }, "interleaved": true, "summaries": true, "visibility": "summary", @@ -262045,22 +256712,20 @@ } }, "attachment": true, - "open_weights": false, + "open_weights": true, "knowledge": "2025-01", - "release_date": "2025-06-17", - "last_updated": "2025-06-17", + "release_date": "2026-06-12", + "last_updated": "2026-06-12", "type": "chat" }, { - "id": "google/gemini-3.5-flash-lite", - "name": "Gemini 3.5 Flash Lite", - "display_name": "Gemini 3.5 Flash Lite", + "id": "gpt-5-mini", + "name": "GPT-5 Mini", + "display_name": "GPT-5 Mini", "modalities": { "input": [ "text", "image", - "video", - "audio", "pdf" ], "output": [ @@ -262068,10 +256733,10 @@ ] }, "limit": { - "context": 1048576, - "output": 50000 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -262080,37 +256745,39 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ "minimal", "low", "medium", "high" - ] + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-07-21", - "last_updated": "2026-07-21", + "knowledge": "2024-05-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "google/gemini-3.1-pro-preview", - "name": "Gemini 3.1 Pro Preview", - "display_name": "Gemini 3.1 Pro Preview", + "id": "claude-opus-5", + "name": "Claude Opus 5", + "display_name": "Claude Opus 5", "modalities": { "input": [ "text", "image", - "video", - "audio", "pdf" ], "output": [ @@ -262118,10 +256785,10 @@ ] }, "limit": { - "context": 1048576, - "output": 50000 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -262130,47 +256797,37 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ + "effort_options": [ "low", - "high" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "medium", + "high", + "xhigh", + "max" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-02-19", - "last_updated": "2026-02-19", + "knowledge": "2026-05", + "release_date": "2026-07-24", + "last_updated": "2026-07-24", "type": "chat" }, { - "id": "google/gemini-2.5-flash", - "name": "Gemini 2.5 Flash", - "display_name": "Gemini 2.5 Flash", + "id": "grok-4-20-reasoning", + "name": "Grok 4.20 (Reasoning)", + "display_name": "Grok 4.20 (Reasoning)", "modalities": { "input": [ - "text", - "image", - "audio", - "video", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 50000 + "context": 262000, + "output": 8192 }, "temperature": true, "tool_call": true, @@ -262180,42 +256837,24 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "budget", - "budget": { - "default": -1, - "min": 0, - "max": 24576, - "auto": -1, - "off": 0, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-06-17", - "last_updated": "2025-06-17", + "knowledge": "2025-09", + "release_date": "2026-04-08", + "last_updated": "2026-04-08", "type": "chat" }, { - "id": "google/gemini-3.8-flash", - "name": "Gemini 3.8 Flash", - "display_name": "Gemini 3.8 Flash", + "id": "gpt-6-sol", + "name": "GPT-6 Sol", + "display_name": "GPT-6 Sol", "modalities": { "input": [ "text", "image", - "video", - "audio", "pdf" ], "output": [ @@ -262223,10 +256862,10 @@ ] }, "limit": { - "context": 1048576, - "output": 50000 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -262234,122 +256873,167 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", + "effort_options": [ + "none", "low", "medium", - "high" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "high", + "xhigh", + "max" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-09-02", - "last_updated": "2026-09-02", + "knowledge": "2026-04-20", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "minimax/minimax-m3", - "name": "MiniMax-M3", - "display_name": "MiniMax-M3", + "id": "model-router", + "name": "Model Router", + "display_name": "Model Router", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 50000 + "context": 200000, + "output": 16384 }, - "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": true, - "open_weights": true, - "release_date": "2026-06-01", - "last_updated": "2026-06-01", + "open_weights": false, + "release_date": "2025-05-19", + "last_updated": "2025-11-18", "type": "chat" }, { - "id": "moonshotai/kimi-k3", - "name": "Kimi K3", - "display_name": "Kimi K3", + "id": "gpt-3.5-turbo-0125", + "name": "GPT-3.5 Turbo 0125", + "display_name": "GPT-3.5 Turbo 0125", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 16384, + "output": 4096 + }, + "temperature": true, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": false, + "knowledge": "2021-08", + "release_date": "2024-01-25", + "last_updated": "2024-01-25", + "type": "chat" + }, + { + "id": "cohere-embed-v3-multilingual", + "name": "Embed v3 Multilingual", + "display_name": "Embed v3 Multilingual", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 512, + "output": 1024 + }, + "temperature": false, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "release_date": "2023-11-07", + "last_updated": "2023-11-07", + "type": "embedding" + }, + { + "id": "claude-opus-4-5", + "name": "Claude Opus 4.5", + "display_name": "Claude Opus 4.5", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 50000 + "context": 200000, + "output": 64000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", + "effort_options": [ + "low", + "medium", + "high" + ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" ], - "effort_options": [ - "none", - "low", - "high", - "max" + "notes": [ + "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-16", + "open_weights": false, + "knowledge": "2025-03-31", + "release_date": "2025-11-24", + "last_updated": "2025-08-01", "type": "chat" }, { - "id": "x-ai/grok-4.3", - "name": "Grok 4.3", - "display_name": "Grok 4.3", + "id": "gpt-5.4-pro", + "name": "GPT-5.4 Pro", + "display_name": "GPT-5.4 Pro", "modalities": { "input": [ "text", @@ -262361,10 +257045,10 @@ ] }, "limit": { - "context": 1000000, - "output": 30000 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -262373,30 +257057,34 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], + "default_enabled": true, + "mode": "effort", + "effort": "high", "effort_options": [ - "none", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ "low", "medium", "high" - ] + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "release_date": "2026-04-17", - "last_updated": "2026-04-17", + "knowledge": "2025-08-31", + "release_date": "2026-03-05", + "last_updated": "2026-03-05", "type": "chat" }, { - "id": "openai/gpt-5.6-sol", - "name": "GPT-5.6 Sol", - "display_name": "GPT-5.6 Sol", + "id": "gpt-5.1-codex-max", + "name": "GPT-5.1 Codex Max", + "display_name": "GPT-5.1 Codex Max", "modalities": { "input": [ "text", @@ -262408,28 +257096,26 @@ ] }, "limit": { - "context": 1050000, - "output": 50000 + "context": 400000, + "output": 128000 }, "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, + "default_enabled": false, "mode": "effort", - "effort": "medium", + "effort": "none", "effort_options": [ "none", "low", "medium", - "high", - "xhigh", - "max" + "high" ], "verbosity": "medium", "verbosity_options": [ @@ -262437,25 +257123,20 @@ "medium", "high" ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "knowledge": "2024-09-30", + "release_date": "2025-11-13", + "last_updated": "2025-11-13", "type": "chat" }, { - "id": "openai/gpt-5.6-luna", - "name": "GPT-5.6 Luna", - "display_name": "GPT-5.6 Luna", + "id": "claude-haiku-5-5", + "name": "Claude Haiku 5.5", + "display_name": "Claude Haiku 5.5", "modalities": { "input": [ "text", @@ -262467,8 +257148,8 @@ ] }, "limit": { - "context": 1050000, - "output": 50000 + "context": 1000000, + "output": 128000 }, "temperature": false, "tool_call": true, @@ -262478,43 +257159,26 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", "effort_options": [ - "none", "low", "medium", "high", "xhigh", "max" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "knowledge": "2026-06", + "release_date": "2026-10-07", + "last_updated": "2026-10-07", "type": "chat" }, { - "id": "openai/gpt-5.6-terra", - "name": "GPT-5.6 Terra", - "display_name": "GPT-5.6 Terra", + "id": "gpt-5", + "name": "GPT-5", + "display_name": "GPT-5", "modalities": { "input": [ "text", @@ -262526,8 +257190,8 @@ ] }, "limit": { - "context": 1050000, - "output": 50000 + "context": 400000, + "output": 128000 }, "temperature": false, "tool_call": true, @@ -262542,12 +257206,10 @@ "mode": "effort", "effort": "medium", "effort_options": [ - "none", + "minimal", "low", "medium", - "high", - "xhigh", - "max" + "high" ], "verbosity": "medium", "verbosity_options": [ @@ -262555,40 +257217,34 @@ "medium", "high" ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "knowledge": "2024-09-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "openai/gpt-6-astra", - "name": "GPT-6 Astra", - "display_name": "GPT-6 Astra", + "id": "kimi-k2.6", + "name": "Kimi K2.6", + "display_name": "Kimi K2.6", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 50000 + "context": 262144, + "output": 262144 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -262597,32 +257253,20 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ] + "interleaved": true } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-04-30", - "release_date": "2026-09-04", - "last_updated": "2026-09-04", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-04-20", + "last_updated": "2026-04-20", "type": "chat" }, { - "id": "openai/gpt-6-luna", - "name": "GPT-6 Luna", - "display_name": "GPT-6 Luna", + "id": "gpt-6.1-sol", + "name": "GPT-6.1 Sol", + "display_name": "GPT-6.1 Sol", "modalities": { "input": [ "text", @@ -262635,7 +257279,7 @@ }, "limit": { "context": 1050000, - "output": 50000 + "output": 128000 }, "temperature": false, "tool_call": true, @@ -262645,15 +257289,7 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ - "none", "low", "medium", "high", @@ -262664,30 +257300,63 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2026-05-18", - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "knowledge": "2026-04-30", + "release_date": "2026-09-29", + "last_updated": "2026-09-29", "type": "chat" }, { - "id": "qwen/qwen3.8-27b", - "name": "Qwen3.8 27B", - "display_name": "Qwen3.8 27B", + "id": "grok-4-20-non-reasoning", + "name": "Grok 4.20 (Non-Reasoning)", + "display_name": "Grok 4.20 (Non-Reasoning)", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 262000, + "output": 8192 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": false, + "open_weights": false, + "knowledge": "2025-09", + "release_date": "2026-04-08", + "last_updated": "2026-04-08", + "type": "chat" + }, + { + "id": "gpt-5.2-codex", + "name": "GPT-5.2 Codex", + "display_name": "GPT-5.2 Codex", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -262696,77 +257365,93 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ - "none", "low", "medium", + "high", "xhigh" - ] + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, - "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-01-14", + "last_updated": "2026-01-14", "type": "chat" }, { - "id": "qwen/qwen3.7-plus", - "name": "Qwen3.7 Plus", - "display_name": "Qwen3.7 Plus", + "id": "gpt-5.2", + "name": "GPT-5.2", + "display_name": "GPT-5.2", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 50000 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2025-04", - "release_date": "2026-06-02", - "last_updated": "2026-06-02", + "knowledge": "2025-08-31", + "release_date": "2025-12-11", + "last_updated": "2025-12-11", "type": "chat" }, { - "id": "qwen/qwen3.7-flash", - "name": "Qwen3.7 Flash", - "display_name": "Qwen3.7 Flash", + "id": "claude-sonnet-5-5", + "name": "Claude Sonnet 5.5", + "display_name": "Claude Sonnet 5.5", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" @@ -262774,9 +257459,9 @@ }, "limit": { "context": 1000000, - "output": 50000 + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -262784,25 +257469,26 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-07-15", - "last_updated": "2026-07-15", + "knowledge": "2026-06", + "release_date": "2026-09-28", + "last_updated": "2026-09-28", "type": "chat" }, { - "id": "qwen/qwen3.7-max", - "name": "Qwen3.7 Max", - "display_name": "Qwen3.7 Max", + "id": "phi-4-reasoning", + "name": "Phi-4-reasoning", + "display_name": "Phi-4-reasoning", "modalities": { "input": [ "text" @@ -262812,100 +257498,68 @@ ] }, "limit": { - "context": 1000000, - "output": 50000 + "context": 32000, + "output": 4096 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, "attachment": false, - "open_weights": false, - "release_date": "2026-05-21", - "last_updated": "2026-05-21", + "open_weights": true, + "knowledge": "2023-10", + "release_date": "2024-12-11", + "last_updated": "2024-12-11", "type": "chat" }, { - "id": "qwen/qwen3.8-max-0902", - "name": "Qwen3.8 Max 0902", - "display_name": "Qwen3.8 Max 0902", + "id": "gpt-image-1", + "name": "GPT-Image-1", + "display_name": "GPT-Image-1", "modalities": { "input": [ "text", - "image", - "video", - "pdf" + "image" ], "output": [ - "text" + "image" ] }, "limit": { - "context": 1000000, - "output": 50000 + "context": 8192, + "output": 8192 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "minimal", - "low", - "medium", - "high", - "xhigh" - ] - } + "supported": false }, "attachment": true, "open_weights": false, - "release_date": "2026-09-02", - "last_updated": "2026-09-02", - "type": "chat" + "release_date": "2025-04-24", + "last_updated": "2025-04-24" }, { - "id": "qwen/qwen3.8-flash", - "name": "Qwen3.8 Flash", - "display_name": "Qwen3.8 Flash", + "id": "gpt-5-pro", + "name": "GPT-5 Pro", + "display_name": "GPT-5 Pro", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 50000 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -262914,29 +257568,29 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ + "default_enabled": true, + "mode": "fixed", + "effort": "high", + "verbosity": "medium", + "verbosity_options": [ "low", "medium", - "xhigh" - ] + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", + "knowledge": "2024-09-30", + "release_date": "2025-10-06", + "last_updated": "2025-10-06", "type": "chat" }, { - "id": "z-ai/glm-5.3", - "name": "GLM-5.3", - "display_name": "GLM-5.3", + "id": "cohere-command-a", + "name": "Command A", + "display_name": "Command A", "modalities": { "input": [ "text" @@ -262946,8 +257600,8 @@ ] }, "limit": { - "context": 1000000, - "output": 50000 + "context": 131072, + "output": 8192 }, "temperature": true, "tool_call": true, @@ -262955,81 +257609,49 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "low", - "high", - "max" - ] - } - }, "attachment": false, "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "knowledge": "2024-06-01", + "release_date": "2025-03-13", + "last_updated": "2025-03-13", "type": "chat" }, { - "id": "z-ai/glm-5.2", - "name": "GLM-5.2", - "display_name": "GLM-5.2", + "id": "cohere-embed-v-4-0", + "name": "Embed v4", + "display_name": "Embed v4", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 50000 + "context": 128000, + "output": 1536 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "none", - "high", - "xhigh" - ] - } + "supported": false }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", - "type": "chat" + "release_date": "2025-04-15", + "last_updated": "2025-04-15", + "type": "embedding" }, { - "id": "z-ai/glm-5.3-flash", - "name": "GLM-5.3-Flash", - "display_name": "GLM-5.3-Flash", + "id": "claude-sonnet-5", + "name": "Claude Sonnet 5", + "display_name": "Claude Sonnet 5", "modalities": { "input": [ "text", "image", - "video", "pdf" ], "output": [ @@ -263038,9 +257660,9 @@ }, "limit": { "context": 1000000, - "output": 50000 + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -263049,42 +257671,41 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ "low", + "medium", "high", + "xhigh", "max" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", + "open_weights": false, + "knowledge": "2026-01-31", + "release_date": "2026-06-30", + "last_updated": "2026-06-30", "type": "chat" }, { - "id": "deepseek/deepseek-v4-flash", - "name": "DeepSeek V4 Flash", - "display_name": "DeepSeek V4 Flash", + "id": "o3", + "name": "o3", + "display_name": "o3", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 50000 + "context": 200000, + "output": 100000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -263095,34 +257716,26 @@ "supported": true, "default_enabled": true, "mode": "effort", - "effort": "high", + "effort": "medium", "effort_options": [ "low", - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "medium", + "high" ], - "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." - ] + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "attachment": true, + "open_weights": false, + "knowledge": "2024-05", + "release_date": "2025-04-16", + "last_updated": "2025-04-16", "type": "chat" }, { - "id": "deepseek/deepseek-v4-pro", - "name": "DeepSeek V4 Pro", - "display_name": "DeepSeek V4 Pro", + "id": "deepseek-v4-pro", + "name": "DeepSeek-V4-Pro", + "display_name": "DeepSeek-V4-Pro", "modalities": { "input": [ "text" @@ -263133,7 +257746,7 @@ }, "limit": { "context": 1000000, - "output": 50000 + "output": 384000 }, "temperature": true, "tool_call": true, @@ -263171,9 +257784,9 @@ "type": "chat" }, { - "id": "deepseek/deepseek-v4-pro-0813", - "name": "DeepSeek V4 Pro 0813", - "display_name": "DeepSeek V4 Pro 0813", + "id": "llama-3.3-70b-instruct", + "name": "Llama-3.3-70B-Instruct", + "display_name": "Llama-3.3-70B-Instruct", "modalities": { "input": [ "text" @@ -263183,135 +257796,106 @@ ] }, "limit": { - "context": 1000000, - "output": 50000 + "context": 128000, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "none", - "low", - "high", - "max" - ] - } + "supported": false }, "attachment": false, "open_weights": true, - "release_date": "2026-08-13", - "last_updated": "2026-08-22", + "knowledge": "2023-12", + "release_date": "2024-12-06", + "last_updated": "2024-12-06", "type": "chat" }, { - "id": "deepseek/deepseek-v4-flash-0731", - "name": "DeepSeek V4 Flash 0731", - "display_name": "DeepSeek V4 Flash 0731", + "id": "gpt-5.4-nano", + "name": "GPT-5.4 Nano", + "display_name": "GPT-5.4 Nano", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 50000 + "context": 400000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], + "default_enabled": false, + "mode": "effort", + "effort": "none", "effort_options": [ "none", "low", + "medium", "high", - "max" - ] + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-07-31", - "last_updated": "2026-07-31", + "attachment": true, + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-03-17", + "last_updated": "2026-03-17", "type": "chat" }, { - "id": "deepseek/deepseek-v4.1-flash", - "name": "DeepSeek V4.1 Flash", - "display_name": "DeepSeek V4.1 Flash", + "id": "ministral-3b", + "name": "Ministral 3B", + "display_name": "Ministral 3B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 50000 + "context": 128000, + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "none", - "low", - "high", - "max" - ] - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-09-10", - "last_updated": "2026-09-10", + "knowledge": "2024-03", + "release_date": "2024-10-22", + "last_updated": "2024-10-22", "type": "chat" }, { - "id": "anthropic/claude-haiku-5.5", - "name": "Claude Haiku 5.5", - "display_name": "Claude Haiku 5.5", + "id": "o1", + "name": "o1", + "display_name": "o1", "modalities": { "input": [ "text", @@ -263323,8 +257907,8 @@ ] }, "limit": { - "context": 1000000, - "output": 50000 + "context": 200000, + "output": 100000 }, "temperature": false, "tool_call": true, @@ -263335,48 +257919,41 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ - "none", "low", "medium", - "high", - "xhigh", - "max" - ] + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-10-07", - "last_updated": "2026-10-07", + "knowledge": "2023-09", + "release_date": "2024-12-05", + "last_updated": "2024-12-05", "type": "chat" }, { - "id": "anthropic/claude-sonnet-5", - "name": "Claude Sonnet 5", - "display_name": "Claude Sonnet 5", + "id": "deepseek-v3.2", + "name": "DeepSeek-V3.2", + "display_name": "DeepSeek-V3.2", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 50000 + "context": 128000, + "output": 128000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -263384,155 +257961,93 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ] + "supported": true } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-30", - "last_updated": "2026-06-30", + "attachment": false, + "open_weights": true, + "knowledge": "2024-07", + "release_date": "2025-12-01", + "last_updated": "2025-12-01", "type": "chat" }, { - "id": "anthropic/claude-opus-5.5", - "name": "Claude Opus 5.5", - "display_name": "Claude Opus 5.5", + "id": "phi-4-mini-reasoning", + "name": "Phi-4-mini-reasoning", + "display_name": "Phi-4-mini-reasoning", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 50000 + "context": 128000, + "output": 4096 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ] - } - }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "attachment": false, + "open_weights": true, + "knowledge": "2023-10", + "release_date": "2024-12-11", + "last_updated": "2024-12-11", "type": "chat" }, { - "id": "anthropic/claude-fable-5.1", - "name": "Claude Fable 5.1", - "display_name": "Claude Fable 5.1", + "id": "phi-4-multimodal", + "name": "Phi-4-multimodal", + "display_name": "Phi-4-multimodal", "modalities": { "input": [ "text", "image", - "pdf" + "audio" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 50000 + "context": 128000, + "output": 4096 }, - "temperature": false, - "tool_call": true, + "temperature": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", - "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", - "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." - ] - } + "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-09-01", - "last_updated": "2026-09-01", + "open_weights": true, + "knowledge": "2023-10", + "release_date": "2024-12-11", + "last_updated": "2024-12-11", "type": "chat" }, { - "id": "anthropic/claude-opus-5", - "name": "Claude Opus 5", - "display_name": "Claude Opus 5", + "id": "kimi-k2.5", + "name": "Kimi K2.5", + "display_name": "Kimi K2.5", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 50000 + "context": 262144, + "output": 262144 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -263546,77 +258061,46 @@ "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-05", - "release_date": "2026-07-24", - "last_updated": "2026-07-24", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-01-27", + "last_updated": "2026-01-27", "type": "chat" }, { - "id": "anthropic/claude-sonnet-5.5", - "name": "Claude Sonnet 5.5", - "display_name": "Claude Sonnet 5.5", + "id": "text-embedding-ada-002", + "name": "text-embedding-ada-002", + "display_name": "text-embedding-ada-002", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 50000 + "context": 8192, + "output": 1536 }, - "temperature": false, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ] - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-09-28", - "last_updated": "2026-09-28", - "type": "chat" + "release_date": "2022-12-15", + "last_updated": "2022-12-15", + "type": "embedding" }, { - "id": "anthropic/claude-fable-5", - "name": "Claude Fable 5", - "display_name": "Claude Fable 5", + "id": "gpt-5.5", + "name": "GPT-5.5", + "display_name": "GPT-5.5", "modalities": { "input": [ "text", @@ -263628,8 +258112,8 @@ ] }, "limit": { - "context": 1000000, - "output": 50000 + "context": 1050000, + "output": 128000 }, "temperature": false, "tool_call": true, @@ -263642,98 +258126,101 @@ "supported": true, "default_enabled": true, "mode": "effort", - "effort": "high", + "effort": "medium", "effort_options": [ "low", "medium", "high", - "xhigh", - "max" + "xhigh" ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" ], - "notes": [ - "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", - "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", - "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." - ] + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-09", - "last_updated": "2026-06-09", + "knowledge": "2025-12-01", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "mistralai/mistral-large-4-0", - "name": "Mistral Large 4", - "display_name": "Mistral Large 4", + "id": "gpt-image-2", + "name": "GPT-Image-2", + "display_name": "GPT-Image-2", "modalities": { "input": [ "text", "image" ], "output": [ - "text" + "image" ] }, "limit": { - "context": 1048576, - "output": 50000 + "context": 8192, + "output": 8192 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "none", - "high" - ] - } + "supported": false }, "attachment": true, "open_weights": false, - "release_date": "2026-10-06", - "last_updated": "2026-10-06", - "type": "chat" + "release_date": "2026-04-21", + "last_updated": "2026-04-21" }, { - "id": "xiaomi/mimo-v2.5", - "name": "MiMo-V2.5", - "display_name": "MiMo-V2.5", + "id": "text-embedding-3-large", + "name": "text-embedding-3-large", + "display_name": "text-embedding-3-large", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 8192, + "output": 3072 + }, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": false, + "release_date": "2024-01-25", + "last_updated": "2024-01-25", + "type": "embedding" + }, + { + "id": "codex-mini", + "name": "Codex Mini", + "display_name": "Codex Mini", "modalities": { "input": [ "text", "image", - "audio", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 50000 + "context": 200000, + "output": 100000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -263741,68 +258228,52 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "low", + "medium", + "high" ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2024-12", - "release_date": "2026-04-22", - "last_updated": "2026-04-22", + "open_weights": false, + "knowledge": "2024-04", + "release_date": "2025-05-16", + "last_updated": "2025-05-16", "type": "chat" }, { - "id": "xiaomi/mimo-v2.6-pro", - "name": "MiMo-V2.6-Pro", - "display_name": "MiMo-V2.6-Pro", + "id": "phi-4", + "name": "Phi-4", + "display_name": "Phi-4", "modalities": { "input": [ - "text", - "image", - "audio", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 50000 + "context": 128000, + "output": 4096 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "knowledge": "2023-10", + "release_date": "2024-12-11", + "last_updated": "2024-12-11", "type": "chat" }, { - "id": "xiaomi/mimo-v2.5-pro", - "name": "MiMo-V2.5-Pro", - "display_name": "MiMo-V2.5-Pro", + "id": "deepseek-v3.2-speciale", + "name": "DeepSeek-V3.2-Speciale", + "display_name": "DeepSeek-V3.2-Speciale", "modalities": { "input": [ "text" @@ -263812,88 +258283,56 @@ ] }, "limit": { - "context": 1048576, - "output": 50000 + "context": 128000, + "output": 128000 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, "attachment": false, "open_weights": true, - "knowledge": "2024-12", - "release_date": "2026-04-22", - "last_updated": "2026-04-22", + "knowledge": "2024-07", + "release_date": "2025-12-01", + "last_updated": "2025-12-01", "type": "chat" }, { - "id": "xiaomi/mimo-v2.6-flash", - "name": "MiMo-V2.6-Flash", - "display_name": "MiMo-V2.6-Flash", + "id": "gpt-4.1-mini", + "name": "GPT-4.1 mini", + "display_name": "GPT-4.1 mini", "modalities": { "input": [ "text", "image", - "audio", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 50000 + "context": 1047576, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": true, - "open_weights": true, - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "open_weights": false, + "knowledge": "2024-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", "type": "chat" - } - ] - }, - "cortecs": { - "id": "cortecs", - "name": "Cortecs", - "display_name": "Cortecs", - "api": "https://api.cortecs.ai/v1", - "doc": "https://api.cortecs.ai/v1/models", - "models": [ + }, { - "id": "glm-5.1", - "name": "GLM-5.1", - "display_name": "GLM-5.1", + "id": "codestral-2501", + "name": "Codestral 25.01", + "display_name": "Codestral 25.01", "modalities": { "input": [ "text" @@ -263903,103 +258342,80 @@ ] }, "limit": { - "context": 202752, - "output": 202752 + "context": 256000, + "output": 256000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": false, - "open_weights": true, - "release_date": "2026-04-07", - "last_updated": "2026-04-07", + "open_weights": false, + "knowledge": "2024-03", + "release_date": "2025-01-01", + "last_updated": "2025-01-01", "type": "chat" }, { - "id": "llama-3.3-70b-instruct", - "name": "Llama-3.3-70B-Instruct", - "display_name": "Llama-3.3-70B-Instruct", + "id": "grok-4-1-fast-non-reasoning", + "name": "Grok 4.1 Fast (Non-Reasoning)", + "display_name": "Grok 4.1 Fast (Non-Reasoning)", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 131000, - "output": 131000 + "context": 128000, + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, - "open_weights": true, - "knowledge": "2023-12", - "release_date": "2024-12-06", - "last_updated": "2024-12-06", + "attachment": true, + "open_weights": false, + "release_date": "2025-06-27", + "last_updated": "2025-06-27", "type": "chat" }, { - "id": "minimax-m2", - "name": "MiniMax-M2", - "display_name": "MiniMax-M2", + "id": "gpt-image-2.5-sunburst", + "name": "GPT Image 2.5 Sunburst", + "display_name": "GPT Image 2.5 Sunburst", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ - "text" + "image" ] }, "limit": { - "context": 400000, - "output": 196000 + "context": 8192, + "output": 8192 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, - "attachment": false, - "open_weights": true, - "release_date": "2025-10-27", - "last_updated": "2025-10-27", - "type": "chat" + "attachment": true, + "open_weights": false, + "release_date": "2026-09-08", + "last_updated": "2026-09-08" }, { - "id": "codestral-2508", - "name": "Codestral 25.08", - "display_name": "Codestral 25.08", + "id": "o3-mini", + "name": "o3-mini", + "display_name": "o3-mini", "modalities": { "input": [ "text" @@ -264009,24 +258425,40 @@ ] }, "limit": { - "context": 256000, - "output": 256000 + "context": 200000, + "output": 100000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } }, "attachment": false, "open_weights": false, - "release_date": "2025-07-30", - "last_updated": "2025-07-30", + "knowledge": "2024-05", + "release_date": "2024-12-20", + "last_updated": "2025-01-29", "type": "chat" }, { - "id": "claude-4-6-sonnet", - "name": "Claude Sonnet 4.6", - "display_name": "Claude Sonnet 4.6", + "id": "o4-mini", + "name": "o4-mini", + "display_name": "o4-mini", "modalities": { "input": [ "text", @@ -264038,10 +258470,10 @@ ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 200000, + "output": 100000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -264049,24 +258481,29 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ "low", "medium", "high" - ] + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-17", - "last_updated": "2026-03-13", + "knowledge": "2024-05", + "release_date": "2025-04-16", + "last_updated": "2025-04-16", "type": "chat" }, { - "id": "nova-pro-v1", - "name": "Nova Pro 1.0", - "display_name": "Nova Pro 1.0", + "id": "gpt-4o-mini", + "name": "GPT-4o mini", + "display_name": "GPT-4o mini", "modalities": { "input": [ "text", @@ -264078,8 +258515,8 @@ ] }, "limit": { - "context": 300000, - "output": 10000 + "context": 128000, + "output": 16384 }, "temperature": true, "tool_call": true, @@ -264088,29 +258525,30 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2024-10-31", - "release_date": "2024-12-05", - "last_updated": "2024-12-05", + "knowledge": "2023-09", + "release_date": "2024-07-18", + "last_updated": "2024-07-18", "type": "chat" }, { - "id": "qwen3.8-27b", - "name": "Qwen3.8 27B", - "display_name": "Qwen3.8 27B", + "id": "gpt-6-astra", + "name": "GPT-6 Astra", + "display_name": "GPT-6 Astra", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 500000 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -264118,23 +258556,28 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ + "none", "low", "medium", - "xhigh" + "high", + "xhigh", + "max" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "open_weights": false, + "knowledge": "2026-04-30", + "release_date": "2026-09-04", + "last_updated": "2026-09-04", "type": "chat" }, { - "id": "claude-haiku-5.5", - "name": "Claude Haiku 5.5", - "display_name": "Claude Haiku 5.5", + "id": "gpt-5-nano", + "name": "GPT-5 Nano", + "display_name": "GPT-5 Nano", "modalities": { "input": [ "text", @@ -264146,7 +258589,7 @@ ] }, "limit": { - "context": 1000000, + "context": 400000, "output": 128000 }, "temperature": false, @@ -264157,24 +258600,86 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ + "minimal", "low", "medium", "high" - ] + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-10-07", - "last_updated": "2026-10-07", + "knowledge": "2024-05-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "qwen3-30b-a3b-instruct-2507", - "name": "qwen3-30b-a3b-instruct-2507", - "display_name": "qwen3-30b-a3b-instruct-2507", + "id": "grok-4.7", + "name": "Grok 4.7", + "display_name": "Grok 4.7", + "modalities": { + "input": [ + "text", + "image", + "pdf" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 500000, + "output": 500000 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "high", + "xhigh" + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2026-05", + "release_date": "2026-09-21", + "last_updated": "2026-09-21", + "type": "chat" + } + ] + }, + "alibaba": { + "id": "alibaba", + "name": "alibaba", + "display_name": "alibaba", + "api": "https://dashscope-intl.aliyuncs.com/compatible-mode/v1", + "doc": "https://www.alibabacloud.com/help/en/model-studio/models", + "models": [ + { + "id": "deepseek-v4-flash-0731", + "name": "DeepSeek V4 Flash 0731", + "display_name": "DeepSeek V4 Flash 0731", "modalities": { "input": [ "text" @@ -264184,69 +258689,86 @@ ] }, "limit": { - "context": 262000, - "output": 262000 + "context": 1000000, + "output": 384000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "low", + "high", + "max" + ] + } + }, "attachment": false, "open_weights": true, - "release_date": "2025-07-28", - "last_updated": "2025-07-28", + "knowledge": "2025-05", + "release_date": "2026-07-31", + "last_updated": "2026-07-31", "type": "chat" }, { - "id": "mistral-large-2402", - "name": "mistral-large-2402", - "display_name": "mistral-large-2402", + "id": "qwen-vl-ocr", + "name": "Qwen Vl Ocr", + "display_name": "Qwen Vl Ocr", "modalities": { "input": [ "text", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 32000, - "output": 8192 + "context": 34096, + "output": 4096 }, - "temperature": false, - "tool_call": true, + "temperature": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2025-05-26", - "last_updated": "2025-05-26", + "knowledge": "2024-04", + "release_date": "2024-10-28", + "last_updated": "2025-04-13", "type": "chat" }, { - "id": "gpt-5.6-sol", - "name": "GPT-5.6 Sol", - "display_name": "GPT-5.6 Sol", + "id": "qwen3.6-plus", + "name": "Qwen3.6 Plus", + "display_name": "Qwen3.6 Plus", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1000000, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -264255,70 +258777,70 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "knowledge": "2025-04", + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "gemma-3-27b-it", - "name": "Gemma 3 27B IT", - "display_name": "Gemma 3 27B IT", + "id": "glm-5.2", + "name": "GLM-5.2", + "display_name": "GLM-5.2", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 131000, - "output": 110000 + "context": 1000000, + "output": 131072 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": true, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "high", + "max" + ] + } + }, + "attachment": false, "open_weights": true, - "knowledge": "2024-08", - "release_date": "2025-03-12", - "last_updated": "2025-03-12", + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "mistral-small-3.2-24b-instruct-2506", - "name": "mistral-small-3.2-24b-instruct-2506", - "display_name": "mistral-small-3.2-24b-instruct-2506", + "id": "qwen-mt-turbo", + "name": "Qwen Mt Turbo", + "display_name": "Qwen Mt Turbo", "modalities": { "input": [ - "image", "text" ], "output": [ @@ -264326,25 +258848,25 @@ ] }, "limit": { - "context": 131000, - "output": 131000 + "context": 16384, + "output": 8192 }, - "temperature": false, - "tool_call": true, + "temperature": true, + "tool_call": false, "reasoning": { "supported": false }, - "attachment": true, - "open_weights": true, - "knowledge": "2023-10-31", - "release_date": "2025-06-20", - "last_updated": "2025-06-20", + "attachment": false, + "open_weights": false, + "knowledge": "2024-04", + "release_date": "2025-01", + "last_updated": "2025-01", "type": "chat" }, { - "id": "qwen3-coder-30b-a3b-instruct", - "name": "Qwen3-Coder 30B-A3B Instruct", - "display_name": "Qwen3-Coder 30B-A3B Instruct", + "id": "qwen3-max", + "name": "Qwen3 Max", + "display_name": "Qwen3 Max", "modalities": { "input": [ "text" @@ -264355,37 +258877,48 @@ }, "limit": { "context": 262144, - "output": 262144 + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, - "open_weights": true, + "open_weights": false, "knowledge": "2025-04", - "release_date": "2025-07-31", - "last_updated": "2025-07-31", + "release_date": "2025-09-23", + "last_updated": "2025-09-23", "type": "chat" }, { - "id": "claude-4-5-sonnet", - "name": "Claude Sonnet 4.5 (latest)", - "display_name": "Claude Sonnet 4.5 (latest)", + "id": "qwen3.5-35b-a3b", + "name": "Qwen3.5 35B-A3B", + "display_name": "Qwen3.5 35B-A3B", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 262144, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -264395,64 +258928,70 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "low", - "medium", - "high" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-07-31", - "release_date": "2025-09-29", - "last_updated": "2025-09-29", + "open_weights": true, + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" }, { - "id": "claude-opus4-7", - "name": "Claude Opus 4.7", - "display_name": "Claude Opus 4.7", + "id": "qwen3-8b", + "name": "Qwen3 8B", + "display_name": "Qwen3 8B", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 131072, + "output": 8192 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": true, + "budget": { + "default": 38912, + "min": 0, + "max": 38912 + } }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "low", - "medium", - "high" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-04-16", - "last_updated": "2026-04-16", + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-04", + "last_updated": "2025-04", "type": "chat" }, { - "id": "qwen3.5-397b-a17b", - "name": "Qwen3.5 397B-A17B", - "display_name": "Qwen3.5 397B-A17B", + "id": "qwen-plus-character-ja", + "name": "Qwen Plus Character (Japanese)", + "display_name": "Qwen Plus Character (Japanese)", "modalities": { "input": [ "text" @@ -264462,8 +259001,38 @@ ] }, "limit": { - "context": 262000, - "output": 262000 + "context": 8192, + "output": 512 + }, + "temperature": true, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": false, + "knowledge": "2024-04", + "release_date": "2024-01", + "last_updated": "2024-01", + "type": "chat" + }, + { + "id": "qwen3.6-27b", + "name": "Qwen3.6 27B", + "display_name": "Qwen3.6 27B", + "modalities": { + "input": [ + "text", + "image", + "video" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 262144, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -264482,34 +259051,38 @@ ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-02-15", - "last_updated": "2026-02-15", + "release_date": "2026-04-22", + "last_updated": "2026-04-22", "type": "chat" }, { - "id": "qwen3.6-35b-a3b", - "name": "Qwen3.6 35B-A3B", - "display_name": "Qwen3.6 35B-A3B", + "id": "qwen3-14b", + "name": "Qwen3 14B", + "display_name": "Qwen3 14B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262000, - "output": 32768 + "context": 131072, + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": true, + "budget": { + "default": 38912, + "min": 0, + "max": 38912 + } }, "extra_capabilities": { "reasoning": { @@ -264522,16 +259095,17 @@ ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-04-17", - "last_updated": "2026-04-17", + "knowledge": "2025-04", + "release_date": "2025-04", + "last_updated": "2025-04", "type": "chat" }, { - "id": "nvidia-nemotron-3-nano-30b-a3b", - "name": "nvidia-nemotron-3-nano-30b-a3b", - "display_name": "nvidia-nemotron-3-nano-30b-a3b", + "id": "qwen3-235b-a22b", + "name": "Qwen3 235B A22B", + "display_name": "Qwen3 235B A22B", "modalities": { "input": [ "text" @@ -264541,30 +259115,45 @@ ] }, "limit": { - "context": 256000, - "output": 256000 + "context": 131072, + "output": 32768 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false, + "budget": { + "default": 81920, + "min": 0, + "max": 81920 + } + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, "open_weights": true, - "knowledge": "2025-06-25", - "release_date": "2025-12-15", - "last_updated": "2025-12-15", + "knowledge": "2025-04", + "release_date": "2025-04", + "last_updated": "2025-04", "type": "chat" }, { - "id": "mistral-large-4-0", - "name": "Mistral Large 4", - "display_name": "Mistral Large 4", + "id": "qwen3.7-max", + "name": "Qwen3.7 Max", + "display_name": "Qwen3.7 Max", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" @@ -264572,7 +259161,7 @@ }, "limit": { "context": 1000000, - "output": 262144 + "output": 131072 }, "temperature": true, "tool_call": true, @@ -264582,36 +259171,34 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "none", - "high" - ] + "supported": true } }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2026-10-06", - "last_updated": "2026-10-06", + "release_date": "2026-05-21", + "last_updated": "2026-05-21", "type": "chat" }, { - "id": "gpt-5-nano", - "name": "GPT-5 Nano", - "display_name": "GPT-5 Nano", + "id": "qwen3.5-plus", + "name": "Qwen3.5 Plus", + "display_name": "Qwen3.5 Plus", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 1000000, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -264620,92 +259207,97 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "minimal", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2024-05-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "knowledge": "2025-04", + "release_date": "2026-02-16", + "last_updated": "2026-02-16", "type": "chat" }, { - "id": "mistral-7b-instruct-v0.2", - "name": "mistral-7b-instruct-v0.2", - "display_name": "mistral-7b-instruct-v0.2", + "id": "qwen3-omni-flash-realtime", + "name": "Qwen3-Omni Flash Realtime", + "display_name": "Qwen3-Omni Flash Realtime", "modalities": { "input": [ "text", - "pdf" + "image", + "audio", + "video" ], "output": [ - "text" + "text", + "audio" ] }, "limit": { - "context": 32000, - "output": 8192 + "context": 65536, + "output": 16384 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": false }, "attachment": true, "open_weights": false, - "release_date": "2025-05-26", - "last_updated": "2025-05-26", - "type": "chat" + "knowledge": "2024-04", + "release_date": "2025-09-15", + "last_updated": "2025-09-15" }, { - "id": "mistral-large-2512", - "name": "Mistral Large 3", - "display_name": "Mistral Large 3", + "id": "qwen3.7-flash", + "name": "Qwen3.7 Flash", + "display_name": "Qwen3.7 Flash", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 256000 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": true, - "open_weights": true, - "knowledge": "2024-11", - "release_date": "2025-12-02", - "last_updated": "2025-12-02", + "open_weights": false, + "release_date": "2026-07-15", + "last_updated": "2026-07-15", "type": "chat" }, { - "id": "minimax-m2.5", - "name": "MiniMax-M2.5", - "display_name": "MiniMax-M2.5", + "id": "qwen-plus", + "name": "Qwen Plus", + "display_name": "Qwen Plus", "modalities": { "input": [ "text" @@ -264715,14 +259307,19 @@ ] }, "limit": { - "context": 196000, - "output": 196000 + "context": 1000000, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false, + "budget": { + "default": 81920, + "min": 0, + "max": 81920 + } }, "extra_capabilities": { "reasoning": { @@ -264735,54 +259332,74 @@ ] } }, + "search": { + "supported": true, + "default": false, + "forced_search": false, + "search_strategy": "turbo" + }, "attachment": false, - "open_weights": true, - "release_date": "2026-02-12", - "last_updated": "2026-02-12", + "open_weights": false, + "knowledge": "2024-04", + "release_date": "2024-01-25", + "last_updated": "2025-09-11", "type": "chat" }, { - "id": "qwen3.8-flash-next", - "name": "Qwen3.8 Flash Next", - "display_name": "Qwen3.8 Flash Next", + "id": "qwen-flash", + "name": "Qwen Flash", + "display_name": "Qwen Flash", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 64000 + "context": 1000000, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false, + "budget": { + "default": 81920, + "min": 0, + "max": 81920 + } }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "low", - "medium", - "xhigh" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, - "attachment": true, - "open_weights": true, - "release_date": "2026-08-27", - "last_updated": "2026-08-27", + "search": { + "supported": true, + "default": false, + "forced_search": false, + "search_strategy": "turbo" + }, + "attachment": false, + "open_weights": false, + "knowledge": "2024-04", + "release_date": "2025-07-28", + "last_updated": "2025-07-28", "type": "chat" }, { - "id": "nemotron-nano-v2-12b", - "name": "nemotron-nano-v2-12b", - "display_name": "nemotron-nano-v2-12b", + "id": "qwen3-vl-235b-a22b", + "name": "Qwen3-VL 235B-A22B", + "display_name": "Qwen3-VL 235B-A22B", "modalities": { "input": [ "text", @@ -264793,29 +259410,42 @@ ] }, "limit": { - "context": 128000, - "output": 128000 + "context": 131072, + "output": 32768 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, "attachment": true, "open_weights": true, - "release_date": "2025-10-28", - "last_updated": "2025-10-28", + "knowledge": "2025-04", + "release_date": "2025-04", + "last_updated": "2025-04", "type": "chat" }, { - "id": "gpt-4o", - "name": "GPT-4o", - "display_name": "GPT-4o", + "id": "qwen3.8-max", + "name": "Qwen3.8 Max", + "display_name": "Qwen3.8 Max", "modalities": { "input": [ "text", "image", + "video", "pdf" ], "output": [ @@ -264823,224 +259453,223 @@ ] }, "limit": { - "context": 128000, - "output": 16000 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "budget": { + "min": 0, + "max": 262144, + "unit": "tokens" + }, + "effort": "xhigh", + "effort_options": [ + "none", + "low", + "medium", + "xhigh" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Prefer reasoning_effort; thinking_budget is an alternative, not an additional control.", + "Omitting both controls differs from explicitly selecting xhigh, which maps to 262144 budget tokens." + ], + "budget_exclusive_with_effort": true + } }, "attachment": true, "open_weights": false, - "knowledge": "2023-09", - "release_date": "2024-05-13", - "last_updated": "2024-08-06", + "release_date": "2026-08-03", + "last_updated": "2026-08-03", "type": "chat" }, { - "id": "qwen3guard-gen-8b", - "name": "qwen3guard-gen-8b", - "display_name": "qwen3guard-gen-8b", + "id": "qwen-omni-turbo", + "name": "Qwen-Omni Turbo", + "display_name": "Qwen-Omni Turbo", "modalities": { "input": [ - "text" + "text", + "image", + "audio", + "video" ], "output": [ - "text" + "text", + "audio" ] }, "limit": { - "context": 32000, - "output": 32000 + "context": 32768, + "output": 2048 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-02-04", - "last_updated": "2026-02-04", + "knowledge": "2024-04", + "release_date": "2025-01-19", + "last_updated": "2025-03-26", "type": "chat" }, { - "id": "claude-haiku-4-5", - "name": "Claude Haiku 4.5 (latest)", - "display_name": "Claude Haiku 4.5 (latest)", + "id": "qwen-mt-plus", + "name": "Qwen Mt Plus", + "display_name": "Qwen Mt Plus", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 16384, + "output": 8192 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." - ] - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-02-28", - "release_date": "2025-10-15", - "last_updated": "2025-10-15", + "knowledge": "2024-04", + "release_date": "2025-01", + "last_updated": "2025-01", "type": "chat" }, { - "id": "kimi-k2.7-code", - "name": "Kimi K2.7 Code", - "display_name": "Kimi K2.7 Code", + "id": "qwen-max", + "name": "Qwen Max", + "display_name": "Qwen Max", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 32768, + "output": 8192 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "search": { + "supported": true, + "default": false, + "forced_search": false, + "search_strategy": "turbo" }, - "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-06-12", - "last_updated": "2026-06-12", + "attachment": false, + "open_weights": false, + "knowledge": "2024-04", + "release_date": "2024-04-03", + "last_updated": "2025-01-25", "type": "chat" }, { - "id": "ministral-3b-2512", - "name": "Ministral 3 3B 2512", - "display_name": "Ministral 3 3B 2512", + "id": "qwen3-livetranslate-flash-realtime", + "name": "Qwen3-LiveTranslate Flash Realtime", + "display_name": "Qwen3-LiveTranslate Flash Realtime", "modalities": { "input": [ "text", - "image" + "image", + "audio", + "video" ], "output": [ - "text" + "text", + "audio" ] }, "limit": { - "context": 256000, - "output": 256000 + "context": 53248, + "output": 4096 }, - "temperature": false, - "tool_call": true, + "temperature": true, + "tool_call": false, "reasoning": { "supported": false }, "attachment": true, - "open_weights": true, - "release_date": "2025-12-02", - "last_updated": "2025-12-02", - "type": "chat" + "open_weights": false, + "knowledge": "2024-04", + "release_date": "2025-09-22", + "last_updated": "2025-09-22" }, { - "id": "gemma-4-31b-it", - "name": "Gemma 4 31B IT", - "display_name": "Gemma 4 31B IT", + "id": "qwen3-next-80b-a3b-instruct", + "name": "Qwen3 Next 80B A3B Instruct", + "display_name": "Qwen3 Next 80B A3B Instruct", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262000, - "output": 262000 + "context": 131072, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "knowledge": "2025-04", + "release_date": "2025-09", + "last_updated": "2025-09", "type": "chat" }, { - "id": "gpt-5.6-luna", - "name": "GPT-5.6 Luna", - "display_name": "GPT-5.6 Luna", + "id": "qwen3.6-flash", + "name": "Qwen3.6 Flash", + "display_name": "Qwen3.6 Flash", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1000000, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -265049,91 +259678,92 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "release_date": "2026-04-27", + "last_updated": "2026-04-27", "type": "chat" }, { - "id": "gemini-4-argon", - "name": "Gemini 4 Argon", - "display_name": "Gemini 4 Argon", + "id": "qwen3-asr-flash", + "name": "Qwen3-ASR Flash", + "display_name": "Qwen3-ASR Flash", "modalities": { "input": [ - "text", - "image", - "audio", - "pdf" + "audio" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65535 + "context": 53248, + "output": 4096 }, "temperature": false, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high" - ] - } + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-10-13", - "last_updated": "2026-10-13", + "knowledge": "2024-04", + "release_date": "2025-09-08", + "last_updated": "2025-09-08" + }, + { + "id": "qwen3-coder-plus", + "name": "Qwen3 Coder Plus", + "display_name": "Qwen3 Coder Plus", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1000000, + "output": 65536 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-07-23", + "last_updated": "2025-07-23", "type": "chat" }, { - "id": "gemini-2.5-pro", - "name": "Gemini 2.5 Pro", - "display_name": "Gemini 2.5 Pro", + "id": "qwen3.6-35b-a3b", + "name": "Qwen3.6 35B-A3B", + "display_name": "Qwen3.6 35B-A3B", "modalities": { "input": [ "text", "image", - "audio" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65535 + "context": 262144, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -265144,36 +259774,30 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "budget", - "budget": { - "default": -1, - "min": 128, - "max": 32768, - "auto": -1, - "unit": "tokens" - }, + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-06-17", - "last_updated": "2025-06-17", + "open_weights": true, + "release_date": "2026-04-17", + "last_updated": "2026-04-17", "type": "chat" }, { - "id": "deepseek-v4-pro", - "name": "DeepSeek V4 Pro", - "display_name": "DeepSeek V4 Pro", + "id": "qwen3.8-omni-flash", + "name": "Qwen3.8 Omni Flash", + "display_name": "Qwen3.8 Omni Flash", "modalities": { "input": [ - "text" + "text", + "image", + "audio", + "video" ], "output": [ "text" @@ -265181,7 +259805,7 @@ }, "limit": { "context": 1000000, - "output": 384000 + "output": 131072 }, "temperature": true, "tool_call": true, @@ -265194,103 +259818,119 @@ "supported": true, "default_enabled": true, "mode": "effort", - "effort": "high", + "effort": "xhigh", "effort_options": [ + "none", "low", - "high", - "max" + "medium", + "xhigh" ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "attachment": true, + "open_weights": false, + "release_date": "2026-09-17", + "last_updated": "2026-09-17", "type": "chat" }, { - "id": "mixtral-8x7B-instruct-v0.1", - "name": "Mixtral 8x7B Instruct v0.1", - "display_name": "Mixtral 8x7B Instruct v0.1", + "id": "qwen3-next-80b-a3b-thinking", + "name": "Qwen3 Next 80B A3B Thinking", + "display_name": "Qwen3 Next 80B A3B Thinking", "modalities": { "input": [ - "text", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 32000, - "output": 4096 + "context": 131072, + "output": 32768 }, "temperature": true, "tool_call": false, "reasoning": { "supported": true, - "default": true + "default": true, + "budget": { + "default": 81920, + "min": 0, + "max": 81920 + } }, - "attachment": true, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, "open_weights": true, - "release_date": "2023-12-11", - "last_updated": "2023-12-11", + "knowledge": "2025-04", + "release_date": "2025-09", + "last_updated": "2025-09", "type": "chat" }, { - "id": "ministral-14b-2512", - "name": "Ministral 3 14B 2512", - "display_name": "Ministral 3 14B 2512", + "id": "qwen3-coder-30b-a3b-instruct", + "name": "Qwen3-Coder 30B-A3B Instruct", + "display_name": "Qwen3-Coder 30B-A3B Instruct", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 256000 + "context": 262144, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2025-12-02", - "last_updated": "2025-12-02", + "knowledge": "2025-04", + "release_date": "2025-04", + "last_updated": "2025-04", "type": "chat" }, { - "id": "minimax-m3.1-flash", - "name": "MiniMax-M3.1-Flash", - "display_name": "MiniMax-M3.1-Flash", + "id": "qwen3-omni-flash", + "name": "Qwen3-Omni Flash", + "display_name": "Qwen3-Omni Flash", "modalities": { "input": [ "text", - "image" + "image", + "audio", + "video" ], "output": [ - "text" + "text", + "audio" ] }, "limit": { - "context": 1048576, - "output": 64000 + "context": 65536, + "output": 16384 }, "temperature": true, "tool_call": true, @@ -265300,66 +259940,56 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-10-19", - "last_updated": "2026-10-19", + "knowledge": "2024-04", + "release_date": "2025-09-15", + "last_updated": "2025-09-15", "type": "chat" }, { - "id": "claude-sonnet-5", - "name": "Claude Sonnet 5", - "display_name": "Claude Sonnet 5", + "id": "qvq-max", + "name": "QVQ Max", + "display_name": "QVQ Max", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 131072, + "output": 8192 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "low", - "medium", - "high" - ] - } - }, "attachment": true, "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-30", - "last_updated": "2026-06-30", + "knowledge": "2024-04", + "release_date": "2025-03-25", + "last_updated": "2025-03-25", "type": "chat" }, { - "id": "deepseek-v4-pro-0813", - "name": "DeepSeek V4 Pro 0813", - "display_name": "DeepSeek V4 Pro 0813", + "id": "qwen3-coder-flash", + "name": "Qwen3 Coder Flash", + "display_name": "Qwen3 Coder Flash", "modalities": { "input": [ "text" @@ -265369,35 +259999,25 @@ ] }, "limit": { - "context": 1048576, - "output": 64000 + "context": 1000000, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "low", - "medium", - "high" - ] - } + "supported": false }, "attachment": false, - "open_weights": true, - "release_date": "2026-08-13", - "last_updated": "2026-08-22", + "open_weights": false, + "knowledge": "2025-04", + "release_date": "2025-07-28", + "last_updated": "2025-07-28", "type": "chat" }, { - "id": "minimax-m2.1", - "name": "MiniMax-M2.1", - "display_name": "MiniMax-M2.1", + "id": "qwen3-32b", + "name": "Qwen3 32B", + "display_name": "Qwen3 32B", "modalities": { "input": [ "text" @@ -265407,14 +260027,19 @@ ] }, "limit": { - "context": 196000, - "output": 196000 + "context": 131072, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": true, + "budget": { + "default": 38912, + "min": 0, + "max": 38912 + } }, "extra_capabilities": { "reasoning": { @@ -265429,55 +260054,56 @@ }, "attachment": false, "open_weights": true, - "release_date": "2025-12-23", - "last_updated": "2025-12-23", + "knowledge": "2025-04", + "release_date": "2025-04", + "last_updated": "2025-04", "type": "chat" }, { - "id": "voxtral-small-2507", - "name": "voxtral-small-2507", - "display_name": "voxtral-small-2507", + "id": "qwen3-coder-480b-a35b-instruct", + "name": "Qwen3-Coder 480B-A35B Instruct", + "display_name": "Qwen3-Coder 480B-A35B Instruct", "modalities": { "input": [ - "text", - "audio" + "text" ], "output": [ "text" ] }, "limit": { - "context": 32000, - "output": 32000 + "context": 262144, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2025-07-15", - "last_updated": "2025-07-15", + "knowledge": "2025-04", + "release_date": "2025-04", + "last_updated": "2025-04", "type": "chat" }, { - "id": "gemini-3.5-flash", - "name": "Gemini 3.5 Flash", - "display_name": "Gemini 3.5 Flash", + "id": "qwen3.5-flash", + "name": "Qwen3.5 Flash", + "display_name": "Qwen3.5 Flash", "modalities": { "input": [ "text", "image", - "audio" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65535 + "context": 1000000, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -265488,48 +260114,39 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", - "low", - "medium", - "high" - ], + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-05-19", - "last_updated": "2026-05-19", + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" }, { - "id": "claude-opus4-8", - "name": "Claude Opus 4.8", - "display_name": "Claude Opus 4.8", + "id": "qwen3.5-397b-a17b", + "name": "Qwen3.5 397B-A17B", + "display_name": "Qwen3.5 397B-A17B", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 262144, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -265537,178 +260154,202 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "low", - "medium", - "high" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-01", - "release_date": "2026-05-28", - "last_updated": "2026-05-28", + "open_weights": true, + "release_date": "2026-02-15", + "last_updated": "2026-02-15", "type": "chat" }, { - "id": "gpt-5.6-terra", - "name": "GPT-5.6 Terra", - "display_name": "GPT-5.6 Terra", + "id": "qwen-turbo", + "name": "Qwen Turbo", + "display_name": "Qwen Turbo", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 131072, + "output": 16384 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false, + "budget": { + "default": 38912, + "min": 0, + "max": 38912 + } }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, - "attachment": true, + "search": { + "supported": true, + "default": false, + "forced_search": false, + "search_strategy": "turbo" + }, + "attachment": false, "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "knowledge": "2024-04", + "release_date": "2024-11-01", + "last_updated": "2025-04-28", "type": "chat" }, { - "id": "mistral-small-2503", - "name": "mistral-small-2503", - "display_name": "mistral-small-2503", + "id": "qwen3.5-27b", + "name": "Qwen3.5 27B", + "display_name": "Qwen3.5 27B", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 128000 + "context": 262144, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": true, "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-03-17", - "last_updated": "2025-03-17", + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" }, { - "id": "qwen3-coder-next", - "name": "Qwen3 Coder Next", - "display_name": "Qwen3 Coder Next", + "id": "qwen3.5-122b-a10b", + "name": "Qwen3.5 122B-A10B", + "display_name": "Qwen3.5 122B-A10B", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 256000 + "context": 262144, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": true, "open_weights": true, - "knowledge": "2025-09", - "release_date": "2026-02-03", - "last_updated": "2026-02-03", + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" }, { - "id": "nova-lite-v1", - "name": "Nova Lite 1.0", - "display_name": "Nova Lite 1.0", + "id": "qwen-vl-plus", + "name": "Qwen-VL Plus", + "display_name": "Qwen-VL Plus", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 300000, - "output": 10000 + "context": 131072, + "output": 8192 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2024-10-31", - "release_date": "2024-12-05", - "last_updated": "2024-12-05", + "knowledge": "2024-04", + "release_date": "2024-01-25", + "last_updated": "2025-08-15", "type": "chat" }, { - "id": "kolibri-1", - "name": "kolibri-1", - "display_name": "kolibri-1", + "id": "qwen3.7-plus", + "name": "Qwen3.7 Plus", + "display_name": "Qwen3.7 Plus", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 81920 + "context": 1000000, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -265716,38 +260357,38 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "high" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2026-06-18", - "release_date": "2026-10-03", - "last_updated": "2026-10-03", + "attachment": true, + "open_weights": false, + "knowledge": "2025-04", + "release_date": "2026-06-02", + "last_updated": "2026-06-04", "type": "chat" }, { - "id": "gpt-6-sol", - "name": "GPT-6 Sol", - "display_name": "GPT-6 Sol", + "id": "kimi-k3", + "name": "Kimi K3", + "display_name": "Kimi K3", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1048576, + "output": 1048576 }, "temperature": false, "tool_call": true, @@ -265757,77 +260398,75 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ "low", - "medium", - "high" + "high", + "max" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-04-20", - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "open_weights": true, + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" }, { - "id": "gemini-3.5-flash-lite", - "name": "Gemini 3.5 Flash Lite", - "display_name": "Gemini 3.5 Flash Lite", + "id": "qwen2-5-omni-7b", + "name": "Qwen2.5-Omni 7B", + "display_name": "Qwen2.5-Omni 7B", "modalities": { "input": [ "text", "image", "audio", - "pdf" + "video" ], "output": [ - "text" + "text", + "audio" ] }, "limit": { - "context": 1048576, - "output": 65535 + "context": 32768, + "output": 2048 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "low", - "medium", - "high" - ] - } + "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-07-21", - "last_updated": "2026-07-21", + "open_weights": true, + "knowledge": "2024-04", + "release_date": "2024-12", + "last_updated": "2024-12", "type": "chat" }, { - "id": "glm-5.3", - "name": "GLM-5.3", - "display_name": "GLM-5.3", + "id": "qwen3.8-flash", + "name": "Qwen3.8 Flash", + "display_name": "Qwen3.8 Flash", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 1048576 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -265838,23 +260477,43 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "budget": { + "min": 0, + "max": 262144, + "unit": "tokens" + }, + "effort": "xhigh", "effort_options": [ + "none", "low", - "high", - "max" - ] + "medium", + "xhigh" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Prefer reasoning_effort; thinking_budget is an alternative, not an additional control.", + "Omitting both controls differs from explicitly selecting xhigh, which maps to 262144 budget tokens." + ], + "budget_exclusive_with_effort": true } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "attachment": true, + "open_weights": false, + "release_date": "2026-08-26", + "last_updated": "2026-08-26", "type": "chat" }, { - "id": "deepseek-v4-flash-0731", - "name": "DeepSeek V4 Flash 0731", - "display_name": "DeepSeek V4 Flash 0731", + "id": "qwen3.6-max-preview", + "name": "Qwen3.6 Max Preview", + "display_name": "Qwen3.6 Max Preview", "modalities": { "input": [ "text" @@ -265864,8 +260523,8 @@ ] }, "limit": { - "context": 1048576, - "output": 1048576 + "context": 262144, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -265881,38 +260540,32 @@ "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "effort_options": [ - "low", - "medium", - "high" ] } }, "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-07-31", - "last_updated": "2026-07-31", + "open_weights": false, + "knowledge": "2025-04", + "release_date": "2026-04-20", + "last_updated": "2026-04-20", "type": "chat" }, { - "id": "claude-opus4-5", - "name": "Claude Opus 4.5 (latest)", - "display_name": "Claude Opus 4.5 (latest)", + "id": "qwen3-vl-30b-a3b", + "name": "Qwen3-VL 30B-A3B", + "display_name": "Qwen3-VL 30B-A3B", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 131072, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -265922,188 +260575,185 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "low", - "medium", - "high" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-05", - "release_date": "2025-11-24", - "last_updated": "2025-11-24", + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-04", + "last_updated": "2025-04", "type": "chat" }, { - "id": "gpt-6.1-sol", - "name": "GPT-6.1 Sol", - "display_name": "GPT-6.1 Sol", + "id": "qwq-plus", + "name": "QwQ Plus", + "display_name": "QwQ Plus", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 131072, + "output": 8192 }, - "temperature": false, - "tool_call": true, + "temperature": true, + "tool_call": false, "reasoning": { "supported": true, - "default": true + "default": true, + "budget": { + "default": 32768, + "min": 0, + "max": 32768 + } }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "low", - "medium", - "high" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, - "attachment": true, + "search": { + "supported": true, + "default": false, + "forced_search": false, + "search_strategy": "turbo" + }, + "attachment": false, "open_weights": false, - "knowledge": "2026-04-30", - "release_date": "2026-09-29", - "last_updated": "2026-09-29", + "knowledge": "2024-04", + "release_date": "2025-03-05", + "last_updated": "2025-03-05", "type": "chat" }, { - "id": "gpt-oss-safeguard-120b", - "name": "GPT OSS Safeguard 120B", - "display_name": "GPT OSS Safeguard 120B", + "id": "qwen-vl-max", + "name": "Qwen-VL Max", + "display_name": "Qwen-VL Max", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 128000 + "context": 131072, + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high" - ] - } + "supported": false }, - "attachment": false, - "open_weights": true, - "release_date": "2025-10-29", - "last_updated": "2025-10-29", + "attachment": true, + "open_weights": false, + "knowledge": "2024-04", + "release_date": "2024-04-08", + "last_updated": "2025-08-13", "type": "chat" }, { - "id": "mistral-small-2603", - "name": "Mistral Small 4", - "display_name": "Mistral Small 4", + "id": "qwen-omni-turbo-realtime", + "name": "Qwen-Omni Turbo Realtime", + "display_name": "Qwen-Omni Turbo Realtime", "modalities": { "input": [ "text", - "image" + "image", + "audio" ], "output": [ - "text" + "text", + "audio" ] }, "limit": { - "context": 262144, - "output": 256000 + "context": 32768, + "output": 2048 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": true, - "open_weights": true, - "knowledge": "2025-06", - "release_date": "2026-03-16", - "last_updated": "2026-03-16", - "type": "chat" + "open_weights": false, + "knowledge": "2024-04", + "release_date": "2025-05-08", + "last_updated": "2025-05-08" }, { - "id": "gemini-2.5-flash", - "name": "Gemini 2.5 Flash", - "display_name": "Gemini 2.5 Flash", + "id": "qwen3-vl-plus", + "name": "Qwen3 VL Plus", + "display_name": "Qwen3 VL Plus", "modalities": { "input": [ "text", - "image", - "audio", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65535 + "context": 262144, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false, + "budget": { + "default": 81920, + "min": 0, + "max": 81920 + } }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "budget", - "budget": { - "default": -1, - "min": 0, - "max": 24576, - "auto": -1, - "off": 0, - "unit": "tokens" - }, + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" ] } }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-06-17", - "last_updated": "2025-06-17", + "knowledge": "2025-04", + "release_date": "2025-09-23", + "last_updated": "2025-09-23", "type": "chat" }, { - "id": "claude-opus-5.5", - "name": "Claude Opus 5.5", - "display_name": "Claude Opus 5.5", + "id": "qwen3-coder-plus-2025-09-23", + "name": "Qwen3 Coder Plus 2025 09 23", + "display_name": "Qwen3 Coder Plus 2025 09 23", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" @@ -266111,34 +260761,20 @@ }, "limit": { "context": 1000000, - "output": 128000 + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high" - ] - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "attachment": false, "type": "chat" }, { - "id": "mistral-nemo-instruct-2407", - "name": "mistral-nemo-instruct-2407", - "display_name": "mistral-nemo-instruct-2407", + "id": "qwen3-coder-plus-2025-07-22", + "name": "Qwen3 Coder Plus 2025 07 22", + "display_name": "Qwen3 Coder Plus 2025 07 22", "modalities": { "input": [ "text" @@ -266148,65 +260784,101 @@ ] }, "limit": { - "context": 118000, - "output": 118000 + "context": 1000000, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": false }, "attachment": false, - "open_weights": true, - "knowledge": "2024-07", - "release_date": "2024-07-18", - "last_updated": "2024-07-18", "type": "chat" }, { - "id": "claude-opus4-6", - "name": "Claude Opus 4.6", - "display_name": "Claude Opus 4.6", + "id": "qwen-vl-ocr-latest", + "name": "Qwen Vl Ocr Latest", + "display_name": "Qwen Vl Ocr Latest", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 34096, + "output": 4096 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high" - ] + "attachment": false, + "type": "chat" + }, + { + "id": "qvq-max-2025-05-15", + "name": "Qvq Max 2025 05 15", + "display_name": "Qvq Max 2025 05 15", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 131072, + "output": 8192 + }, + "temperature": true, + "tool_call": false, + "reasoning": { + "supported": true, + "default": false, + "budget": { + "default": 16384, + "min": 0, + "max": 16384 } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-05-31", - "release_date": "2026-02-05", - "last_updated": "2026-03-13", + "attachment": false, + "type": "chat" + }, + { + "id": "qwen-long", + "name": "Qwen Long", + "display_name": "Qwen Long", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1000000, + "output": 8192 + }, + "temperature": true, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, "type": "chat" }, { - "id": "qwen3-32b", - "name": "Qwen3 32B", - "display_name": "Qwen3 32B", + "id": "qwen-turbo-latest", + "name": "Qwen Turbo Latest", + "display_name": "Qwen Turbo Latest", "modalities": { "input": [ "text" @@ -266216,14 +260888,19 @@ ] }, "limit": { - "context": 16384, + "context": 131072, "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false, + "budget": { + "default": 38912, + "min": 0, + "max": 38912 + } }, "extra_capabilities": { "reasoning": { @@ -266236,17 +260913,19 @@ ] } }, + "search": { + "supported": true, + "default": false, + "forced_search": false, + "search_strategy": "turbo" + }, "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-04-28", - "last_updated": "2025-04-28", "type": "chat" }, { - "id": "apertus-70b", - "name": "Apertus 70B", - "display_name": "Apertus 70B", + "id": "qwen-turbo-2024-09-19", + "name": "Qwen Turbo 2024 09 19", + "display_name": "Qwen Turbo 2024 09 19", "modalities": { "input": [ "text" @@ -266256,97 +260935,90 @@ ] }, "limit": { - "context": 65536, - "output": 16384 + "context": 131072, + "output": 8192 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": false }, "attachment": false, - "open_weights": true, - "knowledge": "2025-09", - "release_date": "2025-09-02", - "last_updated": "2025-09-02", "type": "chat" }, { - "id": "gpt-5.4", - "name": "GPT-5.4", - "display_name": "GPT-5.4", + "id": "qwen-flash-2025-07-28", + "name": "Qwen Flash 2025 07 28", + "display_name": "Qwen Flash 2025 07 28", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1000000, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": false, + "budget": { + "default": 81920, + "min": 0, + "max": 81920 + } }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-05", - "last_updated": "2026-03-05", + "search": { + "supported": true, + "default": false, + "forced_search": false, + "search_strategy": "turbo" + }, + "attachment": false, "type": "chat" }, { - "id": "kimi-k2.6", - "name": "Kimi K2.6", - "display_name": "Kimi K2.6", + "id": "qwen-plus-latest", + "name": "Qwen Plus Latest", + "display_name": "Qwen Plus Latest", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 256000 + "context": 1000000, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false, + "budget": { + "default": 81920, + "min": 0, + "max": 81920 + } }, "extra_capabilities": { "reasoning": { @@ -266359,85 +261031,65 @@ ] } }, - "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-20", - "last_updated": "2026-04-20", + "search": { + "supported": true, + "default": false, + "forced_search": false, + "search_strategy": "turbo" + }, + "attachment": false, "type": "chat" }, { - "id": "gemini-3.8-flash", - "name": "Gemini 3.8 Flash", - "display_name": "Gemini 3.8 Flash", + "id": "qwen-plus-2024-09-19", + "name": "Qwen Plus 2024 09 19", + "display_name": "Qwen Plus 2024 09 19", "modalities": { "input": [ - "text", - "image", - "audio", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65535 + "context": 131072, + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", - "low", - "medium", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] - } + "supported": false }, - "attachment": true, - "open_weights": false, - "release_date": "2026-09-02", - "last_updated": "2026-09-02", + "attachment": false, "type": "chat" }, { - "id": "kimi-k3", - "name": "Kimi K3", - "display_name": "Kimi K3", + "id": "qwen-plus-2025-07-14", + "name": "Qwen Plus 2025 07 14", + "display_name": "Qwen Plus 2025 07 14", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 1048576 + "context": 131072, + "output": 16384 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false, + "budget": { + "default": 38912, + "min": 0, + "max": 38912 + } }, "extra_capabilities": { "reasoning": { @@ -266447,42 +261099,44 @@ "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "effort_options": [ - "low", - "high", - "max" ] } }, - "attachment": true, - "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-16", + "search": { + "supported": true, + "default": false, + "forced_search": false, + "search_strategy": "turbo" + }, + "attachment": false, "type": "chat" }, { - "id": "qwen3.6-27b", - "name": "Qwen3.6 27B", - "display_name": "Qwen3.6 27B", + "id": "qwen-plus-2025-09-11", + "name": "Qwen Plus 2025 09 11", + "display_name": "Qwen Plus 2025 09 11", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262000, - "output": 262000 + "context": 1000000, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false, + "budget": { + "default": 81920, + "min": 0, + "max": 81920 + } }, "extra_capabilities": { "reasoning": { @@ -266495,178 +261149,127 @@ ] } }, - "attachment": true, - "open_weights": true, - "release_date": "2026-04-22", - "last_updated": "2026-04-22", + "search": { + "supported": true, + "default": false, + "forced_search": false, + "search_strategy": "turbo" + }, + "attachment": false, "type": "chat" }, { - "id": "gpt-5.1", - "name": "GPT-5.1", - "display_name": "GPT-5.1", + "id": "qwen-max-latest", + "name": "Qwen Max Latest", + "display_name": "Qwen Max Latest", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 131072, + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": false + "supported": false }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "search": { + "supported": true, + "default": false, + "forced_search": false, + "search_strategy": "turbo" }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-11-13", - "last_updated": "2025-11-13", + "attachment": false, "type": "chat" }, { - "id": "claude-opus-5", - "name": "Claude Opus 5", - "display_name": "Claude Opus 5", + "id": "qwen-max-2024-09-19", + "name": "Qwen Max 2024 09 19", + "display_name": "Qwen Max 2024 09 19", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 32768, + "output": 8192 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "low", - "medium", - "high" - ] - } + "search": { + "supported": true, + "default": false, + "forced_search": false, + "search_strategy": "turbo" }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-05", - "release_date": "2026-07-24", - "last_updated": "2026-07-24", + "attachment": false, "type": "chat" }, { - "id": "mistral-medium-3.5", - "name": "mistral-medium-3.5", - "display_name": "mistral-medium-3.5", + "id": "qwen-max-2024-04-28", + "name": "Qwen Max 2024 04 28", + "display_name": "Qwen Max 2024 04 28", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 256000 + "context": 8000, + "output": 2000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": true, - "open_weights": false, - "release_date": "2026-04-30", - "last_updated": "2026-04-30", + "attachment": false, "type": "chat" }, { - "id": "qwen3-vl-235b-a22b", - "name": "qwen3-vl-235b-a22b", - "display_name": "qwen3-vl-235b-a22b", + "id": "qwen-max-2024-04-03", + "name": "Qwen Max 2024 04 03", + "display_name": "Qwen Max 2024 04 03", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 256000 + "context": 8000, + "output": 2000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, - "attachment": true, - "open_weights": true, - "knowledge": "2025-03-31", - "release_date": "2025-09-23", - "last_updated": "2025-09-23", + "attachment": false, "type": "chat" }, { - "id": "devstral-2512", - "name": "Devstral 2", - "display_name": "Devstral 2", + "id": "qwen-max-2025-01-25", + "name": "Qwen Max 2025 01 25", + "display_name": "Qwen Max 2025 01 25", "modalities": { "input": [ "text" @@ -266676,166 +261279,163 @@ ] }, "limit": { - "context": 256000, - "output": 256000 + "context": 131072, + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, + "search": { + "supported": true, + "default": false, + "forced_search": false, + "search_strategy": "turbo" + }, "attachment": false, - "open_weights": true, - "knowledge": "2025-12", - "release_date": "2025-12-09", - "last_updated": "2025-12-09", "type": "chat" }, { - "id": "gpt-4.1-mini", - "name": "GPT-4.1 mini", - "display_name": "GPT-4.1 mini", + "id": "qwen3-max-2025-09-23", + "name": "Qwen3 Max 20250923", + "display_name": "Qwen3 Max 20250923", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1047576, - "output": 32768 + "context": 262144, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-04-14", - "last_updated": "2025-04-14", + "search": { + "supported": true, + "default": false, + "forced_search": false, + "search_strategy": "turbo" + }, + "attachment": false, "type": "chat" }, { - "id": "gpt-6-astra", - "name": "GPT-6 Astra", - "display_name": "GPT-6 Astra", + "id": "qwen3-max-preview", + "name": "Qwen3 Max Preview", + "display_name": "Qwen3 Max Preview", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 262144, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": true }, "extra_capabilities": { "reasoning": { "supported": true, - "effort_options": [ - "low", - "medium", - "high" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-04-30", - "release_date": "2026-09-04", - "last_updated": "2026-09-04", + "search": { + "supported": true, + "default": false, + "forced_search": false, + "search_strategy": "turbo" + }, + "attachment": false, "type": "chat" }, { - "id": "deepseek-v4.1-flash-1017", - "name": "DeepSeek V4.1 Flash 1017", - "display_name": "DeepSeek V4.1 Flash 1017", + "id": "qwen3-235b-a22b-thinking-2507", + "name": "Qwen3 235B A22B Thinking 2507", + "display_name": "Qwen3 235B A22B Thinking 2507", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 1048576 + "context": 131072, + "output": 32768 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, - "default": true + "default": true, + "budget": { + "default": 81920, + "min": 0, + "max": 81920 + } }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "low", - "medium", - "high" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, - "attachment": true, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-10-17", - "last_updated": "2026-10-17", + "attachment": false, "type": "chat" }, { - "id": "nova-2-lite", - "name": "Nova 2 Lite", - "display_name": "Nova 2 Lite", + "id": "qwen3-235b-a22b-instruct-2507", + "name": "Qwen3 235B A22B Instruct 2507", + "display_name": "Qwen3 235B A22B Instruct 2507", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 65535 + "context": 131072, + "output": 32768 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-10", - "release_date": "2025-12-02", - "last_updated": "2025-12-01", + "attachment": false, "type": "chat" }, { - "id": "hermes-4-405b", - "name": "Hermes 4 405B", - "display_name": "Hermes 4 405B", + "id": "qwen3-30b-a3b-instruct-2507", + "name": "Qwen3 30B A3B Instruct 2507", + "display_name": "Qwen3 30B A3B Instruct 2507", "modalities": { "input": [ "text" @@ -266845,76 +261445,62 @@ ] }, "limit": { - "context": 128000, - "output": 128000 + "context": 131072, + "output": 32768 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": false }, "attachment": false, - "open_weights": true, - "knowledge": "2024-08-31", - "release_date": "2025-08-26", - "last_updated": "2025-08-26", "type": "chat" }, { - "id": "gemini-3.7-flash", - "name": "Gemini 3.7 Flash", - "display_name": "Gemini 3.7 Flash", + "id": "qwen3-30b-a3b-thinking-2507", + "name": "Qwen3 30B A3B Thinking 2507", + "display_name": "Qwen3 30B A3B Thinking 2507", "modalities": { "input": [ - "text", - "image", - "audio", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65535 + "context": 131072, + "output": 32768 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, - "default": true + "default": true, + "budget": { + "default": 81920, + "min": 0, + "max": 81920 + } }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", - "low", - "medium", - "high" - ], + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-08-13", - "last_updated": "2026-08-13", + "attachment": false, "type": "chat" }, { - "id": "gpt-oss-120b", - "name": "GPT OSS 120B", - "display_name": "GPT OSS 120B", + "id": "qwen3-30b-a3b", + "name": "Qwen3 30B A3B", + "display_name": "Qwen3 30B A3B", "modalities": { "input": [ "text" @@ -266924,54 +261510,60 @@ ] }, "limit": { - "context": 131000, - "output": 131000 + "context": 131072, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false, + "budget": { + "default": 81920, + "min": 0, + "max": 81920 + } }, "extra_capabilities": { "reasoning": { "supported": true, - "effort_options": [ - "low", - "medium", - "high" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, "attachment": false, - "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", "type": "chat" }, { - "id": "qwen3.5-9b", - "name": "Qwen3.5 9B", - "display_name": "Qwen3.5 9B", + "id": "qwen3-4b", + "name": "Qwen3 4B", + "display_name": "Qwen3 4B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262000, - "output": 262000 + "context": 131072, + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": true, + "budget": { + "default": 38912, + "min": 0, + "max": 38912 + } }, "extra_capabilities": { "reasoning": { @@ -266984,16 +261576,13 @@ ] } }, - "attachment": true, - "open_weights": true, - "release_date": "2026-02-23", - "last_updated": "2026-02-23", + "attachment": false, "type": "chat" }, { - "id": "glm-5.2", - "name": "GLM-5.2", - "display_name": "GLM-5.2", + "id": "qwen3-1.7b", + "name": "Qwen3 1.7B", + "display_name": "Qwen3 1.7B", "modalities": { "input": [ "text" @@ -267003,14 +261592,19 @@ ] }, "limit": { - "context": 1048576, - "output": 1000000 + "context": 32768, + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": true, + "budget": { + "default": 30720, + "min": 0, + "max": 30720 + } }, "extra_capabilities": { "reasoning": { @@ -267020,53 +261614,57 @@ "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "effort_options": [ - "high", - "max" ] } }, "attachment": false, - "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", "type": "chat" }, { - "id": "gpt-4o-mini", - "name": "GPT-4o mini", - "display_name": "GPT-4o mini", + "id": "qwen3-0.6b", + "name": "Qwen3 0.6B", + "display_name": "Qwen3 0.6B", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16000 + "context": 32768, + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true, + "budget": { + "default": 30720, + "min": 0, + "max": 30720 + } }, - "attachment": true, - "open_weights": false, - "knowledge": "2023-09", - "release_date": "2024-07-18", - "last_updated": "2024-07-18", + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, "type": "chat" }, { - "id": "deepseek-v4.1-flash", - "name": "DeepSeek V4.1 Flash", - "display_name": "DeepSeek V4.1 Flash", + "id": "qwen3-vl-plus-2025-09-23", + "name": "Qwen3 VL Plus 2025 09 23", + "display_name": "Qwen3 VL Plus 2025 09 23", "modalities": { "input": [ "text", @@ -267077,65 +261675,162 @@ ] }, "limit": { - "context": 1048576, - "output": 393216 + "context": 262144, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false, + "budget": { + "default": 81920, + "min": 0, + "max": 81920 + } }, "extra_capabilities": { "reasoning": { "supported": true, - "effort_options": [ - "low", - "medium", - "high" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, - "attachment": true, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-09-10", - "last_updated": "2026-09-10", + "attachment": false, "type": "chat" }, { - "id": "qwen2.5-vl-72b-instruct", - "name": "qwen2.5-vl-72b-instruct", - "display_name": "qwen2.5-vl-72b-instruct", + "id": "qwq-plus-latest", + "name": "QwQ Plus Latest", + "display_name": "QwQ Plus Latest", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 32000, - "output": 32000 + "context": 131072, + "output": 8192 }, - "temperature": false, + "temperature": true, "tool_call": false, "reasoning": { + "supported": true, + "default": true, + "budget": { + "default": 32768, + "min": 0, + "max": 32768 + } + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "search": { "supported": false }, + "attachment": false, + "type": "chat" + } + ] + }, + "claudinio": { + "id": "claudinio", + "name": "Claudinio", + "display_name": "Claudinio", + "api": "https://api.claudin.io/v1", + "doc": "https://claudin.io", + "models": [ + { + "id": "claudinio", + "name": "Claudinio", + "display_name": "Claudinio", + "modalities": { + "input": [ + "text", + "image", + "audio", + "video" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 256000, + "output": 64000 + }, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, "attachment": true, - "open_weights": true, - "knowledge": "2024-04", - "release_date": "2025-01-26", - "last_updated": "2025-01-26", + "open_weights": false, + "knowledge": "2026-05", + "release_date": "2026-05-12", + "last_updated": "2026-06-02", "type": "chat" }, { - "id": "gpt-5-mini", - "name": "GPT-5 Mini", - "display_name": "GPT-5 Mini", + "id": "claudius", + "name": "Claudius", + "display_name": "Claudius", + "modalities": { + "input": [ + "text", + "image", + "audio", + "video" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 256000, + "output": 64000 + }, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "attachment": true, + "open_weights": false, + "knowledge": "2026-05", + "release_date": "2026-05-12", + "last_updated": "2026-05-12", + "type": "chat" + } + ] + }, + "hpc-ai": { + "id": "hpc-ai", + "name": "HPC-AI", + "display_name": "HPC-AI", + "api": "https://api.hpc-ai.com/inference/v1", + "doc": "https://www.hpc-ai.com/doc/docs/quickstart/", + "models": [ + { + "id": "moonshotai/kimi-k2.7-code", + "name": "Kimi K2.7 Code", + "display_name": "Kimi K2.7 Code", "modalities": { "input": [ "text", @@ -267146,10 +261841,10 @@ ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 256000, + "output": 256000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -267157,47 +261852,32 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "minimal", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "supported": true } }, "attachment": true, - "open_weights": false, - "knowledge": "2024-05-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-06-12", + "last_updated": "2026-06-12", "type": "chat" }, { - "id": "gpt-oss-20b", - "name": "GPT OSS 20B", - "display_name": "GPT OSS 20B", + "id": "moonshotai/kimi-k2.5", + "name": "Kimi K2.5", + "display_name": "Kimi K2.5", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 131000, - "output": 131000 + "context": 256000, + "output": 256000 }, "temperature": true, "tool_call": true, @@ -267208,28 +261888,28 @@ "extra_capabilities": { "reasoning": { "supported": true, - "effort_options": [ - "low", - "medium", - "high" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "knowledge": "2025-01", + "release_date": "2026-01-27", + "last_updated": "2026-01-27", "type": "chat" }, { - "id": "minimax-m3", - "name": "MiniMax-M3", - "display_name": "MiniMax-M3", + "id": "deepseek/deepseek-v4-flash", + "name": "DeepSeek V4 Flash", + "display_name": "DeepSeek V4 Flash", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" @@ -267237,7 +261917,7 @@ }, "limit": { "context": 1048576, - "output": 1048576 + "output": 128000 }, "temperature": true, "tool_call": true, @@ -267247,31 +261927,48 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "high", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." + ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-06-01", - "last_updated": "2026-06-01", + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "glm-5.3-flash", - "name": "GLM-5.3-Flash", - "display_name": "GLM-5.3-Flash", + "id": "deepseek/deepseek-v4-pro", + "name": "DeepSeek V4 Pro", + "display_name": "DeepSeek V4 Pro", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 1048576 + "context": 1002000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -267282,23 +261979,36 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", "effort_options": [ "low", "high", "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "gpt-5", - "name": "GPT-5", - "display_name": "GPT-5", + "id": "openai/gpt-5.5", + "name": "GPT-5.5", + "display_name": "GPT-5.5", "modalities": { "input": [ "text", @@ -267309,10 +262019,10 @@ ] }, "limit": { - "context": 400000, + "context": 1050000, "output": 128000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -267325,10 +262035,10 @@ "mode": "effort", "effort": "medium", "effort_options": [ - "minimal", "low", "medium", - "high" + "high", + "xhigh" ], "verbosity": "medium", "verbosity_options": [ @@ -267341,20 +262051,18 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "knowledge": "2025-12-01", + "release_date": "2026-04-23", + "last_updated": "2026-04-23", "type": "chat" }, { - "id": "gemini-3.6-flash", - "name": "Gemini 3.6 Flash", - "display_name": "Gemini 3.6 Flash", + "id": "zai-org/glm-5.2", + "name": "GLM-5.2", + "display_name": "GLM-5.2", "modalities": { "input": [ - "text", - "image", - "audio" + "text" ], "output": [ "text" @@ -267362,7 +262070,7 @@ }, "limit": { "context": 1048576, - "output": 65535 + "output": 131072 }, "temperature": true, "tool_call": true, @@ -267373,48 +262081,41 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", - "low", - "medium", - "high" - ], + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" + ], + "effort_options": [ + "high", + "max" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-07-21", - "last_updated": "2026-07-21", + "attachment": false, + "open_weights": true, + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "gpt-6-luna", - "name": "GPT-6 Luna", - "display_name": "GPT-6 Luna", + "id": "zai-org/glm-5.1", + "name": "GLM 5.1", + "display_name": "GLM 5.1", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 202000, + "output": 202000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -267422,54 +262123,81 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "low", - "medium", - "high" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-05-18", - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "attachment": false, + "open_weights": true, + "release_date": "2026-04-07", + "last_updated": "2026-04-07", "type": "chat" }, { - "id": "gpt-4.1", - "name": "GPT-4.1", - "display_name": "GPT-4.1", + "id": "anthropic/claude-opus-4.7", + "name": "Claude Opus 4.7", + "display_name": "Claude Opus 4.7", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1047576, - "output": 32768 + "context": 1000000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." + ] + } }, "attachment": true, "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-04-14", - "last_updated": "2025-04-14", + "knowledge": "2026-01-31", + "release_date": "2026-04-16", + "last_updated": "2026-04-16", "type": "chat" }, { - "id": "deepseek-v3.2", - "name": "DeepSeek V3.2", - "display_name": "DeepSeek V3.2", + "id": "minimax/minimax-m2.5", + "name": "MiniMax-M2.5", + "display_name": "MiniMax-M2.5", "modalities": { "input": [ "text" @@ -267479,8 +262207,8 @@ ] }, "limit": { - "context": 163840, - "output": 65536 + "context": 196000, + "output": 195000 }, "temperature": true, "tool_call": true, @@ -267490,25 +262218,28 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "effort_options": [ - "low", - "medium", - "high" - ] + "supported": true } }, "attachment": false, "open_weights": true, - "knowledge": "2024-07", - "release_date": "2025-12-01", - "last_updated": "2025-12-01", + "release_date": "2026-02-12", + "last_updated": "2026-02-12", "type": "chat" - }, + } + ] + }, + "routing-run": { + "id": "routing-run", + "name": "routing.run", + "display_name": "routing.run", + "api": "https://api.routing.run/v1", + "doc": "https://docs.routing.run/api-reference/models", + "models": [ { - "id": "pixtral-large-2502", - "name": "Pixtral Large (25.02)", - "display_name": "Pixtral Large (25.02)", + "id": "gpt-5.6-terra", + "name": "GPT-5.6 Terra", + "display_name": "GPT-5.6 Terra", "modalities": { "input": [ "text", @@ -267520,7 +262251,7 @@ ] }, "limit": { - "context": 128000, + "context": 1000000, "output": 128000 }, "temperature": false, @@ -267529,16 +262260,45 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, "attachment": true, "open_weights": false, - "release_date": "2025-04-08", - "last_updated": "2025-04-08", + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "qwen3-235b-a22b-instruct-2507", - "name": "Qwen3 235B-A22B Instruct 2507", - "display_name": "Qwen3 235B-A22B Instruct 2507", + "id": "glm-5.2", + "name": "GLM-5.2", + "display_name": "GLM-5.2", "modalities": { "input": [ "text" @@ -267548,24 +262308,36 @@ ] }, "limit": { - "context": 262000, - "output": 262000 + "context": 200000, + "output": 32000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, "open_weights": true, - "release_date": "2025-07-21", - "last_updated": "2025-07-21", + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "qwen3.8-2.4t-a95b", - "name": "Qwen3.8 2.4T A95B", - "display_name": "Qwen3.8 2.4T A95B", + "id": "deepseek-v4-flash", + "name": "DeepSeek V4 Flash", + "display_name": "DeepSeek V4 Flash", "modalities": { "input": [ "text" @@ -267575,8 +262347,8 @@ ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1000000, + "output": 64000 }, "temperature": true, "tool_call": true, @@ -267587,37 +262359,47 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", "effort_options": [ "low", - "medium", - "xhigh" + "high", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, "attachment": false, "open_weights": true, - "release_date": "2026-08-12", - "last_updated": "2026-08-12", + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "gemini-3.1-flash-lite", - "name": "Gemini 3.1 Flash Lite", - "display_name": "Gemini 3.1 Flash Lite", + "id": "nemotron-3-ultra", + "name": "Nemotron 3 Ultra 550B A55B", + "display_name": "Nemotron 3 Ultra 550B A55B", "modalities": { "input": [ - "text", - "image", - "audio", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65535 + "context": 131072, + "output": 32000 }, "temperature": true, "tool_call": true, @@ -267628,113 +262410,143 @@ "extra_capabilities": { "reasoning": { "supported": true, - "effort_options": [ - "low", - "medium", - "high" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-05-07", - "last_updated": "2026-05-07", + "attachment": false, + "open_weights": true, + "knowledge": "2025-09", + "release_date": "2026-06-04", + "last_updated": "2026-06-04", "type": "chat" }, { - "id": "gemma-4-26b-a4b-it", - "name": "Gemma 4 26B A4B IT", - "display_name": "Gemma 4 26B A4B IT", + "id": "claude-sonnet-4-6", + "name": "Claude Sonnet 4.6", + "display_name": "Claude Sonnet 4.6", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262000, - "output": 81920 + "context": 1000000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." + ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-02-17", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "ministral-8b-2512", - "name": "Ministral 3 8B 2512", - "display_name": "Ministral 3 8B 2512", + "id": "gpt-5.6-sol", + "name": "GPT-5.6 Sol", + "display_name": "GPT-5.6 Sol", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 256000 + "context": 1000000, + "output": 128000 }, "temperature": false, "tool_call": true, "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": true, - "release_date": "2025-12-02", - "last_updated": "2025-12-02", - "type": "chat" - }, - { - "id": "qwen3guard-gen-0.6b", - "name": "qwen3guard-gen-0.6b", - "display_name": "qwen3guard-gen-0.6b", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 32000, - "output": 32000 + "supported": true, + "default": true }, - "temperature": false, - "tool_call": false, - "reasoning": { - "supported": false + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-02-04", - "last_updated": "2026-02-04", + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "claude-sonnet-5.5", - "name": "Claude Sonnet 5.5", - "display_name": "Claude Sonnet 5.5", + "id": "gpt-5.6-luna", + "name": "GPT-5.6 Luna", + "display_name": "GPT-5.6 Luna", "modalities": { "input": [ "text", @@ -267757,35 +262569,56 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ], + "verbosity": "medium", + "verbosity_options": [ "low", "medium", "high" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-09-28", - "last_updated": "2026-09-28", + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "glm-4.7-flash", - "name": "GLM-4.7-Flash", - "display_name": "GLM-4.7-Flash", + "id": "qwen3.5-9b", + "name": "Qwen3.5 9B", + "display_name": "Qwen3.5 9B", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 203000, - "output": 203000 + "context": 262144, + "output": 32000 }, "temperature": true, "tool_call": true, @@ -267804,17 +262637,16 @@ ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2026-01-19", - "last_updated": "2026-01-19", + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" }, { - "id": "gpt-4.1-nano", - "name": "GPT-4.1 nano", - "display_name": "GPT-4.1 nano", + "id": "claude-opus-4-8", + "name": "Claude Opus 4.8", + "display_name": "Claude Opus 4.8", "modalities": { "input": [ "text", @@ -267826,90 +262658,136 @@ ] }, "limit": { - "context": 1047576, - "output": 32768 + "context": 1000000, + "output": 32000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." + ] + } }, "attachment": true, "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-04-14", - "last_updated": "2025-04-14", + "knowledge": "2026-01", + "release_date": "2026-05-28", + "last_updated": "2026-05-28", "type": "chat" }, { - "id": "minicpm-v-4.5", - "name": "minicpm-v-4.5", - "display_name": "minicpm-v-4.5", + "id": "kimi-k2.7-code", + "name": "Kimi K2.7 Code", + "display_name": "Kimi K2.7 Code", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 32000, + "context": 200000, "output": 32000 }, "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": false, - "release_date": "2026-06-02", - "last_updated": "2026-06-02", + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": true, + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-06-12", + "last_updated": "2026-06-12", "type": "chat" }, { - "id": "nova-micro-v1", - "name": "Nova Micro 1.0", - "display_name": "Nova Micro 1.0", + "id": "kimi-k2.7-code-nitro", + "name": "Kimi K2.7 Code Nitro", + "display_name": "Kimi K2.7 Code Nitro", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 10000 + "context": 200000, + "output": 32000 }, "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": true, - "open_weights": false, - "knowledge": "2024-10-31", - "release_date": "2024-12-05", - "last_updated": "2024-12-05", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-06-12", + "last_updated": "2026-06-12", "type": "chat" - } - ] - }, - "stepfun-ai": { - "id": "stepfun-ai", - "name": "StepFun (Global)", - "display_name": "StepFun (Global)", - "api": "https://api.stepfun.ai/v1", - "doc": "https://platform.stepfun.ai/docs/en/overview/concept", - "models": [ + }, { - "id": "step-5-preview", - "name": "Step 5 Preview", - "display_name": "Step 5 Preview", + "id": "kimi-k2.6", + "name": "Kimi K2.6", + "display_name": "Kimi K2.6", "modalities": { "input": [ "text", @@ -267921,8 +262799,8 @@ ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 200000, + "output": 32000 }, "temperature": true, "tool_call": true, @@ -267933,13 +262811,6 @@ "extra_capabilities": { "reasoning": { "supported": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high" - ], "interleaved": true, "summaries": true, "visibility": "summary", @@ -267950,14 +262821,15 @@ }, "attachment": true, "open_weights": true, - "release_date": "2026-09-16", - "last_updated": "2026-09-20", + "knowledge": "2025-01", + "release_date": "2026-04-20", + "last_updated": "2026-04-20", "type": "chat" }, { - "id": "step-3.5-flash-2603", - "name": "Step 3.5 Flash 2603", - "display_name": "Step 3.5 Flash 2603", + "id": "deepseek-v4-pro", + "name": "DeepSeek V4 Pro", + "display_name": "DeepSeek V4 Pro", "modalities": { "input": [ "text" @@ -267967,8 +262839,8 @@ ] }, "limit": { - "context": 256000, - "output": 256000 + "context": 1000000, + "output": 64000 }, "temperature": true, "tool_call": true, @@ -267979,66 +262851,88 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "high", + "max" + ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" ], - "effort_options": [ - "low", - "high" + "notes": [ + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, "attachment": false, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "stepaudio-2.5-asr", - "name": "StepAudio 2.5 ASR", - "display_name": "StepAudio 2.5 ASR", + "id": "glm-5.2-nitro", + "name": "GLM 5.2 Nitro", + "display_name": "GLM 5.2 Nitro", "modalities": { "input": [ - "audio" + "text" ], "output": [ "text" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 200000, + "output": 32000 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, - "open_weights": false, - "release_date": "2026-04-24", - "last_updated": "2026-07-02" + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, + "open_weights": true, + "release_date": "2026-06-13", + "last_updated": "2026-06-13", + "type": "chat" }, { - "id": "step-3.5-flash", - "name": "Step 3.5 Flash", - "display_name": "Step 3.5 Flash", + "id": "kimi-k2.6-nitro", + "name": "Kimi K2.6 Nitro", + "display_name": "Kimi K2.6 Nitro", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 256000 + "context": 200000, + "output": 32000 }, "temperature": true, "tool_call": true, @@ -268054,135 +262948,130 @@ "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "effort_options": [ - "low", - "high" ] } }, - "attachment": false, + "attachment": true, "open_weights": true, "knowledge": "2025-01", - "release_date": "2026-01-29", - "last_updated": "2026-02-13", + "release_date": "2026-04-20", + "last_updated": "2026-04-20", "type": "chat" - }, + } + ] + }, + "opencode": { + "id": "opencode", + "name": "OpenCode", + "display_name": "OpenCode", + "api": "https://opencode.ai/inference/openai/v1", + "doc": "https://opencode.ai/v2/docs/console/models/", + "models": [ { - "id": "step-tts-2", - "name": "Step TTS 2", - "display_name": "Step TTS 2", + "id": "muse-spark-1.2", + "name": "Muse Spark 1.2", + "display_name": "Muse Spark 1.2", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "pdf", + "audio" ], "output": [ - "audio" + "text" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 1048576, + "output": 131072 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] + } + }, + "attachment": true, "open_weights": false, - "release_date": "2026-03-01", - "last_updated": "2026-07-02" + "release_date": "2026-08-05", + "last_updated": "2026-08-05", + "type": "chat" }, { - "id": "step-3.7-flash", - "name": "Step 3.7 Flash", - "display_name": "Step 3.7 Flash", + "id": "claude-sonnet-4-5", + "name": "Claude Sonnet 4.5", + "display_name": "Claude Sonnet 4.5", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 256000 + "context": 1000000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" ], - "effort_options": [ - "low", - "medium", - "high" + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2026-03-01", - "release_date": "2026-05-29", - "last_updated": "2026-05-29", + "open_weights": false, + "knowledge": "2025-07-31", + "release_date": "2025-09-29", + "last_updated": "2025-09-29", "type": "chat" }, { - "id": "stepaudio-2.5-tts", - "name": "StepAudio 2.5 TTS", - "display_name": "StepAudio 2.5 TTS", - "modalities": { - "input": [ - "text" - ], - "output": [ - "audio" - ] - }, - "limit": { - "context": 8192, - "output": 8192 - }, - "temperature": false, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": false, - "release_date": "2026-04-16", - "last_updated": "2026-07-02" - } - ] - }, - "inferx": { - "id": "inferx", - "name": "InferX", - "display_name": "InferX", - "api": "https://model.inferx.net/endpoints/v1", - "doc": "https://model.inferx.net/endpoints", - "models": [ - { - "id": "deepseek-v4-flash", - "name": "deepseek-v4-flash", - "display_name": "deepseek-v4-flash", + "id": "claude-fable-5", + "name": "Claude Fable 5", + "display_name": "Claude Fable 5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" @@ -268190,9 +263079,9 @@ }, "limit": { "context": 1000000, - "output": 100000 + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -268206,64 +263095,126 @@ "effort": "high", "effort_options": [ "low", + "medium", "high", + "xhigh", "max" ], "interleaved": true, "summaries": true, - "visibility": "summary", + "visibility": "omitted", "continuation": [ "thinking_blocks" ], "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." + "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", + "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", + "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "attachment": true, + "open_weights": false, + "knowledge": "2026-01-31", + "release_date": "2026-06-09", + "last_updated": "2026-06-09", "type": "chat" }, { - "id": "Devstral-2-123B-Instruct-2512-int4-AutoRound", - "name": "Devstral-2-123B-Instruct-2512-int4-AutoRound", - "display_name": "Devstral-2-123B-Instruct-2512-int4-AutoRound", + "id": "grok-build-0.1", + "name": "Grok Build 0.1", + "display_name": "Grok Build 0.1", "modalities": { "input": [ + "text", + "image", + "pdf" + ], + "output": [ "text" + ] + }, + "limit": { + "context": 256000, + "output": 256000 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": true, + "open_weights": false, + "release_date": "2026-04-16", + "last_updated": "2026-04-16", + "type": "chat" + }, + { + "id": "claude-haiku-4-5", + "name": "Claude Haiku 4.5", + "display_name": "Claude Haiku 4.5", + "modalities": { + "input": [ + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 128000 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-12", - "release_date": "2025-12-09", - "last_updated": "2025-12-09", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-02-28", + "release_date": "2025-10-15", + "last_updated": "2025-10-15", "type": "chat" }, { - "id": "mimo-v25", - "name": "mimo-v25", - "display_name": "mimo-v25", + "id": "qwen3.6-plus", + "name": "Qwen3.6 Plus", + "display_name": "Qwen3.6 Plus", "modalities": { "input": [ "text", "image", - "audio", "video" ], "output": [ @@ -268271,8 +263222,8 @@ ] }, "limit": { - "context": 1000000, - "output": 100000 + "context": 262144, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -268280,58 +263231,93 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, "attachment": true, - "open_weights": true, - "knowledge": "2024-12", - "release_date": "2026-04-22", - "last_updated": "2026-04-22", + "open_weights": false, + "knowledge": "2025-04", + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "Agents-A1", - "name": "Agents-A1", - "display_name": "Agents-A1", + "id": "gpt-5.6-terra", + "name": "GPT-5.6 Terra", + "display_name": "GPT-5.6 Terra", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262000, - "output": 100000 + "context": 1050000, + "output": 128000 }, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, "attachment": true, - "open_weights": true, - "release_date": "2026-06-26", - "last_updated": "2026-06-26", + "open_weights": false, + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" - }, - { - "id": "Qwen3.6-27B-FP8", - "name": "Qwen3.6 27B FP8", - "display_name": "Qwen3.6 27B FP8", + }, + { + "id": "glm-5.2", + "name": "GLM-5.2", + "display_name": "GLM-5.2", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -268347,32 +263333,34 @@ "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "effort_options": [ + "high", + "max" ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-04-22", - "last_updated": "2026-04-22", + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "Qwen3.6-35B-A3B-FP8", - "name": "Qwen3.6 35B A3B FP8", - "display_name": "Qwen3.6 35B A3B FP8", + "id": "deepseek-v4-flash", + "name": "DeepSeek V4 Flash", + "display_name": "DeepSeek V4 Flash", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262000, - "output": 65536 + "context": 1000000, + "output": 384000 }, "temperature": true, "tool_call": true, @@ -268383,104 +263371,163 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "high", + "max" + ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "notes": [ + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-04-17", - "last_updated": "2026-04-17", + "knowledge": "2025-05", + "release_date": "2026-07-31", + "last_updated": "2026-07-31", "type": "chat" }, { - "id": "Qwen3.6-35B-A3B-fp8-no-thinking", - "name": "Qwen3.6-35B-A3B-fp8-no-thinking", - "display_name": "Qwen3.6-35B-A3B-fp8-no-thinking", + "id": "gpt-5.4", + "name": "GPT-5.4", + "display_name": "GPT-5.4", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262000, - "output": 65536 + "context": 1050000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, - "open_weights": true, - "release_date": "2026-04-17", - "last_updated": "2026-04-17", + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-03-05", + "last_updated": "2026-03-05", "type": "chat" }, { - "id": "Qwen3-Coder-Next-FP8-no-thinking", - "name": "Qwen3-Coder-Next-FP8-no-thinking", - "display_name": "Qwen3-Coder-Next-FP8-no-thinking", + "id": "claude-sonnet-4-6", + "name": "Claude Sonnet 4.6", + "display_name": "Claude Sonnet 4.6", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 260000, - "output": 65536 + "context": 1000000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2026-02-03", - "last_updated": "2026-02-03", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-02-17", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "gemma-4-31B-it-fp8", - "name": "Gemma 4 31B IT FP8", - "display_name": "Gemma 4 31B IT FP8", + "id": "gemini-3-flash", + "name": "Gemini 3 Flash", + "display_name": "Gemini 3 Flash", "modalities": { "input": [ "text", - "image" + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -268488,17 +263535,36 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", + "low", + "medium", + "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] + } + }, "attachment": true, - "open_weights": true, + "open_weights": false, "knowledge": "2025-01", - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "release_date": "2025-12-17", + "last_updated": "2025-12-17", "type": "chat" }, { - "id": "Qwen3-Coder-Next-FP8", - "name": "Qwen3 Coder Next FP8", - "display_name": "Qwen3 Coder Next FP8", + "id": "kimi-k2", + "name": "Kimi K2", + "display_name": "Kimi K2", "modalities": { "input": [ "text" @@ -268508,8 +263574,8 @@ ] }, "limit": { - "context": 256144, - "output": 65536 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, @@ -268518,80 +263584,122 @@ }, "attachment": false, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2026-02-03", - "last_updated": "2026-02-03", + "knowledge": "2024-10", + "release_date": "2025-09-05", + "last_updated": "2025-09-05", "type": "chat" }, { - "id": "Qwen3-Embedding-8B", - "name": "Qwen3-Embedding-8B", - "display_name": "Qwen3-Embedding-8B", + "id": "gpt-5.6-sol", + "name": "GPT-5.6 Sol", + "display_name": "GPT-5.6 Sol", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 32768, - "output": 8192 + "context": 1050000, + "output": 128000 }, "temperature": false, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "release_date": "2025-06-05", - "last_updated": "2025-06-05", - "type": "embedding" + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", + "type": "chat" }, { - "id": "Ornith-1.0-35B-FP8", - "name": "Ornith-1.0-35B-FP8", - "display_name": "Ornith-1.0-35B-FP8", + "id": "gpt-5.4-mini", + "name": "GPT-5.4 Mini", + "display_name": "GPT-5.4 Mini", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262000, - "output": 100000 + "context": 400000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } }, "attachment": true, - "open_weights": true, - "release_date": "2026-06-25", - "last_updated": "2026-06-25", + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-03-17", + "last_updated": "2026-03-17", "type": "chat" - } - ] - }, - "pendra": { - "id": "pendra", - "name": "Pendra", - "display_name": "Pendra", - "api": "https://api.pendra.ai/api/v1", - "doc": "https://pendra.ai/docs/integrations/opencode", - "models": [ + }, { - "id": "deepseek-v4-flash", - "name": "DeepSeek V4 Flash", - "display_name": "DeepSeek V4 Flash", + "id": "minimax-m2.7", + "name": "MiniMax-M2.7", + "display_name": "MiniMax-M2.7", "modalities": { "input": [ "text" @@ -268601,8 +263709,8 @@ ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 204800, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -268613,36 +263721,25 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "high", - "max" - ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, "attachment": false, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "knowledge": "2025-01", + "release_date": "2026-03-18", + "last_updated": "2026-03-18", "type": "chat" }, { - "id": "qwen3.6:27b", - "name": "Qwen3.6 27B", - "display_name": "Qwen3.6 27B", + "id": "deepseek-v4.1-flash", + "name": "DeepSeek V4.1 Flash", + "display_name": "DeepSeek V4.1 Flash", "modalities": { "input": [ "text", @@ -268653,8 +263750,8 @@ ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 1000000, + "output": 384000 }, "temperature": true, "tool_call": true, @@ -268662,110 +263759,84 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "low", + "high", + "max" + ] + } + }, "attachment": true, "open_weights": true, - "release_date": "2026-04-22", - "last_updated": "2026-04-22", + "knowledge": "2025-05", + "release_date": "2026-09-10", + "last_updated": "2026-09-10", "type": "chat" }, { - "id": "gpt-oss:120b", - "name": "GPT OSS 120B", - "display_name": "GPT OSS 120B", + "id": "gpt-5.1-codex-mini", + "name": "GPT-5.1 Codex Mini", + "display_name": "GPT-5.1 Codex Mini", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", "effort_options": [ + "none", "low", "medium", "high" - ] + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", - "type": "chat" - }, - { - "id": "qwen3-coder:30b", - "name": "Qwen3-Coder 30B-A3B Instruct", - "display_name": "Qwen3-Coder 30B-A3B Instruct", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 262144, - "output": 65536 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-07-31", - "last_updated": "2025-07-31", - "type": "chat" - }, - { - "id": "llama3.3:70b", - "name": "Llama-3.3-70B-Instruct", - "display_name": "Llama-3.3-70B-Instruct", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 128000, - "output": 4096 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": true, - "knowledge": "2023-12", - "release_date": "2024-12-06", - "last_updated": "2024-12-06", + "attachment": true, + "open_weights": false, + "knowledge": "2024-09-30", + "release_date": "2025-11-13", + "last_updated": "2025-11-13", "type": "chat" }, { - "id": "glm-4.7-flash", - "name": "GLM-4.7-Flash", - "display_name": "GLM-4.7-Flash", + "id": "laguna-s-2.1-free", + "name": "Laguna S 2.1 Free", + "display_name": "Laguna S 2.1 Free", "modalities": { "input": [ "text" @@ -268775,8 +263846,8 @@ ] }, "limit": { - "context": 200000, - "output": 131072 + "context": 256000, + "output": 32000 }, "temperature": true, "tool_call": true, @@ -268786,42 +263857,39 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "effort_options": [ + "low", + "medium", + "high" + ] } }, "attachment": false, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2026-01-19", - "last_updated": "2026-01-19", + "release_date": "2026-07-21", + "last_updated": "2026-07-21", "type": "chat" - } - ] - }, - "opencode": { - "id": "opencode", - "name": "OpenCode", - "display_name": "OpenCode", - "api": "https://opencode.ai/inference/openai/v1", - "doc": "https://opencode.ai/v2/docs/console/models/", - "models": [ + }, { - "id": "glm-5.1", - "name": "GLM-5.1", - "display_name": "GLM-5.1", + "id": "gpt-5.6-luna", + "name": "GPT-5.6 Luna", + "display_name": "GPT-5.6 Luna", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -268830,25 +263898,37 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2026-04-07", - "last_updated": "2026-04-07", + "attachment": true, + "open_weights": false, + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "gpt-5.2", - "name": "GPT-5.2", - "display_name": "GPT-5.2", + "id": "grok-4.6", + "name": "Grok 4.6", + "display_name": "Grok 4.6", "modalities": { "input": [ "text", @@ -268859,52 +263939,43 @@ ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 500000, + "output": 500000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", "effort_options": [ - "none", "low", "medium", "high", "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2025-12-11", - "last_updated": "2025-12-11", + "knowledge": "2026-02-01", + "release_date": "2026-08-12", + "last_updated": "2026-08-12", "type": "chat" }, { - "id": "claude-haiku-5-5", - "name": "Claude Haiku 5.5", - "display_name": "Claude Haiku 5.5", + "id": "gemini-3.5-flash-lite", + "name": "Gemini 3.5 Flash Lite", + "display_name": "Gemini 3.5 Flash Lite", "modalities": { "input": [ "text", "image", + "video", + "audio", "pdf" ], "output": [ @@ -268912,10 +263983,10 @@ ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 1048576, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -268923,26 +263994,26 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ + "minimal", "low", "medium", - "high", - "xhigh", - "max" + "high" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-10-07", - "last_updated": "2026-10-07", + "knowledge": "2026-03", + "release_date": "2026-07-21", + "last_updated": "2026-07-21", "type": "chat" }, { - "id": "glm-5", - "name": "GLM-5", - "display_name": "GLM-5", + "id": "glm-5-free", + "name": "GLM-5 Free", + "display_name": "GLM-5 Free", "modalities": { "input": [ "text" @@ -268980,111 +264051,116 @@ "type": "chat" }, { - "id": "mistral-large-4", - "name": "Mistral Large 4", - "display_name": "Mistral Large 4", + "id": "claude-opus-4-7", + "name": "Claude Opus 4.7", + "display_name": "Claude Opus 4.7", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 524288, - "output": 262144 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "high", "effort_options": [ - "none", - "high" + "low", + "medium", + "high", + "xhigh", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-10-06", - "last_updated": "2026-10-06", + "knowledge": "2026-01-31", + "release_date": "2026-04-16", + "last_updated": "2026-04-16", "type": "chat" }, { - "id": "gpt-5.4-mini", - "name": "GPT-5.4 Mini", - "display_name": "GPT-5.4 Mini", + "id": "grok-4.5", + "name": "Grok 4.5", + "display_name": "Grok 4.5", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 500000, + "output": 500000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ "low", "medium", "high" - ], - "visibility": "hidden" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-17", - "last_updated": "2026-03-17", + "release_date": "2026-07-08", + "last_updated": "2026-07-08", "type": "chat" }, { - "id": "claude-opus-4-7", - "name": "Claude Opus 4.7", - "display_name": "Claude Opus 4.7", + "id": "gpt-5.1-codex", + "name": "GPT-5.1 Codex", + "display_name": "GPT-5.1 Codex", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, + "context": 400000, "output": 128000 }, "temperature": false, @@ -269098,101 +264174,86 @@ "supported": true, "default_enabled": false, "mode": "effort", - "effort": "high", + "effort": "none", "effort_options": [ + "none", "low", "medium", - "high", - "xhigh", - "max" + "high" ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." - ] + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-04-16", - "last_updated": "2026-04-16", + "knowledge": "2024-09-30", + "release_date": "2025-11-13", + "last_updated": "2025-11-13", "type": "chat" }, { - "id": "claude-sonnet-4-5", - "name": "Claude Sonnet 4.5", - "display_name": "Claude Sonnet 4.5", + "id": "kimi-k2-thinking", + "name": "Kimi K2 Thinking", + "display_name": "Kimi K2 Thinking", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 64000 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-07-31", - "release_date": "2025-09-29", - "last_updated": "2025-09-29", + "attachment": false, + "open_weights": true, + "knowledge": "2024-08", + "release_date": "2025-11-06", + "last_updated": "2025-11-06", "type": "chat" }, { - "id": "glm-4.6", - "name": "GLM-4.6", - "display_name": "GLM-4.6", + "id": "minimax-m3-free", + "name": "MiniMax-M3 Free", + "display_name": "MiniMax-M3 Free", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 200000, + "output": 32000 }, "temperature": true, "tool_call": true, @@ -269205,17 +264266,17 @@ "supported": true } }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-09-30", - "last_updated": "2025-09-30", + "knowledge": "2025-01", + "release_date": "2026-06-01", + "last_updated": "2026-06-01", "type": "chat" }, { - "id": "laguna-s-2.1-free", - "name": "Laguna S 2.1 Free", - "display_name": "Laguna S 2.1 Free", + "id": "ring-2.6-1t-free", + "name": "Ring 2.6 1T Free", + "display_name": "Ring 2.6 1T Free", "modalities": { "input": [ "text" @@ -269225,8 +264286,8 @@ ] }, "limit": { - "context": 256000, - "output": 32000 + "context": 262000, + "output": 66000 }, "temperature": true, "tool_call": true, @@ -269237,38 +264298,38 @@ "extra_capabilities": { "reasoning": { "supported": true, - "effort_options": [ - "low", - "medium", - "high" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, "attachment": false, "open_weights": true, - "release_date": "2026-07-21", - "last_updated": "2026-07-21", + "knowledge": "2025-06", + "release_date": "2026-05-08", + "last_updated": "2026-05-08", "type": "chat" }, { - "id": "gpt-5.6-sol", - "name": "GPT-5.6 Sol", - "display_name": "GPT-5.6 Sol", + "id": "big-pickle", + "name": "Big Pickle", + "display_name": "Big Pickle", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 200000, + "output": 32000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -269277,40 +264338,30 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "knowledge": "2025-01", + "release_date": "2025-10-17", + "last_updated": "2025-10-17", "type": "chat" }, { - "id": "deepseek-v4-flash", - "name": "DeepSeek V4 Flash", - "display_name": "DeepSeek V4 Flash", + "id": "claude-fable-5-1", + "name": "Claude Fable 5.1", + "display_name": "Claude Fable 5.1", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" @@ -269318,9 +264369,9 @@ }, "limit": { "context": 1000000, - "output": 384000 + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -269334,46 +264385,49 @@ "effort": "high", "effort_options": [ "low", + "medium", "high", + "xhigh", "max" ], "interleaved": true, "summaries": true, - "visibility": "summary", + "visibility": "omitted", "continuation": [ "thinking_blocks" ], "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." + "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", + "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", + "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-07-31", - "last_updated": "2026-07-31", + "attachment": true, + "open_weights": false, + "knowledge": "2026-06", + "release_date": "2026-09-01", + "last_updated": "2026-09-01", "type": "chat" }, { - "id": "gpt-5.2-codex", - "name": "GPT-5.2 Codex", - "display_name": "GPT-5.2 Codex", + "id": "nemotron-3.5-super-vl-free", + "name": "Nemotron 3.5 Super VL Free", + "display_name": "Nemotron 3.5 Super VL Free", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 1048576, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -269382,50 +264436,43 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ + "none", + "minimal", "low", "medium", "high", "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2025-12-11", - "last_updated": "2025-12-11", + "open_weights": true, + "release_date": "2026-10-15", + "last_updated": "2026-10-15", "type": "chat" }, { - "id": "muse-spark-1.2-contributor-free", - "name": "Muse Spark 1.2 Free", - "display_name": "Muse Spark 1.2 Free", + "id": "nemotron-3.5-lightning-free", + "name": "Nemotron 3.5 Lightning Free", + "display_name": "Nemotron 3.5 Lightning Free", "modalities": { "input": [ - "text", - "image", - "video", - "pdf", - "audio" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, @@ -269435,40 +264482,39 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "minimal", - "low", - "medium", - "high", - "xhigh" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, - "attachment": true, - "open_weights": false, - "release_date": "2026-08-05", - "last_updated": "2026-08-05", + "attachment": false, + "open_weights": true, + "knowledge": "2025-09", + "release_date": "2026-08-11", + "last_updated": "2026-08-11", "type": "chat" }, { - "id": "gpt-5.5-pro", - "name": "GPT-5.5 Pro", - "display_name": "GPT-5.5 Pro", + "id": "glm-5.3", + "name": "GLM-5.3", + "display_name": "GLM-5.3", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1000000, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -269477,34 +264523,41 @@ "extra_capabilities": { "reasoning": { "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ - "medium", + "low", "high", - "xhigh" + "max" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-12-01", - "release_date": "2026-04-23", - "last_updated": "2026-04-23", + "attachment": false, + "open_weights": true, + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "cat-jam-free", - "name": "Cat Jam Free", - "display_name": "Cat Jam Free", + "id": "x-preview-f-free", + "name": "Ox Alpha Free (Unlimited)", + "display_name": "Ox Alpha Free (Unlimited)", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1048576, + "context": 1000000, "output": 131072 }, "temperature": true, @@ -269524,35 +264577,34 @@ ], "effort_options": [ "low", - "medium", "high", - "xhigh", "max" ] } }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-10-12", - "last_updated": "2026-10-12", + "release_date": "2026-08-21", + "last_updated": "2026-08-21", "type": "chat" }, { - "id": "grok-4.5", - "name": "Grok 4.5", - "display_name": "Grok 4.5", + "id": "qwen3.5-plus", + "name": "Qwen3.5 Plus", + "display_name": "Qwen3.5 Plus", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 500000, - "output": 500000 + "context": 262144, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -269563,37 +264615,40 @@ "extra_capabilities": { "reasoning": { "supported": true, - "effort_options": [ - "low", - "medium", - "high" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-07-08", - "last_updated": "2026-07-08", + "knowledge": "2025-04", + "release_date": "2026-02-16", + "last_updated": "2026-02-16", "type": "chat" }, { - "id": "space-bunny-free", - "name": "Space Bunny Free", - "display_name": "Space Bunny Free", + "id": "gpt-5.3-codex", + "name": "GPT-5.3 Codex", + "display_name": "GPT-5.3 Codex", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 524288 + "context": 400000, + "output": 128000 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -269602,31 +264657,35 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ "low", "medium", "high", - "xhigh", - "max" - ] + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "release_date": "2026-09-23", - "last_updated": "2026-09-23", + "knowledge": "2025-08-31", + "release_date": "2026-02-05", + "last_updated": "2026-02-05", "type": "chat" }, { - "id": "gpt-5-nano", - "name": "GPT-5 Nano", - "display_name": "GPT-5 Nano", + "id": "longcat-2.5-preview-free", + "name": "LongCat 2.5 Preview Free", + "display_name": "LongCat 2.5 Preview Free", "modalities": { "input": [ "text", @@ -269637,8 +264696,8 @@ ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 1000000, + "output": 131072 }, "temperature": false, "tool_call": true, @@ -269649,71 +264708,75 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "minimal", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2024-05-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "release_date": "2026-09-25", + "last_updated": "2026-09-25", "type": "chat" }, { - "id": "minimax-m3-free", - "name": "MiniMax-M3 Free", - "display_name": "MiniMax-M3 Free", + "id": "gpt-5.1", + "name": "GPT-5.1", + "display_name": "GPT-5.1", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 32000 + "context": 400000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-06-01", - "last_updated": "2026-06-01", + "open_weights": false, + "knowledge": "2024-09-30", + "release_date": "2025-11-13", + "last_updated": "2025-11-13", "type": "chat" }, { - "id": "minimax-m2.5", - "name": "MiniMax-M2.5", - "display_name": "MiniMax-M2.5", + "id": "mimo-v2-flash-free", + "name": "MiMo V2 Flash Free", + "display_name": "MiMo V2 Flash Free", "modalities": { "input": [ "text" @@ -269723,8 +264786,8 @@ ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 262144, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -269745,29 +264808,27 @@ }, "attachment": false, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-02-12", - "last_updated": "2026-02-12", + "knowledge": "2024-12-01", + "release_date": "2025-12-16", + "last_updated": "2026-02-04", "type": "chat" }, { - "id": "mimo-v2.5-free", - "name": "MiMo V2.5 Free", - "display_name": "MiMo V2.5 Free", + "id": "qwen3.8-max", + "name": "Qwen3.8 Max", + "display_name": "Qwen3.8 Max", "modalities": { "input": [ "text", - "image", - "audio", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 32000 + "context": 262144, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -269778,31 +264839,27 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "low", + "medium", + "xhigh" ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2024-12", - "release_date": "2026-04-22", - "last_updated": "2026-04-22", + "open_weights": false, + "release_date": "2026-08-03", + "last_updated": "2026-08-03", "type": "chat" }, { - "id": "gemini-3-pro", - "name": "Gemini 3 Pro", - "display_name": "Gemini 3 Pro", + "id": "gpt-6-luna", + "name": "GPT-6 Luna", + "display_name": "GPT-6 Luna", "modalities": { "input": [ "text", "image", - "video", - "audio", "pdf" ], "output": [ @@ -269810,10 +264867,10 @@ ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -269821,26 +264878,21 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ + "effort_options": [ + "none", "low", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" + "medium", + "high", + "xhigh", + "max" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-11-18", - "last_updated": "2025-11-18", + "knowledge": "2026-05-18", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { @@ -269888,9 +264940,9 @@ "type": "chat" }, { - "id": "claude-haiku-4-5", - "name": "Claude Haiku 4.5", - "display_name": "Claude Haiku 4.5", + "id": "claude-opus-5-5", + "name": "Claude Opus 5.5", + "display_name": "Claude Opus 5.5", "modalities": { "input": [ "text", @@ -269902,7 +264954,49 @@ ] }, "limit": { - "context": 200000, + "context": 1000000, + "output": 128000 + }, + "temperature": false, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2026-06", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", + "type": "chat" + }, + { + "id": "claude-sonnet-4", + "name": "Claude Sonnet 4", + "display_name": "Claude Sonnet 4", + "modalities": { + "input": [ + "text", + "image", + "pdf" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1000000, "output": 64000 }, "temperature": true, @@ -269934,122 +265028,128 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2025-02-28", - "release_date": "2025-10-15", - "last_updated": "2025-10-15", + "knowledge": "2025-03-31", + "release_date": "2025-05-22", + "last_updated": "2025-05-22", "type": "chat" }, { - "id": "gpt-5.4-nano", - "name": "GPT-5.4 Nano", - "display_name": "GPT-5.4 Nano", + "id": "muse-spark-1.2-contributor-free", + "name": "Muse Spark 1.2 Free", + "display_name": "Muse Spark 1.2 Free", "modalities": { "input": [ "text", "image", - "pdf" + "video", + "pdf", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 1048576, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", "effort_options": [ - "none", + "minimal", "low", "medium", "high", "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-17", - "last_updated": "2026-03-17", + "release_date": "2026-08-05", + "last_updated": "2026-08-05", "type": "chat" }, { - "id": "kimi-k2.7-code", - "name": "Kimi K2.7 Code", - "display_name": "Kimi K2.7 Code", + "id": "claude-opus-4-6", + "name": "Claude Opus 4.6", + "display_name": "Claude Opus 4.6", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1000000, + "output": 128000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "max" + ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-06-12", - "last_updated": "2026-06-12", + "open_weights": false, + "knowledge": "2025-05-31", + "release_date": "2026-02-05", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "claude-sonnet-5-5", - "name": "Claude Sonnet 5.5", - "display_name": "Claude Sonnet 5.5", + "id": "gpt-5-codex", + "name": "GPT-5 Codex", + "display_name": "GPT-5 Codex", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, + "context": 400000, "output": 128000 }, "temperature": false, @@ -270060,26 +265160,36 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ + "minimal", "low", "medium", - "high", - "xhigh", - "max" - ] + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-09-28", - "last_updated": "2026-09-28", + "knowledge": "2024-09-30", + "release_date": "2025-09-15", + "last_updated": "2025-09-15", "type": "chat" }, { - "id": "ling-3.0-flash-fin-free", - "name": "Ling 3.0 Flash Fin Free", - "display_name": "Ling 3.0 Flash Fin Free", + "id": "grok-code", + "name": "Grok Code Fast 1", + "display_name": "Grok Code Fast 1", "modalities": { "input": [ "text" @@ -270089,8 +265199,8 @@ ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 256000, + "output": 256000 }, "temperature": true, "tool_call": true, @@ -270099,15 +265209,15 @@ "default": true }, "attachment": false, - "open_weights": true, - "release_date": "2026-08-27", - "last_updated": "2026-09-03", + "open_weights": false, + "release_date": "2025-09-02", + "last_updated": "2025-09-02", "type": "chat" }, { - "id": "gpt-5.6-luna", - "name": "GPT-5.6 Luna", - "display_name": "GPT-5.6 Luna", + "id": "claude-opus-4-8", + "name": "Claude Opus 4.8", + "display_name": "Claude Opus 4.8", "modalities": { "input": [ "text", @@ -270119,53 +265229,55 @@ ] }, "limit": { - "context": 1050000, + "context": 1000000, "output": 128000 }, "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, + "default_enabled": false, "mode": "effort", - "effort": "medium", + "effort": "high", "effort_options": [ - "none", "low", "medium", "high", "xhigh", "max" ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" ], - "visibility": "hidden" + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "knowledge": "2026-01", + "release_date": "2026-05-28", + "last_updated": "2026-05-28", "type": "chat" }, { - "id": "qwen3.8-max", - "name": "Qwen3.8 Max", - "display_name": "Qwen3.8 Max", + "id": "ling-3.0-flash-free", + "name": "Ling-3.0-flash Free", + "display_name": "Ling-3.0-flash Free", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" @@ -270173,7 +265285,7 @@ }, "limit": { "context": 262144, - "output": 131072 + "output": 32768 }, "temperature": true, "tool_call": true, @@ -270183,31 +265295,26 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ "low", "medium", - "xhigh" + "high" ] } }, - "attachment": true, - "open_weights": false, - "release_date": "2026-08-03", - "last_updated": "2026-08-03", + "attachment": false, + "open_weights": true, + "release_date": "2026-07-23", + "last_updated": "2026-07-23", "type": "chat" }, { - "id": "gemini-4-argon", - "name": "Gemini 4 Argon", - "display_name": "Gemini 4 Argon", + "id": "mimo-v2-pro-free", + "name": "MiMo V2 Pro Free", + "display_name": "MiMo V2 Pro Free", "modalities": { "input": [ - "text", - "image", - "video", - "audio", - "pdf" + "text" ], "output": [ "text" @@ -270215,9 +265322,9 @@ }, "limit": { "context": 1048576, - "output": 65536 + "output": 64000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -270225,37 +265332,41 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "low", - "medium", - "high" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-10-13", - "last_updated": "2026-10-13", + "knowledge": "2024-12", + "release_date": "2026-03-18", + "last_updated": "2026-03-18", "type": "chat" }, { - "id": "deepseek-v4-pro", - "name": "DeepSeek V4 Pro", - "display_name": "DeepSeek V4 Pro", + "id": "kimi-k2.7-code", + "name": "Kimi K2.7 Code", + "display_name": "Kimi K2.7 Code", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 262144, + "output": 262144 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -270264,87 +265375,98 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "high", - "max" - ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "knowledge": "2025-01", + "release_date": "2026-06-12", + "last_updated": "2026-06-12", "type": "chat" }, { - "id": "gpt-5.1-codex-max", - "name": "GPT-5.1 Codex Max", - "display_name": "GPT-5.1 Codex Max", + "id": "deepseek-v4-flash-free", + "name": "DeepSeek V4 Flash Free", + "display_name": "DeepSeek V4 Flash Free", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, + "context": 200000, "output": 128000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ], - "verbosity": "medium", - "verbosity_options": [ + "effort_options": [ "low", - "medium", - "high" - ], - "visibility": "hidden" + "high", + "max" + ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-11-13", - "last_updated": "2025-11-13", + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-07-31", + "last_updated": "2026-07-31", "type": "chat" }, { - "id": "claude-fable-5-1", - "name": "Claude Fable 5.1", - "display_name": "Claude Fable 5.1", + "id": "ling-3.0-flash-fin-free", + "name": "Ling 3.0 Flash Fin Free", + "display_name": "Ling 3.0 Flash Fin Free", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 262144, + "output": 32768 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "attachment": false, + "open_weights": true, + "release_date": "2026-08-27", + "last_updated": "2026-09-03", + "type": "chat" + }, + { + "id": "claude-opus-5", + "name": "Claude Opus 5", + "display_name": "Claude Opus 5", "modalities": { "input": [ "text", @@ -270368,40 +265490,54 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", "effort_options": [ "low", "medium", "high", "xhigh", "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", - "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", - "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-09-01", - "last_updated": "2026-09-01", + "knowledge": "2026-05", + "release_date": "2026-07-24", + "last_updated": "2026-07-24", "type": "chat" }, { - "id": "claude-sonnet-5", - "name": "Claude Sonnet 5", - "display_name": "Claude Sonnet 5", + "id": "ling-3.0-tiny-free", + "name": "Ling-3.0-tiny Free", + "display_name": "Ling-3.0-tiny Free", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 262144, + "output": 32768 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "attachment": false, + "open_weights": false, + "release_date": "2026-08-06", + "last_updated": "2026-08-06", + "type": "chat" + }, + { + "id": "gpt-6-sol", + "name": "GPT-6 Sol", + "display_name": "GPT-6 Sol", "modalities": { "input": [ "text", @@ -270413,7 +265549,7 @@ ] }, "limit": { - "context": 1000000, + "context": 1050000, "output": 128000 }, "temperature": false, @@ -270424,8 +265560,8 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ + "none", "low", "medium", "high", @@ -270436,15 +265572,15 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-30", - "last_updated": "2026-06-30", + "knowledge": "2026-04-20", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "kimi-k2-thinking", - "name": "Kimi K2 Thinking", - "display_name": "Kimi K2 Thinking", + "id": "cat-jam-free", + "name": "Cat Jam Free", + "display_name": "Cat Jam Free", "modalities": { "input": [ "text" @@ -270454,8 +265590,8 @@ ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1048576, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -270471,20 +265607,26 @@ "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" ] } }, "attachment": false, - "open_weights": true, - "knowledge": "2024-08", - "release_date": "2025-11-06", - "last_updated": "2025-11-06", + "open_weights": false, + "release_date": "2026-10-12", + "last_updated": "2026-10-12", "type": "chat" }, { - "id": "gpt-5.3-codex-spark", - "name": "GPT-5.3 Codex Spark", - "display_name": "GPT-5.3 Codex Spark", + "id": "ling-2.6-flash-free", + "name": "Ling 2.6 Flash Free", + "display_name": "Ling 2.6 Flash Free", "modalities": { "input": [ "text" @@ -270494,47 +265636,25 @@ ] }, "limit": { - "context": 128000, - "output": 128000 + "context": 262100, + "output": 32800 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, "attachment": false, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-05", - "last_updated": "2026-02-05", + "open_weights": true, + "knowledge": "2025-06", + "release_date": "2026-04-21", + "last_updated": "2026-04-21", "type": "chat" }, { - "id": "deepseek-v4-flash-vision-exp", - "name": "DeepSeek V4 Flash Vision Exp", - "display_name": "DeepSeek V4 Flash Vision Exp", + "id": "mistral-large-4", + "name": "Mistral Large 4", + "display_name": "Mistral Large 4", "modalities": { "input": [ "text", @@ -270545,8 +265665,8 @@ ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 524288, + "output": 262144 }, "temperature": true, "tool_call": true, @@ -270556,36 +265676,22 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", "effort_options": [ - "low", - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." + "none", + "high" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-08-21", - "last_updated": "2026-09-01", + "open_weights": false, + "release_date": "2026-10-06", + "last_updated": "2026-10-06", "type": "chat" }, { - "id": "minimax-m2.1", - "name": "MiniMax-M2.1", - "display_name": "MiniMax-M2.1", + "id": "minimax-m2.1-free", + "name": "MiniMax-M2.1 Free", + "display_name": "MiniMax-M2.1 Free", "modalities": { "input": [ "text" @@ -270606,13 +265712,7 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, "attachment": false, @@ -270623,15 +265723,13 @@ "type": "chat" }, { - "id": "gemini-3.5-flash", - "name": "Gemini 3.5 Flash", - "display_name": "Gemini 3.5 Flash", + "id": "claude-opus-4-5", + "name": "Claude Opus 4.5", + "display_name": "Claude Opus 4.5", "modalities": { "input": [ "text", "image", - "video", - "audio", "pdf" ], "output": [ @@ -270639,58 +265737,68 @@ ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", + "effort_options": [ "low", "medium", "high" ], + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-05-19", - "last_updated": "2026-05-19", + "knowledge": "2025-05", + "release_date": "2025-11-24", + "last_updated": "2025-11-24", "type": "chat" }, { - "id": "big-pickle", - "name": "Big Pickle", - "display_name": "Big Pickle", + "id": "gpt-5.4-pro", + "name": "GPT-5.4 Pro", + "display_name": "GPT-5.4 Pro", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 32000 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -270699,58 +265807,64 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-10-17", - "last_updated": "2025-10-17", + "knowledge": "2025-08-31", + "release_date": "2026-03-05", + "last_updated": "2026-03-05", "type": "chat" }, { - "id": "gpt-5.6-terra", - "name": "GPT-5.6 Terra", - "display_name": "GPT-5.6 Terra", + "id": "gpt-5.1-codex-max", + "name": "GPT-5.1 Codex Max", + "display_name": "GPT-5.1 Codex Max", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1050000, + "context": 400000, "output": 128000 }, "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, + "default_enabled": false, "mode": "effort", - "effort": "medium", + "effort": "none", "effort_options": [ "none", "low", "medium", - "high", - "xhigh", - "max" + "high" ], "verbosity": "medium", "verbosity_options": [ @@ -270763,20 +265877,19 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "knowledge": "2024-09-30", + "release_date": "2025-11-13", + "last_updated": "2025-11-13", "type": "chat" }, { - "id": "mimo-v2-omni-free", - "name": "MiMo V2 Omni Free", - "display_name": "MiMo V2 Omni Free", + "id": "claude-haiku-5-5", + "name": "Claude Haiku 5.5", + "display_name": "Claude Haiku 5.5", "modalities": { "input": [ "text", "image", - "audio", "pdf" ], "output": [ @@ -270784,10 +265897,10 @@ ] }, "limit": { - "context": 262144, - "output": 64000 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -270795,26 +265908,77 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2024-12", - "release_date": "2026-03-18", - "last_updated": "2026-03-18", + "knowledge": "2026-06", + "release_date": "2026-10-07", + "last_updated": "2026-10-07", "type": "chat" }, { - "id": "kimi-k2", - "name": "Kimi K2", - "display_name": "Kimi K2", + "id": "gpt-5", + "name": "GPT-5", + "display_name": "GPT-5", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 400000, + "output": 128000 + }, + "temperature": false, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "minimal", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2024-09-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", + "type": "chat" + }, + { + "id": "qwen3-coder", + "name": "Qwen3 Coder", + "display_name": "Qwen3 Coder", "modalities": { "input": [ "text" @@ -270825,7 +265989,7 @@ }, "limit": { "context": 262144, - "output": 262144 + "output": 65536 }, "temperature": true, "tool_call": true, @@ -270834,28 +265998,26 @@ }, "attachment": false, "open_weights": true, - "knowledge": "2024-10", - "release_date": "2025-09-05", - "last_updated": "2025-09-05", + "knowledge": "2025-04", + "release_date": "2025-07-22", + "last_updated": "2025-07-22", "type": "chat" - }, - { - "id": "grok-4.7", - "name": "Grok 4.7", - "display_name": "Grok 4.7", + }, + { + "id": "glm-4.7-free", + "name": "GLM-4.7 Free", + "display_name": "GLM-4.7 Free", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 500000, - "output": 500000 + "context": 204800, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -270865,25 +266027,26 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "xhigh" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-05", - "release_date": "2026-09-21", - "last_updated": "2026-09-21", + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-12-22", + "last_updated": "2025-12-22", "type": "chat" }, { - "id": "ll-alpha-free", - "name": "LL Alpha Free", - "display_name": "LL Alpha Free", + "id": "glm-4.6", + "name": "GLM-4.6", + "display_name": "GLM-4.6", "modalities": { "input": [ "text" @@ -270893,8 +266056,8 @@ ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 204800, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -270904,48 +266067,35 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ] + "supported": true } }, "attachment": false, "open_weights": true, - "knowledge": "2026-06", - "release_date": "2026-10-15", - "last_updated": "2026-10-15", + "knowledge": "2025-04", + "release_date": "2025-09-30", + "last_updated": "2025-09-30", "type": "chat" }, { - "id": "claude-opus-5-5", - "name": "Claude Opus 5.5", - "display_name": "Claude Opus 5.5", + "id": "kimi-k2.6", + "name": "Kimi K2.6", + "display_name": "Kimi K2.6", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 262144, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -270953,38 +266103,39 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-04-20", + "last_updated": "2026-04-20", "type": "chat" }, { - "id": "exo-free", - "name": "Exo Free", - "display_name": "Exo Free", + "id": "gpt-6.1-sol", + "name": "GPT-6.1 Sol", + "display_name": "GPT-6.1 Sol", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 1050000, + "output": 128000 }, "temperature": false, "tool_call": true, @@ -270995,33 +266146,37 @@ "extra_capabilities": { "reasoning": { "effort_options": [ - "high" + "low", + "medium", + "high", + "xhigh", + "max" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-10-06", - "last_updated": "2026-10-06", + "knowledge": "2026-04-30", + "release_date": "2026-09-29", + "last_updated": "2026-09-29", "type": "chat" }, { - "id": "qwen3.5-plus", - "name": "Qwen3.5 Plus", - "display_name": "Qwen3.5 Plus", + "id": "deepseek-v4-flash-vision-exp", + "name": "DeepSeek V4 Flash Vision Exp", + "display_name": "DeepSeek V4 Flash Vision Exp", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 1000000, + "output": 384000 }, "temperature": true, "tool_call": true, @@ -271032,77 +266187,76 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "high", + "max" + ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "notes": [ + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-04", - "release_date": "2026-02-16", - "last_updated": "2026-02-16", + "open_weights": true, + "release_date": "2026-08-21", + "last_updated": "2026-09-01", "type": "chat" }, { - "id": "claude-sonnet-4", - "name": "Claude Sonnet 4", - "display_name": "Claude Sonnet 4", + "id": "minimax-m3", + "name": "MiniMax-M3", + "display_name": "MiniMax-M3", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 64000 + "context": 512000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-03-31", - "release_date": "2025-05-22", - "last_updated": "2025-05-22", + "open_weights": true, + "release_date": "2026-06-01", + "last_updated": "2026-06-01", "type": "chat" }, { - "id": "muse-spark-1.3-contributor-free", - "name": "Muse Spark 1.3 Free", - "display_name": "Muse Spark 1.3 Free", + "id": "muse-wonder-1.0", + "name": "Muse Wonder", + "display_name": "Muse Wonder", "modalities": { "input": [ "text", @@ -271132,35 +266286,34 @@ "low", "medium", "high", - "xhigh" + "xhigh", + "max" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-09-02", - "last_updated": "2026-09-02", + "release_date": "2026-10-12", + "last_updated": "2026-10-12", "type": "chat" }, { - "id": "gpt-6-sol", - "name": "GPT-6 Sol", - "display_name": "GPT-6 Sol", + "id": "ll-alpha-free", + "name": "LL Alpha Free", + "display_name": "LL Alpha Free", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 262144, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -271168,8 +266321,14 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ - "none", "low", "medium", "high", @@ -271178,28 +266337,30 @@ ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-04-20", - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "attachment": false, + "open_weights": true, + "knowledge": "2026-06", + "release_date": "2026-10-15", + "last_updated": "2026-10-15", "type": "chat" }, { - "id": "flint-40b-free", - "name": "Flint 40B Free", - "display_name": "Flint 40B Free", + "id": "minimax-m3.1-flash-free", + "name": "MiniMax M3.1 Flash Free", + "display_name": "MiniMax M3.1 Flash Free", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 1000000, + "output": 512000 }, "temperature": true, "tool_call": true, @@ -271225,17 +266386,16 @@ ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2026-06", - "release_date": "2026-10-21", - "last_updated": "2026-10-21", + "attachment": true, + "open_weights": false, + "release_date": "2026-10-19", + "last_updated": "2026-10-19", "type": "chat" }, { - "id": "hy3-free", - "name": "Hy3 Free", - "display_name": "Hy3 Free", + "id": "minimax-m2.5", + "name": "MiniMax-M2.5", + "display_name": "MiniMax-M2.5", "modalities": { "input": [ "text" @@ -271245,8 +266405,8 @@ ] }, "limit": { - "context": 190000, - "output": 64000 + "context": 204800, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -271262,39 +266422,34 @@ "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "effort_options": [ - "low", - "medium", - "high" ] } }, "attachment": false, "open_weights": true, - "release_date": "2026-07-06", - "last_updated": "2026-07-06", + "knowledge": "2025-01", + "release_date": "2026-02-12", + "last_updated": "2026-02-12", "type": "chat" }, { - "id": "gpt-5.3-codex", - "name": "GPT-5.3 Codex", - "display_name": "GPT-5.3 Codex", + "id": "exo-free", + "name": "Exo Free", + "display_name": "Exo Free", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 1048576, + "output": 131072 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -271302,49 +266457,36 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", "high" - ], - "visibility": "hidden" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-05", - "last_updated": "2026-02-05", + "release_date": "2026-10-06", + "last_updated": "2026-10-06", "type": "chat" }, { - "id": "nemotron-3-super-free", - "name": "Nemotron 3 Super Free", - "display_name": "Nemotron 3 Super Free", + "id": "gpt-5.2-codex", + "name": "GPT-5.2 Codex", + "display_name": "GPT-5.2 Codex", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 204800, + "context": 400000, "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -271353,53 +266495,35 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-06", - "release_date": "2026-03-11", - "last_updated": "2026-03-11", - "type": "chat" - }, - { - "id": "grok-code", - "name": "Grok Code Fast 1", - "display_name": "Grok Code Fast 1", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 256000, - "output": 256000 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2025-09-02", - "last_updated": "2025-09-02", + "knowledge": "2025-08-31", + "release_date": "2025-12-11", + "last_updated": "2025-12-11", "type": "chat" }, { - "id": "qwen3.6-plus", - "name": "Qwen3.6 Plus", - "display_name": "Qwen3.6 Plus", + "id": "qwen3.6-plus-free", + "name": "Qwen3.6 Plus Free", + "display_name": "Qwen3.6 Plus Free", "modalities": { "input": [ "text", @@ -271439,23 +266563,22 @@ "type": "chat" }, { - "id": "longcat-2.5-preview-free", - "name": "LongCat 2.5 Preview Free", - "display_name": "LongCat 2.5 Preview Free", + "id": "nemotron-3-super-free", + "name": "Nemotron 3 Super Free", + "display_name": "Nemotron 3 Super Free", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 204800, + "output": 128000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -271472,73 +266595,82 @@ ] } }, - "attachment": true, - "open_weights": false, - "release_date": "2026-09-25", - "last_updated": "2026-09-25", + "attachment": false, + "open_weights": true, + "knowledge": "2025-06", + "release_date": "2026-03-11", + "last_updated": "2026-03-11", "type": "chat" }, { - "id": "gemini-3.5-flash-lite", - "name": "Gemini 3.5 Flash Lite", - "display_name": "Gemini 3.5 Flash Lite", + "id": "gpt-5.2", + "name": "GPT-5.2", + "display_name": "GPT-5.2", "modalities": { "input": [ "text", - "image", - "video", - "audio", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 400000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", "effort_options": [ - "minimal", + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ "low", "medium", "high" - ] + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-07-21", - "last_updated": "2026-07-21", + "knowledge": "2025-08-31", + "release_date": "2025-12-11", + "last_updated": "2025-12-11", "type": "chat" }, { - "id": "kimi-k2.5-free", - "name": "Kimi K2.5 Free", - "display_name": "Kimi K2.5 Free", + "id": "claude-sonnet-5-5", + "name": "Claude Sonnet 5.5", + "display_name": "Claude Sonnet 5.5", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1000000, + "output": 128000 }, "temperature": false, "tool_call": true, @@ -271548,26 +266680,26 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-01-27", - "last_updated": "2026-01-27", + "open_weights": false, + "knowledge": "2026-06", + "release_date": "2026-09-28", + "last_updated": "2026-09-28", "type": "chat" }, { - "id": "ling-3.0-tiny-free", - "name": "Ling-3.0-tiny Free", - "display_name": "Ling-3.0-tiny Free", + "id": "trinity-large-preview-free", + "name": "Trinity Large Preview", + "display_name": "Trinity Large Preview", "modalities": { "input": [ "text" @@ -271577,72 +266709,84 @@ ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 131072, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2026-08-06", - "last_updated": "2026-08-06", + "open_weights": true, + "knowledge": "2025-06", + "release_date": "2026-01-27", + "last_updated": "2026-05-28", "type": "chat" }, { - "id": "glm-5.3", - "name": "GLM-5.3", - "display_name": "GLM-5.3", + "id": "claude-opus-4-1", + "name": "Claude Opus 4.1", + "display_name": "Claude Opus 4.1", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 200000, + "output": 32000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" ], - "effort_options": [ - "low", - "high", - "max" + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "attachment": true, + "open_weights": false, + "knowledge": "2025-03-31", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "beam-free", - "name": "Beam Free", - "display_name": "Beam Free", + "id": "muse-spark-1.3", + "name": "Muse Spark 1.3", + "display_name": "Muse Spark 1.3", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "pdf", + "audio" ], "output": [ "text" @@ -271661,43 +266805,39 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ + "minimal", "low", "medium", "high", - "xhigh", - "max" + "xhigh" ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2026-06-30", - "release_date": "2026-10-05", - "last_updated": "2026-10-16", + "attachment": true, + "open_weights": false, + "release_date": "2026-09-02", + "last_updated": "2026-09-02", "type": "chat" }, { - "id": "mimo-v2-flash-free", - "name": "MiMo V2 Flash Free", - "display_name": "MiMo V2 Flash Free", + "id": "mimo-v2.5-free", + "name": "MiMo V2.5 Free", + "display_name": "MiMo V2.5 Free", "modalities": { "input": [ - "text" + "text", + "image", + "audio", + "video" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 200000, + "output": 32000 }, "temperature": true, "tool_call": true, @@ -271716,30 +266856,32 @@ ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2024-12-01", - "release_date": "2025-12-16", - "last_updated": "2026-02-04", + "knowledge": "2024-12", + "release_date": "2026-04-22", + "last_updated": "2026-04-22", "type": "chat" }, { - "id": "minimax-m2.5-free", - "name": "MiniMax-M2.5 Free", - "display_name": "MiniMax-M2.5 Free", + "id": "kimi-k2.5-free", + "name": "Kimi K2.5 Free", + "display_name": "Kimi K2.5 Free", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 262144, + "output": 262144 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -271747,48 +266889,26 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, - "attachment": false, + "attachment": true, "open_weights": true, "knowledge": "2025-01", - "release_date": "2026-02-12", - "last_updated": "2026-02-12", - "type": "chat" - }, - { - "id": "trinity-large-preview-free", - "name": "Trinity Large Preview", - "display_name": "Trinity Large Preview", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 131072, - "output": 131072 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-06", "release_date": "2026-01-27", - "last_updated": "2026-05-28", + "last_updated": "2026-01-27", "type": "chat" }, { - "id": "gpt-6.1-sol", - "name": "GPT-6.1 Sol", - "display_name": "GPT-6.1 Sol", + "id": "claude-sonnet-5", + "name": "Claude Sonnet 5", + "display_name": "Claude Sonnet 5", "modalities": { "input": [ "text", @@ -271800,7 +266920,7 @@ ] }, "limit": { - "context": 1050000, + "context": 1000000, "output": 128000 }, "temperature": false, @@ -271811,6 +266931,7 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ "low", "medium", @@ -271822,15 +266943,15 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2026-04-30", - "release_date": "2026-09-29", - "last_updated": "2026-09-29", + "knowledge": "2026-01-31", + "release_date": "2026-06-30", + "last_updated": "2026-06-30", "type": "chat" }, { - "id": "nemotron-3.5-lightning-free", - "name": "Nemotron 3.5 Lightning Free", - "display_name": "Nemotron 3.5 Lightning Free", + "id": "deepseek-v4-pro", + "name": "DeepSeek V4 Pro", + "display_name": "DeepSeek V4 Pro", "modalities": { "input": [ "text" @@ -271840,8 +266961,8 @@ ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1000000, + "output": 384000 }, "temperature": true, "tool_call": true, @@ -271852,25 +266973,36 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "high", + "max" + ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "notes": [ + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, "attachment": false, "open_weights": true, - "knowledge": "2025-09", - "release_date": "2026-08-11", - "last_updated": "2026-08-11", + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "claude-opus-4-5", - "name": "Claude Opus 4.5", - "display_name": "Claude Opus 4.5", + "id": "claude-3-5-haiku", + "name": "Claude Haiku 3.5", + "display_name": "Claude Haiku 3.5", "modalities": { "input": [ "text", @@ -271883,113 +267015,90 @@ }, "limit": { "context": 200000, - "output": 64000 + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." - ] - } + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2025-05", - "release_date": "2025-11-24", - "last_updated": "2025-11-24", + "knowledge": "2024-07-31", + "release_date": "2024-10-22", + "last_updated": "2024-10-22", "type": "chat" }, { - "id": "x-preview-f-free", - "name": "Ox Alpha Free (Unlimited)", - "display_name": "Ox Alpha Free (Unlimited)", + "id": "gpt-5.4-nano", + "name": "GPT-5.4 Nano", + "display_name": "GPT-5.4 Nano", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 400000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], + "default_enabled": false, + "mode": "effort", + "effort": "none", "effort_options": [ + "none", "low", + "medium", "high", - "max" - ] + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "release_date": "2026-08-21", - "last_updated": "2026-08-21", + "knowledge": "2025-08-31", + "release_date": "2026-03-17", + "last_updated": "2026-03-17", "type": "chat" }, { - "id": "muse-spark-1.3", - "name": "Muse Spark 1.3", - "display_name": "Muse Spark 1.3", + "id": "glm-5.3-flash-free", + "name": "GLM-5.3-Flash Free", + "display_name": "GLM-5.3-Flash Free", "modalities": { "input": [ "text", "image", - "video", - "pdf", - "audio" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 200000, + "output": 32000 }, "temperature": true, "tool_call": true, @@ -272000,53 +267109,54 @@ "extra_capabilities": { "reasoning": { "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ - "minimal", "low", - "medium", "high", - "xhigh" + "max" ] } }, "attachment": true, - "open_weights": false, - "release_date": "2026-09-02", - "last_updated": "2026-09-02", + "open_weights": true, + "release_date": "2026-08-26", + "last_updated": "2026-08-26", "type": "chat" }, { - "id": "gpt-5.4", - "name": "GPT-5.4", - "display_name": "GPT-5.4", + "id": "gpt-5.3-codex-spark", + "name": "GPT-5.3 Codex Spark", + "display_name": "GPT-5.3 Codex Spark", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, + "context": 128000, "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, + "default_enabled": true, "mode": "effort", - "effort": "none", + "effort": "medium", "effort_options": [ - "none", "low", "medium", "high", @@ -272061,11 +267171,39 @@ "visibility": "hidden" } }, - "attachment": true, + "attachment": false, "open_weights": false, "knowledge": "2025-08-31", - "release_date": "2026-03-05", - "last_updated": "2026-03-05", + "release_date": "2026-02-05", + "last_updated": "2026-02-05", + "type": "chat" + }, + { + "id": "ling-3.1-flash-free", + "name": "Ling 3.1 Flash Free", + "display_name": "Ling 3.1 Flash Free", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 262144, + "output": 32768 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "attachment": false, + "open_weights": true, + "release_date": "2026-09-29", + "last_updated": "2026-09-29", "type": "chat" }, { @@ -272109,16 +267247,43 @@ "type": "chat" }, { - "id": "muse-wonder-1.0", - "name": "Muse Wonder", - "display_name": "Muse Wonder", + "id": "hy3-preview-free", + "name": "Hy3 preview Free", + "display_name": "Hy3 preview Free", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 256000, + "output": 64000 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "attachment": false, + "open_weights": true, + "knowledge": "2025-06", + "release_date": "2026-04-20", + "last_updated": "2026-04-20", + "type": "chat" + }, + { + "id": "space-bunny-free", + "name": "Space Bunny Free", + "display_name": "Space Bunny Free", "modalities": { "input": [ "text", "image", - "video", - "pdf", - "audio" + "video" ], "output": [ "text" @@ -272126,9 +267291,8 @@ }, "limit": { "context": 1048576, - "output": 131072 + "output": 524288 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -272136,8 +267300,14 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ - "minimal", "low", "medium", "high", @@ -272148,26 +267318,29 @@ }, "attachment": true, "open_weights": false, - "release_date": "2026-10-12", - "last_updated": "2026-10-12", + "release_date": "2026-09-23", + "last_updated": "2026-09-23", "type": "chat" }, { - "id": "gpt-5-codex", - "name": "GPT-5 Codex", - "display_name": "GPT-5 Codex", + "id": "gemini-4-argon", + "name": "Gemini 4 Argon", + "display_name": "Gemini 4 Argon", "modalities": { "input": [ "text", - "image" + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 1048576, + "output": 65536 }, "temperature": false, "tool_call": true, @@ -272177,36 +267350,76 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", "effort_options": [ - "minimal", "low", "medium", "high" - ], - "verbosity": "medium", - "verbosity_options": [ + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2026-03", + "release_date": "2026-10-13", + "last_updated": "2026-10-13", + "type": "chat" + }, + { + "id": "gemini-3.7-flash", + "name": "Gemini 3.7 Flash", + "display_name": "Gemini 3.7 Flash", + "modalities": { + "input": [ + "text", + "image", + "video", + "audio", + "pdf" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1048576, + "output": 65536 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", "low", "medium", "high" ], - "visibility": "hidden" + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-09-15", - "last_updated": "2025-09-15", + "knowledge": "2026-03", + "release_date": "2026-08-13", + "last_updated": "2026-08-13", "type": "chat" }, { - "id": "ling-2.6-flash-free", - "name": "Ling 2.6 Flash Free", - "display_name": "Ling 2.6 Flash Free", + "id": "glm-5", + "name": "GLM-5", + "display_name": "GLM-5", "modalities": { "input": [ "text" @@ -272216,25 +267429,37 @@ ] }, "limit": { - "context": 262100, - "output": 32800 + "context": 204800, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, "open_weights": true, - "knowledge": "2025-06", - "release_date": "2026-04-21", - "last_updated": "2026-04-21", + "knowledge": "2025-04", + "release_date": "2026-02-12", + "last_updated": "2026-02-12", "type": "chat" }, { - "id": "kimi-k2.6", - "name": "Kimi K2.6", - "display_name": "Kimi K2.6", + "id": "kimi-k3", + "name": "Kimi K3", + "display_name": "Kimi K3", "modalities": { "input": [ "text", @@ -272246,10 +267471,10 @@ ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 1048576, + "output": 131072 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -272263,35 +267488,35 @@ "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "effort_options": [ + "low", + "high", + "max" ] } }, "attachment": true, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-20", - "last_updated": "2026-04-20", + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" }, { - "id": "gemini-3.8-flash", - "name": "Gemini 3.8 Flash", - "display_name": "Gemini 3.8 Flash", + "id": "longcat-2.0-free", + "name": "LongCat-2.0 Free", + "display_name": "LongCat-2.0 Free", "modalities": { "input": [ - "text", - "image", - "video", - "audio", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -272302,32 +267527,24 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", - "low", - "medium", - "high" - ], + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" ] } }, - "attachment": true, - "open_weights": false, - "release_date": "2026-09-02", - "last_updated": "2026-09-02", + "attachment": false, + "open_weights": true, + "release_date": "2026-06-30", + "last_updated": "2026-06-30", "type": "chat" }, { - "id": "kimi-k3", - "name": "Kimi K3", - "display_name": "Kimi K3", + "id": "qwen3.8-flash", + "name": "Qwen3.8 Flash", + "display_name": "Qwen3.8 Flash", "modalities": { "input": [ "text", @@ -272339,10 +267556,10 @@ ] }, "limit": { - "context": 1048576, + "context": 1000000, "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -272351,40 +267568,37 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ "low", - "high", - "max" + "medium", + "xhigh" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-16", + "open_weights": false, + "release_date": "2026-08-26", + "last_updated": "2026-08-26", "type": "chat" }, { - "id": "ling-3.1-flash-free", - "name": "Ling 3.1 Flash Free", - "display_name": "Ling 3.1 Flash Free", + "id": "mimo-v2.6-flash-free", + "name": "MiMo-V2.6-Flash Free", + "display_name": "MiMo-V2.6-Flash Free", "modalities": { "input": [ - "text" + "text", + "image", + "audio", + "video" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 200000, + "output": 32000 }, "temperature": true, "tool_call": true, @@ -272392,16 +267606,27 @@ "supported": true, "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": true, "open_weights": true, - "release_date": "2026-09-29", - "last_updated": "2026-09-29", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "claude-3-5-haiku", - "name": "Claude Haiku 3.5", - "display_name": "Claude Haiku 3.5", + "id": "gpt-5.5-pro", + "name": "GPT-5.5 Pro", + "display_name": "GPT-5.5 Pro", "modalities": { "input": [ "text", @@ -272413,40 +267638,51 @@ ] }, "limit": { - "context": 200000, - "output": 8192 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "medium", + "high", + "xhigh" + ] + } }, "attachment": true, "open_weights": false, - "knowledge": "2024-07-31", - "release_date": "2024-10-22", - "last_updated": "2024-10-22", + "knowledge": "2025-12-01", + "release_date": "2026-04-23", + "last_updated": "2026-04-23", "type": "chat" }, { - "id": "grok-build-0.1", - "name": "Grok Build 0.1", - "display_name": "Grok Build 0.1", + "id": "kimi-k2.5", + "name": "Kimi K2.5", + "display_name": "Kimi K2.5", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 256000 + "context": 262144, + "output": 65536 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -272454,19 +267690,26 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": true, - "open_weights": false, - "release_date": "2026-04-16", - "last_updated": "2026-04-16", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-01-27", + "last_updated": "2026-01-27", "type": "chat" }, { - "id": "gpt-5.1", - "name": "GPT-5.1", - "display_name": "GPT-5.1", + "id": "fledge-alpha-free", + "name": "Fledge Alpha Free", + "display_name": "Fledge Alpha Free", "modalities": { "input": [ "text", @@ -272477,61 +267720,48 @@ ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 1048576, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", "effort_options": [ - "none", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ "low", - "medium", - "high" - ], - "visibility": "hidden" + "high", + "max" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-11-13", - "last_updated": "2025-11-13", + "release_date": "2026-10-01", + "last_updated": "2026-10-01", "type": "chat" }, { - "id": "mimo-v2.6-flash-free", - "name": "MiMo-V2.6-Flash Free", - "display_name": "MiMo-V2.6-Flash Free", + "id": "mimo-v2-omni-free", + "name": "MiMo V2 Omni Free", + "display_name": "MiMo V2 Omni Free", "modalities": { "input": [ "text", "image", "audio", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 32000 + "context": 262144, + "output": 64000 }, "temperature": true, "tool_call": true, @@ -272551,27 +267781,27 @@ } }, "attachment": true, - "open_weights": true, - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "open_weights": false, + "knowledge": "2024-12", + "release_date": "2026-03-18", + "last_updated": "2026-03-18", "type": "chat" }, { - "id": "deepseek-v4.1-flash-free", - "name": "DeepSeek V4.1 Flash Free", - "display_name": "DeepSeek V4.1 Flash Free", + "id": "minimax-m2.1", + "name": "MiniMax-M2.1", + "display_name": "MiniMax-M2.1", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 32000 + "context": 204800, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -272587,40 +267817,33 @@ "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "effort_options": [ - "low", - "high", - "max" ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-09-10", - "last_updated": "2026-09-10", + "knowledge": "2025-01", + "release_date": "2025-12-23", + "last_updated": "2025-12-23", "type": "chat" }, { - "id": "claude-opus-5", - "name": "Claude Opus 5", - "display_name": "Claude Opus 5", + "id": "beam-free", + "name": "Beam Free", + "display_name": "Beam Free", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 1048576, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -272629,6 +267852,12 @@ "extra_capabilities": { "reasoning": { "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ "low", "medium", @@ -272638,17 +267867,17 @@ ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-05", - "release_date": "2026-07-24", - "last_updated": "2026-07-24", + "attachment": false, + "open_weights": true, + "knowledge": "2026-06-30", + "release_date": "2026-10-05", + "last_updated": "2026-10-16", "type": "chat" }, { - "id": "mimo-v2-pro-free", - "name": "MiMo V2 Pro Free", - "display_name": "MiMo V2 Pro Free", + "id": "minimax-m2.5-free", + "name": "MiniMax-M2.5 Free", + "display_name": "MiniMax-M2.5 Free", "modalities": { "input": [ "text" @@ -272658,8 +267887,8 @@ ] }, "limit": { - "context": 1048576, - "output": 64000 + "context": 204800, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -272669,26 +267898,20 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, "attachment": false, - "open_weights": false, - "knowledge": "2024-12", - "release_date": "2026-03-18", - "last_updated": "2026-03-18", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-02-12", + "last_updated": "2026-02-12", "type": "chat" }, { - "id": "claude-sonnet-4-6", - "name": "Claude Sonnet 4.6", - "display_name": "Claude Sonnet 4.6", + "id": "gpt-5.5", + "name": "GPT-5.5", + "display_name": "GPT-5.5", "modalities": { "input": [ "text", @@ -272700,69 +267923,64 @@ ] }, "limit": { - "context": 1000000, - "output": 64000 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ "low", "medium", "high", - "max" + "xhigh" ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." - ] + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-17", - "last_updated": "2026-03-13", + "knowledge": "2025-12-01", + "release_date": "2026-04-23", + "last_updated": "2026-04-23", "type": "chat" }, { - "id": "kimi-k2.5", - "name": "Kimi K2.5", - "display_name": "Kimi K2.5", + "id": "gemini-3.5-flash", + "name": "Gemini 3.5 Flash", + "display_name": "Gemini 3.5 Flash", "modalities": { "input": [ "text", "image", - "video" + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, + "context": 1048576, "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -272771,28 +267989,38 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", + "low", + "medium", + "high" + ], "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" + "thought_signatures" ] } }, "attachment": true, - "open_weights": true, + "open_weights": false, "knowledge": "2025-01", - "release_date": "2026-01-27", - "last_updated": "2026-01-27", + "release_date": "2026-05-19", + "last_updated": "2026-05-19", "type": "chat" }, { - "id": "longcat-2.0-free", - "name": "LongCat-2.0 Free", - "display_name": "LongCat-2.0 Free", + "id": "glm-5.3-flash", + "name": "GLM-5.3-Flash", + "display_name": "GLM-5.3-Flash", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" @@ -272816,29 +268044,38 @@ "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "effort_options": [ + "low", + "high", + "max" ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-06-30", - "last_updated": "2026-06-30", + "release_date": "2026-08-26", + "last_updated": "2026-08-26", "type": "chat" }, { - "id": "minimax-m2.1-free", - "name": "MiniMax-M2.1 Free", - "display_name": "MiniMax-M2.1 Free", + "id": "muse-spark-1.3-contributor-free", + "name": "Muse Spark 1.3 Free", + "display_name": "Muse Spark 1.3 Free", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "pdf", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 204800, + "context": 1048576, "output": 131072 }, "temperature": true, @@ -272849,20 +268086,25 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "effort_options": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2025-12-23", - "last_updated": "2025-12-23", + "attachment": true, + "open_weights": false, + "release_date": "2026-09-02", + "last_updated": "2026-09-02", "type": "chat" }, { - "id": "ling-3.0-flash-free", - "name": "Ling-3.0-flash Free", - "display_name": "Ling-3.0-flash Free", + "id": "glm-4.7", + "name": "GLM-4.7", + "display_name": "GLM-4.7", "modalities": { "input": [ "text" @@ -272872,8 +268114,8 @@ ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 204800, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -272883,36 +268125,37 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "low", - "medium", - "high" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, "attachment": false, "open_weights": true, - "release_date": "2026-07-23", - "last_updated": "2026-07-23", + "knowledge": "2025-04", + "release_date": "2025-12-22", + "last_updated": "2025-12-22", "type": "chat" }, { - "id": "minimax-m3.1-flash-free", - "name": "MiniMax M3.1 Flash Free", - "display_name": "MiniMax M3.1 Flash Free", + "id": "hy3-free", + "name": "Hy3 Free", + "display_name": "Hy3 Free", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 512000 + "context": 190000, + "output": 64000 }, "temperature": true, "tool_call": true, @@ -272932,37 +268175,35 @@ "effort_options": [ "low", "medium", - "high", - "xhigh", - "max" + "high" ] } }, - "attachment": true, - "open_weights": false, - "release_date": "2026-10-19", - "last_updated": "2026-10-19", + "attachment": false, + "open_weights": true, + "release_date": "2026-07-06", + "last_updated": "2026-07-06", "type": "chat" }, { - "id": "gpt-6-astra", - "name": "GPT-6 Astra", - "display_name": "GPT-6 Astra", + "id": "step-5-preview-free", + "name": "Step 5 Preview Free", + "display_name": "Step 5 Preview Free", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1000000, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -272971,26 +268212,29 @@ "extra_capabilities": { "reasoning": { "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ "low", "medium", - "high", - "xhigh", - "max" + "high" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-04-30", - "release_date": "2026-09-04", - "last_updated": "2026-09-04", + "open_weights": true, + "release_date": "2026-09-16", + "last_updated": "2026-09-20", "type": "chat" }, { - "id": "gemini-3.7-flash", - "name": "Gemini 3.7 Flash", - "display_name": "Gemini 3.7 Flash", + "id": "gemini-3.8-flash", + "name": "Gemini 3.8 Flash", + "display_name": "Gemini 3.8 Flash", "modalities": { "input": [ "text", @@ -273034,15 +268278,61 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-08-13", - "last_updated": "2026-08-13", + "release_date": "2026-09-02", + "last_updated": "2026-09-02", "type": "chat" }, { - "id": "gpt-5.5", - "name": "GPT-5.5", - "display_name": "GPT-5.5", + "id": "flint-40b-free", + "name": "Flint 40B Free", + "display_name": "Flint 40B Free", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 262144, + "output": 65536 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + }, + "attachment": false, + "open_weights": true, + "knowledge": "2026-06", + "release_date": "2026-10-21", + "last_updated": "2026-10-21", + "type": "chat" + }, + { + "id": "gpt-6-astra", + "name": "GPT-6 Astra", + "display_name": "GPT-6 Astra", "modalities": { "input": [ "text", @@ -273066,35 +268356,26 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", "effort_options": [ "low", "medium", "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "xhigh", + "max" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-12-01", - "release_date": "2026-04-23", - "last_updated": "2026-04-23", + "knowledge": "2026-04-30", + "release_date": "2026-09-04", + "last_updated": "2026-09-04", "type": "chat" }, { - "id": "glm-5.2", - "name": "GLM-5.2", - "display_name": "GLM-5.2", + "id": "glm-5.1", + "name": "GLM-5.1", + "display_name": "GLM-5.1", "modalities": { "input": [ "text" @@ -273104,7 +268385,7 @@ ] }, "limit": { - "context": 1000000, + "context": 204800, "output": 131072 }, "temperature": true, @@ -273121,23 +268402,20 @@ "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "effort_options": [ - "high", - "max" ] } }, "attachment": false, "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "knowledge": "2025-04", + "release_date": "2026-04-07", + "last_updated": "2026-04-07", "type": "chat" }, { - "id": "deepseek-v4.1-flash", - "name": "DeepSeek V4.1 Flash", - "display_name": "DeepSeek V4.1 Flash", + "id": "deepseek-v4.1-flash-free", + "name": "DeepSeek V4.1 Flash Free", + "display_name": "DeepSeek V4.1 Flash Free", "modalities": { "input": [ "text", @@ -273148,8 +268426,8 @@ ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 200000, + "output": 32000 }, "temperature": true, "tool_call": true, @@ -273181,91 +268459,54 @@ "type": "chat" }, { - "id": "hy3-preview-free", - "name": "Hy3 preview Free", - "display_name": "Hy3 preview Free", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 256000, - "output": 64000 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-06", - "release_date": "2026-04-20", - "last_updated": "2026-04-20", - "type": "chat" - }, - { - "id": "claude-opus-4-6", - "name": "Claude Opus 4.6", - "display_name": "Claude Opus 4.6", + "id": "gpt-5-nano", + "name": "GPT-5 Nano", + "display_name": "GPT-5 Nano", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, + "context": 400000, "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ + "minimal", "low", "medium", - "high", - "max" + "high" ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." - ] + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2025-05-31", - "release_date": "2026-02-05", - "last_updated": "2026-03-13", + "knowledge": "2024-05-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { @@ -273319,50 +268560,24 @@ "type": "chat" }, { - "id": "qwen3-coder", - "name": "Qwen3 Coder", - "display_name": "Qwen3 Coder", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 262144, - "output": 65536 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-07-22", - "last_updated": "2025-07-22", - "type": "chat" - }, - { - "id": "minimax-m3", - "name": "MiniMax-M3", - "display_name": "MiniMax-M3", + "id": "gemini-3.6-flash", + "name": "Gemini 3.6 Flash", + "display_name": "Gemini 3.6 Flash", "modalities": { "input": [ "text", "image", - "video" + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 512000, - "output": 128000 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -273373,36 +268588,47 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", + "low", + "medium", + "high" + ], "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" + "thought_signatures" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-06-01", - "last_updated": "2026-06-01", + "open_weights": false, + "knowledge": "2026-03", + "release_date": "2026-07-21", + "last_updated": "2026-07-21", "type": "chat" }, { - "id": "step-5-preview-free", - "name": "Step 5 Preview Free", - "display_name": "Step 5 Preview Free", + "id": "gemini-3-pro", + "name": "Gemini 3 Pro", + "display_name": "Gemini 3 Pro", "modalities": { "input": [ "text", "image", - "video" + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, + "context": 1048576, "output": 65536 }, "temperature": true, @@ -273414,42 +268640,44 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "low", + "high" + ], "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "low", - "medium", - "high" + "thought_signatures" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-09-16", - "last_updated": "2026-09-20", + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2025-11-18", + "last_updated": "2025-11-18", "type": "chat" }, { - "id": "glm-5.3-flash", - "name": "GLM-5.3-Flash", - "display_name": "GLM-5.3-Flash", + "id": "grok-4.7", + "name": "Grok 4.7", + "display_name": "Grok 4.7", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 500000, + "output": 500000 }, "temperature": true, "tool_call": true, @@ -273459,135 +268687,100 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ "low", + "medium", "high", - "max" + "xhigh" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", - "type": "chat" - }, - { - "id": "gpt-5", - "name": "GPT-5", - "display_name": "GPT-5", - "modalities": { - "input": [ - "text", - "image" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 400000, - "output": 128000 - }, - "temperature": false, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "minimal", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } - }, - "attachment": true, "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "knowledge": "2026-05", + "release_date": "2026-09-21", + "last_updated": "2026-09-21", "type": "chat" - }, + } + ] + }, + "anthropic": { + "id": "anthropic", + "name": "Anthropic", + "display_name": "Anthropic", + "doc": "https://docs.anthropic.com/en/docs/about-claude/models", + "models": [ { - "id": "glm-4.7", - "name": "GLM-4.7", - "display_name": "GLM-4.7", + "id": "claude-sonnet-4-5", + "name": "Claude Sonnet 4.5 (latest)", + "display_name": "Claude Sonnet 4.5 (latest)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-12-22", - "last_updated": "2025-12-22", + "attachment": true, + "open_weights": false, + "knowledge": "2025-07-31", + "release_date": "2025-09-29", + "last_updated": "2025-09-29", "type": "chat" }, { - "id": "nemotron-3.5-super-vl-free", - "name": "Nemotron 3.5 Super VL Free", - "display_name": "Nemotron 3.5 Super VL Free", + "id": "claude-fable-5", + "name": "Claude Fable 5", + "display_name": "Claude Fable 5", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -273596,78 +268789,95 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], "interleaved": true, "summaries": true, - "visibility": "summary", + "visibility": "omitted", "continuation": [ "thinking_blocks" ], - "effort_options": [ - "none", - "minimal", - "low", - "medium", - "high", - "xhigh" + "notes": [ + "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", + "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", + "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-10-15", - "last_updated": "2026-10-15", + "open_weights": false, + "release_date": "2026-06-07", + "last_updated": "2026-06-09", "type": "chat" }, { - "id": "minimax-m2.7", - "name": "MiniMax-M2.7", - "display_name": "MiniMax-M2.7", + "id": "claude-haiku-4-5", + "name": "Claude Haiku 4.5 (latest)", + "display_name": "Claude Haiku 4.5 (latest)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-03-18", - "last_updated": "2026-03-18", + "attachment": true, + "open_weights": false, + "knowledge": "2025-02-28", + "release_date": "2025-10-15", + "last_updated": "2025-10-15", "type": "chat" }, { - "id": "gemini-3.6-flash", - "name": "Gemini 3.6 Flash", - "display_name": "Gemini 3.6 Flash", + "id": "claude-sonnet-4-6", + "name": "Claude Sonnet 4.6", + "display_name": "Claude Sonnet 4.6", "modalities": { "input": [ "text", "image", - "video", - "audio", "pdf" ], "output": [ @@ -273675,91 +268885,111 @@ ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 1000000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", + "effort_options": [ "low", "medium", - "high" + "high", + "max" ], + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" + ], + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-07-21", - "last_updated": "2026-07-21", + "knowledge": "2025-08-31", + "release_date": "2026-02-17", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "glm-5.3-flash-free", - "name": "GLM-5.3-Flash Free", - "display_name": "GLM-5.3-Flash Free", + "id": "claude-opus-4-7", + "name": "Claude Opus 4.7", + "display_name": "Claude Opus 4.7", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 32000 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], "interleaved": true, "summaries": true, - "visibility": "summary", + "visibility": "omitted", "continuation": [ "thinking_blocks" ], - "effort_options": [ - "low", - "high", - "max" + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", + "open_weights": false, + "knowledge": "2026-01-31", + "release_date": "2026-04-14", + "last_updated": "2026-04-16", "type": "chat" }, { - "id": "gpt-6-luna", - "name": "GPT-6 Luna", - "display_name": "GPT-6 Luna", + "id": "claude-fable-5-1", + "name": "Claude Fable 5.1", + "display_name": "Claude Fable 5.1", "modalities": { "input": [ "text", @@ -273771,7 +269001,7 @@ ] }, "limit": { - "context": 1050000, + "context": 1000000, "output": 128000 }, "temperature": false, @@ -273782,42 +269012,56 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", "effort_options": [ - "none", "low", "medium", "high", "xhigh", "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", + "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", + "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-05-18", - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "knowledge": "2026-06", + "release_date": "2026-09-01", + "last_updated": "2026-09-01", "type": "chat" }, { - "id": "qwen3.6-plus-free", - "name": "Qwen3.6 Plus Free", - "display_name": "Qwen3.6 Plus Free", + "id": "claude-opus-5-5", + "name": "Claude Opus 5.5", + "display_name": "Claude Opus 5.5", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -273825,113 +269069,146 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-04", - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "knowledge": "2026-06", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "grok-4.6", - "name": "Grok 4.6", - "display_name": "Grok 4.6", + "id": "claude-opus-4-6", + "name": "Claude Opus 4.6", + "display_name": "Claude Opus 4.6", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 500000, - "output": 500000 + "context": 1000000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", "effort_options": [ "low", "medium", "high", - "xhigh" + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-02-01", - "release_date": "2026-08-12", - "last_updated": "2026-08-12", + "knowledge": "2025-05-31", + "release_date": "2026-02-04", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "glm-5-free", - "name": "GLM-5 Free", - "display_name": "GLM-5 Free", + "id": "claude-opus-4-8", + "name": "Claude Opus 4.8", + "display_name": "Claude Opus 4.8", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], "interleaved": true, "summaries": true, - "visibility": "summary", + "visibility": "omitted", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2026-02-12", - "last_updated": "2026-02-12", + "attachment": true, + "open_weights": false, + "knowledge": "2026-01", + "release_date": "2026-05-28", + "last_updated": "2026-05-28", "type": "chat" }, { - "id": "gemini-3-flash", - "name": "Gemini 3 Flash", - "display_name": "Gemini 3 Flash", + "id": "claude-opus-5", + "name": "Claude Opus 5", + "display_name": "Claude Opus 5", "modalities": { "input": [ "text", "image", - "video", - "audio", "pdf" ], "output": [ @@ -273939,10 +269216,10 @@ ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -273951,33 +269228,26 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", + "effort_options": [ "low", "medium", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" + "high", + "xhigh", + "max" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-12-17", - "last_updated": "2025-12-17", + "knowledge": "2026-05", + "release_date": "2026-07-24", + "last_updated": "2026-07-24", "type": "chat" }, { - "id": "claude-opus-4-1", - "name": "Claude Opus 4.1", - "display_name": "Claude Opus 4.1", + "id": "claude-haiku-4-5-20251001", + "name": "Claude Haiku 4.5", + "display_name": "Claude Haiku 4.5", "modalities": { "input": [ "text", @@ -273990,7 +269260,7 @@ }, "limit": { "context": 200000, - "output": 32000 + "output": 64000 }, "temperature": true, "tool_call": true, @@ -274021,18 +269291,20 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2025-03-31", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "knowledge": "2025-02-28", + "release_date": "2025-10-15", + "last_updated": "2025-10-15", "type": "chat" }, { - "id": "deepseek-v4-flash-free", - "name": "DeepSeek V4 Flash Free", - "display_name": "DeepSeek V4 Flash Free", + "id": "claude-opus-4-5", + "name": "Claude Opus 4.5 (latest)", + "display_name": "Claude Opus 4.5 (latest)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" @@ -274040,92 +269312,94 @@ }, "limit": { "context": 200000, - "output": 128000 + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", + "effort_options": [ + "low", + "medium", + "high" + ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" ], - "effort_options": [ - "low", - "high", - "max" + "notes": [ + "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." ] } }, - "attachment": false, - "open_weights": true, + "attachment": true, + "open_weights": false, "knowledge": "2025-05", - "release_date": "2026-07-31", - "last_updated": "2026-07-31", + "release_date": "2025-11-24", + "last_updated": "2025-11-24", "type": "chat" }, { - "id": "gpt-5.1-codex-mini", - "name": "GPT-5.1 Codex Mini", - "display_name": "GPT-5.1 Codex Mini", + "id": "claude-haiku-5-5", + "name": "Claude Haiku 5.5", + "display_name": "Claude Haiku 5.5", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 400000, + "context": 1000000, "output": 128000 }, "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", "effort_options": [ - "none", "low", "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "high", + "xhigh", + "max" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-11-13", - "last_updated": "2025-11-13", + "knowledge": "2026-06", + "release_date": "2026-10-07", + "last_updated": "2026-10-07", "type": "chat" }, { - "id": "claude-opus-4-8", - "name": "Claude Opus 4.8", - "display_name": "Claude Opus 4.8", + "id": "claude-sonnet-5-5", + "name": "Claude Sonnet 5.5", + "display_name": "Claude Sonnet 5.5", "modalities": { "input": [ "text", @@ -274144,62 +269418,45 @@ "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "high", "effort_options": [ "low", "medium", "high", "xhigh", "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-01", - "release_date": "2026-05-28", - "last_updated": "2026-05-28", + "knowledge": "2026-06", + "release_date": "2026-09-28", + "last_updated": "2026-09-28", "type": "chat" }, { - "id": "muse-spark-1.2", - "name": "Muse Spark 1.2", - "display_name": "Muse Spark 1.2", + "id": "claude-sonnet-5", + "name": "Claude Sonnet 5", + "display_name": "Claude Sonnet 5", "modalities": { "input": [ "text", "image", - "video", - "pdf", - "audio" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -274209,115 +269466,159 @@ "reasoning": { "supported": true, "effort_options": [ - "minimal", "low", "medium", "high", - "xhigh" + "xhigh", + "max" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-08-05", - "last_updated": "2026-08-05", + "knowledge": "2026-01-31", + "release_date": "2026-06-29", + "last_updated": "2026-06-30", "type": "chat" }, { - "id": "qwen3.8-flash", - "name": "Qwen3.8 Flash", - "display_name": "Qwen3.8 Flash", + "id": "claude-sonnet-4-5-20250929", + "name": "Claude Sonnet 4.5", + "display_name": "Claude Sonnet 4.5", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "effort_options": [ - "low", - "medium", - "xhigh" + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", + "knowledge": "2025-07-31", + "release_date": "2025-09-29", + "last_updated": "2025-09-29", "type": "chat" }, { - "id": "fledge-alpha-free", - "name": "Fledge Alpha Free", - "display_name": "Fledge Alpha Free", + "id": "claude-opus-4-5-20251101", + "name": "Claude Opus 4.5", + "display_name": "Claude Opus 4.5", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", "effort_options": [ "low", - "high", - "max" + "medium", + "high" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-10-01", - "last_updated": "2026-10-01", + "knowledge": "2025-05", + "release_date": "2025-11-24", + "last_updated": "2025-11-01", "type": "chat" - }, + } + ] + }, + "ai-router": { + "id": "ai-router", + "name": "AI-ROUTER", + "display_name": "AI-ROUTER", + "api": "https://api.ai-router.dev/v1", + "doc": "https://ai-router.dev/openai-compatible-api-gateway/", + "models": [ { - "id": "glm-4.7-free", - "name": "GLM-4.7 Free", - "display_name": "GLM-4.7 Free", + "id": "gpt-5.6-terra", + "name": "GPT-5.6 Terra", + "display_name": "GPT-5.6 Terra", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -274326,39 +269627,52 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-12-22", - "last_updated": "2025-12-22", + "attachment": true, + "open_weights": false, + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "gpt-5.1-codex", - "name": "GPT-5.1 Codex", - "display_name": "GPT-5.1 Codex", + "id": "gpt-5.4", + "name": "GPT-5.4", + "display_name": "GPT-5.4", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 400000, + "context": 1050000, "output": 128000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -274374,7 +269688,8 @@ "none", "low", "medium", - "high" + "high", + "xhigh" ], "verbosity": "medium", "verbosity_options": [ @@ -274387,15 +269702,15 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-11-13", - "last_updated": "2025-11-13", + "knowledge": "2025-08-31", + "release_date": "2026-03-05", + "last_updated": "2026-03-05", "type": "chat" }, { - "id": "claude-fable-5", - "name": "Claude Fable 5", - "display_name": "Claude Fable 5", + "id": "gpt-5.6-sol", + "name": "GPT-5.6 Sol", + "display_name": "GPT-5.6 Sol", "modalities": { "input": [ "text", @@ -274407,7 +269722,7 @@ ] }, "limit": { - "context": 1000000, + "context": 1050000, "output": 128000 }, "temperature": false, @@ -274421,38 +269736,35 @@ "supported": true, "default_enabled": true, "mode": "effort", - "effort": "high", + "effort": "medium", "effort_options": [ + "none", "low", "medium", "high", "xhigh", "max" ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" ], - "notes": [ - "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", - "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", - "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." - ] + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-09", - "last_updated": "2026-06-09", + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "gpt-5.4-pro", - "name": "GPT-5.4 Pro", - "display_name": "GPT-5.4 Pro", + "id": "gpt-5.6-luna", + "name": "GPT-5.6 Luna", + "display_name": "GPT-5.6 Luna", "modalities": { "input": [ "text", @@ -274478,11 +269790,14 @@ "supported": true, "default_enabled": true, "mode": "effort", - "effort": "high", + "effort": "medium", "effort_options": [ + "none", + "low", "medium", "high", - "xhigh" + "xhigh", + "max" ], "verbosity": "medium", "verbosity_options": [ @@ -274495,28 +269810,30 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-05", - "last_updated": "2026-03-05", + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "ring-2.6-1t-free", - "name": "Ring 2.6 1T Free", - "display_name": "Ring 2.6 1T Free", + "id": "gpt-5.5", + "name": "GPT-5.5", + "display_name": "GPT-5.5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262000, - "output": 66000 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -274525,74 +269842,59 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-06", - "release_date": "2026-05-08", - "last_updated": "2026-05-08", + "attachment": true, + "open_weights": false, + "knowledge": "2025-12-01", + "release_date": "2026-04-23", + "last_updated": "2026-04-23", "type": "chat" } ] }, - "nebius": { - "id": "nebius", - "name": "Nebius Token Factory", - "display_name": "Nebius Token Factory", - "api": "https://api.tokenfactory.nebius.com/v1", - "doc": "https://docs.tokenfactory.nebius.com/", + "auriko": { + "id": "auriko", + "name": "Auriko", + "display_name": "Auriko", + "api": "https://api.auriko.ai/v1", + "doc": "https://docs.auriko.ai", "models": [ { - "id": "Qwen/Qwen3-30B-A3B-Instruct-2507", - "name": "Qwen3-30B-A3B-Instruct-2507", - "display_name": "Qwen3-30B-A3B-Instruct-2507", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 262144, - "output": 8192 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-12", - "release_date": "2025-07-28", - "last_updated": "2025-07-28", - "type": "chat" - }, - { - "id": "Qwen/Qwen3.8-27B", - "name": "Qwen3.8 27B", - "display_name": "Qwen3.8 27B", + "id": "gemini-3.1-pro-preview", + "name": "Gemini 3.1 Pro Preview", + "display_name": "Gemini 3.1 Pro Preview", "modalities": { "input": [ "text", - "image" + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -274603,30 +269905,31 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "low", + "high" + ], "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "none", - "low", - "medium", - "xhigh" + "thought_signatures" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2026-02-19", + "last_updated": "2026-02-19", "type": "chat" }, { - "id": "Qwen/Qwen3.5-397B-A17B", - "name": "Qwen3.5-397B-A17B", - "display_name": "Qwen3.5-397B-A17B", + "id": "deepseek-v4-flash", + "name": "DeepSeek V4 Flash", + "display_name": "DeepSeek V4 Flash", "modalities": { "input": [ "text" @@ -274636,8 +269939,8 @@ ] }, "limit": { - "context": 262144, - "output": 8192 + "context": 1000000, + "output": 384000 }, "temperature": true, "tool_call": true, @@ -274648,92 +269951,110 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "high", + "max" + ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "notes": [ + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, "attachment": false, "open_weights": true, - "knowledge": "2025-07", - "release_date": "2026-02-15", - "last_updated": "2026-02-15", + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "Qwen/Qwen3-Embedding-8B", - "name": "Qwen3-Embedding-8B", - "display_name": "Qwen3-Embedding-8B", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 40960, - "output": 8192 - }, - "temperature": false, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-10", - "release_date": "2025-06-05", - "last_updated": "2025-06-05", - "type": "embedding" - }, - { - "id": "Qwen/Qwen3-235B-A22B-Instruct-2507", - "name": "Qwen3 235B A22B Instruct 2507", - "display_name": "Qwen3 235B A22B Instruct 2507", + "id": "claude-sonnet-4-6", + "name": "Claude Sonnet 4.6", + "display_name": "Claude Sonnet 4.6", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 8192 + "context": 1000000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-07", - "release_date": "2025-07-21", - "last_updated": "2025-07-21", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-02-17", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "NousResearch/Hermes-4-405B", - "name": "Hermes-4-405B", - "display_name": "Hermes-4-405B", + "id": "gemini-2.5-pro", + "name": "Gemini 2.5 Pro", + "display_name": "Gemini 2.5 Pro", "modalities": { "input": [ - "text" + "text", + "image", + "audio", + "video", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -274744,73 +270065,90 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": true, + "mode": "budget", + "budget": { + "default": -1, + "min": 128, + "max": 32768, + "auto": -1, + "unit": "tokens" + }, "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" + "thought_signatures" ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-08-31", - "release_date": "2025-08-26", - "last_updated": "2025-08-26", + "attachment": true, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2025-06-17", + "last_updated": "2025-06-17", "type": "chat" }, { - "id": "MiniMaxAI/MiniMax-M3.1-Flash", - "name": "MiniMax-M3.1-Flash", - "display_name": "MiniMax-M3.1-Flash", + "id": "claude-opus-4-7", + "name": "Claude Opus 4.7", + "display_name": "Claude Opus 4.7", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 1048576 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], + "default_enabled": false, + "mode": "effort", + "effort": "high", "effort_options": [ - "none", "low", "medium", "high", "xhigh", "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-10-19", - "last_updated": "2026-10-19", + "knowledge": "2026-01-31", + "release_date": "2026-04-16", + "last_updated": "2026-04-16", "type": "chat" }, { - "id": "MiniMaxAI/MiniMax-M3", - "name": "MiniMax-M3", - "display_name": "MiniMax-M3", + "id": "minimax-m2-7", + "name": "MiniMax-M2.7", + "display_name": "MiniMax-M2.7", "modalities": { "input": [ "text" @@ -274820,8 +270158,8 @@ ] }, "limit": { - "context": 1048576, - "output": 1048576 + "context": 204800, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -274829,69 +270167,110 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, "attachment": false, "open_weights": true, - "release_date": "2026-06-01", - "last_updated": "2026-06-01", + "release_date": "2026-03-18", + "last_updated": "2026-03-18", "type": "chat" }, { - "id": "nvidia/Nemotron-3.5-Super-VL", - "name": "Nemotron 3.5 Super VL 120B A12B", - "display_name": "Nemotron 3.5 Super VL 120B A12B", + "id": "claude-opus-4-6", + "name": "Claude Opus 4.6", + "display_name": "Claude Opus 4.6", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 1048576 + "context": 1000000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "max" + ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" ], - "effort_options": [ - "none", - "high" + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, "attachment": true, + "open_weights": false, + "knowledge": "2025-05-31", + "release_date": "2026-02-05", + "last_updated": "2026-03-13", + "type": "chat" + }, + { + "id": "minimax-m2-7-highspeed", + "name": "MiniMax-M2.7-highspeed", + "display_name": "MiniMax-M2.7-highspeed", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 204800, + "output": 131072 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "attachment": false, "open_weights": true, - "release_date": "2026-10-15", - "last_updated": "2026-10-15", + "release_date": "2026-03-18", + "last_updated": "2026-03-18", "type": "chat" }, { - "id": "nvidia/Nemotron-3-Ultra-550b-a55b", - "name": "Nemotron 3 Ultra 550B A55B", - "display_name": "Nemotron 3 Ultra 550B A55B", + "id": "gemini-2.5-flash", + "name": "Gemini 2.5 Flash", + "display_name": "Gemini 2.5 Flash", "modalities": { "input": [ - "text" + "text", + "image", + "audio", + "video", + "pdf" ], "output": [ "text" @@ -274899,7 +270278,7 @@ }, "limit": { "context": 1048576, - "output": 1048576 + "output": 65536 }, "temperature": true, "tool_call": true, @@ -274910,26 +270289,39 @@ "extra_capabilities": { "reasoning": { "supported": true, - "effort_options": [ - "none", - "high" + "default_enabled": true, + "mode": "budget", + "budget": { + "default": -1, + "min": 0, + "max": 24576, + "auto": -1, + "off": 0, + "unit": "tokens" + }, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-09", - "release_date": "2026-06-04", - "last_updated": "2026-06-04", + "attachment": true, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2025-06-17", + "last_updated": "2025-06-17", "type": "chat" }, { - "id": "nvidia/nemotron-3-super-120b-a12b", - "name": "Nemotron-3-Super-120B-A12B", - "display_name": "Nemotron-3-Super-120B-A12B", + "id": "kimi-k2.6", + "name": "Kimi K2.6", + "display_name": "Kimi K2.6", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" @@ -274937,7 +270329,7 @@ }, "limit": { "context": 262144, - "output": 32768 + "output": 262144 }, "temperature": true, "tool_call": true, @@ -274945,17 +270337,35 @@ "supported": true, "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + }, + "attachment": true, "open_weights": true, - "knowledge": "2025-06", - "release_date": "2026-03-11", - "last_updated": "2026-03-11", + "knowledge": "2025-01", + "release_date": "2026-04-20", + "last_updated": "2026-04-20", "type": "chat" }, { - "id": "nvidia/Nemotron-3_5-Lightning", - "name": "Nemotron 3.5 Lightning 30B A3B", - "display_name": "Nemotron 3.5 Lightning 30B A3B", + "id": "deepseek-v4-pro", + "name": "DeepSeek V4 Pro", + "display_name": "DeepSeek V4 Pro", "modalities": { "input": [ "text" @@ -274965,8 +270375,8 @@ ] }, "limit": { - "context": 1048576, - "output": 1048576 + "context": 1000000, + "output": 384000 }, "temperature": true, "tool_call": true, @@ -274976,64 +270386,81 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", "effort_options": [ - "none", - "high" + "low", + "high", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, "attachment": false, "open_weights": true, - "knowledge": "2025-09", - "release_date": "2026-08-11", - "last_updated": "2026-08-11", + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "google/gemma-3-27b-it", - "name": "Gemma-3-27b-it", - "display_name": "Gemma-3-27b-it", + "id": "qwen-3.6-plus", + "name": "Qwen3.6 Plus", + "display_name": "Qwen3.6 Plus", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 110000, - "output": 8192 + "context": 1000000, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": true, - "open_weights": true, - "knowledge": "2024-08", - "release_date": "2025-03-12", - "last_updated": "2025-03-12", + "open_weights": false, + "knowledge": "2025-04", + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "moonshotai/Kimi-K3", - "name": "Kimi K3", - "display_name": "Kimi K3", + "id": "kimi-k2.5", + "name": "Kimi K2.5", + "display_name": "Kimi K2.5", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1024000, - "output": 8000 + "context": 262144, + "output": 262144 }, "temperature": false, "tool_call": true, @@ -275051,37 +270478,40 @@ "thinking_blocks" ], "effort_options": [ - "none", "low", "medium", "high", + "xhigh", "max" ] } }, "attachment": true, "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-16", + "knowledge": "2025-01", + "release_date": "2026-01-27", + "last_updated": "2026-01-27", "type": "chat" }, { - "id": "moonshotai/Kimi-K2.7-Code", - "name": "Kimi K2.7 Code", - "display_name": "Kimi K2.7 Code", + "id": "grok-4.3", + "name": "Grok 4.3", + "display_name": "Grok 4.3", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 8000 + "context": 1000000, + "output": 30000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -275090,25 +270520,23 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "low", + "medium", + "high" ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-06-12", - "last_updated": "2026-06-12", + "attachment": true, + "open_weights": false, + "release_date": "2026-04-17", + "last_updated": "2026-04-17", "type": "chat" }, { - "id": "reflection/beam", - "name": "Beam 1.0 501B A23B", - "display_name": "Beam 1.0 501B A23B", + "id": "glm-5.1", + "name": "GLM-5.1", + "display_name": "GLM-5.1", "modalities": { "input": [ "text" @@ -275118,7 +270546,7 @@ ] }, "limit": { - "context": 1048576, + "context": 200000, "output": 131072 }, "temperature": true, @@ -275135,41 +270563,40 @@ "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "effort_options": [ - "minimal", - "low", - "medium", - "high", - "xhigh", - "max" ] } }, "attachment": false, "open_weights": true, - "knowledge": "2026-06-30", - "release_date": "2026-10-05", - "last_updated": "2026-10-16", + "release_date": "2026-04-07", + "last_updated": "2026-04-07", "type": "chat" - }, + } + ] + }, + "openreason": { + "id": "openreason", + "name": "OpenReason", + "display_name": "OpenReason", + "api": "https://api.openreason.app/v1", + "doc": "https://openreason.app/docs", + "models": [ { - "id": "meta-models/muse-spark-open", - "name": "Muse Spark Open", - "display_name": "Muse Spark Open", + "id": "moonshotai/kimi-k2.7-code", + "name": "Kimi K2.7 Code", + "display_name": "Kimi K2.7 Code", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 1048576 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, @@ -275185,26 +270612,20 @@ "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "effort_options": [ - "low", - "medium", - "high", - "xhigh" ] } }, "attachment": true, "open_weights": true, - "knowledge": "2026-01-04", - "release_date": "2026-10-15", - "last_updated": "2026-10-15", + "knowledge": "2025-01", + "release_date": "2026-06-12", + "last_updated": "2026-06-12", "type": "chat" }, { "id": "openai/gpt-oss-120b", - "name": "gpt-oss-120b", - "display_name": "gpt-oss-120b", + "name": "GPT OSS 120B", + "display_name": "GPT OSS 120B", "modalities": { "input": [ "text" @@ -275215,7 +270636,7 @@ }, "limit": { "context": 131072, - "output": 8192 + "output": 32768 }, "temperature": true, "tool_call": true, @@ -275247,9 +270668,9 @@ "type": "chat" }, { - "id": "zai-org/GLM-5.3", - "name": "GLM-5.3", - "display_name": "GLM-5.3", + "id": "deepseek-ai/deepseek-v4-flash-0731", + "name": "DeepSeek V4 Flash 0731", + "display_name": "DeepSeek V4 Flash 0731", "modalities": { "input": [ "text" @@ -275259,8 +270680,8 @@ ] }, "limit": { - "context": 1024000, - "output": 1024000 + "context": 1000000, + "output": 384000 }, "temperature": true, "tool_call": true, @@ -275278,22 +270699,36 @@ "thinking_blocks" ], "effort_options": [ + "none", + "minimal", "low", + "medium", "high", + "xhigh", "max" ] } }, "attachment": false, "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "knowledge": "2025-05", + "release_date": "2026-07-31", + "last_updated": "2026-07-31", "type": "chat" - }, + } + ] + }, + "lynkr": { + "id": "lynkr", + "name": "Lynkr", + "display_name": "Lynkr", + "api": "http://127.0.0.1:8081/v1", + "doc": "https://github.com/Fast-Editor/Lynkr", + "models": [ { - "id": "zai-org/GLM-5.2", - "name": "GLM-5.2", - "display_name": "GLM-5.2", + "id": "lynkr-auto", + "name": "Lynkr Auto (complexity routing)", + "display_name": "Lynkr Auto (complexity routing)", "modalities": { "input": [ "text" @@ -275303,8 +270738,44 @@ ] }, "limit": { - "context": 1048576, - "output": 1048576 + "context": 128000, + "output": 8192 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": false, + "release_date": "2025-12-03", + "last_updated": "2026-07-11", + "type": "chat" + } + ] + }, + "tokenrouter": { + "id": "tokenrouter", + "name": "TokenRouter", + "display_name": "TokenRouter", + "api": "https://api.tokenrouter.com/v1", + "doc": "https://www.tokenrouter.com/docs/tokenrouter-feature-guide/", + "models": [ + { + "id": "z-ai/glm-5.3-free", + "name": "GLM-5.3 (free)", + "display_name": "GLM-5.3 (free)", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -275323,33 +270794,41 @@ ], "effort_options": [ "low", - "medium", - "high" + "high", + "max" ] } }, "attachment": false, "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" - }, + } + ] + }, + "minimax": { + "id": "minimax", + "name": "MiniMax (minimax.io)", + "display_name": "MiniMax (minimax.io)", + "api": "https://api.minimax.io/anthropic/v1", + "doc": "https://platform.minimax.io/docs/guides/quickstart", + "models": [ { - "id": "zai-org/GLM-5.3-Flash", - "name": "GLM-5.3-Flash", - "display_name": "GLM-5.3-Flash", + "id": "MiniMax-M2.7", + "name": "MiniMax-M2.7", + "display_name": "MiniMax-M2.7", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1024000, - "output": 1024000 + "context": 204800, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -275365,24 +270844,19 @@ "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "effort_options": [ - "low", - "high", - "max" ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", + "release_date": "2026-03-18", + "last_updated": "2026-03-18", "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-V4-Pro-0813", - "name": "DeepSeek V4 Pro 0813", - "display_name": "DeepSeek V4 Pro 0813", + "id": "MiniMax-M2", + "name": "MiniMax-M2", + "display_name": "MiniMax-M2", "modalities": { "input": [ "text" @@ -275392,8 +270866,8 @@ ] }, "limit": { - "context": 979000, - "output": 979000 + "context": 204800, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -275401,33 +270875,16 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "none", - "low", - "high", - "max" - ] - } - }, "attachment": false, "open_weights": true, - "release_date": "2026-08-13", - "last_updated": "2026-08-22", + "release_date": "2025-10-27", + "last_updated": "2025-10-27", "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-V4-Pro", - "name": "DeepSeek V4 Pro", - "display_name": "DeepSeek V4 Pro", + "id": "MiniMax-M2.5", + "name": "MiniMax-M2.5", + "display_name": "MiniMax-M2.5", "modalities": { "input": [ "text" @@ -275437,8 +270894,8 @@ ] }, "limit": { - "context": 1048576, - "output": 1048576 + "context": 204800, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -275448,48 +270905,32 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." - ] + "supported": true } }, "attachment": false, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "release_date": "2026-02-12", + "last_updated": "2026-02-12", "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-V4-Flash-0731", - "name": "DeepSeek V4 Flash 0731", - "display_name": "DeepSeek V4 Flash 0731", + "id": "MiniMax-M3.1-Flash", + "name": "MiniMax-M3.1-Flash", + "display_name": "MiniMax-M3.1-Flash", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1024000, - "output": 1024000 + "context": 1000000, + "output": 524288 }, "temperature": true, "tool_call": true, @@ -275499,44 +270940,38 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ - "none", "low", + "medium", "high", + "xhigh", "max" ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-07-31", - "last_updated": "2026-07-31", + "attachment": true, + "open_weights": false, + "release_date": "2026-10-19", + "last_updated": "2026-10-19", "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-V4.1-Flash-1017", - "name": "DeepSeek V4.1 Flash 1017", - "display_name": "DeepSeek V4.1 Flash 1017", + "id": "MiniMax-M3", + "name": "MiniMax-M3", + "display_name": "MiniMax-M3", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 1048576 + "context": 1000000, + "output": 524288 }, "temperature": true, "tool_call": true, @@ -275546,37 +270981,30 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "none", - "low", - "high", - "max" - ] + "supported": true } }, "attachment": true, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-10-17", - "last_updated": "2026-10-17", + "release_date": "2026-06-01", + "last_updated": "2026-06-25", "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-V4.1-Flash", - "name": "DeepSeek V4.1 Flash", - "display_name": "DeepSeek V4.1 Flash", + "id": "MiniMax-M2.1", + "name": "MiniMax-M2.1", + "display_name": "MiniMax-M2.1", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048000, - "output": 1048000 + "context": 204800, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -275586,41 +271014,19 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "none", - "low", - "high", - "max" - ] + "supported": true } }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-09-10", - "last_updated": "2026-09-10", + "release_date": "2025-12-23", + "last_updated": "2025-12-23", "type": "chat" - } - ] - }, - "sarvam": { - "id": "sarvam", - "name": "Sarvam AI", - "display_name": "Sarvam AI", - "api": "https://api.sarvam.ai/v1", - "doc": "https://docs.sarvam.ai/api-reference-docs/getting-started/models", - "models": [ + }, { - "id": "sarvam-105b", - "name": "Sarvam-105B", - "display_name": "Sarvam-105B", + "id": "MiniMax-M2.5-highspeed", + "name": "MiniMax-M2.5-highspeed", + "display_name": "MiniMax-M2.5-highspeed", "modalities": { "input": [ "text" @@ -275630,7 +271036,7 @@ ] }, "limit": { - "context": 131072, + "context": 204800, "output": 131072 }, "temperature": true, @@ -275641,30 +271047,19 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "low", - "medium", - "high" - ] + "supported": true } }, "attachment": false, "open_weights": true, - "release_date": "2026-02-18", - "last_updated": "2026-02-18", + "release_date": "2026-02-13", + "last_updated": "2026-02-13", "type": "chat" }, { - "id": "sarvam-30b", - "name": "Sarvam-30B", - "display_name": "Sarvam-30B", + "id": "MiniMax-M2.7-highspeed", + "name": "MiniMax-M2.7-highspeed", + "display_name": "MiniMax-M2.7-highspeed", "modalities": { "input": [ "text" @@ -275674,8 +271069,8 @@ ] }, "limit": { - "context": 65536, - "output": 65536 + "context": 204800, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -275691,32 +271086,28 @@ "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "effort_options": [ - "low", - "medium", - "high" ] } }, "attachment": false, "open_weights": true, - "release_date": "2026-02-18", - "last_updated": "2026-02-18", + "release_date": "2026-03-18", + "last_updated": "2026-03-18", "type": "chat" } ] }, - "qvac": { - "id": "qvac", - "name": "QVAC", - "display_name": "QVAC", - "doc": "https://www.npmjs.com/package/@qvac/ai-sdk-provider", + "qiniu-ai": { + "id": "qiniu-ai", + "name": "Qiniu", + "display_name": "Qiniu", + "api": "https://api.qnaigc.com/v1", + "doc": "https://developer.qiniu.com/aitokenapi", "models": [ { - "id": "qwen3.6-35b-a3b", - "name": "Qwen3.6 35B-A3B", - "display_name": "Qwen3.6 35B-A3B", + "id": "doubao-seed-1.6", + "name": "Doubao-Seed 1.6", + "display_name": "Doubao-Seed 1.6", "modalities": { "input": [ "text", @@ -275728,8 +271119,8 @@ ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 256000, + "output": 32000 }, "temperature": true, "tool_call": true, @@ -275737,27 +271128,16 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, "attachment": true, - "open_weights": true, - "release_date": "2026-04-17", - "last_updated": "2026-04-17", + "open_weights": false, + "release_date": "2025-10-15", + "last_updated": "2025-10-15", "type": "chat" }, { - "id": "qwen3.5-0.8b", - "name": "Qwen3.5 0.8B", - "display_name": "Qwen3.5 0.8B", + "id": "gpt-oss-20b", + "name": "gpt-oss-20b", + "display_name": "gpt-oss-20b", "modalities": { "input": [ "text" @@ -275767,92 +271147,89 @@ ] }, "limit": { - "context": 32768, - "output": 8192 + "context": 128000, + "output": 4096 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": false, "open_weights": true, - "release_date": "2026-03-02", - "last_updated": "2026-03-02", + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "qwen3.5-4b", - "name": "Qwen3.5 4B", - "display_name": "Qwen3.5 4B", + "id": "qwen2.5-vl-72b-instruct", + "name": "Qwen 2.5 VL 72B Instruct", + "display_name": "Qwen 2.5 VL 72B Instruct", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 32768, + "context": 128000, "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-03-02", - "last_updated": "2026-03-02", + "knowledge": "2024-04", + "release_date": "2025-01-26", + "last_updated": "2025-01-26", "type": "chat" }, { - "id": "gemma4-31b", - "name": "Gemma 4 31B IT", - "display_name": "Gemma 4 31B IT", + "id": "kimi-k2", + "name": "Kimi K2", + "display_name": "Kimi K2", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 128000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "knowledge": "2024-12-31", + "release_date": "2025-07-11", + "last_updated": "2025-07-11", "type": "chat" }, { - "id": "qwen3.5-2b", - "name": "Qwen3.5 2B", - "display_name": "Qwen3.5 2B", + "id": "qwen3-max", + "name": "Qwen3 Max", + "display_name": "Qwen3 Max", "modalities": { "input": [ "text" @@ -275862,8 +271239,8 @@ ] }, "limit": { - "context": 32768, - "output": 8192 + "context": 262144, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -275882,27 +271259,29 @@ } }, "attachment": false, - "open_weights": true, - "release_date": "2026-03-02", - "last_updated": "2026-03-02", + "open_weights": false, + "knowledge": "2025-04", + "release_date": "2025-09-23", + "last_updated": "2025-09-23", "type": "chat" }, { - "id": "qwen3.6-27b", - "name": "Qwen3.6 27B", - "display_name": "Qwen3.6 27B", + "id": "gemini-2.5-pro", + "name": "Gemini 2.5 Pro", + "display_name": "Gemini 2.5 Pro", "modalities": { "input": [ "text", "image", - "video" + "video", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 262144, + "context": 1048576, "output": 65536 }, "temperature": true, @@ -275914,24 +271293,33 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": true, + "mode": "budget", + "budget": { + "default": -1, + "min": 128, + "max": 32768, + "auto": -1, + "unit": "tokens" + }, "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" + "thought_signatures" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-04-22", - "last_updated": "2026-04-22", + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2025-06-17", + "last_updated": "2025-06-17", "type": "chat" }, { - "id": "gpt-oss-120b", - "name": "GPT OSS 120B", - "display_name": "GPT OSS 120B", + "id": "doubao-1.5-thinking-pro", + "name": "Doubao 1.5 Thinking Pro", + "display_name": "Doubao 1.5 Thinking Pro", "modalities": { "input": [ "text" @@ -275941,8 +271329,8 @@ ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 128000, + "output": 16000 }, "temperature": true, "tool_call": true, @@ -275950,26 +271338,21 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, "attachment": false, - "open_weights": true, - "knowledge": "2024-06", + "open_weights": false, "release_date": "2025-08-05", "last_updated": "2025-08-05", "type": "chat" }, { - "id": "qwen3.5-9b", - "name": "Qwen3.5 9B", - "display_name": "Qwen3.5 9B", + "id": "gemini-2.0-flash-lite", + "name": "Gemini 2.0 Flash Lite", + "display_name": "Gemini 2.0 Flash Lite", "modalities": { "input": [ "text", "image", + "audio", "video" ], "output": [ @@ -275977,40 +271360,82 @@ ] }, "limit": { - "context": 32768, + "context": 1048576, "output": 8192 }, "temperature": true, "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": false, + "knowledge": "2024-06", + "release_date": "2024-12-11", + "last_updated": "2024-12-11", + "type": "chat" + }, + { + "id": "claude-4.0-sonnet", + "name": "Claude 4.0 Sonnet", + "display_name": "Claude 4.0 Sonnet", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 200000, + "output": 64000 + }, + "temperature": true, + "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "none", - "max" - ] - } - }, "attachment": true, + "open_weights": false, + "knowledge": "2025-03-31", + "release_date": "2025-05-22", + "last_updated": "2025-05-22", + "type": "chat" + }, + { + "id": "qwen3-30b-a3b-instruct-2507", + "name": "Qwen3 30b A3b Instruct 2507", + "display_name": "Qwen3 30b A3b Instruct 2507", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 128000, + "output": 32000 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": false, "open_weights": true, - "release_date": "2026-02-23", - "last_updated": "2026-02-23", + "release_date": "2025-07-28", + "last_updated": "2025-07-28", "type": "chat" }, { - "id": "gpt-oss-20b", - "name": "GPT OSS 20B", - "display_name": "GPT OSS 20B", + "id": "mimo-v2-flash", + "name": "Mimo-V2-Flash", + "display_name": "Mimo-V2-Flash", "modalities": { "input": [ "text" @@ -276020,8 +271445,8 @@ ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 256000, + "output": 256000 }, "temperature": true, "tool_call": true, @@ -276029,31 +271454,165 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, "attachment": false, "open_weights": true, + "knowledge": "2024-12-01", + "release_date": "2025-12-16", + "last_updated": "2026-02-04", + "type": "chat" + }, + { + "id": "kling-v2-6", + "name": "Kling-V2 6", + "display_name": "Kling-V2 6", + "modalities": { + "input": [ + "text", + "image", + "video" + ], + "output": [ + "video" + ] + }, + "limit": { + "context": 99999999, + "output": 99999999 + }, + "temperature": true, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": false, + "release_date": "2026-01-13", + "last_updated": "2026-01-13" + }, + { + "id": "claude-4.0-opus", + "name": "Claude 4.0 Opus", + "display_name": "Claude 4.0 Opus", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 200000, + "output": 32000 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-03-31", + "release_date": "2025-05-22", + "last_updated": "2025-05-22", + "type": "chat" + }, + { + "id": "claude-4.5-haiku", + "name": "Claude 4.5 Haiku", + "display_name": "Claude 4.5 Haiku", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 200000, + "output": 64000 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-02-28", + "release_date": "2025-10-15", + "last_updated": "2025-10-15", + "type": "chat" + }, + { + "id": "gemini-2.0-flash", + "name": "Gemini 2.0 Flash", + "display_name": "Gemini 2.0 Flash", + "modalities": { + "input": [ + "text", + "image", + "audio", + "video" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1048576, + "output": 8192 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": false, "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "release_date": "2024-12-11", + "last_updated": "2024-12-11", "type": "chat" - } - ] - }, - "minimax-cn": { - "id": "minimax-cn", - "name": "MiniMax (minimax.cn)", - "display_name": "MiniMax (minimax.cn)", - "api": "https://api.minimax.cn/anthropic/v1", - "doc": "https://platform.minimaxi.com/docs/guides/quickstart", - "models": [ + }, + { + "id": "claude-3.5-sonnet", + "name": "Claude 3.5 Sonnet", + "display_name": "Claude 3.5 Sonnet", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 200000, + "output": 8192 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": false, + "knowledge": "2024-04-30", + "release_date": "2024-10-22", + "last_updated": "2024-10-22", + "type": "chat" + }, { - "id": "MiniMax-M2.7-highspeed", - "name": "MiniMax-M2.7-highspeed", - "display_name": "MiniMax-M2.7-highspeed", + "id": "qwen3-235b-a22b", + "name": "Qwen 3 235B A22B", + "display_name": "Qwen 3 235B A22B", "modalities": { "input": [ "text" @@ -276063,8 +271622,8 @@ ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 128000, + "output": 32000 }, "temperature": true, "tool_call": true, @@ -276085,58 +271644,57 @@ }, "attachment": false, "open_weights": true, - "release_date": "2026-03-18", - "last_updated": "2026-03-18", + "knowledge": "2025-04", + "release_date": "2025-04-28", + "last_updated": "2025-04-28", "type": "chat" }, { - "id": "MiniMax-M2.1", - "name": "MiniMax-M2.1", - "display_name": "MiniMax-M2.1", + "id": "doubao-1.5-vision-pro", + "name": "Doubao 1.5 Vision Pro", + "display_name": "Doubao 1.5 Vision Pro", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 128000, + "output": 16000 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, - "attachment": false, - "open_weights": true, - "release_date": "2025-12-23", - "last_updated": "2025-12-23", + "attachment": true, + "open_weights": false, + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "MiniMax-M2.7", - "name": "MiniMax-M2.7", - "display_name": "MiniMax-M2.7", + "id": "doubao-seed-1.6-flash", + "name": "Doubao-Seed 1.6 Flash", + "display_name": "Doubao-Seed 1.6 Flash", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 256000, + "output": 32000 }, "temperature": true, "tool_call": true, @@ -276144,27 +271702,16 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, - "attachment": false, - "open_weights": true, - "release_date": "2026-03-18", - "last_updated": "2026-03-18", + "attachment": true, + "open_weights": false, + "release_date": "2025-08-28", + "last_updated": "2025-08-28", "type": "chat" }, { - "id": "MiniMax-M2", - "name": "MiniMax-M2", - "display_name": "MiniMax-M2", + "id": "qwen3-235b-a22b-thinking-2507", + "name": "Qwen3 235B A22B Thinking 2507", + "display_name": "Qwen3 235B A22B Thinking 2507", "modalities": { "input": [ "text" @@ -276174,8 +271721,8 @@ ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 262144, + "output": 4096 }, "temperature": true, "tool_call": true, @@ -276183,57 +271730,66 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, "attachment": false, "open_weights": true, - "release_date": "2025-10-27", - "last_updated": "2025-10-27", + "release_date": "2025-07-25", + "last_updated": "2025-07-25", "type": "chat" }, { - "id": "MiniMax-M3.1-Flash", - "name": "MiniMax-M3.1-Flash", - "display_name": "MiniMax-M3.1-Flash", + "id": "qwen3-max-preview", + "name": "Qwen3 Max Preview", + "display_name": "Qwen3 Max Preview", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 524288 + "context": 256000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": true }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2026-10-19", - "last_updated": "2026-10-19", + "knowledge": "2025-04", + "release_date": "2025-09-05", + "last_updated": "2025-09-23", "type": "chat" }, { - "id": "MiniMax-M3", - "name": "MiniMax-M3", - "display_name": "MiniMax-M3", + "id": "doubao-seed-2.0-lite", + "name": "Doubao Seed 2.0 Lite", + "display_name": "Doubao Seed 2.0 Lite", "modalities": { "input": [ "text", @@ -276245,8 +271801,8 @@ ] }, "limit": { - "context": 1000000, - "output": 524288 + "context": 256000, + "output": 32000 }, "temperature": true, "tool_call": true, @@ -276254,21 +271810,16 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, "attachment": true, - "open_weights": true, - "release_date": "2026-06-01", - "last_updated": "2026-06-25", + "open_weights": false, + "release_date": "2026-02-14", + "last_updated": "2026-02-14", "type": "chat" }, { - "id": "MiniMax-M2.5", - "name": "MiniMax-M2.5", - "display_name": "MiniMax-M2.5", + "id": "glm-4.5", + "name": "GLM 4.5", + "display_name": "GLM 4.5", "modalities": { "input": [ "text" @@ -276278,8 +271829,8 @@ ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 131072, + "output": 98304 }, "temperature": true, "tool_call": true, @@ -276287,21 +271838,17 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, "attachment": false, "open_weights": true, - "release_date": "2026-02-12", - "last_updated": "2026-02-12", + "knowledge": "2025-04", + "release_date": "2025-07-28", + "last_updated": "2025-07-28", "type": "chat" }, { - "id": "MiniMax-M2.5-highspeed", - "name": "MiniMax-M2.5-highspeed", - "display_name": "MiniMax-M2.5-highspeed", + "id": "qwen3-next-80b-a3b-instruct", + "name": "Qwen3 Next 80B A3B Instruct", + "display_name": "Qwen3 Next 80B A3B Instruct", "modalities": { "input": [ "text" @@ -276311,80 +271858,68 @@ ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 131072, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, "attachment": false, "open_weights": true, - "release_date": "2026-02-13", - "last_updated": "2026-02-13", + "knowledge": "2025-04", + "release_date": "2025-09", + "last_updated": "2025-09", "type": "chat" - } - ] - }, - "lucidquery": { - "id": "lucidquery", - "name": "LucidQuery", - "display_name": "LucidQuery", - "api": "https://api.lucidquery.com/v1", - "doc": "https://lucidquery.com/docs", - "models": [ + }, { - "id": "lucidnova-rf1-100b", - "name": "LucidNova RF1 100B", - "display_name": "LucidNova RF1 100B", + "id": "doubao-seed-2.0-mini", + "name": "Doubao Seed 2.0 Mini", + "display_name": "Doubao Seed 2.0 Mini", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 120000, - "output": 8000 + "context": 256000, + "output": 32000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2025-09-16", - "release_date": "2024-12-28", - "last_updated": "2025-09-10", + "release_date": "2026-02-14", + "last_updated": "2026-02-14", "type": "chat" }, { - "id": "lucidquery-agi-01-frontier", - "name": "AGI-01 Frontier", - "display_name": "AGI-01 Frontier", + "id": "doubao-seed-2.0-pro", + "name": "Doubao Seed 2.0 Pro", + "display_name": "Doubao Seed 2.0 Pro", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 300000, - "output": 120000 + "context": 256000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -276394,27 +271929,27 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2026-06-05", - "release_date": "2026-06-16", - "last_updated": "2026-06-16", + "release_date": "2026-02-14", + "last_updated": "2026-02-14", "type": "chat" }, { - "id": "lucidquery-agi-01-swift", - "name": "AGI-01 Swift", - "display_name": "AGI-01 Swift", + "id": "doubao-seed-2.0-code", + "name": "Doubao Seed 2.0 Code", + "display_name": "Doubao Seed 2.0 Code", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 300000, - "output": 120000 + "context": 256000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -276424,15 +271959,14 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2026-06-05", - "release_date": "2026-06-16", - "last_updated": "2026-06-16", + "release_date": "2026-02-14", + "last_updated": "2026-02-14", "type": "chat" }, { - "id": "lucidquery-nexus-coder", - "name": "LucidQuery Nexus Coder", - "display_name": "LucidQuery Nexus Coder", + "id": "qwen-max-2025-01-25", + "name": "Qwen2.5-Max-2025-01-25", + "display_name": "Qwen2.5-Max-2025-01-25", "modalities": { "input": [ "text" @@ -276442,38 +271976,30 @@ ] }, "limit": { - "context": 250000, - "output": 60000 + "context": 128000, + "output": 4096 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, "open_weights": false, - "knowledge": "2025-08-01", - "release_date": "2025-09-01", - "last_updated": "2025-09-01", + "knowledge": "2024-04", + "release_date": "2024-04-03", + "last_updated": "2025-01-25", "type": "chat" - } - ] - }, - "oci": { - "id": "oci", - "name": "OCI Generative AI", - "display_name": "OCI Generative AI", - "api": "https://inference.generativeai.us-chicago-1.oci.oraclecloud.com/openai/v1", - "doc": "https://docs.oracle.com/en-us/iaas/Content/generative-ai/pretrained-models.htm", - "models": [ + }, { - "id": "openai.gpt-oss-20b", - "name": "GPT OSS 20B", - "display_name": "GPT OSS 20B", + "id": "qwen3-vl-30b-a3b-thinking", + "name": "Qwen3-Vl 30b A3b Thinking", + "display_name": "Qwen3-Vl 30b A3b Thinking", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" @@ -276481,7 +272007,7 @@ }, "limit": { "context": 128000, - "output": 16384 + "output": 32000 }, "temperature": true, "tool_call": true, @@ -276497,66 +272023,73 @@ "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "effort_options": [ - "low", - "medium", - "high" ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "attachment": true, + "open_weights": false, + "release_date": "2026-02-09", + "last_updated": "2026-02-09", "type": "chat" }, { - "id": "meta.llama-4-scout-17b-16e-instruct", - "name": "Llama 4 Scout 17B Instruct", - "display_name": "Llama 4 Scout 17B Instruct", + "id": "qwen3-next-80b-a3b-thinking", + "name": "Qwen3 Next 80B A3B Thinking", + "display_name": "Qwen3 Next 80B A3B Thinking", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 192000, - "output": 16384 + "context": 131072, + "output": 32768 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, "open_weights": true, - "knowledge": "2024-08", - "release_date": "2025-04-05", - "last_updated": "2025-04-05", + "knowledge": "2025-04", + "release_date": "2025-09", + "last_updated": "2025-09", "type": "chat" }, { - "id": "xai.grok-4.20-reasoning", - "name": "Grok 4.20 (Reasoning)", - "display_name": "Grok 4.20 (Reasoning)", + "id": "gemini-2.5-flash", + "name": "Gemini 2.5 Flash", + "display_name": "Gemini 2.5 Flash", "modalities": { "input": [ "text", - "image" + "image", + "audio", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 30000 + "context": 1048576, + "output": 64000 }, "temperature": true, "tool_call": true, @@ -276564,44 +272097,37 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "budget", + "budget": { + "default": -1, + "min": 0, + "max": 24576, + "auto": -1, + "off": 0, + "unit": "tokens" + }, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] + } + }, "attachment": true, "open_weights": false, - "release_date": "2026-03-09", - "last_updated": "2026-03-09", - "type": "chat" - }, - { - "id": "meta.llama-3.3-70b-instruct", - "name": "Llama-3.3-70B-Instruct", - "display_name": "Llama-3.3-70B-Instruct", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 128000, - "output": 4096 - }, - "temperature": true, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": true, - "knowledge": "2023-12", - "release_date": "2024-12-06", - "last_updated": "2024-12-06", + "knowledge": "2025-01", + "release_date": "2025-06-17", + "last_updated": "2025-06-17", "type": "chat" }, { - "id": "openai.gpt-oss-120b", - "name": "GPT OSS 120B", - "display_name": "GPT OSS 120B", + "id": "qwen3-30b-a3b-thinking-2507", + "name": "Qwen3 30b A3b Thinking 2507", + "display_name": "Qwen3 30b A3b Thinking 2507", "modalities": { "input": [ "text" @@ -276611,8 +272137,8 @@ ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 126000, + "output": 32000 }, "temperature": true, "tool_call": true, @@ -276628,37 +272154,33 @@ "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "effort_options": [ - "low", - "medium", - "high" ] } }, "attachment": false, - "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "open_weights": false, + "release_date": "2026-02-04", + "last_updated": "2026-02-04", "type": "chat" }, { - "id": "xai.grok-4.20-non-reasoning", - "name": "Grok 4.20 (Non-Reasoning)", - "display_name": "Grok 4.20 (Non-Reasoning)", + "id": "qwen-vl-max-2025-01-25", + "name": "Qwen VL-MAX-2025-01-25", + "display_name": "Qwen VL-MAX-2025-01-25", "modalities": { "input": [ "text", - "image" + "image", + "audio", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 30000 + "context": 128000, + "output": 4096 }, "temperature": true, "tool_call": true, @@ -276667,43 +272189,44 @@ }, "attachment": true, "open_weights": false, - "release_date": "2026-03-09", - "last_updated": "2026-03-09", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "meta.llama-4-maverick-17b-128e-instruct-fp8", - "name": "Llama 4 Maverick 17B Instruct", - "display_name": "Llama 4 Maverick 17B Instruct", + "id": "doubao-seed-1.6-thinking", + "name": "Doubao-Seed 1.6 Thinking", + "display_name": "Doubao-Seed 1.6 Thinking", "modalities": { "input": [ + "image", "text", - "image" + "video" ], "output": [ "text" ] }, "limit": { - "context": 512000, - "output": 16384 + "context": 256000, + "output": 32000 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": true, - "open_weights": true, - "knowledge": "2024-08", - "release_date": "2025-04-05", - "last_updated": "2025-04-05", + "open_weights": false, + "release_date": "2025-08-15", + "last_updated": "2025-08-15", "type": "chat" }, { - "id": "xai.grok-4.6", - "name": "Grok 4.6", - "display_name": "Grok 4.6", + "id": "claude-4.5-sonnet", + "name": "Claude 4.5 Sonnet", + "display_name": "Claude 4.5 Sonnet", "modalities": { "input": [ "text", @@ -276714,8 +272237,8 @@ ] }, "limit": { - "context": 500000, - "output": 500000 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, @@ -276723,39 +272246,28 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ] - } - }, "attachment": true, "open_weights": false, - "knowledge": "2026-02-01", - "release_date": "2026-08-12", - "last_updated": "2026-08-12", + "knowledge": "2025-07-31", + "release_date": "2025-09-29", + "last_updated": "2025-09-29", "type": "chat" }, { - "id": "xai.grok-4.3", - "name": "Grok 4.3", - "display_name": "Grok 4.3", + "id": "qwen3-32b", + "name": "Qwen3 32B", + "display_name": "Qwen3 32B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 30000 + "context": 40000, + "output": 4096 }, "temperature": true, "tool_call": true, @@ -276765,141 +272277,100 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "high" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, - "attachment": true, - "open_weights": false, - "release_date": "2026-04-17", - "last_updated": "2026-04-17", + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-04-28", + "last_updated": "2025-04-28", "type": "chat" - } - ] - }, - "kimi-code-plan-global": { - "id": "kimi-code-plan-global", - "name": "Kimi For Coding (kimi.ai)", - "display_name": "Kimi For Coding (kimi.ai)", - "api": "https://api.kimi.ai/coding/v1", - "doc": "https://www.kimi.ai/code/docs/en/kimi-code/models.html", - "models": [ + }, { - "id": "k3.1-pro", - "name": "Kimi K3.1 Pro", - "display_name": "Kimi K3.1 Pro", + "id": "qwen3-coder-480b-a35b-instruct", + "name": "Qwen3 Coder 480B A35B Instruct", + "display_name": "Qwen3 Coder 480B A35B Instruct", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 262000, + "output": 4096 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "low", - "high", - "max" - ] - } + "supported": false }, - "attachment": true, - "open_weights": false, - "release_date": "2026-10-23", - "last_updated": "2026-10-23", + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-07-22", + "last_updated": "2025-07-22", "type": "chat" }, { - "id": "kimi-for-coding", - "name": "kimi-for-coding", - "display_name": "kimi-for-coding", + "id": "glm-4.5-air", + "name": "GLM 4.5 Air", + "display_name": "GLM 4.5 Air", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 32768 + "context": 131000, + "output": 4096 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "none", - "low", - "high", - "max" - ] - } - }, - "attachment": true, - "open_weights": false, - "release_date": "2026-09-11", - "last_updated": "2026-09-11", + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-07-28", + "last_updated": "2025-07-28", "type": "chat" }, { - "id": "k3", - "name": "Kimi K3", - "display_name": "Kimi K3", + "id": "gemini-3.0-pro-preview", + "name": "Gemini 3.0 Pro Preview", + "display_name": "Gemini 3.0 Pro Preview", "modalities": { "input": [ "text", "image", - "video" + "video", + "pdf", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 1000000, + "output": 64000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -276908,45 +272379,44 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "low", + "high" + ], "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "none", - "low", - "high", - "max" + "thought_signatures" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-16", + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2025-11-18", + "last_updated": "2025-11-18", "type": "chat" }, { - "id": "kimi-for-coding-highspeed", - "name": "Kimi For Coding HighSpeed", - "display_name": "Kimi For Coding HighSpeed", + "id": "deepseek-r1", + "name": "DeepSeek-R1", + "display_name": "DeepSeek-R1", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 128000, + "output": 32000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -276963,33 +272433,33 @@ ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-06-12", - "last_updated": "2026-06-12", + "knowledge": "2024-07", + "release_date": "2025-01-20", + "last_updated": "2025-05-29", "type": "chat" }, { - "id": "k3.1-pro-highspeed", - "name": "Kimi K3.1 Pro Highspeed", - "display_name": "Kimi K3.1 Pro Highspeed", + "id": "gemini-3.0-pro-image-preview", + "name": "Gemini 3.0 Pro Image Preview", + "display_name": "Gemini 3.0 Pro Image Preview", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ - "text" + "text", + "image" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 32768, + "output": 8192 }, - "temperature": false, - "tool_call": true, + "temperature": true, + "tool_call": false, "reasoning": { "supported": true, "default": true @@ -276997,29 +272467,30 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "low", + "high" + ], "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "low", - "high", - "max" + "thought_signatures" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-10-23", - "last_updated": "2026-10-23", - "type": "chat" + "knowledge": "2025-01", + "release_date": "2025-11-20", + "last_updated": "2025-11-20" }, { - "id": "k3-256k", - "name": "Kimi K3-256K", - "display_name": "Kimi K3-256K", + "id": "qwen3.5-397b-a17b", + "name": "Qwen3.5 397B A17B", + "display_name": "Qwen3.5 397B A17B", "modalities": { "input": [ "text", @@ -277030,10 +272501,10 @@ ] }, "limit": { - "context": 262144, - "output": 131072 + "context": 256000, + "output": 64000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -277047,45 +272518,34 @@ "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "effort_options": [ - "none", - "low", - "high", - "max" ] } }, "attachment": true, "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-16", + "release_date": "2026-02-15", + "last_updated": "2026-02-15", "type": "chat" - } - ] - }, - "cloudferro-sherlock": { - "id": "cloudferro-sherlock", - "name": "CloudFerro Sherlock", - "display_name": "CloudFerro Sherlock", - "api": "https://api-sherlock.cloudferro.com/openai/v1/", - "doc": "https://docs.sherlock.cloudferro.com/", - "models": [ + }, { - "id": "MiniMaxAI/MiniMax-M2.5", - "name": "MiniMax-M2.5", - "display_name": "MiniMax-M2.5", + "id": "gemini-3.0-flash-preview", + "name": "Gemini 3.0 Flash Preview", + "display_name": "Gemini 3.0 Flash Preview", "modalities": { "input": [ - "text" + "text", + "image", + "audio", + "video", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 196000, - "output": 16000 + "context": 1000000, + "output": 64000 }, "temperature": true, "tool_call": true, @@ -277095,87 +272555,64 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", + "low", + "medium", + "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2026-01", - "release_date": "2026-02-12", - "last_updated": "2026-02-12", + "attachment": true, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2025-12-17", + "last_updated": "2025-12-17", "type": "chat" }, { - "id": "speakleash/Bielik-11B-v3.0-Instruct", - "name": "Bielik 11B v3.0 Instruct", - "display_name": "Bielik 11B v3.0 Instruct", + "id": "claude-4.1-opus", + "name": "Claude 4.1 Opus", + "display_name": "Claude 4.1 Opus", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 32000, + "context": 200000, "output": 32000 }, "temperature": true, "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-03", - "release_date": "2025-03-13", - "last_updated": "2025-03-13", - "type": "chat" - }, - { - "id": "openai/gpt-oss-120b", - "name": "OpenAI GPT OSS 120B", - "display_name": "OpenAI GPT OSS 120B", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 131000, - "output": 131000 - }, - "temperature": true, - "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "low", - "medium", - "high" - ] - } - }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-06", + "attachment": true, + "open_weights": false, + "knowledge": "2025-03-31", "release_date": "2025-08-05", "last_updated": "2025-08-05", "type": "chat" }, { - "id": "zai-org/GLM-5.3", - "name": "GLM-5.3", - "display_name": "GLM-5.3", + "id": "qwen-turbo", + "name": "Qwen-Turbo", + "display_name": "Qwen-Turbo", "modalities": { "input": [ "text" @@ -277185,8 +272622,8 @@ ] }, "limit": { - "context": 262144, - "output": 131072 + "context": 1000000, + "output": 4096 }, "temperature": true, "tool_call": true, @@ -277197,190 +272634,169 @@ "extra_capabilities": { "reasoning": { "supported": true, - "effort_options": [ - "low", - "high" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, "attachment": false, - "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "open_weights": false, + "knowledge": "2024-04", + "release_date": "2024-11-01", + "last_updated": "2025-04-28", "type": "chat" }, { - "id": "meta-llama/Llama-3.3-70B-Instruct", - "name": "Llama 3.3 70B Instruct", - "display_name": "Llama 3.3 70B Instruct", + "id": "gemini-2.5-flash-image", + "name": "Gemini 2.5 Flash Image", + "display_name": "Gemini 2.5 Flash Image", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ - "text" + "image" ] }, "limit": { - "context": 70000, - "output": 70000 + "context": 32768, + "output": 8192 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-10-09", - "release_date": "2024-12-06", - "last_updated": "2024-12-06", - "type": "chat" - } - ] - }, - "nan": { - "id": "nan", - "name": "NaN", - "display_name": "NaN", - "api": "https://api.nan.builders/v1", - "doc": "https://nan.builders/docs/models", - "models": [ + "attachment": true, + "open_weights": false, + "knowledge": "2024-06", + "release_date": "2025-08-26", + "last_updated": "2025-08-26" + }, { - "id": "deepseek-v4-flash", - "name": "DeepSeek V4.1 Flash", - "display_name": "DeepSeek V4.1 Flash", + "id": "deepseek-v3", + "name": "DeepSeek-V3", + "display_name": "DeepSeek-V3", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 128000, + "output": 16000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." - ] - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-09-10", - "last_updated": "2026-09-10", + "release_date": "2024-12-26", + "last_updated": "2024-12-26", "type": "chat" }, { - "id": "qwen-image-2.1", - "name": "Qwen-Image-2.1", - "display_name": "Qwen-Image-2.1", + "id": "qwen3-235b-a22b-instruct-2507", + "name": "Qwen3 235b A22B Instruct 2507", + "display_name": "Qwen3 235b A22B Instruct 2507", "modalities": { "input": [ "text" ], "output": [ - "image" + "text" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 262144, + "output": 64000 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": false }, "attachment": false, "open_weights": true, - "release_date": "2026-09-14", - "last_updated": "2026-09-21" + "release_date": "2025-07-21", + "last_updated": "2025-07-21", + "type": "chat" }, { - "id": "glm5.3-flash", - "name": "GLM-5.3-Flash", - "display_name": "GLM-5.3-Flash", + "id": "gemini-2.5-flash-lite", + "name": "Gemini 2.5 Flash Lite", + "display_name": "Gemini 2.5 Flash Lite", "modalities": { "input": [ "text", - "image" + "image", + "audio", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 1048576, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "minimal", - "low", - "medium", - "high", - "xhigh", - "max" + "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "default": -1, + "min": 512, + "max": 24576, + "auto": -1, + "unit": "tokens" + }, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2025-06-17", + "last_updated": "2025-06-17", "type": "chat" }, { - "id": "gemma4", - "name": "Gemma 4 26B A4B IT", - "display_name": "Gemma 4 26B A4B IT", + "id": "deepseek-r1-0528", + "name": "DeepSeek-R1-0528", + "display_name": "DeepSeek-R1-0528", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 128000, + "output": 32000 }, "temperature": true, "tool_call": true, @@ -277390,78 +272806,65 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "high", - "max" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "release_date": "2025-05-28", + "last_updated": "2025-05-28", "type": "chat" }, { - "id": "mimo-v2.6-flash", - "name": "MiMo-V2.6-Flash", - "display_name": "MiMo-V2.6-Flash", + "id": "claude-3.5-haiku", + "name": "Claude 3.5 Haiku", + "display_name": "Claude 3.5 Haiku", "modalities": { "input": [ "text", - "image", - "audio" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 200000, + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "high", - "max" - ] - } + "supported": false }, "attachment": true, - "open_weights": true, - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "open_weights": false, + "knowledge": "2024-07-31", + "release_date": "2024-10-22", + "last_updated": "2024-10-22", "type": "chat" }, { - "id": "qwen3.8-flash", - "name": "Qwen3.8 Flash", - "display_name": "Qwen3.8 Flash", + "id": "qwen3-30b-a3b", + "name": "Qwen3 30B A3B", + "display_name": "Qwen3 30B A3B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 40000, + "output": 4096 }, "temperature": true, "tool_call": true, @@ -277472,27 +272875,24 @@ "extra_capabilities": { "reasoning": { "supported": true, - "effort_options": [ - "none", - "minimal", - "low", - "medium", - "high", - "xhigh", - "max" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, - "attachment": true, - "open_weights": false, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", + "attachment": false, + "open_weights": true, + "release_date": "2025-04-28", + "last_updated": "2025-04-28", "type": "chat" }, { - "id": "glm5.3", - "name": "GLM-5.3", - "display_name": "GLM-5.3", + "id": "deepseek-v3.1", + "name": "DeepSeek-V3.1", + "display_name": "DeepSeek-V3.1", "modalities": { "input": [ "text" @@ -277502,8 +272902,8 @@ ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 128000, + "output": 32000 }, "temperature": true, "tool_call": true, @@ -277511,28 +272911,16 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "minimal", - "low", - "medium", - "high", - "xhigh", - "max" - ] - } - }, "attachment": false, "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "release_date": "2025-08-21", + "last_updated": "2025-08-21", "type": "chat" }, { - "id": "qwen3.6", - "name": "Qwen3.6 35B-A3B", - "display_name": "Qwen3.6 35B-A3B", + "id": "claude-3.7-sonnet", + "name": "Claude 3.7 Sonnet", + "display_name": "Claude 3.7 Sonnet", "modalities": { "input": [ "text", @@ -277543,45 +272931,46 @@ ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 200000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "high", - "max" + "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": false, + "summaries": false, + "visibility": "full", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Anthropic uses thinking budget tokens" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-04-17", - "last_updated": "2026-04-17", + "open_weights": false, + "knowledge": "2024-10-31", + "release_date": "2025-02-19", + "last_updated": "2025-02-19", "type": "chat" - } - ] - }, - "clarifai": { - "id": "clarifai", - "name": "Clarifai", - "display_name": "Clarifai", - "api": "https://api.clarifai.com/v2/ext/openai/v1", - "doc": "https://docs.clarifai.com/compute/inference/", - "models": [ + }, { - "id": "moonshotai/chat-completion/models/Kimi-K2_6", - "name": "Kimi K2.6", - "display_name": "Kimi K2.6", + "id": "claude-4.5-opus", + "name": "Claude 4.5 Opus", + "display_name": "Claude 4.5 Opus", "modalities": { "input": [ "text", @@ -277592,8 +272981,8 @@ ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 200000, + "output": 200000 }, "temperature": true, "tool_call": true, @@ -277601,28 +272990,17 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-20", - "last_updated": "2026-04-20", + "open_weights": false, + "knowledge": "2025-05", + "release_date": "2025-11-24", + "last_updated": "2025-11-24", "type": "chat" }, { - "id": "openai/chat-completion/models/gpt-oss-120b-high-throughput", - "name": "GPT OSS 120B High Throughput", - "display_name": "GPT OSS 120B High Throughput", + "id": "doubao-1.5-pro-32k", + "name": "Doubao 1.5 Pro 32k", + "display_name": "Doubao 1.5 Pro 32k", "modalities": { "input": [ "text" @@ -277632,35 +273010,24 @@ ] }, "limit": { - "context": 131072, - "output": 16384 + "context": 128000, + "output": 12000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high" - ] - } + "supported": false }, "attachment": false, - "open_weights": true, - "knowledge": "2024-06", + "open_weights": false, "release_date": "2025-08-05", "last_updated": "2025-08-05", "type": "chat" }, { - "id": "openai/chat-completion/models/gpt-oss-20b", - "name": "GPT OSS 20B", - "display_name": "GPT OSS 20B", + "id": "MiniMax-M1", + "name": "MiniMax M1", + "display_name": "MiniMax M1", "modalities": { "input": [ "text" @@ -277670,8 +273037,8 @@ ] }, "limit": { - "context": 131072, - "output": 16384 + "context": 1000000, + "output": 80000 }, "temperature": true, "tool_call": true, @@ -277679,27 +273046,16 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "low", - "medium", - "high" - ] - } - }, "attachment": false, "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "release_date": "2025-06-17", + "last_updated": "2025-06-17", "type": "chat" }, { - "id": "deepseek-ai/deepseek-ocr/models/DeepSeek-OCR", - "name": "DeepSeek OCR", - "display_name": "DeepSeek OCR", + "id": "stepfun-ai/gelab-zero-4b-preview", + "name": "Stepfun-Ai/Gelab Zero 4b Preview", + "display_name": "Stepfun-Ai/Gelab Zero 4b Preview", "modalities": { "input": [ "text", @@ -277711,23 +273067,63 @@ }, "limit": { "context": 8192, - "output": 8192 + "output": 4096 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, "attachment": true, + "open_weights": false, + "release_date": "2025-12-23", + "last_updated": "2025-12-23", + "type": "chat" + }, + { + "id": "moonshotai/kimi-k2-thinking", + "name": "Kimi K2 Thinking", + "display_name": "Kimi K2 Thinking", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 256000, + "output": 100000 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, "open_weights": true, - "release_date": "2025-10-20", - "last_updated": "2026-02-25", + "knowledge": "2024-08", + "release_date": "2025-11-06", + "last_updated": "2025-11-06", "type": "chat" }, { - "id": "qwen/qwenCoder/models/Qwen3-Coder-30B-A3B-Instruct", - "name": "Qwen3 Coder 30B A3B Instruct", - "display_name": "Qwen3 Coder 30B A3B Instruct", + "id": "moonshotai/kimi-k2-0905", + "name": "Kimi K2 0905", + "display_name": "Kimi K2 0905", "modalities": { "input": [ "text" @@ -277737,8 +273133,8 @@ ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 256000, + "output": 100000 }, "temperature": true, "tool_call": true, @@ -277747,26 +273143,27 @@ }, "attachment": false, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-07-31", - "last_updated": "2025-07-31", + "release_date": "2025-09-05", + "last_updated": "2025-09-05", "type": "chat" }, { - "id": "qwen/qwenLM/models/Qwen3-30B-A3B-Thinking-2507", - "name": "Qwen3 30B A3B Thinking 2507", - "display_name": "Qwen3 30B A3B Thinking 2507", + "id": "moonshotai/kimi-k2.5", + "name": "Moonshotai/Kimi-K2.5", + "display_name": "Moonshotai/Kimi-K2.5", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 131072 + "context": 256000, + "output": 256000 }, "temperature": true, "tool_call": true, @@ -277785,16 +273182,17 @@ ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2025-07-31", - "last_updated": "2026-02-25", + "knowledge": "2025-01", + "release_date": "2026-01-27", + "last_updated": "2026-01-27", "type": "chat" }, { - "id": "qwen/qwenLM/models/Qwen3-30B-A3B-Instruct-2507", - "name": "Qwen3 30B A3B Instruct 2507", - "display_name": "Qwen3 30B A3B Instruct 2507", + "id": "deepseek/deepseek-v3.2-exp-thinking", + "name": "DeepSeek/DeepSeek-V3.2-Exp-Thinking", + "display_name": "DeepSeek/DeepSeek-V3.2-Exp-Thinking", "modalities": { "input": [ "text" @@ -277804,24 +273202,25 @@ ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 128000, + "output": 32000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": false, - "open_weights": true, - "release_date": "2025-07-28", - "last_updated": "2025-07-28", + "open_weights": false, + "release_date": "2025-09-29", + "last_updated": "2025-09-29", "type": "chat" }, { - "id": "minimaxai/chat-completion/models/MiniMax-M2_5-high-throughput", - "name": "MiniMax-M2.5 High Throughput", - "display_name": "MiniMax-M2.5 High Throughput", + "id": "deepseek/deepseek-v3.2-exp", + "name": "DeepSeek/DeepSeek-V3.2-Exp", + "display_name": "DeepSeek/DeepSeek-V3.2-Exp", "modalities": { "input": [ "text" @@ -277831,25 +273230,24 @@ ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 128000, + "output": 32000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, - "open_weights": true, - "release_date": "2026-02-12", - "last_updated": "2026-02-12", + "open_weights": false, + "release_date": "2025-09-29", + "last_updated": "2025-09-29", "type": "chat" }, { - "id": "arcee_ai/AFM/models/trinity-mini", - "name": "Trinity Mini", - "display_name": "Trinity Mini", + "id": "deepseek/deepseek-v3.1-terminus", + "name": "DeepSeek/DeepSeek-V3.1-Terminus", + "display_name": "DeepSeek/DeepSeek-V3.1-Terminus", "modalities": { "input": [ "text" @@ -277859,38 +273257,35 @@ ] }, "limit": { - "context": 131072, - "output": 131072 + "context": 128000, + "output": 32000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, - "open_weights": true, - "knowledge": "2024-10", - "release_date": "2025-12-01", - "last_updated": "2026-05-28", + "open_weights": false, + "release_date": "2025-09-22", + "last_updated": "2025-09-22", "type": "chat" }, { - "id": "mistralai/completion/models/Ministral-3-14B-Reasoning-2512", - "name": "Ministral 3 14B Reasoning 2512", - "display_name": "Ministral 3 14B Reasoning 2512", + "id": "deepseek/deepseek-v3.2-251201", + "name": "Deepseek/DeepSeek-V3.2", + "display_name": "Deepseek/DeepSeek-V3.2", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 128000, + "output": 32000 }, "temperature": true, "tool_call": true, @@ -277898,29 +273293,28 @@ "supported": true, "default": true }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2025-12", + "knowledge": "2024-07", "release_date": "2025-12-01", - "last_updated": "2025-12-12", + "last_updated": "2025-12-01", "type": "chat" }, { - "id": "mistralai/completion/models/Ministral-3-3B-Reasoning-2512", - "name": "Ministral 3 3B Reasoning 2512", - "display_name": "Ministral 3 3B Reasoning 2512", + "id": "deepseek/deepseek-v3.1-terminus-thinking", + "name": "DeepSeek/DeepSeek-V3.1-Terminus-Thinking", + "display_name": "DeepSeek/DeepSeek-V3.1-Terminus-Thinking", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 128000, + "output": 32000 }, "temperature": true, "tool_call": true, @@ -277928,54 +273322,44 @@ "supported": true, "default": true }, - "attachment": true, - "open_weights": true, - "release_date": "2025-12", - "last_updated": "2026-02-25", + "attachment": false, + "open_weights": false, + "release_date": "2025-09-22", + "last_updated": "2025-09-22", "type": "chat" }, { - "id": "clarifai/main/models/mm-poly-8b", - "name": "MM Poly 8B", - "display_name": "MM Poly 8B", + "id": "deepseek/deepseek-math-v2", + "name": "Deepseek/Deepseek-Math-V2", + "display_name": "Deepseek/Deepseek-Math-V2", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 32768, - "output": 4096 + "context": 160000, + "output": 160000 }, "temperature": true, "tool_call": false, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2025-06", - "last_updated": "2026-02-25", + "release_date": "2025-12-04", + "last_updated": "2025-12-04", "type": "chat" - } - ] - }, - "mixlayer": { - "id": "mixlayer", - "name": "Mixlayer", - "display_name": "Mixlayer", - "api": "https://models.mixlayer.ai/v1", - "doc": "https://docs.mixlayer.com", - "models": [ + }, { - "id": "qwen/qwen3.5-397b-a17b", - "name": "Qwen3.5 397B A17B", - "display_name": "Qwen3.5 397B A17B", + "id": "openai/gpt-5", + "name": "OpenAI/GPT-5", + "display_name": "OpenAI/GPT-5", "modalities": { "input": [ "text" @@ -277985,8 +273369,8 @@ ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 400000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -277997,63 +273381,87 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "minimal", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": false, - "open_weights": true, - "release_date": "2026-02-15", - "last_updated": "2026-02-15", + "open_weights": false, + "knowledge": "2024-09-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "qwen/qwen3.5-35b-a3b", - "name": "Qwen3.5 35B A3B", - "display_name": "Qwen3.5 35B A3B", + "id": "openai/gpt-5.2", + "name": "OpenAI/GPT-5.2", + "display_name": "OpenAI/GPT-5.2", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 400000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-02-23", - "last_updated": "2026-02-23", + "attachment": true, + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2025-12-11", + "last_updated": "2025-12-11", "type": "chat" }, { - "id": "qwen/qwen3.5-27b", - "name": "Qwen3.5 27B", - "display_name": "Qwen3.5 27B", + "id": "z-ai/glm-4.6", + "name": "Z-AI/GLM 4.6", + "display_name": "Z-AI/GLM 4.6", "modalities": { "input": [ "text" @@ -278063,8 +273471,8 @@ ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 200000, + "output": 200000 }, "temperature": true, "tool_call": true, @@ -278074,64 +273482,48 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, "attachment": false, "open_weights": true, - "release_date": "2026-02-23", - "last_updated": "2026-02-23", + "knowledge": "2025-04", + "release_date": "2025-09-30", + "last_updated": "2025-09-30", "type": "chat" }, { - "id": "qwen/qwen3.5-9b", - "name": "Qwen3.5 9B", - "display_name": "Qwen3.5 9B", + "id": "z-ai/autoglm-phone-9b", + "name": "Z-Ai/Autoglm Phone 9b", + "display_name": "Z-Ai/Autoglm Phone 9b", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 12800, + "output": 4096 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, - "attachment": false, - "open_weights": true, - "release_date": "2026-02-23", - "last_updated": "2026-02-23", + "attachment": true, + "open_weights": false, + "release_date": "2025-12-23", + "last_updated": "2025-12-23", "type": "chat" }, { - "id": "qwen/qwen3.5-122b-a10b", - "name": "Qwen3.5 122B A10B", - "display_name": "Qwen3.5 122B A10B", + "id": "z-ai/glm-5", + "name": "Z-Ai/GLM 5", + "display_name": "Z-Ai/GLM 5", "modalities": { "input": [ "text" @@ -278141,8 +273533,8 @@ ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 200000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -278163,23 +273555,14 @@ }, "attachment": false, "open_weights": true, - "release_date": "2026-02-23", - "last_updated": "2026-02-23", + "release_date": "2026-02-12", + "last_updated": "2026-02-12", "type": "chat" - } - ] - }, - "zenifra": { - "id": "zenifra", - "name": "Zenifra", - "display_name": "Zenifra", - "api": "https://ai.zenifra.com/v1", - "doc": "https://docs.zenifra.com", - "models": [ + }, { - "id": "alibaba/qwen3.6-35b-a3b", - "name": "Qwen3.6 35B-A3B", - "display_name": "Qwen3.6 35B-A3B", + "id": "z-ai/glm-4.7", + "name": "Z-Ai/GLM 4.7", + "display_name": "Z-Ai/GLM 4.7", "modalities": { "input": [ "text" @@ -278189,8 +273572,8 @@ ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 200000, + "output": 200000 }, "temperature": true, "tool_call": true, @@ -278211,37 +273594,26 @@ }, "attachment": false, "open_weights": true, - "release_date": "2026-04-17", - "last_updated": "2026-04-17", + "knowledge": "2025-04", + "release_date": "2025-12-22", + "last_updated": "2025-12-22", "type": "chat" - } - ] - }, - "gmicloud": { - "id": "gmicloud", - "name": "GMI Cloud", - "display_name": "GMI Cloud", - "api": "https://api.gmi-serving.com/v1", - "doc": "https://docs.gmicloud.ai/inference-engine/api-reference/llm-api-reference", - "models": [ + }, { - "id": "Qwen/Qwen3.8-Max", - "name": "Qwen3.8 Max", - "display_name": "Qwen3.8 Max", + "id": "meituan/longcat-flash-lite", + "name": "Meituan/Longcat-Flash-Lite", + "display_name": "Meituan/Longcat-Flash-Lite", "modalities": { "input": [ - "text", - "image", - "video", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 131072 + "context": 256000, + "output": 320000 }, "temperature": true, "tool_call": true, @@ -278249,56 +273621,43 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2026-08-03", - "last_updated": "2026-08-03", + "release_date": "2026-02-06", + "last_updated": "2026-02-06", "type": "chat" }, { - "id": "Qwen/Qwen3.8-Flash", - "name": "Qwen3.8 Flash", - "display_name": "Qwen3.8 Flash", + "id": "meituan/longcat-flash-chat", + "name": "Meituan/Longcat-Flash-Chat", + "display_name": "Meituan/Longcat-Flash-Chat", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048575, + "context": 131072, "output": 131072 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", + "release_date": "2025-11-05", + "last_updated": "2025-11-05", "type": "chat" }, { - "id": "Qwen/Qwen3.7-Max", - "name": "Qwen3.7 Max", - "display_name": "Qwen3.7 Max", + "id": "stepfun/step-3.5-flash", + "name": "Stepfun/Step-3.5 Flash", + "display_name": "Stepfun/Step-3.5 Flash", "modalities": { "input": [ "text" @@ -278308,30 +273667,25 @@ ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 64000, + "output": 4096 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, "attachment": false, - "open_weights": false, - "release_date": "2026-05-21", - "last_updated": "2026-05-21", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-01-29", + "last_updated": "2026-02-13", "type": "chat" }, { - "id": "MiniMaxAI/MiniMax-M2.7", - "name": "MiniMax-M2.7", - "display_name": "MiniMax-M2.7", + "id": "minimax/minimax-m2.5", + "name": "Minimax/Minimax-M2.5", + "display_name": "Minimax/Minimax-M2.5", "modalities": { "input": [ "text" @@ -278341,8 +273695,8 @@ ] }, "limit": { - "context": 196608, - "output": 131072 + "context": 204800, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -278352,38 +273706,30 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, "attachment": false, "open_weights": true, - "release_date": "2026-03-18", - "last_updated": "2026-03-18", + "release_date": "2026-02-12", + "last_updated": "2026-02-12", "type": "chat" }, { - "id": "MiniMaxAI/MiniMax-M3", - "name": "MiniMax-M3", - "display_name": "MiniMax-M3", + "id": "minimax/minimax-m2.5-highspeed", + "name": "Minimax/Minimax-M2.5 Highspeed", + "display_name": "Minimax/Minimax-M2.5 Highspeed", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 512000 + "context": 204800, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -278396,16 +273742,16 @@ "supported": true } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-06-01", - "last_updated": "2026-06-01", + "release_date": "2026-02-13", + "last_updated": "2026-02-13", "type": "chat" }, { - "id": "moonshotai/Kimi-K2.6", - "name": "Kimi K2.6", - "display_name": "Kimi K2.6", + "id": "minimax/minimax-m2.1", + "name": "Minimax/Minimax-M2.1", + "display_name": "Minimax/Minimax-M2.1", "modalities": { "input": [ "text" @@ -278415,8 +273761,8 @@ ] }, "limit": { - "context": 65536, - "output": 65536 + "context": 204800, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -278426,26 +273772,19 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, "attachment": false, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-20", - "last_updated": "2026-04-20", + "release_date": "2025-12-23", + "last_updated": "2025-12-23", "type": "chat" }, { - "id": "moonshotai/kimi-k2.7-code-highspeed", - "name": "Kimi K2.7 Code Highspeed", - "display_name": "Kimi K2.7 Code Highspeed", + "id": "minimax/minimax-m2", + "name": "Minimax/Minimax-M2", + "display_name": "Minimax/Minimax-M2", "modalities": { "input": [ "text" @@ -278455,143 +273794,97 @@ ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 200000, + "output": 128000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, "attachment": false, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-06-12", - "last_updated": "2026-06-12", + "release_date": "2025-10-27", + "last_updated": "2025-10-27", "type": "chat" }, { - "id": "openai/gpt-5.5", - "name": "GPT-5.5", - "display_name": "GPT-5.5", + "id": "x-ai/grok-4-fast-non-reasoning", + "name": "X-Ai/Grok-4-Fast-Non-Reasoning", + "display_name": "X-Ai/Grok-4-Fast-Non-Reasoning", "modalities": { "input": [ "text", "image", - "pdf" + "audio", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 2000000, + "output": 2000000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2025-12-01", - "release_date": "2026-04-23", - "last_updated": "2026-04-23", + "release_date": "2025-12-18", + "last_updated": "2025-12-18", "type": "chat" }, { - "id": "zai-org/GLM-5.2-FP8", - "name": "GLM-5.2", - "display_name": "GLM-5.2", + "id": "x-ai/grok-4.1-fast-non-reasoning", + "name": "X-Ai/Grok 4.1 Fast Non Reasoning", + "display_name": "X-Ai/Grok 4.1 Fast Non Reasoning", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 2000000, + "output": 2000000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "high", - "max" - ] - } + "supported": false }, - "attachment": false, - "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "attachment": true, + "open_weights": false, + "release_date": "2025-11-19", + "last_updated": "2025-11-19", "type": "chat" }, { - "id": "zai-org/GLM-5.1-FP8", - "name": "GLM-5.1", - "display_name": "GLM-5.1", + "id": "x-ai/grok-4-fast", + "name": "x-AI/Grok-4-Fast", + "display_name": "x-AI/Grok-4-Fast", "modalities": { "input": [ - "text" + "text", + "image", + "audio", + "video" ], "output": [ "text" ] }, "limit": { - "context": 202752, - "output": 131072 + "context": 2000000, + "output": 2000000 }, "temperature": true, "tool_call": true, @@ -278599,38 +273892,59 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "attachment": true, + "open_weights": false, + "release_date": "2025-09-20", + "last_updated": "2025-09-20", + "type": "chat" + }, + { + "id": "x-ai/grok-4-fast-reasoning", + "name": "X-Ai/Grok-4-Fast-Reasoning", + "display_name": "X-Ai/Grok-4-Fast-Reasoning", + "modalities": { + "input": [ + "text", + "image", + "audio", + "video" + ], + "output": [ + "text" + ] }, - "attachment": false, - "open_weights": true, - "release_date": "2026-04-07", - "last_updated": "2026-04-07", + "limit": { + "context": 2000000, + "output": 2000000 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "attachment": true, + "open_weights": false, + "release_date": "2025-12-18", + "last_updated": "2025-12-18", "type": "chat" }, { - "id": "zai-org/GLM-5-FP8", - "name": "GLM-5", - "display_name": "GLM-5", + "id": "x-ai/grok-4.1-fast-reasoning", + "name": "X-Ai/Grok 4.1 Fast Reasoning", + "display_name": "X-Ai/Grok 4.1 Fast Reasoning", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 202752, - "output": 131072 + "context": 20000000, + "output": 2000000 }, "temperature": true, "tool_call": true, @@ -278638,27 +273952,16 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, - "attachment": false, - "open_weights": true, - "release_date": "2026-02-12", - "last_updated": "2026-02-12", + "attachment": true, + "open_weights": false, + "release_date": "2025-11-19", + "last_updated": "2025-11-19", "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-V4-Flash", - "name": "DeepSeek V4 Flash", - "display_name": "DeepSeek V4 Flash", + "id": "x-ai/grok-4.1-fast", + "name": "x-AI/Grok-4.1-Fast", + "display_name": "x-AI/Grok-4.1-Fast", "modalities": { "input": [ "text" @@ -278668,8 +273971,8 @@ ] }, "limit": { - "context": 1048575, - "output": 384000 + "context": 2000000, + "output": 2000000 }, "temperature": true, "tool_call": true, @@ -278677,39 +273980,16 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." - ] - } - }, "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "open_weights": false, + "release_date": "2025-11-20", + "last_updated": "2025-11-20", "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-V4-Pro", - "name": "DeepSeek V4 Pro", - "display_name": "DeepSeek V4 Pro", + "id": "x-ai/grok-code-fast-1", + "name": "x-AI/Grok-Code-Fast 1", + "display_name": "x-AI/Grok-Code-Fast 1", "modalities": { "input": [ "text" @@ -278719,8 +273999,8 @@ ] }, "limit": { - "context": 1048576, - "output": 384000 + "context": 256000, + "output": 10000 }, "temperature": true, "tool_call": true, @@ -278730,60 +274010,52 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." - ] + "supported": true } }, "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "open_weights": false, + "release_date": "2025-09-02", + "last_updated": "2025-09-02", "type": "chat" - }, + } + ] + }, + "pioneer": { + "id": "pioneer", + "name": "Pioneer", + "display_name": "Pioneer", + "api": "https://api.fastino.ai/v1", + "doc": "https://agent.pioneer.ai/llms.txt", + "models": [ { - "id": "anthropic/claude-opus-4.7", - "name": "Claude Opus 4.7", - "display_name": "Claude Opus 4.7", + "id": "claude-fable-5", + "name": "Claude Fable 5", + "display_name": "Claude Fable 5", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 409600, + "context": 1000000, "output": 128000 }, "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, + "default_enabled": true, "mode": "effort", "effort": "high", "effort_options": [ @@ -278795,40 +274067,41 @@ ], "interleaved": true, "summaries": true, - "visibility": "omitted", + "visibility": "summary", "continuation": [ "thinking_blocks" ], "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." + "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", + "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", + "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." ] } }, "attachment": true, "open_weights": false, "knowledge": "2026-01-31", - "release_date": "2026-04-16", - "last_updated": "2026-04-16", + "release_date": "2026-06-09", + "last_updated": "2026-06-09", "type": "chat" }, { - "id": "anthropic/claude-opus-4.6", - "name": "Claude Opus 4.6", - "display_name": "Claude Opus 4.6", + "id": "claude-haiku-4-5", + "name": "Claude Haiku 4.5 (latest)", + "display_name": "Claude Haiku 4.5 (latest)", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 409600, - "output": 128000 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, @@ -278840,18 +274113,11 @@ "reasoning": { "supported": true, "default_enabled": false, - "mode": "mixed", + "mode": "budget", "budget": { "min": 1024, "unit": "tokens" }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "max" - ], "interleaved": true, "summaries": true, "visibility": "summary", @@ -278859,22 +274125,22 @@ "thinking_blocks" ], "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-05-31", - "release_date": "2026-02-05", - "last_updated": "2026-03-13", + "knowledge": "2025-02-28", + "release_date": "2025-10-15", + "last_updated": "2025-10-15", "type": "chat" }, { - "id": "anthropic/claude-opus-4.8", - "name": "Claude Opus 4.8", - "display_name": "Claude Opus 4.8", + "id": "gpt-5.6-terra", + "name": "GPT-5.6 Terra", + "display_name": "GPT-5.6 Terra", "modalities": { "input": [ "text", @@ -278886,133 +274152,128 @@ ] }, "limit": { - "context": 1000000, + "context": 1050000, "output": 128000 }, "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, + "default_enabled": true, "mode": "effort", - "effort": "high", + "effort": "medium", "effort_options": [ + "none", "low", "medium", "high", "xhigh", "max" ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], "interleaved": true, "summaries": true, - "visibility": "omitted", + "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-01", - "release_date": "2026-05-28", - "last_updated": "2026-05-28", + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "anthropic/claude-sonnet-4.6", - "name": "Claude Sonnet 4.6", - "display_name": "Claude Sonnet 4.6", + "id": "gpt-5.6-sol", + "name": "GPT-5.6 Sol", + "display_name": "GPT-5.6 Sol", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 409600, - "output": 64000 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ + "none", "low", "medium", "high", + "xhigh", "max" ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-17", - "last_updated": "2026-03-13", + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" - } - ] - }, - "volcengine": { - "id": "volcengine", - "name": "Volcengine Ark", - "display_name": "Volcengine Ark", - "api": "https://ark.cn-beijing.volces.com/api/v3", - "doc": "https://www.volcengine.com/docs/82379/1330310", - "models": [ + }, { - "id": "doubao-seed-1-6-vision-250815", - "name": "Seed 1.6 Vision", - "display_name": "Seed 1.6 Vision", + "id": "gpt-5.6-luna", + "name": "GPT-5.6 Luna", + "display_name": "GPT-5.6 Luna", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 32000 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -279021,6 +274282,23 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], "interleaved": true, "summaries": true, "visibility": "summary", @@ -279031,17 +274309,20 @@ }, "attachment": true, "open_weights": false, - "release_date": "2025-08-15", - "last_updated": "2025-08-15", + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "deepseek-v4-flash-ga-260731", - "name": "DeepSeek V4 Flash 0731", - "display_name": "DeepSeek V4 Flash 0731", + "id": "claude-opus-5", + "name": "Claude Opus 5", + "display_name": "Claude Opus 5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" @@ -279049,9 +274330,9 @@ }, "limit": { "context": 1000000, - "output": 384000 + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -279067,39 +274348,40 @@ "thinking_blocks" ], "effort_options": [ - "minimal", "low", "medium", - "high" + "high", + "xhigh", + "max" ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-07-31", - "last_updated": "2026-07-31", + "attachment": true, + "open_weights": false, + "knowledge": "2026-05", + "release_date": "2026-07-24", + "last_updated": "2026-07-24", "type": "chat" }, { - "id": "doubao-seed-character-260628", - "name": "Seed Character", - "display_name": "Seed Character", + "id": "claude-opus-5-fast", + "name": "Claude Opus 5", + "display_name": "Claude Opus 5", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 256000 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -279115,37 +274397,40 @@ "thinking_blocks" ], "effort_options": [ - "minimal", "low", - "high" + "medium", + "high", + "xhigh", + "max" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-06-23", - "last_updated": "2026-06-23", + "knowledge": "2026-05", + "release_date": "2026-07-24", + "last_updated": "2026-07-24", "type": "chat" }, { - "id": "doubao-seed-2-0-code-preview-260215", - "name": "Seed 2.0 Code", - "display_name": "Seed 2.0 Code", + "id": "claude-sonnet-5", + "name": "Claude Sonnet 5", + "display_name": "Claude Sonnet 5", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 131072 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -279161,8 +274446,6 @@ "thinking_blocks" ], "effort_options": [ - "none", - "minimal", "low", "medium", "high", @@ -279173,29 +274456,30 @@ }, "attachment": true, "open_weights": false, - "release_date": "2026-02-14", - "last_updated": "2026-02-14", + "knowledge": "2026-01-31", + "release_date": "2026-06-30", + "last_updated": "2026-06-30", "type": "chat" }, { - "id": "doubao-seed-2-0-lite-260428", - "name": "Seed 2.0 Lite", - "display_name": "Seed 2.0 Lite", + "id": "gpt-5.5", + "name": "GPT-5.5", + "display_name": "GPT-5.5", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 131072 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -279204,33 +274488,40 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "effort_options": [ - "none", - "minimal", - "low", - "medium", - "high", - "xhigh", - "max" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-02-14", - "last_updated": "2026-02-14", + "knowledge": "2025-12-01", + "release_date": "2026-04-23", + "last_updated": "2026-04-23", "type": "chat" }, { - "id": "doubao-seed-2-0-pro-260215", - "name": "Seed 2.0 Pro", - "display_name": "Seed 2.0 Pro", + "id": "moonshotai/Kimi-K3-Fast", + "name": "Kimi K3", + "display_name": "Kimi K3", "modalities": { "input": [ "text", @@ -279242,8 +274533,8 @@ ] }, "limit": { - "context": 256000, - "output": 128000 + "context": 1000000, + "output": 131072 }, "temperature": false, "tool_call": true, @@ -279261,26 +274552,22 @@ "thinking_blocks" ], "effort_options": [ - "none", - "minimal", "low", - "medium", "high", - "xhigh", "max" ] } }, "attachment": true, - "open_weights": false, - "release_date": "2026-02-14", - "last_updated": "2026-02-14", + "open_weights": true, + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" }, { - "id": "doubao-seed-2-1-turbo-260628", - "name": "Seed 2.1 Turbo", - "display_name": "Seed 2.1 Turbo", + "id": "moonshotai/Kimi-K3", + "name": "Kimi K3", + "display_name": "Kimi K3", "modalities": { "input": [ "text", @@ -279292,10 +274579,10 @@ ] }, "limit": { - "context": 256000, - "output": 256000 + "context": 1000000, + "output": 131072 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -279311,38 +274598,35 @@ "thinking_blocks" ], "effort_options": [ - "none", - "minimal", "low", - "medium", "high", - "xhigh", "max" ] } }, "attachment": true, - "open_weights": false, - "release_date": "2026-06-23", - "last_updated": "2026-06-23", + "open_weights": true, + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" }, { - "id": "doubao-seed-1-8-251228", - "name": "Seed 1.8", - "display_name": "Seed 1.8", + "id": "nvidia/NVIDIA-Nemotron-3.5-Super-VL-120B-A12B-NVFP4", + "name": "Nemotron 3.5 Super VL 120B A12B", + "display_name": "Nemotron 3.5 Super VL 120B A12B", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 64000 + "context": 262144, + "output": 4096 }, "temperature": true, "tool_call": true, @@ -279360,39 +274644,34 @@ "thinking_blocks" ], "effort_options": [ - "none", - "minimal", "low", "medium", "high", - "xhigh", - "max" + "xhigh" ] } }, "attachment": true, - "open_weights": false, - "release_date": "2025-12-28", - "last_updated": "2025-12-28", + "open_weights": true, + "release_date": "2026-10-15", + "last_updated": "2026-10-15", "type": "chat" }, { - "id": "doubao-seed-2-0-mini-260428", - "name": "Seed 2.0 Mini", - "display_name": "Seed 2.0 Mini", + "id": "nvidia/NVIDIA-Nemotron-3.5-Lightning-30B-A3B-BF16", + "name": "Nemotron 3.5 Lightning 30B A3B", + "display_name": "Nemotron 3.5 Lightning 30B A3B", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 131072 + "context": 65536, + "output": 4096 }, "temperature": true, "tool_call": true, @@ -279410,26 +274689,24 @@ "thinking_blocks" ], "effort_options": [ - "none", - "minimal", "low", "medium", "high", - "xhigh", - "max" + "xhigh" ] } }, - "attachment": true, - "open_weights": false, - "release_date": "2026-02-14", - "last_updated": "2026-02-14", + "attachment": false, + "open_weights": true, + "knowledge": "2025-09", + "release_date": "2026-08-11", + "last_updated": "2026-08-11", "type": "chat" }, { - "id": "glm-5-2-260617", - "name": "GLM-5.2", - "display_name": "GLM-5.2", + "id": "fastino/gliner2-large-v1", + "name": "GLiNER2 Large", + "display_name": "GLiNER2 Large", "modalities": { "input": [ "text" @@ -279439,55 +274716,278 @@ ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 8192, + "output": 8192 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "minimal", - "low", - "medium", - "high" - ] - } + "attachment": false, + "open_weights": true, + "release_date": "2025-06-30", + "last_updated": "2025-06-30", + "type": "chat" + }, + { + "id": "fastino/gliner2-base-v1", + "name": "GLiNER2 Base", + "display_name": "GLiNER2 Base", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 2048, + "output": 2048 + }, + "temperature": true, + "tool_call": false, + "reasoning": { + "supported": false }, "attachment": false, "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "release_date": "2025-06-30", + "last_updated": "2025-06-30", "type": "chat" }, { - "id": "doubao-seed-1-6-251015", - "name": "Seed 1.6", - "display_name": "Seed 1.6", + "id": "fastino/gliner2-multi-large-v1", + "name": "GLiNER2 Multi Large", + "display_name": "GLiNER2 Multi Large", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 64000 + "context": 8192, + "output": 8192 + }, + "temperature": true, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "release_date": "2025-11-30", + "last_updated": "2025-11-30", + "type": "chat" + }, + { + "id": "fastino/gliner2-privacy-filter-PII-multi", + "name": "GLiNER2 Privacy Filter PII (Multi)", + "display_name": "GLiNER2 Privacy Filter PII (Multi)", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 8192, + "output": 8192 + }, + "temperature": true, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "release_date": "2026-04-30", + "last_updated": "2026-04-30", + "type": "chat" + }, + { + "id": "fastino/gliner2.5-multi-v1", + "name": "GLiNER 2.5 Multi", + "display_name": "GLiNER 2.5 Multi", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 4096, + "output": 4096 + }, + "temperature": true, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "release_date": "2026-08-24", + "last_updated": "2026-08-24", + "type": "chat" + }, + { + "id": "fastino/gliner2-multi-v1", + "name": "GLiNER2 Multi", + "display_name": "GLiNER2 Multi", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 8192, + "output": 8192 + }, + "temperature": true, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "release_date": "2025-11-30", + "last_updated": "2025-11-30", + "type": "chat" + }, + { + "id": "fastino/gliguard-LLMGuardrails-300M", + "name": "GLiGuard LLM Guardrails 300M", + "display_name": "GLiGuard LLM Guardrails 300M", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 8192, + "output": 8192 + }, + "temperature": true, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "release_date": "2026-04-30", + "last_updated": "2026-04-30", + "type": "chat" + }, + { + "id": "fastino/gliguard-PII-multi", + "name": "GLiNER2-Guardrails-PII-Multi", + "display_name": "GLiNER2-Guardrails-PII-Multi", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 8192, + "output": 8192 + }, + "temperature": true, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "release_date": "2026-07-08", + "last_updated": "2026-07-08", + "type": "chat" + }, + { + "id": "fastino/GLiNER-2.5-Decide", + "name": "GLiNER-2.5-Decide", + "display_name": "GLiNER-2.5-Decide", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 8192, + "output": 8192 + }, + "temperature": true, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "release_date": "2026-09-24", + "last_updated": "2026-09-24", + "type": "chat" + }, + { + "id": "fastino/gliner2.5-base-v1", + "name": "GLiNER 2.5 Base", + "display_name": "GLiNER 2.5 Base", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 4096, + "output": 4096 + }, + "temperature": true, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "release_date": "2026-08-24", + "last_updated": "2026-08-24", + "type": "chat" + }, + { + "id": "zai-org/GLM-5.2", + "name": "GLM-5.2", + "display_name": "GLM-5.2", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1040000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -279505,36 +275005,32 @@ "thinking_blocks" ], "effort_options": [ - "minimal", - "low", - "medium", - "high" + "high", + "max" ] } }, - "attachment": true, - "open_weights": false, - "release_date": "2025-10-15", - "last_updated": "2025-10-15", + "attachment": false, + "open_weights": true, + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "doubao-seed-2-1-pro-260628", - "name": "Seed 2.1 Pro", - "display_name": "Seed 2.1 Pro", + "id": "deepseek-ai/DeepSeek-V4-Flash", + "name": "DeepSeek V4 Flash", + "display_name": "DeepSeek V4 Flash", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 256000 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -279545,33 +275041,45 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "high", + "max" + ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" ], - "effort_options": [ - "none", - "minimal", - "low", - "medium", - "high", - "xhigh", - "max" + "notes": [ + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, - "attachment": true, - "open_weights": false, - "release_date": "2026-06-23", - "last_updated": "2026-06-23", + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" - }, + } + ] + }, + "aiand": { + "id": "aiand", + "name": "ai&", + "display_name": "ai&", + "api": "https://api.aiand.com/v1", + "doc": "https://docs.aiand.com/", + "models": [ { - "id": "deepseek-v4-pro-ga-260813", - "name": "DeepSeek V4 Pro 0813", - "display_name": "DeepSeek V4 Pro 0813", + "id": "motif-technologies/motif-3", + "name": "Motif 3", + "display_name": "Motif 3", "modalities": { "input": [ "text" @@ -279581,8 +275089,8 @@ ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, @@ -279600,36 +275108,34 @@ "thinking_blocks" ], "effort_options": [ - "minimal", - "low", - "medium", + "none", "high" ] } }, "attachment": false, "open_weights": true, - "release_date": "2026-08-13", - "last_updated": "2026-08-22", + "release_date": "2026-08-07", + "last_updated": "2026-08-07", "type": "chat" }, { - "id": "doubao-seed-1-6-flash-250828", - "name": "Seed 1.6 Flash", - "display_name": "Seed 1.6 Flash", + "id": "moonshotai/kimi-k3", + "name": "Kimi K3", + "display_name": "Kimi K3", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 32000 + "context": 1048576, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -279645,33 +275151,35 @@ "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "effort_options": [ + "low", + "high", + "max" ] } }, "attachment": true, - "open_weights": false, - "release_date": "2025-08-28", - "last_updated": "2025-08-28", + "open_weights": true, + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" }, { - "id": "glm-5-3-flash-260828", - "name": "GLM-5.3-Flash", - "display_name": "GLM-5.3-Flash", + "id": "openai/gpt-oss-120b", + "name": "GPT OSS 120B", + "display_name": "GPT OSS 120B", "modalities": { "input": [ - "text", - "image", - "video", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 131072, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -279690,34 +275198,33 @@ ], "effort_options": [ "low", - "high", - "max" + "medium", + "high" ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "doubao-seed-evolving", - "name": "Seed Evolving", - "display_name": "Seed Evolving", + "id": "zai-org/glm-5.3", + "name": "GLM-5.3", + "display_name": "GLM-5.3", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 256000 + "context": 1048576, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -279735,46 +275242,36 @@ "thinking_blocks" ], "effort_options": [ - "none", - "minimal", "low", - "medium", "high", - "xhigh", "max" ] } }, - "attachment": true, - "open_weights": false, - "release_date": "2026-06-23", - "last_updated": "2026-06-23", + "attachment": false, + "open_weights": true, + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" - } - ] - }, - "sensenova": { - "id": "sensenova", - "name": "SenseNova (China)", - "display_name": "SenseNova (China)", - "api": "https://token.sensenova.cn/v1", - "doc": "https://platform.sensenova.cn/docs", - "models": [ + }, { - "id": "deepseek-v4-flash", - "name": "DeepSeek V4 Flash", - "display_name": "DeepSeek V4 Flash", + "id": "zai-org/glm-5.3-flash", + "name": "GLM-5.3-Flash", + "display_name": "GLM-5.3-Flash", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 1048550, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -279785,48 +275282,42 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "high", - "max" - ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" ], - "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." + "effort_options": [ + "low", + "high", + "max" ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "release_date": "2026-08-26", + "last_updated": "2026-08-26", "type": "chat" }, { - "id": "sensenova-6.8-flash-lite", - "name": "SenseNova 6.8 Flash Lite", - "display_name": "SenseNova 6.8 Flash Lite", + "id": "deepseek-ai/deepseek-v4.1-flash", + "name": "DeepSeek V4.1 Flash", + "display_name": "DeepSeek V4.1 Flash", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 1048576, + "output": 384000 }, "temperature": true, "tool_call": true, @@ -279836,22 +275327,29 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ "none", - "low", - "medium", - "high" + "high", + "max" ] } }, "attachment": true, - "open_weights": false, - "release_date": "2026-08-11", - "last_updated": "2026-08-28", + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-09-10", + "last_updated": "2026-09-10", "type": "chat" }, { - "id": "deepseek-v4-pro", + "id": "deepseek-ai/deepseek-v4-pro", "name": "DeepSeek V4 Pro", "display_name": "DeepSeek V4 Pro", "modalities": { @@ -279864,7 +275362,7 @@ }, "limit": { "context": 1048576, - "output": 65536 + "output": 384000 }, "temperature": true, "tool_call": true, @@ -279896,28 +275394,31 @@ }, "attachment": false, "open_weights": true, - "release_date": "2026-08-13", - "last_updated": "2026-08-22", + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "kimi-k3", - "name": "Kimi K3", - "display_name": "Kimi K3", + "id": "google/gemma-4-31b-it", + "name": "Gemma 4 31B IT", + "display_name": "Gemma 4 31B IT", "modalities": { "input": [ "text", - "image" + "image", + "video", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 262144, + "output": 32768 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -279933,33 +275434,36 @@ "thinking_blocks" ], "effort_options": [ - "low", - "high", - "max" + "none", + "high" ] } }, "attachment": true, "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-16", + "knowledge": "2025-01", + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "glm-5.2", - "name": "GLM-5.2", - "display_name": "GLM-5.2", + "id": "qwen/qwen3.6-27b", + "name": "Qwen3.6 27B", + "display_name": "Qwen3.6 27B", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 262144, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -279982,28 +275486,30 @@ ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "release_date": "2026-04-22", + "last_updated": "2026-04-22", "type": "chat" }, { - "id": "deepseek-v4.1-flash", - "name": "DeepSeek V4.1 Flash", - "display_name": "DeepSeek V4.1 Flash", + "id": "qwen/qwen3.8-27b", + "name": "Qwen3.8 27B", + "display_name": "Qwen3.8 27B", "modalities": { "input": [ "text", - "image" + "image", + "video", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 262144, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -280023,45 +275529,43 @@ "effort_options": [ "none", "low", - "high", - "max" + "medium", + "xhigh" ] } }, "attachment": true, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-09-10", - "last_updated": "2026-09-10", + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" } ] }, - "longcat": { - "id": "longcat", - "name": "LongCat", - "display_name": "LongCat", - "api": "https://api.longcat.chat/openai", - "doc": "https://longcat.chat/platform/docs/", + "ovhcloud": { + "id": "ovhcloud", + "name": "OVHcloud AI Endpoints", + "display_name": "OVHcloud AI Endpoints", + "api": "https://oai.endpoints.kepler.ai.cloud.ovh.net/v1", + "doc": "https://www.ovhcloud.com/en/public-cloud/ai-endpoints/catalog//", "models": [ { - "id": "LongCat-2.5-Preview", - "name": "LongCat-2.5-Preview", - "display_name": "LongCat-2.5-Preview", + "id": "gpt-oss-20b", + "name": "gpt-oss-20b", + "display_name": "gpt-oss-20b", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 262144 + "context": 131072, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -280070,37 +275574,67 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "low", + "medium", + "high" ] } }, - "attachment": true, - "open_weights": false, - "release_date": "2026-09-25", - "last_updated": "2026-09-25", + "attachment": false, + "open_weights": true, + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "LongCat-2.0", - "name": "LongCat-2.0", - "display_name": "LongCat-2.0", + "id": "qwen2.5-vl-72b-instruct", + "name": "Qwen2.5-VL-72B-Instruct", + "display_name": "Qwen2.5-VL-72B-Instruct", "modalities": { "input": [ + "text", + "image" + ], + "output": [ "text" + ] + }, + "limit": { + "context": 32768, + "output": 32768 + }, + "temperature": true, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": true, + "knowledge": "2024-04", + "release_date": "2025-01-26", + "last_updated": "2025-01-26", + "type": "chat" + }, + { + "id": "qwen3.6-27b", + "name": "Qwen3.6-27B", + "display_name": "Qwen3.6-27B", + "modalities": { + "input": [ + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 262144, + "output": 262144 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -280114,84 +275648,66 @@ "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "effort_options": [ + "none", + "minimal", + "low", + "medium", + "high" ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-06-30", - "last_updated": "2026-06-30", + "release_date": "2026-04-22", + "last_updated": "2026-04-22", "type": "chat" - } - ] - }, - "databricks": { - "id": "databricks", - "name": "Databricks", - "display_name": "Databricks", - "api": "https://${DATABRICKS_HOST}/ai-gateway/mlflow/v1", - "doc": "https://docs.databricks.com/aws/en/machine-learning/foundation-models/", - "models": [ + }, { - "id": "databricks-gpt-5-6-sol", - "name": "GPT-5.6 Sol", - "display_name": "GPT-5.6 Sol", + "id": "meta-llama-3_3-70b-instruct", + "name": "Meta-Llama-3_3-70B-Instruct", + "display_name": "Meta-Llama-3_3-70B-Instruct", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 131072, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "max" - ] - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "attachment": false, + "open_weights": true, + "knowledge": "2023-12", + "release_date": "2024-12-06", + "last_updated": "2024-12-06", "type": "chat" }, { - "id": "databricks-gemini-3-1-pro", - "name": "Gemini 3.1 Pro Preview", - "display_name": "Gemini 3.1 Pro Preview", + "id": "qwen3.5-9b", + "name": "Qwen3.5-9B", + "display_name": "Qwen3.5-9B", "modalities": { "input": [ "text", - "image", - "video", - "audio", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, @@ -280201,8 +275717,15 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ - "minimal", + "none", "low", "medium", "high" @@ -280210,30 +275733,53 @@ } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-02-19", - "last_updated": "2026-02-19", + "open_weights": true, + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" }, { - "id": "databricks-gemini-3-5-flash", - "name": "Gemini 3.5 Flash", - "display_name": "Gemini 3.5 Flash", + "id": "qwen3guard-gen-0.6b", + "name": "Qwen3Guard-Gen-0.6B", + "display_name": "Qwen3Guard-Gen-0.6B", "modalities": { "input": [ - "text", - "image", - "video", - "audio" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 32768, + "output": 16384 + }, + "temperature": true, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "release_date": "2026-01-22", + "last_updated": "2026-01-22", + "type": "chat" + }, + { + "id": "gpt-oss-120b", + "name": "gpt-oss-120b", + "display_name": "gpt-oss-120b", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 131072, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -280243,65 +275789,80 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ - "minimal", "low", "medium", "high" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-05-19", - "last_updated": "2026-05-19", + "attachment": false, + "open_weights": true, + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "databricks-gpt-5-2", - "name": "GPT-5.2", - "display_name": "GPT-5.2", + "id": "mistral-nemo-instruct-2407", + "name": "Mistral-Nemo-Instruct-2407", + "display_name": "Mistral-Nemo-Instruct-2407", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 65536, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "high" - ] - } + "attachment": false, + "open_weights": true, + "knowledge": "2024-07", + "release_date": "2024-07-18", + "last_updated": "2024-07-18", + "type": "chat" + }, + { + "id": "qwen3guard-gen-8b", + "name": "Qwen3Guard-Gen-8B", + "display_name": "Qwen3Guard-Gen-8B", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2025-12-11", - "last_updated": "2025-12-11", + "limit": { + "context": 32768, + "output": 16384 + }, + "temperature": true, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "release_date": "2026-01-22", + "last_updated": "2026-01-22", "type": "chat" }, { - "id": "databricks-gpt-5-4-nano", - "name": "GPT-5.4 nano", - "display_name": "GPT-5.4 nano", + "id": "qwen3.5-397b-a17b", + "name": "Qwen3.5-397B-A17B", + "display_name": "Qwen3.5-397B-A17B", "modalities": { "input": [ "text", @@ -280312,8 +275873,8 @@ ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, @@ -280323,7 +275884,15 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ + "none", "low", "medium", "high" @@ -280331,31 +275900,27 @@ } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-17", - "last_updated": "2026-03-17", + "open_weights": true, + "release_date": "2026-02-15", + "last_updated": "2026-02-15", "type": "chat" }, { - "id": "databricks-gemini-3-1-flash-lite", - "name": "Gemini 3.1 Flash Lite Preview", - "display_name": "Gemini 3.1 Flash Lite Preview", + "id": "qwen3.8-27b", + "name": "Qwen3.8-27B", + "display_name": "Qwen3.8-27B", "modalities": { "input": [ "text", - "image", - "video", - "audio", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, @@ -280366,6 +275931,7 @@ "extra_capabilities": { "reasoning": { "effort_options": [ + "none", "minimal", "low", "medium", @@ -280374,64 +275940,66 @@ } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-03-03", - "last_updated": "2026-03-03", + "open_weights": true, + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "databricks-gemini-2-5-flash", - "name": "Gemini 2.5 Flash", - "display_name": "Gemini 2.5 Flash", + "id": "mistral-small-3.2-24b-instruct-2506", + "name": "Mistral-Small-3.2-24B-Instruct-2506", + "display_name": "Mistral-Small-3.2-24B-Instruct-2506", "modalities": { "input": [ - "text", "image", - "audio", - "video", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 131072, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-06-17", - "last_updated": "2025-06-17", + "open_weights": true, + "knowledge": "2023-10-31", + "release_date": "2025-06-20", + "last_updated": "2025-06-20", "type": "chat" - }, + } + ] + }, + "upstage": { + "id": "upstage", + "name": "Upstage", + "display_name": "Upstage", + "api": "https://api.upstage.ai/v1/solar", + "doc": "https://developers.upstage.ai/docs/apis/chat", + "models": [ { - "id": "databricks-gpt-5-5", - "name": "GPT-5.5", - "display_name": "GPT-5.5", + "id": "solar-pro3", + "name": "solar-pro3", + "display_name": "solar-pro3", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 131072, + "output": 8192 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -280446,32 +276014,28 @@ ] } }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-12-01", - "release_date": "2026-04-23", - "last_updated": "2026-04-23", + "knowledge": "2025-03", + "release_date": "2026-01-26", + "last_updated": "2026-03-23", "type": "chat" }, { - "id": "databricks-gemini-3-pro", - "name": "Gemini 3 Pro Preview", - "display_name": "Gemini 3 Pro Preview", + "id": "solar-pro4", + "name": "Solar Pro 4", + "display_name": "Solar Pro 4", "modalities": { "input": [ - "text", - "image", - "video", - "audio", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 524288, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -280482,139 +276046,146 @@ "extra_capabilities": { "reasoning": { "effort_options": [ + "none", + "minimal", "low", "medium", - "high" + "high", + "xhigh", + "max" ] } }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-11-18", - "last_updated": "2025-11-18", + "knowledge": "2026-02", + "release_date": "2026-08-06", + "last_updated": "2026-08-06", "type": "chat" }, { - "id": "databricks-claude-sonnet-4-5", - "name": "Claude Sonnet 4.5 (latest)", - "display_name": "Claude Sonnet 4.5 (latest)", + "id": "solar-pro2", + "name": "solar-pro2", + "display_name": "solar-pro2", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 65536, + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + "effort_options": [ + "minimal", + "high" ] } }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-07-31", - "release_date": "2025-09-29", - "last_updated": "2025-09-29", + "knowledge": "2025-03", + "release_date": "2025-05-20", + "last_updated": "2025-05-20", "type": "chat" }, { - "id": "databricks-claude-sonnet-4-6", - "name": "Claude Sonnet 4.6", - "display_name": "Claude Sonnet 4.6", + "id": "solar-mini", + "name": "solar-mini", + "display_name": "solar-mini", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 64000 + "context": 32768, + "output": 4096 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": false, + "knowledge": "2024-09", + "release_date": "2024-06-12", + "last_updated": "2025-04-22", + "type": "chat" + }, + { + "id": "solar-mini4", + "name": "Solar Mini 4", + "display_name": "Solar Mini 4", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 524288, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", "effort_options": [ + "none", + "minimal", "low", "medium", "high", + "xhigh", "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-17", - "last_updated": "2026-03-13", + "knowledge": "2026-02", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" - }, + } + ] + }, + "agentrouter": { + "id": "agentrouter", + "name": "AgentRouter", + "display_name": "AgentRouter", + "api": "https://agentrouter.org/v1", + "doc": "https://agentrouter.org/docs/opencode.html", + "models": [ { - "id": "databricks-claude-opus-4-6", - "name": "Claude Opus 4.6", - "display_name": "Claude Opus 4.6", + "id": "deepseek-v4-flash", + "name": "DeepSeek V4 Flash", + "display_name": "DeepSeek V4 Flash", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" @@ -280622,27 +276193,22 @@ }, "limit": { "context": 1000000, - "output": 128000 + "output": 384000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, + "default_enabled": true, + "mode": "effort", "effort": "high", "effort_options": [ "low", - "medium", "high", "max" ], @@ -280653,22 +276219,21 @@ "thinking_blocks" ], "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-05-31", - "release_date": "2026-02-05", - "last_updated": "2026-03-13", + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "databricks-gpt-5-4", - "name": "GPT-5.4", - "display_name": "GPT-5.4", + "id": "gpt-5.6-sol", + "name": "GPT-5.6 Sol", + "display_name": "GPT-5.6 Sol", "modalities": { "input": [ "text", @@ -280683,7 +276248,7 @@ "context": 1050000, "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -280691,24 +276256,38 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ], + "verbosity": "medium", + "verbosity_options": [ "low", "medium", "high" - ] + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-05", - "last_updated": "2026-03-05", + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "databricks-glm-5-2", - "name": "GLM-5.2", - "display_name": "GLM-5.2", + "id": "glm-5.3", + "name": "GLM-5.3", + "display_name": "GLM-5.3", "modalities": { "input": [ "text" @@ -280729,8 +276308,9 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ - "none", + "low", "high", "max" ] @@ -280738,20 +276318,18 @@ }, "attachment": false, "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "databricks-gemini-2-5-pro", - "name": "Gemini 2.5 Pro", - "display_name": "Gemini 2.5 Pro", + "id": "claude-opus-4-8", + "name": "Claude Opus 4.8", + "display_name": "Claude Opus 4.8", "modalities": { "input": [ "text", "image", - "audio", - "video", "pdf" ], "output": [ @@ -280759,96 +276337,52 @@ ] }, "limit": { - "context": 1048576, - "output": 65536 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-06-17", - "last_updated": "2025-06-17", - "type": "chat" - }, - { - "id": "databricks-kimi-k2-7-code", - "name": "Kimi K2.7 Code", - "display_name": "Kimi K2.7 Code", - "modalities": { - "input": [ - "text", - "image", - "video" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 262144, - "output": 262144 - }, - "temperature": false, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-06-12", - "last_updated": "2026-06-12", - "type": "chat" - }, - { - "id": "databricks-gpt-5-4-mini", - "name": "GPT-5.4 mini", - "display_name": "GPT-5.4 mini", - "modalities": { - "input": [ - "text", - "image" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 400000, + "context": 1000000, "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "high", "effort_options": [ "low", "medium", - "high" + "high", + "xhigh", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-17", - "last_updated": "2026-03-17", + "knowledge": "2026-01", + "release_date": "2026-05-28", + "last_updated": "2026-05-28", "type": "chat" }, { - "id": "databricks-gpt-5-6-terra", - "name": "GPT-5.6 Terra", - "display_name": "GPT-5.6 Terra", + "id": "claude-opus-5", + "name": "Claude Opus 5", + "display_name": "Claude Opus 5", "modalities": { "input": [ "text", @@ -280860,7 +276394,7 @@ ] }, "limit": { - "context": 1050000, + "context": 1000000, "output": 128000 }, "temperature": false, @@ -280871,76 +276405,62 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ "low", "medium", - "high" + "high", + "xhigh", + "max" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "knowledge": "2026-05", + "release_date": "2026-07-24", + "last_updated": "2026-07-24", "type": "chat" - }, + } + ] + }, + "cohere": { + "id": "cohere", + "name": "Cohere", + "display_name": "Cohere", + "doc": "https://docs.cohere.com/docs/models", + "models": [ { - "id": "databricks-claude-opus-4-1", - "name": "Claude Opus 4.1 (latest)", - "display_name": "Claude Opus 4.1 (latest)", + "id": "north-small-translate-09-2026", + "name": "North Small Translate", + "display_name": "North Small Translate", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 32000 + "context": 32768, + "output": 16000 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." - ] - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-03-31", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "attachment": false, + "open_weights": true, + "release_date": "2026-09-09", + "last_updated": "2026-09-09", "type": "chat" }, { - "id": "databricks-gpt-5-mini", - "name": "GPT-5 Mini", - "display_name": "GPT-5 Mini", + "id": "c4ai-aya-vision-32b", + "name": "Aya Vision 32B", + "display_name": "Aya Vision 32B", "modalities": { "input": [ "text", @@ -280951,93 +276471,52 @@ ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 16000, + "output": 4000 }, - "temperature": false, - "tool_call": true, + "temperature": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "minimal", - "low", - "medium", - "high" - ] - } + "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2024-05-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "open_weights": true, + "release_date": "2025-03-04", + "last_updated": "2025-05-14", "type": "chat" }, { - "id": "databricks-claude-opus-4-7", - "name": "Claude Opus 4.7", - "display_name": "Claude Opus 4.7", + "id": "command-a-03-2025", + "name": "Command A", + "display_name": "Command A", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 256000, + "output": 8000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." - ] - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-04-16", - "last_updated": "2026-04-16", + "attachment": false, + "open_weights": true, + "knowledge": "2024-06-01", + "release_date": "2025-03-13", + "last_updated": "2025-03-13", "type": "chat" }, { - "id": "databricks-gpt-oss-20b", - "name": "GPT OSS 20B", - "display_name": "GPT OSS 20B", + "id": "command-r7b-arabic-02-2025", + "name": "Command R7B Arabic", + "display_name": "Command R7B Arabic", "modalities": { "input": [ "text" @@ -281047,238 +276526,164 @@ ] }, "limit": { - "context": 131072, - "output": 25000 + "context": 128000, + "output": 4000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high" - ] - } + "supported": false }, "attachment": false, "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "knowledge": "2024-06-01", + "release_date": "2025-02-27", + "last_updated": "2025-02-27", "type": "chat" }, { - "id": "databricks-gemini-3-flash", - "name": "Gemini 3 Flash Preview", - "display_name": "Gemini 3 Flash Preview", + "id": "c4ai-aya-expanse-32b", + "name": "Aya Expanse 32B", + "display_name": "Aya Expanse 32B", "modalities": { "input": [ - "text", - "image", - "video", - "audio", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 128000, + "output": 4000 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "minimal", - "low", - "medium", - "high" - ] - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-12-17", - "last_updated": "2025-12-17", + "attachment": false, + "open_weights": true, + "release_date": "2024-10-24", + "last_updated": "2024-10-24", "type": "chat" }, { - "id": "databricks-gpt-5-1", - "name": "GPT-5.1", - "display_name": "GPT-5.1", + "id": "command-a-translate-08-2025", + "name": "Command A Translate", + "display_name": "Command A Translate", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 8000, + "output": 8000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "high" - ] - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-11-13", - "last_updated": "2025-11-13", + "attachment": false, + "open_weights": true, + "knowledge": "2024-06-01", + "release_date": "2025-08-28", + "last_updated": "2025-08-28", "type": "chat" }, { - "id": "databricks-gpt-5-nano", - "name": "GPT-5 Nano", - "display_name": "GPT-5 Nano", + "id": "command-a-reasoning-08-2025", + "name": "Command A Reasoning", + "display_name": "Command A Reasoning", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 256000, + "output": 32000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "minimal", - "low", - "medium", - "high" - ] - } - }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-05-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "attachment": false, + "open_weights": true, + "knowledge": "2024-06-01", + "release_date": "2025-08-21", + "last_updated": "2025-08-21", "type": "chat" }, { - "id": "databricks-gpt-5", - "name": "GPT-5", - "display_name": "GPT-5", + "id": "tiny-aya-earth", + "name": "Tiny Aya Earth", + "display_name": "Tiny Aya Earth", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 8000, + "output": 8000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "minimal", - "low", - "medium", - "high" - ] - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "attachment": false, + "open_weights": true, + "release_date": "2026-02-17", + "last_updated": "2026-02-17", "type": "chat" }, { - "id": "databricks-gpt-5-6-luna", - "name": "GPT-5.6 Luna", - "display_name": "GPT-5.6 Luna", + "id": "command-r-08-2024", + "name": "Command R", + "display_name": "Command R", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 128000, + "output": 4000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high" - ] - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "attachment": false, + "open_weights": true, + "knowledge": "2024-06-01", + "release_date": "2024-08-30", + "last_updated": "2024-08-30", "type": "chat" }, { - "id": "databricks-gpt-oss-120b", - "name": "GPT OSS 120B", - "display_name": "GPT OSS 120B", + "id": "tiny-aya-fire", + "name": "Tiny Aya Fire", + "display_name": "Tiny Aya Fire", "modalities": { "input": [ "text" @@ -281288,206 +276693,113 @@ ] }, "limit": { - "context": 131072, - "output": 25000 + "context": 8000, + "output": 8000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high" - ] - } + "supported": false }, "attachment": false, "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "release_date": "2026-02-17", + "last_updated": "2026-02-17", "type": "chat" }, { - "id": "databricks-claude-sonnet-4", - "name": "Claude Sonnet 4", - "display_name": "Claude Sonnet 4", + "id": "tiny-aya-water", + "name": "Tiny Aya Water", + "display_name": "Tiny Aya Water", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 8000, + "output": 8000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." - ] - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-03-31", - "release_date": "2025-05-22", - "last_updated": "2025-05-22", + "attachment": false, + "open_weights": true, + "release_date": "2026-02-17", + "last_updated": "2026-02-17", "type": "chat" }, { - "id": "databricks-claude-opus-4-5", - "name": "Claude Opus 4.5 (latest)", - "display_name": "Claude Opus 4.5 (latest)", + "id": "command-a-plus-05-2026", + "name": "Command A Plus", + "display_name": "Command A Plus", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 200000, + "context": 128000, "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." - ] + "supported": true } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-05", - "release_date": "2025-11-24", - "last_updated": "2025-11-24", + "open_weights": true, + "knowledge": "2025-04-01", + "release_date": "2026-05-20", + "last_updated": "2026-06-09", "type": "chat" }, { - "id": "databricks-claude-haiku-4-5", - "name": "Claude Haiku 4.5 (latest)", - "display_name": "Claude Haiku 4.5 (latest)", + "id": "tiny-aya-global", + "name": "Tiny Aya Global", + "display_name": "Tiny Aya Global", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 8000, + "output": 8000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." - ] - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-02-28", - "release_date": "2025-10-15", - "last_updated": "2025-10-15", + "attachment": false, + "open_weights": true, + "release_date": "2026-02-17", + "last_updated": "2026-02-17", "type": "chat" - } - ] - }, - "synthetic": { - "id": "synthetic", - "name": "Synthetic", - "display_name": "Synthetic", - "api": "https://api.synthetic.new/openai/v1", - "doc": "https://synthetic.new/pricing", - "models": [ + }, { - "id": "hf:zai-org/GLM-4.7-Flash", - "name": "GLM-4.7-Flash", - "display_name": "GLM-4.7-Flash", + "id": "command-r7b-12-2024", + "name": "Command R7B", + "display_name": "Command R7B", "modalities": { "input": [ "text" @@ -281497,43 +276809,25 @@ ] }, "limit": { - "context": 196608, - "output": 65536 + "context": 128000, + "output": 4000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "none", - "low", - "medium", - "high" - ] - } + "supported": false }, "attachment": false, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2026-01-19", - "last_updated": "2026-01-19", + "knowledge": "2024-06-01", + "release_date": "2024-12-13", + "last_updated": "2024-12-13", "type": "chat" }, { - "id": "hf:zai-org/GLM-5.3", - "name": "GLM-5.3", - "display_name": "GLM-5.3", + "id": "north-mini-code-1-0", + "name": "North Mini Code", + "display_name": "North Mini Code", "modalities": { "input": [ "text" @@ -281543,8 +276837,8 @@ ] }, "limit": { - "context": 524288, - "output": 65536 + "context": 256000, + "output": 64000 }, "temperature": true, "tool_call": true, @@ -281562,22 +276856,22 @@ "thinking_blocks" ], "effort_options": [ - "low", - "high", - "max" + "none", + "high" ] } }, "attachment": false, "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "knowledge": "2025-09-23", + "release_date": "2026-06-09", + "last_updated": "2026-06-09", "type": "chat" }, { - "id": "hf:zai-org/GLM-5.2", - "name": "GLM-5.2", - "display_name": "GLM-5.2", + "id": "command-r-plus-08-2024", + "name": "Command R+", + "display_name": "Command R+", "modalities": { "input": [ "text" @@ -281587,41 +276881,25 @@ ] }, "limit": { - "context": 524288, - "output": 65536 + "context": 128000, + "output": 4000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "none", - "high", - "xhigh" - ] - } + "supported": false }, "attachment": false, "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "knowledge": "2024-06-01", + "release_date": "2024-08-30", + "last_updated": "2024-08-30", "type": "chat" }, { - "id": "hf:zai-org/GLM-5.3-Flash", - "name": "GLM-5.3-Flash", - "display_name": "GLM-5.3-Flash", + "id": "command-a-vision-07-2025", + "name": "Command A Vision", + "display_name": "Command A Vision", "modalities": { "input": [ "text", @@ -281632,41 +276910,34 @@ ] }, "limit": { - "context": 524288, - "output": 65536 + "context": 128000, + "output": 8000 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "low", - "high", - "max" - ] - } + "supported": false }, "attachment": true, "open_weights": true, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", + "knowledge": "2024-06-01", + "release_date": "2025-07-31", + "last_updated": "2025-07-31", "type": "chat" - }, + } + ] + }, + "runinfra": { + "id": "runinfra", + "name": "RunInfra", + "display_name": "RunInfra", + "api": "https://api.runinfra.ai/v1", + "doc": "https://runinfra.ai/docs", + "models": [ { - "id": "hf:nvidia/NVIDIA-Nemotron-3-Super-120B-A12B-NVFP4", - "name": "Nemotron 3 Super 120B A12B", - "display_name": "Nemotron 3 Super 120B A12B", + "id": "Inferact/Qwen3.8-2.4T-A95B-NVFP4", + "name": "Qwen3.8 2.4T A95B (NVFP4)", + "display_name": "Qwen3.8 2.4T A95B (NVFP4)", "modalities": { "input": [ "text" @@ -281677,7 +276948,7 @@ }, "limit": { "context": 262144, - "output": 65536 + "output": 32768 }, "temperature": true, "tool_call": true, @@ -281687,44 +276958,34 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ - "none", "low", "medium", - "high" + "xhigh" ] } }, "attachment": false, "open_weights": true, - "knowledge": "2025-06", - "release_date": "2026-03-11", - "last_updated": "2026-03-11", + "release_date": "2026-08-12", + "last_updated": "2026-08-12", "type": "chat" }, { - "id": "hf:deepseek-ai/DeepSeek-V4.1-Flash-1017", - "name": "DeepSeek V4.1 Flash 1017", - "display_name": "DeepSeek V4.1 Flash 1017", + "id": "nvidia/NVIDIA-Nemotron-3.5-Lightning-30B-A3B-BF16", + "name": "Nemotron 3.5 Lightning 30B A3B", + "display_name": "Nemotron 3.5 Lightning 30B A3B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 524288, - "output": 65536 + "context": 262144, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -281732,30 +276993,17 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "effort_options": [ - "none", - "low", - "high", - "xhigh", - "max" - ] - } - }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-10-17", - "last_updated": "2026-10-17", + "knowledge": "2025-09", + "release_date": "2026-08-11", + "last_updated": "2026-08-11", "type": "chat" }, { - "id": "hf:deepseek-ai/DeepSeek-V4.1-Flash", - "name": "DeepSeek V4.1 Flash", - "display_name": "DeepSeek V4.1 Flash", + "id": "Qwen/Qwen3.8-27B", + "name": "Qwen3.8 27B", + "display_name": "Qwen3.8 27B", "modalities": { "input": [ "text", @@ -281766,8 +277014,8 @@ ] }, "limit": { - "context": 524288, - "output": 65536 + "context": 262144, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -281777,39 +277025,36 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, "effort_options": [ "none", "low", - "high", - "xhigh", - "max" + "medium", + "xhigh" ] } }, "attachment": true, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-09-10", - "last_updated": "2026-09-10", + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "hf:openai/gpt-oss-120b", - "name": "GPT OSS 120B", - "display_name": "GPT OSS 120B", + "id": "ornith-ai/Ornith-1.5-35B-A3B", + "name": "Ornith 1.5 35B A3B", + "display_name": "Ornith 1.5 35B A3B", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 65536 + "context": 262144, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -281820,25 +277065,24 @@ "extra_capabilities": { "reasoning": { "supported": true, - "effort_options": [ - "none", - "low", - "medium", - "high" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "release_date": "2026-08-18", + "last_updated": "2026-08-23", "type": "chat" }, { - "id": "hf:Qwen/Qwen3.6-27B", - "name": "Qwen3.6 27B", - "display_name": "Qwen3.6 27B", + "id": "zai-org/GLM-5.3-Flash", + "name": "GLM-5.3-Flash", + "display_name": "GLM-5.3-Flash", "modalities": { "input": [ "text", @@ -281849,8 +277093,8 @@ ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 1048576, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -281862,41 +277106,34 @@ "reasoning": { "supported": true, "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ - "none", "low", - "medium", - "high" + "high", + "max" ] } }, "attachment": true, "open_weights": true, - "release_date": "2026-04-22", - "last_updated": "2026-04-22", + "release_date": "2026-08-26", + "last_updated": "2026-08-26", "type": "chat" }, { - "id": "hf:moonshotai/Kimi-K3", - "name": "Kimi K3", - "display_name": "Kimi K3", + "id": "zai-org/GLM-5.3", + "name": "GLM-5.3", + "display_name": "GLM-5.3", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 524288, - "output": 65536 + "context": 1048576, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -281920,30 +277157,29 @@ ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-16", + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "hf:moonshotai/Kimi-K2.7-Code", - "name": "Kimi K2.7 Code", - "display_name": "Kimi K2.7 Code", + "id": "deepseek-ai/DeepSeek-V4-Flash-0731", + "name": "DeepSeek V4 Flash 0731", + "display_name": "DeepSeek V4 Flash 0731", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 1048576, + "output": 32768 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -281952,42 +277188,35 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ + "none", "low", - "medium", - "high" + "max" ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-06-12", - "last_updated": "2026-06-12", + "knowledge": "2025-05", + "release_date": "2026-07-31", + "last_updated": "2026-07-31", "type": "chat" }, { - "id": "hf:MiniMaxAI/MiniMax-M3", - "name": "MiniMax-M3", - "display_name": "MiniMax-M3", + "id": "deepseek-ai/DeepSeek-V4-Pro-0813", + "name": "DeepSeek V4 Pro 0813", + "display_name": "DeepSeek V4 Pro 0813", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 524288, - "output": 65536 + "context": 1048576, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -281997,77 +277226,74 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "low", - "medium", - "high" - ] + "supported": true } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-06-01", - "last_updated": "2026-06-01", + "release_date": "2026-08-13", + "last_updated": "2026-08-22", "type": "chat" } ] }, - "chutes": { - "id": "chutes", - "name": "Chutes", - "display_name": "Chutes", - "api": "https://llm.chutes.ai/v1", - "doc": "https://llm.chutes.ai/v1/models", + "vispark": { + "id": "vispark", + "name": "Vispark", + "display_name": "Vispark", + "api": "https://api.lab.vispark.in/v1", + "doc": "https://lab.vispark.in/#vision", "models": [ { - "id": "Nemotron-3-Nano-Omni-30B-TEE", - "name": "Nemotron 3 Nano Omni 30B TEE", - "display_name": "Nemotron 3 Nano Omni 30B TEE", + "id": "vispark/vision-medium", + "name": "Vision Medium", + "display_name": "Vision Medium", "modalities": { "input": [ - "text" + "text", + "image", + "audio", + "video", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 1000000, + "output": 65536 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "release_date": "2026-07-23", - "last_updated": "2026-07-23", + "attachment": true, + "open_weights": false, + "release_date": "2024-05-15", + "last_updated": "2026-09", "type": "chat" }, { - "id": "Qwen/Qwen3.6-27B-TEE", - "name": "Qwen3.6 27B TEE", - "display_name": "Qwen3.6 27B TEE", + "id": "vispark/vision-small", + "name": "Vision Small", + "display_name": "Vision Small", "modalities": { "input": [ "text", - "image" + "image", + "audio", + "video", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, + "context": 1000000, "output": 65536 }, "temperature": true, @@ -282076,38 +277302,30 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, "attachment": true, - "open_weights": true, - "release_date": "2026-04-22", - "last_updated": "2026-04-22", + "open_weights": false, + "release_date": "2024-05-15", + "last_updated": "2026-09", "type": "chat" }, { - "id": "Qwen/Qwen3.5-397B-A17B-TEE", - "name": "Qwen3.5 397B A17B TEE", - "display_name": "Qwen3.5 397B A17B TEE", + "id": "vispark/vision-large", + "name": "Vision Large", + "display_name": "Vision Large", "modalities": { "input": [ "text", - "image" + "image", + "audio", + "video", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, + "context": 1000000, "output": 65536 }, "temperature": true, @@ -282116,123 +277334,191 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, "attachment": true, - "open_weights": true, - "release_date": "2026-02-15", - "last_updated": "2026-02-15", + "open_weights": false, + "release_date": "2024-05-15", + "last_updated": "2026-09", "type": "chat" - }, + } + ] + }, + "requesty": { + "id": "requesty", + "name": "Requesty", + "display_name": "Requesty", + "api": "https://router.requesty.ai/v1", + "doc": "https://requesty.ai/solution/llm-routing/models", + "models": [ { - "id": "Qwen/Qwen3-32B-TEE", - "name": "Qwen3 32B TEE", - "display_name": "Qwen3 32B TEE", + "id": "gpt-6.1-terra", + "name": "GPT-6.1 Terra", + "display_name": "GPT-6.1 Terra", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 40960, - "output": 40960 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-04-28", - "last_updated": "2025-04-28", + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "low", + "medium", + "high", + "max" + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2026-06-01", + "release_date": "2026-10-26", + "last_updated": "2026-10-26", "type": "chat" }, { - "id": "Qwen/Qwen3.8-27B-TEE", - "name": "Qwen3.8 27B TEE", - "display_name": "Qwen3.8 27B TEE", + "id": "claude-sonnet-4-5", + "name": "Claude Sonnet 4.5 (latest)", + "display_name": "Claude Sonnet 4.5 (latest)", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 1000000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + ] + } }, "attachment": true, - "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "open_weights": false, + "knowledge": "2025-07-31", + "release_date": "2025-09-29", + "last_updated": "2025-09-29", "type": "chat" }, { - "id": "Qwen/Qwen3.8-Max-0902", - "name": "Qwen3.8 Max 0902", - "display_name": "Qwen3.8 Max 0902", + "id": "claude-fable-5", + "name": "Claude Fable 5", + "display_name": "Claude Fable 5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 1000000, + "output": 128000 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "release_date": "2026-10-20", - "last_updated": "2026-10-25", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", + "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", + "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2026-01-31", + "release_date": "2026-06-09", + "last_updated": "2026-06-09", "type": "chat" }, { - "id": "Qwen/Qwen3-235B-A22B-Thinking-2507-TEE", - "name": "Qwen3 235B A22B Thinking 2507 TEE", - "display_name": "Qwen3 235B A22B Thinking 2507 TEE", + "id": "gemini-3.1-pro-preview", + "name": "Gemini 3.1 Pro Preview", + "display_name": "Gemini 3.1 Pro Preview", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1048576, + "output": 65535 }, "temperature": true, "tool_call": true, @@ -282243,24 +277529,31 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "low", + "high" + ], "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" + "thought_signatures" ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2025-07-25", - "last_updated": "2025-07-25", + "attachment": true, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2026-02-19", + "last_updated": "2026-02-19", "type": "chat" }, { - "id": "google/gemma-4-31B-turbo-TEE", - "name": "gemma 4 31B turbo TEE", - "display_name": "gemma 4 31B turbo TEE", + "id": "muse-glimmer-30b", + "name": "Muse Glimmer 30B", + "display_name": "Muse Glimmer 30B", "modalities": { "input": [ "text", @@ -282272,7 +277565,7 @@ }, "limit": { "context": 131072, - "output": 65536 + "output": 20480 }, "temperature": true, "tool_call": true, @@ -282280,17 +277573,28 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "low", + "medium", + "high", + "max" + ] + } + }, "attachment": true, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "knowledge": "2026-01-04", + "release_date": "2026-08-10", + "last_updated": "2026-08-10", "type": "chat" }, { - "id": "unsloth/Mistral-Nemo-Instruct-2407-TEE", - "name": "Mistral Nemo Instruct 2407 TEE", - "display_name": "Mistral Nemo Instruct 2407 TEE", + "id": "deepseek-v4-flash-0731", + "name": "DeepSeek V4 Flash 0731", + "display_name": "DeepSeek V4 Flash 0731", "modalities": { "input": [ "text" @@ -282300,97 +277604,124 @@ ] }, "limit": { - "context": 131072, + "context": 1048576, "output": 131072 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "none", + "low", + "medium", + "high", + "max" + ] + } }, "attachment": false, "open_weights": true, - "knowledge": "2024-07", - "release_date": "2024-07-18", - "last_updated": "2024-07-18", + "knowledge": "2025-05", + "release_date": "2026-07-31", + "last_updated": "2026-07-31", "type": "chat" }, { - "id": "moonshotai/Kimi-K3-TEE", - "name": "Kimi K3 TEE", - "display_name": "Kimi K3 TEE", + "id": "grok-build-0.1", + "name": "Grok Build 0.1", + "display_name": "Grok Build 0.1", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65535 + "context": 256000, + "output": 256000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": true, - "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-16", + "open_weights": false, + "release_date": "2026-04-16", + "last_updated": "2026-04-16", "type": "chat" }, { - "id": "moonshotai/Kimi-K2.6-TEE", - "name": "Kimi K2.6 TEE", - "display_name": "Kimi K2.6 TEE", + "id": "claude-haiku-4-5", + "name": "Claude Haiku 4.5 (latest)", + "display_name": "Claude Haiku 4.5 (latest)", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 65535 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-20", - "last_updated": "2026-04-20", + "open_weights": false, + "knowledge": "2025-02-28", + "release_date": "2025-10-15", + "last_updated": "2025-10-15", "type": "chat" }, { - "id": "zai-org/GLM-5.1-TEE", - "name": "GLM 5.1 TEE", - "display_name": "GLM 5.1 TEE", + "id": "leanstral-1-5", + "name": "leanstral-1-5", + "display_name": "leanstral-1-5", "modalities": { "input": [ "text" @@ -282400,10 +277731,9 @@ ] }, "limit": { - "context": 202752, - "output": 65535 + "context": 262144, + "output": 32768 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -282411,36 +277741,38 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "none", + "low", + "medium", + "high", + "max" ] } }, "attachment": false, - "open_weights": true, - "release_date": "2026-04-07", - "last_updated": "2026-04-07", + "open_weights": false, + "release_date": "2026-05-27", + "last_updated": "2026-05-27", "type": "chat" }, { - "id": "zai-org/GLM-5.2-TEE", - "name": "GLM 5.2 TEE", - "display_name": "GLM 5.2 TEE", + "id": "qwen3.6-plus", + "name": "Qwen3.6 Plus", + "display_name": "Qwen3.6 Plus", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65535 + "context": 1000000, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -282456,19 +277788,81 @@ "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "effort_options": [ + "none", + "low", + "medium", + "high", + "max" ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "attachment": true, + "open_weights": false, + "knowledge": "2025-04", + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-V4-Pro-0813", - "name": "DeepSeek V4 Pro 0813", - "display_name": "DeepSeek V4 Pro 0813", + "id": "gpt-5.6-terra", + "name": "GPT-5.6 Terra", + "display_name": "GPT-5.6 Terra", + "modalities": { + "input": [ + "text", + "image", + "pdf" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1050000, + "output": 128000 + }, + "temperature": false, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", + "type": "chat" + }, + { + "id": "hy3", + "name": "Hy3", + "display_name": "Hy3", "modalities": { "input": [ "text" @@ -282478,29 +277872,37 @@ ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 262144, + "output": 262144 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "effort_options": [ + "none", + "low", + "medium", + "high", + "max" + ] } }, "attachment": false, "open_weights": true, - "release_date": "2026-10-20", - "last_updated": "2026-10-25", + "release_date": "2026-07-06", + "last_updated": "2026-07-06", "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-V4-Flash-0731-TEE", - "name": "DeepSeek V4 Flash 0731 TEE", - "display_name": "DeepSeek V4 Flash 0731 TEE", + "id": "glm-5.2", + "name": "GLM-5.2", + "display_name": "GLM-5.2", "modalities": { "input": [ "text" @@ -282519,17 +277921,28 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "none", + "low", + "medium", + "high", + "max" + ] + } + }, "attachment": false, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-07-31", - "last_updated": "2026-07-31", + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-V3.2-TEE", - "name": "DeepSeek V3.2 TEE", - "display_name": "DeepSeek V3.2 TEE", + "id": "deepseek-v4-flash", + "name": "DeepSeek V4 Flash", + "display_name": "DeepSeek V4 Flash", "modalities": { "input": [ "text" @@ -282539,8 +277952,8 @@ ] }, "limit": { - "context": 131072, - "output": 65536 + "context": 1048576, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -282551,85 +277964,94 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "high", + "max" + ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "notes": [ + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, "attachment": false, "open_weights": true, - "knowledge": "2024-07", - "release_date": "2025-12-01", - "last_updated": "2025-12-01", + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" - } - ] - }, - "blueclaw": { - "id": "blueclaw", - "name": "Blue Claw", - "display_name": "Blue Claw", - "api": "https://openai.blueclaw.network/v1", - "doc": "https://blueclaw.network", - "models": [ + }, { - "id": "Qwen3.8-27B", - "name": "Qwen3.8 27B", - "display_name": "Qwen3.8 27B", + "id": "gpt-5.4", + "name": "GPT-5.4", + "display_name": "GPT-5.4", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 1050000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", "effort_options": [ + "none", "low", "medium", + "high", "xhigh" - ] + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "attachment": true, + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-03-05", + "last_updated": "2026-03-05", "type": "chat" - } - ] - }, - "pareto": { - "id": "pareto", - "name": "Pareto Inference", - "display_name": "Pareto Inference", - "api": "https://api.paretoinference.com/v1", - "doc": "https://docs.paretoinference.com/", - "models": [ + }, { - "id": "z-ai/glm-5.3-flash", - "name": "GLM-5.3-Flash", - "display_name": "GLM-5.3-Flash", + "id": "claude-sonnet-4-6", + "name": "Claude Sonnet 4.6", + "display_name": "Claude Sonnet 4.6", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" @@ -282637,45 +278059,49 @@ }, "limit": { "context": 1000000, - "output": 131072 + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "max" + ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" ], - "effort_options": [ - "low", - "high", - "max" + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-02-17", + "last_updated": "2026-03-13", "type": "chat" - } - ] - }, - "routing-run": { - "id": "routing-run", - "name": "routing.run", - "display_name": "routing.run", - "api": "https://api.routing.run/v1", - "doc": "https://docs.routing.run/api-reference/models", - "models": [ + }, { "id": "gpt-5.6-sol", "name": "GPT-5.6 Sol", @@ -282691,7 +278117,7 @@ ] }, "limit": { - "context": 1000000, + "context": 1050000, "output": 128000 }, "temperature": false, @@ -282720,12 +278146,7 @@ "medium", "high" ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "visibility": "hidden" } }, "attachment": true, @@ -282736,9 +278157,9 @@ "type": "chat" }, { - "id": "deepseek-v4-flash", - "name": "DeepSeek V4 Flash", - "display_name": "DeepSeek V4 Flash", + "id": "glm-5.2-fast", + "name": "glm-5.2-fast", + "display_name": "glm-5.2-fast", "modalities": { "input": [ "text" @@ -282749,9 +278170,8 @@ }, "limit": { "context": 1000000, - "output": 64000 + "output": 131072 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -282759,84 +278179,80 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", "effort_options": [ + "none", "low", + "medium", "high", "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "open_weights": false, + "release_date": "2026-07-13", + "last_updated": "2026-07-13", "type": "chat" }, { - "id": "kimi-k2.6-nitro", - "name": "Kimi K2.6 Nitro", - "display_name": "Kimi K2.6 Nitro", + "id": "gpt-5.4-mini", + "name": "GPT-5.4 mini", + "display_name": "GPT-5.4 mini", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 32000 + "context": 400000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-20", - "last_updated": "2026-04-20", + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-03-17", + "last_updated": "2026-03-17", "type": "chat" }, { - "id": "kimi-k2.7-code", - "name": "Kimi K2.7 Code", - "display_name": "Kimi K2.7 Code", + "id": "minimax-m2.7", + "name": "MiniMax-M2.7", + "display_name": "MiniMax-M2.7", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" @@ -282844,9 +278260,9 @@ }, "limit": { "context": 200000, - "output": 32000 + "output": 128000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -282860,35 +278276,40 @@ "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "effort_options": [ + "none", + "low", + "medium", + "high", + "max" ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-06-12", - "last_updated": "2026-06-12", + "release_date": "2026-03-18", + "last_updated": "2026-03-18", "type": "chat" }, { - "id": "gpt-5.6-luna", - "name": "GPT-5.6 Luna", - "display_name": "GPT-5.6 Luna", + "id": "mistral-small-2603", + "name": "Mistral Small 4", + "display_name": "Mistral Small 4", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 256000, + "output": 256000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -282896,54 +278317,38 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", "effort_options": [ "none", "low", "medium", "high", - "xhigh", "max" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "open_weights": true, + "knowledge": "2025-06", + "release_date": "2026-03-16", + "last_updated": "2026-03-16", "type": "chat" }, { - "id": "deepseek-v4-pro", - "name": "DeepSeek V4 Pro", - "display_name": "DeepSeek V4 Pro", + "id": "deepseek-v4.1-flash", + "name": "DeepSeek V4.1 Flash", + "display_name": "DeepSeek V4.1 Flash", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 64000 + "context": 1048576, + "output": 393216 }, "temperature": true, "tool_call": true, @@ -282954,36 +278359,26 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", "effort_options": [ + "none", "low", + "medium", "high", "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, - "attachment": false, + "attachment": true, "open_weights": true, "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "release_date": "2026-09-10", + "last_updated": "2026-09-10", "type": "chat" }, { - "id": "gpt-5.6-terra", - "name": "GPT-5.6 Terra", - "display_name": "GPT-5.6 Terra", + "id": "gpt-5.6-luna", + "name": "GPT-5.6 Luna", + "display_name": "GPT-5.6 Luna", "modalities": { "input": [ "text", @@ -282995,7 +278390,7 @@ ] }, "limit": { - "context": 1000000, + "context": 1050000, "output": 128000 }, "temperature": false, @@ -283024,12 +278419,7 @@ "medium", "high" ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "visibility": "hidden" } }, "attachment": true, @@ -283040,24 +278430,23 @@ "type": "chat" }, { - "id": "kimi-k2.7-code-nitro", - "name": "Kimi K2.7 Code Nitro", - "display_name": "Kimi K2.7 Code Nitro", + "id": "grok-4.6", + "name": "Grok 4.6", + "display_name": "Grok 4.6", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 32000 + "context": 500000, + "output": 500000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -283066,38 +278455,41 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "none", + "low", + "medium", + "high", + "max" ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-06-12", - "last_updated": "2026-06-12", + "open_weights": false, + "knowledge": "2026-02-01", + "release_date": "2026-08-12", + "last_updated": "2026-08-12", "type": "chat" }, { - "id": "kimi-k2.6", - "name": "Kimi K2.6", - "display_name": "Kimi K2.6", + "id": "gemini-3.5-flash-lite", + "name": "Gemini 3.5 Flash Lite", + "display_name": "Gemini 3.5 Flash Lite", "modalities": { "input": [ "text", "image", - "video" + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 32000 + "context": 1048576, + "output": 65535 }, "temperature": true, "tool_call": true, @@ -283108,84 +278500,66 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "none", + "low", + "medium", + "high", + "max" ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-20", - "last_updated": "2026-04-20", + "open_weights": false, + "knowledge": "2026-03", + "release_date": "2026-07-21", + "last_updated": "2026-07-21", "type": "chat" }, { - "id": "claude-sonnet-4-6", - "name": "Claude Sonnet 4.6", - "display_name": "Claude Sonnet 4.6", + "id": "seed-1.8", + "name": "Seed 1.8", + "display_name": "Seed 1.8", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, + "context": 256000, "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", "effort_options": [ + "none", "low", "medium", "high", "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-17", - "last_updated": "2026-03-13", + "release_date": "2025-12-28", + "last_updated": "2025-12-28", "type": "chat" }, { - "id": "glm-5.2-nitro", - "name": "GLM 5.2 Nitro", - "display_name": "GLM 5.2 Nitro", + "id": "laguna-m.1", + "name": "Laguna M.1", + "display_name": "Laguna M.1", "modalities": { "input": [ "text" @@ -283195,77 +278569,36 @@ ] }, "limit": { - "context": 200000, - "output": 32000 + "context": 32768, + "output": 32768 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "none", + "low", + "medium", + "high", + "max" ] } }, "attachment": false, "open_weights": true, - "release_date": "2026-06-13", + "release_date": "2026-04-28", "last_updated": "2026-06-13", "type": "chat" }, { - "id": "qwen3.5-9b", - "name": "Qwen3.5 9B", - "display_name": "Qwen3.5 9B", - "modalities": { - "input": [ - "text", - "image", - "video" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 262144, - "output": 32000 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, - "attachment": true, - "open_weights": true, - "release_date": "2026-02-23", - "last_updated": "2026-02-23", - "type": "chat" - }, - { - "id": "glm-5.2", - "name": "GLM-5.2", - "display_name": "GLM-5.2", + "id": "minimax-m2.7-highspeed", + "name": "MiniMax-M2.7-highspeed", + "display_name": "MiniMax-M2.7-highspeed", "modalities": { "input": [ "text" @@ -283276,7 +278609,7 @@ }, "limit": { "context": 200000, - "output": 32000 + "output": 128000 }, "temperature": true, "tool_call": true, @@ -283292,19 +278625,26 @@ "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "effort_options": [ + "none", + "low", + "medium", + "high", + "max" ] } }, "attachment": false, "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "release_date": "2026-03-18", + "last_updated": "2026-03-18", "type": "chat" }, { - "id": "nemotron-3-ultra", - "name": "Nemotron 3 Ultra 550B A55B", - "display_name": "Nemotron 3 Ultra 550B A55B", + "id": "nemotron-lightning-3.5-30b-a3b", + "name": "nemotron-lightning-3.5-30b-a3b", + "display_name": "nemotron-lightning-3.5-30b-a3b", "modalities": { "input": [ "text" @@ -283314,10 +278654,9 @@ ] }, "limit": { - "context": 131072, - "output": 32000 + "context": 262144, + "output": 262144 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -283325,26 +278664,25 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "none", + "low", + "medium", + "high", + "max" ] } }, "attachment": false, - "open_weights": true, - "knowledge": "2025-09", - "release_date": "2026-06-04", - "last_updated": "2026-06-04", + "open_weights": false, + "release_date": "2026-08-15", + "last_updated": "2026-08-15", "type": "chat" }, { - "id": "claude-opus-4-8", - "name": "Claude Opus 4.8", - "display_name": "Claude Opus 4.8", + "id": "claude-opus-4-7", + "name": "Claude Opus 4.7", + "display_name": "Claude Opus 4.7", "modalities": { "input": [ "text", @@ -283357,7 +278695,7 @@ }, "limit": { "context": 1000000, - "output": 32000 + "output": 128000 }, "temperature": false, "tool_call": true, @@ -283380,7 +278718,7 @@ ], "interleaved": true, "summaries": true, - "visibility": "summary", + "visibility": "omitted", "continuation": [ "thinking_blocks" ], @@ -283393,24 +278731,15 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2026-01", - "release_date": "2026-05-28", - "last_updated": "2026-05-28", + "knowledge": "2026-01-31", + "release_date": "2026-04-16", + "last_updated": "2026-04-16", "type": "chat" - } - ] - }, - "thinkingmachines": { - "id": "thinkingmachines", - "name": "Thinking Machines", - "display_name": "Thinking Machines", - "api": "https://tinker.thinkingmachines.dev/services/tinker-prod/anthropic/api/v1", - "doc": "https://tinker-docs.thinkingmachines.ai/tinker/compatible-apis/anthropic/", - "models": [ + }, { - "id": "Qwen/Qwen3.5-4B:peft:262144", - "name": "Qwen3.5 4B", - "display_name": "Qwen3.5 4B", + "id": "grok-4.5", + "name": "Grok 4.5", + "display_name": "Grok 4.5", "modalities": { "input": [ "text", @@ -283421,8 +278750,8 @@ ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 500000, + "output": 500000 }, "temperature": true, "tool_call": true, @@ -283430,27 +278759,66 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "none", + "low", + "medium", + "high", + "max" + ] + } + }, "attachment": true, - "open_weights": true, - "release_date": "2026-03-02", - "last_updated": "2026-03-02", + "open_weights": false, + "release_date": "2026-07-08", + "last_updated": "2026-07-08", "type": "chat" }, { - "id": "Qwen/Qwen3.5-4B", - "name": "Qwen3.5 4B", - "display_name": "Qwen3.5 4B", + "id": "kat-coder-pro", + "name": "kat-coder-pro", + "display_name": "kat-coder-pro", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 256000, + "output": 256000 + }, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": false, + "release_date": "2026-03-27", + "last_updated": "2026-03-27", + "type": "chat" + }, + { + "id": "qwen3.5-35b-a3b", + "name": "Qwen3.5 35B-A3B", + "display_name": "Qwen3.5 35B-A3B", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 65536, + "context": 262144, "output": 65536 }, "temperature": true, @@ -283467,33 +278835,38 @@ "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "effort_options": [ + "none", + "low", + "medium", + "high", + "max" ] } }, "attachment": true, "open_weights": true, - "release_date": "2026-03-02", - "last_updated": "2026-03-02", + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" }, { - "id": "Qwen/Qwen3.6-35B-A3B:peft:262144", - "name": "Qwen3.6 35B-A3B", - "display_name": "Qwen3.6 35B-A3B", + "id": "nemotron-3-nano-omni", + "name": "nemotron-3-nano-omni", + "display_name": "nemotron-3-nano-omni", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 300000, + "output": 300000 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -283501,25 +278874,54 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "none", + "low", + "medium", + "high", + "max" ] } }, + "attachment": false, + "open_weights": false, + "release_date": "2026-05-20", + "last_updated": "2026-05-20", + "type": "chat" + }, + { + "id": "grok-4.2-beta", + "name": "Grok 4.20 (Reasoning)", + "display_name": "Grok 4.20 (Reasoning)", + "modalities": { + "input": [ + "text", + "image", + "pdf" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 2000000, + "output": 30000 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, "attachment": true, - "open_weights": true, - "release_date": "2026-04-17", - "last_updated": "2026-04-17", + "open_weights": false, + "release_date": "2026-03-09", + "last_updated": "2026-03-09", "type": "chat" }, { - "id": "Qwen/Qwen3-8B", - "name": "Qwen3 8B", - "display_name": "Qwen3 8B", + "id": "glm-5.3", + "name": "GLM-5.3", + "display_name": "GLM-5.3", "modalities": { "input": [ "text" @@ -283529,8 +278931,8 @@ ] }, "limit": { - "context": 32768, - "output": 32768 + "context": 1048576, + "output": 1048576 }, "temperature": true, "tool_call": true, @@ -283541,36 +278943,38 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "none", + "low", + "medium", + "high", + "max" ] } }, "attachment": false, "open_weights": true, - "release_date": "2025-04-29", - "last_updated": "2025-04-29", + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "Qwen/Qwen3.6-35B-A3B", - "name": "Qwen3.6 35B-A3B", - "display_name": "Qwen3.6 35B-A3B", + "id": "qwen3.5-2b", + "name": "Qwen3.5 2B", + "display_name": "Qwen3.5 2B", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 65536, - "output": 65536 + "context": 262144, + "output": 81920 }, "temperature": true, "tool_call": true, @@ -283586,19 +278990,26 @@ "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "effort_options": [ + "none", + "low", + "medium", + "high", + "max" ] } }, "attachment": true, "open_weights": true, - "release_date": "2026-04-17", - "last_updated": "2026-04-17", + "release_date": "2026-03-02", + "last_updated": "2026-03-02", "type": "chat" }, { - "id": "Qwen/Qwen3.5-35B-A3B-Base", - "name": "Qwen3.5 35B-A3B Base", - "display_name": "Qwen3.5 35B-A3B Base", + "id": "qwen3.8-2.4T-A95B", + "name": "Qwen3.8 2.4T A95B", + "display_name": "Qwen3.8 2.4T A95B", "modalities": { "input": [ "text" @@ -283608,47 +279019,51 @@ ] }, "limit": { - "context": 65536, - "output": 65536 + "context": 262144, + "output": 262144 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "none", + "low", + "medium", + "high", + "max" ] } }, "attachment": false, "open_weights": true, - "release_date": "2026-02-24", - "last_updated": "2026-02-24", + "release_date": "2026-08-12", + "last_updated": "2026-08-12", "type": "chat" }, { - "id": "Qwen/Qwen3.6-27B", - "name": "Qwen3.6 27B", - "display_name": "Qwen3.6 27B", + "id": "mimo-v2.6-pro", + "name": "MiMo-V2.6-Pro", + "display_name": "MiMo-V2.6-Pro", "modalities": { "input": [ "text", - "image" + "image", + "audio", + "video" ], "output": [ "text" ] }, "limit": { - "context": 65536, - "output": 65536 + "context": 1048576, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -283658,37 +279073,68 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "none", + "low", + "medium", + "high", + "max" ] } }, "attachment": true, "open_weights": true, + "release_date": "2026-09-22", + "last_updated": "2026-09-22", + "type": "chat" + }, + { + "id": "mimo-v2.5-pro", + "name": "MiMo-V2.5-Pro", + "display_name": "MiMo-V2.5-Pro", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1048576, + "output": 131072 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "knowledge": "2024-12", "release_date": "2026-04-22", "last_updated": "2026-04-22", "type": "chat" }, { - "id": "Qwen/Qwen3.8-27B:peft:262144", - "name": "Qwen3.8 27B", - "display_name": "Qwen3.8 27B", + "id": "gemini-3.1-flash-lite", + "name": "Gemini 3.1 Flash Lite", + "display_name": "Gemini 3.1 Flash Lite", "modalities": { "input": [ "text", - "image" + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1048576, + "output": 65535 }, "temperature": true, "tool_call": true, @@ -283696,28 +279142,40 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "none", + "low", + "medium", + "high", + "max" + ] + } + }, "attachment": true, - "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2026-05-07", + "last_updated": "2026-05-07", "type": "chat" }, { - "id": "Qwen/Qwen3.8-27B", - "name": "Qwen3.8 27B", - "display_name": "Qwen3.8 27B", + "id": "qwen3.7-max", + "name": "Qwen3.7 Max", + "display_name": "Qwen3.7 Max", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 65536, - "output": 65536 + "context": 1048576, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -283725,16 +279183,28 @@ "supported": true, "default": true }, - "attachment": true, - "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "none", + "low", + "medium", + "high", + "max" + ] + } + }, + "attachment": false, + "open_weights": false, + "release_date": "2026-05-21", + "last_updated": "2026-05-21", "type": "chat" }, { - "id": "Qwen/Qwen3.5-9B-Base", - "name": "Qwen3.5 9B Base", - "display_name": "Qwen3.5 9B Base", + "id": "ring-2.6-1t", + "name": "ring-2.6-1t", + "display_name": "ring-2.6-1t", "modalities": { "input": [ "text" @@ -283744,47 +279214,48 @@ ] }, "limit": { - "context": 65536, - "output": 65536 + "context": 262144, + "output": 262144 }, - "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "none", + "low", + "medium", + "high", + "max" ] } }, "attachment": false, - "open_weights": true, - "release_date": "2026-02-26", - "last_updated": "2026-02-26", + "open_weights": false, + "release_date": "2026-05-08", + "last_updated": "2026-05-08", "type": "chat" }, { - "id": "Qwen/Qwen3.5-397B-A17B", - "name": "Qwen3.5 397B-A17B", - "display_name": "Qwen3.5 397B-A17B", + "id": "gpt-5.3-codex", + "name": "GPT-5.3 Codex", + "display_name": "GPT-5.3 Codex", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 65536, - "output": 65536 + "context": 400000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -283795,38 +279266,50 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, - "open_weights": true, - "release_date": "2026-02-15", - "last_updated": "2026-02-15", + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-02-05", + "last_updated": "2026-02-05", "type": "chat" }, { - "id": "Qwen/Qwen3.5-9B", - "name": "Qwen3.5 9B", - "display_name": "Qwen3.5 9B", + "id": "kimi-k3.1-pro", + "name": "Kimi K3.1 Pro", + "display_name": "Kimi K3.1 Pro", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 65536, - "output": 65536 + "context": 1048576, + "output": 1048576 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -283834,37 +279317,39 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "none", + "low", + "medium", + "high", + "max" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-02-23", - "last_updated": "2026-02-23", + "open_weights": false, + "release_date": "2026-10-23", + "last_updated": "2026-10-23", "type": "chat" }, { - "id": "Qwen/Qwen3.5-397B-A17B:peft:262144", - "name": "Qwen3.5 397B-A17B", - "display_name": "Qwen3.5 397B-A17B", + "id": "qwen3.8-max", + "name": "Qwen3.8 Max", + "display_name": "Qwen3.8 Max", "modalities": { "input": [ "text", - "image" + "image", + "video", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1048576, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -283875,138 +279360,206 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "none", + "low", + "medium", + "high", + "max" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-02-15", - "last_updated": "2026-02-15", + "open_weights": false, + "release_date": "2026-08-03", + "last_updated": "2026-08-03", "type": "chat" }, { - "id": "nvidia/NVIDIA-Nemotron-3.5-Super-VL-120B-A12B-BF16:peft:262144", - "name": "Nemotron 3.5 Super VL 120B A12B", - "display_name": "Nemotron 3.5 Super VL 120B A12B", + "id": "gpt-6-luna", + "name": "GPT-6 Luna", + "display_name": "GPT-6 Luna", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "low", + "medium", + "high", + "max" + ] + } + }, "attachment": true, - "open_weights": true, - "release_date": "2026-10-15", - "last_updated": "2026-10-15", + "open_weights": false, + "knowledge": "2026-05-18", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "nvidia/NVIDIA-Nemotron-3-Super-120B-A12B-BF16", - "name": "Nemotron 3 Super 120B A12B", - "display_name": "Nemotron 3 Super 120B A12B", + "id": "claude-opus-5-5", + "name": "Claude Opus 5.5", + "display_name": "Claude Opus 5.5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 65536, - "output": 65536 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-06", - "release_date": "2026-03-11", - "last_updated": "2026-03-11", + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "low", + "medium", + "high", + "max" + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2026-06", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "nvidia/NVIDIA-Nemotron-3.5-Lightning-30B-A3B-BF16:peft:262144", - "name": "Nemotron 3.5 Lightning 30B A3B", - "display_name": "Nemotron 3.5 Lightning 30B A3B", + "id": "fugu-ultra", + "name": "Fugu Ultra", + "display_name": "Fugu Ultra", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1048576, + "output": 131072 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-09", - "release_date": "2026-08-11", - "last_updated": "2026-08-11", + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "low", + "medium", + "high", + "max" + ] + } + }, + "attachment": true, + "open_weights": false, + "release_date": "2026-06-15", + "last_updated": "2026-06-15", "type": "chat" }, { - "id": "nvidia/NVIDIA-Nemotron-3-Nano-30B-A3B-BF16", - "name": "Nemotron 3 Nano 30B A3B", - "display_name": "Nemotron 3 Nano 30B A3B", + "id": "claude-opus-4-6", + "name": "Claude Opus 4.6", + "display_name": "Claude Opus 4.6", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 65536, - "output": 65536 + "context": 1000000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-06-25", - "release_date": "2025-12-15", - "last_updated": "2025-12-15", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-05-31", + "release_date": "2026-02-05", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "nvidia/NVIDIA-Nemotron-3-Super-120B-A12B-BF16:peft:262144", + "id": "nvidia-nemotron-3-super-120b-a12b", "name": "Nemotron 3 Super 120B A12B", "display_name": "Nemotron 3 Super 120B A12B", "modalities": { @@ -284027,6 +279580,18 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "none", + "low", + "medium", + "high", + "max" + ] + } + }, "attachment": false, "open_weights": true, "knowledge": "2025-06", @@ -284035,70 +279600,102 @@ "type": "chat" }, { - "id": "nvidia/NVIDIA-Nemotron-3.5-Super-VL-120B-A12B-BF16", - "name": "Nemotron 3.5 Super VL 120B A12B", - "display_name": "Nemotron 3.5 Super VL 120B A12B", + "id": "claude-opus-4-8", + "name": "Claude Opus 4.8", + "display_name": "Claude Opus 4.8", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 65536, - "output": 65536 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." + ] + } }, "attachment": true, - "open_weights": true, - "release_date": "2026-10-15", - "last_updated": "2026-10-15", + "open_weights": false, + "knowledge": "2026-01", + "release_date": "2026-05-28", + "last_updated": "2026-05-28", "type": "chat" }, { - "id": "nvidia/NVIDIA-Nemotron-3-Ultra-550B-A55B-BF16", - "name": "Nemotron 3 Ultra 550B A55B", - "display_name": "Nemotron 3 Ultra 550B A55B", + "id": "mimo-v2.5", + "name": "MiMo-V2.5", + "display_name": "MiMo-V2.5", "modalities": { "input": [ - "text" + "text", + "image", + "audio", + "video" ], "output": [ "text" ] }, "limit": { - "context": 65536, - "output": 65536 + "context": 1048576, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2025-09", - "release_date": "2026-06-04", - "last_updated": "2026-06-04", + "knowledge": "2024-12", + "release_date": "2026-04-22", + "last_updated": "2026-04-22", "type": "chat" }, { - "id": "nvidia/NVIDIA-Nemotron-3-Ultra-550B-A55B-BF16:peft:262144", - "name": "Nemotron 3 Ultra 550B A55B", - "display_name": "Nemotron 3 Ultra 550B A55B", + "id": "kimi-k2.7-code", + "name": "Kimi K2.7 Code", + "display_name": "Kimi K2.7 Code", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" @@ -284108,23 +279705,35 @@ "context": 262144, "output": 262144 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "none", + "low", + "medium", + "high", + "max" + ] + } + }, + "attachment": true, "open_weights": true, - "knowledge": "2025-09", - "release_date": "2026-06-04", - "last_updated": "2026-06-04", + "knowledge": "2025-01", + "release_date": "2026-06-12", + "last_updated": "2026-06-12", "type": "chat" }, { - "id": "nvidia/NVIDIA-Nemotron-3.5-Lightning-30B-A3B-BF16", - "name": "Nemotron 3.5 Lightning 30B A3B", - "display_name": "Nemotron 3.5 Lightning 30B A3B", + "id": "nvidia-nemotron-3-ultra", + "name": "Nemotron 3 Ultra 550B A55B", + "display_name": "Nemotron 3 Ultra 550B A55B", "modalities": { "input": [ "text" @@ -284134,44 +279743,57 @@ ] }, "limit": { - "context": 65536, - "output": 65536 + "context": 262144, + "output": 131072 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "low", + "medium", + "high", + "max" + ] + } + }, "attachment": false, "open_weights": true, "knowledge": "2025-09", - "release_date": "2026-08-11", - "last_updated": "2026-08-11", + "release_date": "2026-06-04", + "last_updated": "2026-06-04", "type": "chat" }, { - "id": "moonshotai/Kimi-K2.6", - "name": "Kimi K2.6", - "display_name": "Kimi K2.6", + "id": "gemini-3.1-flash-image", + "name": "Nano Banana 2", + "display_name": "Nano Banana 2", "modalities": { "input": [ "text", - "image" + "image", + "video", + "pdf" ], "output": [ - "text" + "text", + "image" ] }, "limit": { - "context": 32768, + "context": 131072, "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": true }, "extra_capabilities": { "reasoning": { @@ -284179,75 +279801,97 @@ } }, "attachment": true, - "open_weights": true, + "open_weights": false, "knowledge": "2025-01", - "release_date": "2026-04-20", - "last_updated": "2026-04-20", - "type": "chat" + "release_date": "2026-05-28", + "last_updated": "2026-05-28" }, { - "id": "moonshotai/Kimi-K2.6:peft:131072", - "name": "Kimi K2.6", - "display_name": "Kimi K2.6", + "id": "laguna-xs.2", + "name": "Laguna XS.2", + "display_name": "Laguna XS.2", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 131072 + "context": 32768, + "output": 32768 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true }, - "attachment": true, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "low", + "medium", + "high", + "max" + ] + } + }, + "attachment": false, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-20", - "last_updated": "2026-04-20", + "release_date": "2026-04-28", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "openai/gpt-oss-120b:peft:131072", - "name": "GPT OSS 120B", - "display_name": "GPT OSS 120B", + "id": "claude-opus-5", + "name": "Claude Opus 5", + "display_name": "Claude Opus 5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 131072 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "none", + "low", + "medium", + "high", + "max" + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2026-05", + "release_date": "2026-07-24", + "last_updated": "2026-07-24", "type": "chat" }, { - "id": "openai/gpt-oss-120b", - "name": "GPT OSS 120B", - "display_name": "GPT OSS 120B", + "id": "nemotron-3.5-lightning-30b-a3b", + "name": "Nemotron 3.5 Lightning 30B A3B", + "display_name": "Nemotron 3.5 Lightning 30B A3B", "modalities": { "input": [ "text" @@ -284257,8 +279901,8 @@ ] }, "limit": { - "context": 32768, - "output": 32768 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -284268,20 +279912,26 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "effort_options": [ + "none", + "low", + "medium", + "high", + "max" + ] } }, "attachment": false, "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "knowledge": "2025-09", + "release_date": "2026-08-11", + "last_updated": "2026-08-11", "type": "chat" }, { - "id": "openai/gpt-oss-20b", - "name": "GPT OSS 20B", - "display_name": "GPT OSS 20B", + "id": "ling-2.6-1t", + "name": "ling-2.6-1t", + "display_name": "ling-2.6-1t", "modalities": { "input": [ "text" @@ -284291,42 +279941,36 @@ ] }, "limit": { - "context": 32768, - "output": 32768 + "context": 262144, + "output": 262144 }, - "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, "attachment": false, - "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "open_weights": false, + "release_date": "2026-04-23", + "last_updated": "2026-04-23", "type": "chat" }, { - "id": "zai-org/GLM-5.3-Flash:peft:262144", - "name": "GLM-5.3-Flash", - "display_name": "GLM-5.3-Flash", + "id": "seed-2.0-mini", + "name": "Seed 2.0 Mini", + "display_name": "Seed 2.0 Mini", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 256000, + "output": 32000 }, "temperature": true, "tool_call": true, @@ -284334,27 +279978,41 @@ "supported": true, "default": true }, - "attachment": false, - "open_weights": true, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "low", + "medium", + "high", + "max" + ] + } + }, + "attachment": true, + "open_weights": false, + "release_date": "2026-02-14", + "last_updated": "2026-02-14", "type": "chat" }, { - "id": "zai-org/GLM-5.3:peft:262144", - "name": "GLM-5.3", - "display_name": "GLM-5.3", + "id": "muse-spark-open", + "name": "Muse Spark Open", + "display_name": "Muse Spark Open", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1048576, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -284362,44 +280020,70 @@ "supported": true, "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "low", + "medium", + "high", + "max" + ] + } + }, + "attachment": true, "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "knowledge": "2026-01-04", + "release_date": "2026-10-15", + "last_updated": "2026-10-15", "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-V3.1", - "name": "DeepSeek-V3.1", - "display_name": "DeepSeek-V3.1", + "id": "gpt-6-sol", + "name": "GPT-6 Sol", + "display_name": "GPT-6 Sol", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 32768, - "output": 32768 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": false, - "open_weights": true, - "release_date": "2025-08-21", - "last_updated": "2025-08-21", + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "low", + "medium", + "high", + "max" + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2026-04-20", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-V4.1-Flash:peft:262144", - "name": "DeepSeek V4.1 Flash", - "display_name": "DeepSeek V4.1 Flash", + "id": "nemotron-3-super-120b-a12b", + "name": "Nemotron 3 Super 120B A12B", + "display_name": "Nemotron 3 Super 120B A12B", "modalities": { "input": [ "text" @@ -284409,8 +280093,8 @@ ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -284418,28 +280102,42 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "low", + "medium", + "high", + "max" + ] + } + }, "attachment": false, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-09-10", - "last_updated": "2026-09-10", + "knowledge": "2025-06", + "release_date": "2026-03-11", + "last_updated": "2026-03-11", "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-V4.1-Flash-1017:peft:262144", - "name": "DeepSeek V4.1 Flash 1017", - "display_name": "DeepSeek V4.1 Flash 1017", + "id": "nemotron-3-nano-omni-30b-a3b-reasoning", + "name": "Nemotron 3 Nano Omni 30B A3B Reasoning", + "display_name": "Nemotron 3 Nano Omni 30B A3B Reasoning", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 131072, + "output": 20480 }, "temperature": true, "tool_call": true, @@ -284447,17 +280145,28 @@ "supported": true, "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "none", + "low", + "medium", + "high", + "max" + ] + } + }, + "attachment": true, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-10-17", - "last_updated": "2026-10-17", + "release_date": "2026-04-28", + "last_updated": "2026-04-28", "type": "chat" }, { - "id": "thinkingmachines/Inkling", - "name": "Inkling", - "display_name": "Inkling", + "id": "mistral-large-4", + "name": "Mistral Large 4", + "display_name": "Mistral Large 4", "modalities": { "input": [ "text", @@ -284468,8 +280177,8 @@ ] }, "limit": { - "context": 65536, - "output": 65536 + "context": 524288, + "output": 262144 }, "temperature": true, "tool_call": true, @@ -284480,36 +280189,37 @@ "extra_capabilities": { "reasoning": { "effort_options": [ + "none", "low", "medium", "high", - "xhigh", "max" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-07-15", - "last_updated": "2026-07-15", + "open_weights": false, + "release_date": "2026-10-06", + "last_updated": "2026-10-06", "type": "chat" }, { - "id": "thinkingmachines/Inkling-Small:peft:262144", - "name": "Inkling Small", - "display_name": "Inkling Small", + "id": "inkling", + "name": "Inkling", + "display_name": "Inkling", "modalities": { "input": [ "text", - "image" + "image", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 65536, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -284520,64 +280230,82 @@ "extra_capabilities": { "reasoning": { "effort_options": [ + "none", "low", "medium", "high", - "xhigh", "max" ] } }, "attachment": true, "open_weights": true, - "release_date": "2026-07-30", - "last_updated": "2026-07-30", + "release_date": "2026-07-15", + "last_updated": "2026-07-15", "type": "chat" }, { - "id": "thinkingmachines/Inkling:peft:262144:sampling-nvfp4", - "name": "Inkling", - "display_name": "Inkling", + "id": "claude-opus-4-5", + "name": "Claude Opus 4.5 (latest)", + "display_name": "Claude Opus 4.5 (latest)", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", "effort_options": [ "low", "medium", - "high", - "xhigh", - "max" + "high" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-07-15", - "last_updated": "2026-07-15", + "open_weights": false, + "knowledge": "2025-05", + "release_date": "2025-11-24", + "last_updated": "2025-11-24", "type": "chat" }, { - "id": "thinkingmachines/Inkling-Small:peft:262144:sampling-nvfp4", - "name": "Inkling Small", - "display_name": "Inkling Small", + "id": "gpt-5.4-pro", + "name": "GPT-5.4 Pro", + "display_name": "GPT-5.4 Pro", "modalities": { "input": [ "text", @@ -284588,10 +280316,10 @@ ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -284599,29 +280327,38 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", "effort_options": [ + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ "low", "medium", - "high", - "xhigh", - "max" - ] + "high" + ], + "visibility": "hidden" } }, "attachment": true, - "open_weights": true, - "release_date": "2026-07-30", - "last_updated": "2026-07-30", + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-03-05", + "last_updated": "2026-03-05", "type": "chat" }, { - "id": "thinkingmachines/Inkling:peft:262144", - "name": "Inkling (256K)", - "display_name": "Inkling (256K)", + "id": "nemotron-3-ultra-nvfp4", + "name": "nemotron-3-ultra-nvfp4", + "display_name": "nemotron-3-ultra-nvfp4", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" @@ -284631,7 +280368,6 @@ "context": 262144, "output": 262144 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -284640,38 +280376,39 @@ "extra_capabilities": { "reasoning": { "effort_options": [ + "none", "low", "medium", "high", - "xhigh", "max" ] } }, - "attachment": true, - "open_weights": true, - "release_date": "2026-07-15", - "last_updated": "2026-07-15", + "attachment": false, + "open_weights": false, + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "thinkingmachines/Inkling-Small", - "name": "Inkling Small", - "display_name": "Inkling Small", + "id": "claude-haiku-5-5", + "name": "Claude Haiku 5.5", + "display_name": "Claude Haiku 5.5", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 65536, - "output": 65536 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -284680,33 +280417,25 @@ "extra_capabilities": { "reasoning": { "effort_options": [ + "none", "low", "medium", "high", - "xhigh", "max" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-07-30", - "last_updated": "2026-07-30", + "open_weights": false, + "knowledge": "2026-06", + "release_date": "2026-10-07", + "last_updated": "2026-10-07", "type": "chat" - } - ] - }, - "tokenrouter": { - "id": "tokenrouter", - "name": "TokenRouter", - "display_name": "TokenRouter", - "api": "https://api.tokenrouter.com/v1", - "doc": "https://www.tokenrouter.com/docs/tokenrouter-feature-guide/", - "models": [ + }, { - "id": "z-ai/glm-5.3-free", - "name": "GLM-5.3 (free)", - "display_name": "GLM-5.3 (free)", + "id": "ling-3.0-tiny", + "name": "ling-3.0-tiny", + "display_name": "ling-3.0-tiny", "modalities": { "input": [ "text" @@ -284716,10 +280445,9 @@ ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 262144, + "output": 32768 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -284727,51 +280455,38 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ + "none", "low", + "medium", "high", "max" ] } }, "attachment": false, - "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "open_weights": false, + "release_date": "2026-08-05", + "last_updated": "2026-08-05", "type": "chat" - } - ] - }, - "engy": { - "id": "engy", - "name": "engy", - "display_name": "engy", - "api": "https://api.engy.ai/v1", - "doc": "https://engy.ai/pricing", - "models": [ + }, { - "id": "qwen3.8-27b", - "name": "Qwen3.8 27B", - "display_name": "Qwen3.8 27B", + "id": "kimi-k2.6", + "name": "Kimi K2.6", + "display_name": "Kimi K2.6", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1001536, - "output": 65536 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, @@ -284782,42 +280497,41 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ + "none", "low", "medium", - "xhigh" + "high", + "max" ] } }, "attachment": true, "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "knowledge": "2025-01", + "release_date": "2026-04-20", + "last_updated": "2026-04-20", "type": "chat" }, { - "id": "qwen3.6-35b-a3b", - "name": "Qwen3.6 35B-A3B", - "display_name": "Qwen3.6 35B-A3B", + "id": "gpt-6.1-sol", + "name": "GPT-6.1 Sol", + "display_name": "GPT-6.1 Sol", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 208192, - "output": 8192 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -284825,36 +280539,39 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "none", + "low", + "medium", + "high", + "max" ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-04-17", - "last_updated": "2026-04-17", + "attachment": true, + "open_weights": false, + "knowledge": "2026-04-30", + "release_date": "2026-09-29", + "last_updated": "2026-09-29", "type": "chat" }, { - "id": "glm-5.3", - "name": "GLM-5.3", - "display_name": "GLM-5.3", + "id": "minimax-m3", + "name": "MiniMax-M3", + "display_name": "MiniMax-M3", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 327680, - "output": 32768 + "context": 1000000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -284865,40 +280582,38 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ + "none", "low", + "medium", "high", "max" ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "release_date": "2026-06-01", + "last_updated": "2026-06-01", "type": "chat" }, { - "id": "deepseek-v4-flash-0731", - "name": "DeepSeek V4 Flash 0731", - "display_name": "DeepSeek V4 Flash 0731", + "id": "gemini-3-pro-image", + "name": "Nano Banana Pro", + "display_name": "Nano Banana Pro", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ - "text" + "text", + "image" ] }, "limit": { "context": 1048576, - "output": 128000 + "output": 32768 }, "temperature": true, "tool_call": true, @@ -284909,42 +280624,45 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "low", + "high" + ], "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "low", - "high", - "max" + "thought_signatures" ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-07-31", - "last_updated": "2026-07-31", - "type": "chat" + "attachment": true, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2026-05-28", + "last_updated": "2026-05-28" }, { - "id": "kimi-k3", - "name": "Kimi K3", - "display_name": "Kimi K3", + "id": "muse-wonder-1.0", + "name": "Muse Wonder", + "display_name": "Muse Wonder", "modalities": { "input": [ "text", - "image" + "image", + "video", + "pdf", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 1113088, - "output": 65536 + "context": 1048576, + "output": 943718 }, "temperature": true, "tool_call": true, @@ -284954,37 +280672,38 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "none", + "low", + "medium", + "high", + "max" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-16", + "open_weights": false, + "release_date": "2026-10-12", + "last_updated": "2026-10-12", "type": "chat" }, { - "id": "deepseek-v4.1-flash-1017", - "name": "DeepSeek V4.1 Flash 1017", - "display_name": "DeepSeek V4.1 Flash 1017", + "id": "minimax-m3.1-flash", + "name": "MiniMax-M3.1-Flash", + "display_name": "MiniMax-M3.1-Flash", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 1000000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -284994,34 +280713,29 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ + "none", "low", + "medium", "high", "max" ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-10-17", - "last_updated": "2026-10-17", + "open_weights": false, + "release_date": "2026-10-19", + "last_updated": "2026-10-19", "type": "chat" }, { - "id": "glm-5.2", - "name": "GLM-5.2", - "display_name": "GLM-5.2", + "id": "gemma-4-26b-a4b-it", + "name": "Gemma 4 26B A4B IT", + "display_name": "Gemma 4 26B A4B IT", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" @@ -285040,28 +280754,25 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ + "none", + "low", + "medium", "high", "max" ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "deepseek-v4.1-flash", - "name": "DeepSeek V4.1 Flash", - "display_name": "DeepSeek V4.1 Flash", + "id": "nemotron-3.5-content-safety", + "name": "Nemotron 3.5 Content Safety", + "display_name": "Nemotron 3.5 Content Safety", "modalities": { "input": [ "text", @@ -285072,11 +280783,11 @@ ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 131072, + "output": 8192 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true @@ -285084,14 +280795,10 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ + "none", "low", + "medium", "high", "max" ] @@ -285099,29 +280806,29 @@ }, "attachment": true, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-09-10", - "last_updated": "2026-09-10", + "release_date": "2026-06-02", + "last_updated": "2026-06-02", "type": "chat" }, { - "id": "glm-5.3-flash", - "name": "GLM-5.3-Flash", - "display_name": "GLM-5.3-Flash", + "id": "kimi-k3.1-pro-highspeed", + "name": "Kimi K3.1 Pro Highspeed", + "display_name": "Kimi K3.1 Pro Highspeed", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 327680, - "output": 32768 + "context": 1048576, + "output": 1048576 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -285129,50 +280836,38 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ + "none", "low", + "medium", "high", "max" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", + "open_weights": false, + "release_date": "2026-10-23", + "last_updated": "2026-10-23", "type": "chat" - } - ] - }, - "tencent-tokenhub": { - "id": "tencent-tokenhub", - "name": "Tencent TokenHub", - "display_name": "Tencent TokenHub", - "api": "https://tokenhub.tencentmaas.com/v1", - "doc": "https://cloud.tencent.com/document/product/1823/130050", - "models": [ + }, { - "id": "hy3", - "name": "Hy3", - "display_name": "Hy3", + "id": "step-5-preview", + "name": "Step 5 Preview", + "display_name": "Step 5 Preview", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 128000 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -285182,34 +280877,37 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ "none", - "high" + "low", + "medium", + "high", + "max" ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-07-06", - "last_updated": "2026-07-06", + "release_date": "2026-09-16", + "last_updated": "2026-09-20", "type": "chat" }, { - "id": "hy4-preview", - "name": "Hy4 preview", - "display_name": "Hy4 preview", + "id": "gemma-4-31b-it", + "name": "Gemma 4 31B IT", + "display_name": "Gemma 4 31B IT", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1024000, - "output": 64000 + "context": 262144, + "output": 8192 }, "temperature": true, "tool_call": true, @@ -285222,31 +280920,36 @@ "supported": true, "effort_options": [ "none", - "high" + "low", + "medium", + "high", + "max" ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-08-28", - "last_updated": "2026-08-28", + "knowledge": "2025-01", + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "hy3-preview", - "name": "Hy3 preview", - "display_name": "Hy3 preview", + "id": "mistral-medium-latest", + "name": "Mistral Medium (latest)", + "display_name": "Mistral Medium (latest)", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 64000 + "context": 131072, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -285257,43 +280960,37 @@ "extra_capabilities": { "reasoning": { "effort_options": [ + "none", "low", "medium", - "high" + "high", + "max" ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-04-20", - "last_updated": "2026-04-20", + "release_date": "2026-04-29", + "last_updated": "2026-04-29", "type": "chat" - } - ] - }, - "trustedrouter": { - "id": "trustedrouter", - "name": "TrustedRouter", - "display_name": "TrustedRouter", - "api": "https://api.trustedrouter.com/v1", - "doc": "https://trustedrouter.com/docs", - "models": [ + }, { - "id": "trustedrouter/synth-code", - "name": "Synth Code", - "display_name": "Synth Code", + "id": "mimo-v2.6-flash", + "name": "MiMo-V2.6-Flash", + "display_name": "MiMo-V2.6-Flash", "modalities": { "input": [ "text", "image", - "pdf" + "audio", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, + "context": 1048576, "output": 131072 }, "temperature": true, @@ -285308,32 +281005,33 @@ "none", "low", "medium", - "high" + "high", + "max" ] } }, "attachment": true, - "open_weights": false, - "release_date": "2026-06-20", - "last_updated": "2026-06-27", + "open_weights": true, + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "trustedrouter/cheap", - "name": "Cheap", - "display_name": "Cheap", + "id": "seed-2.0-code", + "name": "Seed 2.0 Code", + "display_name": "Seed 2.0 Code", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, + "context": 256000, "output": 131072 }, "temperature": true, @@ -285348,20 +281046,21 @@ "none", "low", "medium", - "high" + "high", + "max" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-05-01", - "last_updated": "2026-06-27", + "release_date": "2026-02-14", + "last_updated": "2026-02-14", "type": "chat" }, { - "id": "trustedrouter/auto", - "name": "Auto", - "display_name": "Auto", + "id": "claude-sonnet-5-5", + "name": "Claude Sonnet 5.5", + "display_name": "Claude Sonnet 5.5", "modalities": { "input": [ "text", @@ -285374,9 +281073,9 @@ }, "limit": { "context": 1000000, - "output": 131072 + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -285384,25 +281083,26 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ "none", "low", "medium", - "high" + "high", + "max" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-05-01", - "last_updated": "2026-06-27", + "knowledge": "2026-06", + "release_date": "2026-09-28", + "last_updated": "2026-09-28", "type": "chat" }, { - "id": "trustedrouter/e2e", - "name": "End-to-End Encrypted", - "display_name": "End-to-End Encrypted", + "id": "claude-opus-4-1", + "name": "Claude Opus 4.1 (latest)", + "display_name": "Claude Opus 4.1 (latest)", "modalities": { "input": [ "text", @@ -285414,50 +281114,62 @@ ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 200000, + "output": 32000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "high" + "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-06-01", - "last_updated": "2026-06-27", + "knowledge": "2025-03-31", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "trustedrouter/zdr", - "name": "Zero Data Retention", - "display_name": "Zero Data Retention", + "id": "seed-2.0-pro", + "name": "Seed 2.0 Pro", + "display_name": "Seed 2.0 Pro", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 256000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -285469,33 +281181,36 @@ "none", "low", "medium", - "high" + "high", + "max" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-06-01", - "last_updated": "2026-06-27", + "release_date": "2026-02-14", + "last_updated": "2026-02-14", "type": "chat" }, { - "id": "trustedrouter/synth", - "name": "Synth", - "display_name": "Synth", + "id": "muse-spark-1.3", + "name": "Muse Spark 1.3", + "display_name": "Muse Spark 1.3", "modalities": { "input": [ "text", "image", - "pdf" + "video", + "pdf", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 1048576, + "output": 943718 }, "temperature": true, "tool_call": true, @@ -285505,24 +281220,26 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ "none", "low", "medium", - "high" + "high", + "max" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-06-20", - "last_updated": "2026-06-27", + "release_date": "2026-09-02", + "last_updated": "2026-09-02", "type": "chat" }, { - "id": "trustedrouter/fast", - "name": "Fast", - "display_name": "Fast", + "id": "claude-sonnet-5", + "name": "Claude Sonnet 5", + "display_name": "Claude Sonnet 5", "modalities": { "input": [ "text", @@ -285535,9 +281252,9 @@ }, "limit": { "context": 1000000, - "output": 131072 + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -285545,33 +281262,27 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ "none", "low", "medium", - "high" + "high", + "max" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-06-01", - "last_updated": "2026-06-27", + "knowledge": "2026-01-31", + "release_date": "2026-06-30", + "last_updated": "2026-06-30", "type": "chat" - } - ] - }, - "ai21": { - "id": "ai21", - "name": "AI21 Labs", - "display_name": "AI21 Labs", - "api": "https://api.ai21.com/studio/v1", - "doc": "https://docs.ai21.com/docs/jamba-foundation-models", - "models": [ + }, { - "id": "jamba-mini", - "name": "Jamba Mini", - "display_name": "Jamba Mini", + "id": "deepseek-v4-pro", + "name": "DeepSeek V4 Pro", + "display_name": "DeepSeek V4 Pro", "modalities": { "input": [ "text" @@ -285581,62 +281292,89 @@ ] }, "limit": { - "context": 256000, - "output": 4096 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "high", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." + ] + } }, "attachment": false, "open_weights": true, - "knowledge": "2024-08-22", - "release_date": "2026-01-08", - "last_updated": "2026-01-08", + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "jamba-large", - "name": "Jamba Large", - "display_name": "Jamba Large", + "id": "deepseek-v4.1-flash-1017", + "name": "DeepSeek V4.1 Flash 1017", + "display_name": "DeepSeek V4.1 Flash 1017", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 4096 + "context": 1048576, + "output": 393216 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "low", + "medium", + "high", + "max" + ] + } + }, + "attachment": true, "open_weights": true, - "knowledge": "2024-08-22", - "release_date": "2025-07-03", - "last_updated": "2025-07-03", + "knowledge": "2025-05", + "release_date": "2026-10-17", + "last_updated": "2026-10-17", "type": "chat" - } - ] - }, - "kosmik": { - "id": "kosmik", - "name": "Kosmik Compute", - "display_name": "Kosmik Compute", - "api": "https://api.koscompute.com/v1", - "doc": "https://api.koscompute.com/docs/", - "models": [ + }, { - "id": "qwen/qwen3.8-27b", - "name": "Qwen3.8 27B", - "display_name": "Qwen3.8 27B", + "id": "gpt-5.4-nano", + "name": "GPT-5.4 nano", + "display_name": "GPT-5.4 nano", "modalities": { "input": [ "text", @@ -285647,63 +281385,61 @@ ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 400000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], + "default_enabled": false, + "mode": "effort", + "effort": "none", "effort_options": [ "none", "low", "medium", + "high", "xhigh" - ] + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, - "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-03-17", + "last_updated": "2026-03-17", "type": "chat" - } - ] - }, - "inco": { - "id": "inco", - "name": "Inco", - "display_name": "Inco", - "api": "https://api.inco.ai/v1", - "doc": "https://platform.inco.ai/docs", - "models": [ + }, { - "id": "deepseek-v4.1-flash:fast", - "name": "DeepSeek V4.1 Flash", - "display_name": "DeepSeek V4.1 Flash", + "id": "qwen3.5-27b", + "name": "Qwen3.5 27B", + "display_name": "Qwen3.5 27B", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 262144, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -285719,25 +281455,29 @@ "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "effort_options": [ + "none", + "low", + "medium", + "high", + "max" ] } }, "attachment": true, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-09-10", - "last_updated": "2026-09-10", + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" }, { - "id": "kimi-k3:fast", - "name": "Kimi K3", - "display_name": "Kimi K3", + "id": "nemotron-3-ultra-550b-a55b", + "name": "Nemotron 3 Ultra 550B A55B", + "display_name": "Nemotron 3 Ultra 550B A55B", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" @@ -285745,9 +281485,9 @@ }, "limit": { "context": 1048576, - "output": 131072 + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -285756,37 +281496,43 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "none", + "low", + "medium", + "high", + "max" ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-16", + "knowledge": "2025-09", + "release_date": "2026-06-04", + "last_updated": "2026-06-04", "type": "chat" }, { - "id": "glm-5.3", - "name": "GLM-5.3", - "display_name": "GLM-5.3", + "id": "gemini-4-argon", + "name": "Gemini 4 Argon", + "display_name": "Gemini 4 Argon", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 1048576, + "output": 65536 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -285794,40 +281540,38 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "none", + "low", + "medium", + "high", + "max" ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "attachment": true, + "open_weights": false, + "knowledge": "2026-03", + "release_date": "2026-10-13", + "last_updated": "2026-10-13", "type": "chat" }, { - "id": "minimax-m3:fast", - "name": "MiniMax M3 Fast", - "display_name": "MiniMax M3 Fast", + "id": "devstral-latest", + "name": "devstral-latest", + "display_name": "devstral-latest", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 512000 + "context": 256000, + "output": 256000 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -285835,28 +281579,30 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "none", + "low", + "medium", + "high", + "max" ] } }, - "attachment": true, - "open_weights": true, - "release_date": "2026-06-01", - "last_updated": "2026-06-01", + "attachment": false, + "open_weights": false, + "release_date": "2026-05-27", + "last_updated": "2026-05-27", "type": "chat" }, { - "id": "glm-5.3:fast", - "name": "GLM-5.3 Fast", - "display_name": "GLM-5.3 Fast", + "id": "claude-fable-5.1", + "name": "Claude Fable 5.1", + "display_name": "Claude Fable 5.1", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" @@ -285864,9 +281610,9 @@ }, "limit": { "context": 1000000, - "output": 131072 + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -285875,29 +281621,47 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], "interleaved": true, "summaries": true, - "visibility": "summary", + "visibility": "omitted", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", + "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", + "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "attachment": true, + "open_weights": false, + "knowledge": "2026-06", + "release_date": "2026-09-01", + "last_updated": "2026-09-01", "type": "chat" }, { - "id": "minimax-m3", - "name": "MiniMax-M3", - "display_name": "MiniMax-M3", + "id": "gemini-3.7-flash", + "name": "Gemini 3.7 Flash", + "display_name": "Gemini 3.7 Flash", "modalities": { "input": [ "text", "image", - "video" + "video", + "audio", + "pdf" ], "output": [ "text" @@ -285905,7 +281669,7 @@ }, "limit": { "context": 1048576, - "output": 512000 + "output": 65535 }, "temperature": true, "tool_call": true, @@ -285916,37 +281680,45 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", + "low", + "medium", + "high" + ], "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" + "thought_signatures" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-06-01", - "last_updated": "2026-06-01", + "open_weights": false, + "knowledge": "2026-03", + "release_date": "2026-08-13", + "last_updated": "2026-08-13", "type": "chat" }, { - "id": "glm-5.3-flash:fast", - "name": "GLM-5.3-Flash", - "display_name": "GLM-5.3-Flash", + "id": "qwen3.7-plus", + "name": "Qwen3.7 Plus", + "display_name": "Qwen3.7 Plus", "modalities": { "input": [ "text", "image", - "video", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, + "context": 1048576, "output": 131072 }, "temperature": true, @@ -285958,38 +281730,30 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "none", + "low", + "medium", + "high", + "max" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", - "type": "chat" - } - ] - }, - "cline-pass": { - "id": "cline-pass", - "name": "ClinePass", - "display_name": "ClinePass", - "api": "https://api.cline.bot/api/v1", - "doc": "https://docs.cline.bot/getting-started/clinepass", - "models": [ + "open_weights": false, + "knowledge": "2025-04", + "release_date": "2026-06-02", + "last_updated": "2026-06-02", + "type": "chat" + }, { - "id": "cline-pass/mimo-v2.5", - "name": "MiMo-V2.5", - "display_name": "MiMo-V2.5", + "id": "kimi-k3", + "name": "Kimi K3", + "display_name": "Kimi K3", "modalities": { "input": [ "text", "image", - "audio", "video" ], "output": [ @@ -285998,30 +281762,40 @@ }, "limit": { "context": 1048576, - "output": 131072 + "output": 262144 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "none", + "low", + "medium", + "high", + "max" + ] + } + }, "attachment": true, "open_weights": true, - "knowledge": "2024-12", - "release_date": "2026-04-22", - "last_updated": "2026-04-22", + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" }, { - "id": "cline-pass/mimo-v2.6-pro", - "name": "MiMo-V2.6-Pro", - "display_name": "MiMo-V2.6-Pro", + "id": "step-3.7-flash", + "name": "Step 3.7 Flash", + "display_name": "Step 3.7 Flash", "modalities": { "input": [ "text", "image", - "audio", "video" ], "output": [ @@ -286029,8 +281803,8 @@ ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 262144, + "output": 256000 }, "temperature": true, "tool_call": true, @@ -286045,27 +281819,26 @@ "low", "medium", "high", - "xhigh" + "max" ] } }, "attachment": true, "open_weights": true, - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "knowledge": "2026-03-01", + "release_date": "2026-05-29", + "last_updated": "2026-05-29", "type": "chat" }, { - "id": "cline-pass/muse-spark-1.3-contributor", - "name": "Muse Spark 1.3 Contributor", - "display_name": "Muse Spark 1.3 Contributor", + "id": "qwen3.8-flash", + "name": "Qwen3.8 Flash", + "display_name": "Qwen3.8 Flash", "modalities": { "input": [ "text", "image", - "video", - "pdf", - "audio" + "video" ], "output": [ "text" @@ -286083,38 +281856,41 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ - "minimal", + "none", "low", "medium", "high", - "xhigh" + "max" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-09-02", - "last_updated": "2026-09-02", + "release_date": "2026-08-26", + "last_updated": "2026-08-26", "type": "chat" }, { - "id": "cline-pass/deepseek-v4-flash", - "name": "DeepSeek V4 Flash", - "display_name": "DeepSeek V4 Flash", + "id": "gpt-5.5-pro", + "name": "GPT-5.5 Pro", + "display_name": "GPT-5.5 Pro", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -286123,41 +281899,31 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", "effort_options": [ + "none", "low", + "medium", "high", "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "attachment": true, + "open_weights": false, + "knowledge": "2025-12-01", + "release_date": "2026-04-23", + "last_updated": "2026-04-23", "type": "chat" }, { - "id": "cline-pass/qwen3.7-plus", - "name": "Qwen3.7 Plus", - "display_name": "Qwen3.7 Plus", + "id": "grok-4.3", + "name": "Grok 4.3", + "display_name": "Grok 4.3", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" @@ -286165,7 +281931,7 @@ }, "limit": { "context": 1000000, - "output": 64000 + "output": 30000 }, "temperature": true, "tool_call": true, @@ -286175,33 +281941,39 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "effort_options": [ + "none", + "low", + "medium", + "high", + "max" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-04", - "release_date": "2026-06-02", - "last_updated": "2026-06-02", + "release_date": "2026-04-17", + "last_updated": "2026-04-17", "type": "chat" }, { - "id": "cline-pass/kimi-k2.7-code", - "name": "Kimi K2.7 Code", - "display_name": "Kimi K2.7 Code", + "id": "gpt-5.5", + "name": "GPT-5.5", + "display_name": "GPT-5.5", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1050000, + "output": 128000 }, "temperature": false, "tool_call": true, @@ -286211,25 +281983,42 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-06-12", - "last_updated": "2026-06-12", + "open_weights": false, + "knowledge": "2025-12-01", + "release_date": "2026-04-23", + "last_updated": "2026-04-23", "type": "chat" }, { - "id": "cline-pass/qwen3.8-max", - "name": "Qwen3.8 Max", - "display_name": "Qwen3.8 Max", + "id": "gemini-3.5-flash", + "name": "Gemini 3.5 Flash", + "display_name": "Gemini 3.5 Flash", "modalities": { "input": [ "text", "image", "video", + "audio", "pdf" ], "output": [ @@ -286237,8 +282026,8 @@ ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 1048576, + "output": 65535 }, "temperature": true, "tool_call": true, @@ -286249,35 +282038,46 @@ "extra_capabilities": { "reasoning": { "supported": true, - "effort_options": [ - "none", + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", "low", "medium", - "xhigh" + "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-08-03", - "last_updated": "2026-08-03", + "knowledge": "2025-01", + "release_date": "2026-05-19", + "last_updated": "2026-05-19", "type": "chat" }, { - "id": "cline-pass/deepseek-v4-pro", - "name": "DeepSeek V4 Pro", - "display_name": "DeepSeek V4 Pro", + "id": "mistral-medium-3-5", + "name": "Mistral Medium 3.5", + "display_name": "Mistral Medium 3.5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 262144, + "output": 209715 }, "temperature": true, "tool_call": true, @@ -286287,40 +282087,31 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", "effort_options": [ + "none", "low", + "medium", "high", "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "attachment": true, + "open_weights": false, + "release_date": "2026-04-30", + "last_updated": "2026-04-30", "type": "chat" }, { - "id": "cline-pass/glm-5.3", - "name": "GLM-5.3", - "display_name": "GLM-5.3", + "id": "glm-5.3-flash", + "name": "GLM-5.3-Flash", + "display_name": "GLM-5.3-Flash", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "pdf" ], "output": [ "text" @@ -286328,7 +282119,7 @@ }, "limit": { "context": 1000000, - "output": 131072 + "output": 262144 }, "temperature": true, "tool_call": true, @@ -286339,40 +282130,38 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ + "none", "low", + "medium", "high", "max" ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "release_date": "2026-08-26", + "last_updated": "2026-08-26", "type": "chat" }, { - "id": "cline-pass/qwen3.7-max", - "name": "Qwen3.7 Max", - "display_name": "Qwen3.7 Max", + "id": "qwen3.8-flash-next", + "name": "Qwen3.8 Flash Next", + "display_name": "Qwen3.8 Flash Next", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, @@ -286382,24 +282171,28 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "effort_options": [ + "none", + "low", + "medium", + "high", + "max" + ] } }, - "attachment": false, - "open_weights": false, - "release_date": "2026-05-21", - "last_updated": "2026-05-21", + "attachment": true, + "open_weights": true, + "release_date": "2026-08-27", + "last_updated": "2026-08-27", "type": "chat" }, { - "id": "cline-pass/kimi-k2.6", - "name": "Kimi K2.6", - "display_name": "Kimi K2.6", + "id": "ling-2.6-flash", + "name": "ling-2.6-flash", + "display_name": "ling-2.6-flash", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" @@ -286409,43 +282202,35 @@ "context": 262144, "output": 262144 }, - "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, - "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-20", - "last_updated": "2026-04-20", + "attachment": false, + "open_weights": false, + "release_date": "2026-04-21", + "last_updated": "2026-04-21", "type": "chat" }, { - "id": "cline-pass/kimi-k3", - "name": "Kimi K3", - "display_name": "Kimi K3", + "id": "inkling-256k", + "name": "Inkling 256K", + "display_name": "Inkling 256K", "modalities": { "input": [ "text", "image", - "video" + "audio" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 262144, + "output": 32768 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -286453,10 +282238,10 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ "none", "low", + "medium", "high", "max" ] @@ -286464,17 +282249,21 @@ }, "attachment": true, "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-16", + "release_date": "2026-07-15", + "last_updated": "2026-07-15", "type": "chat" }, { - "id": "cline-pass/mimo-v2.5-pro", - "name": "MiMo-V2.5-Pro", - "display_name": "MiMo-V2.5-Pro", + "id": "gemini-3.8-flash", + "name": "Gemini 3.8 Flash", + "display_name": "Gemini 3.8 Flash", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio", + "pdf" ], "output": [ "text" @@ -286482,7 +282271,7 @@ }, "limit": { "context": 1048576, - "output": 131072 + "output": 65535 }, "temperature": true, "tool_call": true, @@ -286490,17 +282279,35 @@ "supported": true, "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-12", - "release_date": "2026-04-22", - "last_updated": "2026-04-22", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", + "low", + "medium", + "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] + } + }, + "attachment": true, + "open_weights": false, + "release_date": "2026-09-02", + "last_updated": "2026-09-02", "type": "chat" }, { - "id": "cline-pass/glm-5.2", - "name": "GLM-5.2", - "display_name": "GLM-5.2", + "id": "deepseek-v4-pro-0813", + "name": "DeepSeek V4 Pro 0813", + "display_name": "DeepSeek V4 Pro 0813", "modalities": { "input": [ "text" @@ -286524,6 +282331,8 @@ "supported": true, "effort_options": [ "none", + "low", + "medium", "high", "max" ] @@ -286531,28 +282340,29 @@ }, "attachment": false, "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "release_date": "2026-08-13", + "last_updated": "2026-08-22", "type": "chat" }, { - "id": "cline-pass/deepseek-v4.1-flash", - "name": "DeepSeek V4.1 Flash", - "display_name": "DeepSeek V4.1 Flash", + "id": "gpt-6-astra", + "name": "GPT-6 Astra", + "display_name": "GPT-6 Astra", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -286564,35 +282374,34 @@ "effort_options": [ "none", "low", + "medium", "high", "max" ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-09-10", - "last_updated": "2026-09-10", + "open_weights": false, + "knowledge": "2026-04-30", + "release_date": "2026-09-04", + "last_updated": "2026-09-04", "type": "chat" }, { - "id": "cline-pass/minimax-m3", - "name": "MiniMax-M3", - "display_name": "MiniMax-M3", + "id": "glm-5.1", + "name": "GLM-5.1", + "display_name": "GLM-5.1", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 512000 + "context": 200000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -286602,24 +282411,32 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "effort_options": [ + "none", + "low", + "medium", + "high", + "max" + ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-06-01", - "last_updated": "2026-06-01", + "release_date": "2026-04-07", + "last_updated": "2026-04-07", "type": "chat" }, { - "id": "cline-pass/glm-5.3-flash", - "name": "cline-pass/glm-5.3-flash", - "display_name": "cline-pass/glm-5.3-flash", + "id": "gemini-3.6-flash", + "name": "Gemini 3.6 Flash", + "display_name": "Gemini 3.6 Flash", "modalities": { "input": [ "text", "image", "video", + "audio", "pdf" ], "output": [ @@ -286627,8 +282444,8 @@ ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 1048576, + "output": 65535 }, "temperature": true, "tool_call": true, @@ -286639,43 +282456,46 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", + "low", + "medium", + "high" + ], "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "low", - "high", - "max" + "thought_signatures" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", + "open_weights": false, + "knowledge": "2026-03", + "release_date": "2026-07-21", + "last_updated": "2026-07-21", "type": "chat" }, { - "id": "cline-pass/mimo-v2.6-flash", - "name": "MiMo-V2.6-Flash", - "display_name": "MiMo-V2.6-Flash", + "id": "grok-4.7", + "name": "Grok 4.7", + "display_name": "Grok 4.7", "modalities": { "input": [ "text", "image", - "audio", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 500000, + "output": 500000 }, "temperature": true, "tool_call": true, @@ -286690,41 +282510,41 @@ "low", "medium", "high", - "xhigh" + "max" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "open_weights": false, + "knowledge": "2026-05", + "release_date": "2026-09-21", + "last_updated": "2026-09-21", "type": "chat" } ] }, - "wandb": { - "id": "wandb", - "name": "CoreWeave", - "display_name": "CoreWeave", - "api": "https://api.inference.wandb.ai/v1", - "doc": "https://docs.wandb.ai/inference", + "scx-ai": { + "id": "scx-ai", + "name": "SCX.ai", + "display_name": "SCX.ai", + "api": "https://api.scx.ai/v1", + "doc": "https://platform.scx.ai/docs", "models": [ { - "id": "Qwen/Qwen3.6-35B-A3B", - "name": "Qwen3.6 35B A3B", - "display_name": "Qwen3.6 35B A3B", + "id": "MiniMax-M2.7", + "name": "MiniMax-M2.7", + "display_name": "MiniMax-M2.7", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 196608, + "output": 196608 }, "temperature": true, "tool_call": true, @@ -286740,31 +282560,35 @@ "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "effort_options": [ + "low", + "medium", + "high" ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-04-17", - "last_updated": "2026-04-17", + "release_date": "2026-03-18", + "last_updated": "2026-03-18", "type": "chat" }, { - "id": "Qwen/Qwen3.8-27B", - "name": "Qwen3.8 27B", - "display_name": "Qwen3.8 27B", + "id": "GLM-5.2", + "name": "GLM-5.2", + "display_name": "GLM-5.2", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -286772,16 +282596,32 @@ "supported": true, "default": true }, - "attachment": true, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "none", + "high", + "max" + ] + } + }, + "attachment": false, "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "ibm-granite/granite-4.2-8b", - "name": "Granite 4.2 8B", - "display_name": "Granite 4.2 8B", + "id": "gpt-oss-120b", + "name": "GPT OSS 120B", + "display_name": "GPT OSS 120B", "modalities": { "input": [ "text" @@ -286800,28 +282640,46 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "low", + "medium", + "high" + ] + } + }, "attachment": false, "open_weights": true, - "release_date": "2026-08-25", - "last_updated": "2026-08-25", + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "MiniMaxAI/MiniMax-M3", - "name": "MiniMax M3", - "display_name": "MiniMax M3", + "id": "Qwen3.8-Max", + "name": "Qwen3.8 Max", + "display_name": "Qwen3.8 Max", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -286831,48 +282689,40 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "none", + "low", + "medium", + "xhigh" + ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-06-01", - "last_updated": "2026-06-01", - "type": "chat" - }, - { - "id": "nvidia/NVIDIA-Nemotron-3.5-Super-VL-120B-A12B", - "name": "Nemotron 3.5 Super VL", - "display_name": "Nemotron 3.5 Super VL", - "modalities": { - "input": [ - "text", - "image" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 1048576, - "output": 1048576 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "attachment": true, - "open_weights": true, - "release_date": "2026-10-15", - "last_updated": "2026-10-15", + "open_weights": false, + "release_date": "2026-08-03", + "last_updated": "2026-08-03", "type": "chat" - }, + } + ] + }, + "tinfoil": { + "id": "tinfoil", + "name": "Tinfoil", + "display_name": "Tinfoil", + "api": "https://inference.tinfoil.sh/v1", + "doc": "https://docs.tinfoil.sh", + "models": [ { - "id": "nvidia/NVIDIA-Nemotron-3.5-Lightning-30B-A3B", - "name": "Nemotron 3.5 Lightning", - "display_name": "Nemotron 3.5 Lightning", + "id": "gpt-oss-safeguard-120b", + "name": "gpt-oss-safeguard-120b", + "display_name": "gpt-oss-safeguard-120b", "modalities": { "input": [ "text" @@ -286882,37 +282732,37 @@ ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 131072, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, "open_weights": true, - "knowledge": "2025-09", - "release_date": "2026-08-11", - "last_updated": "2026-08-11", + "knowledge": "2024-06", + "release_date": "2025-10-29", + "last_updated": "2025-10-29", "type": "chat" }, { - "id": "nvidia/NVIDIA-Nemotron-3-Ultra-550B-A55B", - "name": "Nemotron 3 Ultra", - "display_name": "Nemotron 3 Ultra", + "id": "deepseek-v4-1-flash", + "name": "DeepSeek V4.1 Flash", + "display_name": "DeepSeek V4.1 Flash", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1048576, + "output": 384000 }, "temperature": true, "tool_call": true, @@ -286920,17 +282770,30 @@ "supported": true, "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "minimal", + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + }, + "attachment": true, "open_weights": true, - "knowledge": "2025-09", - "release_date": "2026-06-04", - "last_updated": "2026-06-04", + "knowledge": "2025-05", + "release_date": "2026-09-10", + "last_updated": "2026-09-10", "type": "chat" }, { - "id": "google/gemma-4-26B-A4B-it", - "name": "Gemma 4 26B A4B", - "display_name": "Gemma 4 26B A4B", + "id": "gemma4-31b", + "name": "Gemma 4 31B IT", + "display_name": "Gemma 4 31B IT", "modalities": { "input": [ "text", @@ -286942,7 +282805,7 @@ }, "limit": { "context": 262144, - "output": 262144 + "output": 32768 }, "temperature": true, "tool_call": true, @@ -286952,31 +282815,39 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "effort_options": [ + "none", + "minimal", + "low", + "medium", + "high", + "xhigh", + "max" + ] } }, "attachment": true, "open_weights": true, + "knowledge": "2025-01", "release_date": "2026-04-02", "last_updated": "2026-04-02", "type": "chat" }, { - "id": "google/gemma-4-31B-it", - "name": "Gemma 4 31B", - "display_name": "Gemma 4 31B", + "id": "gpt-oss-120b", + "name": "gpt-oss-120b", + "display_name": "gpt-oss-120b", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 131072, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -286986,32 +282857,36 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "effort_options": [ + "low", + "medium", + "high" + ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "moonshotai/Kimi-K2.6", - "name": "Kimi K2.6", - "display_name": "Kimi K2.6", + "id": "glm-5-3", + "name": "GLM-5.3", + "display_name": "GLM-5.3", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1048576, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -287021,24 +282896,28 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "effort_options": [ + "low", + "high", + "max" + ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-20", - "last_updated": "2026-04-20", + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "moonshotai/Kimi-K2.7-Code", - "name": "Kimi K2.7 Code", - "display_name": "Kimi K2.7 Code", + "id": "kimi-k3", + "name": "Kimi K3", + "display_name": "Kimi K3", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" @@ -287046,9 +282925,9 @@ }, "limit": { "context": 262144, - "output": 262144 + "output": 131072 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -287056,20 +282935,24 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "effort_options": [ + "low", + "high", + "max" + ] } }, "attachment": true, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-06-12", - "last_updated": "2026-06-12", + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" }, { - "id": "reflection/Beam-1.0-501B-A23B", - "name": "Beam 1.0 501B A23B", - "display_name": "Beam 1.0 501B A23B", + "id": "llama3-3-70b", + "name": "Llama-3.3-70B-Instruct", + "display_name": "Llama-3.3-70B-Instruct", "modalities": { "input": [ "text" @@ -287079,38 +282962,25 @@ ] }, "limit": { - "context": 1048576, - "output": 1048576 + "context": 131072, + "output": 4096 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "minimal", - "low", - "medium", - "high", - "xhigh", - "max" - ] - } + "supported": false }, "attachment": false, "open_weights": true, - "knowledge": "2026-06-30", - "release_date": "2026-10-05", - "last_updated": "2026-10-16", + "knowledge": "2023-12", + "release_date": "2024-12-06", + "last_updated": "2024-12-06", "type": "chat" }, { - "id": "openai/gpt-oss-120b", - "name": "gpt-oss-120b", - "display_name": "gpt-oss-120b", + "id": "nomic-embed-text", + "name": "Nomic Embed Text v1.5", + "display_name": "Nomic Embed Text v1.5", "modalities": { "input": [ "text" @@ -287120,42 +282990,45 @@ ] }, "limit": { - "context": 131072, - "output": 131072 + "context": 8192, + "output": 768 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, "attachment": false, "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "release_date": "2024-02", + "last_updated": "2024-02", "type": "chat" - }, + } + ] + }, + "llmtech": { + "id": "llmtech", + "name": "LLM Tech", + "display_name": "LLM Tech", + "api": "https://api.llmtech.eu/v1", + "doc": "https://llmtech.eu/models/qwen3.8-27b", + "models": [ { - "id": "openai/gpt-oss-20b", - "name": "gpt-oss-20b", - "display_name": "gpt-oss-20b", + "id": "nvidia/Qwen3.8-27B-NVFP4", + "name": "Qwen3.8 27B", + "display_name": "Qwen3.8 27B", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 131072 + "context": 262144, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -287165,20 +283038,32 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "effort_options": [ + "low", + "medium", + "xhigh" + ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" - }, + } + ] + }, + "sensenova": { + "id": "sensenova", + "name": "SenseNova (China)", + "display_name": "SenseNova (China)", + "api": "https://token.sensenova.cn/v1", + "doc": "https://platform.sensenova.cn/docs", + "models": [ { - "id": "zai-org/GLM-5.3", - "name": "GLM 5.3", - "display_name": "GLM 5.3", + "id": "glm-5.2", + "name": "GLM-5.2", + "display_name": "GLM-5.2", "modalities": { "input": [ "text" @@ -287188,8 +283073,8 @@ ] }, "limit": { - "context": 1048576, - "output": 1048576 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -287200,23 +283085,28 @@ "extra_capabilities": { "reasoning": { "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ - "low", - "high", - "max" + "none", + "high" ] } }, "attachment": false, "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "zai-org/GLM-5.2", - "name": "GLM 5.2", - "display_name": "GLM 5.2", + "id": "deepseek-v4-flash", + "name": "DeepSeek V4 Flash", + "display_name": "DeepSeek V4 Flash", "modalities": { "input": [ "text" @@ -287226,8 +283116,8 @@ ] }, "limit": { - "context": 1048576, - "output": 1048576 + "context": 1000000, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -287237,19 +283127,37 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "high", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." + ] } }, "attachment": false, "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "zai-org/GLM-5.3-Flash", - "name": "GLM 5.3 Flash", - "display_name": "GLM 5.3 Flash", + "id": "deepseek-v4.1-flash", + "name": "DeepSeek V4.1 Flash", + "display_name": "DeepSeek V4.1 Flash", "modalities": { "input": [ "text", @@ -287261,7 +283169,7 @@ }, "limit": { "context": 1048576, - "output": 1048576 + "output": 65536 }, "temperature": true, "tool_call": true, @@ -287271,19 +283179,32 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "none", + "low", + "high", + "max" + ] } }, "attachment": true, "open_weights": true, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", + "knowledge": "2025-05", + "release_date": "2026-09-10", + "last_updated": "2026-09-10", "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-V3.1", - "name": "DeepSeek V3.1", - "display_name": "DeepSeek V3.1", + "id": "deepseek-v4-pro", + "name": "DeepSeek V4 Pro", + "display_name": "DeepSeek V4 Pro", "modalities": { "input": [ "text" @@ -287293,27 +283214,51 @@ ] }, "limit": { - "context": 161000, - "output": 161000 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "high", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." + ] + } }, "attachment": false, "open_weights": true, - "release_date": "2025-08-21", - "last_updated": "2025-08-21", + "release_date": "2026-08-13", + "last_updated": "2026-08-22", "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-V4-Pro-0813", - "name": "DeepSeek V4 Pro 0813", - "display_name": "DeepSeek V4 Pro 0813", + "id": "kimi-k3", + "name": "Kimi K3", + "display_name": "Kimi K3", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" @@ -287321,9 +283266,9 @@ }, "limit": { "context": 1048576, - "output": 1048576 + "output": 65536 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -287331,22 +283276,34 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "low", + "high", + "max" + ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-08-13", - "last_updated": "2026-08-22", + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-V4-Flash-0731", - "name": "DeepSeek V4 Flash 0731", - "display_name": "DeepSeek V4 Flash 0731", + "id": "sensenova-6.8-flash-lite", + "name": "SenseNova 6.8 Flash Lite", + "display_name": "SenseNova 6.8 Flash Lite", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" @@ -287354,7 +283311,7 @@ }, "limit": { "context": 262144, - "output": 262144 + "output": 65536 }, "temperature": true, "tool_call": true, @@ -287364,18 +283321,31 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "effort_options": [ + "none", + "low", + "medium", + "high" + ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-07-31", - "last_updated": "2026-07-31", + "attachment": true, + "open_weights": false, + "release_date": "2026-08-11", + "last_updated": "2026-08-28", "type": "chat" - }, + } + ] + }, + "coralbricks": { + "id": "coralbricks", + "name": "CoralBricks", + "display_name": "CoralBricks", + "api": "https://inference.coralbricks.ai/v1", + "doc": "https://www.coralbricks.ai/docs", + "models": [ { - "id": "deepseek-ai/DeepSeek-V4.1-Flash", + "id": "deepseek-v4.1-flash-fast", "name": "DeepSeek V4.1 Flash", "display_name": "DeepSeek V4.1 Flash", "modalities": { @@ -287389,7 +283359,7 @@ }, "limit": { "context": 1048576, - "output": 1048576 + "output": 393216 }, "temperature": true, "tool_call": true, @@ -287399,7 +283369,14 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "effort_options": [ + "none", + "low", + "high", + "max" + ] } }, "attachment": true, @@ -287408,11 +283385,19 @@ "release_date": "2026-09-10", "last_updated": "2026-09-10", "type": "chat" - }, + } + ] + }, + "amazon-bedrock": { + "id": "amazon-bedrock", + "name": "Amazon Bedrock", + "display_name": "Amazon Bedrock", + "doc": "https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html", + "models": [ { - "id": "meta-llama/Llama-3.3-70B-Instruct", - "name": "Llama 3.3 70B", - "display_name": "Llama 3.3 70B", + "id": "qwen.qwen3-coder-480b-a35b-v1:0", + "name": "Qwen3-Coder 480B-A35B Instruct", + "display_name": "Qwen3-Coder 480B-A35B Instruct", "modalities": { "input": [ "text" @@ -287422,8 +283407,8 @@ ] }, "limit": { - "context": 128000, - "output": 128000 + "context": 131072, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -287432,64 +283417,70 @@ }, "attachment": false, "open_weights": true, - "knowledge": "2023-12", - "release_date": "2024-12-06", - "last_updated": "2024-12-06", + "knowledge": "2025-04", + "release_date": "2025-07-23", + "last_updated": "2025-09-18", "type": "chat" }, { - "id": "meta-llama/Llama-3.1-8B-Instruct", - "name": "Llama 3.1 8B", - "display_name": "Llama 3.1 8B", + "id": "in.anthropic.claude-sonnet-5", + "name": "Claude Sonnet 5 (India)", + "display_name": "Claude Sonnet 5 (India)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 131072 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2023-12", - "release_date": "2024-07-23", - "last_updated": "2024-07-23", + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2026-01-31", + "release_date": "2026-06-30", + "last_updated": "2026-06-30", "type": "chat" - } - ] - }, - "merge-gateway": { - "id": "merge-gateway", - "name": "Merge Gateway", - "display_name": "Merge Gateway", - "api": "https://api-gateway.merge.dev/v1/ai-sdk", - "doc": "https://docs.merge.dev/merge-gateway", - "models": [ + }, { - "id": "xai/grok-4.3", - "name": "Grok 4.3", - "display_name": "Grok 4.3", + "id": "global.xai.grok-4.7", + "name": "Grok 4.7 (Global)", + "display_name": "Grok 4.7 (Global)", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 1000000 + "context": 500000, + "output": 500000 }, "temperature": true, "tool_call": true, @@ -287499,33 +283490,40 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "effort_options": [ + "low", + "medium", + "high", + "xhigh" + ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-04-17", - "last_updated": "2026-04-17", + "knowledge": "2026-05", + "release_date": "2026-09-21", + "last_updated": "2026-09-28", "type": "chat" }, { - "id": "xai/grok-4.5", - "name": "Grok 4.5", - "display_name": "Grok 4.5", + "id": "openai.gpt-6-sol", + "name": "GPT-6 Sol", + "display_name": "GPT-6 Sol", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 500000, - "output": 500000 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -287533,56 +283531,60 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ + "none", "low", "medium", - "high" + "high", + "xhigh", + "max" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-07-08", - "last_updated": "2026-07-08", + "knowledge": "2026-04-20", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "xai/grok-4.20-0309-non-reasoning", - "name": "Grok 4.20 Non-Reasoning", - "display_name": "Grok 4.20 Non-Reasoning", + "id": "us.writer.palmyra-x5-v1:0", + "name": "Palmyra X5 (US)", + "display_name": "Palmyra X5 (US)", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 1000000 + "context": 1040000, + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2026-03-09", - "last_updated": "2026-03-09", + "release_date": "2025-04-28", + "last_updated": "2025-04-28", "type": "chat" }, { - "id": "xai/grok-4.20-0309-reasoning", - "name": "Grok 4.20", - "display_name": "Grok 4.20", + "id": "au.anthropic.claude-haiku-5-5", + "name": "Claude Haiku 5.5 (AU)", + "display_name": "Claude Haiku 5.5 (AU)", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" @@ -287590,65 +283592,88 @@ }, "limit": { "context": 1000000, - "output": 1000000 + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + }, "attachment": true, "open_weights": false, - "release_date": "2026-03-09", - "last_updated": "2026-03-09", + "knowledge": "2026-06", + "release_date": "2026-10-07", + "last_updated": "2026-10-07", "type": "chat" }, { - "id": "xai/grok-4.7", - "name": "Grok 4.7", - "display_name": "Grok 4.7", + "id": "anthropic.claude-opus-4-1-20250805-v1:0", + "name": "Claude Opus 4.1", + "display_name": "Claude Opus 4.1", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 500000, - "output": 500000 + "context": 200000, + "output": 32000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "minimal", - "low", - "medium", - "high", - "xhigh" + "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-05", - "release_date": "2026-09-21", - "last_updated": "2026-09-21", + "knowledge": "2025-03-31", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "xai/grok-build-0.1", - "name": "Grok Build 0.1", - "display_name": "Grok Build 0.1", + "id": "us.mistral.pixtral-large-2502-v1:0", + "name": "Pixtral Large (25.02) (US)", + "display_name": "Pixtral Large (25.02) (US)", "modalities": { "input": [ "text", @@ -287659,42 +283684,96 @@ ] }, "limit": { - "context": 256000, - "output": 256000 + "context": 128000, + "output": 8192 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": false, + "release_date": "2025-04-08", + "last_updated": "2025-04-08", + "type": "chat" + }, + { + "id": "global.anthropic.claude-opus-4-5-20251101-v1:0", + "name": "Claude Opus 4.5 (Global)", + "display_name": "Claude Opus 4.5 (Global)", + "modalities": { + "input": [ + "text", + "image", + "pdf" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", + "effort_options": [ + "low", + "medium", + "high" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." + ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-04-16", - "last_updated": "2026-04-16", + "knowledge": "2025-05", + "release_date": "2025-11-24", + "last_updated": "2025-11-24", "type": "chat" }, { - "id": "xai/grok-4.6", - "name": "Grok 4.6", - "display_name": "Grok 4.6", + "id": "global.amazon.nova-2-lite-v1:0", + "name": "Nova 2 Lite (Global)", + "display_name": "Nova 2 Lite (Global)", "modalities": { "input": [ "text", - "image" + "image", + "video", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 500000, - "output": 500000 + "context": 1000000, + "output": 65535 }, "temperature": true, "tool_call": true, @@ -287704,82 +283783,107 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ "low", "medium", - "high", - "xhigh" + "high" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-02-01", - "release_date": "2026-08-12", - "last_updated": "2026-08-12", + "knowledge": "2025-10", + "release_date": "2025-12-02", + "last_updated": "2025-12-01", "type": "chat" }, { - "id": "meta/llama-3.3-70b-instruct", - "name": "Llama 3.3 70B Instruct", - "display_name": "Llama 3.3 70B Instruct", + "id": "us.anthropic.claude-opus-4-1-20250805-v1:0", + "name": "Claude Opus 4.1 (US)", + "display_name": "Claude Opus 4.1 (US)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 200000, + "output": 32000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false }, - "attachment": false, - "open_weights": true, - "knowledge": "2023-12", - "release_date": "2024-12-06", - "last_updated": "2024-12-06", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-03-31", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "meta/llama-3.1-70b-instruct", - "name": "Llama 3.1 70B", - "display_name": "Llama 3.1 70B", + "id": "apac.amazon.nova-lite-v1:0", + "name": "Nova Lite (APAC)", + "display_name": "Nova Lite (APAC)", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 2048 + "context": 300000, + "output": 10000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, - "open_weights": true, - "knowledge": "2023-12", - "release_date": "2024-07-23", - "last_updated": "2024-07-23", + "attachment": true, + "open_weights": false, + "knowledge": "2024-10", + "release_date": "2024-12-03", + "last_updated": "2024-12-03", "type": "chat" }, { - "id": "meta/muse-spark-open", - "name": "Muse Spark Open", - "display_name": "Muse Spark Open", + "id": "us.xai.grok-4.6", + "name": "Grok 4.6 (US)", + "display_name": "Grok 4.6 (US)", "modalities": { "input": [ "text", @@ -287790,8 +283894,8 @@ ] }, "limit": { - "context": 1048576, - "output": 262144 + "context": 500000, + "output": 500000 }, "temperature": true, "tool_call": true, @@ -287810,102 +283914,80 @@ } }, "attachment": true, - "open_weights": true, - "knowledge": "2026-01-04", - "release_date": "2026-10-15", - "last_updated": "2026-10-15", + "open_weights": false, + "knowledge": "2026-02-01", + "release_date": "2026-08-12", + "last_updated": "2026-08-18", "type": "chat" }, { - "id": "meta/llama-3.1-8b-instruct", - "name": "Llama 3.1 8B", - "display_name": "Llama 3.1 8B", + "id": "mistral.voxtral-small-24b-2507", + "name": "Voxtral Small 24B 2507", + "display_name": "Voxtral Small 24B 2507", "modalities": { "input": [ - "text" + "text", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 2048 + "context": 32768, + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2023-12", - "release_date": "2024-07-23", - "last_updated": "2024-07-23", - "type": "chat" - }, - { - "id": "writer/palmyra-x4", - "name": "Palmyra X4", - "display_name": "Palmyra X4", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 128000, - "output": 32000 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": false, - "release_date": "2024-10-09", - "last_updated": "2025-04-28", + "release_date": "2025-07-15", + "last_updated": "2025-07-15", "type": "chat" }, { - "id": "writer/palmyra-x5", - "name": "Palmyra X5", - "display_name": "Palmyra X5", + "id": "amazon.nova-lite-v1:0", + "name": "Nova Lite", + "display_name": "Nova Lite", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 250000 + "context": 300000, + "output": 10000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2025-04-28", - "last_updated": "2025-04-28", + "knowledge": "2024-10", + "release_date": "2024-12-03", + "last_updated": "2024-12-03", "type": "chat" }, { - "id": "sakana/fugu-max", - "name": "Fugu Max", - "display_name": "Fugu Max", + "id": "jp.anthropic.claude-opus-5-5", + "name": "Claude Opus 5.5 (JP)", + "display_name": "Claude Opus 5.5 (JP)", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" @@ -287924,6 +284006,8 @@ "extra_capabilities": { "reasoning": { "effort_options": [ + "low", + "medium", "high", "xhigh", "max" @@ -287932,43 +284016,46 @@ }, "attachment": true, "open_weights": false, - "release_date": "2026-09-11", - "last_updated": "2026-09-11", + "knowledge": "2026-06", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "sakana/sakana-namazu", - "name": "Sakana Namazu", - "display_name": "Sakana Namazu", + "id": "us.amazon.nova-pro-v1:0", + "name": "Nova Pro (US)", + "display_name": "Nova Pro (US)", "modalities": { "input": [ "text", - "image" + "image", + "video", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 300000, + "output": 10000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": true, "open_weights": false, - "release_date": "2026-08-03", - "last_updated": "2026-08-03", + "knowledge": "2024-10", + "release_date": "2024-12-03", + "last_updated": "2024-12-03", "type": "chat" }, { - "id": "sakana/fugu-ultra", - "name": "Fugu Ultra", - "display_name": "Fugu Ultra", + "id": "global.openai.gpt-5.6-luna", + "name": "GPT-5.6 Luna (Global)", + "display_name": "GPT-5.6 Luna (Global)", "modalities": { "input": [ "text", @@ -287979,7 +284066,7 @@ ] }, "limit": { - "context": 1000000, + "context": 1050000, "output": 128000 }, "temperature": false, @@ -287991,6 +284078,9 @@ "extra_capabilities": { "reasoning": { "effort_options": [ + "none", + "low", + "medium", "high", "xhigh", "max" @@ -287999,55 +284089,101 @@ }, "attachment": true, "open_weights": false, - "release_date": "2026-06-15", - "last_updated": "2026-06-15", + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "moonshot/kimi-k2.7-code", - "name": "Kimi K2.7 Code", - "display_name": "Kimi K2.7 Code", + "id": "au.anthropic.claude-opus-4-8", + "name": "Claude Opus 4.8 (AU)", + "display_name": "Claude Opus 4.8 (AU)", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 1000000, + "output": 128000 }, "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], "interleaved": true, "summaries": true, - "visibility": "summary", + "visibility": "omitted", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, "attachment": true, + "open_weights": false, + "knowledge": "2026-01", + "release_date": "2026-05-28", + "last_updated": "2026-05-28", + "type": "chat" + }, + { + "id": "meta.llama4-maverick-17b-instruct-v1:0", + "name": "Llama 4 Maverick 17B Instruct", + "display_name": "Llama 4 Maverick 17B Instruct", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1000000, + "output": 8192 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": true, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-06-12", - "last_updated": "2026-06-12", + "knowledge": "2024-08", + "release_date": "2025-04-05", + "last_updated": "2025-04-05", "type": "chat" }, { - "id": "moonshot/kimi-k2.6", - "name": "Kimi K2.6", - "display_name": "Kimi K2.6", + "id": "moonshotai.kimi-k2.5", + "name": "Kimi K2.5", + "display_name": "Kimi K2.5", "modalities": { "input": [ "text", @@ -288059,7 +284195,7 @@ }, "limit": { "context": 262144, - "output": 262144 + "output": 16384 }, "temperature": true, "tool_call": true, @@ -288070,25 +284206,20 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "interleaved": true } }, "attachment": true, "open_weights": true, "knowledge": "2025-01", - "release_date": "2026-04-20", - "last_updated": "2026-04-20", + "release_date": "2026-01-27", + "last_updated": "2026-02-06", "type": "chat" }, { - "id": "moonshot/kimi-k3", - "name": "Kimi K3", - "display_name": "Kimi K3", + "id": "us.openai.gpt-6.1-sol", + "name": "GPT-6.1 Sol (US)", + "display_name": "GPT-6.1 Sol (US)", "modalities": { "input": [ "text", @@ -288099,8 +284230,8 @@ ] }, "limit": { - "context": 1048576, - "output": 1048576 + "context": 1050000, + "output": 128000 }, "temperature": false, "tool_call": true, @@ -288110,10 +284241,7 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ - "none", - "minimal", "low", "medium", "high", @@ -288123,53 +284251,68 @@ } }, "attachment": true, - "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-16", + "open_weights": false, + "knowledge": "2026-04-30", + "release_date": "2026-09-29", + "last_updated": "2026-09-29", "type": "chat" }, { - "id": "moonshot/kimi-k3.1-pro", - "name": "Kimi K3.1 Pro", - "display_name": "Kimi K3.1 Pro", + "id": "us.anthropic.claude-sonnet-4-20250514-v1:0", + "name": "Claude Sonnet 4 (US)", + "display_name": "Claude Sonnet 4 (US)", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 1048576 + "context": 200000, + "output": 64000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "low", - "high", - "max" + "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-10-23", - "last_updated": "2026-10-23", + "knowledge": "2025-03-31", + "release_date": "2025-05-22", + "last_updated": "2025-05-22", "type": "chat" }, { - "id": "moonshot/kimi-k2.7-code-highspeed", - "name": "Kimi K2.7 Code Highspeed", - "display_name": "Kimi K2.7 Code Highspeed", + "id": "mistral.pixtral-large-2502-v1:0", + "name": "Pixtral Large (25.02)", + "display_name": "Pixtral Large (25.02)", "modalities": { "input": [ "text", @@ -288180,10 +284323,40 @@ ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 128000, + "output": 8192 }, - "temperature": false, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": false, + "release_date": "2025-04-08", + "last_updated": "2025-04-08", + "type": "chat" + }, + { + "id": "amazon.nova-2-lite-v1:0", + "name": "Nova 2 Lite", + "display_name": "Nova 2 Lite", + "modalities": { + "input": [ + "text", + "image", + "video", + "pdf" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1000000, + "output": 65535 + }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -288191,38 +284364,37 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "low", + "medium", + "high" ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-06-12", - "last_updated": "2026-06-12", + "open_weights": false, + "knowledge": "2025-10", + "release_date": "2025-12-02", + "last_updated": "2025-12-01", "type": "chat" }, { - "id": "moonshot/kimi-k2.5", - "name": "Kimi K2.5", - "display_name": "Kimi K2.5", + "id": "anthropic.claude-sonnet-5", + "name": "Claude Sonnet 5", + "display_name": "Claude Sonnet 5", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1000000, + "output": 128000 }, "temperature": false, "tool_call": true, @@ -288232,87 +284404,102 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-01-27", - "last_updated": "2026-01-27", + "open_weights": false, + "knowledge": "2026-01-31", + "release_date": "2026-06-30", + "last_updated": "2026-06-30", "type": "chat" }, { - "id": "nvidia/nemotron-3-nano-30b-a3b", - "name": "Nemotron 3 Nano 30B A3B", - "display_name": "Nemotron 3 Nano 30B A3B", + "id": "us.meta.llama4-scout-17b-instruct-v1:0", + "name": "Llama 4 Scout 17B Instruct (US)", + "display_name": "Llama 4 Scout 17B Instruct (US)", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 32000 + "context": 10000000, + "output": 8192 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2025-06-25", - "release_date": "2025-12-15", - "last_updated": "2025-12-15", + "knowledge": "2024-08", + "release_date": "2025-04-05", + "last_updated": "2025-04-05", "type": "chat" }, { - "id": "nvidia/nemotron-nano-9b-v2", - "name": "Nemotron Nano 9B", - "display_name": "Nemotron Nano 9B", + "id": "anthropic.claude-sonnet-5-5", + "name": "Claude Sonnet 5.5", + "display_name": "Claude Sonnet 5.5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 1000000, + "output": 128000 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-09", - "release_date": "2025-08-18", - "last_updated": "2025-08-18", + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2026-06", + "release_date": "2026-09-28", + "last_updated": "2026-09-28", "type": "chat" }, { - "id": "nvidia/nemotron-3.5-lightning-30b-a3b", - "name": "Nemotron 3.5 Lightning 30B A3B", - "display_name": "Nemotron 3.5 Lightning 30B A3B", + "id": "au.anthropic.claude-opus-5-5", + "name": "Claude Opus 5.5 (AU)", + "display_name": "Claude Opus 5.5 (AU)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" @@ -288320,9 +284507,9 @@ }, "limit": { "context": 1000000, - "output": 262144 + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -288331,116 +284518,96 @@ "extra_capabilities": { "reasoning": { "effort_options": [ - "none", "low", "medium", - "high" + "high", + "xhigh", + "max" ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-09", - "release_date": "2026-08-11", - "last_updated": "2026-08-11", + "attachment": true, + "open_weights": false, + "knowledge": "2026-06", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "google/gemini-3-pro-image", - "name": "Gemini 3 Pro Image", - "display_name": "Gemini 3 Pro Image", + "id": "eu.anthropic.claude-opus-4-8", + "name": "Claude Opus 4.8 (EU)", + "display_name": "Claude Opus 4.8 (EU)", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ - "text", - "image" + "text" ] }, "limit": { - "context": 65536, - "output": 65536 + "context": 1000000, + "output": 128000 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ + "default_enabled": false, + "mode": "effort", + "effort": "high", + "effort_options": [ "low", - "high" + "medium", + "high", + "xhigh", + "max" ], + "interleaved": true, "summaries": true, - "visibility": "summary", + "visibility": "omitted", "continuation": [ - "thought_signatures" + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", + "knowledge": "2026-01", "release_date": "2026-05-28", - "last_updated": "2026-05-28" - }, - { - "id": "google/gemma-3-27b-it", - "name": "Gemma 3 27B IT", - "display_name": "Gemma 3 27B IT", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 131072, - "output": 32768 - }, - "temperature": true, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-08", - "release_date": "2025-03-12", - "last_updated": "2025-03-12", + "last_updated": "2026-05-28", "type": "chat" }, { - "id": "google/gemini-flash-latest", - "name": "Gemini Flash Latest", - "display_name": "Gemini Flash Latest", + "id": "us.openai.gpt-5.6-sol", + "name": "GPT-5.6 Sol (US)", + "display_name": "GPT-5.6 Sol (US)", "modalities": { "input": [ "text", - "image", - "video", - "audio", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -288449,64 +284616,72 @@ "extra_capabilities": { "reasoning": { "effort_options": [ - "minimal", + "none", "low", "medium", - "high" + "high", + "xhigh", + "max" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-08-13", - "last_updated": "2026-08-13", + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "google/gemma-4-31b-it", - "name": "Gemma 4 31B It", - "display_name": "Gemma 4 31B It", + "id": "openai.gpt-6-astra", + "name": "GPT-6 Astra", + "display_name": "GPT-6 Astra", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 1050000, + "output": 128000 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { - "supported": true + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "attachment": true, + "open_weights": false, + "knowledge": "2026-04-30", + "release_date": "2026-09-04", + "last_updated": "2026-09-04", "type": "chat" }, { - "id": "google/gemini-4-argon", - "name": "Gemini 4 Argon", - "display_name": "Gemini 4 Argon", + "id": "eu.anthropic.claude-sonnet-5-5", + "name": "Claude Sonnet 5.5 (EU)", + "display_name": "Claude Sonnet 5.5 (EU)", "modalities": { "input": [ "text", "image", - "video", - "audio", "pdf" ], "output": [ @@ -288514,8 +284689,8 @@ ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 1000000, + "output": 128000 }, "temperature": false, "tool_call": true, @@ -288523,22 +284698,32 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + }, "attachment": true, "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-10-13", - "last_updated": "2026-10-13", + "knowledge": "2026-06", + "release_date": "2026-09-28", + "last_updated": "2026-09-28", "type": "chat" }, { - "id": "google/gemini-2.5-pro", - "name": "Gemini 2.5 Pro", - "display_name": "Gemini 2.5 Pro", + "id": "eu.anthropic.claude-opus-4-5-20251101-v1:0", + "name": "Claude Opus 4.5 (EU)", + "display_name": "Claude Opus 4.5 (EU)", "modalities": { "input": [ "text", "image", - "audio", "pdf" ], "output": [ @@ -288546,50 +284731,58 @@ ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "budget", + "default_enabled": false, + "mode": "mixed", "budget": { - "default": -1, - "min": 128, - "max": 32768, - "auto": -1, + "min": 1024, "unit": "tokens" }, + "effort": "high", + "effort_options": [ + "low", + "medium", + "high" + ], + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-06-17", - "last_updated": "2025-06-17", + "knowledge": "2025-05", + "release_date": "2025-11-24", + "last_updated": "2025-11-24", "type": "chat" }, { - "id": "google/gemini-3.5-flash", - "name": "Gemini 3.5 Flash", - "display_name": "Gemini 3.5 Flash", + "id": "jp.amazon.nova-2-lite-v1:0", + "name": "Nova 2 Lite (JP)", + "display_name": "Nova 2 Lite (JP)", "modalities": { "input": [ "text", "image", - "audio", + "video", "pdf" ], "output": [ @@ -288597,8 +284790,8 @@ ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 1000000, + "output": 65535 }, "temperature": true, "tool_call": true, @@ -288608,77 +284801,79 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", + "effort_options": [ "low", "medium", "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-05-19", - "last_updated": "2026-05-19", + "knowledge": "2025-10", + "release_date": "2025-12-02", + "last_updated": "2025-12-01", "type": "chat" }, { - "id": "google/gemini-embedding-001", - "name": "Gemini Embedding 001", - "display_name": "Gemini Embedding 001", + "id": "global.openai.gpt-6.1-terra", + "name": "GPT-6.1 Terra (Global)", + "display_name": "GPT-6.1 Terra (Global)", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 2048, - "output": 4096 + "context": 1050000, + "output": 128000 }, "temperature": false, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + }, + "attachment": true, "open_weights": false, - "knowledge": "2025-05", - "release_date": "2025-05-20", - "last_updated": "2025-05-20", - "type": "embedding" + "knowledge": "2026-06-01", + "release_date": "2026-10-26", + "last_updated": "2026-10-26", + "type": "chat" }, { - "id": "google/gemini-3.5-flash-lite", - "name": "Gemini 3.5 Flash-Lite", - "display_name": "Gemini 3.5 Flash-Lite", + "id": "google.gemma-4-26b-a4b", + "name": "Gemma 4 26B A4B IT", + "display_name": "Gemma 4 26B A4B IT", "modalities": { "input": [ "text", "image", - "video", - "audio", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 262144, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -288688,55 +284883,78 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "effort_options": [ + "none", + "high" + ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-07-21", - "last_updated": "2026-07-21", + "open_weights": true, + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "google/gemini-2.5-flash-image", - "name": "Gemini 2.5 Flash Image", - "display_name": "Gemini 2.5 Flash Image", + "id": "eu.anthropic.claude-haiku-4-5-20251001-v1:0", + "name": "Claude Haiku 4.5 (EU)", + "display_name": "Claude Haiku 4.5 (EU)", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ - "text", - "image" + "text" ] }, "limit": { - "context": 32768, - "output": 32768 + "context": 200000, + "output": 64000 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + ] + } }, "attachment": true, "open_weights": false, - "knowledge": "2024-06", - "release_date": "2025-08-26", - "last_updated": "2025-08-26" + "knowledge": "2025-02-28", + "release_date": "2025-10-15", + "last_updated": "2025-10-15", + "type": "chat" }, { - "id": "google/gemini-3.1-pro-preview", - "name": "Gemini 3.1 Pro Preview", - "display_name": "Gemini 3.1 Pro Preview", + "id": "anthropic.claude-opus-4-5-20251101-v1:0", + "name": "Claude Opus 4.5", + "display_name": "Claude Opus 4.5", "modalities": { "input": [ "text", "image", - "video", - "audio", "pdf" ], "output": [ @@ -288744,48 +284962,57 @@ ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", + "effort_options": [ "low", + "medium", "high" ], + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-02-19", - "last_updated": "2026-02-19", + "knowledge": "2025-05", + "release_date": "2025-11-24", + "last_updated": "2025-11-24", "type": "chat" }, { - "id": "google/gemini-2.5-flash", - "name": "Gemini 2.5 Flash", - "display_name": "Gemini 2.5 Flash", + "id": "global.anthropic.claude-opus-4-6-v1", + "name": "Claude Opus 4.6 (Global)", + "display_name": "Claude Opus 4.6 (Global)", "modalities": { "input": [ "text", "image", - "audio", "pdf" ], "output": [ @@ -288793,81 +285020,86 @@ ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 1000000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "budget", + "default_enabled": false, + "mode": "mixed", "budget": { - "default": -1, - "min": 0, - "max": 24576, - "auto": -1, - "off": 0, + "min": 1024, "unit": "tokens" }, + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "max" + ], + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" + ], + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-06-17", - "last_updated": "2025-06-17", + "knowledge": "2025-05-31", + "release_date": "2026-02-05", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "google/gemma-3-12b-it", - "name": "Gemma 3 12B", - "display_name": "Gemma 3 12B", + "id": "qwen.qwen3-coder-next", + "name": "Qwen3 Coder Next", + "display_name": "Qwen3 Coder Next", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 262144, + "output": 65536 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2024-08", - "release_date": "2025-03-12", - "last_updated": "2025-03-12", + "knowledge": "2025-09", + "release_date": "2026-02-03", + "last_updated": "2026-02-06", "type": "chat" }, { - "id": "google/gemini-3.8-flash", - "name": "Gemini 3.8 Flash", - "display_name": "Gemini 3.8 Flash", + "id": "au.anthropic.claude-sonnet-4-6", + "name": "AU Anthropic Claude Sonnet 4.6", + "display_name": "AU Anthropic Claude Sonnet 4.6", "modalities": { "input": [ "text", "image", - "video", - "audio", "pdf" ], "output": [ @@ -288875,59 +285107,65 @@ ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 1000000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", + "effort_options": [ "low", "medium", - "high" + "high", + "max" ], + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" + ], + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-09-02", - "last_updated": "2026-09-02", + "knowledge": "2025-08-31", + "release_date": "2026-02-17", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "google/gemini-3.7-flash", - "name": "Gemini 3.7 Flash", - "display_name": "Gemini 3.7 Flash", + "id": "openai.gpt-oss-safeguard-20b", + "name": "GPT OSS Safeguard 20B", + "display_name": "GPT OSS Safeguard 20B", "modalities": { "input": [ - "text", - "image", - "video", - "audio", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 128000, + "output": 16384 }, "temperature": true, "tool_call": true, @@ -288937,49 +285175,61 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", + "effort_options": [ "low", "medium", "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-08-13", - "last_updated": "2026-08-13", + "attachment": false, + "open_weights": true, + "release_date": "2025-10-29", + "last_updated": "2025-10-29", "type": "chat" }, { - "id": "google/gemini-flash-lite-latest", - "name": "Gemini Flash-Lite Latest", - "display_name": "Gemini Flash-Lite Latest", + "id": "qwen.qwen3-235b-a22b-2507-v1:0", + "name": "Qwen3 235B-A22B Instruct 2507", + "display_name": "Qwen3 235B-A22B Instruct 2507", "modalities": { "input": [ - "text", - "image", - "video", - "audio", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 262144, + "output": 131072 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "release_date": "2025-07-21", + "last_updated": "2025-09-18", + "type": "chat" + }, + { + "id": "us.zai.glm-5.3", + "name": "GLM-5.3 (US)", + "display_name": "GLM-5.3 (US)", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1000000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -288989,30 +285239,31 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "interleaved": true, "effort_options": [ - "minimal", "low", "medium", - "high" + "high", + "xhigh", + "max" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-07-21", - "last_updated": "2026-07-21", + "attachment": false, + "open_weights": true, + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "google/gemini-2.5-flash-lite", - "name": "Gemini 2.5 Flash-Lite", - "display_name": "Gemini 2.5 Flash-Lite", + "id": "eu.anthropic.claude-sonnet-5", + "name": "Claude Sonnet 5 (EU)", + "display_name": "Claude Sonnet 5 (EU)", "modalities": { "input": [ "text", "image", - "audio", "pdf" ], "output": [ @@ -289021,44 +285272,36 @@ }, "limit": { "context": 1000000, - "output": 65536 + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "default": -1, - "min": 512, - "max": 24576, - "auto": -1, - "unit": "tokens" - }, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-06-17", - "last_updated": "2025-06-17", + "knowledge": "2026-01-31", + "release_date": "2026-06-30", + "last_updated": "2026-06-30", "type": "chat" }, { - "id": "google/gemini-3-flash-preview", - "name": "Gemini 3 Flash Preview", - "display_name": "Gemini 3 Flash Preview", + "id": "mistral.mistral-large-3-675b-instruct", + "name": "Mistral Large 3", + "display_name": "Mistral Large 3", "modalities": { "input": [ "text", @@ -289069,81 +285312,116 @@ ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 262144, + "output": 8192 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": true, + "knowledge": "2024-11", + "release_date": "2025-12-02", + "last_updated": "2025-12-02", + "type": "chat" + }, + { + "id": "eu.anthropic.claude-sonnet-4-6", + "name": "Claude Sonnet 4.6 (EU)", + "display_name": "Claude Sonnet 4.6 (EU)", + "modalities": { + "input": [ + "text", + "image", + "pdf" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1000000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", + "effort_options": [ "low", "medium", - "high" + "high", + "max" ], + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" + ], + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-12-17", - "last_updated": "2025-12-17", + "knowledge": "2025-08-31", + "release_date": "2026-02-17", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "google/gemini-2.5-computer-use-preview-10-2025", - "name": "Gemini 2.5 Computer Use Preview (10-2025)", - "display_name": "Gemini 2.5 Computer Use Preview (10-2025)", + "id": "mistral.devstral-2-123b", + "name": "Devstral 2 123B", + "display_name": "Devstral 2 123B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 64000 + "context": 262144, + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-10-07", - "last_updated": "2025-10-07", + "attachment": false, + "open_weights": true, + "knowledge": "2025-12", + "release_date": "2025-12-09", + "last_updated": "2025-12-09", "type": "chat" }, { - "id": "google/gemini-3.6-flash", - "name": "Gemini 3.6 Flash", - "display_name": "Gemini 3.6 Flash", + "id": "in.anthropic.claude-haiku-4-5-20251001-v1:0", + "name": "Claude Haiku 4.5 (India)", + "display_name": "Claude Haiku 4.5 (India)", "modalities": { "input": [ "text", "image", - "video", - "audio", "pdf" ], "output": [ @@ -289151,85 +285429,82 @@ ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", - "low", - "medium", - "high" - ], + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-07-21", - "last_updated": "2026-07-21", + "knowledge": "2025-02-28", + "release_date": "2025-10-15", + "last_updated": "2025-10-15", "type": "chat" }, { - "id": "google/gemini-3.1-flash-image", - "name": "Gemini 3.1 Flash Image", - "display_name": "Gemini 3.1 Flash Image", + "id": "amazon.nova-pro-v1:0", + "name": "Nova Pro", + "display_name": "Nova Pro", "modalities": { "input": [ "text", - "image" + "image", + "video", + "pdf" ], "output": [ - "text", - "image" + "text" ] }, "limit": { - "context": 32768, - "output": 32768 + "context": 300000, + "output": 10000 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-05-28", - "last_updated": "2026-05-28" + "knowledge": "2024-10", + "release_date": "2024-12-03", + "last_updated": "2024-12-03", + "type": "chat" }, { - "id": "google/gemini-3.1-pro-preview-customtools", - "name": "Gemini 3.1 Pro Preview Custom Tools", - "display_name": "Gemini 3.1 Pro Preview Custom Tools", + "id": "in.openai.gpt-5.6-terra", + "name": "GPT-5.6 Terra (India)", + "display_name": "GPT-5.6 Terra (India)", "modalities": { "input": [ "text", "image", - "audio", "pdf" ], "output": [ @@ -289237,10 +285512,10 @@ ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -289248,37 +285523,31 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ + "effort_options": [ + "none", "low", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" + "medium", + "high", + "xhigh", + "max" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-02-19", - "last_updated": "2026-02-19", + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "google/gemini-3.1-flash-lite", - "name": "Gemini 3.1 Flash-Lite", - "display_name": "Gemini 3.1 Flash-Lite", + "id": "us.anthropic.claude-haiku-5-5", + "name": "Claude Haiku 5.5 (US)", + "display_name": "Claude Haiku 5.5 (US)", "modalities": { "input": [ "text", "image", - "audio", "pdf" ], "output": [ @@ -289286,10 +285555,10 @@ ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -289297,144 +285566,232 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ - "minimal", "low", "medium", - "high" + "high", + "xhigh", + "max" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-05-07", - "last_updated": "2026-05-07", + "knowledge": "2026-06", + "release_date": "2026-10-07", + "last_updated": "2026-10-07", "type": "chat" }, { - "id": "google/gemma-4-26b-a4b-it", - "name": "Gemma 4 26B A4B", - "display_name": "Gemma 4 26B A4B", + "id": "global.anthropic.claude-opus-4-8", + "name": "Claude Opus 4.8 (Global)", + "display_name": "Claude Opus 4.8 (Global)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 1000000, + "output": 128000 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." + ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "attachment": true, + "open_weights": false, + "knowledge": "2026-01", + "release_date": "2026-05-28", + "last_updated": "2026-05-28", "type": "chat" }, { - "id": "google/gemma-3-4b-it", - "name": "Gemma 3 4B", - "display_name": "Gemma 3 4B", + "id": "eu.anthropic.claude-opus-4-6-v1", + "name": "Claude Opus 4.6 (EU)", + "display_name": "Claude Opus 4.6 (EU)", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 1000000, + "output": 128000 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." + ] + } }, "attachment": true, - "open_weights": true, - "knowledge": "2024-08", - "release_date": "2025-03-12", - "last_updated": "2025-03-12", + "open_weights": false, + "knowledge": "2025-05-31", + "release_date": "2026-02-05", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "google/gemini-embedding-2", - "name": "Gemini Embedding 2", - "display_name": "Gemini Embedding 2", + "id": "ca.amazon.nova-lite-v1:0", + "name": "Nova Lite (CA)", + "display_name": "Nova Lite (CA)", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 300000, + "output": 10000 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2025-11", - "release_date": "2026-04-22", - "last_updated": "2026-04-22", - "type": "embedding" + "knowledge": "2024-10", + "release_date": "2024-12-03", + "last_updated": "2024-12-03", + "type": "chat" }, { - "id": "minimax/minimax-m2", - "name": "MiniMax M2", - "display_name": "MiniMax M2", + "id": "us.anthropic.claude-opus-4-6-v1", + "name": "Claude Opus 4.6 (US)", + "display_name": "Claude Opus 4.6 (US)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 204800, - "output": 8192 + "context": 1000000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, - "attachment": false, - "open_weights": true, - "release_date": "2025-10-27", - "last_updated": "2025-10-27", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-05-31", + "release_date": "2026-02-05", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "minimax/minimax-m2.5", - "name": "MiniMax M2.5", - "display_name": "MiniMax M2.5", + "id": "zai.glm-5", + "name": "GLM-5", + "display_name": "GLM-5", "modalities": { "input": [ "text" @@ -289444,8 +285801,8 @@ ] }, "limit": { - "context": 204800, - "output": 8192 + "context": 202752, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -289455,32 +285812,34 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true } }, "attachment": false, "open_weights": true, "release_date": "2026-02-12", - "last_updated": "2026-02-12", + "last_updated": "2026-03-18", "type": "chat" }, { - "id": "minimax/minimax-m2.5-highspeed", - "name": "MiniMax M2.5 Highspeed", - "display_name": "MiniMax M2.5 Highspeed", + "id": "us.openai.gpt-6-luna", + "name": "GPT-6 Luna (US)", + "display_name": "GPT-6 Luna (US)", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 204800, - "output": 8192 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -289488,33 +285847,42 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-02-13", - "last_updated": "2026-02-13", + "attachment": true, + "open_weights": false, + "knowledge": "2026-05-18", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "minimax/minimax-m3.1-flash", - "name": "MiniMax M3.1 Flash", - "display_name": "MiniMax M3.1 Flash", + "id": "openai.gpt-5.6-terra", + "name": "GPT-5.6 Terra", + "display_name": "GPT-5.6 Terra", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, + "context": 1050000, "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -289523,6 +285891,7 @@ "extra_capabilities": { "reasoning": { "effort_options": [ + "none", "low", "medium", "high", @@ -289533,14 +285902,15 @@ }, "attachment": true, "open_weights": false, - "release_date": "2026-10-19", - "last_updated": "2026-10-19", + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "minimax/minimax-m2.1", - "name": "MiniMax M2.1", - "display_name": "MiniMax M2.1", + "id": "qwen.qwen3-32b-v1:0", + "name": "Qwen3 32B", + "display_name": "Qwen3 32B", "modalities": { "input": [ "text" @@ -289550,8 +285920,8 @@ ] }, "limit": { - "context": 204800, - "output": 8192 + "context": 32768, + "output": 16384 }, "temperature": true, "tool_call": true, @@ -289561,23 +285931,26 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true } }, "attachment": false, "open_weights": true, - "release_date": "2025-12-23", - "last_updated": "2025-12-23", + "knowledge": "2025-04", + "release_date": "2025-04-28", + "last_updated": "2025-09-18", "type": "chat" }, { - "id": "minimax/minimax-m3", - "name": "MiniMax M3", - "display_name": "MiniMax M3", + "id": "global.anthropic.claude-sonnet-4-6", + "name": "Claude Sonnet 4.6 (Global)", + "display_name": "Claude Sonnet 4.6 (Global)", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" @@ -289591,62 +285964,76 @@ "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." + ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-06-01", - "last_updated": "2026-06-01", + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-02-17", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "minimax/minimax-m2.7", - "name": "MiniMax M2.7", - "display_name": "MiniMax M2.7", + "id": "google.gemma-3-27b-it", + "name": "Gemma 3 27B IT", + "display_name": "Gemma 3 27B IT", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 204800, + "context": 131072, "output": 8192 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-03-18", - "last_updated": "2026-03-18", + "knowledge": "2024-08", + "release_date": "2025-03-12", + "last_updated": "2025-03-12", "type": "chat" }, { - "id": "minimax/minimax-m2.7-highspeed", - "name": "MiniMax M2.7 Highspeed", - "display_name": "MiniMax M2.7 Highspeed", + "id": "openai.gpt-oss-120b-1:0", + "name": "gpt-oss-120b", + "display_name": "gpt-oss-120b", "modalities": { "input": [ "text" @@ -289656,8 +286043,8 @@ ] }, "limit": { - "context": 204800, - "output": 8192 + "context": 131072, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -289667,137 +286054,180 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "low", + "medium", + "high" ] } }, "attachment": false, "open_weights": true, - "release_date": "2026-03-18", - "last_updated": "2026-03-18", + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "cohere/command-r-plus-08-2024", - "name": "Command R+ 08-2024", - "display_name": "Command R+ 08-2024", + "id": "global.openai.gpt-5.6-terra", + "name": "GPT-5.6 Terra (Global)", + "display_name": "GPT-5.6 Terra (Global)", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 4000 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-06-01", - "release_date": "2024-08-30", - "last_updated": "2024-08-30", + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "cohere/command-a-03-2025", - "name": "Command A 03-2025", - "display_name": "Command A 03-2025", + "id": "us.openai.gpt-5.6-luna", + "name": "GPT-5.6 Luna (US)", + "display_name": "GPT-5.6 Luna (US)", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 8000 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-06-01", - "release_date": "2025-03-13", - "last_updated": "2025-03-13", + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "cohere/command-r-08-2024", - "name": "Command R 08-2024", - "display_name": "Command R 08-2024", + "id": "eu.amazon.nova-2-lite-v1:0", + "name": "Nova 2 Lite (EU)", + "display_name": "Nova 2 Lite (EU)", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 4000 + "context": 1000000, + "output": 65535 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-06-01", - "release_date": "2024-08-30", - "last_updated": "2024-08-30", + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "high" + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-10", + "release_date": "2025-12-02", + "last_updated": "2025-12-01", "type": "chat" }, { - "id": "cohere/command-r7b-12-2024", - "name": "Command R7B 12-2024", - "display_name": "Command R7B 12-2024", + "id": "eu.amazon.nova-lite-v1:0", + "name": "Nova Lite (EU)", + "display_name": "Nova Lite (EU)", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 4000 + "context": 300000, + "output": 10000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-06-01", - "release_date": "2024-12-13", - "last_updated": "2024-12-13", + "attachment": true, + "open_weights": false, + "knowledge": "2024-10", + "release_date": "2024-12-03", + "last_updated": "2024-12-03", "type": "chat" }, { - "id": "openai/gpt-5.2", - "name": "GPT-5.2", - "display_name": "GPT-5.2", + "id": "us.anthropic.claude-fable-5", + "name": "Claude Fable 5 (US)", + "display_name": "Claude Fable 5 (US)", "modalities": { "input": [ "text", @@ -289809,48 +286239,52 @@ ] }, "limit": { - "context": 400000, + "context": 1000000, "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, + "default_enabled": true, "mode": "effort", - "effort": "none", + "effort": "high", "effort_options": [ - "none", "low", "medium", "high", - "xhigh" + "xhigh", + "max" ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" ], - "visibility": "hidden" + "notes": [ + "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", + "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", + "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2025-12-11", - "last_updated": "2025-12-11", + "knowledge": "2026-01-31", + "release_date": "2026-06-09", + "last_updated": "2026-06-09", "type": "chat" }, { - "id": "openai/gpt-5.4-mini", - "name": "GPT-5.4 Mini", - "display_name": "GPT-5.4 Mini", + "id": "anthropic.claude-haiku-5-5", + "name": "Claude Haiku 5.5", + "display_name": "Claude Haiku 5.5", "modalities": { "input": [ "text", @@ -289862,48 +286296,37 @@ ] }, "limit": { - "context": 400000, + "context": 1000000, "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", "effort_options": [ - "none", "low", "medium", "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "xhigh", + "max" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-17", - "last_updated": "2026-03-17", + "knowledge": "2026-06", + "release_date": "2026-10-07", + "last_updated": "2026-10-07", "type": "chat" }, { - "id": "openai/gpt-5.6-sol", - "name": "GPT-5.6 Sol", - "display_name": "GPT-5.6 Sol", + "id": "us.anthropic.claude-sonnet-5-5", + "name": "Claude Sonnet 5.5 (US)", + "display_name": "Claude Sonnet 5.5 (US)", "modalities": { "input": [ "text", @@ -289915,7 +286338,7 @@ ] }, "limit": { - "context": 1050000, + "context": 1000000, "output": 128000 }, "temperature": false, @@ -289926,38 +286349,26 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", "effort_options": [ - "none", "low", "medium", "high", "xhigh", "max" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "knowledge": "2026-06", + "release_date": "2026-09-28", + "last_updated": "2026-09-28", "type": "chat" }, { - "id": "openai/gpt-5.3-chat-latest", - "name": "GPT-5.3 Chat Latest", - "display_name": "GPT-5.3 Chat Latest", + "id": "jp.anthropic.claude-haiku-4-5-20251001-v1:0", + "name": "Claude Haiku 4.5 (JP)", + "display_name": "Claude Haiku 4.5 (JP)", "modalities": { "input": [ "text", @@ -289969,54 +286380,99 @@ ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + ] + } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-03", - "last_updated": "2026-03-03", + "knowledge": "2025-02-28", + "release_date": "2025-10-15", + "last_updated": "2025-10-15", "type": "chat" }, { - "id": "openai/gpt-audio-mini", - "name": "GPT Audio Mini", - "display_name": "GPT Audio Mini", + "id": "anthropic.claude-haiku-4-5-20251001-v1:0", + "name": "Claude Haiku 4.5", + "display_name": "Claude Haiku 4.5", "modalities": { "input": [ "text", - "audio" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + ] + } }, "attachment": true, "open_weights": false, - "knowledge": "2023-10-01", - "release_date": "2025-10-06", - "last_updated": "2025-10-06", + "knowledge": "2025-02-28", + "release_date": "2025-10-15", + "last_updated": "2025-10-15", "type": "chat" }, { - "id": "openai/gpt-5-nano", - "name": "GPT-5 Nano", - "display_name": "GPT-5 Nano", + "id": "us.anthropic.claude-opus-5", + "name": "Claude Opus 5 (US)", + "display_name": "Claude Opus 5 (US)", "modalities": { "input": [ "text", @@ -290028,7 +286484,7 @@ ] }, "limit": { - "context": 400000, + "context": 1000000, "output": 128000 }, "temperature": false, @@ -290039,36 +286495,26 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", "effort_options": [ - "minimal", "low", "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "high", + "xhigh", + "max" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2024-05-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "knowledge": "2026-05", + "release_date": "2026-07-24", + "last_updated": "2026-07-24", "type": "chat" }, { - "id": "openai/gpt-5-chat-latest", - "name": "GPT-5 Chat Latest", - "display_name": "GPT-5 Chat Latest", + "id": "eu.anthropic.claude-haiku-5-5", + "name": "Claude Haiku 5.5 (EU)", + "display_name": "Claude Haiku 5.5 (EU)", "modalities": { "input": [ "text", @@ -290080,25 +286526,37 @@ ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 1000000, + "output": 128000 }, "temperature": false, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } }, "attachment": true, "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "knowledge": "2026-06", + "release_date": "2026-10-07", + "last_updated": "2026-10-07", "type": "chat" }, { - "id": "openai/gpt-4o", - "name": "GPT-4o", - "display_name": "GPT-4o", + "id": "global.anthropic.claude-sonnet-5", + "name": "Claude Sonnet 5 (Global)", + "display_name": "Claude Sonnet 5 (Global)", "modalities": { "input": [ "text", @@ -290110,53 +286568,77 @@ ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } }, "attachment": true, "open_weights": false, - "knowledge": "2023-09", - "release_date": "2024-05-13", - "last_updated": "2024-08-06", + "knowledge": "2026-01-31", + "release_date": "2026-06-30", + "last_updated": "2026-06-30", "type": "chat" }, { - "id": "openai/gpt-oss-safeguard-20b", - "name": "GPT OSS Safeguard 20B", - "display_name": "GPT OSS Safeguard 20B", + "id": "global.xai.grok-4.6", + "name": "Grok 4.6 (Global)", + "display_name": "Grok 4.6 (Global)", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 4096, - "output": 4096 + "context": 500000, + "output": 500000 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": false, - "open_weights": true, - "release_date": "2025-10-29", - "last_updated": "2025-10-29", + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "high", + "xhigh" + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2026-02-01", + "release_date": "2026-08-12", + "last_updated": "2026-08-18", "type": "chat" }, { - "id": "openai/gpt-5.4-nano", - "name": "GPT-5.4 Nano", - "display_name": "GPT-5.4 Nano", + "id": "openai.gpt-5.5", + "name": "GPT-5.5", + "display_name": "GPT-5.5", "modalities": { "input": [ "text", @@ -290168,76 +286650,94 @@ ] }, "limit": { - "context": 400000, + "context": 1000000, "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", "effort_options": [ "none", "low", "medium", "high", "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-17", - "last_updated": "2026-03-17", + "knowledge": "2025-12-01", + "release_date": "2026-04-23", + "last_updated": "2026-06-01", "type": "chat" }, { - "id": "openai/gpt-3.5-turbo", - "name": "GPT-3.5 Turbo", - "display_name": "GPT-3.5 Turbo", + "id": "jp.anthropic.claude-opus-4-8", + "name": "Claude Opus 4.8 (JP)", + "display_name": "Claude Opus 4.8 (JP)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 16385, - "output": 4096 + "context": 1000000, + "output": 128000 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." + ] + } + }, + "attachment": true, "open_weights": false, - "knowledge": "2021-09-01", - "release_date": "2023-03-01", - "last_updated": "2023-11-06", + "knowledge": "2026-01", + "release_date": "2026-05-28", + "last_updated": "2026-05-28", "type": "chat" }, { - "id": "openai/gpt-5.6-luna", - "name": "GPT-5.6 Luna", - "display_name": "GPT-5.6 Luna", + "id": "eu.anthropic.claude-opus-4-7", + "name": "Claude Opus 4.7 (EU)", + "display_name": "Claude Opus 4.7 (EU)", "modalities": { "input": [ "text", @@ -290249,62 +286749,99 @@ ] }, "limit": { - "context": 1050000, + "context": 1000000, "output": 128000 }, "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, + "default_enabled": false, "mode": "effort", - "effort": "medium", + "effort": "high", "effort_options": [ - "none", "low", "medium", "high", "xhigh", "max" ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" ], - "visibility": "hidden" + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "knowledge": "2026-01-31", + "release_date": "2026-04-16", + "last_updated": "2026-04-16", "type": "chat" }, { - "id": "openai/o3-mini", - "name": "o3 Mini", - "display_name": "o3 Mini", + "id": "us.amazon.nova-premier-v1:0", + "name": "Nova Premier (US)", + "display_name": "Nova Premier (US)", "modalities": { "input": [ + "text", + "image", + "video", + "pdf" + ], + "output": [ "text" + ] + }, + "limit": { + "context": 1000000, + "output": 10000 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": false, + "knowledge": "2024-10", + "release_date": "2025-04-30", + "last_updated": "2025-04-30", + "type": "chat" + }, + { + "id": "us.amazon.nova-2-lite-v1:0", + "name": "Nova 2 Lite (US)", + "display_name": "Nova 2 Lite (US)", + "modalities": { + "input": [ + "text", + "image", + "video", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 1000000, + "output": 65535 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -290312,29 +286849,24 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", "effort_options": [ "low", "medium", "high" - ], - "visibility": "hidden" + ] } }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2024-05", - "release_date": "2024-12-20", - "last_updated": "2025-01-29", + "knowledge": "2025-10", + "release_date": "2025-12-02", + "last_updated": "2025-12-01", "type": "chat" }, { - "id": "openai/gpt-5.6-terra", - "name": "GPT-5.6 Terra", - "display_name": "GPT-5.6 Terra", + "id": "anthropic.claude-opus-4-7", + "name": "Claude Opus 4.7", + "display_name": "Claude Opus 4.7", "modalities": { "input": [ "text", @@ -290346,49 +286878,52 @@ ] }, "limit": { - "context": 1050000, + "context": 1000000, "output": 128000 }, "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, + "default_enabled": false, "mode": "effort", - "effort": "medium", + "effort": "high", "effort_options": [ - "none", "low", "medium", "high", "xhigh", "max" ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" ], - "visibility": "hidden" + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "knowledge": "2026-01-31", + "release_date": "2026-04-16", + "last_updated": "2026-04-16", "type": "chat" }, { - "id": "openai/o3", - "name": "o3", - "display_name": "o3", + "id": "anthropic.claude-sonnet-4-5-20250929-v1:0", + "name": "Claude Sonnet 4.5", + "display_name": "Claude Sonnet 4.5", "modalities": { "input": [ "text", @@ -290401,44 +286936,86 @@ }, "limit": { "context": 200000, - "output": 100000 + "output": 64000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-07-31", + "release_date": "2025-09-29", + "last_updated": "2025-09-29", + "type": "chat" + }, + { + "id": "openai.gpt-oss-safeguard-120b", + "name": "GPT OSS Safeguard 120B", + "display_name": "GPT OSS Safeguard 120B", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 128000, + "output": 16384 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { "effort_options": [ "low", "medium", "high" - ], - "visibility": "hidden" + ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-05", - "release_date": "2025-04-16", - "last_updated": "2025-04-16", + "attachment": false, + "open_weights": true, + "release_date": "2025-10-29", + "last_updated": "2025-10-29", "type": "chat" }, { - "id": "openai/gpt-4o-2024-05-13", - "name": "GPT-4o (2024-05-13)", - "display_name": "GPT-4o (2024-05-13)", + "id": "us.meta.llama3-1-8b-instruct-v1:0", + "name": "Llama 3.1 8B Instruct (US)", + "display_name": "Llama 3.1 8B Instruct (US)", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" @@ -290453,28 +287030,29 @@ "reasoning": { "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2023-09", - "release_date": "2024-05-13", - "last_updated": "2024-05-13", + "attachment": false, + "open_weights": true, + "knowledge": "2023-12", + "release_date": "2024-07-23", + "last_updated": "2024-07-23", "type": "chat" }, { - "id": "openai/gpt-6-sol", - "name": "GPT-6 Sol", - "display_name": "GPT-6 Sol", + "id": "us.anthropic.claude-opus-5-5", + "name": "Claude Opus 5.5 (US)", + "display_name": "Claude Opus 5.5 (US)", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1050000, + "context": 1000000, "output": 128000 }, "temperature": false, @@ -290486,7 +287064,6 @@ "extra_capabilities": { "reasoning": { "effort_options": [ - "none", "low", "medium", "high", @@ -290497,15 +287074,15 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2026-04-20", + "knowledge": "2026-06", "release_date": "2026-09-22", "last_updated": "2026-09-22", "type": "chat" }, { - "id": "openai/gpt-5-search-api", - "name": "GPT-5 Search API", - "display_name": "GPT-5 Search API", + "id": "us.anthropic.claude-opus-4-7", + "name": "Claude Opus 4.7 (US)", + "display_name": "Claude Opus 4.7 (US)", "modalities": { "input": [ "text", @@ -290517,65 +287094,52 @@ ] }, "limit": { - "context": 272000, - "output": 128000 - }, - "temperature": false, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": false, - "release_date": "2025-10-14", - "last_updated": "2025-10-14", - "type": "chat" - }, - { - "id": "openai/gpt-6.1-sol", - "name": "GPT-6.1 Sol", - "display_name": "GPT-6.1 Sol", - "modalities": { - "input": [ - "text", - "image" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 1050000, + "context": 1000000, "output": 128000 }, "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "high", "effort_options": [ "low", "medium", "high", "xhigh", "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-04-30", - "release_date": "2026-09-29", - "last_updated": "2026-09-29", + "knowledge": "2026-01-31", + "release_date": "2026-04-16", + "last_updated": "2026-04-16", "type": "chat" }, { - "id": "openai/gpt-oss-safeguard-120b", - "name": "GPT OSS Safeguard 120B", - "display_name": "GPT OSS Safeguard 120B", + "id": "qwen.qwen3-coder-30b-a3b-v1:0", + "name": "Qwen3-Coder 30B-A3B Instruct", + "display_name": "Qwen3-Coder 30B-A3B Instruct", "modalities": { "input": [ "text" @@ -290585,194 +287149,131 @@ ] }, "limit": { - "context": 4096, - "output": 4096 + "context": 262144, + "output": 131072 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, "open_weights": true, - "release_date": "2025-10-29", - "last_updated": "2025-10-29", + "knowledge": "2025-04", + "release_date": "2025-07-31", + "last_updated": "2025-09-18", "type": "chat" }, { - "id": "openai/gpt-audio", - "name": "GPT Audio", - "display_name": "GPT Audio", + "id": "google.gemma-3-12b-it", + "name": "Gemma 3 12B IT", + "display_name": "Gemma 3 12B IT", "modalities": { "input": [ "text", - "audio" + "image" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 131072, + "output": 8192 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2023-10-01", - "release_date": "2025-08-28", - "last_updated": "2025-08-28", + "open_weights": true, + "knowledge": "2024-08", + "release_date": "2025-03-12", + "last_updated": "2025-03-12", "type": "chat" }, { - "id": "openai/gpt-5.4", - "name": "GPT-5.4", - "display_name": "GPT-5.4", + "id": "minimax.minimax-m2.5", + "name": "MiniMax-M2.5", + "display_name": "MiniMax-M2.5", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 196608, + "output": 98304 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "interleaved": true } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-05", - "last_updated": "2026-03-05", - "type": "chat" - }, - { - "id": "openai/gpt-4o-2024-11-20", - "name": "GPT-4o (2024-11-20)", - "display_name": "GPT-4o (2024-11-20)", - "modalities": { - "input": [ - "text", - "image", - "pdf" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 128000, - "output": 16384 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": false, - "knowledge": "2023-09", - "release_date": "2024-11-20", - "last_updated": "2024-11-20", + "attachment": false, + "open_weights": true, + "release_date": "2026-02-12", + "last_updated": "2026-03-18", "type": "chat" }, { - "id": "openai/gpt-5.1", - "name": "GPT-5.1", - "display_name": "GPT-5.1", + "id": "google.gemma-4-e2b", + "name": "Gemma 4 E2B IT", + "display_name": "Gemma 4 E2B IT", "modalities": { "input": [ "text", "image", - "pdf" + "audio", + "video" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 131072, + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", "effort_options": [ "none", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", "high" - ], - "visibility": "hidden" + ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-11-13", - "last_updated": "2025-11-13", + "open_weights": true, + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "openai/gpt-4o-2024-08-06", - "name": "GPT-4o (2024-08-06)", - "display_name": "GPT-4o (2024-08-06)", + "id": "mistral.magistral-small-2509", + "name": "Magistral Small 1.2", + "display_name": "Magistral Small 1.2", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" @@ -290780,24 +287281,24 @@ }, "limit": { "context": 128000, - "output": 16384 + "output": 40000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": true, - "open_weights": false, - "knowledge": "2023-09", - "release_date": "2024-08-06", - "last_updated": "2024-08-06", + "open_weights": true, + "release_date": "2025-09-18", + "last_updated": "2025-09-18", "type": "chat" }, { - "id": "openai/gpt-4.1-mini", - "name": "GPT-4.1 Mini", - "display_name": "GPT-4.1 Mini", + "id": "eu.anthropic.claude-sonnet-4-20250514-v1:0", + "name": "Claude Sonnet 4 (EU)", + "display_name": "Claude Sonnet 4 (EU)", "modalities": { "input": [ "text", @@ -290809,36 +287310,59 @@ ] }, "limit": { - "context": 1047576, - "output": 32768 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + ] + } }, "attachment": true, "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-04-14", - "last_updated": "2025-04-14", + "knowledge": "2025-03-31", + "release_date": "2025-05-22", + "last_updated": "2025-05-22", "type": "chat" }, { - "id": "openai/gpt-6-astra", - "name": "GPT-6 Astra", - "display_name": "GPT-6 Astra", + "id": "us.anthropic.claude-sonnet-5", + "name": "Claude Sonnet 5 (US)", + "display_name": "Claude Sonnet 5 (US)", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1050000, + "context": 1000000, "output": 128000 }, "temperature": false, @@ -290849,7 +287373,6 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ "low", "medium", @@ -290861,15 +287384,15 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2026-04-30", - "release_date": "2026-09-04", - "last_updated": "2026-09-04", + "knowledge": "2026-01-31", + "release_date": "2026-06-30", + "last_updated": "2026-06-30", "type": "chat" }, { - "id": "openai/gpt-oss-120b", - "name": "GPT-OSS 120B", - "display_name": "GPT-OSS 120B", + "id": "moonshot.kimi-k2-thinking", + "name": "Kimi K2 Thinking", + "display_name": "Kimi K2 Thinking", "modalities": { "input": [ "text" @@ -290879,83 +287402,60 @@ ] }, "limit": { - "context": 128000, - "output": 32000 + "context": 262144, + "output": 16000 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true } }, "attachment": false, "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "knowledge": "2024-08", + "release_date": "2025-11-06", + "last_updated": "2025-12-02", "type": "chat" }, { - "id": "openai/gpt-5.5", - "name": "GPT-5.5", - "display_name": "GPT-5.5", + "id": "meta.llama3-1-70b-instruct-v1:0", + "name": "Llama 3.1 70B Instruct", + "display_name": "Llama 3.1 70B Instruct", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 128000, + "output": 4096 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-12-01", - "release_date": "2026-04-23", - "last_updated": "2026-04-23", + "attachment": false, + "open_weights": true, + "knowledge": "2023-12", + "release_date": "2024-07-23", + "last_updated": "2024-07-23", "type": "chat" }, { - "id": "openai/gpt-4o-mini", - "name": "GPT-4o Mini", - "display_name": "GPT-4o Mini", + "id": "global.anthropic.claude-haiku-5-5", + "name": "Claude Haiku 5.5 (Global)", + "display_name": "Claude Haiku 5.5 (Global)", "modalities": { "input": [ "text", @@ -290967,25 +287467,37 @@ ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } }, "attachment": true, "open_weights": false, - "knowledge": "2023-09", - "release_date": "2024-07-18", - "last_updated": "2024-07-18", + "knowledge": "2026-06", + "release_date": "2026-10-07", + "last_updated": "2026-10-07", "type": "chat" }, { - "id": "openai/gpt-5-mini", - "name": "GPT-5 Mini", - "display_name": "GPT-5 Mini", + "id": "jp.anthropic.claude-sonnet-5", + "name": "Claude Sonnet 5 (JP)", + "display_name": "Claude Sonnet 5 (JP)", "modalities": { "input": [ "text", @@ -290997,7 +287509,7 @@ ] }, "limit": { - "context": 400000, + "context": 1000000, "output": 128000 }, "temperature": false, @@ -291008,70 +287520,61 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", "effort_options": [ - "minimal", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ "low", "medium", - "high" - ], - "visibility": "hidden" + "high", + "xhigh", + "max" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2024-05-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "knowledge": "2026-01-31", + "release_date": "2026-06-30", + "last_updated": "2026-06-30", "type": "chat" }, { - "id": "openai/gpt-oss-20b", - "name": "GPT-OSS 20B", - "display_name": "GPT-OSS 20B", + "id": "global.moonshotai.kimi-k3", + "name": "Kimi K3 (Global)", + "display_name": "Kimi K3 (Global)", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 32000 + "context": 1048576, + "output": 128000 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true } }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" }, { - "id": "openai/gpt-5", - "name": "GPT-5", - "display_name": "GPT-5", + "id": "au.anthropic.claude-opus-5", + "name": "Claude Opus 5 (AU)", + "display_name": "Claude Opus 5 (AU)", "modalities": { "input": [ "text", @@ -291083,7 +287586,7 @@ ] }, "limit": { - "context": 400000, + "context": 1000000, "output": 128000 }, "temperature": false, @@ -291094,36 +287597,26 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", "effort_options": [ - "minimal", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ "low", "medium", - "high" - ], - "visibility": "hidden" + "high", + "xhigh", + "max" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "knowledge": "2026-05", + "release_date": "2026-07-24", + "last_updated": "2026-07-24", "type": "chat" }, { - "id": "openai/gpt-6-luna", - "name": "GPT-6 Luna", - "display_name": "GPT-6 Luna", + "id": "global.openai.gpt-6-sol", + "name": "GPT-6 Sol (Global)", + "display_name": "GPT-6 Sol (Global)", "modalities": { "input": [ "text", @@ -291157,71 +287650,78 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2026-05-18", + "knowledge": "2026-04-20", "release_date": "2026-09-22", "last_updated": "2026-09-22", "type": "chat" }, { - "id": "openai/gpt-4.1", - "name": "GPT-4.1", - "display_name": "GPT-4.1", + "id": "meta.llama3-1-8b-instruct-v1:0", + "name": "Llama 3.1 8B Instruct", + "display_name": "Llama 3.1 8B Instruct", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1047576, - "output": 32768 + "context": 128000, + "output": 4096 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-04-14", - "last_updated": "2025-04-14", + "attachment": false, + "open_weights": true, + "knowledge": "2023-12", + "release_date": "2024-07-23", + "last_updated": "2024-07-23", "type": "chat" }, { - "id": "openai/whisper-1", - "name": "Whisper", - "display_name": "Whisper", + "id": "zai.glm-4.7", + "name": "GLM-4.7", + "display_name": "GLM-4.7", "modalities": { "input": [ - "audio" + "text" ], "output": [ "text" ] }, "limit": { - "context": 448000, - "output": 4096 + "context": 202752, + "output": 131072 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, - "open_weights": false, - "release_date": "2023-03-01", - "last_updated": "2023-03-01" + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true + } + }, + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-12-22", + "last_updated": "2025-12-22", + "type": "chat" }, { - "id": "openai/gpt-5.2-chat-latest", - "name": "GPT-5.2 Chat Latest", - "display_name": "GPT-5.2 Chat Latest", + "id": "openai.gpt-5.6-luna", + "name": "GPT-5.6 Luna", + "display_name": "GPT-5.6 Luna", "modalities": { "input": [ "text", @@ -291233,25 +287733,38 @@ ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 1050000, + "output": 128000 }, "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ] + } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2025-12-11", - "last_updated": "2025-12-11", + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "openai/o1", - "name": "o1", - "display_name": "o1", + "id": "global.anthropic.claude-sonnet-5-5", + "name": "Claude Sonnet 5.5 (Global)", + "display_name": "Claude Sonnet 5.5 (Global)", "modalities": { "input": [ "text", @@ -291263,8 +287776,8 @@ ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 1000000, + "output": 128000 }, "temperature": false, "tool_call": true, @@ -291274,29 +287787,26 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", "effort_options": [ "low", "medium", - "high" - ], - "visibility": "hidden" + "high", + "xhigh", + "max" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2023-09", - "release_date": "2024-12-05", - "last_updated": "2024-12-05", + "knowledge": "2026-06", + "release_date": "2026-09-28", + "last_updated": "2026-09-28", "type": "chat" }, { - "id": "openai/gpt-4.1-nano", - "name": "GPT-4.1 Nano", - "display_name": "GPT-4.1 Nano", + "id": "au.anthropic.claude-opus-4-6-v1", + "name": "AU Anthropic Claude Opus 4.6", + "display_name": "AU Anthropic Claude Opus 4.6", "modalities": { "input": [ "text", @@ -291308,53 +287818,96 @@ ] }, "limit": { - "context": 1047576, - "output": 32768 + "context": 1000000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." + ] + } }, "attachment": true, "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-04-14", - "last_updated": "2025-04-14", + "knowledge": "2025-05-31", + "release_date": "2026-02-05", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "openai/gpt-4", - "name": "GPT-4", - "display_name": "GPT-4", + "id": "anthropic.claude-opus-5-5", + "name": "Claude Opus 5.5", + "display_name": "Claude Opus 5.5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 1000000, + "output": 128000 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + }, + "attachment": true, "open_weights": false, - "knowledge": "2023-11", - "release_date": "2023-11-06", - "last_updated": "2024-04-09", + "knowledge": "2026-06", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "openai/o4-mini", - "name": "o4 Mini", - "display_name": "o4 Mini", + "id": "anthropic.claude-opus-5", + "name": "Claude Opus 5", + "display_name": "Claude Opus 5", "modalities": { "input": [ "text", @@ -291366,8 +287919,8 @@ ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 1000000, + "output": 128000 }, "temperature": false, "tool_call": true, @@ -291377,34 +287930,29 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", "effort_options": [ "low", "medium", - "high" - ], - "visibility": "hidden" + "high", + "xhigh", + "max" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2024-05", - "release_date": "2025-04-16", - "last_updated": "2025-04-16", + "knowledge": "2026-05", + "release_date": "2026-07-24", + "last_updated": "2026-07-24", "type": "chat" }, { - "id": "openai/gpt-4-turbo", - "name": "GPT-4 Turbo", - "display_name": "GPT-4 Turbo", + "id": "meta.llama3-3-70b-instruct-v1:0", + "name": "Llama 3.3 70B Instruct", + "display_name": "Llama 3.3 70B Instruct", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" @@ -291419,17 +287967,17 @@ "reasoning": { "supported": false }, - "attachment": true, - "open_weights": false, + "attachment": false, + "open_weights": true, "knowledge": "2023-12", - "release_date": "2023-11-06", - "last_updated": "2024-04-09", + "release_date": "2024-12-06", + "last_updated": "2024-12-06", "type": "chat" }, { - "id": "openai/gpt-5.1-chat-latest", - "name": "GPT-5.1 Chat Latest", - "display_name": "GPT-5.1 Chat Latest", + "id": "openai.gpt-5.6-sol", + "name": "GPT-5.6 Sol", + "display_name": "GPT-5.6 Sol", "modalities": { "input": [ "text", @@ -291441,37 +287989,49 @@ ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 1050000, + "output": 128000 }, "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ] + } }, "attachment": true, "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-11-13", - "last_updated": "2025-11-13", + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "mistral/mistral-small-latest", - "name": "Mistral Small (latest)", - "display_name": "Mistral Small (latest)", + "id": "us-gov.openai.gpt-oss-20b-1:0", + "name": "gpt-oss-20b (GovCloud)", + "display_name": "gpt-oss-20b (GovCloud)", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 256000 + "context": 128000, + "output": 16384 }, "temperature": true, "tool_call": true, @@ -291479,104 +288039,155 @@ "supported": true, "default": true }, - "attachment": true, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "high" + ] + } + }, + "attachment": false, "open_weights": true, - "knowledge": "2025-06", - "release_date": "2026-03-16", - "last_updated": "2026-03-16", + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "mistral/mistral-large-2512", - "name": "Mistral Large 3", - "display_name": "Mistral Large 3", + "id": "au.anthropic.claude-sonnet-5-5", + "name": "Claude Sonnet 5.5 (AU)", + "display_name": "Claude Sonnet 5.5 (AU)", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 256000 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } }, "attachment": true, - "open_weights": true, - "knowledge": "2024-11", - "release_date": "2025-12-02", - "last_updated": "2025-12-02", + "open_weights": false, + "knowledge": "2026-06", + "release_date": "2026-09-28", + "last_updated": "2026-09-28", "type": "chat" }, { - "id": "mistral/mistral-medium-latest", - "name": "Mistral Medium (latest)", - "display_name": "Mistral Medium (latest)", + "id": "global.anthropic.claude-haiku-4-5-20251001-v1:0", + "name": "Claude Haiku 4.5 (Global)", + "display_name": "Claude Haiku 4.5 (Global)", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + ] + } }, "attachment": true, - "open_weights": true, - "release_date": "2026-04-29", - "last_updated": "2026-04-29", + "open_weights": false, + "knowledge": "2025-02-28", + "release_date": "2025-10-15", + "last_updated": "2025-10-15", "type": "chat" }, { - "id": "mistral/mistral-medium-2505", - "name": "Mistral Medium 3", - "display_name": "Mistral Medium 3", + "id": "zai.glm-4.7-flash", + "name": "GLM-4.7-Flash", + "display_name": "GLM-4.7-Flash", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 128000 + "context": 202752, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-05", - "release_date": "2025-05-07", - "last_updated": "2025-05-07", + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true + } + }, + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2026-01-19", + "last_updated": "2026-01-19", "type": "chat" }, { - "id": "mistral/codestral-latest", - "name": "Codestral (latest)", - "display_name": "Codestral (latest)", + "id": "deepseek.v3-v1:0", + "name": "DeepSeek-V3.1", + "display_name": "DeepSeek-V3.1", "modalities": { "input": [ "text" @@ -291586,139 +288197,284 @@ ] }, "limit": { - "context": 256000, - "output": 4096 + "context": 163840, + "output": 81920 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true + } }, "attachment": false, "open_weights": true, - "knowledge": "2024-10", - "release_date": "2024-05-29", - "last_updated": "2025-01-04", + "release_date": "2025-08-21", + "last_updated": "2025-09-18", "type": "chat" }, { - "id": "mistral/devstral-2512", - "name": "Devstral 2", - "display_name": "Devstral 2", + "id": "google.gemma-4-31b", + "name": "Gemma 4 31B IT", + "display_name": "Gemma 4 31B IT", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 256000 + "context": 262144, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "high" + ] + } + }, + "attachment": true, "open_weights": true, - "knowledge": "2025-12", - "release_date": "2025-12-09", - "last_updated": "2025-12-09", + "knowledge": "2025-01", + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "mistral/magistral-medium-latest", - "name": "Magistral Medium (latest)", - "display_name": "Magistral Medium (latest)", + "id": "us.anthropic.claude-opus-4-5-20251101-v1:0", + "name": "Claude Opus 4.5 (US)", + "display_name": "Claude Opus 4.5 (US)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", + "effort_options": [ + "low", + "medium", + "high" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." + ] + } + }, + "attachment": true, "open_weights": false, - "knowledge": "2025-06", - "release_date": "2025-03-17", - "last_updated": "2025-03-20", + "knowledge": "2025-05", + "release_date": "2025-11-24", + "last_updated": "2025-11-24", "type": "chat" }, { - "id": "mistral/devstral-medium-latest", - "name": "Devstral 2 (latest)", - "display_name": "Devstral 2 (latest)", + "id": "global.anthropic.claude-opus-4-7", + "name": "Claude Opus 4.7 (Global)", + "display_name": "Claude Opus 4.7 (Global)", + "modalities": { + "input": [ + "text", + "image", + "pdf" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1000000, + "output": 128000 + }, + "temperature": false, + "tool_call": true, + "reasoning": { + "supported": true, + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2026-01-31", + "release_date": "2026-04-16", + "last_updated": "2026-04-16", + "type": "chat" + }, + { + "id": "jp.anthropic.claude-opus-5", + "name": "Claude Opus 5 (JP)", + "display_name": "Claude Opus 5 (JP)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-12", - "release_date": "2025-12-02", - "last_updated": "2025-12-02", + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2026-05", + "release_date": "2026-07-24", + "last_updated": "2026-07-24", "type": "chat" }, { - "id": "mistral/mistral-large-latest", - "name": "Mistral Large (latest)", - "display_name": "Mistral Large (latest)", + "id": "global.anthropic.claude-fable-5-1", + "name": "Claude Fable 5.1 (Global)", + "display_name": "Claude Fable 5.1 (Global)", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", + "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", + "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." + ] + } }, "attachment": true, - "open_weights": true, - "knowledge": "2024-11", - "release_date": "2024-11-01", - "last_updated": "2025-12-02", + "open_weights": false, + "knowledge": "2026-06", + "release_date": "2026-09-01", + "last_updated": "2026-09-01", "type": "chat" }, { - "id": "mistral/pixtral-large-latest", - "name": "Pixtral Large (latest)", - "display_name": "Pixtral Large (latest)", + "id": "meta.llama4-scout-17b-instruct-v1:0", + "name": "Llama 4 Scout 17B Instruct", + "display_name": "Llama 4 Scout 17B Instruct", "modalities": { "input": [ "text", @@ -291729,8 +288485,8 @@ ] }, "limit": { - "context": 128000, - "output": 128000 + "context": 10000000, + "output": 8192 }, "temperature": true, "tool_call": true, @@ -291739,15 +288495,15 @@ }, "attachment": true, "open_weights": true, - "knowledge": "2024-11", - "release_date": "2024-11-01", - "last_updated": "2024-11-04", + "knowledge": "2024-08", + "release_date": "2025-04-05", + "last_updated": "2025-04-05", "type": "chat" }, { - "id": "qwen/qwen3-next-80b-a3b-instruct", - "name": "Qwen3-Next 80B-A3B Instruct", - "display_name": "Qwen3-Next 80B-A3B Instruct", + "id": "us-gov.openai.gpt-oss-120b-1:0", + "name": "gpt-oss-120b (GovCloud)", + "display_name": "gpt-oss-120b (GovCloud)", "modalities": { "input": [ "text" @@ -291757,25 +288513,35 @@ ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 128000, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "high" + ] + } }, "attachment": false, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-09", - "last_updated": "2025-09", + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "qwen/qwen3.5-397b-a17b", - "name": "Qwen3.5 397B A17B", - "display_name": "Qwen3.5 397B A17B", + "id": "amazon.nova-micro-v1:0", + "name": "Nova Micro", + "display_name": "Nova Micro", "modalities": { "input": [ "text" @@ -291785,36 +288551,25 @@ ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 128000, + "output": 10000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": false, - "open_weights": true, - "release_date": "2026-02-15", - "last_updated": "2026-02-15", + "open_weights": false, + "knowledge": "2024-10", + "release_date": "2024-12-03", + "last_updated": "2024-12-03", "type": "chat" }, { - "id": "qwen/qwen3.6-35b-a3b", - "name": "Qwen3.6 35B A3B", - "display_name": "Qwen3.6 35B A3B", + "id": "qwen.qwen3-next-80b-a3b", + "name": "Qwen3-Next 80B-A3B Instruct", + "display_name": "Qwen3-Next 80B-A3B Instruct", "modalities": { "input": [ "text" @@ -291825,47 +288580,35 @@ }, "limit": { "context": 262144, - "output": 65536 + "output": 262000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": false, "open_weights": true, - "release_date": "2026-04-17", - "last_updated": "2026-04-17", + "knowledge": "2025-04", + "release_date": "2025-09-11", + "last_updated": "2025-11-25", "type": "chat" }, { - "id": "qwen/qwen3.7-plus", - "name": "Qwen3.7 Plus", - "display_name": "Qwen3.7 Plus", + "id": "openai.gpt-oss-20b-1:0", + "name": "gpt-oss-20b", + "display_name": "gpt-oss-20b", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 131072, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -291875,20 +288618,24 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "effort_options": [ + "low", + "medium", + "high" + ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-04", - "release_date": "2026-06-02", - "last_updated": "2026-06-02", + "attachment": false, + "open_weights": true, + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "qwen/qwen3.5-4b", - "name": "Qwen3.5 4B", - "display_name": "Qwen3.5 4B", + "id": "nvidia.nemotron-nano-12b-v2", + "name": "NVIDIA Nemotron Nano 12B v2 VL BF16", + "display_name": "NVIDIA Nemotron Nano 12B v2 VL BF16", "modalities": { "input": [ "text", @@ -291899,36 +288646,24 @@ ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 131072, + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": true, "open_weights": true, - "release_date": "2026-03-02", - "last_updated": "2026-03-02", + "release_date": "2025-10-28", + "last_updated": "2025-10-28", "type": "chat" }, { - "id": "qwen/qwen3.5-35b-a3b", - "name": "Qwen3.5 35B A3B", - "display_name": "Qwen3.5 35B A3B", + "id": "us.writer.palmyra-x4-v1:0", + "name": "Palmyra X4 (US)", + "display_name": "Palmyra X4 (US)", "modalities": { "input": [ "text" @@ -291938,8 +288673,8 @@ ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 122880, + "output": 8192 }, "temperature": true, "tool_call": true, @@ -291947,107 +288682,107 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, "attachment": false, - "open_weights": true, - "release_date": "2026-02-23", - "last_updated": "2026-02-23", + "open_weights": false, + "release_date": "2024-10-09", + "last_updated": "2025-04-28", "type": "chat" }, { - "id": "qwen/qwen3-vl-235b-a22b-instruct", - "name": "Qwen3-VL 235B A22B Instruct", - "display_name": "Qwen3-VL 235B A22B Instruct", + "id": "nvidia.nemotron-nano-3-30b", + "name": "NVIDIA Nemotron Nano 3 30B", + "display_name": "NVIDIA Nemotron Nano 3 30B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 262144, + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2025-03-31", - "release_date": "2025-09-23", - "last_updated": "2025-09-23", + "knowledge": "2025-06-25", + "release_date": "2025-12-15", + "last_updated": "2025-12-23", "type": "chat" }, { - "id": "qwen/qwen3.6-max-preview", - "name": "Qwen3.6 Max Preview", - "display_name": "Qwen3.6 Max Preview", + "id": "global.anthropic.claude-sonnet-4-20250514-v1:0", + "name": "Claude Sonnet 4 (Global)", + "display_name": "Claude Sonnet 4 (Global)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 65536 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2025-04", - "release_date": "2026-04-20", - "last_updated": "2026-04-20", + "knowledge": "2025-03-31", + "release_date": "2025-05-22", + "last_updated": "2025-05-22", "type": "chat" }, { - "id": "qwen/qwen3.8-max", - "name": "Qwen3.8 Max", - "display_name": "Qwen3.8 Max", + "id": "openai.gpt-oss-20b", + "name": "gpt-oss-20b", + "display_name": "gpt-oss-20b", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, + "context": 131072, "output": 131072 }, "temperature": true, @@ -292058,32 +288793,39 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "effort_options": [ + "low", + "medium", + "high" + ] } }, - "attachment": true, - "open_weights": false, - "release_date": "2026-08-03", - "last_updated": "2026-08-03", + "attachment": false, + "open_weights": true, + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "qwen/qwen3-235b-a22b", - "name": "Qwen3 235B A22B", - "display_name": "Qwen3 235B A22B", + "id": "eu.anthropic.claude-fable-5", + "name": "Claude Fable 5 (EU)", + "display_name": "Claude Fable 5 (EU)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -292092,25 +288834,40 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], "interleaved": true, "summaries": true, - "visibility": "summary", + "visibility": "omitted", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", + "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", + "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-04-28", - "last_updated": "2025-04-28", + "attachment": true, + "open_weights": false, + "knowledge": "2026-01-31", + "release_date": "2026-06-09", + "last_updated": "2026-06-09", "type": "chat" }, { - "id": "qwen/qwen3-vl-flash", - "name": "Qwen3-VL Flash", - "display_name": "Qwen3-VL Flash", + "id": "us.openai.gpt-6-astra", + "name": "GPT-6 Astra (US)", + "display_name": "GPT-6 Astra (US)", "modalities": { "input": [ "text", @@ -292121,91 +288878,78 @@ ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" ] } }, "attachment": true, "open_weights": false, - "release_date": "2025-10-15", - "last_updated": "2025-10-15", + "knowledge": "2026-04-30", + "release_date": "2026-09-04", + "last_updated": "2026-09-04", "type": "chat" }, { - "id": "qwen/qwen3-coder-next", - "name": "Qwen3 Coder Next", - "display_name": "Qwen3 Coder Next", + "id": "us.xai.grok-4.7", + "name": "Grok 4.7 (US)", + "display_name": "Grok 4.7 (US)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 500000, + "output": 500000 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-09", - "release_date": "2026-02-03", - "last_updated": "2026-02-03", - "type": "chat" - }, - { - "id": "qwen/qwen3-coder-480b-a35b-instruct", - "name": "Qwen3 Coder 480B A35B Instruct", - "display_name": "Qwen3 Coder 480B A35B Instruct", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 131072, - "output": 32768 + "supported": true, + "default": true }, - "temperature": true, - "tool_call": false, - "reasoning": { - "supported": false + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "high", + "xhigh" + ] + } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-07-22", - "last_updated": "2025-07-22", + "attachment": true, + "open_weights": false, + "knowledge": "2026-05", + "release_date": "2026-09-21", + "last_updated": "2026-09-28", "type": "chat" }, { - "id": "qwen/qwen3.5-27b", - "name": "Qwen3.5 27B", - "display_name": "Qwen3.5 27B", + "id": "global.zai.glm-5.3", + "name": "GLM-5.3 (Global)", + "display_name": "GLM-5.3 (Global)", "modalities": { "input": [ "text" @@ -292215,8 +288959,8 @@ ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 1000000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -292228,66 +288972,58 @@ "reasoning": { "supported": true, "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" ] } }, "attachment": false, "open_weights": true, - "release_date": "2026-02-23", - "last_updated": "2026-02-23", + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "qwen/qwen3.5-plus", - "name": "Qwen3.5 Plus", - "display_name": "Qwen3.5 Plus", + "id": "mistral.ministral-3-8b-instruct", + "name": "Ministral 3 8B", + "display_name": "Ministral 3 8B", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 250000 + "context": 128000, + "output": 4096 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, - "attachment": false, - "open_weights": false, - "knowledge": "2025-04", - "release_date": "2026-02-16", - "last_updated": "2026-02-16", + "attachment": true, + "open_weights": true, + "release_date": "2025-12-02", + "last_updated": "2025-12-02", "type": "chat" }, { - "id": "qwen/qwen3.5-flash", - "name": "Qwen3.5 Flash", - "display_name": "Qwen3.5 Flash", + "id": "global.anthropic.claude-fable-5", + "name": "Claude Fable 5 (Global)", + "display_name": "Claude Fable 5 (Global)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" @@ -292295,9 +289031,9 @@ }, "limit": { "context": 1000000, - "output": 250000 + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -292306,24 +289042,40 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], "interleaved": true, "summaries": true, - "visibility": "summary", + "visibility": "omitted", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", + "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", + "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." ] } }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-02-23", - "last_updated": "2026-02-23", + "knowledge": "2026-01-31", + "release_date": "2026-06-09", + "last_updated": "2026-06-09", "type": "chat" }, { - "id": "qwen/qwen3.6-plus", - "name": "Qwen3.6 Plus", - "display_name": "Qwen3.6 Plus", + "id": "us.deepseek.r1-v1:0", + "name": "DeepSeek-R1 (US)", + "display_name": "DeepSeek-R1 (US)", "modalities": { "input": [ "text" @@ -292333,104 +289085,118 @@ ] }, "limit": { - "context": 1000000, - "output": 250000 + "context": 128000, + "output": 32768 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, "attachment": false, - "open_weights": false, - "knowledge": "2025-04", - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "open_weights": true, + "knowledge": "2024-07", + "release_date": "2025-01-20", + "last_updated": "2025-05-29", "type": "chat" }, { - "id": "qwen/qwen3.6-flash", - "name": "Qwen3.6 Flash", - "display_name": "Qwen3.6 Flash", + "id": "eu.anthropic.claude-sonnet-4-5-20250929-v1:0", + "name": "Claude Sonnet 4.5 (EU)", + "display_name": "Claude Sonnet 4.5 (EU)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 250000 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-04-27", - "last_updated": "2026-04-27", + "knowledge": "2025-07-31", + "release_date": "2025-09-29", + "last_updated": "2025-09-29", "type": "chat" }, { - "id": "qwen/qwen3-coder-flash", - "name": "Qwen3 Coder Flash", - "display_name": "Qwen3 Coder Flash", + "id": "xai.grok-4.6", + "name": "Grok 4.6", + "display_name": "Grok 4.6", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 250000 + "context": 500000, + "output": 500000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "high", + "xhigh" + ] + } + }, + "attachment": true, "open_weights": false, - "knowledge": "2025-04", - "release_date": "2025-07-28", - "last_updated": "2025-07-28", + "knowledge": "2026-02-01", + "release_date": "2026-08-12", + "last_updated": "2026-08-18", "type": "chat" }, { - "id": "qwen/qwen3-max-preview", - "name": "Qwen3 Max Preview", - "display_name": "Qwen3 Max Preview", + "id": "eu.amazon.nova-micro-v1:0", + "name": "Nova Micro (EU)", + "display_name": "Nova Micro (EU)", "modalities": { "input": [ "text" @@ -292440,36 +289206,25 @@ ] }, "limit": { - "context": 256000, - "output": 65536 + "context": 128000, + "output": 10000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": false, "open_weights": false, - "knowledge": "2025-04", - "release_date": "2025-09-05", - "last_updated": "2025-09-23", + "knowledge": "2024-10", + "release_date": "2024-12-03", + "last_updated": "2024-12-03", "type": "chat" }, { - "id": "qwen/qwen3-max", - "name": "Qwen3 Max", - "display_name": "Qwen3 Max", + "id": "nvidia.nemotron-nano-9b-v2", + "name": "NVIDIA Nemotron Nano 9B v2", + "display_name": "NVIDIA Nemotron Nano 9B v2", "modalities": { "input": [ "text" @@ -292479,39 +289234,30 @@ ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 131072, + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": false, - "open_weights": false, - "knowledge": "2025-04", - "release_date": "2025-09-23", - "last_updated": "2025-09-23", + "open_weights": true, + "knowledge": "2024-09", + "release_date": "2025-08-18", + "last_updated": "2025-08-18", "type": "chat" }, { - "id": "qwen/qwen3.7-max", - "name": "Qwen3.7 Max", - "display_name": "Qwen3.7 Max", + "id": "au.anthropic.claude-sonnet-5", + "name": "Claude Sonnet 5 (AU)", + "display_name": "Claude Sonnet 5 (AU)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" @@ -292519,9 +289265,9 @@ }, "limit": { "context": 1000000, - "output": 250000 + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -292529,19 +289275,26 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] } }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-05-21", - "last_updated": "2026-05-21", + "knowledge": "2026-01-31", + "release_date": "2026-06-30", + "last_updated": "2026-06-30", "type": "chat" }, { - "id": "qwen/qwen3-32b", - "name": "Qwen3 32B", - "display_name": "Qwen3 32B", + "id": "minimax.minimax-m2.1", + "name": "MiniMax-M2.1", + "display_name": "MiniMax-M2.1", "modalities": { "input": [ "text" @@ -292551,8 +289304,8 @@ ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 196608, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -292563,39 +289316,34 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "interleaved": true } }, "attachment": false, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-04-28", - "last_updated": "2025-04-28", + "release_date": "2025-12-23", + "last_updated": "2025-12-23", "type": "chat" }, { - "id": "qwen/qwen3.6-27b", - "name": "Qwen3.6 27B", - "display_name": "Qwen3.6 27B", + "id": "openai.gpt-6-luna", + "name": "GPT-6 Luna", + "display_name": "GPT-6 Luna", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 64000 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -292603,69 +289351,60 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-04-22", - "last_updated": "2026-04-22", + "open_weights": false, + "knowledge": "2026-05-18", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "qwen/qwen3-vl-plus", - "name": "Qwen3-VL Plus", - "display_name": "Qwen3-VL Plus", + "id": "us.amazon.nova-micro-v1:0", + "name": "Nova Micro (US)", + "display_name": "Nova Micro (US)", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 128000, + "output": 10000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-04", - "release_date": "2025-09-23", - "last_updated": "2025-09-23", + "knowledge": "2024-10", + "release_date": "2024-12-03", + "last_updated": "2024-12-03", "type": "chat" }, { - "id": "qwen/qwen-flash", - "name": "Qwen Flash", - "display_name": "Qwen Flash", + "id": "global.anthropic.claude-opus-5", + "name": "Claude Opus 5 (Global)", + "display_name": "Claude Opus 5 (Global)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" @@ -292673,9 +289412,9 @@ }, "limit": { "context": 1000000, - "output": 250000 + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -292683,106 +289422,97 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" ] } }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-07-28", - "last_updated": "2025-07-28", + "knowledge": "2026-05", + "release_date": "2026-07-24", + "last_updated": "2026-07-24", "type": "chat" }, { - "id": "qwen/qwen3-next-80b-a3b-thinking", - "name": "Qwen3-Next 80B-A3B (Thinking)", - "display_name": "Qwen3-Next 80B-A3B (Thinking)", + "id": "in.openai.gpt-5.6-luna", + "name": "GPT-5.6 Luna (India)", + "display_name": "GPT-5.6 Luna (India)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 1050000, + "output": 128000 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-09", - "last_updated": "2025-09", + "attachment": true, + "open_weights": false, + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "qwen/qwen-plus", - "name": "Qwen Plus", - "display_name": "Qwen Plus", + "id": "eu.mistral.pixtral-large-2502-v1:0", + "name": "Pixtral Large (25.02) (EU)", + "display_name": "Pixtral Large (25.02) (EU)", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 250000 + "context": 128000, + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2024-04", - "release_date": "2024-01-25", - "last_updated": "2025-09-11", + "release_date": "2025-04-08", + "last_updated": "2025-04-08", "type": "chat" }, { - "id": "qwen/qwen3.5-9b", - "name": "Qwen3.5 9B", - "display_name": "Qwen3.5 9B", + "id": "us.openai.gpt-6.1-terra", + "name": "GPT-6.1 Terra (US)", + "display_name": "GPT-6.1 Terra (US)", "modalities": { "input": [ "text", @@ -292793,10 +289523,10 @@ ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -292804,37 +289534,41 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-02-23", - "last_updated": "2026-02-23", + "open_weights": false, + "knowledge": "2026-06-01", + "release_date": "2026-10-26", + "last_updated": "2026-10-26", "type": "chat" }, { - "id": "qwen/qwen3-vl-30b-a3b-instruct", - "name": "Qwen3-VL 30B-A3B Instruct", - "display_name": "Qwen3-VL 30B-A3B Instruct", + "id": "eu.amazon.nova-pro-v1:0", + "name": "Nova Pro (EU)", + "display_name": "Nova Pro (EU)", "modalities": { "input": [ "text", - "image" + "image", + "video", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 300000, + "output": 10000 }, "temperature": true, "tool_call": true, @@ -292842,127 +289576,153 @@ "supported": false }, "attachment": true, - "open_weights": true, - "release_date": "2025-10-04", - "last_updated": "2025-10-04", + "open_weights": false, + "knowledge": "2024-10", + "release_date": "2024-12-03", + "last_updated": "2024-12-03", "type": "chat" }, { - "id": "qwen/qwen3-vl-235b-a22b-thinking", - "name": "Qwen3-VL 235B A22B Thinking", - "display_name": "Qwen3-VL 235B A22B Thinking", + "id": "global.anthropic.claude-sonnet-4-5-20250929-v1:0", + "name": "Claude Sonnet 4.5 (Global)", + "display_name": "Claude Sonnet 4.5 (Global)", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-03-31", - "release_date": "2025-09-23", - "last_updated": "2025-09-23", + "open_weights": false, + "knowledge": "2025-07-31", + "release_date": "2025-09-29", + "last_updated": "2025-09-29", "type": "chat" }, { - "id": "qwen/qwen3-235b-a22b-instruct-2507", - "name": "Qwen3 235B A22B Instruct 2507", - "display_name": "Qwen3 235B A22B Instruct 2507", + "id": "apac.amazon.nova-pro-v1:0", + "name": "Nova Pro (APAC)", + "display_name": "Nova Pro (APAC)", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 300000, + "output": 10000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, - "open_weights": true, - "release_date": "2025-07-21", - "last_updated": "2025-07-21", + "attachment": true, + "open_weights": false, + "knowledge": "2024-10", + "release_date": "2024-12-03", + "last_updated": "2024-12-03", "type": "chat" }, { - "id": "qwen/qwen3.8-2.4t-a95b", - "name": "Qwen3.8 2.4T A95B", - "display_name": "Qwen3.8 2.4T A95B", + "id": "global.anthropic.claude-opus-5-5", + "name": "Claude Opus 5.5 (Global)", + "display_name": "Claude Opus 5.5 (Global)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 1010000 + "context": 1000000, + "output": 128000 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { - "supported": true + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-08-12", - "last_updated": "2026-08-12", + "attachment": true, + "open_weights": false, + "knowledge": "2026-06", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "qwen/qwen3.5-122b-a10b", - "name": "Qwen3.5 122B A10B", - "display_name": "Qwen3.5 122B A10B", + "id": "xai.grok-4.3", + "name": "Grok 4.3", + "display_name": "Grok 4.3", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -292972,66 +289732,38 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "none", + "low", + "medium", + "high" ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-02-23", - "last_updated": "2026-02-23", - "type": "chat" - }, - { - "id": "qwen/qwen3-coder-plus", - "name": "Qwen3 Coder Plus", - "display_name": "Qwen3 Coder Plus", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 1000000, - "output": 250000 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2025-04", - "release_date": "2025-07-23", - "last_updated": "2025-07-23", + "release_date": "2026-04-17", + "last_updated": "2026-06-28", "type": "chat" }, { - "id": "qwen/qwen3.8-flash", - "name": "Qwen3.8 Flash", - "display_name": "Qwen3.8 Flash", + "id": "global.openai.gpt-5.6-sol", + "name": "GPT-5.6 Sol (Global)", + "display_name": "GPT-5.6 Sol (Global)", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 977000, + "context": 1050000, "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -293039,19 +289771,27 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ] } }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "qwen/qwen3-30b-a3b", - "name": "Qwen3 30B A3B", - "display_name": "Qwen3 30B A3B", + "id": "openai.gpt-oss-120b", + "name": "gpt-oss-120b", + "display_name": "gpt-oss-120b", "modalities": { "input": [ "text" @@ -293062,7 +289802,7 @@ }, "limit": { "context": 131072, - "output": 32768 + "output": 131072 }, "temperature": true, "tool_call": true, @@ -293072,28 +289812,29 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "low", + "medium", + "high" ] } }, "attachment": false, "open_weights": true, - "release_date": "2025-04-28", - "last_updated": "2025-04-28", + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "deepseek/deepseek-v4-flash", - "name": "DeepSeek V4 Flash", - "display_name": "DeepSeek V4 Flash", + "id": "anthropic.claude-opus-4-6-v1", + "name": "Claude Opus 4.6", + "display_name": "Claude Opus 4.6", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" @@ -293101,22 +289842,27 @@ }, "limit": { "context": 1000000, - "output": 384000 + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, "effort": "high", "effort_options": [ "low", + "medium", "high", "max" ], @@ -293127,74 +289873,65 @@ "thinking_blocks" ], "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "attachment": true, + "open_weights": false, + "knowledge": "2025-05-31", + "release_date": "2026-02-05", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "deepseek/deepseek-r1-0528", - "name": "DeepSeek R1 (0528)", - "display_name": "DeepSeek R1 (0528)", + "id": "mistral.ministral-3-3b-instruct", + "name": "Ministral 3 3B", + "display_name": "Ministral 3 3B", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 65536, - "output": 32768 + "context": 256000, + "output": 8192 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2025-05-28", - "last_updated": "2025-05-28", + "release_date": "2025-12-02", + "last_updated": "2025-12-02", "type": "chat" }, { - "id": "deepseek/deepseek-v4-flash-0423", - "name": "DeepSeek V4 Flash 0423", - "display_name": "DeepSeek V4 Flash 0423", + "id": "global.openai.gpt-6-luna", + "name": "GPT-6 Luna (Global)", + "display_name": "GPT-6 Luna (Global)", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 1050000, + "output": 128000 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { "supported": true, "default": true @@ -293203,7 +289940,6 @@ "reasoning": { "effort_options": [ "none", - "minimal", "low", "medium", "high", @@ -293212,48 +289948,22 @@ ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-23", - "last_updated": "2026-04-23", - "type": "chat" - }, - { - "id": "deepseek/deepseek-v3.1", - "name": "DeepSeek V3.1", - "display_name": "DeepSeek V3.1", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 131072, - "output": 32768 - }, - "temperature": true, - "tool_call": false, - "reasoning": { - "supported": true, - "default": true - }, - "attachment": false, - "open_weights": true, - "release_date": "2025-08-21", - "last_updated": "2025-08-21", + "attachment": true, + "open_weights": false, + "knowledge": "2026-05-18", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "deepseek/deepseek-v4-pro", - "name": "DeepSeek V4 Pro", - "display_name": "DeepSeek V4 Pro", + "id": "us.anthropic.claude-fable-5-1", + "name": "Claude Fable 5.1 (US)", + "display_name": "Claude Fable 5.1 (US)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" @@ -293261,9 +289971,9 @@ }, "limit": { "context": 1000000, - "output": 384000 + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -293277,34 +289987,40 @@ "effort": "high", "effort_options": [ "low", + "medium", "high", + "xhigh", "max" ], "interleaved": true, "summaries": true, - "visibility": "summary", + "visibility": "omitted", "continuation": [ "thinking_blocks" ], "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." + "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", + "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", + "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "attachment": true, + "open_weights": false, + "knowledge": "2026-06", + "release_date": "2026-09-01", + "last_updated": "2026-09-01", "type": "chat" }, { - "id": "deepseek/deepseek-v4-pro-0813", - "name": "DeepSeek V4 Pro 0813", - "display_name": "DeepSeek V4 Pro 0813", + "id": "us.anthropic.claude-sonnet-4-6", + "name": "Claude Sonnet 4.6 (US)", + "display_name": "Claude Sonnet 4.6 (US)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" @@ -293312,38 +290028,53 @@ }, "limit": { "context": 1000000, - "output": 384000 + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", "effort_options": [ - "none", - "minimal", "low", "medium", "high", - "xhigh", "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-08-13", - "last_updated": "2026-08-22", + "attachment": true, + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-02-17", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "deepseek/deepseek-v4-flash-0731", - "name": "DeepSeek V4 Flash 0731", - "display_name": "DeepSeek V4 Flash 0731", + "id": "us.meta.llama3-1-70b-instruct-v1:0", + "name": "Llama 3.1 70B Instruct (US)", + "display_name": "Llama 3.1 70B Instruct (US)", "modalities": { "input": [ "text" @@ -293353,65 +290084,77 @@ ] }, "limit": { - "context": 1048576, - "output": 384000 + "context": 128000, + "output": 4096 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "none", - "low", - "medium", - "high", - "max" - ] - } + "supported": false }, "attachment": false, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-07-31", - "last_updated": "2026-07-31", + "knowledge": "2023-12", + "release_date": "2024-07-23", + "last_updated": "2024-07-23", "type": "chat" }, { - "id": "deepseek/deepseek-v3", - "name": "DeepSeek V3", - "display_name": "DeepSeek V3", + "id": "au.anthropic.claude-sonnet-4-5-20250929-v1:0", + "name": "Claude Sonnet 4.5 (AU)", + "display_name": "Claude Sonnet 4.5 (AU)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 163840, - "output": 81920 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false }, - "attachment": false, - "open_weights": true, - "release_date": "2024-12-26", - "last_updated": "2024-12-26", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-07-31", + "release_date": "2025-09-29", + "last_updated": "2025-09-29", "type": "chat" }, { - "id": "deepseek/deepseek-v4.1-flash-1017", - "name": "DeepSeek V4.1 Flash 1017", - "display_name": "DeepSeek V4.1 Flash 1017", + "id": "us.openai.gpt-6-sol", + "name": "GPT-6 Sol (US)", + "display_name": "GPT-6 Sol (US)", "modalities": { "input": [ "text", @@ -293422,10 +290165,10 @@ ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -293435,7 +290178,6 @@ "reasoning": { "effort_options": [ "none", - "minimal", "low", "medium", "high", @@ -293445,134 +290187,129 @@ } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-10-17", - "last_updated": "2026-10-17", + "open_weights": false, + "knowledge": "2026-04-20", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "deepseek/deepseek-v4-flash-0731-fast", - "name": "DeepSeek V4 Flash 0731", - "display_name": "DeepSeek V4 Flash 0731", + "id": "mistral.ministral-3-14b-instruct", + "name": "Ministral 14B 3.0", + "display_name": "Ministral 14B 3.0", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 128000, + "output": 4096 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-07-31", - "last_updated": "2026-07-31", + "release_date": "2025-12-02", + "last_updated": "2025-12-02", "type": "chat" }, { - "id": "deepseek/deepseek-v4.1-flash", - "name": "DeepSeek V4.1 Flash", - "display_name": "DeepSeek V4.1 Flash", + "id": "apac.amazon.nova-micro-v1:0", + "name": "Nova Micro (APAC)", + "display_name": "Nova Micro (APAC)", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 128000, + "output": 10000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "none", - "minimal", - "low", - "medium", - "high", - "xhigh", - "max" - ] - } + "supported": false }, - "attachment": true, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-09-10", - "last_updated": "2026-09-10", + "attachment": false, + "open_weights": false, + "knowledge": "2024-10", + "release_date": "2024-12-03", + "last_updated": "2024-12-03", "type": "chat" }, { - "id": "deepseek/deepseek-r1", - "name": "DeepSeek R1", - "display_name": "DeepSeek R1", + "id": "jp.anthropic.claude-opus-4-7", + "name": "Claude Opus 4.7 (JP)", + "display_name": "Claude Opus 4.7 (JP)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 163840, - "output": 40960 + "context": 1000000, + "output": 128000 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], "interleaved": true, "summaries": true, - "visibility": "summary", + "visibility": "omitted", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-07", - "release_date": "2025-01-20", - "last_updated": "2025-05-29", + "attachment": true, + "open_weights": false, + "knowledge": "2026-01-31", + "release_date": "2026-04-16", + "last_updated": "2026-04-16", "type": "chat" }, { - "id": "deepseek/deepseek-v3.2", - "name": "DeepSeek V3.2", - "display_name": "DeepSeek V3.2", + "id": "deepseek.r1-v1:0", + "name": "DeepSeek-R1", + "display_name": "DeepSeek-R1", "modalities": { "input": [ "text" @@ -293586,98 +290323,74 @@ "output": 32768 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, "attachment": false, "open_weights": true, "knowledge": "2024-07", - "release_date": "2025-12-01", - "last_updated": "2025-12-01", + "release_date": "2025-01-20", + "last_updated": "2025-05-29", "type": "chat" }, { - "id": "deepseek/deepseek-v4-pro-0423", - "name": "DeepSeek V4 Pro 0423", - "display_name": "DeepSeek V4 Pro 0423", + "id": "apac.anthropic.claude-sonnet-4-20250514-v1:0", + "name": "Claude Sonnet 4 (APAC)", + "display_name": "Claude Sonnet 4 (APAC)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 393216 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "high", - "max" + "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-23", - "last_updated": "2026-04-23", - "type": "chat" - }, - { - "id": "anthropic/claude-haiku-5-5", - "name": "Claude Haiku 5.5", - "display_name": "Claude Haiku 5.5", - "modalities": { - "input": [ - "text", - "image", - "pdf" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 1000000, - "output": 128000 - }, - "temperature": false, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, "attachment": true, "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-10-07", - "last_updated": "2026-10-07", + "knowledge": "2025-03-31", + "release_date": "2025-05-22", + "last_updated": "2025-05-22", "type": "chat" }, { - "id": "anthropic/claude-haiku-4-5-20251001", - "name": "Claude Haiku 4.5 (20251001)", - "display_name": "Claude Haiku 4.5 (20251001)", + "id": "us.anthropic.claude-sonnet-4-5-20250929-v1:0", + "name": "Claude Sonnet 4.5 (US)", + "display_name": "Claude Sonnet 4.5 (US)", "modalities": { "input": [ "text", @@ -293721,15 +290434,15 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2025-02-28", - "release_date": "2025-10-15", - "last_updated": "2025-10-15", + "knowledge": "2025-07-31", + "release_date": "2025-09-29", + "last_updated": "2025-09-29", "type": "chat" }, { - "id": "anthropic/claude-opus-4-7", - "name": "Claude Opus 4.7", - "display_name": "Claude Opus 4.7", + "id": "au.anthropic.claude-opus-4-7", + "name": "Claude Opus 4.7 (AU)", + "display_name": "Claude Opus 4.7 (AU)", "modalities": { "input": [ "text", @@ -293784,9 +290497,66 @@ "type": "chat" }, { - "id": "anthropic/claude-sonnet-5-5", - "name": "Claude Sonnet 5.5", - "display_name": "Claude Sonnet 5.5", + "id": "writer.palmyra-x5-v1:0", + "name": "Palmyra X5", + "display_name": "Palmyra X5", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1040000, + "output": 8192 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "attachment": false, + "open_weights": false, + "release_date": "2025-04-28", + "last_updated": "2025-04-28", + "type": "chat" + }, + { + "id": "nvidia.nemotron-super-3-120b", + "name": "NVIDIA Nemotron 3 Super 120B A12B", + "display_name": "NVIDIA Nemotron 3 Super 120B A12B", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 262144, + "output": 131072 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "attachment": false, + "open_weights": true, + "knowledge": "2025-06", + "release_date": "2026-03-11", + "last_updated": "2026-03-11", + "type": "chat" + }, + { + "id": "jp.anthropic.claude-haiku-5-5", + "name": "Claude Haiku 5.5 (JP)", + "display_name": "Claude Haiku 5.5 (JP)", "modalities": { "input": [ "text", @@ -293807,17 +290577,84 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + }, "attachment": true, "open_weights": false, "knowledge": "2026-06", - "release_date": "2026-09-28", - "last_updated": "2026-09-28", + "release_date": "2026-10-07", + "last_updated": "2026-10-07", "type": "chat" }, { - "id": "anthropic/claude-fable-5-1", - "name": "Claude Fable 5.1", - "display_name": "Claude Fable 5.1", + "id": "mistral.voxtral-mini-3b-2507", + "name": "Voxtral Mini 3B 2507", + "display_name": "Voxtral Mini 3B 2507", + "modalities": { + "input": [ + "text", + "audio" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 32768, + "output": 4096 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": true, + "release_date": "2025-07-15", + "last_updated": "2025-07-15", + "type": "chat" + }, + { + "id": "us.meta.llama3-3-70b-instruct-v1:0", + "name": "Llama 3.3 70B Instruct (US)", + "display_name": "Llama 3.3 70B Instruct (US)", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 128000, + "output": 4096 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "knowledge": "2023-12", + "release_date": "2024-12-06", + "last_updated": "2024-12-06", + "type": "chat" + }, + { + "id": "openai.gpt-6.1-terra", + "name": "GPT-6.1 Terra", + "display_name": "GPT-6.1 Terra", "modalities": { "input": [ "text", @@ -293829,7 +290666,7 @@ ] }, "limit": { - "context": 1000000, + "context": 1050000, "output": 128000 }, "temperature": false, @@ -293840,41 +290677,27 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", "effort_options": [ + "none", "low", "medium", "high", "xhigh", "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", - "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", - "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-09-01", - "last_updated": "2026-09-01", + "knowledge": "2026-06-01", + "release_date": "2026-10-26", + "last_updated": "2026-10-26", "type": "chat" }, { - "id": "anthropic/claude-sonnet-5", - "name": "Claude Sonnet 5", - "display_name": "Claude Sonnet 5", + "id": "eu.anthropic.claude-opus-5-5", + "name": "Claude Opus 5.5 (EU)", + "display_name": "Claude Opus 5.5 (EU)", "modalities": { "input": [ "text", @@ -293897,7 +290720,6 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ "low", "medium", @@ -293909,15 +290731,15 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-30", - "last_updated": "2026-06-30", + "knowledge": "2026-06", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "anthropic/claude-opus-5-5", - "name": "Claude Opus 5.5", - "display_name": "Claude Opus 5.5", + "id": "anthropic.claude-sonnet-4-6", + "name": "Claude Sonnet 4.6", + "display_name": "Claude Sonnet 4.6", "modalities": { "input": [ "text", @@ -293932,35 +290754,132 @@ "context": 1000000, "output": 128000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." + ] + } }, "attachment": true, "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "knowledge": "2025-08-31", + "release_date": "2026-02-17", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "anthropic/claude-opus-5", - "name": "Claude Opus 5", - "display_name": "Claude Opus 5", + "id": "google.gemma-3-4b-it", + "name": "Gemma 3 4B IT", + "display_name": "Gemma 3 4B IT", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 131072, + "output": 4096 + }, + "temperature": true, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": true, + "knowledge": "2024-08", + "release_date": "2025-03-12", + "last_updated": "2025-03-12", + "type": "chat" + }, + { + "id": "global.openai.gpt-6.1-sol", + "name": "GPT-6.1 Sol (Global)", + "display_name": "GPT-6.1 Sol (Global)", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1050000, + "output": 128000 + }, + "temperature": false, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2026-04-30", + "release_date": "2026-09-29", + "last_updated": "2026-09-29", + "type": "chat" + }, + { + "id": "us.openai.gpt-5.6-terra", + "name": "GPT-5.6 Terra (US)", + "display_name": "GPT-5.6 Terra (US)", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, + "context": 1050000, "output": 128000 }, "temperature": false, @@ -293971,8 +290890,8 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ + "none", "low", "medium", "high", @@ -293983,15 +290902,15 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2026-05", - "release_date": "2026-07-24", - "last_updated": "2026-07-24", + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "anthropic/claude-sonnet-4-6", - "name": "Claude Sonnet 4.6", - "display_name": "Claude Sonnet 4.6", + "id": "us.anthropic.claude-haiku-4-5-20251001-v1:0", + "name": "Claude Haiku 4.5 (US)", + "display_name": "Claude Haiku 4.5 (US)", "modalities": { "input": [ "text", @@ -294003,8 +290922,8 @@ ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, @@ -294016,18 +290935,11 @@ "reasoning": { "supported": true, "default_enabled": false, - "mode": "mixed", + "mode": "budget", "budget": { "min": 1024, "unit": "tokens" }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "max" - ], "interleaved": true, "summaries": true, "visibility": "summary", @@ -294035,22 +290947,22 @@ "thinking_blocks" ], "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-17", - "last_updated": "2026-03-13", + "knowledge": "2025-02-28", + "release_date": "2025-10-15", + "last_updated": "2025-10-15", "type": "chat" }, { - "id": "anthropic/claude-opus-4-5-20251101", - "name": "Claude Opus 4.5 (20251101)", - "display_name": "Claude Opus 4.5 (20251101)", + "id": "jp.anthropic.claude-sonnet-4-6", + "name": "Claude Sonnet 4.6 (JP)", + "display_name": "Claude Sonnet 4.6 (JP)", "modalities": { "input": [ "text", @@ -294062,8 +290974,8 @@ ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 1000000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -294084,7 +290996,8 @@ "effort_options": [ "low", "medium", - "high" + "high", + "max" ], "interleaved": true, "summaries": true, @@ -294093,74 +291006,86 @@ "thinking_blocks" ], "notes": [ - "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-05", - "release_date": "2025-11-24", - "last_updated": "2025-11-24", + "knowledge": "2025-08-31", + "release_date": "2026-02-17", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "anthropic/claude-opus-4-1-20250805", - "name": "Claude Opus 4.1 (20250805)", - "display_name": "Claude Opus 4.1 (20250805)", + "id": "us.meta.llama4-maverick-17b-instruct-v1:0", + "name": "Llama 4 Maverick 17B Instruct (US)", + "display_name": "Llama 4 Maverick 17B Instruct (US)", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 32000 + "context": 1000000, + "output": 8192 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": true, + "knowledge": "2024-08", + "release_date": "2025-04-05", + "last_updated": "2025-04-05", + "type": "chat" + }, + { + "id": "deepseek.v3.2", + "name": "DeepSeek V3.2", + "display_name": "DeepSeek V3.2", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 163840, + "output": 81920 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." - ] + "interleaved": true } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-03-31", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "attachment": false, + "open_weights": true, + "knowledge": "2024-07", + "release_date": "2025-12-01", + "last_updated": "2026-02-06", "type": "chat" }, { - "id": "anthropic/claude-opus-4-6", - "name": "Claude Opus 4.6", - "display_name": "Claude Opus 4.6", + "id": "in.anthropic.claude-opus-5", + "name": "Claude Opus 5 (India)", + "display_name": "Claude Opus 5 (India)", "modalities": { "input": [ "text", @@ -294175,51 +291100,34 @@ "context": 1000000, "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", "effort_options": [ "low", "medium", "high", + "xhigh", "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-05-31", - "release_date": "2026-02-05", - "last_updated": "2026-03-13", + "knowledge": "2026-05", + "release_date": "2026-07-24", + "last_updated": "2026-07-24", "type": "chat" }, { - "id": "anthropic/claude-opus-4-8", - "name": "Claude Opus 4.8", - "display_name": "Claude Opus 4.8", + "id": "anthropic.claude-fable-5-1", + "name": "Claude Fable 5.1", + "display_name": "Claude Fable 5.1", "modalities": { "input": [ "text", @@ -294238,12 +291146,12 @@ "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, + "default_enabled": true, "mode": "effort", "effort": "high", "effort_options": [ @@ -294260,23 +291168,51 @@ "thinking_blocks" ], "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." + "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", + "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", + "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-01", - "release_date": "2026-05-28", - "last_updated": "2026-05-28", + "knowledge": "2026-06", + "release_date": "2026-09-01", + "last_updated": "2026-09-01", "type": "chat" }, { - "id": "anthropic/claude-sonnet-4-5-20250929", - "name": "Claude Sonnet 4.5 (20250929)", - "display_name": "Claude Sonnet 4.5 (20250929)", + "id": "writer.palmyra-x4-v1:0", + "name": "Palmyra X4", + "display_name": "Palmyra X4", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 122880, + "output": 8192 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "attachment": false, + "open_weights": false, + "release_date": "2024-10-09", + "last_updated": "2025-04-28", + "type": "chat" + }, + { + "id": "jp.anthropic.claude-sonnet-4-5-20250929-v1:0", + "name": "Claude Sonnet 4.5 (JP)", + "display_name": "Claude Sonnet 4.5 (JP)", "modalities": { "input": [ "text", @@ -294326,9 +291262,40 @@ "type": "chat" }, { - "id": "anthropic/claude-fable-5", - "name": "Claude Fable 5", - "display_name": "Claude Fable 5", + "id": "us.amazon.nova-lite-v1:0", + "name": "Nova Lite (US)", + "display_name": "Nova Lite (US)", + "modalities": { + "input": [ + "text", + "image", + "video", + "pdf" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 300000, + "output": 10000 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": false, + "knowledge": "2024-10", + "release_date": "2024-12-03", + "last_updated": "2024-12-03", + "type": "chat" + }, + { + "id": "us.anthropic.claude-opus-4-8", + "name": "Claude Opus 4.8 (US)", + "display_name": "Claude Opus 4.8 (US)", "modalities": { "input": [ "text", @@ -294347,12 +291314,12 @@ "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, + "default_enabled": false, "mode": "effort", "effort": "high", "effort_options": [ @@ -294369,114 +291336,124 @@ "thinking_blocks" ], "notes": [ - "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", - "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", - "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-09", - "last_updated": "2026-06-09", + "knowledge": "2026-01", + "release_date": "2026-05-28", + "last_updated": "2026-05-28", "type": "chat" }, { - "id": "zai/glm-5.1", - "name": "GLM-5.1", - "display_name": "GLM-5.1", + "id": "anthropic.claude-opus-4-8", + "name": "Claude Opus 4.8", + "display_name": "Claude Opus 4.8", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 131072 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], "interleaved": true, "summaries": true, - "visibility": "summary", + "visibility": "omitted", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-04-07", - "last_updated": "2026-04-07", + "attachment": true, + "open_weights": false, + "knowledge": "2026-01", + "release_date": "2026-05-28", + "last_updated": "2026-05-28", "type": "chat" }, { - "id": "zai/glm-5", - "name": "GLM-5", - "display_name": "GLM-5", + "id": "qwen.qwen3-vl-235b-a22b", + "name": "Qwen3 VL 235B A22B Instruct", + "display_name": "Qwen3 VL 235B A22B Instruct", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 131072 + "context": 262144, + "output": 262000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-02-12", - "last_updated": "2026-02-12", + "knowledge": "2025-03-31", + "release_date": "2025-09-23", + "last_updated": "2025-11-25", "type": "chat" }, { - "id": "zai/glm-4.6", - "name": "GLM-4.6", - "display_name": "GLM-4.6", + "id": "openai.gpt-6.1-sol", + "name": "GPT-6.1 Sol", + "display_name": "GPT-6.1 Sol", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 131072 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -294484,62 +291461,82 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-09-30", - "last_updated": "2025-09-30", + "attachment": true, + "open_weights": false, + "knowledge": "2026-04-30", + "release_date": "2026-09-29", + "last_updated": "2026-09-29", "type": "chat" }, { - "id": "zai/glm-4.5-air", - "name": "GLM-4.5 Air", - "display_name": "GLM-4.5 Air", + "id": "eu.anthropic.claude-opus-5", + "name": "Claude Opus 5 (EU)", + "display_name": "Claude Opus 5 (EU)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 98304 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-07-28", - "last_updated": "2025-07-28", + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2026-05", + "release_date": "2026-07-24", + "last_updated": "2026-07-24", "type": "chat" }, { - "id": "zai/glm-5.3", - "name": "GLM-5.3", - "display_name": "GLM-5.3", + "id": "global.openai.gpt-6-astra", + "name": "GPT-6 Astra (Global)", + "display_name": "GPT-6 Astra (Global)", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -294547,27 +291544,31 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ "low", + "medium", "high", + "xhigh", "max" ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "attachment": true, + "open_weights": false, + "knowledge": "2026-04-30", + "release_date": "2026-09-04", + "last_updated": "2026-09-04", "type": "chat" }, { - "id": "zai/glm-5.2", - "name": "GLM-5.2", - "display_name": "GLM-5.2", + "id": "anthropic.claude-fable-5", + "name": "Claude Fable 5", + "display_name": "Claude Fable 5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" @@ -294575,9 +291576,9 @@ }, "limit": { "context": 1000000, - "output": 131072 + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -294586,24 +291587,40 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], "interleaved": true, "summaries": true, - "visibility": "summary", + "visibility": "omitted", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", + "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", + "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "attachment": true, + "open_weights": false, + "knowledge": "2026-01-31", + "release_date": "2026-06-09", + "last_updated": "2026-06-09", "type": "chat" }, { - "id": "zai/glm-4.7-flashx", - "name": "GLM-4.7 FlashX", - "display_name": "GLM-4.7 FlashX", + "id": "minimax.minimax-m2", + "name": "MiniMax-M2", + "display_name": "MiniMax-M2", "modalities": { "input": [ "text" @@ -294613,8 +291630,8 @@ ] }, "limit": { - "context": 200000, - "output": 131072 + "context": 204608, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -294622,17 +291639,22 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true + } + }, "attachment": false, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2026-01-19", - "last_updated": "2026-01-19", + "release_date": "2025-10-27", + "last_updated": "2025-10-27", "type": "chat" }, { - "id": "zai/glm-4.5v", - "name": "Glm 4.5V", - "display_name": "Glm 4.5V", + "id": "us.moonshotai.kimi-k3", + "name": "Kimi K3 (US)", + "display_name": "Kimi K3 (US)", "modalities": { "input": [ "text", @@ -294643,31 +291665,35 @@ ] }, "limit": { - "context": 128000, - "output": 32000 + "context": 1048576, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true + } + }, "attachment": true, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-08-11", - "last_updated": "2025-08-11", + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" }, { - "id": "zai/glm-5.3-flash", - "name": "GLM-5.3 Flash", - "display_name": "GLM-5.3 Flash", + "id": "openai.gpt-5.4", + "name": "GPT-5.4", + "display_name": "GPT-5.4", "modalities": { "input": [ "text", "image", - "video", "pdf" ], "output": [ @@ -294676,7 +291702,7 @@ }, "limit": { "context": 1000000, - "output": 131072 + "output": 128000 }, "temperature": true, "tool_call": true, @@ -294686,27 +291712,31 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ + "none", "low", + "medium", "high", - "max" + "xhigh" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-03-05", + "last_updated": "2026-06-01", "type": "chat" }, { - "id": "zai/glm-5-turbo", - "name": "GLM-5 Turbo", - "display_name": "GLM-5 Turbo", + "id": "au.anthropic.claude-haiku-4-5-20251001-v1:0", + "name": "Claude Haiku 4.5 (AU)", + "display_name": "Claude Haiku 4.5 (AU)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" @@ -294714,35 +291744,55 @@ }, "limit": { "context": 200000, - "output": 131072 + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-03-16", - "last_updated": "2026-03-16", + "knowledge": "2025-02-28", + "release_date": "2025-10-15", + "last_updated": "2025-10-15", "type": "chat" - }, + } + ] + }, + "mixlayer": { + "id": "mixlayer", + "name": "Mixlayer", + "display_name": "Mixlayer", + "api": "https://models.mixlayer.ai/v1", + "doc": "https://docs.mixlayer.com", + "models": [ { - "id": "zai/glm-4.7", - "name": "GLM-4.7", - "display_name": "GLM-4.7", + "id": "qwen/qwen3.5-35b-a3b", + "name": "Qwen3.5 35B A3B", + "display_name": "Qwen3.5 35B A3B", "modalities": { "input": [ "text" @@ -294752,8 +291802,8 @@ ] }, "limit": { - "context": 200000, - "output": 131072 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, @@ -294774,15 +291824,14 @@ }, "attachment": false, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-12-22", - "last_updated": "2025-12-22", + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" }, { - "id": "zai/glm-4.5", - "name": "GLM-4.5", - "display_name": "GLM-4.5", + "id": "qwen/qwen3.5-9b", + "name": "Qwen3.5 9B", + "display_name": "Qwen3.5 9B", "modalities": { "input": [ "text" @@ -294792,8 +291841,8 @@ ] }, "limit": { - "context": 128000, - "output": 98304 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, @@ -294801,17 +291850,27 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, "attachment": false, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-07-28", - "last_updated": "2025-07-28", + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" }, { - "id": "zai/glm-4.7-flash", - "name": "GLM 4.7 Flash", - "display_name": "GLM 4.7 Flash", + "id": "qwen/qwen3.5-397b-a17b", + "name": "Qwen3.5 397B A17B", + "display_name": "Qwen3.5 397B A17B", "modalities": { "input": [ "text" @@ -294821,8 +291880,8 @@ ] }, "limit": { - "context": 200000, - "output": 128000 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, @@ -294832,20 +291891,25 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": false, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2026-01-19", - "last_updated": "2026-01-19", + "release_date": "2026-02-15", + "last_updated": "2026-02-15", "type": "chat" }, { - "id": "thinkingmachines/inkling", - "name": "Inkling", - "display_name": "Inkling", + "id": "qwen/qwen3.5-27b", + "name": "Qwen3.5 27B", + "display_name": "Qwen3.5 27B", "modalities": { "input": [ "text" @@ -294855,8 +291919,8 @@ ] }, "limit": { - "context": 1048000, - "output": 32000 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, @@ -294864,100 +291928,75 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, "attachment": false, "open_weights": true, - "release_date": "2026-07-15", - "last_updated": "2026-07-15", + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" }, { - "id": "bytedance/dola-seed-2.0-pro", - "name": "Seed 2.0 Pro", - "display_name": "Seed 2.0 Pro", + "id": "qwen/qwen3.5-122b-a10b", + "name": "Qwen3.5 122B A10B", + "display_name": "Qwen3.5 122B A10B", "modalities": { "input": [ - "text", - "image" - ], - "output": [ "text" - ] - }, - "limit": { - "context": 256000, - "output": 128000 - }, - "temperature": false, - "tool_call": false, - "reasoning": { - "supported": true, - "default": true - }, - "attachment": true, - "open_weights": false, - "release_date": "2026-02-14", - "last_updated": "2026-02-14", - "type": "chat" - }, - { - "id": "bytedance/dola-seed-2.0-lite", - "name": "Seed 2.0 Lite", - "display_name": "Seed 2.0 Lite", - "modalities": { - "input": [ - "text", - "image" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 128000 + "context": 262144, + "output": 262144 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": false, - "release_date": "2026-02-14", - "last_updated": "2026-02-14", - "type": "chat" - }, - { - "id": "bytedance/dola-seed-2.0-code-preview", - "name": "Dola Seed 2.0 Code (preview)", - "display_name": "Dola Seed 2.0 Code (preview)", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 131072, - "output": 32768 + "supported": true, + "default": true }, - "temperature": true, - "tool_call": false, - "reasoning": { - "supported": false + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, - "open_weights": false, - "release_date": "2026-03-28", - "last_updated": "2026-03-28", + "open_weights": true, + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" - }, + } + ] + }, + "synthetic": { + "id": "synthetic", + "name": "Synthetic", + "display_name": "Synthetic", + "api": "https://api.synthetic.new/openai/v1", + "doc": "https://synthetic.new/pricing", + "models": [ { - "id": "bytedance/dola-seed-2.0-code", - "name": "Seed 2.0 Code", - "display_name": "Seed 2.0 Code", + "id": "hf:Qwen/Qwen3.6-27B", + "name": "Qwen3.6 27B", + "display_name": "Qwen3.6 27B", "modalities": { "input": [ "text", @@ -294968,24 +292007,42 @@ ] }, "limit": { - "context": 256000, - "output": 128000 + "context": 262144, + "output": 65536 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "none", + "low", + "medium", + "high" + ] + } }, "attachment": true, - "open_weights": false, - "release_date": "2026-02-14", - "last_updated": "2026-02-14", + "open_weights": true, + "release_date": "2026-04-22", + "last_updated": "2026-04-22", "type": "chat" }, { - "id": "bytedance/dola-seed-2.0-mini", - "name": "Seed 2.0 Mini", - "display_name": "Seed 2.0 Mini", + "id": "hf:moonshotai/Kimi-K2.7-Code", + "name": "Kimi K2.7 Code", + "display_name": "Kimi K2.7 Code", "modalities": { "input": [ "text", @@ -294996,112 +292053,87 @@ ] }, "limit": { - "context": 256000, - "output": 128000 + "context": 262144, + "output": 65536 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": false, - "release_date": "2026-02-14", - "last_updated": "2026-02-14", - "type": "chat" - } - ] - }, - "groq": { - "id": "groq", - "name": "Groq", - "display_name": "Groq", - "doc": "https://console.groq.com/docs/models", - "models": [ - { - "id": "whisper-large-v3", - "name": "Whisper", - "display_name": "Whisper", - "modalities": { - "input": [ - "audio" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 448, - "output": 448 + "supported": true, + "default": true }, - "temperature": true, - "tool_call": false, - "reasoning": { - "supported": false + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "low", + "medium", + "high" + ] + } }, "attachment": true, "open_weights": true, - "release_date": "2023-11-06", - "last_updated": "2023-11-06" + "knowledge": "2025-01", + "release_date": "2026-06-12", + "last_updated": "2026-06-12", + "type": "chat" }, { - "id": "llama-3.3-70b-versatile", - "name": "Llama 3.3 70B", - "display_name": "Llama 3.3 70B", + "id": "hf:moonshotai/Kimi-K3", + "name": "Kimi K3", + "display_name": "Kimi K3", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 524288, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": true, - "knowledge": "2023-12", - "release_date": "2024-12-06", - "last_updated": "2024-12-06", - "type": "chat" - }, - { - "id": "whisper-large-v3-turbo", - "name": "Whisper Large V3 Turbo", - "display_name": "Whisper Large V3 Turbo", - "modalities": { - "input": [ - "audio" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 448, - "output": 448 + "supported": true, + "default": true }, - "temperature": true, - "tool_call": false, - "reasoning": { - "supported": false + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "low", + "high", + "max" + ] + } }, "attachment": true, "open_weights": true, - "release_date": "2024-10-01", - "last_updated": "2024-10-01" + "release_date": "2026-07-16", + "last_updated": "2026-07-16", + "type": "chat" }, { - "id": "llama-3.1-8b-instant", - "name": "Llama 3.1 8B", - "display_name": "Llama 3.1 8B", + "id": "hf:zai-org/GLM-5.2", + "name": "GLM-5.2", + "display_name": "GLM-5.2", "modalities": { "input": [ "text" @@ -295111,62 +292143,52 @@ ] }, "limit": { - "context": 131072, - "output": 131072 + "context": 524288, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": true, - "knowledge": "2023-12", - "release_date": "2024-07-23", - "last_updated": "2024-07-23", - "type": "chat" - }, - { - "id": "allam-2-7b", - "name": "ALLaM-2-7b", - "display_name": "ALLaM-2-7b", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 4096, - "output": 4096 + "supported": true, + "default": true }, - "temperature": true, - "tool_call": false, - "reasoning": { - "supported": false + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "none", + "high", + "xhigh" + ] + } }, "attachment": false, "open_weights": true, - "release_date": "2025-01-23", - "last_updated": "2025-01-23", + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "openai/gpt-oss-safeguard-20b", - "name": "Safety GPT OSS 20B", - "display_name": "Safety GPT OSS 20B", + "id": "hf:zai-org/GLM-5.3-Flash", + "name": "GLM-5.3-Flash", + "display_name": "GLM-5.3-Flash", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 131072, + "context": 524288, "output": 65536 }, "temperature": true, @@ -295177,23 +292199,30 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ "low", - "medium", - "high" + "high", + "max" ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2025-10-29", - "last_updated": "2025-10-29", + "release_date": "2026-08-26", + "last_updated": "2026-08-26", "type": "chat" }, { - "id": "openai/gpt-oss-120b", - "name": "GPT OSS 120B", - "display_name": "GPT OSS 120B", + "id": "hf:zai-org/GLM-4.7-Flash", + "name": "GLM-4.7-Flash", + "display_name": "GLM-4.7-Flash", "modalities": { "input": [ "text" @@ -295203,7 +292232,7 @@ ] }, "limit": { - "context": 131072, + "context": 196608, "output": 65536 }, "temperature": true, @@ -295215,7 +292244,14 @@ "extra_capabilities": { "reasoning": { "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ + "none", "low", "medium", "high" @@ -295224,15 +292260,15 @@ }, "attachment": false, "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "knowledge": "2025-04", + "release_date": "2026-01-19", + "last_updated": "2026-01-19", "type": "chat" }, { - "id": "openai/gpt-oss-20b", - "name": "GPT OSS 20B", - "display_name": "GPT OSS 20B", + "id": "hf:zai-org/GLM-5.3", + "name": "GLM-5.3", + "display_name": "GLM-5.3", "modalities": { "input": [ "text" @@ -295242,7 +292278,7 @@ ] }, "limit": { - "context": 131072, + "context": 524288, "output": 65536 }, "temperature": true, @@ -295254,36 +292290,40 @@ "extra_capabilities": { "reasoning": { "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ "low", - "medium", - "high" + "high", + "max" ] } }, "attachment": false, "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "qwen/qwen3.8-27b", - "name": "Qwen3.8 27B", - "display_name": "Qwen3.8 27B", + "id": "hf:nvidia/NVIDIA-Nemotron-3-Super-120B-A12B-NVFP4", + "name": "Nemotron 3 Super 120B A12B", + "display_name": "Nemotron 3 Super 120B A12B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 16384 + "context": 262144, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -295293,6 +292333,13 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ "none", "low", @@ -295301,16 +292348,17 @@ ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "knowledge": "2025-06", + "release_date": "2026-03-11", + "last_updated": "2026-03-11", "type": "chat" }, { - "id": "qwen/qwen3.6-27b", - "name": "Qwen3.6 27B", - "display_name": "Qwen3.6 27B", + "id": "hf:MiniMaxAI/MiniMax-M3", + "name": "MiniMax-M3", + "display_name": "MiniMax-M3", "modalities": { "input": [ "text", @@ -295321,8 +292369,8 @@ ] }, "limit": { - "context": 131072, - "output": 16384 + "context": 524288, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -295340,252 +292388,229 @@ "thinking_blocks" ], "effort_options": [ - "none" + "low", + "medium", + "high" ] } }, "attachment": true, "open_weights": true, - "release_date": "2026-04-22", - "last_updated": "2026-04-22", + "release_date": "2026-06-01", + "last_updated": "2026-06-01", "type": "chat" }, { - "id": "canopylabs/orpheus-arabic-saudi", - "name": "Canopy Labs Orpheus Arabic Saudi", - "display_name": "Canopy Labs Orpheus Arabic Saudi", + "id": "hf:deepseek-ai/DeepSeek-V4.1-Flash-1017", + "name": "DeepSeek V4.1 Flash 1017", + "display_name": "DeepSeek V4.1 Flash 1017", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ - "audio" - ] - }, - "limit": { - "context": 4000, - "output": 50000 - }, - "temperature": false, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": false, - "release_date": "2025-12-16", - "last_updated": "2025-12-16" - }, - { - "id": "canopylabs/orpheus-v1-english", - "name": "Canopy Labs Orpheus V1 English", - "display_name": "Canopy Labs Orpheus V1 English", - "modalities": { - "input": [ "text" - ], - "output": [ - "audio" ] }, "limit": { - "context": 4000, - "output": 50000 + "context": 524288, + "output": 65536 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": false, - "release_date": "2025-12-19", - "last_updated": "2025-12-19" - }, - { - "id": "meta-llama/llama-prompt-guard-2-86m", - "name": "Prompt Guard 2 86M", - "display_name": "Prompt Guard 2 86M", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 512, - "output": 512 + "supported": true, + "default": true }, - "temperature": false, - "tool_call": false, - "reasoning": { - "supported": false + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "effort_options": [ + "none", + "low", + "high", + "xhigh", + "max" + ] + } }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2025-04-29", - "last_updated": "2025-04-29", + "knowledge": "2025-05", + "release_date": "2026-10-17", + "last_updated": "2026-10-17", "type": "chat" }, { - "id": "meta-llama/llama-prompt-guard-2-22m", - "name": "Llama Prompt Guard 2 22M", - "display_name": "Llama Prompt Guard 2 22M", + "id": "hf:deepseek-ai/DeepSeek-V4.1-Flash", + "name": "DeepSeek V4.1 Flash", + "display_name": "DeepSeek V4.1 Flash", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 512, - "output": 512 + "context": 524288, + "output": 65536 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "effort_options": [ + "none", + "low", + "high", + "xhigh", + "max" + ] + } + }, + "attachment": true, "open_weights": true, - "release_date": "2025-04-29", - "last_updated": "2025-04-29", + "knowledge": "2025-05", + "release_date": "2026-09-10", + "last_updated": "2026-09-10", "type": "chat" - } - ] - }, - "perplexity": { - "id": "perplexity", - "name": "Perplexity", - "display_name": "Perplexity", - "doc": "https://docs.perplexity.ai", - "models": [ + }, { - "id": "sonar-reasoning-pro", - "name": "Sonar Reasoning Pro", - "display_name": "Sonar Reasoning Pro", + "id": "hf:openai/gpt-oss-120b", + "name": "GPT OSS 120B", + "display_name": "GPT OSS 120B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 131072, + "output": 65536 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ - "minimal", + "none", "low", "medium", "high" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-09-01", - "release_date": "2024-01-01", - "last_updated": "2025-09-01", + "attachment": false, + "open_weights": true, + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" - }, + } + ] + }, + "evroc": { + "id": "evroc", + "name": "evroc", + "display_name": "evroc", + "api": "https://models.think.evroc.com/v1", + "doc": "https://docs.evroc.com/products/think/overview.html", + "models": [ { - "id": "sonar-deep-research", - "name": "Perplexity Sonar Deep Research", - "display_name": "Perplexity Sonar Deep Research", + "id": "moonshotai/Kimi-K2.6", + "name": "Kimi K2.6", + "display_name": "Kimi K2.6", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 32768 + "context": 262144, + "output": 262144 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "minimal", - "low", - "medium", - "high" - ] + "supported": true } }, - "attachment": false, - "open_weights": false, + "attachment": true, + "open_weights": true, "knowledge": "2025-01", - "release_date": "2025-02-01", - "last_updated": "2025-09-01", + "release_date": "2026-04-20", + "last_updated": "2026-04-20", "type": "chat" }, { - "id": "sonar-pro", - "name": "Sonar Pro", - "display_name": "Sonar Pro", + "id": "intfloat/multilingual-e5-large-instruct", + "name": "E5 Multi-Lingual Large Embeddings 0.6B", + "display_name": "E5 Multi-Lingual Large Embeddings 0.6B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 8192 + "context": 512, + "output": 512 }, - "temperature": true, "tool_call": false, "reasoning": { "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-09-01", - "release_date": "2024-01-01", - "last_updated": "2025-09-01", - "type": "chat" + "attachment": false, + "open_weights": true, + "release_date": "2024-06-01", + "last_updated": "2024-06-01", + "type": "embedding" }, { - "id": "sonar", - "name": "Sonar", - "display_name": "Sonar", + "id": "openai/whisper-large-v3", + "name": "Whisper 3 Large", + "display_name": "Whisper 3 Large", "modalities": { "input": [ - "text" + "audio" ], "output": [ "text" ] }, "limit": { - "context": 128000, + "context": 448, "output": 4096 }, "temperature": true, @@ -295593,26 +292618,15 @@ "reasoning": { "supported": false }, - "attachment": false, - "open_weights": false, - "knowledge": "2025-09-01", - "release_date": "2024-01-01", - "last_updated": "2025-09-01", - "type": "chat" - } - ] - }, - "zhipuai": { - "id": "zhipuai", - "name": "Zhipu AI", - "display_name": "Zhipu AI", - "api": "https://open.bigmodel.cn/api/paas/v4", - "doc": "https://docs.bigmodel.cn/cn/guide/start/pricing", - "models": [ + "attachment": true, + "open_weights": true, + "release_date": "2023-11-06", + "last_updated": "2023-11-06" + }, { - "id": "glm-5.1", - "name": "GLM-5.1", - "display_name": "GLM-5.1", + "id": "openai/gpt-oss-120b", + "name": "GPT OSS 120B", + "display_name": "GPT OSS 120B", "modalities": { "input": [ "text" @@ -295622,8 +292636,8 @@ ] }, "limit": { - "context": 200000, - "output": 131072 + "context": 65536, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -295634,66 +292648,50 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "low", + "medium", + "high" ] } }, "attachment": false, "open_weights": true, - "release_date": "2026-04-07", - "last_updated": "2026-04-07", + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "glm-5v-turbo", - "name": "GLM-5V-Turbo", - "display_name": "GLM-5V-Turbo", + "id": "openai/whisper-large-v3-turbo", + "name": "Whisper Large v3 Turbo", + "display_name": "Whisper Large v3 Turbo", "modalities": { "input": [ - "text", - "image", - "video", - "pdf" + "audio" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 131072 + "context": 448, + "output": 448 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": true, - "open_weights": false, - "release_date": "2026-04-01", - "last_updated": "2026-04-01", - "type": "chat" + "open_weights": true, + "release_date": "2024-10-01", + "last_updated": "2024-10-01" }, { - "id": "glm-5", - "name": "GLM-5", - "display_name": "GLM-5", + "id": "nvidia/Llama-3.3-70B-Instruct-FP8", + "name": "Llama-3.3-70B-Instruct", + "display_name": "Llama-3.3-70B-Instruct", "modalities": { "input": [ "text" @@ -295703,47 +292701,63 @@ ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 128000, + "output": 4096 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": false, "open_weights": true, - "release_date": "2026-02-12", - "last_updated": "2026-02-12", + "knowledge": "2023-12", + "release_date": "2024-12-06", + "last_updated": "2024-12-06", "type": "chat" }, { - "id": "glm-4.6", - "name": "GLM-4.6", - "display_name": "GLM-4.6", + "id": "KBLab/kb-whisper-large", + "name": "KB Whisper", + "display_name": "KB Whisper", "modalities": { "input": [ + "audio" + ], + "output": [ "text" + ] + }, + "limit": { + "context": 448, + "output": 448 + }, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": true, + "release_date": "2024-10-01", + "last_updated": "2024-10-01" + }, + { + "id": "Qwen/Qwen3.6-35B-A3B", + "name": "Qwen3.6 35B-A3B", + "display_name": "Qwen3.6 35B-A3B", + "modalities": { + "input": [ + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 262144, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -295762,17 +292776,16 @@ ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-09-30", - "last_updated": "2025-09-30", + "release_date": "2026-04-17", + "last_updated": "2026-04-17", "type": "chat" }, { - "id": "glm-4.5-air", - "name": "GLM-4.5-Air", - "display_name": "GLM-4.5-Air", + "id": "Qwen/Qwen3-Reranker-4B", + "name": "Qwen3 Reranker 4B", + "display_name": "Qwen3 Reranker 4B", "modalities": { "input": [ "text" @@ -295782,37 +292795,23 @@ ] }, "limit": { - "context": 131072, - "output": 98304 + "context": 32000, + "output": 4096 }, - "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": false, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-07-28", - "last_updated": "2025-07-28", - "type": "chat" + "release_date": "2025-07-30", + "last_updated": "2025-07-30", + "type": "rerank" }, { - "id": "glm-5.3", - "name": "GLM-5.3", - "display_name": "GLM-5.3", + "id": "Qwen/Qwen3-Embedding-8B", + "name": "Qwen3 Embedding 8B", + "display_name": "Qwen3 Embedding 8B", "modalities": { "input": [ "text" @@ -295822,41 +292821,24 @@ ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 40960, + "output": 4096 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "low", - "high", - "max" - ] - } + "supported": false }, "attachment": false, "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", - "type": "chat" + "release_date": "2025-06-05", + "last_updated": "2025-06-05", + "type": "embedding" }, { - "id": "glm-4.6v", - "name": "GLM-4.6V", - "display_name": "GLM-4.6V", + "id": "Qwen/Qwen3.8-27B", + "name": "Qwen3.8-27B", + "display_name": "Qwen3.8-27B", "modalities": { "input": [ "text", @@ -295868,8 +292850,8 @@ ] }, "limit": { - "context": 128000, - "output": 32768 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, @@ -295879,24 +292861,21 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "low", + "medium", + "xhigh" ] } }, "attachment": true, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-12-08", - "last_updated": "2025-12-08", + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "glm-5.2", + "id": "zai-org/GLM-5.2", "name": "GLM-5.2", "display_name": "GLM-5.2", "modalities": { @@ -295908,7 +292887,7 @@ ] }, "limit": { - "context": 1000000, + "context": 524288, "output": 131072 }, "temperature": true, @@ -295920,12 +292899,6 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ "high", "max" @@ -295939,11 +292912,12 @@ "type": "chat" }, { - "id": "glm-4.7-flashx", - "name": "GLM-4.7-FlashX", - "display_name": "GLM-4.7-FlashX", + "id": "mistralai/Voxtral-Small-24B-2507", + "name": "Voxtral Small 24B", + "display_name": "Voxtral Small 24B", "modalities": { "input": [ + "audio", "text" ], "output": [ @@ -295951,51 +292925,34 @@ ] }, "limit": { - "context": 200000, - "output": 131072 + "context": 32000, + "output": 32000 }, - "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2026-01-19", - "last_updated": "2026-01-19", - "type": "chat" + "release_date": "2025-03-01", + "last_updated": "2025-03-01" }, { - "id": "glm-5.3-flashx", - "name": "GLM-5.3-FlashX", - "display_name": "GLM-5.3-FlashX", + "id": "mistralai/Mistral-Medium-3.5-128B", + "name": "Mistral Medium 3.5", + "display_name": "Mistral Medium 3.5", "modalities": { "input": [ "text", - "image", - "video", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, @@ -296005,30 +292962,22 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ - "low", - "high", - "max" + "none", + "high" ] } }, "attachment": true, "open_weights": true, - "release_date": "2026-09-18", - "last_updated": "2026-09-18", + "release_date": "2026-04-29", + "last_updated": "2026-04-29", "type": "chat" }, { - "id": "glm-4.5v", - "name": "GLM-4.5V", - "display_name": "GLM-4.5V", + "id": "evroc/roc", + "name": "roc", + "display_name": "roc", "modalities": { "input": [ "text", @@ -296040,8 +292989,8 @@ ] }, "limit": { - "context": 64000, - "output": 16384 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, @@ -296061,30 +293010,28 @@ } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-08-11", - "last_updated": "2025-08-11", + "open_weights": false, + "knowledge": "2026-01", + "release_date": "2026-06-06", + "last_updated": "2026-06-06", "type": "chat" }, { - "id": "glm-5.3-flash", - "name": "GLM-5.3-Flash", - "display_name": "GLM-5.3-Flash", + "id": "google/gemma-4-26B-A4B-it", + "name": "Gemma 4 26B A4B IT", + "display_name": "Gemma 4 26B A4B IT", "modalities": { "input": [ "text", - "image", - "video", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 262144, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -296094,30 +293041,28 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "low", - "high", - "max" - ] + "supported": true } }, "attachment": true, "open_weights": true, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" - }, + } + ] + }, + "drun": { + "id": "drun", + "name": "D.Run (China)", + "display_name": "D.Run (China)", + "api": "https://chat.d.run/v1", + "doc": "https://www.d.run", + "models": [ { - "id": "glm-4.7", - "name": "GLM-4.7", - "display_name": "GLM-4.7", + "id": "public/minimax-m25", + "name": "MiniMax M2.5", + "display_name": "MiniMax M2.5", "modalities": { "input": [ "text" @@ -296149,15 +293094,14 @@ }, "attachment": false, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-12-22", - "last_updated": "2025-12-22", + "release_date": "2026-02-12", + "last_updated": "2026-02-12", "type": "chat" }, { - "id": "glm-4.5", - "name": "GLM-4.5", - "display_name": "GLM-4.5", + "id": "public/deepseek-r1", + "name": "DeepSeek R1", + "display_name": "DeepSeek R1", "modalities": { "input": [ "text" @@ -296168,7 +293112,7 @@ }, "limit": { "context": 131072, - "output": 98304 + "output": 32000 }, "temperature": true, "tool_call": true, @@ -296189,15 +293133,15 @@ }, "attachment": false, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-07-28", - "last_updated": "2025-07-28", + "knowledge": "2024-12", + "release_date": "2025-01-20", + "last_updated": "2025-05-29", "type": "chat" }, { - "id": "glm-4.5-flash", - "name": "GLM-4.5-Flash", - "display_name": "GLM-4.5-Flash", + "id": "public/deepseek-v3", + "name": "DeepSeek V3", + "display_name": "DeepSeek V3", "modalities": { "input": [ "text" @@ -296208,89 +293152,47 @@ }, "limit": { "context": 131072, - "output": 98304 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, - "attachment": false, - "open_weights": false, - "knowledge": "2025-04", - "release_date": "2025-07-28", - "last_updated": "2025-07-28", - "type": "chat" - }, - { - "id": "glm-4.7-flash", - "name": "GLM-4.7-Flash", - "display_name": "GLM-4.7-Flash", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 200000, - "output": 131072 + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": false, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2026-01-19", - "last_updated": "2026-01-19", + "knowledge": "2024-07", + "release_date": "2024-12-26", + "last_updated": "2024-12-26", "type": "chat" - }, + } + ] + }, + "google": { + "id": "google", + "name": "google", + "display_name": "google", + "doc": "https://ai.google.dev/gemini-api/docs/models", + "models": [ { - "id": "glm-4.6v-flash", - "name": "GLM-4.6V-Flash", - "display_name": "GLM-4.6V-Flash", + "id": "gemini-3.1-pro-preview", + "name": "Gemini 3.1 Pro Preview", + "display_name": "Gemini 3.1 Pro Preview", "modalities": { "input": [ "text", "image", - "video" + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 32768 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -296301,36 +293203,37 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "low", + "high" + ], "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" + "thought_signatures" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2025-12-08", - "last_updated": "2025-12-08", + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2026-02-19", + "last_updated": "2026-02-19", "type": "chat" - } - ] - }, - "cloudflare-ai-gateway": { - "id": "cloudflare-ai-gateway", - "name": "Cloudflare AI Gateway", - "display_name": "Cloudflare AI Gateway", - "doc": "https://developers.cloudflare.com/ai-gateway/", - "models": [ + }, { - "id": "xai/grok-4.3", - "name": "Grok 4.3", - "display_name": "Grok 4.3", + "id": "gemini-3-flash-preview", + "name": "Gemini 3 Flash Preview", + "display_name": "Gemini 3 Flash Preview", "modalities": { "input": [ "text", "image", + "video", + "audio", "pdf" ], "output": [ @@ -296338,8 +293241,8 @@ ] }, "limit": { - "context": 1000000, - "output": 30000 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -296350,36 +293253,48 @@ "extra_capabilities": { "reasoning": { "supported": true, - "effort_options": [ - "none", + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", "low", "medium", "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-04-17", - "last_updated": "2026-04-17", + "knowledge": "2025-01", + "release_date": "2025-12-17", + "last_updated": "2025-12-17", "type": "chat" }, { - "id": "xai/grok-4.5", - "name": "Grok 4.5", - "display_name": "Grok 4.5", + "id": "gemini-3.1-pro-preview-customtools", + "name": "Gemini 3.1 Pro Preview Custom Tools", + "display_name": "Gemini 3.1 Pro Preview Custom Tools", "modalities": { "input": [ "text", - "image" + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 500000, - "output": 500000 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -296390,27 +293305,37 @@ "extra_capabilities": { "reasoning": { "supported": true, - "effort_options": [ + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ "low", - "medium", "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-07-08", - "last_updated": "2026-07-08", + "knowledge": "2025-01", + "release_date": "2026-02-19", + "last_updated": "2026-02-19", "type": "chat" }, { - "id": "xai/grok-4.20-0309-non-reasoning", - "name": "Grok 4.20 (Non-Reasoning)", - "display_name": "Grok 4.20 (Non-Reasoning)", + "id": "gemini-2.5-pro", + "name": "Gemini 2.5 Pro", + "display_name": "Gemini 2.5 Pro", "modalities": { "input": [ "text", "image", + "audio", + "video", "pdf" ], "output": [ @@ -296418,58 +293343,60 @@ ] }, "limit": { - "context": 2000000, - "output": 30000 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": false, - "release_date": "2026-03-09", - "last_updated": "2026-03-09", - "type": "chat" - }, - { - "id": "xai/grok-4.20-0309-reasoning", - "name": "Grok 4.20 (Reasoning)", - "display_name": "Grok 4.20 (Reasoning)", - "modalities": { - "input": [ - "text", - "image", - "pdf" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 2000000, - "output": 30000 + "supported": true, + "default": true, + "budget": { + "default": -1, + "min": 128, + "max": 32768 + } }, - "temperature": true, - "tool_call": true, - "reasoning": { + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "budget", + "budget": { + "default": -1, + "min": 128, + "max": 32768, + "auto": -1, + "unit": "tokens" + }, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] + } + }, + "search": { "supported": true, - "default": true + "default": false }, "attachment": true, "open_weights": false, - "release_date": "2026-03-09", - "last_updated": "2026-03-09", + "knowledge": "2025-01", + "release_date": "2025-06-17", + "last_updated": "2025-06-17", "type": "chat" }, { - "id": "xai/grok-4.7", - "name": "Grok 4.7", - "display_name": "Grok 4.7", + "id": "gemini-3.5-flash-lite", + "name": "Gemini 3.5 Flash Lite", + "display_name": "Gemini 3.5 Flash Lite", "modalities": { "input": [ "text", "image", + "video", + "audio", "pdf" ], "output": [ @@ -296477,8 +293404,8 @@ ] }, "limit": { - "context": 500000, - "output": 500000 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -296488,37 +293415,69 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ + "minimal", "low", "medium", - "high", - "xhigh" + "high" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-05", - "release_date": "2026-09-21", - "last_updated": "2026-09-21", + "knowledge": "2026-03", + "release_date": "2026-07-21", + "last_updated": "2026-07-21", "type": "chat" }, { - "id": "xai/grok-4.6", - "name": "Grok 4.6", - "display_name": "Grok 4.6", + "id": "gemini-embedding-001", + "name": "Gemini Embedding 001", + "display_name": "Gemini Embedding 001", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 2048, + "output": 1 + }, + "temperature": false, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": false, + "knowledge": "2025-05", + "release_date": "2025-05-20", + "last_updated": "2025-05-20", + "type": "embedding" + }, + { + "id": "gemini-flash-latest", + "name": "Gemini Flash Latest", + "display_name": "Gemini Flash Latest", "modalities": { "input": [ "text", - "image" + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 500000, - "output": 500000 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -296528,7 +293487,6 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ "low", "medium", @@ -296538,64 +293496,51 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2026-02-01", - "release_date": "2026-08-12", - "last_updated": "2026-08-12", + "knowledge": "2026-03", + "release_date": "2026-08-13", + "last_updated": "2026-08-13", "type": "chat" }, { - "id": "meta/muse-spark-open", - "name": "Muse Spark Open", - "display_name": "Muse Spark Open", + "id": "lyria-3-pro-preview", + "name": "Lyria 3 Pro Preview", + "display_name": "Lyria 3 Pro Preview", "modalities": { "input": [ "text", - "image", - "video", - "audio" + "image" ], "output": [ - "text" + "text", + "audio" ] }, "limit": { - "context": 1040000, - "output": 131072 + "context": 1048576, + "output": 65536 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ] - } + "supported": false }, "attachment": true, - "open_weights": true, - "knowledge": "2026-01-04", - "release_date": "2026-10-15", - "last_updated": "2026-10-15", + "open_weights": false, + "release_date": "2026-03-25", + "last_updated": "2026-03-25", "type": "chat" }, { - "id": "meta/muse-spark-1.3", - "name": "Muse Spark 1.3", - "display_name": "Muse Spark 1.3", + "id": "gemini-pro-latest", + "name": "Gemini Pro Latest", + "display_name": "Gemini Pro Latest", "modalities": { "input": [ "text", "image", "video", - "pdf", - "audio" + "audio", + "pdf" ], "output": [ "text" @@ -296603,7 +293548,7 @@ }, "limit": { "context": 1048576, - "output": 131072 + "output": 65536 }, "temperature": true, "tool_call": true, @@ -296613,78 +293558,86 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ - "minimal", "low", "medium", - "high", - "xhigh", - "max" + "high" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-09-02", - "last_updated": "2026-09-02", + "knowledge": "2025-01", + "release_date": "2026-02-19", + "last_updated": "2026-02-19", "type": "chat" }, { - "id": "meta/muse-wonder-1.0", - "name": "Muse Wonder", - "display_name": "Muse Wonder", + "id": "gemini-3.1-flash-tts-preview", + "name": "Gemini 3.1 Flash TTS Preview", + "display_name": "Gemini 3.1 Flash TTS Preview", "modalities": { "input": [ - "text", - "image", - "video", - "pdf", - "audio" + "text" ], "output": [ - "text" + "audio" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 8192, + "output": 16384 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "minimal", - "low", - "medium", - "high", - "xhigh", - "max" - ] - } + "attachment": false, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2026-04-15", + "last_updated": "2026-04-15" + }, + { + "id": "gemini-2.5-flash-preview-tts", + "name": "Gemini 2.5 Flash Preview TTS", + "display_name": "Gemini 2.5 Flash Preview TTS", + "modalities": { + "input": [ + "text" + ], + "output": [ + "audio" + ] }, - "attachment": true, + "limit": { + "context": 8192, + "output": 16384 + }, + "temperature": true, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, "open_weights": false, - "release_date": "2026-10-12", - "last_updated": "2026-10-12", - "type": "chat" + "knowledge": "2025-01", + "release_date": "2025-05-01", + "last_updated": "2025-05-01" }, { - "id": "meta/muse-spark-1.2", - "name": "Muse Spark 1.2", - "display_name": "Muse Spark 1.2", + "id": "gemini-3.1-flash-lite-preview", + "name": "Gemini 3.1 Flash Lite Preview", + "display_name": "Gemini 3.1 Flash Lite Preview", "modalities": { "input": [ "text", "image", "video", - "pdf", - "audio" + "audio", + "pdf" ], "output": [ "text" @@ -296692,7 +293645,7 @@ }, "limit": { "context": 1048576, - "output": 131072 + "output": 65536 }, "temperature": true, "tool_call": true, @@ -296702,32 +293655,32 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ "minimal", "low", "medium", - "high", - "xhigh" + "high" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-08-05", - "last_updated": "2026-08-05", + "knowledge": "2025-01", + "release_date": "2026-03-03", + "last_updated": "2026-03-03", "type": "chat" }, { - "id": "meta/muse-spark-1.1", - "name": "Muse Spark 1.1", - "display_name": "Muse Spark 1.1", + "id": "gemini-3.1-flash-lite", + "name": "Gemini 3.1 Flash Lite", + "display_name": "Gemini 3.1 Flash Lite", "modalities": { "input": [ "text", "image", - "pdf", - "video" + "video", + "audio", + "pdf" ], "output": [ "text" @@ -296735,7 +293688,7 @@ }, "limit": { "context": 1048576, - "output": 131072 + "output": 65536 }, "temperature": true, "tool_call": true, @@ -296750,36 +293703,35 @@ "minimal", "low", "medium", - "high", - "xhigh" + "high" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-04-08", - "last_updated": "2026-07-09", + "knowledge": "2025-01", + "release_date": "2026-05-07", + "last_updated": "2026-05-07", "type": "chat" }, { - "id": "fireworks/ember-1", - "name": "Ember-1", - "display_name": "Ember-1", + "id": "gemini-2.5-pro-preview-tts", + "name": "Gemini 2.5 Pro Preview TTS", + "display_name": "Gemini 2.5 Pro Preview TTS", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ - "text" + "audio" ] }, "limit": { - "context": 1040000, - "output": 131072 + "context": 8192, + "output": 16384 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true @@ -296787,30 +293739,32 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": true, + "mode": "budget", + "budget": { + "default": -1, + "min": 128, + "max": 32768, + "auto": -1, + "unit": "tokens" + }, "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "none", - "low", - "high", - "max" + "thought_signatures" ] } }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2026-09-22", - "last_updated": "2026-09-22", - "type": "chat" + "knowledge": "2025-01", + "release_date": "2025-05-01", + "last_updated": "2025-05-01" }, { - "id": "google/gemini-4-argon", - "name": "Gemini 4 Argon", - "display_name": "Gemini 4 Argon", + "id": "gemini-flash-lite-latest", + "name": "Gemini Flash-Lite Latest", + "display_name": "Gemini Flash-Lite Latest", "modalities": { "input": [ "text", @@ -296827,7 +293781,7 @@ "context": 1048576, "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -296836,6 +293790,7 @@ "extra_capabilities": { "reasoning": { "effort_options": [ + "minimal", "low", "medium", "high" @@ -296845,14 +293800,14 @@ "attachment": true, "open_weights": false, "knowledge": "2026-03", - "release_date": "2026-10-13", - "last_updated": "2026-10-13", + "release_date": "2026-07-21", + "last_updated": "2026-07-21", "type": "chat" }, { - "id": "google/gemini-2.5-pro", - "name": "Gemini 2.5 Pro", - "display_name": "Gemini 2.5 Pro", + "id": "gemini-embedding-2", + "name": "Gemini Embedding 2", + "display_name": "Gemini Embedding 2", "modalities": { "input": [ "text", @@ -296866,45 +293821,25 @@ ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 8192, + "output": 1 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "budget", - "budget": { - "default": -1, - "min": 128, - "max": 32768, - "auto": -1, - "unit": "tokens" - }, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] - } + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-06-17", - "last_updated": "2025-06-17", - "type": "chat" + "knowledge": "2025-11", + "release_date": "2026-04-22", + "last_updated": "2026-04-22", + "type": "embedding" }, { - "id": "google/gemini-3.5-flash", - "name": "Gemini 3.5 Flash", - "display_name": "Gemini 3.5 Flash", + "id": "deep-research-max-preview-04-2026", + "name": "Deep Research Max Preview (Apr-21-2026)", + "display_name": "Deep Research Max Preview (Apr-21-2026)", "modalities": { "input": [ "text", @@ -296914,11 +293849,12 @@ "pdf" ], "output": [ - "text" + "text", + "image" ] }, "limit": { - "context": 1048576, + "context": 131072, "output": 65536 }, "temperature": true, @@ -296927,51 +293863,29 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", - "low", - "medium", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] - } - }, "attachment": true, "open_weights": false, "knowledge": "2025-01", - "release_date": "2026-05-19", - "last_updated": "2026-05-19", + "release_date": "2026-04-21", + "last_updated": "2026-04-21", "type": "chat" }, { - "id": "google/gemini-3.5-flash-lite", - "name": "Gemini 3.5 Flash Lite", - "display_name": "Gemini 3.5 Flash Lite", + "id": "gemini-2.5-computer-use-preview-10-2025", + "name": "Gemini 2.5 Computer Use Preview 10-2025", + "display_name": "Gemini 2.5 Computer Use Preview 10-2025", "modalities": { "input": [ "text", - "image", - "video", - "audio", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 128000, + "output": 64000 }, "temperature": true, "tool_call": true, @@ -296979,46 +293893,35 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "minimal", - "low", - "medium", - "high" - ] - } - }, "attachment": true, "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-07-21", - "last_updated": "2026-07-21", + "knowledge": "2025-01", + "release_date": "2025-10-07", + "last_updated": "2025-10-07", "type": "chat" }, { - "id": "google/gemini-2.5-flash", - "name": "Gemini 2.5 Flash", - "display_name": "Gemini 2.5 Flash", + "id": "gemini-3.1-flash-image", + "name": "Nano Banana 2", + "display_name": "Nano Banana 2", "modalities": { "input": [ "text", "image", - "audio", "video", "pdf" ], "output": [ - "text" + "text", + "image" ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 131072, + "output": 32768 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true @@ -297026,48 +293929,36 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "budget", - "budget": { - "default": -1, - "min": 0, - "max": 24576, - "auto": -1, - "off": 0, - "unit": "tokens" - }, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" + "effort_options": [ + "minimal", + "high" ] } }, "attachment": true, "open_weights": false, "knowledge": "2025-01", - "release_date": "2025-06-17", - "last_updated": "2025-06-17", - "type": "chat" + "release_date": "2026-05-28", + "last_updated": "2026-05-28" }, { - "id": "google/gemini-3.8-flash", - "name": "Gemini 3.8 Flash", - "display_name": "Gemini 3.8 Flash", + "id": "gemini-3.1-flash-live-preview", + "name": "Gemini 3.1 Flash Live Preview", + "display_name": "Gemini 3.1 Flash Live Preview", "modalities": { "input": [ "text", "image", "video", - "audio", - "pdf" + "audio" ], "output": [ - "text" + "text", + "audio" ] }, "limit": { - "context": 1048576, + "context": 131072, "output": 65536 }, "temperature": true, @@ -297097,66 +293988,43 @@ }, "attachment": true, "open_weights": false, - "release_date": "2026-09-02", - "last_updated": "2026-09-02", - "type": "chat" + "knowledge": "2025-01", + "release_date": "2026-03-26", + "last_updated": "2026-03-26" }, { - "id": "google/gemini-3.7-flash", - "name": "Gemini 3.7 Flash", - "display_name": "Gemini 3.7 Flash", + "id": "gemini-omni-flash-preview", + "name": "Gemini Omni Flash Preview", + "display_name": "Gemini Omni Flash Preview", "modalities": { "input": [ "text", "image", - "video", - "audio", - "pdf" + "video" ], "output": [ - "text" + "video" ] }, "limit": { - "context": 1048576, + "context": 131072, "output": 65536 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", - "low", - "medium", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] - } - }, "attachment": true, "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-08-13", - "last_updated": "2026-08-13", - "type": "chat" + "release_date": "2026-06-30", + "last_updated": "2026-06-30" }, { - "id": "google/gemini-2.5-flash-lite", - "name": "Gemini 2.5 Flash-Lite", - "display_name": "Gemini 2.5 Flash-Lite", + "id": "gemini-2.5-flash", + "name": "Gemini 2.5 Flash", + "display_name": "Gemini 2.5 Flash", "modalities": { "input": [ "text", @@ -297170,25 +294038,31 @@ ] }, "limit": { - "context": 1000000, + "context": 1048576, "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true, + "budget": { + "default": -1, + "min": 0, + "max": 24576 + } }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, + "default_enabled": true, "mode": "budget", "budget": { "default": -1, - "min": 512, + "min": 0, "max": 24576, "auto": -1, + "off": 0, "unit": "tokens" }, "summaries": true, @@ -297198,6 +294072,10 @@ ] } }, + "search": { + "supported": true, + "default": false + }, "attachment": true, "open_weights": false, "knowledge": "2025-01", @@ -297206,59 +294084,37 @@ "type": "chat" }, { - "id": "google/gemini-3.1-pro", - "name": "Gemini 3.1 Pro Preview", - "display_name": "Gemini 3.1 Pro Preview", + "id": "gemini-3.5-live-translate-preview", + "name": "Gemini 3.5 Live Translate Preview", + "display_name": "Gemini 3.5 Live Translate Preview", "modalities": { "input": [ - "text", - "image", - "video", - "audio", - "pdf" + "audio" ], "output": [ + "audio", "text" ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 16384, + "output": 32768 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "low", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] - } + "supported": false }, "attachment": true, "open_weights": false, "knowledge": "2025-01", - "release_date": "2026-02-19", - "last_updated": "2026-02-19", - "type": "chat" + "release_date": "2026-06-09", + "last_updated": "2026-06-09" }, { - "id": "google/gemini-3.6-flash", - "name": "Gemini 3.6 Flash", - "display_name": "Gemini 3.6 Flash", + "id": "deep-research-preview-04-2026", + "name": "Deep Research Preview (Apr-21-2026)", + "display_name": "Deep Research Preview (Apr-21-2026)", "modalities": { "input": [ "text", @@ -297268,11 +294124,12 @@ "pdf" ], "output": [ - "text" + "text", + "image" ] }, "limit": { - "context": 1048576, + "context": 131072, "output": 65536 }, "temperature": true, @@ -297281,54 +294138,33 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", - "low", - "medium", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] - } - }, "attachment": true, "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-07-21", - "last_updated": "2026-07-21", + "knowledge": "2025-01", + "release_date": "2026-04-21", + "last_updated": "2026-04-21", "type": "chat" }, { - "id": "google/gemini-3-flash", - "name": "Gemini 3 Flash Preview", - "display_name": "Gemini 3 Flash Preview", + "id": "gemini-3-pro-image", + "name": "Nano Banana Pro", + "display_name": "Nano Banana Pro", "modalities": { "input": [ "text", - "image", - "video", - "audio", - "pdf" + "image" ], "output": [ - "text" + "text", + "image" ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 65536, + "output": 32768 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true @@ -297340,9 +294176,7 @@ "mode": "level", "level": "high", "level_options": [ - "minimal", "low", - "medium", "high" ], "summaries": true, @@ -297355,29 +294189,25 @@ "attachment": true, "open_weights": false, "knowledge": "2025-01", - "release_date": "2025-12-17", - "last_updated": "2025-12-17", - "type": "chat" + "release_date": "2026-05-28", + "last_updated": "2026-05-28" }, { - "id": "google/gemini-3.1-flash-lite", - "name": "Gemini 3.1 Flash Lite", - "display_name": "Gemini 3.1 Flash Lite", + "id": "gemma-4-26b-a4b-it", + "name": "Gemma 4 26B A4B IT", + "display_name": "Gemma 4 26B A4B IT", "modalities": { "input": [ "text", - "image", - "video", - "audio", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 262144, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -297387,39 +294217,31 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "effort_options": [ - "minimal", - "low", - "medium", - "high" - ] + "supported": true } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-05-07", - "last_updated": "2026-05-07", + "open_weights": true, + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "minimax/m3.1-flash", - "name": "MiniMax-M3.1-Flash", - "display_name": "MiniMax-M3.1-Flash", + "id": "gemma-4-31b-it", + "name": "Gemma 4 31B IT", + "display_name": "Gemma 4 31B IT", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 512000 + "context": 262144, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -297429,40 +294251,34 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ] + "supported": true } }, "attachment": true, - "open_weights": false, - "release_date": "2026-10-19", - "last_updated": "2026-10-19", + "open_weights": true, + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "moonshotai/kimi-k3", - "name": "Kimi K3", - "display_name": "Kimi K3", + "id": "gemini-3.1-flash-lite-image", + "name": "Nano Banana 2 Lite", + "display_name": "Nano Banana 2 Lite", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ - "text" + "text", + "image" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 65536, + "output": 4096 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -297472,66 +294288,67 @@ "reasoning": { "supported": true, "effort_options": [ - "none", - "low", - "high", - "max" + "minimal", + "high" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-16", - "type": "chat" + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2026-06-30", + "last_updated": "2026-06-30" }, { - "id": "unbiased/pareto", - "name": "Pareto", - "display_name": "Pareto", + "id": "gemini-2.5-flash-image", + "name": "Gemini 2.5 Flash Image", + "display_name": "Gemini 2.5 Flash Image", "modalities": { "input": [ "text", "image" ], "output": [ - "text" + "text", + "image" ] }, "limit": { - "context": 262144, - "output": 131072 + "context": 32768, + "output": 32768 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2026-09-17", - "last_updated": "2026-09-17", - "type": "chat" + "knowledge": "2024-06", + "release_date": "2025-08-26", + "last_updated": "2025-08-26" }, { - "id": "alibaba/qwen3.5-397b-a17b", - "name": "Qwen3.5 397B-A17B", - "display_name": "Qwen3.5 397B-A17B", + "id": "gemini-4-argon", + "name": "Gemini 4 Argon", + "display_name": "Gemini 4 Argon", "modalities": { "input": [ "text", "image", - "video" + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 1048576, + "output": 32768 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -297539,38 +294356,39 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "low", + "medium", + "high" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-02-15", - "last_updated": "2026-02-15", + "open_weights": false, + "knowledge": "2026-03", + "release_date": "2026-10-13", + "last_updated": "2026-10-13", "type": "chat" }, { - "id": "alibaba/qwen3.7-plus", - "name": "Qwen3.7 Plus", - "display_name": "Qwen3.7 Plus", + "id": "gemini-3.7-flash", + "name": "Gemini 3.7 Flash", + "display_name": "Gemini 3.7 Flash", "modalities": { "input": [ "text", "image", - "video" + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 64000 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -297580,24 +294398,39 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", + "low", + "medium", + "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-04", - "release_date": "2026-06-02", - "last_updated": "2026-06-02", + "knowledge": "2026-03", + "release_date": "2026-08-13", + "last_updated": "2026-08-13", "type": "chat" }, { - "id": "alibaba/qwen3.8-max", - "name": "Qwen3.8 Max", - "display_name": "Qwen3.8 Max", + "id": "gemini-2.5-flash-lite", + "name": "Gemini 2.5 Flash Lite", + "display_name": "Gemini 2.5 Flash Lite", "modalities": { "input": [ "text", "image", + "audio", "video", "pdf" ], @@ -297606,169 +294439,141 @@ ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false, + "budget": { + "default": -1, + "min": 512, + "max": 24576 + } }, "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "default": -1, + "min": 512, + "max": 24576, + "auto": -1, + "unit": "tokens" + }, "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "low", - "medium", - "xhigh" + "thought_signatures" ] } }, + "search": { + "supported": true, + "default": false + }, "attachment": true, "open_weights": false, - "release_date": "2026-08-03", - "last_updated": "2026-08-03", + "knowledge": "2025-01", + "release_date": "2025-06-17", + "last_updated": "2025-06-17", "type": "chat" }, { - "id": "alibaba/qwen3-max", - "name": "Qwen3 Max", - "display_name": "Qwen3 Max", + "id": "gemini-3.5-flash", + "name": "Gemini 3.5 Flash", + "display_name": "Gemini 3.5 Flash", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, + "context": 1048576, "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", + "low", + "medium", + "high" + ], "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" + "thought_signatures" ] } }, - "attachment": false, - "open_weights": false, - "knowledge": "2025-04", - "release_date": "2025-09-23", - "last_updated": "2025-09-23", - "type": "chat" - }, - { - "id": "alibaba/qwen3.7-max", - "name": "Qwen3.7 Max", - "display_name": "Qwen3.7 Max", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 1000000, - "output": 131072 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-05-21", - "last_updated": "2026-05-21", + "knowledge": "2025-01", + "release_date": "2026-05-19", + "last_updated": "2026-05-19", "type": "chat" }, { - "id": "openai/gpt-5.4-mini", - "name": "GPT-5.4 mini", - "display_name": "GPT-5.4 mini", + "id": "lyria-3-clip-preview", + "name": "Lyria 3 Clip Preview", + "display_name": "Lyria 3 Clip Preview", "modalities": { "input": [ "text", "image" ], "output": [ - "text" + "text", + "audio" ] }, "limit": { - "context": 128000, - "output": 128000 + "context": 1048576, + "output": 65536 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-17", - "last_updated": "2026-03-17", + "release_date": "2026-03-25", + "last_updated": "2026-03-25", "type": "chat" }, { - "id": "openai/gpt-5.6-sol", - "name": "GPT-5.6 Sol", - "display_name": "GPT-5.6 Sol", + "id": "gemini-3.8-flash", + "name": "Gemini 3.8 Flash", + "display_name": "Gemini 3.8 Flash", "modalities": { "input": [ "text", "image", + "video", + "audio", "pdf" ], "output": [ @@ -297776,10 +294581,10 @@ ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1048576, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -297789,40 +294594,37 @@ "reasoning": { "supported": true, "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ], - "verbosity": "medium", - "verbosity_options": [ + "mode": "level", + "level": "high", + "level_options": [ + "minimal", "low", "medium", "high" ], - "visibility": "hidden" + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "release_date": "2026-09-02", + "last_updated": "2026-09-02", "type": "chat" }, { - "id": "openai/gpt-5.5-pro", - "name": "GPT-5.5 Pro", - "display_name": "GPT-5.5 Pro", + "id": "gemini-3.6-flash", + "name": "Gemini 3.6 Flash", + "display_name": "Gemini 3.6 Flash", "modalities": { "input": [ "text", "image", + "video", + "audio", "pdf" ], "output": [ @@ -297830,10 +294632,10 @@ ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 1048576, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -297842,24 +294644,33 @@ "extra_capabilities": { "reasoning": { "supported": true, - "effort_options": [ + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", + "low", "medium", - "high", - "xhigh" + "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-12-01", - "release_date": "2026-04-23", - "last_updated": "2026-04-23", + "knowledge": "2026-03", + "release_date": "2026-07-21", + "last_updated": "2026-07-21", "type": "chat" }, { - "id": "openai/gpt-5-nano", - "name": "GPT-5 Nano", - "display_name": "GPT-5 Nano", + "id": "gemini-2.5-flash-preview-09-2025", + "name": "Gemini 2.5 Flash Preview 09 2025", + "display_name": "Gemini 2.5 Flash Preview 09 2025", "modalities": { "input": [ "text", @@ -297870,77 +294681,77 @@ ] }, "limit": { - "context": 128000, - "output": 128000 + "context": 1048576, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": true, + "budget": { + "default": -1, + "min": 0, + "max": 24576 + } }, "extra_capabilities": { "reasoning": { "supported": true, "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "minimal", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "mode": "budget", + "budget": { + "default": -1, + "min": 0, + "max": 24576, + "auto": -1, + "off": 0, + "unit": "tokens" + }, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] } }, + "search": { + "supported": true, + "default": false + }, "attachment": true, - "open_weights": false, - "knowledge": "2024-05-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", "type": "chat" }, { - "id": "openai/gpt-4o", - "name": "GPT-4o", - "display_name": "GPT-4o", + "id": "gemini-2.5-flash-image-preview", + "name": "Gemini 2.5 Flash Image Preview", + "display_name": "Gemini 2.5 Flash Image Preview", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ - "text" + "text", + "image" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 32768, + "output": 32768 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2023-09", - "release_date": "2024-05-13", - "last_updated": "2024-08-06", - "type": "chat" + "attachment": false, + "type": "imageGeneration" }, { - "id": "openai/gpt-5.4-nano", - "name": "GPT-5.4 nano", - "display_name": "GPT-5.4 nano", + "id": "gemini-2.5-flash-lite-preview-09-2025", + "name": "Gemini 2.5 Flash Lite Preview 09 2025", + "display_name": "Gemini 2.5 Flash Lite Preview 09 2025", "modalities": { "input": [ "text", @@ -297951,259 +294762,189 @@ ] }, "limit": { - "context": 128000, - "output": 128000 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": false, + "budget": { + "default": -1, + "min": 512, + "max": 24576 + } }, "extra_capabilities": { "reasoning": { "supported": true, "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "mode": "budget", + "budget": { + "default": -1, + "min": 512, + "max": 24576, + "auto": -1, + "unit": "tokens" + }, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] } }, + "search": { + "supported": true, + "default": false + }, "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-17", - "last_updated": "2026-03-17", "type": "chat" }, { - "id": "openai/gpt-5.6-luna", - "name": "GPT-5.6 Luna", - "display_name": "GPT-5.6 Luna", + "id": "gemini-2.0-flash", + "name": "Gemini 2.0 Flash", + "display_name": "Gemini 2.0 Flash", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1048576, + "output": 8192 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "search": { + "supported": true, + "default": false }, "attachment": true, - "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", "type": "chat" }, { - "id": "openai/o3-mini", - "name": "o3-mini", - "display_name": "o3-mini", + "id": "gemini-2.0-flash-preview-image-generation", + "name": "Gemini 2.0 Flash Preview Image Generation", + "display_name": "Gemini 2.0 Flash Preview Image Generation", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ - "text" + "text", + "image" ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 32000, + "output": 8192 }, - "temperature": false, - "tool_call": true, + "temperature": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "search": { + "supported": false }, - "attachment": false, - "open_weights": false, - "knowledge": "2024-05", - "release_date": "2024-12-20", - "last_updated": "2025-01-29", + "attachment": true, "type": "chat" }, { - "id": "openai/gpt-5.6-terra", - "name": "GPT-5.6 Terra", - "display_name": "GPT-5.6 Terra", + "id": "gemini-2.0-flash-lite", + "name": "Gemini 2.0 Flash Lite", + "display_name": "Gemini 2.0 Flash Lite", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1048576, + "output": 8192 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "search": { + "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", "type": "chat" - }, + } + ] + }, + "siliconflow-com": { + "id": "siliconflow-com", + "name": "SiliconFlow", + "display_name": "SiliconFlow", + "api": "https://api.siliconflow.com/v1", + "doc": "https://cloud.siliconflow.com/models", + "models": [ { - "id": "openai/o3", - "name": "o3", - "display_name": "o3", + "id": "stepfun-ai/Step-3.5-Flash", + "name": "stepfun-ai/Step-3.5-Flash", + "display_name": "stepfun-ai/Step-3.5-Flash", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 262000, + "output": 66000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } - }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-05", - "release_date": "2025-04-16", - "last_updated": "2025-04-16", + "attachment": false, + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-01-29", + "last_updated": "2026-02-13", "type": "chat" }, { - "id": "openai/gpt-6-sol", - "name": "GPT-6 Sol", - "display_name": "GPT-6 Sol", + "id": "moonshotai/Kimi-K2.6", + "name": "moonshotai/Kimi-K2.6", + "display_name": "moonshotai/Kimi-K2.6", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 262000, + "output": 99560 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -298211,40 +294952,38 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-04-20", - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-04-20", + "last_updated": "2026-04-20", "type": "chat" }, { - "id": "openai/gpt-6.1-sol", - "name": "GPT-6.1 Sol", - "display_name": "GPT-6.1 Sol", + "id": "moonshotai/Kimi-K2.7-Code", + "name": "Kimi K2.7 Code", + "display_name": "Kimi K2.7 Code", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 262144, + "output": 99615 }, "temperature": false, "tool_call": true, @@ -298254,80 +294993,66 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-04-30", - "release_date": "2026-09-29", - "last_updated": "2026-09-29", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-06-12", + "last_updated": "2026-06-12", "type": "chat" }, { - "id": "openai/gpt-5.4", - "name": "GPT-5.4", - "display_name": "GPT-5.4", + "id": "moonshotai/Kimi-K3", + "name": "Kimi K3", + "display_name": "Kimi K3", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 1048576, + "output": 262000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-05", - "last_updated": "2026-03-05", + "open_weights": true, + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" }, { - "id": "openai/gpt-5.1", - "name": "GPT-5.1", - "display_name": "GPT-5.1", + "id": "moonshotai/Kimi-K2.5", + "name": "moonshotai/Kimi-K2.5", + "display_name": "moonshotai/Kimi-K2.5", "modalities": { "input": [ "text", @@ -298338,133 +295063,118 @@ ] }, "limit": { - "context": 128000, - "output": 128000 + "context": 262000, + "output": 99560 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-11-13", - "last_updated": "2025-11-13", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-01-27", + "last_updated": "2026-01-27", "type": "chat" }, { - "id": "openai/gpt-4.1-mini", - "name": "GPT-4.1 mini", - "display_name": "GPT-4.1 mini", + "id": "openai/gpt-oss-20b", + "name": "openai/gpt-oss-20b", + "display_name": "openai/gpt-oss-20b", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1047576, - "output": 32768 + "context": 131000, + "output": 8000 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": false + "supported": true }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-04-14", - "last_updated": "2025-04-14", + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": false, + "open_weights": true, + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "openai/gpt-6-astra", - "name": "GPT-6 Astra", - "display_name": "GPT-6 Astra", + "id": "openai/gpt-oss-120b", + "name": "openai/gpt-oss-120b", + "display_name": "openai/gpt-oss-120b", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 131000, + "output": 8000 }, - "temperature": false, - "tool_call": true, + "temperature": true, + "tool_call": false, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "effort_options": [ - "low", - "medium", - "high" - ] + "supported": true } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-04-30", - "release_date": "2026-09-04", - "last_updated": "2026-09-04", + "attachment": false, + "open_weights": true, + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "openai/gpt-5.5", - "name": "GPT-5.5", - "display_name": "GPT-5.5", + "id": "nex-agi/Nex-N2-Pro", + "name": "Nex-N2-Pro", + "display_name": "Nex-N2-Pro", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 262144, + "output": 256000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -298473,65 +295183,56 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-12-01", - "release_date": "2026-04-23", - "last_updated": "2026-04-23", + "open_weights": true, + "release_date": "2026-06-02", + "last_updated": "2026-06-02", "type": "chat" }, { - "id": "openai/gpt-4o-mini", - "name": "GPT-4o mini", - "display_name": "GPT-4o mini", + "id": "MiniMaxAI/MiniMax-M2.5", + "name": "MiniMaxAI/MiniMax-M2.5", + "display_name": "MiniMaxAI/MiniMax-M2.5", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 197000, + "output": 131000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true }, - "attachment": true, - "open_weights": false, - "knowledge": "2023-09", - "release_date": "2024-07-18", - "last_updated": "2024-07-18", + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": false, + "open_weights": true, + "release_date": "2026-02-12", + "last_updated": "2026-02-12", "type": "chat" }, { - "id": "openai/gpt-5-mini", - "name": "GPT-5 Mini", - "display_name": "GPT-5 Mini", + "id": "MiniMaxAI/MiniMax-M3", + "name": "MiniMax-M3", + "display_name": "MiniMax-M3", "modalities": { "input": [ "text", @@ -298542,10 +295243,10 @@ ] }, "limit": { - "context": 128000, - "output": 128000 + "context": 1048576, + "output": 131000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -298554,35 +295255,24 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "minimal", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2024-05-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "open_weights": true, + "release_date": "2026-06-01", + "last_updated": "2026-06-01", "type": "chat" }, { - "id": "openai/gpt-5", - "name": "GPT-5", - "display_name": "GPT-5", + "id": "Qwen/Qwen3.5-122B-A10B", + "name": "Qwen3.5 122B-A10B", + "display_name": "Qwen3.5 122B-A10B", "modalities": { "input": [ "text", @@ -298593,163 +295283,142 @@ ] }, "limit": { - "context": 128000, - "output": 128000 + "context": 262144, + "output": 32768 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "minimal", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "open_weights": true, + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" }, { - "id": "openai/gpt-6-luna", - "name": "GPT-6 Luna", - "display_name": "GPT-6 Luna", + "id": "Qwen/Qwen3.6-35B-A3B", + "name": "Qwen3.6 35B-A3B", + "display_name": "Qwen3.6 35B-A3B", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 262144, + "output": 32768 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": true }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-05-18", - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "open_weights": true, + "release_date": "2026-04-17", + "last_updated": "2026-04-17", "type": "chat" }, { - "id": "openai/gpt-4.1", - "name": "GPT-4.1", - "display_name": "GPT-4.1", + "id": "Qwen/Qwen2.5-7B-Instruct", + "name": "Qwen/Qwen2.5-7B-Instruct", + "display_name": "Qwen/Qwen2.5-7B-Instruct", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1047576, - "output": 32768 + "context": 33000, + "output": 4000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-04-14", - "last_updated": "2025-04-14", + "attachment": false, + "open_weights": true, + "release_date": "2024-09-19", + "last_updated": "2024-09-19", "type": "chat" }, { - "id": "openai/gpt-4.1-nano", - "name": "GPT-4.1 nano", - "display_name": "GPT-4.1 nano", + "id": "Qwen/Qwen3-Coder-480B-A35B-Instruct", + "name": "Qwen/Qwen3-Coder-480B-A35B-Instruct", + "display_name": "Qwen/Qwen3-Coder-480B-A35B-Instruct", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 32768 + "context": 262000, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-04-14", - "last_updated": "2025-04-14", + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-07-22", + "last_updated": "2025-07-22", "type": "chat" }, { - "id": "openai/o4-mini", - "name": "o4-mini", - "display_name": "o4-mini", + "id": "Qwen/Qwen3-14B", + "name": "Qwen/Qwen3-14B", + "display_name": "Qwen/Qwen3-14B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 131000, + "output": 32768 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -298758,28 +295427,24 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-05", - "release_date": "2025-04-16", - "last_updated": "2025-04-16", + "attachment": false, + "open_weights": true, + "release_date": "2025-04-30", + "last_updated": "2025-11-25", "type": "chat" }, { - "id": "openai/gpt-5.4-pro", - "name": "GPT-5.4 Pro", - "display_name": "GPT-5.4 Pro", + "id": "Qwen/Qwen3.5-9B", + "name": "Qwen/Qwen3.5-9B", + "display_name": "Qwen/Qwen3.5-9B", "modalities": { "input": [ "text", @@ -298790,46 +295455,35 @@ ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 262144, + "output": 32768 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-05", - "last_updated": "2026-03-05", + "open_weights": true, + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" }, { - "id": "deepseek/deepseek-v4-pro", - "name": "DeepSeek V4 Pro", - "display_name": "DeepSeek V4 Pro", + "id": "Qwen/Qwen3-Coder-30B-A3B-Instruct", + "name": "Qwen/Qwen3-Coder-30B-A3B-Instruct", + "display_name": "Qwen/Qwen3-Coder-30B-A3B-Instruct", "modalities": { "input": [ "text" @@ -298839,472 +295493,373 @@ ] }, "limit": { - "context": 131072, - "output": 384000 + "context": 262000, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." - ] - } + "supported": false }, "attachment": false, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "knowledge": "2025-04", + "release_date": "2025-07-31", + "last_updated": "2025-07-31", "type": "chat" }, { - "id": "anthropic/claude-haiku-5.5", - "name": "Claude Haiku 5.5", - "display_name": "Claude Haiku 5.5", + "id": "Qwen/Qwen3-VL-32B-Instruct", + "name": "Qwen/Qwen3-VL-32B-Instruct", + "display_name": "Qwen/Qwen3-VL-32B-Instruct", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 262000, + "output": 32768 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ] - } + "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-10-07", - "last_updated": "2026-10-07", + "open_weights": true, + "release_date": "2025-10-21", + "last_updated": "2025-11-25", "type": "chat" }, { - "id": "anthropic/claude-opus-4.7", - "name": "Claude Opus 4.7", - "display_name": "Claude Opus 4.7", + "id": "Qwen/Qwen3.5-397B-A17B", + "name": "Qwen3.5 397B-A17B", + "display_name": "Qwen3.5 397B-A17B", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 262144, + "output": 32768 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], + "supported": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, "interleaved": true, "summaries": true, - "visibility": "omitted", + "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-04-16", - "last_updated": "2026-04-16", + "attachment": false, + "open_weights": true, + "release_date": "2026-02-15", + "last_updated": "2026-02-15", "type": "chat" }, { - "id": "anthropic/claude-opus-4.6", - "name": "Claude Opus 4.6", - "display_name": "Claude Opus 4.6", + "id": "Qwen/Qwen3-VL-30B-A3B-Thinking", + "name": "Qwen/Qwen3-VL-30B-A3B-Thinking", + "display_name": "Qwen/Qwen3-VL-30B-A3B-Thinking", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 262000, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "max" - ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-05-31", - "release_date": "2026-02-05", - "last_updated": "2026-03-13", + "open_weights": true, + "release_date": "2025-10-11", + "last_updated": "2025-11-25", "type": "chat" }, { - "id": "anthropic/claude-sonnet-5", - "name": "Claude Sonnet 5", - "display_name": "Claude Sonnet 5", + "id": "Qwen/Qwen3-VL-8B-Instruct", + "name": "Qwen/Qwen3-VL-8B-Instruct", + "display_name": "Qwen/Qwen3-VL-8B-Instruct", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 262000, + "output": 32768 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ] - } + "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-30", - "last_updated": "2026-06-30", + "open_weights": true, + "release_date": "2025-10-15", + "last_updated": "2025-11-25", "type": "chat" }, { - "id": "anthropic/claude-haiku-4.5", - "name": "Claude Haiku 4.5 (latest)", - "display_name": "Claude Haiku 4.5 (latest)", + "id": "Qwen/Qwen3-32B", + "name": "Qwen/Qwen3-32B", + "display_name": "Qwen/Qwen3-32B", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 131000, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-02-28", - "release_date": "2025-10-15", - "last_updated": "2025-10-15", + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-04-28", + "last_updated": "2025-04-28", "type": "chat" }, { - "id": "anthropic/claude-opus-4.8", - "name": "Claude Opus 4.8", - "display_name": "Claude Opus 4.8", + "id": "Qwen/Qwen3-VL-32B-Thinking", + "name": "Qwen/Qwen3-VL-32B-Thinking", + "display_name": "Qwen/Qwen3-VL-32B-Thinking", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 262000, + "output": 32768 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], "interleaved": true, "summaries": true, - "visibility": "omitted", + "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-01", - "release_date": "2026-05-28", - "last_updated": "2026-05-28", + "open_weights": true, + "release_date": "2025-10-21", + "last_updated": "2025-11-25", "type": "chat" }, { - "id": "anthropic/claude-opus-5.5", - "name": "Claude Opus 5.5", - "display_name": "Claude Opus 5.5", + "id": "Qwen/Qwen2.5-72B-Instruct", + "name": "Qwen/Qwen2.5-72B-Instruct", + "display_name": "Qwen/Qwen2.5-72B-Instruct", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 33000, + "output": 4000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ] - } + "attachment": false, + "open_weights": true, + "release_date": "2024-09-18", + "last_updated": "2025-11-25", + "type": "chat" + }, + { + "id": "Qwen/Qwen3-VL-30B-A3B-Instruct", + "name": "Qwen/Qwen3-VL-30B-A3B-Instruct", + "display_name": "Qwen/Qwen3-VL-30B-A3B-Instruct", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 262000, + "output": 32768 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "open_weights": true, + "release_date": "2025-10-04", + "last_updated": "2025-10-04", "type": "chat" }, { - "id": "anthropic/claude-fable-5.1", - "name": "Claude Fable 5.1", - "display_name": "Claude Fable 5.1", + "id": "Qwen/Qwen3-30B-A3B-Instruct-2507", + "name": "Qwen/Qwen3-30B-A3B-Instruct-2507", + "display_name": "Qwen/Qwen3-30B-A3B-Instruct-2507", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 262000, + "output": 32768 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "release_date": "2025-07-28", + "last_updated": "2025-07-28", + "type": "chat" + }, + { + "id": "Qwen/Qwen3.5-27B", + "name": "Qwen3.5 27B", + "display_name": "Qwen3.5 27B", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 262144, + "output": 32768 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], "interleaved": true, "summaries": true, - "visibility": "omitted", + "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", - "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", - "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-09-01", - "last_updated": "2026-09-01", + "open_weights": true, + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" }, { - "id": "anthropic/claude-opus-5", - "name": "Claude Opus 5", - "display_name": "Claude Opus 5", + "id": "Qwen/Qwen3-8B", + "name": "Qwen/Qwen3-8B", + "display_name": "Qwen/Qwen3-8B", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 131000, + "output": 32768 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -299313,252 +295868,176 @@ "extra_capabilities": { "reasoning": { "supported": true, - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-05", - "release_date": "2026-07-24", - "last_updated": "2026-07-24", + "attachment": false, + "open_weights": true, + "release_date": "2025-04-29", + "last_updated": "2025-04-29", "type": "chat" }, { - "id": "anthropic/claude-opus-4.5", - "name": "Claude Opus 4.5 (latest)", - "display_name": "Claude Opus 4.5 (latest)", + "id": "Qwen/Qwen3.5-35B-A3B", + "name": "Qwen3.5 35B-A3B", + "display_name": "Qwen3.5 35B-A3B", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 262144, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": false + "supported": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high" - ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-05", - "release_date": "2025-11-24", - "last_updated": "2025-11-24", + "open_weights": true, + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" }, { - "id": "anthropic/claude-sonnet-4.6", - "name": "Claude Sonnet 4.6", - "display_name": "Claude Sonnet 4.6", + "id": "Qwen/Qwen3.8-2.4T-A95B", + "name": "Qwen3.8 2.4T A95B", + "display_name": "Qwen3.8 2.4T A95B", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 1049000, + "output": 131000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." - ] + "supported": true } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-17", - "last_updated": "2026-03-13", + "attachment": false, + "open_weights": true, + "release_date": "2026-08-12", + "last_updated": "2026-08-12", "type": "chat" }, { - "id": "anthropic/claude-sonnet-4.5", - "name": "Claude Sonnet 4.5 (latest)", - "display_name": "Claude Sonnet 4.5 (latest)", + "id": "Qwen/Qwen3.6-27B", + "name": "Qwen3.6 27B", + "display_name": "Qwen3.6 27B", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 262144, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": false + "supported": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-07-31", - "release_date": "2025-09-29", - "last_updated": "2025-09-29", + "open_weights": true, + "release_date": "2026-04-22", + "last_updated": "2026-04-22", "type": "chat" }, { - "id": "anthropic/claude-sonnet-5.5", - "name": "Claude Sonnet 5.5", - "display_name": "Claude Sonnet 5.5", + "id": "tencent/Hunyuan-A13B-Instruct", + "name": "tencent/Hunyuan-A13B-Instruct", + "display_name": "tencent/Hunyuan-A13B-Instruct", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 131000, + "output": 117964 }, - "temperature": false, - "tool_call": true, + "temperature": true, + "tool_call": false, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ] - } - }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-09-28", - "last_updated": "2026-09-28", + "attachment": false, + "open_weights": true, + "release_date": "2025-06-30", + "last_updated": "2025-11-25", "type": "chat" }, { - "id": "anthropic/claude-fable-5", - "name": "Claude Fable 5", - "display_name": "Claude Fable 5", + "id": "tencent/Hy3", + "name": "Hy3", + "display_name": "Hy3", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 262144, + "output": 99615 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -299566,41 +296045,19 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", - "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", - "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." - ] + "supported": true } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-09", - "last_updated": "2026-06-09", + "attachment": false, + "open_weights": true, + "release_date": "2026-07-06", + "last_updated": "2026-07-06", "type": "chat" }, { - "id": "reflection-ai/beam-1.0-501b-a23b", - "name": "Beam 1.0 501B A23B", - "display_name": "Beam 1.0 501B A23B", + "id": "zai-org/GLM-5", + "name": "zai-org/GLM-5", + "display_name": "zai-org/GLM-5", "modalities": { "input": [ "text" @@ -299610,7 +296067,7 @@ ] }, "limit": { - "context": 262144, + "context": 205000, "output": 131072 }, "temperature": true, @@ -299627,49 +296084,30 @@ "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" ] } }, "attachment": false, "open_weights": true, - "knowledge": "2026-06-30", - "release_date": "2026-10-05", - "last_updated": "2026-10-16", + "release_date": "2026-02-12", + "last_updated": "2026-02-12", "type": "chat" - } - ] - }, - "moonshot": { - "id": "moonshot", - "name": "Moonshot AI (China)", - "display_name": "Moonshot AI (China)", - "api": "https://api.moonshot.cn/v1", - "doc": "https://platform.moonshot.cn/docs/api/chat", - "models": [ + }, { - "id": "kimi-k2.7-code", - "name": "Kimi K2.7 Code", - "display_name": "Kimi K2.7 Code", + "id": "zai-org/GLM-5.2", + "name": "GLM-5.2", + "display_name": "GLM-5.2", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1049000, + "output": 262000 }, "temperature": true, "tool_call": true, @@ -299680,42 +296118,41 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "fixed", "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "effort_options": [ + "high", + "max" ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-21", - "last_updated": "2026-04-21", + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "kimi-k2.6", - "name": "Kimi K2.6", - "display_name": "Kimi K2.6", + "id": "zai-org/GLM-5.1", + "name": "zai-org/GLM-5.1", + "display_name": "zai-org/GLM-5.1", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 205000, + "output": 131000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -299732,32 +296169,30 @@ ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-20", - "last_updated": "2026-04-20", + "release_date": "2026-04-07", + "last_updated": "2026-04-07", "type": "chat" }, { - "id": "kimi-k3", - "name": "Kimi K3", - "display_name": "Kimi K3", + "id": "zai-org/GLM-5.3-Flash", + "name": "GLM-5.3-Flash", + "display_name": "GLM-5.3-Flash", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 1048576 + "context": 1049000, + "output": 262000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -299781,29 +296216,28 @@ }, "attachment": true, "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-16", + "release_date": "2026-08-26", + "last_updated": "2026-08-26", "type": "chat" }, { - "id": "kimi-k3.1-pro-highspeed", - "name": "Kimi K3.1 Pro Highspeed", - "display_name": "Kimi K3.1 Pro Highspeed", + "id": "zai-org/GLM-5V-Turbo", + "name": "zai-org/GLM-5V-Turbo", + "display_name": "zai-org/GLM-5V-Turbo", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 1048576 + "context": 200000, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -299817,39 +296251,60 @@ "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "effort_options": [ - "low", - "high", - "max" ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-10-23", - "last_updated": "2026-10-23", + "release_date": "2026-04-01", + "last_updated": "2026-04-01", "type": "chat" }, { - "id": "kimi-k3.1-pro", - "name": "Kimi K3.1 Pro", - "display_name": "Kimi K3.1 Pro", + "id": "zai-org/GLM-4.5-Air", + "name": "zai-org/GLM-4.5-Air", + "display_name": "zai-org/GLM-4.5-Air", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 1048576 + "context": 131000, + "output": 98304 }, - "temperature": false, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-07-28", + "last_updated": "2025-07-28", + "type": "chat" + }, + { + "id": "zai-org/GLM-5.3", + "name": "GLM-5.3", + "display_name": "GLM-5.3", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1049000, + "output": 262000 + }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -299871,29 +296326,27 @@ ] } }, - "attachment": true, - "open_weights": false, - "release_date": "2026-10-23", - "last_updated": "2026-10-23", + "attachment": false, + "open_weights": true, + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "kimi-k2.7-code-highspeed", - "name": "Kimi K2.7 Code Highspeed", - "display_name": "Kimi K2.7 Code Highspeed", + "id": "deepseek-ai/DeepSeek-V3.1-Terminus", + "name": "deepseek-ai/DeepSeek-V3.1-Terminus", + "display_name": "deepseek-ai/DeepSeek-V3.1-Terminus", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 164000, + "output": 8192 }, "temperature": true, "tool_call": true, @@ -299901,132 +296354,157 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "fixed", - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "attachment": false, + "open_weights": true, + "release_date": "2025-09-29", + "last_updated": "2025-11-25", + "type": "chat" + }, + { + "id": "deepseek-ai/DeepSeek-V3.2-Exp", + "name": "deepseek-ai/DeepSeek-V3.2-Exp", + "display_name": "deepseek-ai/DeepSeek-V3.2-Exp", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] }, - "attachment": true, + "limit": { + "context": 164000, + "output": 65536 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "attachment": false, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-21", - "last_updated": "2026-04-21", + "release_date": "2025-10-10", + "last_updated": "2025-11-25", "type": "chat" - } - ] - }, - "fastrouter": { - "id": "fastrouter", - "name": "FastRouter", - "display_name": "FastRouter", - "api": "https://go.fastrouter.ai/api/v1", - "doc": "https://fastrouter.ai/models", - "models": [ + }, { - "id": "wanx/wan-v2-6", - "name": "Wan 2.6", - "display_name": "Wan 2.6", + "id": "deepseek-ai/DeepSeek-V3.2", + "name": "deepseek-ai/DeepSeek-V3.2", + "display_name": "deepseek-ai/DeepSeek-V3.2", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ - "video" + "text" ] }, "limit": { - "context": 400000, - "output": 8192 + "context": 164000, + "output": 65536 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, - "open_weights": false, - "release_date": "2025-12-03", - "last_updated": "2025-12-03" + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": false, + "open_weights": true, + "knowledge": "2024-07", + "release_date": "2025-12-01", + "last_updated": "2025-12-01", + "type": "chat" }, { - "id": "google/veo3.1-lite", - "name": "Veo 3.1 Lite", - "display_name": "Veo 3.1 Lite", + "id": "deepseek-ai/DeepSeek-V4-Flash-0731", + "name": "DeepSeek V4 Flash 0731", + "display_name": "DeepSeek V4 Flash 0731", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ - "video" + "text" ] }, "limit": { - "context": 400000, - "output": 8192 + "context": 1000000, + "output": 384000 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, - "open_weights": false, - "release_date": "2026-03-31", - "last_updated": "2026-03-31" + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-07-31", + "last_updated": "2026-07-31", + "type": "chat" }, { - "id": "google/veo3.1", - "name": "Veo 3.1", - "display_name": "Veo 3.1", + "id": "deepseek-ai/DeepSeek-V3.1", + "name": "deepseek-ai/DeepSeek-V3.1", + "display_name": "deepseek-ai/DeepSeek-V3.1", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ - "video" + "text" ] }, "limit": { - "context": 400000, + "context": 164000, "output": 8192 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, - "open_weights": false, - "release_date": "2025-10-15", - "last_updated": "2026-01" + "attachment": false, + "open_weights": true, + "release_date": "2025-08-21", + "last_updated": "2025-08-21", + "type": "chat" }, { - "id": "google/gemma-4-31b-it", - "name": "Gemma 4 31B IT", - "display_name": "Gemma 4 31B IT", + "id": "deepseek-ai/DeepSeek-V4-Pro", + "name": "DeepSeek V4 Pro", + "display_name": "DeepSeek V4 Pro", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 1000000, + "output": 384000 }, "temperature": true, "tool_call": true, @@ -300036,33 +296514,75 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "high", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." + ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "google/gemini-2.5-pro", - "name": "Gemini 2.5 Pro", - "display_name": "Gemini 2.5 Pro", + "id": "deepseek-ai/DeepSeek-V3", + "name": "deepseek-ai/DeepSeek-V3", + "display_name": "deepseek-ai/DeepSeek-V3", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 164000, + "output": 8192 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "release_date": "2025-03-24", + "last_updated": "2025-03-24", + "type": "chat" + }, + { + "id": "deepseek-ai/DeepSeek-V4-Flash", + "name": "DeepSeek V4 Flash", + "display_name": "DeepSeek V4 Flash", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1000000, + "output": 384000 }, "temperature": true, "tool_call": true, @@ -300074,47 +296594,47 @@ "reasoning": { "supported": true, "default_enabled": true, - "mode": "budget", - "budget": { - "default": -1, - "min": 128, - "max": 32768, - "auto": -1, - "unit": "tokens" - }, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "high", + "max" + ], + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" + ], + "notes": [ + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-06-17", - "last_updated": "2025-06-17", + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "google/gemini-3.5-flash", - "name": "Gemini 3.5 Flash", - "display_name": "Gemini 3.5 Flash", + "id": "deepseek-ai/DeepSeek-V4-Flash-Vision-Exp", + "name": "DeepSeek V4 Flash Vision Exp", + "display_name": "DeepSeek V4 Flash Vision Exp", "modalities": { "input": [ "text", - "image", - "video", - "audio", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 1000000, + "output": 384000 }, "temperature": true, "tool_call": true, @@ -300126,47 +296646,45 @@ "reasoning": { "supported": true, "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", + "mode": "effort", + "effort": "high", + "effort_options": [ "low", - "medium", - "high" + "high", + "max" ], + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" + ], + "notes": [ + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-05-19", - "last_updated": "2026-05-19", + "open_weights": true, + "release_date": "2026-08-21", + "last_updated": "2026-09-01", "type": "chat" }, { - "id": "google/gemini-3.1-pro-preview", - "name": "Gemini 3.1 Pro Preview", - "display_name": "Gemini 3.1 Pro Preview", + "id": "deepseek-ai/DeepSeek-V4-Pro-0813", + "name": "DeepSeek V4 Pro 0813", + "display_name": "DeepSeek V4 Pro 0813", "modalities": { "input": [ - "text", - "image", - "video", - "audio", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 1000000, + "output": 384000 }, "temperature": true, "tool_call": true, @@ -300177,45 +296695,35 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "low", - "high" - ], + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-02-19", - "last_updated": "2026-02-19", + "attachment": false, + "open_weights": true, + "release_date": "2026-08-13", + "last_updated": "2026-08-22", "type": "chat" }, { - "id": "google/gemini-2.5-flash", - "name": "Gemini 2.5 Flash", - "display_name": "Gemini 2.5 Flash", + "id": "deepseek-ai/DeepSeek-R1", + "name": "deepseek-ai/DeepSeek-R1", + "display_name": "deepseek-ai/DeepSeek-R1", "modalities": { "input": [ - "text", - "image", - "audio", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 164000, + "output": 8192 }, "temperature": true, "tool_call": true, @@ -300226,149 +296734,119 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "budget", - "budget": { - "default": -1, - "min": 0, - "max": 24576, - "auto": -1, - "off": 0, - "unit": "tokens" - }, + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-06-17", - "last_updated": "2025-06-17", + "attachment": false, + "open_weights": true, + "release_date": "2025-05-28", + "last_updated": "2025-05-28", "type": "chat" }, { - "id": "google/gemini-3-pro-image-preview", - "name": "Nano Banana Pro Preview", - "display_name": "Nano Banana Pro Preview", + "id": "google/gemma-4-31B-it", + "name": "Gemma 4 31B IT", + "display_name": "Gemma 4 31B IT", "modalities": { "input": [ "text", "image" ], "output": [ - "text", - "image" + "text" ] }, "limit": { - "context": 65536, - "output": 32768 + "context": 262144, + "output": 99615 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "low", - "high" - ], - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] + "supported": true } }, "attachment": true, - "open_weights": false, + "open_weights": true, "knowledge": "2025-01", - "release_date": "2025-11-20", - "last_updated": "2025-11-20" + "release_date": "2026-04-02", + "last_updated": "2026-04-02", + "type": "chat" }, { - "id": "google/gemini-3.1-flash-image-preview", - "name": "Nano Banana 2 Preview", - "display_name": "Nano Banana 2 Preview", + "id": "google/gemma-4-26B-A4B-it", + "name": "Gemma 4 26B A4B IT", + "display_name": "Gemma 4 26B A4B IT", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ - "text", - "image" + "text" ] }, "limit": { - "context": 65536, - "output": 65536 + "context": 262144, + "output": 99615 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "effort_options": [ - "low", - "medium", - "high" - ] + "supported": true } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-02-26", - "last_updated": "2026-02-26" + "open_weights": true, + "release_date": "2026-04-02", + "last_updated": "2026-04-02", + "type": "chat" }, { - "id": "google/veo3.1-fast", - "name": "Veo 3.1 Fast", - "display_name": "Veo 3.1 Fast", + "id": "google/gemma-4-12B-it", + "name": "Gemma 4 12B IT", + "display_name": "Gemma 4 12B IT", "modalities": { "input": [ "text", "image" ], "output": [ - "video" + "text" ] }, "limit": { - "context": 400000, - "output": 8192 + "context": 262144, + "output": 99615 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": false }, "attachment": true, - "open_weights": false, - "release_date": "2025-10-15", - "last_updated": "2026-01-01" + "open_weights": true, + "release_date": "2026-06-09", + "last_updated": "2026-06-09", + "type": "chat" }, { - "id": "minimax/minimax-m2.7", - "name": "MiniMax-M2.7", - "display_name": "MiniMax-M2.7", + "id": "meituan-longcat/LongCat-2.0", + "name": "LongCat-2.0", + "display_name": "LongCat-2.0", "modalities": { "input": [ "text" @@ -300378,7 +296856,7 @@ ] }, "limit": { - "context": 204800, + "context": 1049000, "output": 131072 }, "temperature": true, @@ -300400,14 +296878,14 @@ }, "attachment": false, "open_weights": true, - "release_date": "2026-03-18", - "last_updated": "2026-03-18", + "release_date": "2026-06-30", + "last_updated": "2026-06-30", "type": "chat" }, { - "id": "minimax/minimax-m2.7-highspeed", - "name": "MiniMax-M2.7-highspeed", - "display_name": "MiniMax-M2.7-highspeed", + "id": "ByteDance-Seed/Seed-OSS-36B-Instruct", + "name": "ByteDance-Seed/Seed-OSS-36B-Instruct", + "display_name": "ByteDance-Seed/Seed-OSS-36B-Instruct", "modalities": { "input": [ "text" @@ -300417,125 +296895,130 @@ ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 262000, + "output": 99560 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, "attachment": false, "open_weights": true, - "release_date": "2026-03-18", - "last_updated": "2026-03-18", + "release_date": "2025-09-04", + "last_updated": "2025-11-25", "type": "chat" }, { - "id": "moonshotai/kimi-k2.6", - "name": "Kimi K2.6", - "display_name": "Kimi K2.6", + "id": "inclusionAI/Ling-flash-2.0", + "name": "inclusionAI/Ling-flash-2.0", + "display_name": "inclusionAI/Ling-flash-2.0", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 131000, + "output": 49780 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-20", - "last_updated": "2026-04-20", + "release_date": "2025-09-18", + "last_updated": "2025-11-25", "type": "chat" - }, + } + ] + }, + "snowflake-cortex": { + "id": "snowflake-cortex", + "name": "Snowflake Cortex", + "display_name": "Snowflake Cortex", + "api": "https://${SNOWFLAKE_ACCOUNT}.snowflakecomputing.com/api/v2/cortex/v1", + "doc": "https://docs.snowflake.com/en/user-guide/snowflake-cortex/cortex-rest-api", + "models": [ { - "id": "x-ai/grok-4.3", - "name": "Grok 4.3", - "display_name": "Grok 4.3", + "id": "claude-sonnet-4-5", + "name": "Claude Sonnet 4.5 (latest)", + "display_name": "Claude Sonnet 4.5 (latest)", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 30000 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "effort_options": [ - "low", - "medium", - "high" + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-04-17", - "last_updated": "2026-04-17", + "knowledge": "2025-07-31", + "release_date": "2025-09-29", + "last_updated": "2025-09-29", "type": "chat" }, { - "id": "x-ai/grok-4", - "name": "Grok 4", - "display_name": "Grok 4", + "id": "claude-fable-5", + "name": "Claude Fable 5", + "display_name": "Claude Fable 5", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 64000 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -300543,35 +297026,55 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", + "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", + "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." + ] } }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2025-07", - "release_date": "2025-07-09", - "last_updated": "2025-07-09", + "knowledge": "2026-01-31", + "release_date": "2026-06-09", + "last_updated": "2026-06-09", "type": "chat" }, { - "id": "x-ai/grok-build-0.1", - "name": "Grok Build 0.1", - "display_name": "Grok Build 0.1", + "id": "openai-gpt-5.5", + "name": "GPT-5.5", + "display_name": "GPT-5.5", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 256000 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -300579,8 +297082,9 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ + "none", + "minimal", "low", "medium", "high" @@ -300589,14 +297093,15 @@ }, "attachment": true, "open_weights": false, - "release_date": "2026-04-16", - "last_updated": "2026-04-16", + "knowledge": "2025-12-01", + "release_date": "2026-04-23", + "last_updated": "2026-04-23", "type": "chat" }, { - "id": "openai/gpt-5.4-mini", - "name": "GPT-5.4 mini", - "display_name": "GPT-5.4 mini", + "id": "openai-gpt-5.6-sol", + "name": "GPT-5.6 Sol", + "display_name": "GPT-5.6 Sol", "modalities": { "input": [ "text", @@ -300607,89 +297112,116 @@ ] }, "limit": { - "context": 400000, + "context": 1050000, "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", "effort_options": [ "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ + "minimal", "low", "medium", "high" - ], - "visibility": "hidden" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-17", - "last_updated": "2026-03-17", + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "openai/gpt-5.5-pro", - "name": "GPT-5.5 Pro", - "display_name": "GPT-5.5 Pro", + "id": "claude-haiku-4-5", + "name": "Claude Haiku 4.5 (latest)", + "display_name": "Claude Haiku 4.5 (latest)", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 200000, + "output": 64000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "effort_options": [ - "low", - "medium", - "high" + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-12-01", - "release_date": "2026-04-23", - "last_updated": "2026-04-23", + "knowledge": "2025-02-28", + "release_date": "2025-10-15", + "last_updated": "2025-10-15", "type": "chat" }, { - "id": "openai/gpt-5-nano", - "name": "GPT-5 Nano", - "display_name": "GPT-5 Nano", + "id": "snowflake-llama3.3-70b", + "name": "Llama-3.3-70B-Instruct", + "display_name": "Llama-3.3-70B-Instruct", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 128000, + "output": 4096 + }, + "temperature": true, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "knowledge": "2023-12", + "release_date": "2024-12-06", + "last_updated": "2024-12-06", + "type": "chat" + }, + { + "id": "claude-sonnet-4-6", + "name": "Claude Sonnet 4.6", + "display_name": "Claude Sonnet 4.6", "modalities": { "input": [ "text", @@ -300700,47 +297232,54 @@ ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 1000000, + "output": 64000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", "effort_options": [ - "minimal", "low", "medium", - "high" + "high", + "max" ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ], - "visibility": "hidden" + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2024-10-01", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "knowledge": "2025-08-31", + "release_date": "2026-02-17", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "openai/gpt-5.4-nano", - "name": "GPT-5.4 nano", - "display_name": "GPT-5.4 nano", + "id": "openai-gpt-5.1", + "name": "GPT-5.1", + "display_name": "GPT-5.1", "modalities": { "input": [ "text", @@ -300751,127 +297290,134 @@ ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 272000, + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", "effort_options": [ "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ + "minimal", "low", "medium", "high" - ], - "visibility": "hidden" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-17", - "last_updated": "2026-03-17", + "knowledge": "2024-09-30", + "release_date": "2025-11-13", + "last_updated": "2025-11-13", "type": "chat" }, { - "id": "openai/gpt-5.3-codex", - "name": "GPT-5.3 Codex", - "display_name": "GPT-5.3 Codex", + "id": "claude-opus-4-7", + "name": "Claude Opus 4.7", + "display_name": "Claude Opus 4.7", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 400000, + "context": 1000000, "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, + "default_enabled": false, "mode": "effort", - "effort": "medium", + "effort": "high", "effort_options": [ "low", "medium", "high", - "xhigh" + "xhigh", + "max" ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" ], - "visibility": "hidden" + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-05", - "last_updated": "2026-02-05", + "knowledge": "2026-01-31", + "release_date": "2026-04-16", + "last_updated": "2026-04-16", "type": "chat" }, { - "id": "openai/gpt-image-2", - "name": "GPT Image 2", - "display_name": "GPT Image 2", + "id": "openai-gpt-5.6-luna", + "name": "GPT-5.6 Luna", + "display_name": "GPT-5.6 Luna", "modalities": { "input": [ "text", "image" ], "output": [ - "image" + "text" ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 1050000, + "output": 128000 }, "temperature": false, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "minimal", + "low", + "medium", + "high" + ] + } }, "attachment": true, "open_weights": false, - "release_date": "2026-04-21", - "last_updated": "2026-04-21" + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", + "type": "chat" }, { - "id": "openai/gpt-oss-120b", - "name": "GPT OSS 120B", - "display_name": "GPT OSS 120B", + "id": "mistral-large2", + "name": "Mistral Large 2407", + "display_name": "Mistral Large 2407", "modalities": { "input": [ "text" @@ -300881,88 +297427,54 @@ ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 128000, + "output": 8192 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "low", - "medium", - "high" - ] - } + "supported": false }, "attachment": false, "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "knowledge": "2024-03-31", + "release_date": "2024-07-24", + "last_updated": "2024-07-24", "type": "chat" }, { - "id": "openai/gpt-5.5", - "name": "GPT-5.5", - "display_name": "GPT-5.5", + "id": "openai-gpt-4.1", + "name": "GPT-4.1", + "display_name": "GPT-4.1", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 128000, + "output": 32000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2025-12-01", - "release_date": "2026-04-23", - "last_updated": "2026-04-23", + "knowledge": "2024-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", "type": "chat" }, { - "id": "openai/gpt-5-mini", - "name": "GPT-5 Mini", - "display_name": "GPT-5 Mini", + "id": "openai-gpt-5.6-terra", + "name": "GPT-5.6 Terra", + "display_name": "GPT-5.6 Terra", "modalities": { "input": [ "text", @@ -300973,7 +297485,7 @@ ] }, "limit": { - "context": 400000, + "context": 1050000, "output": 128000 }, "temperature": false, @@ -300984,75 +297496,84 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", "effort_options": [ + "none", "minimal", "low", "medium", "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2024-10-01", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "openai/gpt-oss-20b", - "name": "GPT OSS 20B", - "display_name": "GPT OSS 20B", + "id": "claude-opus-4-6", + "name": "Claude Opus 4.6", + "display_name": "Claude Opus 4.6", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 1000000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", "effort_options": [ "low", "medium", - "high" + "high", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "attachment": true, + "open_weights": false, + "knowledge": "2025-05-31", + "release_date": "2026-02-05", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "openai/gpt-5", - "name": "GPT-5", - "display_name": "GPT-5", + "id": "claude-opus-4-8", + "name": "Claude Opus 4.8", + "display_name": "Claude Opus 4.8", "modalities": { "input": [ "text", @@ -301063,47 +297584,52 @@ ] }, "limit": { - "context": 400000, + "context": 1000000, "output": 128000 }, "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, + "default_enabled": false, "mode": "effort", - "effort": "medium", + "effort": "high", "effort_options": [ - "minimal", "low", "medium", - "high" + "high", + "xhigh", + "max" ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" ], - "visibility": "hidden" + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2024-10-01", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "knowledge": "2026-01", + "release_date": "2026-05-28", + "last_updated": "2026-05-28", "type": "chat" }, { - "id": "openai/gpt-4.1", - "name": "GPT-4.1", - "display_name": "GPT-4.1", + "id": "claude-opus-5", + "name": "Claude Opus 5", + "display_name": "Claude Opus 5", "modalities": { "input": [ "text", @@ -301114,28 +297640,35 @@ ] }, "limit": { - "context": 1047576, - "output": 32768 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": true, "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-04-14", - "last_updated": "2025-04-14", + "knowledge": "2026-05", + "release_date": "2026-07-24", + "last_updated": "2026-07-24", "type": "chat" }, { - "id": "z-ai/glm-5.1", - "name": "GLM-5.1", - "display_name": "GLM-5.1", + "id": "claude-opus-4-5", + "name": "Claude Opus 4.5 (latest)", + "display_name": "Claude Opus 4.5 (latest)", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" @@ -301143,42 +297676,66 @@ }, "limit": { "context": 200000, - "output": 131072 + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", + "effort_options": [ + "low", + "medium", + "high" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." + ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-04-07", - "last_updated": "2026-04-07", + "attachment": true, + "open_weights": false, + "knowledge": "2025-05", + "release_date": "2025-11-24", + "last_updated": "2025-11-24", "type": "chat" }, { - "id": "z-ai/glm-5", - "name": "GLM-5", - "display_name": "GLM-5", + "id": "openai-gpt-5", + "name": "GPT-5", + "display_name": "GPT-5", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 272000, + "output": 8192 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -301186,25 +297743,26 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "none", + "minimal", + "low", + "medium", + "high" ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-02-12", - "last_updated": "2026-02-12", + "attachment": true, + "open_weights": false, + "knowledge": "2024-09-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "deepseek/deepseek-v4-pro", - "name": "DeepSeek V4 Pro", - "display_name": "DeepSeek V4 Pro", + "id": "deepseek-r1", + "name": "DeepSeek-R1", + "display_name": "DeepSeek-R1", "modalities": { "input": [ "text" @@ -301214,11 +297772,11 @@ ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 128000, + "output": 32768 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true @@ -301226,215 +297784,154 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "high", - "max" - ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, "attachment": false, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "knowledge": "2024-07", + "release_date": "2025-01-20", + "last_updated": "2025-05-29", "type": "chat" }, { - "id": "anthropic/claude-opus-4.8", - "name": "Claude Opus 4.8", - "display_name": "Claude Opus 4.8", + "id": "openai-gpt-5-mini", + "name": "GPT-5 Mini", + "display_name": "GPT-5 Mini", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 272000, + "output": 8192 }, "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "high", "effort_options": [ + "none", + "minimal", "low", "medium", - "high", - "xhigh", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." + "high" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-01", - "release_date": "2026-05-28", - "last_updated": "2026-05-28", + "knowledge": "2024-05-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, - { - "id": "anthropic/claude-opus-4.1", - "name": "Claude Opus 4.1", - "display_name": "Claude Opus 4.1", + { + "id": "claude-sonnet-5", + "name": "Claude Sonnet 5", + "display_name": "Claude Sonnet 5", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 32000 + "context": 1000000, + "output": 64000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." - ] + "supported": true } }, "attachment": true, "open_weights": false, - "knowledge": "2025-03-31", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "knowledge": "2026-01-31", + "release_date": "2026-06-30", + "last_updated": "2026-06-30", "type": "chat" }, { - "id": "anthropic/claude-sonnet-4.6", - "name": "Claude Sonnet 4.6", - "display_name": "Claude Sonnet 4.6", + "id": "openai-gpt-5.2", + "name": "GPT-5.2", + "display_name": "GPT-5.2", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 64000 + "context": 400000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", "effort_options": [ + "none", + "minimal", "low", "medium", - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." + "high" ] } }, "attachment": true, "open_weights": false, "knowledge": "2025-08-31", - "release_date": "2026-02-17", - "last_updated": "2026-03-13", + "release_date": "2025-12-11", + "last_updated": "2025-12-11", "type": "chat" }, { - "id": "sarvam/sarvam-105b", - "name": "Sarvam 105B", - "display_name": "Sarvam 105B", + "id": "openai-gpt-5.4", + "name": "GPT-5.4", + "display_name": "GPT-5.4", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 131072 + "context": 1050000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -301442,117 +297939,140 @@ "supported": true, "default": true }, - "attachment": false, - "open_weights": true, - "release_date": "2026-02-18", - "last_updated": "2026-02-18", - "type": "chat" - }, - { - "id": "leonardo-ai/lucid-origin", - "name": "Lucid Origin", - "display_name": "Lucid Origin", - "modalities": { - "input": [ - "text" - ], - "output": [ - "image" - ] - }, - "limit": { - "context": 4096, - "output": 8192 - }, - "temperature": false, - "tool_call": false, - "reasoning": { - "supported": false + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "minimal", + "low", + "medium", + "high" + ] + } }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2025-06-01", - "last_updated": "2025-06-01", + "knowledge": "2025-08-31", + "release_date": "2026-03-05", + "last_updated": "2026-03-05", "type": "chat" }, { - "id": "leonardo-ai/lucid-realism", - "name": "Lucid Realism", - "display_name": "Lucid Realism", + "id": "openai-gpt-5-nano", + "name": "GPT-5 Nano", + "display_name": "GPT-5 Nano", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ - "image" + "text" ] }, "limit": { - "context": 4096, + "context": 272000, "output": 8192 }, "temperature": false, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "minimal", + "low", + "medium", + "high" + ] + } + }, + "attachment": true, "open_weights": false, - "release_date": "2025-06-01", - "last_updated": "2025-06-01", + "knowledge": "2024-05-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "bytedance/seedance-2", - "name": "Seedance 2", - "display_name": "Seedance 2", + "id": "gemini-3.1-pro", + "name": "Gemini 3.1 Pro Preview", + "display_name": "Gemini 3.1 Pro Preview", "modalities": { "input": [ "text", - "image" + "image", + "video", + "audio", + "pdf" ], "output": [ - "video" + "text" ] }, "limit": { - "context": 4096, - "output": 8192 + "context": 1000000, + "output": 64000 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "low", + "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] + } }, "attachment": true, "open_weights": false, - "release_date": "2026-02-12", - "last_updated": "2026-10-04" + "knowledge": "2025-01", + "release_date": "2026-02-19", + "last_updated": "2026-02-19", + "type": "chat" } ] }, - "zhipuai-coding-plan": { - "id": "zhipuai-coding-plan", - "name": "Zhipu AI Coding Plan", - "display_name": "Zhipu AI Coding Plan", - "api": "https://open.bigmodel.cn/api/coding/paas/v4", - "doc": "https://docs.bigmodel.cn/cn/coding-plan/overview", + "modular": { + "id": "modular", + "name": "Modular", + "display_name": "Modular", + "api": "https://api.modular.com/v1", + "doc": "https://docs.modular.com/models", "models": [ { - "id": "glm-5.3-highspeed", - "name": "GLM-5.3 Highspeed", - "display_name": "GLM-5.3 Highspeed", + "id": "deepseek/deepseek-v4.1-flash", + "name": "DeepSeek V4.1 Flash", + "display_name": "DeepSeek V4.1 Flash", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 1048576, + "output": 384000 }, "temperature": true, "tool_call": true, @@ -301563,12 +298083,6 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ "low", "high", @@ -301576,27 +298090,30 @@ ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "knowledge": "2025-05", + "release_date": "2026-09-10", + "last_updated": "2026-09-10", "type": "chat" }, { - "id": "glm-5.3", - "name": "GLM-5.3", - "display_name": "GLM-5.3", + "id": "MiniMaxAI/MiniMax-M3.1-Flash", + "name": "MiniMax-M3.1-Flash", + "display_name": "MiniMax-M3.1-Flash", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 1048576, + "output": 512000 }, "temperature": true, "tool_call": true, @@ -301615,21 +298132,23 @@ ], "effort_options": [ "low", + "medium", "high", + "xhigh", "max" ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "attachment": true, + "open_weights": false, + "release_date": "2026-10-19", + "last_updated": "2026-10-19", "type": "chat" }, { - "id": "glm-4.6v", - "name": "GLM-4.6V", - "display_name": "GLM-4.6V", + "id": "minimax/minimax-m3", + "name": "MiniMax-M3", + "display_name": "MiniMax-M3", "modalities": { "input": [ "text", @@ -301641,8 +298160,8 @@ ] }, "limit": { - "context": 128000, - "output": 32768 + "context": 1048576, + "output": 512000 }, "temperature": true, "tool_call": true, @@ -301663,29 +298182,26 @@ }, "attachment": true, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-12-08", - "last_updated": "2025-12-08", + "release_date": "2026-06-01", + "last_updated": "2026-06-01", "type": "chat" }, { - "id": "glm-5.3-flash", - "name": "GLM-5.3-Flash", - "display_name": "GLM-5.3-Flash", + "id": "google/gemma-4-31b-it", + "name": "Gemma 4 31B IT", + "display_name": "Gemma 4 31B IT", "modalities": { "input": [ "text", - "image", - "video", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 262144, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -301701,37 +298217,63 @@ "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "effort_options": [ - "low", - "high", - "max" ] } }, "attachment": true, "open_weights": true, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", + "knowledge": "2025-01", + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" } ] }, - "digitalocean": { - "id": "digitalocean", - "name": "DigitalOcean", - "display_name": "DigitalOcean", - "api": "https://inference.do-ai.run/v1", - "doc": "https://docs.digitalocean.com/products/gradient-ai-platform/details/models/", + "azure": { + "id": "azure", + "name": "Azure", + "display_name": "Azure", + "doc": "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", "models": [ { - "id": "openai-gpt-5.6-sol", - "name": "OpenAI GPT-5.6 Sol", - "display_name": "OpenAI GPT-5.6 Sol", + "id": "gpt-4.1-nano", + "name": "GPT-4.1 nano", + "display_name": "GPT-4.1 nano", "modalities": { "input": [ "text", - "image" + "image", + "pdf" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1047576, + "output": 32768 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": false, + "knowledge": "2024-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", + "type": "chat" + }, + { + "id": "gpt-6.1-terra", + "name": "GPT-6.1 Terra", + "display_name": "GPT-6.1 Terra", + "modalities": { + "input": [ + "text", + "image", + "pdf" ], "output": [ "text" @@ -301761,15 +298303,15 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "knowledge": "2026-06-01", + "release_date": "2026-10-26", + "last_updated": "2026-10-26", "type": "chat" }, { - "id": "llama-4-maverick", - "name": "Llama 4 Maverick", - "display_name": "Llama 4 Maverick", + "id": "llama-4-scout-17b-16e-instruct", + "name": "Llama 4 Scout 17B 16E Instruct", + "display_name": "Llama 4 Scout 17B 16E Instruct", "modalities": { "input": [ "text", @@ -301781,7 +298323,7 @@ }, "limit": { "context": 128000, - "output": 16384 + "output": 8192 }, "temperature": true, "tool_call": true, @@ -301796,51 +298338,14 @@ "type": "chat" }, { - "id": "openai-gpt-oss-20b", - "name": "OpenAI GPT-oss-20b", - "display_name": "OpenAI GPT-oss-20b", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 128000, - "output": 4096 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high" - ] - } - }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", - "type": "chat" - }, - { - "id": "anthropic-claude-haiku-4.5", - "name": "Anthropic Claude Haiku 4.5", - "display_name": "Anthropic Claude Haiku 4.5", + "id": "claude-sonnet-4-5", + "name": "Claude Sonnet 4.5", + "display_name": "Claude Sonnet 4.5", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" @@ -301848,7 +298353,7 @@ }, "limit": { "context": 200000, - "output": 8192 + "output": 64000 }, "temperature": true, "tool_call": true, @@ -301879,64 +298384,20 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2025-02-28", - "release_date": "2025-10-15", - "last_updated": "2025-10-15", - "type": "chat" - }, - { - "id": "openai-gpt-oss-120b", - "name": "OpenAI GPT-oss-120b", - "display_name": "OpenAI GPT-oss-120b", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 128000, - "output": 4096 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "low", - "medium", - "high" - ] - } - }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "knowledge": "2025-07-31", + "release_date": "2025-11-18", + "last_updated": "2025-11-18", "type": "chat" }, { - "id": "anthropic-claude-opus-4.8", - "name": "Anthropic Claude Opus 4.8", - "display_name": "Anthropic Claude Opus 4.8", + "id": "claude-fable-5", + "name": "Claude Fable 5", + "display_name": "Claude Fable 5", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" @@ -301946,16 +298407,16 @@ "context": 1000000, "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, + "default_enabled": true, "mode": "effort", "effort": "high", "effort_options": [ @@ -301972,23 +298433,23 @@ "thinking_blocks" ], "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." + "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", + "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", + "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-01", - "release_date": "2026-05-28", - "last_updated": "2026-05-28", + "knowledge": "2026-01-31", + "release_date": "2026-06-09", + "last_updated": "2026-06-09", "type": "chat" }, { - "id": "openai-gpt-5.4-nano", - "name": "OpenAI GPT-5.4 Nano", - "display_name": "OpenAI GPT-5.4 Nano", + "id": "gpt-4-turbo", + "name": "GPT-4 Turbo", + "display_name": "GPT-4 Turbo", "modalities": { "input": [ "text", @@ -301999,128 +298460,110 @@ ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 128000, + "output": 4096 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ] - } + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-17", - "last_updated": "2026-03-17", + "knowledge": "2023-12", + "release_date": "2023-11-06", + "last_updated": "2024-04-09", "type": "chat" }, { - "id": "qwen3.5-397b-a17b", - "name": "Qwen 3.5 397B A17B", - "display_name": "Qwen 3.5 397B A17B", + "id": "claude-haiku-4-5", + "name": "Claude Haiku 4.5", + "display_name": "Claude Haiku 4.5", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 131072 + "context": 200000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" ], - "effort_options": [ - "none", - "low", - "medium", - "high" + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-02-15", - "last_updated": "2026-02-15", + "open_weights": false, + "knowledge": "2025-02-28", + "release_date": "2025-11-18", + "last_updated": "2025-11-18", "type": "chat" }, { - "id": "anthropic-claude-4.6-sonnet", - "name": "Anthropic Claude Sonnet 4.6", - "display_name": "Anthropic Claude Sonnet 4.6", + "id": "phi-4-mini", + "name": "Phi-4-mini", + "display_name": "Phi-4-mini", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 8192 + "context": 128000, + "output": 4096 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "max" - ] - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-17", - "last_updated": "2026-03-13", + "attachment": false, + "open_weights": true, + "knowledge": "2023-10", + "release_date": "2024-12-11", + "last_updated": "2024-12-11", "type": "chat" }, { - "id": "openai-gpt-6-sol", - "name": "OpenAI GPT-6 Sol", - "display_name": "OpenAI GPT-6 Sol", + "id": "gpt-5.6-terra", + "name": "GPT-5.6 Terra", + "display_name": "GPT-5.6 Terra", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" @@ -302138,26 +298581,38 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ "none", "low", "medium", "high", - "xhigh" - ] + "xhigh", + "max" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2026-04-20", - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "anthropic-claude-fable-5", - "name": "Anthropic Claude Fable 5", - "display_name": "Anthropic Claude Fable 5", + "id": "mistral-small-2503", + "name": "Mistral Small 3.1", + "display_name": "Mistral Small 3.1", "modalities": { "input": [ "text", @@ -302167,11 +298622,39 @@ "text" ] }, + "limit": { + "context": 128000, + "output": 32768 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": false, + "knowledge": "2024-09", + "release_date": "2025-03-01", + "last_updated": "2025-03-01", + "type": "chat" + }, + { + "id": "deepseek-v4-flash", + "name": "DeepSeek-V4-Flash", + "display_name": "DeepSeek-V4-Flash", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, "limit": { "context": 1000000, - "output": 128000 + "output": 384000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -302185,121 +298668,155 @@ "effort": "high", "effort_options": [ "low", - "medium", "high", - "xhigh", "max" ], "interleaved": true, "summaries": true, - "visibility": "omitted", + "visibility": "summary", "continuation": [ "thinking_blocks" ], "notes": [ - "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", - "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", - "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-09", - "last_updated": "2026-06-09", + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "minimax-m2.5", - "name": "MiniMax M2.5 (Public Preview)", - "display_name": "MiniMax M2.5 (Public Preview)", + "id": "gpt-5.4", + "name": "GPT-5.4", + "display_name": "GPT-5.4", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 65536, - "output": 65536 + "context": 1050000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ "low", "medium", "high" - ] + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-08", - "release_date": "2026-02-12", - "last_updated": "2026-04-16", + "attachment": true, + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-03-05", + "last_updated": "2026-03-05", "type": "chat" }, { - "id": "arcee-trinity-large-thinking", - "name": "Arcee Trinity Large Thinking (Public Preview)", - "display_name": "Arcee Trinity Large Thinking (Public Preview)", + "id": "claude-sonnet-4-6", + "name": "Claude Sonnet 4.6", + "display_name": "Claude Sonnet 4.6", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 32000 + "context": 1000000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", "effort_options": [ "low", "medium", - "high" + "high", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-04-01", - "last_updated": "2026-05-28", + "attachment": true, + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-02-17", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "anthropic-claude-5-sonnet", - "name": "Anthropic Claude Sonnet 5", - "display_name": "Anthropic Claude Sonnet 5", + "id": "gpt-5.6-sol", + "name": "GPT-5.6 Sol", + "display_name": "GPT-5.6 Sol", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, + "context": 1050000, "output": 128000 }, "temperature": false, @@ -302310,29 +298827,43 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ + "none", "low", "medium", "high", - "xhigh" - ] + "xhigh", + "max" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-30", - "last_updated": "2026-06-30", + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "openai-gpt-5", - "name": "OpenAI GPT-5", - "display_name": "OpenAI GPT-5", + "id": "gpt-5.4-mini", + "name": "GPT-5.4 Mini", + "display_name": "GPT-5.4 Mini", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" @@ -302342,92 +298873,79 @@ "context": 400000, "output": 128000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", "effort_options": [ - "minimal", + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ "low", "medium", "high" - ] + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "knowledge": "2025-08-31", + "release_date": "2026-03-17", + "last_updated": "2026-03-17", "type": "chat" }, { - "id": "openai-gpt-image-1", - "name": "GPT Image 1", - "display_name": "GPT Image 1", + "id": "gpt-4o", + "name": "GPT-4o", + "display_name": "GPT-4o", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ - "image" + "text" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 128000, + "output": 16384 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": false }, "attachment": true, "open_weights": false, - "release_date": "2025-04-24", - "last_updated": "2025-04-24" - }, - { - "id": "gte-large-en-v1.5", - "name": "GTE Large (v1.5)", - "display_name": "GTE Large (v1.5)", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 8192, - "output": 1024 - }, - "temperature": false, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": true, - "release_date": "2024-03-27", - "last_updated": "2026-04-16", - "type": "embedding" + "knowledge": "2023-09", + "release_date": "2024-05-13", + "last_updated": "2024-08-06", + "type": "chat" }, { - "id": "qwen3.8-max", - "name": "Qwen3.8-Max", - "display_name": "Qwen3.8-Max", + "id": "deepseek-v4.1-flash", + "name": "DeepSeek-V4.1-Flash", + "display_name": "DeepSeek-V4.1-Flash", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" @@ -302435,7 +298953,7 @@ }, "limit": { "context": 1000000, - "output": 262144 + "output": 128000 }, "temperature": true, "tool_call": true, @@ -302446,39 +298964,46 @@ "extra_capabilities": { "reasoning": { "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ "none", "low", - "medium", "high", "max" ] } }, "attachment": true, - "open_weights": false, - "release_date": "2026-08-03", - "last_updated": "2026-08-03", + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-09-10", + "last_updated": "2026-09-10", "type": "chat" }, { - "id": "anthropic-claude-opus-4.6", - "name": "Anthropic Claude Opus 4.6", - "display_name": "Anthropic Claude Opus 4.6", + "id": "gpt-5.1-codex-mini", + "name": "GPT-5.1 Codex Mini", + "display_name": "GPT-5.1 Codex Mini", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 8192 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -302488,92 +299013,63 @@ "reasoning": { "supported": true, "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", + "mode": "effort", + "effort": "none", "effort_options": [ + "none", "low", "medium", - "high", - "max" + "high" ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." - ] + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2025-05-31", - "release_date": "2026-02-05", - "last_updated": "2026-03-13", + "knowledge": "2024-09-30", + "release_date": "2025-11-14", + "last_updated": "2025-11-14", "type": "chat" }, { - "id": "deepseek-v4-pro", - "name": "Deepseek V4 Pro", - "display_name": "Deepseek V4 Pro", + "id": "llama-4-maverick-17b-128e-instruct-fp8", + "name": "Llama 4 Maverick 17B 128E Instruct FP8", + "display_name": "Llama 4 Maverick 17B 128E Instruct FP8", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 384000 + "context": 1000000, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." - ] - } + "supported": false }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "knowledge": "2024-08", + "release_date": "2025-04-05", + "last_updated": "2025-04-05", "type": "chat" - }, - { - "id": "minimax-m3.1-flash", - "name": "MiniMax M3.1-Flash (Public Preview)", - "display_name": "MiniMax M3.1-Flash (Public Preview)", + }, + { + "id": "grok-4-1-fast-reasoning", + "name": "Grok 4.1 Fast (Reasoning)", + "display_name": "Grok 4.1 Fast (Reasoning)", "modalities": { "input": [ "text", @@ -302584,8 +299080,8 @@ ] }, "limit": { - "context": 1048576, - "output": 1048576 + "context": 128000, + "output": 8192 }, "temperature": true, "tool_call": true, @@ -302595,38 +299091,34 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ] + "supported": true } }, "attachment": true, "open_weights": false, - "release_date": "2026-10-19", - "last_updated": "2026-10-19", + "release_date": "2025-06-27", + "last_updated": "2025-06-27", "type": "chat" }, { - "id": "deepseek-v4-pro-0813", - "name": "DeepSeek V4 Pro 0813", - "display_name": "DeepSeek V4 Pro 0813", + "id": "gpt-5.6-luna", + "name": "GPT-5.6 Luna", + "display_name": "GPT-5.6 Luna", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 1048576 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -302635,24 +299127,37 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ "none", "low", + "medium", "high", + "xhigh", "max" - ] + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-08-13", - "last_updated": "2026-08-22", + "attachment": true, + "open_weights": false, + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "openai-gpt-5-mini", - "name": "OpenAI GPT-5 Mini", - "display_name": "OpenAI GPT-5 Mini", + "id": "grok-4.6", + "name": "Grok 4.6", + "display_name": "Grok 4.6", "modalities": { "input": [ "text", @@ -302663,10 +299168,10 @@ ] }, "limit": { - "context": 400000, + "context": 200000, "output": 128000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -302674,255 +299179,266 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ - "minimal", "low", "medium", - "high" + "high", + "xhigh" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2024-05-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "knowledge": "2026-02-01", + "release_date": "2026-08-12", + "last_updated": "2026-08-12", "type": "chat" }, { - "id": "qwen3-embedding-0.6b", - "name": "Qwen3 Embedding 0.6B", - "display_name": "Qwen3 Embedding 0.6B", + "id": "mistral-medium-2505", + "name": "Mistral Medium 3", + "display_name": "Mistral Medium 3", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 8000, - "output": 1024 + "context": 128000, + "output": 128000 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, - "open_weights": true, - "release_date": "2025-06-03", - "last_updated": "2026-04-16", - "type": "embedding" + "attachment": true, + "open_weights": false, + "knowledge": "2025-05", + "release_date": "2025-05-07", + "last_updated": "2025-05-07", + "type": "chat" }, { - "id": "openai-gpt-6-1-sol", - "name": "OpenAI GPT-6.1 Sol", - "display_name": "OpenAI GPT-6.1 Sol", + "id": "phi-4-reasoning-plus", + "name": "Phi-4-reasoning-plus", + "display_name": "Phi-4-reasoning-plus", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 32000, + "output": 4096 }, - "temperature": false, - "tool_call": true, + "temperature": true, + "tool_call": false, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ] - } - }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-04-30", - "release_date": "2026-09-29", - "last_updated": "2026-09-29", + "attachment": false, + "open_weights": true, + "knowledge": "2023-10", + "release_date": "2024-12-11", + "last_updated": "2024-12-11", "type": "chat" }, { - "id": "nemotron-nano-12b-v2-vl", - "name": "Nemotron-nano 12b v2-vl", - "display_name": "Nemotron-nano 12b v2-vl", + "id": "claude-opus-4-7", + "name": "Claude Opus 4.7", + "display_name": "Claude Opus 4.7", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "high", "effort_options": [ - "none", "low", "medium", "high", + "xhigh", "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, "attachment": true, - "open_weights": true, - "release_date": "2025-10-28", - "last_updated": "2025-10-28", + "open_weights": false, + "knowledge": "2026-01-31", + "release_date": "2026-04-16", + "last_updated": "2026-04-16", "type": "chat" }, { - "id": "openai-gpt-4o-mini", - "name": "OpenAI GPT-4o mini", - "display_name": "OpenAI GPT-4o mini", + "id": "gpt-5.1-codex", + "name": "GPT-5.1 Codex", + "display_name": "GPT-5.1 Codex", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", "effort_options": [ + "none", "low", "medium", "high" - ] + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2023-09", - "release_date": "2024-07-18", - "last_updated": "2024-07-18", + "knowledge": "2024-09-30", + "release_date": "2025-11-14", + "last_updated": "2025-11-14", "type": "chat" }, { - "id": "anthropic-claude-opus-5.5", - "name": "Anthropic Claude Opus 5.5", - "display_name": "Anthropic Claude Opus 5.5", + "id": "gpt-4.1", + "name": "GPT-4.1", + "display_name": "GPT-4.1", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 1047576, + "output": 32768 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ] - } + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "knowledge": "2024-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", "type": "chat" }, { - "id": "multi-qa-mpnet-base-dot-v1", - "name": "Multi-QA-mpnet-base-dot-v1", - "display_name": "Multi-QA-mpnet-base-dot-v1", + "id": "gpt-image-1.5", + "name": "GPT-Image-1.5", + "display_name": "GPT-Image-1.5", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ - "text" + "text", + "image" ] }, "limit": { - "context": 512, - "output": 768 + "context": 8192, + "output": 8192 }, "temperature": false, "tool_call": false, "reasoning": { "supported": false }, - "attachment": false, - "open_weights": true, - "release_date": "2021-08-23", - "last_updated": "2021-08-23", - "type": "embedding" + "attachment": true, + "open_weights": false, + "release_date": "2025-11-25", + "last_updated": "2025-11-25" }, { - "id": "anthropic-claude-4.5-sonnet", - "name": "Anthropic Claude 4.5 Sonnet", - "display_name": "Anthropic Claude 4.5 Sonnet", + "id": "claude-fable-5-1", + "name": "Claude Fable 5.1", + "display_name": "Claude Fable 5.1", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -302930,24 +299446,41 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", "effort_options": [ "low", "medium", - "high" + "high", + "xhigh", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", + "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", + "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-07-31", - "release_date": "2025-09-29", - "last_updated": "2025-09-29", + "knowledge": "2026-06", + "release_date": "2026-09-01", + "last_updated": "2026-09-01", "type": "chat" }, { - "id": "reflection-beam", - "name": "Beam", - "display_name": "Beam", + "id": "gpt-3.5-turbo-1106", + "name": "GPT-3.5 Turbo 1106", + "display_name": "GPT-3.5 Turbo 1106", "modalities": { "input": [ "text" @@ -302957,36 +299490,25 @@ ] }, "limit": { - "context": 1048576, - "output": 1048576 + "context": 16384, + "output": 4096 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ] - } + "supported": false }, "attachment": false, "open_weights": false, - "release_date": "2026-10-21", - "last_updated": "2026-10-21", + "knowledge": "2021-08", + "release_date": "2023-11-06", + "last_updated": "2023-11-06", "type": "chat" }, { - "id": "bge-reranker-v2-m3", - "name": "BGE Reranker v2 M3", - "display_name": "BGE Reranker v2 M3", + "id": "text-embedding-3-small", + "name": "text-embedding-3-small", + "display_name": "text-embedding-3-small", "modalities": { "input": [ "text" @@ -302997,52 +299519,49 @@ }, "limit": { "context": 8192, - "output": 1 + "output": 1536 }, - "temperature": false, "tool_call": false, "reasoning": { "supported": false }, "attachment": false, - "open_weights": true, - "release_date": "2024-03-15", - "last_updated": "2024-03-15", - "type": "rerank" + "open_weights": false, + "release_date": "2024-01-25", + "last_updated": "2024-01-25", + "type": "embedding" }, { - "id": "openai-gpt-4o", - "name": "OpenAI GPT-4o", - "display_name": "OpenAI GPT-4o", + "id": "gpt-image-2.5-flare", + "name": "GPT Image 2.5 Flare", + "display_name": "GPT Image 2.5 Flare", "modalities": { "input": [ "text", "image" ], "output": [ - "text" + "image" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 8192, + "output": 8192 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2023-09", - "release_date": "2024-05-13", - "last_updated": "2024-08-06", - "type": "chat" + "release_date": "2026-09-08", + "last_updated": "2026-09-08" }, { - "id": "e5-large-v2", - "name": "E5 Large v2", - "display_name": "E5 Large v2", + "id": "cohere-embed-v3-english", + "name": "Embed v3 English", + "display_name": "Embed v3 English", "modalities": { "input": [ "text" @@ -303062,25 +299581,26 @@ }, "attachment": false, "open_weights": true, - "release_date": "2023-05", - "last_updated": "2023-05", + "release_date": "2023-11-07", + "last_updated": "2023-11-07", "type": "embedding" }, { - "id": "openai-gpt-6-astra", - "name": "OpenAI GPT-6 Astra", - "display_name": "OpenAI GPT-6 Astra", + "id": "gpt-5.3-codex", + "name": "GPT-5.3 Codex", + "display_name": "GPT-5.3 Codex", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1050000, + "context": 400000, "output": 128000 }, "temperature": false, @@ -303091,39 +299611,51 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ "low", "medium", "high", - "xhigh", - "max" - ] + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2026-04-30", - "release_date": "2026-09-04", - "last_updated": "2026-09-04", + "knowledge": "2025-08-31", + "release_date": "2026-02-24", + "last_updated": "2026-02-24", "type": "chat" }, { - "id": "glm-5.3", - "name": "GLM5.3", - "display_name": "GLM5.3", + "id": "claude-mythos-5", + "name": "Claude Mythos 5", + "display_name": "Claude Mythos 5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, + "context": 1000000, "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -303132,63 +299664,104 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", "effort_options": [ "low", + "medium", "high", + "xhigh", "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", + "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", + "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "attachment": true, + "open_weights": false, + "knowledge": "2026-01-31", + "release_date": "2026-06-09", + "last_updated": "2026-06-09", "type": "chat" }, { - "id": "nemotron-3.5-super-vl", - "name": "NVIDIA Nemotron 3.5 Super VL", - "display_name": "NVIDIA Nemotron 3.5 Super VL", + "id": "gpt-5.1", + "name": "GPT-5.1", + "display_name": "GPT-5.1", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 1048576 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } }, "attachment": true, - "open_weights": true, - "release_date": "2026-10-15", - "last_updated": "2026-10-15", + "open_weights": false, + "knowledge": "2024-09-30", + "release_date": "2025-11-14", + "last_updated": "2025-11-14", "type": "chat" }, { - "id": "anthropic-claude-sonnet-5.5", - "name": "Anthropic Claude Sonnet 5.5", - "display_name": "Anthropic Claude Sonnet 5.5", + "id": "gpt-chat-latest", + "name": "GPT Chat Latest", + "display_name": "GPT Chat Latest", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, + "context": 400000, "output": 128000 }, "temperature": false, @@ -303199,26 +299772,52 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" + "medium" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-09-28", - "last_updated": "2026-09-28", + "knowledge": "2025-12-01", + "release_date": "2026-05-05", + "last_updated": "2026-05-28", "type": "chat" }, { - "id": "deepseek-v4-flash-0731", - "name": "DeepSeek V4 Flash 0731", - "display_name": "DeepSeek V4 Flash 0731", + "id": "gpt-4-turbo-vision", + "name": "GPT-4 Turbo Vision", + "display_name": "GPT-4 Turbo Vision", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 128000, + "output": 4096 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": false, + "knowledge": "2023-11", + "release_date": "2023-11-06", + "last_updated": "2024-04-09", + "type": "chat" + }, + { + "id": "gpt-3.5-turbo-instruct", + "name": "GPT-3.5 Turbo Instruct", + "display_name": "GPT-3.5 Turbo Instruct", "modalities": { "input": [ "text" @@ -303228,10 +299827,40 @@ ] }, "limit": { - "context": 1048576, - "output": 1048576 + "context": 4096, + "output": 4096 }, "temperature": true, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": false, + "knowledge": "2021-08", + "release_date": "2023-09-21", + "last_updated": "2023-09-21", + "type": "chat" + }, + { + "id": "gpt-6-luna", + "name": "GPT-6 Luna", + "display_name": "GPT-6 Luna", + "modalities": { + "input": [ + "text", + "image", + "pdf" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1050000, + "output": 128000 + }, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -303239,66 +299868,82 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ + "none", "low", "medium", - "high" + "high", + "xhigh", + "max" ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-07-31", - "last_updated": "2026-07-31", + "attachment": true, + "open_weights": false, + "knowledge": "2026-05-18", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "openai-gpt-4.1", - "name": "OpenAI GPT-4.1", - "display_name": "OpenAI GPT-4.1", + "id": "claude-opus-5-5", + "name": "Claude Opus 5.5", + "display_name": "Claude Opus 5.5", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1047576, - "output": 32768 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } }, "attachment": true, "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-04-14", - "last_updated": "2025-04-14", + "knowledge": "2026-06", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "anthropic-claude-opus-4.5", - "name": "Anthropic Claude Opus 4.5", - "display_name": "Anthropic Claude Opus 4.5", + "id": "claude-opus-4-6", + "name": "Claude Opus 4.6", + "display_name": "Claude Opus 4.6", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 8192 + "context": 1000000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -303319,7 +299964,8 @@ "effort_options": [ "low", "medium", - "high" + "high", + "max" ], "interleaved": true, "summaries": true, @@ -303328,54 +299974,27 @@ "thinking_blocks" ], "notes": [ - "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-05", - "release_date": "2025-11-24", - "last_updated": "2025-11-24", + "knowledge": "2025-05-31", + "release_date": "2026-02-05", + "last_updated": "2026-07-17", "type": "chat" }, { - "id": "openai-gpt-image-1.5", - "name": "OpenAI GPT Image 1.5", - "display_name": "OpenAI GPT Image 1.5", - "modalities": { - "input": [ - "text", - "image" - ], - "output": [ - "text", - "image" - ] - }, - "limit": { - "context": 8192, - "output": 16384 - }, - "temperature": false, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": false, - "release_date": "2025-11-25", - "last_updated": "2025-11-25" - }, - { - "id": "openai-gpt-5.2-pro", - "name": "OpenAI GPT-5.2 Pro", - "display_name": "OpenAI GPT-5.2 Pro", + "id": "gpt-5-codex", + "name": "GPT-5-Codex", + "display_name": "GPT-5-Codex", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" @@ -303393,113 +300012,107 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ "minimal", "low", "medium", "high" - ] + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2025-12-11", - "last_updated": "2025-12-11", - "type": "chat" - }, - { - "id": "deepseek-4-flash", - "name": "Deepseek V4 Flash", - "display_name": "Deepseek V4 Flash", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 1048576, - "output": 384000 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "knowledge": "2024-09-30", + "release_date": "2025-09-15", + "last_updated": "2025-09-15", "type": "chat" }, { - "id": "kimi-k2.6", - "name": "Kimi K2.6", - "display_name": "Kimi K2.6", + "id": "claude-opus-4-8", + "name": "Claude Opus 4.8", + "display_name": "Claude Opus 4.8", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1000000, + "output": 128000 }, "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], "interleaved": true, "summaries": true, - "visibility": "summary", + "visibility": "omitted", "continuation": [ "thinking_blocks" ], - "effort_options": [ - "none", - "low", - "medium", - "high" + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-20", - "last_updated": "2026-04-20", + "open_weights": false, + "knowledge": "2025-12-31", + "release_date": "2026-05-28", + "last_updated": "2026-05-28", "type": "chat" }, { - "id": "deepseek-3.2", - "name": "Deepseek 3.2", - "display_name": "Deepseek 3.2", + "id": "kimi-k2.7-code", + "name": "Kimi K2.7 Code", + "display_name": "Kimi K2.7 Code", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 163840, - "output": 163840 + "context": 262144, + "output": 262144 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -303513,38 +300126,33 @@ "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "effort_options": [ - "none", - "low", - "medium", - "high" ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2024-07", - "release_date": "2025-12-01", - "last_updated": "2025-12-01", + "knowledge": "2025-01", + "release_date": "2026-06-12", + "last_updated": "2026-06-12", "type": "chat" }, { - "id": "kimi-k3", - "name": "Kimi K3", - "display_name": "Kimi K3", + "id": "gpt-5-mini", + "name": "GPT-5 Mini", + "display_name": "GPT-5 Mini", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 400000, + "output": 128000 }, "temperature": false, "tool_call": true, @@ -303555,40 +300163,47 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ + "minimal", "low", - "high", - "max" - ] + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, - "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-16", + "open_weights": false, + "knowledge": "2024-05-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "openai-gpt-5.6-terra", - "name": "OpenAI GPT-5.6 Terra", - "display_name": "OpenAI GPT-5.6 Terra", + "id": "claude-opus-5", + "name": "Claude Opus 5", + "display_name": "Claude Opus 5", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1050000, + "context": 1000000, "output": 128000 }, "temperature": false, @@ -303599,8 +300214,8 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ - "none", "low", "medium", "high", @@ -303611,54 +300226,54 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "knowledge": "2026-05", + "release_date": "2026-07-24", + "last_updated": "2026-07-24", "type": "chat" }, { - "id": "gemma-4-31B-it", - "name": "Gemma 4", - "display_name": "Gemma 4", + "id": "grok-4-20-reasoning", + "name": "Grok 4.20 (Reasoning)", + "display_name": "Grok 4.20 (Reasoning)", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 256000, + "context": 262000, "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { "supported": true } }, - "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "attachment": false, + "open_weights": false, + "knowledge": "2025-09", + "release_date": "2026-04-08", + "last_updated": "2026-04-08", "type": "chat" }, { - "id": "openai-gpt-6-luna", - "name": "OpenAI GPT-6 Luna", - "display_name": "OpenAI GPT-6 Luna", + "id": "gpt-6-sol", + "name": "GPT-6 Sol", + "display_name": "GPT-6 Sol", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" @@ -303681,74 +300296,175 @@ "low", "medium", "high", - "xhigh" + "xhigh", + "max" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-05-18", + "knowledge": "2026-04-20", "release_date": "2026-09-22", "last_updated": "2026-09-22", "type": "chat" }, { - "id": "openai-gpt-5.4", - "name": "OpenAI GPT-5.4", - "display_name": "OpenAI GPT-5.4", + "id": "model-router", + "name": "Model Router", + "display_name": "Model Router", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 200000, + "output": 16384 + }, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": false, + "release_date": "2025-05-19", + "last_updated": "2025-11-18", + "type": "chat" + }, + { + "id": "gpt-3.5-turbo-0125", + "name": "GPT-3.5 Turbo 0125", + "display_name": "GPT-3.5 Turbo 0125", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 16384, + "output": 4096 + }, + "temperature": true, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": false, + "knowledge": "2021-08", + "release_date": "2024-01-25", + "last_updated": "2024-01-25", + "type": "chat" + }, + { + "id": "cohere-embed-v3-multilingual", + "name": "Embed v3 Multilingual", + "display_name": "Embed v3 Multilingual", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 512, + "output": 1024 + }, + "temperature": false, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "release_date": "2023-11-07", + "last_updated": "2023-11-07", + "type": "embedding" + }, + { + "id": "claude-opus-4-5", + "name": "Claude Opus 4.5", + "display_name": "Claude Opus 4.5", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 200000, + "output": 64000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", "effort_options": [ - "none", "low", "medium", - "high", - "xhigh" + "high" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-05", - "last_updated": "2026-03-05", + "knowledge": "2025-03-31", + "release_date": "2025-11-24", + "last_updated": "2025-08-01", "type": "chat" }, { - "id": "openai-o3", - "name": "OpenAI o3", - "display_name": "OpenAI o3", + "id": "gpt-5.4-pro", + "name": "GPT-5.4 Pro", + "display_name": "GPT-5.4 Pro", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 1050000, + "output": 128000 }, "temperature": false, "tool_call": true, @@ -303758,78 +300474,102 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", "effort_options": [ + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ "low", "medium", "high" - ] + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2024-05", - "release_date": "2025-04-16", - "last_updated": "2025-04-16", + "knowledge": "2025-08-31", + "release_date": "2026-03-05", + "last_updated": "2026-03-05", "type": "chat" }, { - "id": "openai-o1", - "name": "OpenAI o1", - "display_name": "OpenAI o1", + "id": "gpt-5.1-codex-max", + "name": "GPT-5.1 Codex Max", + "display_name": "GPT-5.1 Codex Max", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 400000, + "output": 128000 }, "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", "effort_options": [ + "none", "low", "medium", "high" - ] + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2023-09", - "release_date": "2024-12-05", - "last_updated": "2024-12-05", + "knowledge": "2024-09-30", + "release_date": "2025-11-13", + "last_updated": "2025-11-13", "type": "chat" }, { - "id": "nemotron-3-nano-omni", - "name": "Nemotron 3 Nano Omni", - "display_name": "Nemotron 3 Nano Omni", + "id": "claude-haiku-5-5", + "name": "Claude Haiku 5.5", + "display_name": "Claude Haiku 5.5", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 65536, - "output": 65536 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -303838,28 +300578,30 @@ "extra_capabilities": { "reasoning": { "effort_options": [ - "none", "low", "medium", "high", + "xhigh", "max" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-04-28", - "last_updated": "2026-04-28", + "open_weights": false, + "knowledge": "2026-06", + "release_date": "2026-10-07", + "last_updated": "2026-10-07", "type": "chat" }, { - "id": "openai-gpt-5-nano", - "name": "OpenAI GPT-5 Nano", - "display_name": "OpenAI GPT-5 Nano", + "id": "gpt-5", + "name": "GPT-5", + "display_name": "GPT-5", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" @@ -303877,28 +300619,40 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ "minimal", "low", "medium", "high" - ] + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2024-05-30", + "knowledge": "2024-09-30", "release_date": "2025-08-07", "last_updated": "2025-08-07", "type": "chat" }, { - "id": "mimo-v2.5-pro", - "name": "MiMo V2.5 Pro", - "display_name": "MiMo V2.5 Pro", + "id": "kimi-k2.6", + "name": "Kimi K2.6", + "display_name": "Kimi K2.6", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" @@ -303917,40 +300671,32 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "none", - "high" - ] + "interleaved": true } }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2024-12", - "release_date": "2026-04-22", - "last_updated": "2026-04-22", + "knowledge": "2025-01", + "release_date": "2026-04-20", + "last_updated": "2026-04-20", "type": "chat" }, { - "id": "openai-gpt-5.4-mini", - "name": "OpenAI GPT-5.4 Mini", - "display_name": "OpenAI GPT-5.4 Mini", + "id": "gpt-6.1-sol", + "name": "GPT-6.1 Sol", + "display_name": "GPT-6.1 Sol", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 400000, + "context": 1050000, "output": 128000 }, "temperature": false, @@ -303962,78 +300708,71 @@ "extra_capabilities": { "reasoning": { "effort_options": [ - "none", "low", "medium", "high", - "xhigh" + "xhigh", + "max" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-17", - "last_updated": "2026-03-17", + "knowledge": "2026-04-30", + "release_date": "2026-09-29", + "last_updated": "2026-09-29", "type": "chat" }, { - "id": "openai-gpt-5.5", - "name": "OpenAI GPT-5.5", - "display_name": "OpenAI GPT-5.5", + "id": "grok-4-20-non-reasoning", + "name": "Grok 4.20 (Non-Reasoning)", + "display_name": "Grok 4.20 (Non-Reasoning)", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 262000, + "output": 8192 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": true }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ] + "supported": true } }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-12-01", - "release_date": "2026-04-23", - "last_updated": "2026-04-23", + "knowledge": "2025-09", + "release_date": "2026-04-08", + "last_updated": "2026-04-08", "type": "chat" }, { - "id": "openai-o3-mini", - "name": "OpenAI o3 mini", - "display_name": "OpenAI o3 mini", + "id": "gpt-5.2-codex", + "name": "GPT-5.2 Codex", + "display_name": "GPT-5.2 Codex", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 400000, + "output": 128000 }, "temperature": false, "tool_call": true, @@ -304043,55 +300782,41 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ "low", "medium", "high" - ] + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2024-05", - "release_date": "2024-12-20", - "last_updated": "2025-01-29", + "knowledge": "2025-08-31", + "release_date": "2026-01-14", + "last_updated": "2026-01-14", "type": "chat" }, { - "id": "all-mini-lm-l6-v2", - "name": "All-MiniLM-L6-v2", - "display_name": "All-MiniLM-L6-v2", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 256, - "output": 384 - }, - "temperature": false, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": true, - "release_date": "2021-08-30", - "last_updated": "2021-08-30", - "type": "embedding" - }, - { - "id": "openai-gpt-5.2", - "name": "OpenAI GPT-5.2", - "display_name": "OpenAI GPT-5.2", + "id": "gpt-5.2", + "name": "GPT-5.2", + "display_name": "GPT-5.2", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" @@ -304105,16 +300830,28 @@ "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", "effort_options": [ - "minimal", + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ "low", "medium", "high" - ] + ], + "visibility": "hidden" } }, "attachment": true, @@ -304125,13 +300862,14 @@ "type": "chat" }, { - "id": "anthropic-claude-fable-5.1", - "name": "Anthropic Claude Fable 5.1", - "display_name": "Anthropic Claude Fable 5.1", + "id": "claude-sonnet-5-5", + "name": "Claude Sonnet 5.5", + "display_name": "Claude Sonnet 5.5", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" @@ -304149,94 +300887,67 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", "effort_options": [ "low", "medium", "high", "xhigh", "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", - "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", - "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." ] } }, "attachment": true, "open_weights": false, "knowledge": "2026-06", - "release_date": "2026-09-01", - "last_updated": "2026-09-01", + "release_date": "2026-09-28", + "last_updated": "2026-09-28", "type": "chat" }, { - "id": "deepseek-v4.1-flash-1017", - "name": "DeepSeek V4.1 Flash 1017", - "display_name": "DeepSeek V4.1 Flash 1017", + "id": "phi-4-reasoning", + "name": "Phi-4-reasoning", + "display_name": "Phi-4-reasoning", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 1048576 + "context": 32000, + "output": 4096 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "high", - "xhigh", - "max" - ] - } - }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-10-17", - "last_updated": "2026-10-17", + "knowledge": "2023-10", + "release_date": "2024-12-11", + "last_updated": "2024-12-11", "type": "chat" }, { - "id": "openai-gpt-image-2", - "name": "OpenAI GPT Image 2", - "display_name": "OpenAI GPT Image 2", + "id": "gpt-image-1", + "name": "GPT-Image-1", + "display_name": "GPT-Image-1", "modalities": { "input": [ "text", "image" ], "output": [ - "image", - "text" + "image" ] }, "limit": { "context": 8192, - "output": 16384 + "output": 8192 }, "temperature": false, "tool_call": false, @@ -304245,26 +300956,28 @@ }, "attachment": true, "open_weights": false, - "release_date": "2026-04-21", - "last_updated": "2026-04-21" + "release_date": "2025-04-24", + "last_updated": "2025-04-24" }, { - "id": "glm-5.2", - "name": "GLM-5.2", - "display_name": "GLM-5.2", + "id": "gpt-5-pro", + "name": "GPT-5 Pro", + "display_name": "GPT-5 Pro", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 131072 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -304273,96 +300986,101 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ + "default_enabled": true, + "mode": "fixed", + "effort": "high", + "verbosity": "medium", + "verbosity_options": [ + "low", "medium", - "high", - "xhigh" - ] + "high" + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "attachment": true, + "open_weights": false, + "knowledge": "2024-09-30", + "release_date": "2025-10-06", + "last_updated": "2025-10-06", "type": "chat" }, { - "id": "wan2-2-t2v-a14b", - "name": "Wan2.2-T2V-A14B", - "display_name": "Wan2.2-T2V-A14B", + "id": "cohere-command-a", + "name": "Command A", + "display_name": "Command A", "modalities": { "input": [ "text" ], "output": [ - "video" + "text" ] }, "limit": { - "context": 100, - "output": 1 + "context": 131072, + "output": 8192 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": false, "open_weights": true, - "release_date": "2025-07-28", - "last_updated": "2026-04-30" + "knowledge": "2024-06-01", + "release_date": "2025-03-13", + "last_updated": "2025-03-13", + "type": "chat" }, { - "id": "bge-m3", - "name": "BGE M3", - "display_name": "BGE M3", + "id": "cohere-embed-v-4-0", + "name": "Embed v4", + "display_name": "Embed v4", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 8192, - "output": 1024 + "context": 128000, + "output": 1536 }, "temperature": false, "tool_call": false, "reasoning": { "supported": false }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2024-01-30", - "last_updated": "2024-01-30", + "release_date": "2025-04-15", + "last_updated": "2025-04-15", "type": "embedding" }, { - "id": "deepseek-v4.1-flash", - "name": "DeepSeek V4.1 Flash", - "display_name": "DeepSeek V4.1 Flash", + "id": "claude-sonnet-5", + "name": "Claude Sonnet 5", + "display_name": "Claude Sonnet 5", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 1048576 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -304373,6 +301091,7 @@ "supported": true, "effort_options": [ "low", + "medium", "high", "xhigh", "max" @@ -304380,29 +301099,31 @@ } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-09-10", - "last_updated": "2026-09-10", + "open_weights": false, + "knowledge": "2026-01-31", + "release_date": "2026-06-30", + "last_updated": "2026-06-30", "type": "chat" }, { - "id": "glm-5.3-flash", - "name": "GLM5.3 Flash", - "display_name": "GLM5.3 Flash", + "id": "o3", + "name": "o3", + "display_name": "o3", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 200000, + "output": 100000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -304411,25 +301132,28 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ "low", "medium", - "high", - "xhigh", - "max" - ] + "high" + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", + "attachment": true, + "open_weights": false, + "knowledge": "2024-05", + "release_date": "2025-04-16", + "last_updated": "2025-04-16", "type": "chat" }, { - "id": "nemotron-3-ultra-550b", - "name": "Nemotron 3 Ultra", - "display_name": "Nemotron 3 Ultra", + "id": "deepseek-v4-pro", + "name": "DeepSeek-V4-Pro", + "display_name": "DeepSeek-V4-Pro", "modalities": { "input": [ "text" @@ -304439,170 +301163,170 @@ ] }, "limit": { - "context": 131072, - "output": 131072 + "context": 1000000, + "output": 384000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "high", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." + ] + } }, "attachment": false, "open_weights": true, - "knowledge": "2025-09", - "release_date": "2026-06-04", - "last_updated": "2026-06-04", + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "stable-diffusion-3.5-large", - "name": "Stable Diffusion 3.5 Large", - "display_name": "Stable Diffusion 3.5 Large", + "id": "llama-3.3-70b-instruct", + "name": "Llama-3.3-70B-Instruct", + "display_name": "Llama-3.3-70B-Instruct", "modalities": { "input": [ "text" ], "output": [ - "image" + "text" ] }, "limit": { - "context": 256, - "output": 1 + "context": 128000, + "output": 32768 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": false }, "attachment": false, "open_weights": true, - "release_date": "2024-10-22", - "last_updated": "2026-04-30" - }, - { - "id": "openai-gpt-5.4-pro", - "name": "OpenAI GPT-5.4 Pro", - "display_name": "OpenAI GPT-5.4 Pro", - "modalities": { - "input": [ - "text", - "image" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 1050000, - "output": 128000 - }, - "temperature": false, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "medium", - "high", - "xhigh" - ] - } - }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-05", - "last_updated": "2026-03-05", + "knowledge": "2023-12", + "release_date": "2024-12-06", + "last_updated": "2024-12-06", "type": "chat" }, { - "id": "openai-gpt-5.6-luna", - "name": "OpenAI GPT-5.6 Luna", - "display_name": "OpenAI GPT-5.6 Luna", + "id": "gpt-5.4-nano", + "name": "GPT-5.4 Nano", + "display_name": "GPT-5.4 Nano", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1050000, + "context": 400000, "output": 128000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", "effort_options": [ "none", "low", "medium", "high", - "xhigh", - "max" - ] + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "knowledge": "2025-08-31", + "release_date": "2026-03-17", + "last_updated": "2026-03-17", "type": "chat" }, { - "id": "qwen3-tts-voicedesign", - "name": "Qwen3 TTS VoiceDesign", - "display_name": "Qwen3 TTS VoiceDesign", + "id": "ministral-3b", + "name": "Ministral 3B", + "display_name": "Ministral 3B", "modalities": { "input": [ "text" ], "output": [ - "audio" + "text" ] }, "limit": { - "context": 32768, - "output": 1 + "context": 128000, + "output": 8192 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": false }, "attachment": false, "open_weights": true, - "release_date": "2026-04-21", - "last_updated": "2026-04-30" + "knowledge": "2024-03", + "release_date": "2024-10-22", + "last_updated": "2024-10-22", + "type": "chat" }, { - "id": "anthropic-claude-opus-5", - "name": "Anthropic Claude Opus 5", - "display_name": "Anthropic Claude Opus 5", + "id": "o1", + "name": "o1", + "display_name": "o1", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 200000, + "output": 100000 }, "temperature": false, "tool_call": true, @@ -304612,40 +301336,42 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", "effort_options": [ "low", "medium", - "high", - "xhigh", - "max" - ] + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2026-05", - "release_date": "2026-07-24", - "last_updated": "2026-07-24", + "knowledge": "2023-09", + "release_date": "2024-12-05", + "last_updated": "2024-12-05", "type": "chat" }, { - "id": "openai-gpt-5.3-codex", - "name": "OpenAI GPT-5.3 Codex", - "display_name": "OpenAI GPT-5.3 Codex", + "id": "deepseek-v3.2", + "name": "DeepSeek-V3.2", + "display_name": "DeepSeek-V3.2", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, + "context": 128000, "output": 128000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -304653,126 +301379,83 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ] + "supported": true } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-05", - "last_updated": "2026-02-05", + "attachment": false, + "open_weights": true, + "knowledge": "2024-07", + "release_date": "2025-12-01", + "last_updated": "2025-12-01", "type": "chat" }, { - "id": "anthropic-claude-5.5-haiku", - "name": "Anthropic Claude 5.5 Haiku", - "display_name": "Anthropic Claude 5.5 Haiku", + "id": "phi-4-mini-reasoning", + "name": "Phi-4-mini-reasoning", + "display_name": "Phi-4-mini-reasoning", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 128000, + "output": 4096 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ] - } - }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-06", - "release_date": "2026-10-07", - "last_updated": "2026-10-07", + "attachment": false, + "open_weights": true, + "knowledge": "2023-10", + "release_date": "2024-12-11", + "last_updated": "2024-12-11", "type": "chat" }, { - "id": "anthropic-claude-opus-4.7", - "name": "Anthropic Claude Opus 4.7", - "display_name": "Anthropic Claude Opus 4.7", + "id": "phi-4-multimodal", + "name": "Phi-4-multimodal", + "display_name": "Phi-4-multimodal", "modalities": { "input": [ "text", - "image" + "image", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 8192 + "context": 128000, + "output": 4096 }, - "temperature": false, - "tool_call": true, + "temperature": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." - ] - } + "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-04-16", - "last_updated": "2026-04-16", + "open_weights": true, + "knowledge": "2023-10", + "release_date": "2024-12-11", + "last_updated": "2024-12-11", "type": "chat" }, { - "id": "mistral-3-14B", - "name": "Ministral 3 14B", - "display_name": "Ministral 3 14B", + "id": "kimi-k2.5", + "name": "Kimi K2.5", + "display_name": "Kimi K2.5", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" @@ -304780,104 +301463,118 @@ }, "limit": { "context": 262144, - "output": 128000 + "output": 262144 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": true, "open_weights": true, - "release_date": "2025-12-02", - "last_updated": "2025-12-02", + "knowledge": "2025-01", + "release_date": "2026-01-27", + "last_updated": "2026-01-27", "type": "chat" }, { - "id": "fal-ai/fast-sdxl", - "name": "Fast SDXL", - "display_name": "Fast SDXL", + "id": "text-embedding-ada-002", + "name": "text-embedding-ada-002", + "display_name": "text-embedding-ada-002", "modalities": { "input": [ "text" ], "output": [ - "image" - ] - }, - "limit": { - "context": 8192, - "output": 8192 - }, - "temperature": false, - "tool_call": false, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": true, - "release_date": "2023-07-26", - "last_updated": "2026-04-16" - }, - { - "id": "fal-ai/elevenlabs/tts/multilingual-v2", - "name": "ElevenLabs Multilingual TTS v2", - "display_name": "ElevenLabs Multilingual TTS v2", - "modalities": { - "input": [ "text" - ], - "output": [ - "audio" ] }, "limit": { "context": 8192, - "output": 8192 + "output": 1536 }, - "temperature": false, "tool_call": false, "reasoning": { "supported": false }, "attachment": false, "open_weights": false, - "release_date": "2023-08-22", - "last_updated": "2023-08-22" + "release_date": "2022-12-15", + "last_updated": "2022-12-15", + "type": "embedding" }, { - "id": "fal-ai/stable-audio-25/text-to-audio", - "name": "Stable Audio 2.5 (Text-to-Audio)", - "display_name": "Stable Audio 2.5 (Text-to-Audio)", + "id": "gpt-5.5", + "name": "GPT-5.5", + "display_name": "GPT-5.5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ - "audio" + "text" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 1050000, + "output": 128000 }, "temperature": false, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, "open_weights": false, - "release_date": "2025-10-08", - "last_updated": "2026-04-16" + "knowledge": "2025-12-01", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", + "type": "chat" }, { - "id": "fal-ai/flux/schnell", - "name": "FLUX.1 [schnell]", - "display_name": "FLUX.1 [schnell]", + "id": "gpt-image-2", + "name": "GPT-Image-2", + "display_name": "GPT-Image-2", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "image" @@ -304892,24 +301589,15 @@ "reasoning": { "supported": false }, - "attachment": false, - "open_weights": true, - "release_date": "2024-08-01", - "last_updated": "2026-04-16" - } - ] - }, - "helicone": { - "id": "helicone", - "name": "Helicone", - "display_name": "Helicone", - "api": "https://ai-gateway.helicone.ai/v1", - "doc": "https://helicone.ai/models", - "models": [ + "attachment": true, + "open_weights": false, + "release_date": "2026-04-21", + "last_updated": "2026-04-21" + }, { - "id": "llama-3.3-70b-instruct", - "name": "Meta Llama 3.3 70B Instruct", - "display_name": "Meta Llama 3.3 70B Instruct", + "id": "text-embedding-3-large", + "name": "text-embedding-3-large", + "display_name": "text-embedding-3-large", "modalities": { "input": [ "text" @@ -304919,54 +301607,63 @@ ] }, "limit": { - "context": 128000, - "output": 16400 + "context": 8192, + "output": 3072 }, - "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, "attachment": false, - "open_weights": true, - "knowledge": "2024-12", - "release_date": "2024-12-06", - "last_updated": "2024-12-06", - "type": "chat" + "open_weights": false, + "release_date": "2024-01-25", + "last_updated": "2024-01-25", + "type": "embedding" }, { - "id": "llama-4-maverick", - "name": "Meta Llama 4 Maverick 17B 128E", - "display_name": "Meta Llama 4 Maverick 17B 128E", + "id": "codex-mini", + "name": "Codex Mini", + "display_name": "Codex Mini", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 200000, + "output": 100000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "high" + ] + } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2025-04-05", - "last_updated": "2025-04-05", + "open_weights": false, + "knowledge": "2024-04", + "release_date": "2025-05-16", + "last_updated": "2025-05-16", "type": "chat" }, { - "id": "sonar-reasoning", - "name": "Perplexity Sonar Reasoning", - "display_name": "Perplexity Sonar Reasoning", + "id": "phi-4", + "name": "Phi-4", + "display_name": "Phi-4", "modalities": { "input": [ "text" @@ -304976,77 +301673,84 @@ ] }, "limit": { - "context": 127000, + "context": 128000, "output": 4096 }, "temperature": true, "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "knowledge": "2023-10", + "release_date": "2024-12-11", + "last_updated": "2024-12-11", + "type": "chat" + }, + { + "id": "deepseek-v3.2-speciale", + "name": "DeepSeek-V3.2-Speciale", + "display_name": "DeepSeek-V3.2-Speciale", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 128000, + "output": 128000 + }, + "temperature": true, + "tool_call": false, "reasoning": { "supported": true, "default": true }, "attachment": false, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-01-27", - "last_updated": "2025-01-27", + "open_weights": true, + "knowledge": "2024-07", + "release_date": "2025-12-01", + "last_updated": "2025-12-01", "type": "chat" }, { - "id": "claude-haiku-4-5-20251001", - "name": "Anthropic: Claude 4.5 Haiku (20251001)", - "display_name": "Anthropic: Claude 4.5 Haiku (20251001)", + "id": "gpt-4.1-mini", + "name": "GPT-4.1 mini", + "display_name": "GPT-4.1 mini", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 8192 + "context": 1047576, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." - ] - } + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2025-10", - "release_date": "2025-10-15", - "last_updated": "2025-10-15", + "knowledge": "2024-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", "type": "chat" }, { - "id": "grok-3-mini", - "name": "xAI Grok 3 Mini", - "display_name": "xAI Grok 3 Mini", + "id": "codestral-2501", + "name": "Codestral 25.01", + "display_name": "Codestral 25.01", "modalities": { "input": [ "text" @@ -305056,8 +301760,8 @@ ] }, "limit": { - "context": 131072, - "output": 131072 + "context": 256000, + "output": 256000 }, "temperature": true, "tool_call": true, @@ -305066,77 +301770,70 @@ }, "attachment": false, "open_weights": false, - "knowledge": "2024-06", - "release_date": "2024-06-01", - "last_updated": "2024-06-01", + "knowledge": "2024-03", + "release_date": "2025-01-01", + "last_updated": "2025-01-01", "type": "chat" }, { - "id": "glm-4.6", - "name": "Zai GLM-4.6", - "display_name": "Zai GLM-4.6", + "id": "grok-4-1-fast-non-reasoning", + "name": "Grok 4.1 Fast (Non-Reasoning)", + "display_name": "Grok 4.1 Fast (Non-Reasoning)", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 128000, + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-07", - "release_date": "2025-09-30", - "last_updated": "2025-09-30", + "attachment": true, + "open_weights": false, + "release_date": "2025-06-27", + "last_updated": "2025-06-27", "type": "chat" }, { - "id": "qwen3-next-80b-a3b-instruct", - "name": "Qwen3 Next 80B A3B Instruct", - "display_name": "Qwen3 Next 80B A3B Instruct", + "id": "gpt-image-2.5-sunburst", + "name": "GPT Image 2.5 Sunburst", + "display_name": "GPT Image 2.5 Sunburst", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ - "text" + "image" ] }, "limit": { - "context": 262000, - "output": 16384 + "context": 8192, + "output": 8192 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { "supported": false }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2025-09", - "last_updated": "2025-09", - "type": "chat" + "attachment": true, + "open_weights": false, + "release_date": "2026-09-08", + "last_updated": "2026-09-08" }, { - "id": "deepseek-v3.1-terminus", - "name": "DeepSeek V3.1 Terminus", - "display_name": "DeepSeek V3.1 Terminus", + "id": "o3-mini", + "name": "o3-mini", + "display_name": "o3-mini", "modalities": { "input": [ "text" @@ -305146,115 +301843,164 @@ ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 200000, + "output": 100000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, "attachment": false, "open_weights": false, - "knowledge": "2025-09", - "release_date": "2025-09-22", - "last_updated": "2025-09-22", + "knowledge": "2024-05", + "release_date": "2024-12-20", + "last_updated": "2025-01-29", "type": "chat" }, { - "id": "qwen3-coder-30b-a3b-instruct", - "name": "Qwen3 Coder 30B A3B Instruct", - "display_name": "Qwen3 Coder 30B A3B Instruct", + "id": "o4-mini", + "name": "o4-mini", + "display_name": "o4-mini", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 200000, + "output": 100000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-07", - "release_date": "2025-07-31", - "last_updated": "2025-07-31", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2024-05", + "release_date": "2025-04-16", + "last_updated": "2025-04-16", "type": "chat" }, { - "id": "llama-3.3-70b-versatile", - "name": "Meta Llama 3.3 70B Versatile", - "display_name": "Meta Llama 3.3 70B Versatile", + "id": "gpt-4o-mini", + "name": "GPT-4o mini", + "display_name": "GPT-4o mini", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 32678 + "context": 128000, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-12", - "release_date": "2024-12-06", - "last_updated": "2024-12-06", + "attachment": true, + "open_weights": false, + "knowledge": "2023-09", + "release_date": "2024-07-18", + "last_updated": "2024-07-18", "type": "chat" }, { - "id": "claude-3-haiku-20240307", - "name": "Anthropic: Claude 3 Haiku", - "display_name": "Anthropic: Claude 3 Haiku", + "id": "gpt-6-astra", + "name": "GPT-6 Astra", + "display_name": "GPT-6 Astra", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 4096 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ] + } }, "attachment": true, "open_weights": false, - "knowledge": "2024-03", - "release_date": "2024-03-13", - "last_updated": "2024-03-13", + "knowledge": "2026-04-30", + "release_date": "2026-09-04", + "last_updated": "2026-09-04", "type": "chat" }, { "id": "gpt-5-nano", - "name": "OpenAI GPT-5 Nano", - "display_name": "OpenAI GPT-5 Nano", + "name": "GPT-5 Nano", + "display_name": "GPT-5 Nano", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" @@ -305293,27 +302039,28 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", + "knowledge": "2024-05-30", "release_date": "2025-08-07", "last_updated": "2025-08-07", "type": "chat" }, { - "id": "claude-4.5-sonnet", - "name": "Anthropic: Claude Sonnet 4.5", - "display_name": "Anthropic: Claude Sonnet 4.5", + "id": "grok-4.7", + "name": "Grok 4.7", + "display_name": "Grok 4.7", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 500000, + "output": 500000 }, "temperature": true, "tool_call": true, @@ -305321,17 +302068,36 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "high", + "xhigh" + ] + } + }, "attachment": true, "open_weights": false, - "knowledge": "2025-09", - "release_date": "2025-09-29", - "last_updated": "2025-09-29", + "knowledge": "2026-05", + "release_date": "2026-09-21", + "last_updated": "2026-09-21", "type": "chat" - }, + } + ] + }, + "stepfun-ai-step-plan": { + "id": "stepfun-ai-step-plan", + "name": "StepFun Step Plan (Global)", + "display_name": "StepFun Step Plan (Global)", + "api": "https://api.stepfun.ai/step_plan/v1", + "doc": "https://platform.stepfun.ai/docs/en/step-plan/integrations/reasoning-api", + "models": [ { - "id": "deepseek-reasoner", - "name": "DeepSeek Reasoner", - "display_name": "DeepSeek Reasoner", + "id": "step-3.5-flash-2603", + "name": "Step 3.5 Flash 2603", + "display_name": "Step 3.5 Flash 2603", "modalities": { "input": [ "text" @@ -305341,11 +302107,11 @@ ] }, "limit": { - "context": 128000, - "output": 64000 + "context": 256000, + "output": 256000 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, "default": true @@ -305358,147 +302124,218 @@ "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "effort_options": [ + "low", + "high" ] } }, "attachment": false, "open_weights": true, "knowledge": "2025-01", - "release_date": "2025-12-01", - "last_updated": "2026-02-28", + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "llama-3.1-8b-instant", - "name": "Meta Llama 3.1 8B Instant", - "display_name": "Meta Llama 3.1 8B Instant", + "id": "step-5-preview", + "name": "Step 5 Preview", + "display_name": "Step 5 Preview", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 32678 + "context": 1000000, + "output": 384000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": true, "open_weights": true, - "knowledge": "2024-07", - "release_date": "2024-07-23", - "last_updated": "2024-07-23", + "release_date": "2026-09-16", + "last_updated": "2026-09-20", "type": "chat" }, { - "id": "gpt-5-chat-latest", - "name": "OpenAI GPT-5 Chat Latest", - "display_name": "OpenAI GPT-5 Chat Latest", + "id": "step-3.7-flash", + "name": "Step 3.7 Flash", + "display_name": "Step 3.7 Flash", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 256000, + "output": 256000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "low", + "medium", + "high" + ] + } }, "attachment": true, - "open_weights": false, - "knowledge": "2024-09", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "open_weights": true, + "knowledge": "2026-03-01", + "release_date": "2026-05-29", + "last_updated": "2026-05-29", "type": "chat" }, { - "id": "gpt-4o", - "name": "OpenAI GPT-4o", - "display_name": "OpenAI GPT-4o", + "id": "step-3.5-flash", + "name": "Step 3.5 Flash", + "display_name": "Step 3.5 Flash", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 256000, + "output": 256000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-05", - "release_date": "2024-05-13", - "last_updated": "2024-08-06", + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "low", + "high" + ] + } + }, + "attachment": false, + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-01-29", + "last_updated": "2026-02-13", "type": "chat" - }, + } + ] + }, + "anyapi": { + "id": "anyapi", + "name": "AnyAPI", + "display_name": "AnyAPI", + "api": "https://api.anyapi.ai/v1", + "doc": "https://docs.anyapi.ai", + "models": [ { - "id": "gpt-4.1-mini-2025-04-14", - "name": "OpenAI GPT-4.1 Mini", - "display_name": "OpenAI GPT-4.1 Mini", + "id": "xai/grok-4.3", + "name": "Grok 4.3", + "display_name": "Grok 4.3", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1047576, - "output": 32768 + "context": 1000000, + "output": 30000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": true, "open_weights": false, - "knowledge": "2025-04", - "release_date": "2025-04-14", - "last_updated": "2025-04-14", + "release_date": "2026-04-17", + "last_updated": "2026-04-17", "type": "chat" }, { - "id": "grok-4-fast-reasoning", - "name": "xAI: Grok 4 Fast Reasoning", - "display_name": "xAI: Grok 4 Fast Reasoning", + "id": "deepseek/deepseek-v4-flash", + "name": "DeepSeek V4 Flash", + "display_name": "DeepSeek V4 Flash", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 2000000, - "output": 2000000 + "context": 1000000, + "output": 384000 }, "temperature": true, "tool_call": true, @@ -305506,17 +302343,39 @@ "supported": true, "default": true }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-09", - "release_date": "2025-12-18", - "last_updated": "2025-12-18", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "high", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." + ] + } + }, + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "kimi-k2-0905", - "name": "Kimi K2 (09/05)", - "display_name": "Kimi K2 (09/05)", + "id": "deepseek/deepseek-chat", + "name": "DeepSeek Chat", + "display_name": "DeepSeek Chat", "modalities": { "input": [ "text" @@ -305526,8 +302385,8 @@ ] }, "limit": { - "context": 262144, - "output": 16384 + "context": 1000000, + "output": 384000 }, "temperature": true, "tool_call": true, @@ -305537,14 +302396,14 @@ "attachment": false, "open_weights": true, "knowledge": "2025-09", - "release_date": "2025-09-05", - "last_updated": "2025-09-05", + "release_date": "2025-12-01", + "last_updated": "2026-02-28", "type": "chat" }, { - "id": "gemma2-9b-it", - "name": "Google Gemma 2", - "display_name": "Google Gemma 2", + "id": "deepseek/deepseek-r1", + "name": "DeepSeek Reasoner", + "display_name": "DeepSeek Reasoner", "modalities": { "input": [ "text" @@ -305554,67 +302413,154 @@ ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 1000000, + "output": 384000 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, - "open_weights": false, - "knowledge": "2024-06", - "release_date": "2024-06-25", - "last_updated": "2024-06-25", + "open_weights": true, + "knowledge": "2025-09", + "release_date": "2025-12-01", + "last_updated": "2026-02-28", "type": "chat" }, { - "id": "claude-3.5-haiku", - "name": "Anthropic: Claude 3.5 Haiku", - "display_name": "Anthropic: Claude 3.5 Haiku", + "id": "deepseek/deepseek-v4-pro", + "name": "DeepSeek V4 Pro", + "display_name": "DeepSeek V4 Pro", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1000000, + "output": 384000 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "high", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." + ] + } + }, + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", + "type": "chat" + }, + { + "id": "openai/gpt-5.4", + "name": "GPT-5.4", + "display_name": "GPT-5.4", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 8192 + "context": 1050000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } }, "attachment": true, "open_weights": false, - "knowledge": "2024-10", - "release_date": "2024-10-22", - "last_updated": "2024-10-22", + "knowledge": "2025-08-31", + "release_date": "2026-03-05", + "last_updated": "2026-03-05", "type": "chat" }, { - "id": "qwen3-vl-235b-a22b-instruct", - "name": "Qwen3 VL 235B A22B Instruct", - "display_name": "Qwen3 VL 235B A22B Instruct", + "id": "openai/gpt-4.1", + "name": "GPT-4.1", + "display_name": "GPT-4.1", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 16384 + "context": 1047576, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -305622,16 +302568,16 @@ "supported": false }, "attachment": true, - "open_weights": true, - "knowledge": "2025-09", - "release_date": "2025-09-23", - "last_updated": "2025-09-23", + "open_weights": false, + "knowledge": "2024-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", "type": "chat" }, { - "id": "gemini-2.5-pro", - "name": "Google Gemini 2.5 Pro", - "display_name": "Google Gemini 2.5 Pro", + "id": "openai/gpt-5.1", + "name": "GPT-5.1", + "display_name": "GPT-5.1", "modalities": { "input": [ "text", @@ -305642,11 +302588,62 @@ ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 400000, + "output": 128000 }, "temperature": true, "tool_call": true, + "reasoning": { + "supported": true, + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2024-09-30", + "release_date": "2025-11-13", + "last_updated": "2025-11-13", + "type": "chat" + }, + { + "id": "openai/gpt-5-mini", + "name": "GPT-5 Mini", + "display_name": "GPT-5 Mini", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 400000, + "output": 128000 + }, + "temperature": false, + "tool_call": true, "reasoning": { "supported": true, "default": true @@ -305655,73 +302652,152 @@ "reasoning": { "supported": true, "default_enabled": true, - "mode": "budget", - "budget": { - "default": -1, - "min": 128, - "max": 32768, - "auto": -1, - "unit": "tokens" - }, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] + "mode": "effort", + "effort": "medium", + "effort_options": [ + "minimal", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2025-06", - "release_date": "2025-06-17", - "last_updated": "2025-06-17", + "knowledge": "2024-05-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "deepseek-tng-r1t2-chimera", - "name": "DeepSeek TNG R1T2 Chimera", - "display_name": "DeepSeek TNG R1T2 Chimera", + "id": "openai/gpt-5", + "name": "GPT-5", + "display_name": "GPT-5", "modalities": { "input": [ + "text", + "image" + ], + "output": [ "text" + ] + }, + "limit": { + "context": 400000, + "output": 128000 + }, + "temperature": false, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "minimal", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2024-09-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", + "type": "chat" + }, + { + "id": "openai/gpt-5.2", + "name": "GPT-5.2", + "display_name": "GPT-5.2", + "modalities": { + "input": [ + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 130000, - "output": 163840 + "context": 400000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false }, - "attachment": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, "open_weights": false, - "knowledge": "2025-07", - "release_date": "2025-07-02", - "last_updated": "2025-07-02", + "knowledge": "2025-08-31", + "release_date": "2025-12-11", + "last_updated": "2025-12-11", "type": "chat" }, { - "id": "kimi-k2-thinking", - "name": "Kimi K2 Thinking", - "display_name": "Kimi K2 Thinking", + "id": "openai/o3", + "name": "o3", + "display_name": "o3", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 262144 + "context": 200000, + "output": 100000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -305730,37 +302806,41 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-11", - "release_date": "2025-11-06", - "last_updated": "2025-11-06", + "attachment": true, + "open_weights": false, + "knowledge": "2024-05", + "release_date": "2025-04-16", + "last_updated": "2025-04-16", "type": "chat" }, - { - "id": "chatgpt-4o-latest", - "name": "OpenAI ChatGPT-4o", - "display_name": "OpenAI ChatGPT-4o", + { + "id": "openai/gpt-4.1-mini", + "name": "GPT-4.1 mini", + "display_name": "GPT-4.1 mini", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 1047576, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -305769,15 +302849,15 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2024-08", - "release_date": "2024-08-14", - "last_updated": "2024-08-14", + "knowledge": "2024-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", "type": "chat" }, { - "id": "o3-mini", - "name": "OpenAI o3 Mini", - "display_name": "OpenAI o3 Mini", + "id": "openai/o3-mini", + "name": "o3-mini", + "display_name": "o3-mini", "modalities": { "input": [ "text" @@ -305812,15 +302892,15 @@ }, "attachment": false, "open_weights": false, - "knowledge": "2023-10", + "knowledge": "2024-05", "release_date": "2024-12-20", "last_updated": "2025-01-29", "type": "chat" }, { - "id": "o3", - "name": "OpenAI o3", - "display_name": "OpenAI o3", + "id": "openai/o4-mini", + "name": "o4-mini", + "display_name": "o4-mini", "modalities": { "input": [ "text", @@ -305856,47 +302936,79 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2024-06", + "knowledge": "2024-05", "release_date": "2025-04-16", "last_updated": "2025-04-16", "type": "chat" }, { - "id": "llama-prompt-guard-2-86m", - "name": "Meta Llama Prompt Guard 2 86M", - "display_name": "Meta Llama Prompt Guard 2 86M", + "id": "perplexity/sonar-reasoning-pro", + "name": "Sonar Reasoning Pro", + "display_name": "Sonar Reasoning Pro", "modalities": { "input": [ + "text", + "image" + ], + "output": [ "text" + ] + }, + "limit": { + "context": 128000, + "output": 4096 + }, + "temperature": true, + "tool_call": false, + "reasoning": { + "supported": true, + "default": true + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-09-01", + "release_date": "2024-01-01", + "last_updated": "2025-09-01", + "type": "chat" + }, + { + "id": "perplexity/sonar-pro", + "name": "Sonar Pro", + "display_name": "Sonar Pro", + "modalities": { + "input": [ + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 512, - "output": 2 + "context": 200000, + "output": 8192 }, "temperature": true, "tool_call": false, "reasoning": { "supported": false }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-10", - "release_date": "2025-04-29", - "last_updated": "2025-04-29", + "attachment": true, + "open_weights": false, + "knowledge": "2025-09-01", + "release_date": "2024-01-01", + "last_updated": "2025-09-01", "type": "chat" }, { - "id": "claude-sonnet-4", - "name": "Anthropic: Claude Sonnet 4", - "display_name": "Anthropic: Claude Sonnet 4", + "id": "anthropic/claude-sonnet-4-5", + "name": "Claude Sonnet 4.5 (latest)", + "display_name": "Claude Sonnet 4.5 (latest)", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" @@ -305935,104 +303047,196 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2025-05", - "release_date": "2025-05-22", - "last_updated": "2025-05-22", + "knowledge": "2025-07-31", + "release_date": "2025-09-29", + "last_updated": "2025-09-29", "type": "chat" }, { - "id": "gpt-5-pro", - "name": "OpenAI: GPT-5 Pro", - "display_name": "OpenAI: GPT-5 Pro", + "id": "anthropic/claude-haiku-4-5", + "name": "Claude Haiku 4.5 (latest)", + "display_name": "Claude Haiku 4.5 (latest)", "modalities": { "input": [ + "text", + "image", + "pdf" + ], + "output": [ "text" + ] + }, + "limit": { + "context": 200000, + "output": 64000 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-02-28", + "release_date": "2025-10-15", + "last_updated": "2025-10-15", + "type": "chat" + }, + { + "id": "anthropic/claude-sonnet-4-6", + "name": "Claude Sonnet 4.6", + "display_name": "Claude Sonnet 4.6", + "modalities": { + "input": [ + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 32768 + "context": 1000000, + "output": 64000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "fixed", + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, "effort": "high", - "verbosity": "medium", - "verbosity_options": [ + "effort_options": [ "low", "medium", - "high" + "high", + "max" ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." + ] } }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-10-06", - "last_updated": "2025-10-06", + "knowledge": "2025-08-31", + "release_date": "2026-02-17", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "grok-4", - "name": "xAI Grok 4", - "display_name": "xAI Grok 4", + "id": "anthropic/claude-opus-4-7", + "name": "Claude Opus 4.7", + "display_name": "Claude Opus 4.7", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 256000 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": false }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." + ] } }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2024-07", - "release_date": "2024-07-09", - "last_updated": "2024-07-09", + "knowledge": "2026-01-31", + "release_date": "2026-04-16", + "last_updated": "2026-04-16", "type": "chat" }, { - "id": "claude-3.7-sonnet", - "name": "Anthropic: Claude 3.7 Sonnet", - "display_name": "Anthropic: Claude 3.7 Sonnet", + "id": "anthropic/claude-opus-4-6", + "name": "Claude Opus 4.6", + "display_name": "Claude Opus 4.6", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 1000000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -306044,33 +303248,41 @@ "reasoning": { "supported": true, "default_enabled": false, - "mode": "budget", + "mode": "mixed", "budget": { "min": 1024, "unit": "tokens" }, - "interleaved": false, - "summaries": false, - "visibility": "full", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", "continuation": [ "thinking_blocks" ], "notes": [ - "Anthropic uses thinking budget tokens" + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-02", - "release_date": "2025-02-19", - "last_updated": "2025-02-19", + "knowledge": "2025-05-31", + "release_date": "2026-02-05", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "mistral-nemo", - "name": "Mistral Nemo", - "display_name": "Mistral Nemo", + "id": "cohere/command-r-plus-08-2024", + "name": "Command R+", + "display_name": "Command R+", "modalities": { "input": [ "text" @@ -306081,95 +303293,99 @@ }, "limit": { "context": 128000, - "output": 16400 + "output": 4000 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, "attachment": false, "open_weights": true, - "knowledge": "2024-07", - "release_date": "2024-07-18", - "last_updated": "2024-07-18", + "knowledge": "2024-06-01", + "release_date": "2024-08-30", + "last_updated": "2024-08-30", "type": "chat" }, { - "id": "qwen2.5-coder-7b-fast", - "name": "Qwen2.5 Coder 7B fast", - "display_name": "Qwen2.5 Coder 7B fast", + "id": "mistralai/mistral-large-2512", + "name": "Mistral Large 3", + "display_name": "Mistral Large 3", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 32000, - "output": 8192 + "context": 262144, + "output": 262144 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, - "open_weights": false, - "knowledge": "2024-09", - "release_date": "2024-09-15", - "last_updated": "2024-09-15", + "attachment": true, + "open_weights": true, + "knowledge": "2024-11", + "release_date": "2025-12-02", + "last_updated": "2025-12-02", "type": "chat" }, { - "id": "llama-4-scout", - "name": "Meta Llama 4 Scout 17B 16E", - "display_name": "Meta Llama 4 Scout 17B 16E", + "id": "mistralai/devstral-2512", + "name": "Devstral 2", + "display_name": "Devstral 2", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2025-04-05", - "last_updated": "2025-04-05", + "knowledge": "2025-12", + "release_date": "2025-12-09", + "last_updated": "2025-12-09", "type": "chat" }, { - "id": "o1-mini", - "name": "OpenAI: o1-mini", - "display_name": "OpenAI: o1-mini", + "id": "google/gemini-3-flash-preview", + "name": "Gemini 3 Flash Preview", + "display_name": "Gemini 3 Flash Preview", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, + "context": 1048576, "output": 65536 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": true, "default": true @@ -306178,61 +303394,91 @@ "reasoning": { "supported": true, "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ + "mode": "level", + "level": "high", + "level_options": [ + "minimal", "low", "medium", "high" ], - "visibility": "hidden" + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] } }, - "attachment": false, + "attachment": true, "open_weights": false, "knowledge": "2025-01", - "release_date": "2025-01-01", - "last_updated": "2025-01-01", + "release_date": "2025-12-17", + "last_updated": "2025-12-17", "type": "chat" }, { - "id": "mistral-large-2411", - "name": "Mistral-Large", - "display_name": "Mistral-Large", + "id": "google/gemini-2.5-pro", + "name": "Gemini 2.5 Pro", + "display_name": "Gemini 2.5 Pro", "modalities": { "input": [ - "text" + "text", + "image", + "audio", + "video", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 32768 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-07", - "release_date": "2024-11-18", - "last_updated": "2024-11-18", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "budget", + "budget": { + "default": -1, + "min": 128, + "max": 32768, + "auto": -1, + "unit": "tokens" + }, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2025-06-17", + "last_updated": "2025-06-17", "type": "chat" }, { - "id": "gemini-3-pro-preview", - "name": "Google Gemini 3 Pro Preview", - "display_name": "Google Gemini 3 Pro Preview", + "id": "google/gemini-3-pro-preview", + "name": "Gemini 3 Pro Preview", + "display_name": "Gemini 3 Pro Preview", "modalities": { "input": [ "text", "image", + "video", "audio", - "video" + "pdf" ], "output": [ "text" @@ -306267,19 +303513,22 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2025-11", + "knowledge": "2025-01", "release_date": "2025-11-18", "last_updated": "2025-11-18", "type": "chat" }, { - "id": "gemini-2.5-flash", - "name": "Google Gemini 2.5 Flash", - "display_name": "Google Gemini 2.5 Flash", + "id": "google/gemini-2.5-flash", + "name": "Gemini 2.5 Flash", + "display_name": "Gemini 2.5 Flash", "modalities": { "input": [ "text", - "image" + "image", + "audio", + "video", + "pdf" ], "output": [ "text" @@ -306287,7 +303536,7 @@ }, "limit": { "context": 1048576, - "output": 65535 + "output": 65536 }, "temperature": true, "tool_call": true, @@ -306317,72 +303566,122 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2025-06", + "knowledge": "2025-01", "release_date": "2025-06-17", "last_updated": "2025-06-17", "type": "chat" }, { - "id": "gemma-3-12b-it", - "name": "Google Gemma 3 12B", - "display_name": "Google Gemma 3 12B", + "id": "google/gemini-2.5-flash-lite", + "name": "Gemini 2.5 Flash-Lite", + "display_name": "Gemini 2.5 Flash-Lite", "modalities": { "input": [ "text", - "image" + "image", + "audio", + "video", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 1048576, + "output": 65536 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "default": -1, + "min": 512, + "max": 24576, + "auto": -1, + "unit": "tokens" + }, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] + } }, "attachment": true, - "open_weights": true, - "knowledge": "2024-12", - "release_date": "2025-03-12", - "last_updated": "2025-03-12", + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2025-06-17", + "last_updated": "2025-06-17", "type": "chat" - }, + } + ] + }, + "umans-ai-coding-plan": { + "id": "umans-ai-coding-plan", + "name": "Umans AI Coding Plan", + "display_name": "Umans AI Coding Plan", + "api": "https://api.code.umans.ai/v1", + "doc": "https://app.umans.ai/offers/code/docs", + "models": [ { - "id": "deepseek-v3", - "name": "DeepSeek V3", - "display_name": "DeepSeek V3", + "id": "umans-deepseek-v4.1-flash", + "name": "DeepSeek V4.1 Flash", + "display_name": "DeepSeek V4.1 Flash", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 1048576, + "output": 393215 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": false, - "knowledge": "2024-12", - "release_date": "2024-12-26", - "last_updated": "2024-12-26", + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "low", + "high", + "max" + ] + } + }, + "attachment": true, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-10-17", + "last_updated": "2026-10-17", "type": "chat" }, { - "id": "claude-4.5-opus", - "name": "Anthropic: Claude Opus 4.5", - "display_name": "Anthropic: Claude Opus 4.5", + "id": "umans-qwen3.6-35b-a3b", + "name": "Qwen3.6 35B A3B", + "display_name": "Qwen3.6 35B A3B", "modalities": { "input": [ "text", @@ -306393,37 +303692,54 @@ ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 262144, + "output": 262144 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "low", + "medium", + "high" + ] + } + }, "attachment": true, - "open_weights": false, - "knowledge": "2025-11", - "release_date": "2025-11-24", - "last_updated": "2025-11-24", + "open_weights": true, + "release_date": "2026-04-17", + "last_updated": "2026-04-17", "type": "chat" }, { - "id": "qwen3-32b", - "name": "Qwen3 32B", - "display_name": "Qwen3 32B", + "id": "umans-glm-5.3-flash", + "name": "GLM 5.3 Flash", + "display_name": "GLM 5.3 Flash", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 40960 + "context": 1048576, + "output": 131071 }, "temperature": true, "tool_call": true, @@ -306439,31 +303755,37 @@ "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "effort_options": [ + "low", + "high", + "max" ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-04-28", - "last_updated": "2025-04-28", + "release_date": "2026-08-26", + "last_updated": "2026-08-26", "type": "chat" }, { - "id": "gpt-5-codex", - "name": "OpenAI: GPT-5 Codex", - "display_name": "OpenAI: GPT-5 Codex", + "id": "umans-coder", + "name": "Umans Coder", + "display_name": "Umans Coder", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 1048576, + "output": 131071 }, "temperature": false, "tool_call": true, @@ -306474,35 +303796,29 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "minimal", - "low", - "medium", - "high" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ], - "verbosity": "medium", - "verbosity_options": [ + "effort_options": [ "low", - "medium", - "high" - ], - "visibility": "hidden" + "high", + "max" + ] } }, - "attachment": false, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-09-15", - "last_updated": "2025-09-15", + "attachment": true, + "open_weights": true, + "release_date": "2026-08-26", + "last_updated": "2026-08-26", "type": "chat" }, { - "id": "o3-pro", - "name": "OpenAI o3 Pro", - "display_name": "OpenAI o3 Pro", + "id": "umans-flash", + "name": "Umans Flash", + "display_name": "Umans Flash", "modalities": { "input": [ "text", @@ -306513,8 +303829,8 @@ ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 262144, + "output": 262144 }, "temperature": false, "tool_call": true, @@ -306525,28 +303841,29 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ "low", "medium", "high" - ], - "visibility": "hidden" + ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2024-06", - "release_date": "2025-06-10", - "last_updated": "2025-06-10", + "open_weights": true, + "release_date": "2026-04-17", + "last_updated": "2026-04-17", "type": "chat" }, { - "id": "grok-4-1-fast-reasoning", - "name": "xAI Grok 4.1 Fast Reasoning", - "display_name": "xAI Grok 4.1 Fast Reasoning", + "id": "umans-kimi-k3", + "name": "Kimi K3", + "display_name": "Kimi K3", "modalities": { "input": [ "text", @@ -306557,10 +303874,10 @@ ] }, "limit": { - "context": 2000000, - "output": 2000000 + "context": 1048576, + "output": 131072 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -306568,32 +303885,41 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "low", + "high", + "max" + ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-11", - "release_date": "2025-11-19", - "last_updated": "2025-11-19", + "open_weights": true, + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" }, { - "id": "claude-4.5-haiku", - "name": "Anthropic: Claude 4.5 Haiku", - "display_name": "Anthropic: Claude 4.5 Haiku", + "id": "umans-deepseek-v4-flash-0731", + "name": "DeepSeek V4 Flash", + "display_name": "DeepSeek V4 Flash", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 8192 + "context": 1048576, + "output": 393215 }, "temperature": true, "tool_call": true, @@ -306601,17 +303927,33 @@ "supported": true, "default": true }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-10", - "release_date": "2025-10-15", - "last_updated": "2025-10-15", + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "low", + "high", + "max" + ] + } + }, + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-07-31", + "last_updated": "2026-07-31", "type": "chat" }, { - "id": "sonar-reasoning-pro", - "name": "Perplexity Sonar Reasoning Pro", - "display_name": "Perplexity Sonar Reasoning Pro", + "id": "umans-glm-5.3", + "name": "GLM 5.3", + "display_name": "GLM 5.3", "modalities": { "input": [ "text" @@ -306621,126 +303963,275 @@ ] }, "limit": { - "context": 127000, - "output": 4096 + "context": 1048576, + "output": 131071 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ - "minimal", "low", - "medium", - "high" + "high", + "max" ] } }, "attachment": false, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2024-01-01", - "last_updated": "2025-09-01", + "open_weights": true, + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "sonar-deep-research", - "name": "Perplexity Sonar Deep Research", - "display_name": "Perplexity Sonar Deep Research", + "id": "umans-deepseek-v4.1-flash-1017", + "name": "DeepSeek V4.1 Flash 1017", + "display_name": "DeepSeek V4.1 Flash 1017", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 127000, - "output": 4096 + "context": 1048576, + "output": 393215 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ - "minimal", "low", - "medium", - "high" + "high", + "max" ] } }, - "attachment": false, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-02-01", - "last_updated": "2025-09-01", + "attachment": true, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-10-17", + "last_updated": "2026-10-17", + "type": "chat" + } + ] + }, + "xiaomi-token-plan-ams": { + "id": "xiaomi-token-plan-ams", + "name": "Xiaomi Token Plan (Europe)", + "display_name": "Xiaomi Token Plan (Europe)", + "api": "https://token-plan-ams.xiaomimimo.com/v1", + "doc": "https://platform.xiaomimimo.com/#/docs", + "models": [ + { + "id": "mimo-v2.6-pro", + "name": "MiMo-V2.6-Pro", + "display_name": "MiMo-V2.6-Pro", + "modalities": { + "input": [ + "text", + "image", + "audio", + "video" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1048576, + "output": 131072 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": true, + "open_weights": true, + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "gpt-5.1", - "name": "OpenAI GPT-5.1", - "display_name": "OpenAI GPT-5.1", + "id": "mimo-v2.6-flash", + "name": "MiMo-V2.6-Flash", + "display_name": "MiMo-V2.6-Flash", "modalities": { "input": [ "text", - "image" + "image", + "audio", + "video" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 1048576, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": true, + "open_weights": true, + "release_date": "2026-09-22", + "last_updated": "2026-09-22", + "type": "chat" + }, + { + "id": "mimo-v2.5-tts-voiceclone", + "name": "MiMo-V2.5-TTS-VoiceClone", + "display_name": "MiMo-V2.5-TTS-VoiceClone", + "modalities": { + "input": [ + "text" + ], + "output": [ + "audio" + ] + }, + "limit": { + "context": 8192, + "output": 8192 + }, + "temperature": false, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-11-13", - "last_updated": "2025-11-13", + "release_date": "2026-04-22", + "last_updated": "2026-04-22" + }, + { + "id": "mimo-v2.5-tts", + "name": "MiMo-V2.5-TTS", + "display_name": "MiMo-V2.5-TTS", + "modalities": { + "input": [ + "text" + ], + "output": [ + "audio" + ] + }, + "limit": { + "context": 8192, + "output": 8192 + }, + "temperature": false, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": false, + "release_date": "2026-04-22", + "last_updated": "2026-04-22" + }, + { + "id": "mimo-v2.5", + "name": "MiMo-V2.5", + "display_name": "MiMo-V2.5", + "modalities": { + "input": [ + "text", + "image", + "audio", + "video" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1048576, + "output": 131072 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": true, + "open_weights": true, + "knowledge": "2024-12", + "release_date": "2026-04-22", + "last_updated": "2026-04-22", "type": "chat" }, { - "id": "grok-code-fast-1", - "name": "xAI Grok Code Fast 1", - "display_name": "xAI Grok Code Fast 1", + "id": "mimo-v2.5-pro", + "name": "MiMo-V2.5-Pro", + "display_name": "MiMo-V2.5-Pro", "modalities": { "input": [ "text" @@ -306750,8 +304241,8 @@ ] }, "limit": { - "context": 256000, - "output": 10000 + "context": 1048576, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -306761,136 +304252,188 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": false, - "open_weights": false, - "knowledge": "2024-08", - "release_date": "2025-09-02", - "last_updated": "2025-09-02", + "open_weights": true, + "knowledge": "2024-12", + "release_date": "2026-04-22", + "last_updated": "2026-04-22", "type": "chat" }, { - "id": "grok-4-fast-non-reasoning", - "name": "xAI Grok 4 Fast Non-Reasoning", - "display_name": "xAI Grok 4 Fast Non-Reasoning", + "id": "mimo-v2.5-tts-voicedesign", + "name": "MiMo-V2.5-TTS-VoiceDesign", + "display_name": "MiMo-V2.5-TTS-VoiceDesign", "modalities": { "input": [ - "text", - "image", - "audio" + "text" ], "output": [ - "text" + "audio" ] }, "limit": { - "context": 2000000, - "output": 2000000 + "context": 8192, + "output": 8192 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-09", - "release_date": "2025-12-18", - "last_updated": "2025-12-18", - "type": "chat" - }, + "release_date": "2026-04-22", + "last_updated": "2026-04-22" + } + ] + }, + "tokengo": { + "id": "tokengo", + "name": "TokenGo", + "display_name": "TokenGo", + "api": "https://api.tokengo.com/v1", + "doc": "https://www.tokengo.com/docs", + "models": [ { - "id": "grok-3", - "name": "xAI Grok 3", - "display_name": "xAI Grok 3", + "id": "moonshotai/kimi-k2.6", + "name": "Kimi K2.6", + "display_name": "Kimi K2.6", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 131072 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": false, - "knowledge": "2024-06", - "release_date": "2024-06-01", - "last_updated": "2024-06-01", + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": true, + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-04-20", + "last_updated": "2026-04-20", "type": "chat" }, { - "id": "gpt-4.1-mini", - "name": "OpenAI GPT-4.1 Mini", - "display_name": "OpenAI GPT-4.1 Mini", + "id": "moonshotai/kimi-k3", + "name": "Kimi K3", + "display_name": "Kimi K3", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1047576, - "output": 32768 + "context": 1048576, + "output": 131072 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "low", + "high", + "max" + ] + } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-04", - "release_date": "2025-04-14", - "last_updated": "2025-04-14", + "open_weights": true, + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" }, { - "id": "grok-4-1-fast-non-reasoning", - "name": "xAI Grok 4.1 Fast Non-Reasoning", - "display_name": "xAI Grok 4.1 Fast Non-Reasoning", + "id": "deepseek/deepseek-v4-flash", + "name": "DeepSeek V4 Flash", + "display_name": "DeepSeek V4 Flash", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 2000000, - "output": 30000 + "context": 1000000, + "output": 384000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-11", - "release_date": "2025-11-19", - "last_updated": "2025-11-19", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "high", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." + ] + } + }, + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "sonar-pro", - "name": "Perplexity Sonar Pro", - "display_name": "Perplexity Sonar Pro", + "id": "deepseek/deepseek-v4-pro", + "name": "DeepSeek V4 Pro", + "display_name": "DeepSeek V4 Pro", "modalities": { "input": [ "text" @@ -306900,29 +304443,51 @@ ] }, "limit": { - "context": 200000, - "output": 4096 + "context": 1000000, + "output": 384000 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "high", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." + ] + } }, "attachment": false, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2024-01-01", - "last_updated": "2025-09-01", + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "mistral-small", - "name": "Mistral Small 3.2", - "display_name": "Mistral Small 3.2", + "id": "deepseek/deepseek-v3.2", + "name": "DeepSeek V3.2", + "display_name": "DeepSeek V3.2", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" @@ -306930,24 +304495,30 @@ }, "limit": { "context": 128000, - "output": 16384 + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": false, "open_weights": true, - "knowledge": "2025-03", - "release_date": "2025-06-20", - "last_updated": "2025-06-20", + "knowledge": "2024-07", + "release_date": "2025-12-01", + "last_updated": "2025-12-01", "type": "chat" }, { - "id": "sonar", - "name": "Perplexity Sonar", - "display_name": "Perplexity Sonar", + "id": "deepseek/deepseek-v3.1", + "name": "DeepSeek-V3.1", + "display_name": "DeepSeek-V3.1", "modalities": { "input": [ "text" @@ -306957,76 +304528,62 @@ ] }, "limit": { - "context": 127000, - "output": 4096 + "context": 131072, + "output": 8192 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": false, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2024-01-01", - "last_updated": "2025-09-01", + "open_weights": true, + "release_date": "2025-08-21", + "last_updated": "2025-08-21", "type": "chat" }, { - "id": "claude-opus-4-1-20250805", - "name": "Anthropic: Claude Opus 4.1 (20250805)", - "display_name": "Anthropic: Claude Opus 4.1 (20250805)", + "id": "z-ai/glm-5.2", + "name": "GLM-5.2", + "display_name": "GLM-5.2", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 32000 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + "effort_options": [ + "high", + "max" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "attachment": false, + "open_weights": true, + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "gpt-oss-120b", - "name": "OpenAI GPT-OSS 120b", - "display_name": "OpenAI GPT-OSS 120b", + "id": "z-ai/glm-5.3", + "name": "GLM-5.3", + "display_name": "GLM-5.3", "modalities": { "input": [ "text" @@ -307036,7 +304593,7 @@ ] }, "limit": { - "context": 131072, + "context": 1000000, "output": 131072 }, "temperature": true, @@ -307050,102 +304607,101 @@ "supported": true, "effort_options": [ "low", - "medium", - "high" + "high", + "max" ] } }, "attachment": false, "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "gpt-4o-mini", - "name": "OpenAI GPT-4o-mini", - "display_name": "OpenAI GPT-4o-mini", + "id": "z-ai/glm-5", + "name": "GLM-5", + "display_name": "GLM-5", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 204800, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-07", - "release_date": "2024-07-18", - "last_updated": "2024-07-18", + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, + "open_weights": true, + "release_date": "2026-02-12", + "last_updated": "2026-02-12", "type": "chat" }, { - "id": "claude-opus-4", - "name": "Anthropic: Claude Opus 4", - "display_name": "Anthropic: Claude Opus 4", + "id": "z-ai/glm-5.3-flash", + "name": "GLM-5.3-Flash", + "display_name": "GLM-5.3-Flash", "modalities": { "input": [ "text", - "image" + "image", + "video", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 32000 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + "effort_options": [ + "low", + "high", + "max" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-05", - "release_date": "2025-05-22", - "last_updated": "2025-05-22", + "open_weights": true, + "release_date": "2026-08-26", + "last_updated": "2026-08-26", "type": "chat" }, { - "id": "hermes-2-pro-llama-3-8b", - "name": "Hermes 2 Pro Llama 3 8B", - "display_name": "Hermes 2 Pro Llama 3 8B", + "id": "z-ai/glm-5.1", + "name": "GLM-5.1", + "display_name": "GLM-5.1", "modalities": { "input": [ "text" @@ -307155,25 +304711,30 @@ ] }, "limit": { - "context": 131072, + "context": 200000, "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": false, "open_weights": true, - "knowledge": "2024-05", - "release_date": "2024-04-30", - "last_updated": "2024-04-30", + "release_date": "2026-04-07", + "last_updated": "2026-04-07", "type": "chat" }, { - "id": "qwen3-235b-a22b-thinking", - "name": "Qwen3 235B A22B Thinking", - "display_name": "Qwen3 235B A22B Thinking", + "id": "minimax/minimax-m2.5", + "name": "MiniMax-M2.5", + "display_name": "MiniMax-M2.5", "modalities": { "input": [ "text" @@ -307183,129 +304744,93 @@ ] }, "limit": { - "context": 262144, - "output": 81920 + "context": 204800, + "output": 131072 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, "attachment": false, "open_weights": true, - "knowledge": "2025-07", - "release_date": "2025-07-25", - "last_updated": "2025-07-25", + "release_date": "2026-02-12", + "last_updated": "2026-02-12", "type": "chat" }, { - "id": "gemini-2.5-flash-lite", - "name": "Google Gemini 2.5 Flash Lite", - "display_name": "Google Gemini 2.5 Flash Lite", + "id": "qwen/qwen3.5-397b-a17b", + "name": "Qwen3.5 397B-A17B", + "display_name": "Qwen3.5 397B-A17B", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65535 + "context": 262144, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "default": -1, - "min": 512, - "max": 24576, - "auto": -1, - "unit": "tokens" - }, + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-07", - "release_date": "2025-06-17", - "last_updated": "2025-06-17", + "open_weights": true, + "release_date": "2026-02-15", + "last_updated": "2026-02-15", "type": "chat" - }, + } + ] + }, + "dinference": { + "id": "dinference", + "name": "DInference", + "display_name": "DInference", + "api": "https://api.dinference.com/v1", + "doc": "https://dinference.com", + "models": [ { - "id": "claude-3.5-sonnet-v2", - "name": "Anthropic: Claude 3.5 Sonnet v2", - "display_name": "Anthropic: Claude 3.5 Sonnet v2", + "id": "glm-5.2", + "name": "GLM-5.2", + "display_name": "GLM-5.2", "modalities": { "input": [ - "text", - "image" - ], - "output": [ "text" - ] - }, - "limit": { - "context": 200000, - "output": 8192 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-10", - "release_date": "2024-10-22", - "last_updated": "2024-10-22", - "type": "chat" - }, - { - "id": "gpt-5-mini", - "name": "OpenAI GPT-5 Mini", - "display_name": "OpenAI GPT-5 Mini", - "modalities": { - "input": [ - "text", - "image" ], "output": [ "text" ] }, "limit": { - "context": 400000, + "context": 1000000, "output": 128000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -307314,35 +304839,24 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "minimal", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "attachment": false, + "open_weights": true, + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "gpt-oss-20b", - "name": "OpenAI GPT-OSS 20b", - "display_name": "OpenAI GPT-OSS 20b", + "id": "gpt-oss-120b", + "name": "GPT OSS 120B", + "display_name": "GPT OSS 120B", "modalities": { "input": [ "text" @@ -307353,22 +304867,16 @@ }, "limit": { "context": 131072, - "output": 131072 + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "effort_options": [ - "low", - "medium", - "high" - ] + "supported": true } }, "attachment": false, @@ -307379,9 +304887,9 @@ "type": "chat" }, { - "id": "qwen3-coder", - "name": "Qwen3 Coder 480B A35B Instruct Turbo", - "display_name": "Qwen3 Coder 480B A35B Instruct Turbo", + "id": "minimax-m2.5", + "name": "MiniMax-M2.5", + "display_name": "MiniMax-M2.5", "modalities": { "input": [ "text" @@ -307391,39 +304899,43 @@ ] }, "limit": { - "context": 262144, - "output": 16384 + "context": 200000, + "output": 32000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": false, "open_weights": true, - "knowledge": "2025-07", - "release_date": "2025-07-22", - "last_updated": "2025-07-22", + "release_date": "2026-02-12", + "last_updated": "2026-02-12", "type": "chat" }, { - "id": "gpt-5", - "name": "OpenAI GPT-5", - "display_name": "OpenAI GPT-5", + "id": "glm-5", + "name": "GLM-5", + "display_name": "GLM-5", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, + "context": 200000, "output": 128000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -307432,64 +304944,64 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "minimal", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "attachment": false, + "open_weights": true, + "release_date": "2026-02-12", + "last_updated": "2026-02-12", "type": "chat" }, { - "id": "gpt-4.1", - "name": "OpenAI GPT-4.1", - "display_name": "OpenAI GPT-4.1", + "id": "glm-4.7", + "name": "GLM-4.7", + "display_name": "GLM-4.7", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1047576, - "output": 32768 + "context": 200000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, - "open_weights": false, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, + "open_weights": true, "knowledge": "2025-04", - "release_date": "2025-04-14", - "last_updated": "2025-04-14", + "release_date": "2025-12-22", + "last_updated": "2025-12-22", "type": "chat" }, { - "id": "deepseek-v3.2", - "name": "DeepSeek V3.2", - "display_name": "DeepSeek V3.2", + "id": "glm-5.1", + "name": "GLM-5.1", + "display_name": "GLM-5.1", "modalities": { "input": [ "text" @@ -307499,30 +305011,45 @@ ] }, "limit": { - "context": 163840, - "output": 65536 + "context": 200000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": false, "open_weights": true, - "knowledge": "2025-09", - "release_date": "2025-12-01", - "last_updated": "2025-12-01", + "release_date": "2026-04-07", + "last_updated": "2026-04-07", "type": "chat" - }, + } + ] + }, + "fastrouter": { + "id": "fastrouter", + "name": "FastRouter", + "display_name": "FastRouter", + "api": "https://go.fastrouter.ai/api/v1", + "doc": "https://fastrouter.ai/models", + "models": [ { - "id": "llama-3.1-8b-instruct-turbo", - "name": "Meta Llama 3.1 8B Instruct Turbo", - "display_name": "Meta Llama 3.1 8B Instruct Turbo", + "id": "sarvam/sarvam-105b", + "name": "Sarvam 105B", + "display_name": "Sarvam 105B", "modalities": { "input": [ "text" @@ -307532,127 +305059,112 @@ ] }, "limit": { - "context": 128000, - "output": 128000 + "context": 131072, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, "attachment": false, "open_weights": true, - "knowledge": "2024-07", - "release_date": "2024-07-23", - "last_updated": "2024-07-23", + "release_date": "2026-02-18", + "last_updated": "2026-02-18", "type": "chat" }, { - "id": "claude-opus-4-1", - "name": "Anthropic: Claude Opus 4.1", - "display_name": "Anthropic: Claude Opus 4.1", + "id": "moonshotai/kimi-k2.6", + "name": "Kimi K2.6", + "display_name": "Kimi K2.6", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 32000 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." - ] + "supported": true } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-08", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-04-20", + "last_updated": "2026-04-20", "type": "chat" }, { - "id": "gpt-5.1-codex-mini", - "name": "OpenAI: GPT-5.1 Codex Mini", - "display_name": "OpenAI: GPT-5.1 Codex Mini", + "id": "deepseek/deepseek-v4-pro", + "name": "DeepSeek V4 Pro", + "display_name": "DeepSeek V4 Pro", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 1000000, + "output": 384000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, + "default_enabled": true, "mode": "effort", - "effort": "none", + "effort": "high", "effort_options": [ - "none", "low", - "medium", - "high" + "high", + "max" ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ], - "visibility": "hidden" + "notes": [ + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." + ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-11-13", - "last_updated": "2025-11-13", + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "llama-3.1-8b-instruct", - "name": "Meta Llama 3.1 8B Instruct", - "display_name": "Meta Llama 3.1 8B Instruct", + "id": "openai/gpt-oss-20b", + "name": "GPT OSS 20B", + "display_name": "GPT OSS 20B", "modalities": { "input": [ "text" @@ -307662,50 +305174,70 @@ ] }, "limit": { - "context": 16384, - "output": 16384 + "context": 131072, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "low", + "medium", + "high" + ] + } }, "attachment": false, "open_weights": true, - "knowledge": "2024-07", - "release_date": "2024-07-23", - "last_updated": "2024-07-23", + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "o1", - "name": "OpenAI: o1", - "display_name": "OpenAI: o1", + "id": "openai/gpt-5.4-mini", + "name": "GPT-5.4 mini", + "display_name": "GPT-5.4 mini", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 400000, + "output": 128000 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, + "default_enabled": false, "mode": "effort", - "effort": "medium", + "effort": "none", "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ "low", "medium", "high" @@ -307713,46 +305245,17 @@ "visibility": "hidden" } }, - "attachment": false, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2024-12-05", - "last_updated": "2024-12-05", - "type": "chat" - }, - { - "id": "ernie-4.5-21b-a3b-thinking", - "name": "Baidu Ernie 4.5 21B A3B Thinking", - "display_name": "Baidu Ernie 4.5 21B A3B Thinking", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 128000, - "output": 8000 - }, - "temperature": true, - "tool_call": false, - "reasoning": { - "supported": true, - "default": true - }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2025-03", - "release_date": "2025-03-16", - "last_updated": "2025-03-16", + "knowledge": "2025-08-31", + "release_date": "2026-03-17", + "last_updated": "2026-03-17", "type": "chat" }, { - "id": "gpt-4.1-nano", - "name": "OpenAI GPT-4.1 Nano", - "display_name": "OpenAI GPT-4.1 Nano", + "id": "openai/gpt-4.1", + "name": "GPT-4.1", + "display_name": "GPT-4.1", "modalities": { "input": [ "text", @@ -307773,43 +305276,67 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2025-04", + "knowledge": "2024-04", "release_date": "2025-04-14", "last_updated": "2025-04-14", "type": "chat" }, { - "id": "llama-prompt-guard-2-22m", - "name": "Meta Llama Prompt Guard 2 22M", - "display_name": "Meta Llama Prompt Guard 2 22M", + "id": "openai/gpt-5.3-codex", + "name": "GPT-5.3 Codex", + "display_name": "GPT-5.3 Codex", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 512, - "output": 2 + "context": 400000, + "output": 128000 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-10", - "release_date": "2025-04-29", - "last_updated": "2025-04-29", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-02-05", + "last_updated": "2026-02-05", "type": "chat" }, { - "id": "llama-guard-4", - "name": "Meta Llama Guard 4 12B", - "display_name": "Meta Llama Guard 4 12B", + "id": "openai/gpt-5-mini", + "name": "GPT-5 Mini", + "display_name": "GPT-5 Mini", "modalities": { "input": [ "text", @@ -307820,39 +305347,60 @@ ] }, "limit": { - "context": 131072, - "output": 1024 + "context": 400000, + "output": 128000 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "minimal", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-01-01", - "last_updated": "2025-01-01", + "knowledge": "2024-10-01", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "o4-mini", - "name": "OpenAI o4 Mini", - "display_name": "OpenAI o4 Mini", + "id": "openai/gpt-oss-120b", + "name": "GPT OSS 120B", + "display_name": "GPT OSS 120B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 131072, + "output": 32768 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -307861,28 +305409,24 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", "effort_options": [ "low", "medium", "high" - ], - "visibility": "hidden" + ] } }, - "attachment": true, - "open_weights": false, + "attachment": false, + "open_weights": true, "knowledge": "2024-06", - "release_date": "2025-04-16", - "last_updated": "2025-04-16", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "gpt-5.1-codex", - "name": "OpenAI: GPT-5.1 Codex", - "display_name": "OpenAI: GPT-5.1 Codex", + "id": "openai/gpt-5", + "name": "GPT-5", + "display_name": "GPT-5", "modalities": { "input": [ "text", @@ -307900,16 +305444,16 @@ "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, + "default_enabled": true, "mode": "effort", - "effort": "none", + "effort": "medium", "effort_options": [ - "none", + "minimal", "low", "medium", "high" @@ -307925,15 +305469,15 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-11-13", - "last_updated": "2025-11-13", + "knowledge": "2024-10-01", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" }, { - "id": "claude-sonnet-4-5-20250929", - "name": "Anthropic: Claude Sonnet 4.5 (20250929)", - "display_name": "Anthropic: Claude Sonnet 4.5 (20250929)", + "id": "openai/gpt-5.4-nano", + "name": "GPT-5.4 nano", + "display_name": "GPT-5.4 nano", "modalities": { "input": [ "text", @@ -307944,8 +305488,8 @@ ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 400000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -307957,47 +305501,50 @@ "reasoning": { "supported": true, "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." - ] + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2025-09", - "release_date": "2025-09-29", - "last_updated": "2025-09-29", + "knowledge": "2025-08-31", + "release_date": "2026-03-17", + "last_updated": "2026-03-17", "type": "chat" }, { - "id": "deepseek-r1-distill-llama-70b", - "name": "DeepSeek R1 Distill Llama 70B", - "display_name": "DeepSeek R1 Distill Llama 70B", + "id": "openai/gpt-5.5-pro", + "name": "GPT-5.5 Pro", + "display_name": "GPT-5.5 Pro", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -308005,87 +305552,104 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "effort_options": [ + "low", + "medium", + "high" + ] } }, - "attachment": false, + "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-01-20", - "last_updated": "2025-01-20", + "knowledge": "2025-12-01", + "release_date": "2026-04-23", + "last_updated": "2026-04-23", "type": "chat" }, { - "id": "qwen3-30b-a3b", - "name": "Qwen3 30B A3B", - "display_name": "Qwen3 30B A3B", + "id": "openai/gpt-5.5", + "name": "GPT-5.5", + "display_name": "GPT-5.5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 41000, - "output": 41000 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-06", - "release_date": "2025-04-28", - "last_updated": "2025-04-28", + "attachment": true, + "open_weights": false, + "knowledge": "2025-12-01", + "release_date": "2026-04-23", + "last_updated": "2026-04-23", "type": "chat" }, { - "id": "kimi-k2-0711", - "name": "Kimi K2 (07/11)", - "display_name": "Kimi K2 (07/11)", + "id": "openai/gpt-image-2", + "name": "GPT Image 2", + "display_name": "GPT Image 2", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ - "text" + "image" ] }, "limit": { - "context": 131072, - "output": 16384 + "context": 128000, + "output": 8192 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { "supported": false }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2025-07-11", - "last_updated": "2025-07-11", - "type": "chat" + "attachment": true, + "open_weights": false, + "release_date": "2026-04-21", + "last_updated": "2026-04-21" }, { - "id": "gpt-5.1-chat-latest", - "name": "OpenAI GPT-5.1 Chat", - "display_name": "OpenAI GPT-5.1 Chat", + "id": "openai/gpt-5-nano", + "name": "GPT-5 Nano", + "display_name": "GPT-5 Nano", "modalities": { "input": [ "text", @@ -308096,34 +305660,47 @@ ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 400000, + "output": 128000 }, "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "minimal", + "low", + "medium", + "high" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } }, "attachment": true, "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-11-13", - "last_updated": "2025-11-13", + "knowledge": "2024-10-01", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", "type": "chat" - } - ] - }, - "auriko": { - "id": "auriko", - "name": "Auriko", - "display_name": "Auriko", - "api": "https://api.auriko.ai/v1", - "doc": "https://docs.auriko.ai", - "models": [ + }, { - "id": "glm-5.1", - "name": "GLM-5.1", - "display_name": "GLM-5.1", + "id": "z-ai/glm-5", + "name": "GLM-5", + "display_name": "GLM-5", "modalities": { "input": [ "text" @@ -308133,7 +305710,7 @@ ] }, "limit": { - "context": 200000, + "context": 204800, "output": 131072 }, "temperature": true, @@ -308155,14 +305732,14 @@ }, "attachment": false, "open_weights": true, - "release_date": "2026-04-07", - "last_updated": "2026-04-07", + "release_date": "2026-02-12", + "last_updated": "2026-02-12", "type": "chat" }, { - "id": "minimax-m2-7", - "name": "MiniMax-M2.7", - "display_name": "MiniMax-M2.7", + "id": "z-ai/glm-5.1", + "name": "GLM-5.1", + "display_name": "GLM-5.1", "modalities": { "input": [ "text" @@ -308172,7 +305749,7 @@ ] }, "limit": { - "context": 204800, + "context": 200000, "output": 131072 }, "temperature": true, @@ -308181,16 +305758,75 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, "attachment": false, "open_weights": true, - "release_date": "2026-03-18", - "last_updated": "2026-03-18", + "release_date": "2026-04-07", + "last_updated": "2026-04-07", "type": "chat" }, { - "id": "claude-opus-4-7", - "name": "Claude Opus 4.7", - "display_name": "Claude Opus 4.7", + "id": "wanx/wan-v2-6", + "name": "Wan 2.6", + "display_name": "Wan 2.6", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "video" + ] + }, + "limit": { + "context": 400000, + "output": 8192 + }, + "temperature": false, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": false, + "release_date": "2025-12-03", + "last_updated": "2025-12-03" + }, + { + "id": "bytedance/seedance-2", + "name": "Seedance 2", + "display_name": "Seedance 2", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "video" + ] + }, + "limit": { + "context": 4096, + "output": 8192 + }, + "temperature": false, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": false, + "release_date": "2026-02-12", + "last_updated": "2026-10-04" + }, + { + "id": "anthropic/claude-opus-4.8", + "name": "Claude Opus 4.8", + "display_name": "Claude Opus 4.8", "modalities": { "input": [ "text", @@ -308239,44 +305875,44 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-04-16", - "last_updated": "2026-04-16", + "knowledge": "2026-01", + "release_date": "2026-05-28", + "last_updated": "2026-05-28", "type": "chat" }, { - "id": "deepseek-v4-flash", - "name": "DeepSeek V4 Flash", - "display_name": "DeepSeek V4 Flash", + "id": "anthropic/claude-opus-4.1", + "name": "Claude Opus 4.1", + "display_name": "Claude Opus 4.1", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 200000, + "output": 32000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "high", - "max" - ], + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, "interleaved": true, "summaries": true, "visibility": "summary", @@ -308284,21 +305920,22 @@ "thinking_blocks" ], "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "attachment": true, + "open_weights": false, + "knowledge": "2025-03-31", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "grok-4.3", - "name": "Grok 4.3", - "display_name": "Grok 4.3", + "id": "anthropic/claude-sonnet-4.6", + "name": "Claude Sonnet 4.6", + "display_name": "Claude Sonnet 4.6", "modalities": { "input": [ "text", @@ -308311,80 +305948,116 @@ }, "limit": { "context": 1000000, - "output": 30000 + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", "effort_options": [ "low", "medium", - "high" + "high", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, "attachment": true, "open_weights": false, - "release_date": "2026-04-17", - "last_updated": "2026-04-17", + "knowledge": "2025-08-31", + "release_date": "2026-02-17", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "qwen-3.6-plus", - "name": "Qwen3.6 Plus", - "display_name": "Qwen3.6 Plus", + "id": "leonardo-ai/lucid-origin", + "name": "Lucid Origin", + "display_name": "Lucid Origin", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ + "image" + ] + }, + "limit": { + "context": 4096, + "output": 8192 + }, + "temperature": false, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": false, + "release_date": "2025-06-01", + "last_updated": "2025-06-01" + }, + { + "id": "leonardo-ai/lucid-realism", + "name": "Lucid Realism", + "display_name": "Lucid Realism", + "modalities": { + "input": [ "text" + ], + "output": [ + "image" ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 4096, + "output": 8192 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-04", - "release_date": "2026-04-02", - "last_updated": "2026-04-02", - "type": "chat" + "release_date": "2025-06-01", + "last_updated": "2025-06-01" }, { - "id": "gemini-2.5-pro", - "name": "Gemini 2.5 Pro", - "display_name": "Gemini 2.5 Pro", + "id": "minimax/minimax-m2.7", + "name": "MiniMax-M2.7", + "display_name": "MiniMax-M2.7", "modalities": { "input": [ - "text", - "image", - "audio", - "video", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 204800, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -308395,33 +306068,24 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "budget", - "budget": { - "default": -1, - "min": 128, - "max": 32768, - "auto": -1, - "unit": "tokens" - }, + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-06-17", - "last_updated": "2025-06-17", + "attachment": false, + "open_weights": true, + "release_date": "2026-03-18", + "last_updated": "2026-03-18", "type": "chat" }, { - "id": "deepseek-v4-pro", - "name": "DeepSeek V4 Pro", - "display_name": "DeepSeek V4 Pro", + "id": "minimax/minimax-m2.7-highspeed", + "name": "MiniMax-M2.7-highspeed", + "display_name": "MiniMax-M2.7-highspeed", "modalities": { "input": [ "text" @@ -308431,8 +306095,8 @@ ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 204800, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -308443,34 +306107,49 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "high", - "max" - ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, "attachment": false, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "release_date": "2026-03-18", + "last_updated": "2026-03-18", "type": "chat" }, { - "id": "gemini-3.1-pro-preview", + "id": "google/veo3.1-fast", + "name": "Veo 3.1 Fast", + "display_name": "Veo 3.1 Fast", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "video" + ] + }, + "limit": { + "context": 400000, + "output": 8192 + }, + "temperature": false, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": false, + "release_date": "2025-10-15", + "last_updated": "2026-01-01" + }, + { + "id": "google/gemini-3.1-pro-preview", "name": "Gemini 3.1 Pro Preview", "display_name": "Gemini 3.1 Pro Preview", "modalities": { @@ -308520,15 +306199,13 @@ "type": "chat" }, { - "id": "gemini-2.5-flash", - "name": "Gemini 2.5 Flash", - "display_name": "Gemini 2.5 Flash", + "id": "google/gemini-2.5-pro", + "name": "Gemini 2.5 Pro", + "display_name": "Gemini 2.5 Pro", "modalities": { "input": [ "text", "image", - "audio", - "video", "pdf" ], "output": [ @@ -308552,10 +306229,9 @@ "mode": "budget", "budget": { "default": -1, - "min": 0, - "max": 24576, + "min": 128, + "max": 32768, "auto": -1, - "off": 0, "unit": "tokens" }, "summaries": true, @@ -308573,90 +306249,41 @@ "type": "chat" }, { - "id": "minimax-m2-7-highspeed", - "name": "MiniMax-M2.7-highspeed", - "display_name": "MiniMax-M2.7-highspeed", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 204800, - "output": 131072 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "attachment": false, - "open_weights": true, - "release_date": "2026-03-18", - "last_updated": "2026-03-18", - "type": "chat" - }, - { - "id": "kimi-k2.6", - "name": "Kimi K2.6", - "display_name": "Kimi K2.6", + "id": "google/veo3.1-lite", + "name": "Veo 3.1 Lite", + "display_name": "Veo 3.1 Lite", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ - "text" + "video" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 400000, + "output": 8192 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ] - } + "supported": false }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-20", - "last_updated": "2026-04-20", - "type": "chat" + "open_weights": false, + "release_date": "2026-03-31", + "last_updated": "2026-03-31" }, { - "id": "claude-sonnet-4-6", - "name": "Claude Sonnet 4.6", - "display_name": "Claude Sonnet 4.6", + "id": "google/gemini-2.5-flash", + "name": "Gemini 2.5 Flash", + "display_name": "Gemini 2.5 Flash", "modalities": { "input": [ "text", "image", + "audio", "pdf" ], "output": [ @@ -308664,70 +306291,63 @@ ] }, "limit": { - "context": 1000000, - "output": 64000 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "mixed", + "default_enabled": true, + "mode": "budget", "budget": { - "min": 1024, + "default": -1, + "min": 0, + "max": 24576, + "auto": -1, + "off": 0, "unit": "tokens" }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "max" - ], - "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." + "thought_signatures" ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-17", - "last_updated": "2026-03-13", + "knowledge": "2025-01", + "release_date": "2025-06-17", + "last_updated": "2025-06-17", "type": "chat" }, { - "id": "kimi-k2.5", - "name": "Kimi K2.5", - "display_name": "Kimi K2.5", + "id": "google/gemini-3.1-flash-image-preview", + "name": "Nano Banana 2 Preview", + "display_name": "Nano Banana 2 Preview", "modalities": { "input": [ "text", "image", - "video" + "pdf" ], "output": [ - "text" + "text", + "image" ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 65536, + "output": 65536 }, - "temperature": false, - "tool_call": true, + "temperature": true, + "tool_call": false, "reasoning": { "supported": true, "default": true @@ -308735,100 +306355,50 @@ "extra_capabilities": { "reasoning": { "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], "effort_options": [ "low", "medium", - "high", - "xhigh", - "max" + "high" ] } }, "attachment": true, - "open_weights": true, + "open_weights": false, "knowledge": "2025-01", - "release_date": "2026-01-27", - "last_updated": "2026-01-27", - "type": "chat" + "release_date": "2026-02-26", + "last_updated": "2026-02-26" }, { - "id": "claude-opus-4-6", - "name": "Claude Opus 4.6", - "display_name": "Claude Opus 4.6", + "id": "google/veo3.1", + "name": "Veo 3.1", + "display_name": "Veo 3.1", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ - "text" + "video" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 400000, + "output": 8192 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." - ] - } + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2025-05-31", - "release_date": "2026-02-05", - "last_updated": "2026-03-13", - "type": "chat" - } - ] - }, - "amd": { - "id": "amd", - "name": "AMD", - "display_name": "AMD", - "api": "https://developer.amd.com.cn/radeon/api/v1", - "doc": "https://developer.amd.com.cn/radeon/tokenfactory", - "models": [ + "release_date": "2025-10-15", + "last_updated": "2026-01" + }, { - "id": "MiniCPM-V-4.7-35B-A3B", - "name": "MiniCPM-V 4.7 35B-A3B", - "display_name": "MiniCPM-V 4.7 35B-A3B", + "id": "google/gemma-4-31b-it", + "name": "Gemma 4 31B IT", + "display_name": "Gemma 4 31B IT", "modalities": { "input": [ "text", @@ -308840,7 +306410,7 @@ }, "limit": { "context": 262144, - "output": 262144 + "output": 32768 }, "temperature": true, "tool_call": true, @@ -308848,30 +306418,38 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, "attachment": true, "open_weights": true, - "release_date": "2026-10-07", - "last_updated": "2026-10-07", + "knowledge": "2025-01", + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "DeepSeek-V4-Flash", - "name": "DeepSeek V4 Flash 0731", - "display_name": "DeepSeek V4 Flash 0731", + "id": "google/gemini-3-pro-image-preview", + "name": "Nano Banana Pro Preview", + "display_name": "Nano Banana Pro Preview", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ - "text" + "text", + "image" ] }, "limit": { - "context": 1048576, - "output": 384000 + "context": 65536, + "output": 32768 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, "default": true @@ -308880,47 +306458,44 @@ "reasoning": { "supported": true, "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ + "mode": "level", + "level": "high", + "level_options": [ "low", - "high", - "max" + "high" ], - "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thinking_blocks" - ], - "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." + "thought_signatures" ] } }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-07-31", - "last_updated": "2026-07-31", - "type": "chat" + "attachment": true, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2025-11-20", + "last_updated": "2025-11-20" }, { - "id": "Qwen3.8-Flash-Next", - "name": "Qwen3.8 Flash Next", - "display_name": "Qwen3.8 Flash Next", + "id": "google/gemini-3.5-flash", + "name": "Gemini 3.5 Flash", + "display_name": "Gemini 3.5 Flash", "modalities": { "input": [ "text", - "image" + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 131072 + "context": 1048576, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -308930,35 +306505,47 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", "low", "medium", - "xhigh" + "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-08-27", - "last_updated": "2026-08-27", + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2026-05-19", + "last_updated": "2026-05-19", "type": "chat" }, { - "id": "DeepSeek-V4-Flash-Vision-Exp", - "name": "DeepSeek V4 Flash Vision Exp", - "display_name": "DeepSeek V4 Flash Vision Exp", + "id": "x-ai/grok-build-0.1", + "name": "Grok Build 0.1", + "display_name": "Grok Build 0.1", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 256000, + "output": 256000 }, "temperature": true, "tool_call": true, @@ -308969,76 +306556,34 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", "effort_options": [ "low", - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." + "medium", + "high" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-08-21", - "last_updated": "2026-09-01", + "open_weights": false, + "release_date": "2026-04-16", + "last_updated": "2026-04-16", "type": "chat" }, { - "id": "MiniCPM-V-4.7-1B", - "name": "MiniCPM-V 4.7 1B", - "display_name": "MiniCPM-V 4.7 1B", + "id": "x-ai/grok-4", + "name": "Grok 4", + "display_name": "Grok 4", "modalities": { "input": [ - "text", - "image" - ], - "output": [ "text" - ] - }, - "limit": { - "context": 262144, - "output": 262144 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "attachment": true, - "open_weights": true, - "release_date": "2026-10-06", - "last_updated": "2026-10-06", - "type": "chat" - }, - { - "id": "MiMo-V2.6-Flash", - "name": "MiMo-V2.6-Flash", - "display_name": "MiMo-V2.6-Flash", - "modalities": { - "input": [ - "text", - "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 256000, + "output": 64000 }, "temperature": true, "tool_call": true, @@ -309046,28 +306591,35 @@ "supported": true, "default": true }, - "attachment": true, - "open_weights": true, - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": false, + "open_weights": false, + "knowledge": "2025-07", + "release_date": "2025-07-09", + "last_updated": "2025-07-09", "type": "chat" }, { - "id": "Gemma-4-31B-IT", - "name": "Gemma 4 31B IT", - "display_name": "Gemma 4 31B IT", + "id": "x-ai/grok-4.3", + "name": "Grok 4.3", + "display_name": "Grok 4.3", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 1000000, + "output": 30000 }, "temperature": true, "tool_call": true, @@ -309077,20 +306629,33 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "effort_options": [ + "low", + "medium", + "high" + ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "open_weights": false, + "release_date": "2026-04-17", + "last_updated": "2026-04-17", "type": "chat" - }, + } + ] + }, + "inference": { + "id": "inference", + "name": "Inference", + "display_name": "Inference", + "api": "https://inference.net/v1", + "doc": "https://inference.net/models", + "models": [ { - "id": "MiniCPM5-2B", - "name": "MiniCPM5-2B", - "display_name": "MiniCPM5-2B", + "id": "mistral/mistral-nemo-12b-instruct", + "name": "Mistral Nemo 12B Instruct", + "display_name": "Mistral Nemo 12B Instruct", "modalities": { "input": [ "text" @@ -309100,25 +306665,25 @@ ] }, "limit": { - "context": 131072, - "output": 131072 + "context": 16000, + "output": 4096 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, "open_weights": true, - "release_date": "2026-09-06", - "last_updated": "2026-09-12", + "knowledge": "2024-12", + "release_date": "2024-07-18", + "last_updated": "2024-07-18", "type": "chat" }, { - "id": "Qwen3.8-27B", - "name": "Qwen3.8 27B", - "display_name": "Qwen3.8 27B", + "id": "meta/llama-3.2-11b-vision-instruct", + "name": "Llama 3.2 11B Vision Instruct", + "display_name": "Llama 3.2 11B Vision Instruct", "modalities": { "input": [ "text", @@ -309129,79 +306694,53 @@ ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 16000, + "output": 4096 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "effort_options": [ - "low", - "medium" - ] - } + "supported": false }, "attachment": true, "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "knowledge": "2023-12", + "release_date": "2024-09-25", + "last_updated": "2024-09-25", "type": "chat" }, { - "id": "DeepSeek-V4.1-Flash", - "name": "DeepSeek V4.1 Flash", - "display_name": "DeepSeek V4.1 Flash", + "id": "meta/llama-3.2-3b-instruct", + "name": "Llama 3.2 3B Instruct", + "display_name": "Llama 3.2 3B Instruct", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 384000 + "context": 16000, + "output": 4096 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "none", - "minimal", - "low", - "medium", - "high", - "xhigh", - "max" - ] - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-10-17", - "last_updated": "2026-10-17", + "knowledge": "2023-12", + "release_date": "2025-01-01", + "last_updated": "2025-01-01", "type": "chat" }, { - "id": "GLM-5.3-Flash", - "name": "GLM-5.3-Flash", - "display_name": "GLM-5.3-Flash", + "id": "meta/llama-3.1-8b-instruct", + "name": "Llama 3.1 8B Instruct", + "display_name": "Llama 3.1 8B Instruct", "modalities": { "input": [ "text" @@ -309211,85 +306750,53 @@ ] }, "limit": { - "context": 262144, - "output": 131072 + "context": 16000, + "output": 4096 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "low", - "high", - "max" - ] - } + "supported": false }, "attachment": false, "open_weights": true, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", + "knowledge": "2023-12", + "release_date": "2024-07-23", + "last_updated": "2024-07-23", "type": "chat" - } - ] - }, - "siliconflow": { - "id": "siliconflow", - "name": "SiliconFlow", - "display_name": "SiliconFlow", - "api": "https://api.siliconflow.cn/v1", - "doc": "https://cloud.siliconflow.com/models", - "models": [ + }, { - "id": "Qwen/Qwen3-VL-32B-Thinking", - "name": "Qwen/Qwen3-VL-32B-Thinking", - "display_name": "Qwen/Qwen3-VL-32B-Thinking", + "id": "meta/llama-3.2-1b-instruct", + "name": "Llama 3.2 1B Instruct", + "display_name": "Llama 3.2 1B Instruct", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262000, - "output": 32768 + "context": 16000, + "output": 4096 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2025-10-21", - "last_updated": "2025-11-25", + "knowledge": "2023-12", + "release_date": "2024-09-25", + "last_updated": "2024-09-25", "type": "chat" }, { - "id": "Qwen/Qwen3-32B", - "name": "Qwen/Qwen3-32B", - "display_name": "Qwen/Qwen3-32B", + "id": "osmosis/osmosis-structure-0.6b", + "name": "Osmosis Structure 0.6B", + "display_name": "Osmosis Structure 0.6B", "modalities": { "input": [ "text" @@ -309299,63 +306806,54 @@ ] }, "limit": { - "context": 131000, - "output": 32768 + "context": 4000, + "output": 2048 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": false, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-04-28", - "last_updated": "2025-04-28", + "knowledge": "2024-12", + "release_date": "2025-01-01", + "last_updated": "2025-01-01", "type": "chat" }, { - "id": "Qwen/Qwen3-30B-A3B-Instruct-2507", - "name": "Qwen/Qwen3-30B-A3B-Instruct-2507", - "display_name": "Qwen/Qwen3-30B-A3B-Instruct-2507", + "id": "google/gemma-3", + "name": "Google Gemma 3", + "display_name": "Google Gemma 3", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 262000, - "output": 32768 + "context": 125000, + "output": 4096 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2025-07-28", - "last_updated": "2025-07-28", + "knowledge": "2024-12", + "release_date": "2025-01-01", + "last_updated": "2025-01-01", "type": "chat" }, { - "id": "Qwen/Qwen3-Coder-30B-A3B-Instruct", - "name": "Qwen/Qwen3-Coder-30B-A3B-Instruct", - "display_name": "Qwen/Qwen3-Coder-30B-A3B-Instruct", + "id": "qwen/qwen3-embedding-4b", + "name": "Qwen 3 Embedding 4B", + "display_name": "Qwen 3 Embedding 4B", "modalities": { "input": [ "text" @@ -309365,66 +306863,63 @@ ] }, "limit": { - "context": 262000, - "output": 65536 + "context": 32000, + "output": 2048 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { "supported": false }, "attachment": false, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-07-31", - "last_updated": "2025-07-31" + "knowledge": "2024-12", + "release_date": "2025-06-05", + "last_updated": "2025-06-05", + "type": "embedding" }, { - "id": "Qwen/Qwen3.5-4B", - "name": "Qwen/Qwen3.5-4B", - "display_name": "Qwen/Qwen3.5-4B", + "id": "qwen/qwen-2.5-7b-vision-instruct", + "name": "Qwen 2.5 7B Vision Instruct", + "display_name": "Qwen 2.5 7B Vision Instruct", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 125000, + "output": 4096 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": true, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2026-03-02", - "last_updated": "2026-03-02", + "knowledge": "2024-12", + "release_date": "2025-01-01", + "last_updated": "2025-01-01", "type": "chat" - }, + } + ] + }, + "gmicloud": { + "id": "gmicloud", + "name": "GMI Cloud", + "display_name": "GMI Cloud", + "api": "https://api.gmi-serving.com/v1", + "doc": "https://docs.gmicloud.ai/inference-engine/api-reference/llm-api-reference", + "models": [ { - "id": "Qwen/Qwen3-8B", - "name": "Qwen/Qwen3-8B", - "display_name": "Qwen/Qwen3-8B", + "id": "moonshotai/Kimi-K2.6", + "name": "Kimi K2.6", + "display_name": "Kimi K2.6", "modalities": { "input": [ "text" @@ -309434,13 +306929,14 @@ ] }, "limit": { - "context": 131000, - "output": 32768 + "context": 65536, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { @@ -309455,19 +306951,18 @@ }, "attachment": false, "open_weights": true, - "release_date": "2025-04-29", - "last_updated": "2025-04-29", + "knowledge": "2025-01", + "release_date": "2026-04-20", + "last_updated": "2026-04-20", "type": "chat" }, { - "id": "Qwen/Qwen3.6-35B-A3B", - "name": "Qwen/Qwen3.6-35B-A3B", - "display_name": "Qwen/Qwen3.6-35B-A3B", + "id": "moonshotai/kimi-k2.7-code-highspeed", + "name": "Kimi K2.7 Code Highspeed", + "display_name": "Kimi K2.7 Code Highspeed", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" @@ -309475,12 +306970,13 @@ }, "limit": { "context": 262144, - "output": 65536 + "output": 262144 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { @@ -309493,57 +306989,80 @@ ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2026-04-17", - "last_updated": "2026-04-17", + "knowledge": "2025-01", + "release_date": "2026-06-12", + "last_updated": "2026-06-12", "type": "chat" }, { - "id": "Qwen/Qwen2.5-7B-Instruct", - "name": "Qwen/Qwen2.5-7B-Instruct", - "display_name": "Qwen/Qwen2.5-7B-Instruct", + "id": "openai/gpt-5.5", + "name": "GPT-5.5", + "display_name": "GPT-5.5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 33000, - "output": 4000 + "context": 1050000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": true, - "release_date": "2024-09-19", - "last_updated": "2024-09-19", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-12-01", + "release_date": "2026-04-23", + "last_updated": "2026-04-23", "type": "chat" }, { - "id": "Qwen/Qwen3-VL-30B-A3B-Thinking", - "name": "Qwen/Qwen3-VL-30B-A3B-Thinking", - "display_name": "Qwen/Qwen3-VL-30B-A3B-Thinking", + "id": "MiniMaxAI/MiniMax-M2.7", + "name": "MiniMax-M2.7", + "display_name": "MiniMax-M2.7", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262000, - "output": 32768 + "context": 196608, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -309562,16 +307081,16 @@ ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2025-10-11", - "last_updated": "2025-11-25", + "release_date": "2026-03-18", + "last_updated": "2026-03-18", "type": "chat" }, { - "id": "Qwen/Qwen3-VL-30B-A3B-Instruct", - "name": "Qwen/Qwen3-VL-30B-A3B-Instruct", - "display_name": "Qwen/Qwen3-VL-30B-A3B-Instruct", + "id": "MiniMaxAI/MiniMax-M3", + "name": "MiniMax-M3", + "display_name": "MiniMax-M3", "modalities": { "input": [ "text", @@ -309583,24 +307102,30 @@ ] }, "limit": { - "context": 262000, - "output": 32768 + "context": 1048576, + "output": 512000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": true, "open_weights": true, - "release_date": "2025-10-04", - "last_updated": "2025-10-04", + "release_date": "2026-06-01", + "last_updated": "2026-06-01", "type": "chat" }, { - "id": "Qwen/Qwen2.5-72B-Instruct", - "name": "Qwen/Qwen2.5-72B-Instruct", - "display_name": "Qwen/Qwen2.5-72B-Instruct", + "id": "Qwen/Qwen3.7-Max", + "name": "Qwen3.7 Max", + "display_name": "Qwen3.7 Max", "modalities": { "input": [ "text" @@ -309610,24 +307135,30 @@ ] }, "limit": { - "context": 33000, - "output": 4000 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "attachment": false, - "open_weights": true, - "release_date": "2024-09-18", - "last_updated": "2025-11-25", + "open_weights": false, + "release_date": "2026-05-21", + "last_updated": "2026-05-21", "type": "chat" }, { - "id": "Qwen/Qwen3.5-27B", - "name": "Qwen/Qwen3.5-27B", - "display_name": "Qwen/Qwen3.5-27B", + "id": "Qwen/Qwen3.8-Flash", + "name": "Qwen3.8 Flash", + "display_name": "Qwen3.8 Flash", "modalities": { "input": [ "text", @@ -309639,8 +307170,8 @@ ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 1048575, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -309650,106 +307181,66 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2026-02-23", - "last_updated": "2026-02-23", + "open_weights": false, + "release_date": "2026-08-26", + "last_updated": "2026-08-26", "type": "chat" }, { - "id": "Qwen/Qwen3-14B", - "name": "Qwen/Qwen3-14B", - "display_name": "Qwen/Qwen3-14B", + "id": "Qwen/Qwen3.8-Max", + "name": "Qwen3.8 Max", + "display_name": "Qwen3.8 Max", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131000, - "output": 32768 + "context": 262144, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, - "attachment": false, - "open_weights": true, - "release_date": "2025-04-30", - "last_updated": "2025-11-25", - "type": "chat" - }, - { - "id": "Qwen/Qwen3-VL-8B-Instruct", - "name": "Qwen/Qwen3-VL-8B-Instruct", - "display_name": "Qwen/Qwen3-VL-8B-Instruct", - "modalities": { - "input": [ - "text", - "image", - "video" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 262000, - "output": 32768 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, "attachment": true, - "open_weights": true, - "release_date": "2025-10-15", - "last_updated": "2025-11-25", + "open_weights": false, + "release_date": "2026-08-03", + "last_updated": "2026-08-03", "type": "chat" }, { - "id": "Qwen/Qwen3.5-9B", - "name": "Qwen/Qwen3.5-9B", - "display_name": "Qwen/Qwen3.5-9B", + "id": "zai-org/GLM-5.1-FP8", + "name": "GLM-5.1", + "display_name": "GLM-5.1", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 202752, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -309768,59 +307259,70 @@ ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2026-02-23", - "last_updated": "2026-02-23", + "release_date": "2026-04-07", + "last_updated": "2026-04-07", "type": "chat" }, { - "id": "Qwen/Qwen3-VL-32B-Instruct", - "name": "Qwen/Qwen3-VL-32B-Instruct", - "display_name": "Qwen/Qwen3-VL-32B-Instruct", + "id": "zai-org/GLM-5.2-FP8", + "name": "GLM-5.2", + "display_name": "GLM-5.2", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262000, - "output": 32768 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "high", + "max" + ] + } + }, + "attachment": false, "open_weights": true, - "release_date": "2025-10-21", - "last_updated": "2025-11-25", + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "Qwen/Qwen3.5-122B-A10B", - "name": "Qwen/Qwen3.5-122B-A10B", - "display_name": "Qwen/Qwen3.5-122B-A10B", + "id": "zai-org/GLM-5-FP8", + "name": "GLM-5", + "display_name": "GLM-5", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 202752, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -309839,86 +307341,131 @@ ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2026-02-23", - "last_updated": "2026-02-23", + "release_date": "2026-02-12", + "last_updated": "2026-02-12", "type": "chat" }, { - "id": "Qwen/Qwen3.5-35B-A3B", - "name": "Qwen/Qwen3.5-35B-A3B", - "display_name": "Qwen/Qwen3.5-35B-A3B", + "id": "anthropic/claude-opus-4.6", + "name": "Claude Opus 4.6", + "display_name": "Claude Opus 4.6", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 409600, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "max" + ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2026-02-23", - "last_updated": "2026-02-23", + "open_weights": false, + "knowledge": "2025-05-31", + "release_date": "2026-02-05", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "inclusionAI/Ling-flash-2.0", - "name": "inclusionAI/Ling-flash-2.0", - "display_name": "inclusionAI/Ling-flash-2.0", + "id": "anthropic/claude-opus-4.8", + "name": "Claude Opus 4.8", + "display_name": "Claude Opus 4.8", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131000, - "output": 49780 + "context": 1000000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false }, - "attachment": false, - "open_weights": true, - "release_date": "2025-09-18", - "last_updated": "2025-11-25", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2026-01", + "release_date": "2026-05-28", + "last_updated": "2026-05-28", "type": "chat" }, { - "id": "PaddlePaddle/PaddleOCR-VL-1.5", - "name": "PaddlePaddle/PaddleOCR-VL-1.5", - "display_name": "PaddlePaddle/PaddleOCR-VL-1.5", + "id": "anthropic/claude-opus-4.7", + "name": "Claude Opus 4.7", + "display_name": "Claude Opus 4.7", "modalities": { "input": [ "text", @@ -309929,95 +307476,110 @@ ] }, "limit": { - "context": 16384, - "output": 6226 + "context": 409600, + "output": 128000 }, - "temperature": true, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", + "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", + "task_budget is separate from thinking control and should not be treated as a thinking budget." + ] + } }, "attachment": true, - "open_weights": true, - "release_date": "2026-01-29", - "last_updated": "2026-01-29", + "open_weights": false, + "knowledge": "2026-01-31", + "release_date": "2026-04-16", + "last_updated": "2026-04-16", "type": "chat" }, { - "id": "zai-org/GLM-5.2", - "name": "GLM-5.2", - "display_name": "GLM-5.2", + "id": "anthropic/claude-sonnet-4.6", + "name": "Claude Sonnet 4.6", + "display_name": "Claude Sonnet 4.6", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1049000, - "output": 262000 + "context": 409600, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "max" + ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" ], - "effort_options": [ - "high", - "max" + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", - "type": "chat" - }, - { - "id": "zai-org/GLM-4.5-Air", - "name": "zai-org/GLM-4.5-Air", - "display_name": "zai-org/GLM-4.5-Air", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 131000, - "output": 98304 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-07-28", - "last_updated": "2025-07-28", + "attachment": true, + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-02-17", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-V4-Flash", - "name": "DeepSeek V4 Flash", - "display_name": "DeepSeek V4 Flash", + "id": "deepseek-ai/DeepSeek-V4-Pro", + "name": "DeepSeek V4 Pro", + "display_name": "DeepSeek V4 Pro", "modalities": { "input": [ "text" @@ -310027,7 +307589,7 @@ ] }, "limit": { - "context": 1000000, + "context": 1048576, "output": 384000 }, "temperature": true, @@ -310066,9 +307628,9 @@ "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-V4-Pro", - "name": "deepseek-ai/DeepSeek-V4-Pro", - "display_name": "deepseek-ai/DeepSeek-V4-Pro", + "id": "deepseek-ai/DeepSeek-V4-Flash", + "name": "DeepSeek V4 Flash", + "display_name": "DeepSeek V4 Flash", "modalities": { "input": [ "text" @@ -310078,8 +307640,8 @@ ] }, "limit": { - "context": 1049000, - "output": 393000 + "context": 1048575, + "output": 384000 }, "temperature": true, "tool_call": true, @@ -310115,11 +307677,20 @@ "release_date": "2026-04-24", "last_updated": "2026-04-24", "type": "chat" - }, + } + ] + }, + "scnet-token-plan": { + "id": "scnet-token-plan", + "name": "SCNet Token Plan", + "display_name": "SCNet Token Plan", + "api": "https://api.scnet.cn/api/llm/v1", + "doc": "https://www.scnet.cn/ac/openapi/doc/2.0/moduleapi/plans/token-plan.html", + "models": [ { - "id": "deepseek-ai/DeepSeek-V3.2", - "name": "deepseek-ai/DeepSeek-V3.2", - "display_name": "deepseek-ai/DeepSeek-V3.2", + "id": "GLM-5", + "name": "GLM-5", + "display_name": "GLM-5", "modalities": { "input": [ "text" @@ -310129,8 +307700,8 @@ ] }, "limit": { - "context": 164000, - "output": 65536 + "context": 204800, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -310140,48 +307711,66 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": false, "open_weights": true, - "knowledge": "2024-07", - "release_date": "2025-12-01", - "last_updated": "2025-12-01", + "release_date": "2026-02-12", + "last_updated": "2026-02-12", "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-OCR", - "name": "deepseek-ai/DeepSeek-OCR", - "display_name": "deepseek-ai/DeepSeek-OCR", + "id": "Kimi-K2.6", + "name": "Kimi K2.6", + "display_name": "Kimi K2.6", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 8192, - "output": 3113 + "context": 262144, + "output": 262144 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": true, "open_weights": true, - "release_date": "2025-10-20", - "last_updated": "2025-10-20" + "knowledge": "2025-01", + "release_date": "2026-04-20", + "last_updated": "2026-04-20", + "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-V3.1-Terminus", - "name": "deepseek-ai/DeepSeek-V3.1-Terminus", - "display_name": "deepseek-ai/DeepSeek-V3.1-Terminus", + "id": "MiniMax-M2.7", + "name": "MiniMax-M2.7", + "display_name": "MiniMax-M2.7", "modalities": { "input": [ "text" @@ -310191,8 +307780,8 @@ ] }, "limit": { - "context": 164000, - "output": 8192 + "context": 204800, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -310200,16 +307789,27 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, "attachment": false, "open_weights": true, - "release_date": "2025-09-29", - "last_updated": "2025-11-25", + "release_date": "2026-03-18", + "last_updated": "2026-03-18", "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-R1", - "name": "deepseek-ai/DeepSeek-R1", - "display_name": "deepseek-ai/DeepSeek-R1", + "id": "MiniMax-M2.5", + "name": "MiniMax-M2.5", + "display_name": "MiniMax-M2.5", "modalities": { "input": [ "text" @@ -310219,8 +307819,8 @@ ] }, "limit": { - "context": 164000, - "output": 8192 + "context": 204800, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -310241,14 +307841,14 @@ }, "attachment": false, "open_weights": true, - "release_date": "2025-05-28", - "last_updated": "2025-05-28", + "release_date": "2026-02-12", + "last_updated": "2026-02-12", "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-V3", - "name": "deepseek-ai/DeepSeek-V3", - "display_name": "deepseek-ai/DeepSeek-V3", + "id": "GLM-5.2", + "name": "GLM-5.2", + "display_name": "GLM-5.2", "modalities": { "input": [ "text" @@ -310258,24 +307858,36 @@ ] }, "limit": { - "context": 164000, - "output": 8192 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, "open_weights": true, - "release_date": "2025-03-24", - "last_updated": "2025-03-24", + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "tencent/Hunyuan-A13B-Instruct", - "name": "tencent/Hunyuan-A13B-Instruct", - "display_name": "tencent/Hunyuan-A13B-Instruct", + "id": "DeepSeek-V4-Flash-0731", + "name": "DeepSeek V4 Flash 0731", + "display_name": "DeepSeek V4 Flash 0731", "modalities": { "input": [ "text" @@ -310285,36 +307897,52 @@ ] }, "limit": { - "context": 131000, - "output": 117964 + "context": 1000000, + "output": 384000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "high", + "max" + ] + } }, "attachment": false, "open_weights": true, - "release_date": "2025-06-30", - "last_updated": "2025-11-25", + "knowledge": "2025-05", + "release_date": "2026-07-31", + "last_updated": "2026-07-31", "type": "chat" }, { - "id": "Pro/moonshotai/Kimi-K2.6", - "name": "Pro/moonshotai/Kimi-K2.6", - "display_name": "Pro/moonshotai/Kimi-K2.6", + "id": "GLM-5.1", + "name": "GLM-5.1", + "display_name": "GLM-5.1", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262000, - "output": 99560 + "context": 200000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -310333,29 +307961,30 @@ ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-20", - "last_updated": "2026-04-20", + "release_date": "2026-04-07", + "last_updated": "2026-04-07", "type": "chat" }, { - "id": "Pro/moonshotai/Kimi-K2.5", - "name": "Pro/moonshotai/Kimi-K2.5", - "display_name": "Pro/moonshotai/Kimi-K2.5", + "id": "GLM-5.3-Flash", + "name": "GLM-5.3-Flash", + "display_name": "GLM-5.3-Flash", "modalities": { "input": [ "text", - "image" + "image", + "video", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 262000, - "output": 99560 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -310376,15 +308005,14 @@ }, "attachment": true, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-01-27", - "last_updated": "2026-01-27", + "release_date": "2026-08-26", + "last_updated": "2026-08-26", "type": "chat" }, { - "id": "Pro/zai-org/GLM-5", - "name": "Pro/zai-org/GLM-5", - "display_name": "Pro/zai-org/GLM-5", + "id": "Kimi-K2.7-Code", + "name": "Kimi K2.7 Code", + "display_name": "Kimi K2.7 Code", "modalities": { "input": [ "text" @@ -310394,10 +308022,10 @@ ] }, "limit": { - "context": 205000, - "output": 131072 + "context": 262144, + "output": 262144 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -310416,14 +308044,15 @@ }, "attachment": false, "open_weights": true, - "release_date": "2026-02-12", - "last_updated": "2026-02-12", + "knowledge": "2025-01", + "release_date": "2026-06-12", + "last_updated": "2026-06-12", "type": "chat" }, { - "id": "Pro/zai-org/GLM-5.1", - "name": "Pro/zai-org/GLM-5.1", - "display_name": "Pro/zai-org/GLM-5.1", + "id": "Kimi-K3", + "name": "Kimi K3", + "display_name": "Kimi K3", "modalities": { "input": [ "text" @@ -310433,10 +308062,10 @@ ] }, "limit": { - "context": 205000, + "context": 1048576, "output": 131072 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -310455,27 +308084,28 @@ }, "attachment": false, "open_weights": true, - "release_date": "2026-04-07", - "last_updated": "2026-04-07", + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" }, { - "id": "Pro/deepseek-ai/DeepSeek-V3.2", - "name": "Pro/deepseek-ai/DeepSeek-V3.2", - "display_name": "Pro/deepseek-ai/DeepSeek-V3.2", + "id": "Kimi-K2.5", + "name": "Kimi K2.5", + "display_name": "Kimi K2.5", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 164000, - "output": 65536 + "context": 262144, + "output": 262144 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -310483,20 +308113,26 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2024-07", - "release_date": "2025-12-01", - "last_updated": "2025-12-01", + "knowledge": "2025-01", + "release_date": "2026-01-27", + "last_updated": "2026-01-27", "type": "chat" }, { - "id": "Pro/deepseek-ai/DeepSeek-V3.1-Terminus", - "name": "Pro/deepseek-ai/DeepSeek-V3.1-Terminus", - "display_name": "Pro/deepseek-ai/DeepSeek-V3.1-Terminus", + "id": "DeepSeek-V4-Pro", + "name": "DeepSeek V4 Pro", + "display_name": "DeepSeek V4 Pro", "modalities": { "input": [ "text" @@ -310506,8 +308142,8 @@ ] }, "limit": { - "context": 164000, - "output": 8192 + "context": 1000000, + "output": 384000 }, "temperature": true, "tool_call": true, @@ -310515,16 +308151,39 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "high", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." + ] + } + }, "attachment": false, "open_weights": true, - "release_date": "2025-09-29", - "last_updated": "2025-11-25", + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "Pro/deepseek-ai/DeepSeek-R1", - "name": "Pro/deepseek-ai/DeepSeek-R1", - "display_name": "Pro/deepseek-ai/DeepSeek-R1", + "id": "DeepSeek-V4-Flash", + "name": "DeepSeek V4 Flash", + "display_name": "DeepSeek V4 Flash", "modalities": { "input": [ "text" @@ -310534,8 +308193,8 @@ ] }, "limit": { - "context": 164000, - "output": 8192 + "context": 1000000, + "output": 384000 }, "temperature": true, "tool_call": true, @@ -310546,24 +308205,36 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "high", + "max" + ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "notes": [ + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, "attachment": false, "open_weights": true, - "release_date": "2025-05-28", - "last_updated": "2025-05-28", + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "Pro/deepseek-ai/DeepSeek-V3", - "name": "Pro/deepseek-ai/DeepSeek-V3", - "display_name": "Pro/deepseek-ai/DeepSeek-V3", + "id": "MiniMax-M3", + "name": "MiniMax-M3", + "display_name": "MiniMax-M3", "modalities": { "input": [ "text" @@ -310573,24 +308244,36 @@ ] }, "limit": { - "context": 164000, - "output": 8192 + "context": 1048576, + "output": 512000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, "open_weights": true, - "release_date": "2025-03-24", - "last_updated": "2025-03-24", + "release_date": "2026-06-01", + "last_updated": "2026-06-01", "type": "chat" }, { - "id": "ByteDance-Seed/Seed-OSS-36B-Instruct", - "name": "ByteDance-Seed/Seed-OSS-36B-Instruct", - "display_name": "ByteDance-Seed/Seed-OSS-36B-Instruct", + "id": "GLM-5.3", + "name": "GLM-5.3", + "display_name": "GLM-5.3", "modalities": { "input": [ "text" @@ -310600,29 +308283,36 @@ ] }, "limit": { - "context": 262000, - "output": 99560 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": false, "open_weights": true, - "release_date": "2025-09-04", - "last_updated": "2025-11-25", + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "stepfun-ai/Step-3.5-Flash", - "name": "stepfun-ai/Step-3.5-Flash", - "display_name": "stepfun-ai/Step-3.5-Flash", + "id": "DeepSeek-V4-Pro-0813", + "name": "DeepSeek V4 Pro 0813", + "display_name": "DeepSeek V4 Pro 0813", "modalities": { "input": [ "text" @@ -310632,8 +308322,8 @@ ] }, "limit": { - "context": 262000, - "output": 256000 + "context": 1000000, + "output": 384000 }, "temperature": true, "tool_call": true, @@ -310641,39 +308331,72 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "high", + "max" + ] + } + }, "attachment": false, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-01-29", - "last_updated": "2026-02-13", + "release_date": "2026-08-13", + "last_updated": "2026-08-22", "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-V3.2-Exp", - "name": "deepseek-ai/DeepSeek-V3.2-Exp", - "display_name": "deepseek-ai/DeepSeek-V3.2-Exp", + "id": "Qwen3.8-Flash", + "name": "Qwen3.8 Flash", + "display_name": "Qwen3.8 Flash", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 1000000, + "output": 131072 }, + "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, + "attachment": true, + "open_weights": false, + "release_date": "2026-08-26", + "last_updated": "2026-08-26", "type": "chat" }, { - "id": "Pro/deepseek-ai/DeepSeek-V3.2-Exp", - "name": "Pro/deepseek-ai/DeepSeek-V3.2-Exp", - "display_name": "Pro/deepseek-ai/DeepSeek-V3.2-Exp", + "id": "DeepSeek-V4.1-Flash", + "name": "DeepSeek V4.1 Flash", + "display_name": "DeepSeek V4.1 Flash", "modalities": { "input": [ "text" @@ -310683,31 +308406,57 @@ ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 1000000, + "output": 384000 }, + "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "high", + "max" + ] + } }, + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-09-10", + "last_updated": "2026-09-10", "type": "chat" }, { - "id": "inclusionAI/Ring-1T", - "name": "inclusionAI/Ring-1T", - "display_name": "inclusionAI/Ring-1T", + "id": "Qwen3.8-Max", + "name": "Qwen3.8 Max", + "display_name": "Qwen3.8 Max", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 1000000, + "output": 131072 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -310715,37 +308464,77 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, + "attachment": true, + "open_weights": false, + "release_date": "2026-08-03", + "last_updated": "2026-08-03", "type": "chat" - }, + } + ] + }, + "opencode-go": { + "id": "opencode-go", + "name": "OpenCode Go", + "display_name": "OpenCode Go", + "api": "https://opencode.ai/inference/go/openai/v1", + "doc": "https://opencode.ai/v2/docs/console/go/", + "models": [ { - "id": "inclusionAI/Ling-1T", - "name": "inclusionAI/Ling-1T", - "display_name": "inclusionAI/Ling-1T", + "id": "muse-spark-1.2-contributor", + "name": "Muse Spark 1.2 Contributor", + "display_name": "Muse Spark 1.2 Contributor", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "pdf", + "audio" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 1048576, + "output": 131072 }, + "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] + } }, + "attachment": true, + "open_weights": false, + "release_date": "2026-08-05", + "last_updated": "2026-08-05", "type": "chat" }, { - "id": "zai-org/GLM-4.6", - "name": "zai-org/GLM-4.6", - "display_name": "zai-org/GLM-4.6", + "id": "hy3", + "name": "Hy3", + "display_name": "Hy3", "modalities": { "input": [ "text" @@ -310755,34 +308544,48 @@ ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 256000, + "output": 128000 }, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "effort_options": [ + "none", + "low", + "high" + ] } }, + "attachment": false, + "open_weights": true, + "release_date": "2026-07-06", + "last_updated": "2026-07-06", "type": "chat" }, { - "id": "Qwen/Qwen3-VL-235B-A22B-Instruct", - "name": "Qwen/Qwen3-VL-235B-A22B-Instruct", - "display_name": "Qwen/Qwen3-VL-235B-A22B-Instruct", - "tool_call": true, - "reasoning": { - "supported": false + "id": "glm-5.2", + "name": "GLM-5.2", + "display_name": "GLM-5.2", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] }, - "type": "chat" - }, - { - "id": "Qwen/Qwen3-VL-235B-A22B-Thinking", - "name": "Qwen/Qwen3-VL-235B-A22B-Thinking", - "display_name": "Qwen/Qwen3-VL-235B-A22B-Thinking", + "limit": { + "context": 1000000, + "output": 131072 + }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -310796,15 +308599,23 @@ "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "effort_options": [ + "high", + "max" ] } }, + "attachment": false, + "open_weights": true, + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "Qwen/Qwen3-Omni-30B-A3B-Instruct", - "name": "Qwen/Qwen3-Omni-30B-A3B-Instruct", - "display_name": "Qwen/Qwen3-Omni-30B-A3B-Instruct", + "id": "minimax-m2.7", + "name": "MiniMax-M2.7", + "display_name": "MiniMax-M2.7", "modalities": { "input": [ "text" @@ -310814,31 +308625,51 @@ ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 204800, + "output": 131072 }, + "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, + "attachment": false, + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-03-18", + "last_updated": "2026-03-18", "type": "chat" }, { - "id": "Qwen/Qwen3-Omni-30B-A3B-Thinking", - "name": "Qwen/Qwen3-Omni-30B-A3B-Thinking", - "display_name": "Qwen/Qwen3-Omni-30B-A3B-Thinking", + "id": "deepseek-v4.1-flash", + "name": "DeepSeek V4.1 Flash", + "display_name": "DeepSeek V4.1 Flash", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 1000000, + "output": 384000 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -310852,81 +308683,126 @@ "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "effort_options": [ + "low", + "high", + "max" ] } }, + "attachment": true, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-09-10", + "last_updated": "2026-09-10", "type": "chat" }, { - "id": "Qwen/Qwen3-Omni-30B-A3B-Captioner", - "name": "Qwen/Qwen3-Omni-30B-A3B-Captioner", - "display_name": "Qwen/Qwen3-Omni-30B-A3B-Captioner", + "id": "gpt-5.6-luna", + "name": "GPT-5.6 Luna", + "display_name": "GPT-5.6 Luna", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 1050000, + "output": 128000 }, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false - }, - "type": "chat" - }, - { - "id": "moonshotai/Kimi-K2-Instruct-0905", - "name": "moonshotai/Kimi-K2-Instruct-0905", - "display_name": "moonshotai/Kimi-K2-Instruct-0905", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 131072, - "output": 8192 + "supported": true, + "default": true }, - "tool_call": true, - "reasoning": { - "supported": false + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } }, + "attachment": true, + "open_weights": false, + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" }, { - "id": "Pro/moonshotai/Kimi-K2-Instruct-0905", - "name": "Pro/moonshotai/Kimi-K2-Instruct-0905", - "display_name": "Pro/moonshotai/Kimi-K2-Instruct-0905", + "id": "space-bunny", + "name": "Space Bunny", + "display_name": "Space Bunny", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 1048576, + "output": 524288 }, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } }, + "attachment": true, + "open_weights": false, + "release_date": "2026-09-23", + "last_updated": "2026-09-23", "type": "chat" }, { - "id": "Qwen/Qwen3-Next-80B-A3B-Instruct", - "name": "Qwen/Qwen3-Next-80B-A3B-Instruct", - "display_name": "Qwen/Qwen3-Next-80B-A3B-Instruct", + "id": "glm-5.3", + "name": "GLM-5.3", + "display_name": "GLM-5.3", "modalities": { "input": [ "text" @@ -310936,31 +308812,57 @@ ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 1000000, + "output": 131072 }, + "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "low", + "high", + "max" + ] + } }, + "attachment": false, + "open_weights": true, + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "Qwen/Qwen3-Next-80B-A3B-Thinking", - "name": "Qwen/Qwen3-Next-80B-A3B-Thinking", - "display_name": "Qwen/Qwen3-Next-80B-A3B-Thinking", + "id": "mimo-v2.6-pro", + "name": "MiMo-V2.6-Pro", + "display_name": "MiMo-V2.6-Pro", "modalities": { "input": [ - "text" + "text", + "image", + "audio", + "video" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 1048576, + "output": 131072 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -310977,12 +308879,16 @@ ] } }, + "attachment": true, + "open_weights": true, + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "inclusionAI/Ring-flash-2.0", - "name": "inclusionAI/Ring-flash-2.0", - "display_name": "inclusionAI/Ring-flash-2.0", + "id": "mimo-v2.5-pro", + "name": "MiMo V2.5 Pro", + "display_name": "MiMo V2.5 Pro", "modalities": { "input": [ "text" @@ -310992,9 +308898,10 @@ ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 1048576, + "output": 128000 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -311002,191 +308909,195 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, + "attachment": false, + "open_weights": true, + "knowledge": "2024-12", + "release_date": "2026-04-22", + "last_updated": "2026-04-22", "type": "chat" }, { - "id": "inclusionAI/Ling-mini-2.0", - "name": "inclusionAI/Ling-mini-2.0", - "display_name": "inclusionAI/Ling-mini-2.0", + "id": "longcat-2.5-preview-free", + "name": "LongCat 2.5 Preview Free", + "display_name": "LongCat 2.5 Preview Free", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 1000000, + "output": 131072 }, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "type": "chat" - }, - { - "id": "Qwen/Qwen-Image-Edit-2509", - "name": "Qwen/Qwen-Image-Edit-2509", - "display_name": "Qwen/Qwen-Image-Edit-2509", - "modalities": { - "input": [ - "image", - "text" - ], - "output": [ - "image" - ] + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, - "tool_call": false, - "reasoning": { - "supported": false - } + "attachment": true, + "open_weights": false, + "release_date": "2026-09-25", + "last_updated": "2026-09-25", + "type": "chat" }, { - "id": "Qwen/Qwen-Image-Edit", - "name": "Qwen/Qwen-Image-Edit", - "display_name": "Qwen/Qwen-Image-Edit", + "id": "kimi-k3.1-pro", + "name": "Kimi K3.1 Pro", + "display_name": "Kimi K3.1 Pro", "modalities": { "input": [ + "text", "image", - "text" - ], - "output": [ - "image" - ] - }, - "tool_call": false, - "reasoning": { - "supported": false - } - }, - { - "id": "Qwen/Qwen-Image", - "name": "Qwen/Qwen-Image", - "display_name": "Qwen/Qwen-Image", - "modalities": { - "input": [ - "text" - ], - "output": [ - "image" - ] - }, - "tool_call": false, - "reasoning": { - "supported": false - } - }, - { - "id": "tencent/Hunyuan-MT-7B", - "name": "tencent/Hunyuan-MT-7B", - "display_name": "tencent/Hunyuan-MT-7B", - "modalities": { - "input": [ - "text" + "video" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 1048576, + "output": 131072 }, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "low", + "high", + "max" + ] + } }, + "attachment": true, + "open_weights": false, + "release_date": "2026-10-23", + "last_updated": "2026-10-23", "type": "chat" }, { - "id": "Wan-AI/Wan2.2-I2V-A14B", - "name": "Wan-AI/Wan2.2-I2V-A14B", - "display_name": "Wan-AI/Wan2.2-I2V-A14B", + "id": "qwen3.8-max", + "name": "Qwen3.8 Max", + "display_name": "Qwen3.8 Max", "modalities": { "input": [ + "text", "image", - "text" - ], - "output": [ - "video" - ] - }, - "tool_call": false, - "reasoning": { - "supported": false - } - }, - { - "id": "Wan-AI/Wan2.2-T2V-A14B", - "name": "Wan-AI/Wan2.2-T2V-A14B", - "display_name": "Wan-AI/Wan2.2-T2V-A14B", - "modalities": { - "input": [ - "text" - ], - "output": [ "video" - ] - }, - "tool_call": false, - "reasoning": { - "supported": false - } - }, - { - "id": "zai-org/GLM-4.5V", - "name": "zai-org/GLM-4.5V", - "display_name": "zai-org/GLM-4.5V", - "modalities": { - "input": [ - "text" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 1000000, + "output": 131072 }, + "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "low", + "medium", + "xhigh" + ] + } }, + "attachment": true, + "open_weights": false, + "release_date": "2026-08-03", + "last_updated": "2026-08-03", "type": "chat" }, { - "id": "zai-org/GLM-4.5", - "name": "zai-org/GLM-4.5", - "display_name": "zai-org/GLM-4.5", + "id": "gpt-6-luna", + "name": "GPT-6 Luna", + "display_name": "GPT-6 Luna", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 1050000, + "output": 128000 }, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ] + } }, + "attachment": true, + "open_weights": false, + "knowledge": "2026-05-18", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "stepfun-ai/step3", - "name": "stepfun-ai/step3", - "display_name": "stepfun-ai/step3", + "id": "iceman-contributor-free", + "name": "Iceman Contributor Free", + "display_name": "Iceman Contributor Free", "modalities": { "input": [ "text" @@ -311196,65 +309107,40 @@ ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 262144, + "output": 131072 }, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, + "attachment": false, + "open_weights": false, + "release_date": "2026-10-24", + "last_updated": "2026-10-24", "type": "chat" }, { - "id": "TeleAI/TeleSpeechASR", - "name": "TeleAI/TeleSpeechASR", - "display_name": "TeleAI/TeleSpeechASR", - "modalities": { - "input": [ - "audio" - ], - "output": [ - "text" - ] - }, - "tool_call": false, - "reasoning": { - "supported": false - } - }, - { - "id": "Qwen/Qwen3-Coder-480B-A35B-Instruct", - "name": "Qwen/Qwen3-Coder-480B-A35B-Instruct", - "display_name": "Qwen/Qwen3-Coder-480B-A35B-Instruct", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "tool_call": true, - "reasoning": { - "supported": false - } - }, - { - "id": "Qwen/Qwen3-30B-A3B-Thinking-2507", - "name": "Qwen/Qwen3-30B-A3B-Thinking-2507", - "display_name": "Qwen/Qwen3-30B-A3B-Thinking-2507", + "id": "mimo-v2.5", + "name": "MiMo V2.5", + "display_name": "MiMo V2.5", "modalities": { "input": [ - "text" + "text", + "image", + "audio", + "video" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 1000000, + "output": 128000 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -311271,20 +309157,32 @@ ] } }, + "attachment": true, + "open_weights": true, + "knowledge": "2024-12", + "release_date": "2026-04-22", + "last_updated": "2026-04-22", "type": "chat" }, { - "id": "Qwen/Qwen3-235B-A22B-Thinking-2507", - "name": "Qwen/Qwen3-235B-A22B-Thinking-2507", - "display_name": "Qwen/Qwen3-235B-A22B-Thinking-2507", + "id": "kimi-k2.7-code", + "name": "Kimi K2.7 Code", + "display_name": "Kimi K2.7 Code", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, + "limit": { + "context": 262144, + "output": 262144 + }, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -311301,34 +309199,17 @@ ] } }, + "attachment": true, + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-06-12", + "last_updated": "2026-06-12", "type": "chat" }, { - "id": "Qwen/Qwen3-235B-A22B-Instruct-2507", - "name": "Qwen/Qwen3-235B-A22B-Instruct-2507", - "display_name": "Qwen/Qwen3-235B-A22B-Instruct-2507", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 131072, - "output": 8192 - }, - "tool_call": true, - "reasoning": { - "supported": false - }, - "type": "chat" - }, - { - "id": "THUDM/GLM-4.1V-9B-Thinking", - "name": "THUDM/GLM-4.1V-9B-Thinking", - "display_name": "THUDM/GLM-4.1V-9B-Thinking", + "id": "hy4-preview", + "name": "Hy4 preview", + "display_name": "Hy4 preview", "modalities": { "input": [ "text" @@ -311338,20 +309219,34 @@ ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 1024000, + "output": 64000 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "none", + "high" + ] + } + }, + "attachment": false, + "open_weights": true, + "release_date": "2026-08-28", + "last_updated": "2026-08-28", "type": "chat" }, { - "id": "Pro/THUDM/GLM-4.1V-9B-Thinking", - "name": "Pro/THUDM/GLM-4.1V-9B-Thinking", - "display_name": "Pro/THUDM/GLM-4.1V-9B-Thinking", + "id": "cat-jam-free", + "name": "Cat Jam Free", + "display_name": "Cat Jam Free", "modalities": { "input": [ "text" @@ -311361,143 +309256,283 @@ ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 1048576, + "output": 131072 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + }, + "attachment": false, + "open_weights": false, + "release_date": "2026-10-12", + "last_updated": "2026-10-12", "type": "chat" }, { - "id": "baidu/ERNIE-4.5-300B-A47B", - "name": "baidu/ERNIE-4.5-300B-A47B", - "display_name": "baidu/ERNIE-4.5-300B-A47B", + "id": "claude-haiku-5-5", + "name": "Claude Haiku 5.5", + "display_name": "Claude Haiku 5.5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, + "limit": { + "context": 1000000, + "output": 128000 + }, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } }, + "attachment": true, + "open_weights": false, + "knowledge": "2026-06", + "release_date": "2026-10-07", + "last_updated": "2026-10-07", "type": "chat" }, { - "id": "moonshotai/Kimi-Dev-72B", - "name": "moonshotai/Kimi-Dev-72B", - "display_name": "moonshotai/Kimi-Dev-72B", + "id": "minimax-m3", + "name": "MiniMax-M3", + "display_name": "MiniMax-M3", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 1000000, + "output": 131072 }, + "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, + "attachment": true, + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-06-01", + "last_updated": "2026-06-01", "type": "chat" }, { - "id": "MiniMaxAI/MiniMax-M1-80k", - "name": "MiniMaxAI/MiniMax-M1-80k", - "display_name": "MiniMaxAI/MiniMax-M1-80k", + "id": "minimax-m3.1-flash-free", + "name": "MiniMax M3.1 Flash Free", + "display_name": "MiniMax M3.1 Flash Free", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 1000000, + "output": 512000 }, + "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } }, + "attachment": true, + "open_weights": false, + "release_date": "2026-10-19", + "last_updated": "2026-10-19", "type": "chat" }, { - "id": "Tongyi-Zhiwen/QwenLong-L1-32B", - "name": "Tongyi-Zhiwen/QwenLong-L1-32B", - "display_name": "Tongyi-Zhiwen/QwenLong-L1-32B", + "id": "minimax-m3.1-flash", + "name": "MiniMax M3.1 Flash", + "display_name": "MiniMax M3.1 Flash", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 1000000, + "output": 512000 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + }, + "attachment": true, + "open_weights": false, + "release_date": "2026-10-19", + "last_updated": "2026-10-19", "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-R1-0528-Qwen3-8B", - "name": "deepseek-ai/DeepSeek-R1-0528-Qwen3-8B", - "display_name": "deepseek-ai/DeepSeek-R1-0528-Qwen3-8B", + "id": "step-5-preview", + "name": "Step 5 Preview", + "display_name": "Step 5 Preview", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 1000000, + "output": 65536 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "low", + "medium", + "high" + ] + } + }, + "attachment": true, + "open_weights": true, + "release_date": "2026-09-16", + "last_updated": "2026-09-20", "type": "chat" }, { - "id": "Qwen/Qwen3-30B-A3B", - "name": "Qwen/Qwen3-30B-A3B", - "display_name": "Qwen/Qwen3-30B-A3B", + "id": "mimo-v2.6-flash", + "name": "MiMo-V2.6-Flash", + "display_name": "MiMo-V2.6-Flash", "modalities": { "input": [ - "text" + "text", + "image", + "audio", + "video" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 1048576, + "output": 131072 }, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { @@ -311510,144 +309545,98 @@ ] } }, + "attachment": true, + "open_weights": true, + "release_date": "2026-09-22", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "Qwen/Qwen3-Reranker-8B", - "name": "Qwen/Qwen3-Reranker-8B", - "display_name": "Qwen/Qwen3-Reranker-8B", + "id": "muse-spark-1.3-contributor", + "name": "Muse Spark 1.3 Contributor", + "display_name": "Muse Spark 1.3 Contributor", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "pdf", + "audio" ], "output": [ - "score" - ] - }, - "limit": { - "context": 8192, - "output": 2048 - }, - "tool_call": false, - "reasoning": { - "supported": false - }, - "type": "rerank" - }, - { - "id": "Qwen/Qwen3-Embedding-8B", - "name": "Qwen/Qwen3-Embedding-8B", - "display_name": "Qwen/Qwen3-Embedding-8B", - "modalities": { - "input": [ "text" - ], - "output": [ - "embedding" ] }, "limit": { - "context": 8192, - "output": 2048 + "context": 1048576, + "output": 131072 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false - }, - "type": "embedding" - }, - { - "id": "Qwen/Qwen3-Reranker-4B", - "name": "Qwen/Qwen3-Reranker-4B", - "display_name": "Qwen/Qwen3-Reranker-4B", - "modalities": { - "input": [ - "text" - ], - "output": [ - "score" - ] - }, - "limit": { - "context": 8192, - "output": 2048 + "supported": true, + "default": true }, - "tool_call": false, - "reasoning": { - "supported": false + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] + } }, - "type": "rerank" + "attachment": true, + "open_weights": false, + "release_date": "2026-09-02", + "last_updated": "2026-09-02", + "type": "chat" }, { - "id": "Qwen/Qwen3-Embedding-4B", - "name": "Qwen/Qwen3-Embedding-4B", - "display_name": "Qwen/Qwen3-Embedding-4B", + "id": "longcat-2.0", + "name": "LongCat-2.0", + "display_name": "LongCat-2.0", "modalities": { "input": [ "text" ], "output": [ - "embedding" - ] - }, - "limit": { - "context": 8192, - "output": 2048 - }, - "tool_call": false, - "reasoning": { - "supported": false - }, - "type": "embedding" - }, - { - "id": "Qwen/Qwen3-Reranker-0.6B", - "name": "Qwen/Qwen3-Reranker-0.6B", - "display_name": "Qwen/Qwen3-Reranker-0.6B", - "modalities": { - "input": [ "text" - ], - "output": [ - "score" ] }, "limit": { - "context": 8192, - "output": 2048 + "context": 1000000, + "output": 131072 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false - }, - "type": "rerank" - }, - { - "id": "Qwen/Qwen3-Embedding-0.6B", - "name": "Qwen/Qwen3-Embedding-0.6B", - "display_name": "Qwen/Qwen3-Embedding-0.6B", - "modalities": { - "input": [ - "text" - ], - "output": [ - "embedding" - ] - }, - "limit": { - "context": 8192, - "output": 2048 + "supported": true, + "default": true }, - "tool_call": false, - "reasoning": { - "supported": false + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, - "type": "embedding" + "attachment": false, + "open_weights": true, + "release_date": "2026-06-30", + "last_updated": "2026-06-30", + "type": "chat" }, { - "id": "ascend-tribe/pangu-pro-moe", - "name": "ascend-tribe/pangu-pro-moe", - "display_name": "ascend-tribe/pangu-pro-moe", + "id": "deepseek-v4-pro", + "name": "DeepSeek V4 Pro (New)", + "display_name": "DeepSeek V4 Pro (New)", "modalities": { "input": [ "text" @@ -311657,129 +309646,252 @@ ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 1000000, + "output": 384000 }, + "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "high", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." + ] + } }, + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "THUDM/GLM-Z1-32B-0414", - "name": "THUDM/GLM-Z1-32B-0414", - "display_name": "THUDM/GLM-Z1-32B-0414", + "id": "gemini-4-argon-contributor", + "name": "Gemini 4 Argon Contributor", + "display_name": "Gemini 4 Argon Contributor", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 1048576, + "output": 65536 }, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "high" + ] + } }, + "attachment": true, + "open_weights": false, + "knowledge": "2026-03", + "release_date": "2026-10-13", + "last_updated": "2026-10-13", "type": "chat" }, { - "id": "THUDM/GLM-4-32B-0414", - "name": "THUDM/GLM-4-32B-0414", - "display_name": "THUDM/GLM-4-32B-0414", + "id": "gemini-4-argon", + "name": "Gemini 4 Argon", + "display_name": "Gemini 4 Argon", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 1048576, + "output": 65536 }, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "high" + ] + } }, + "attachment": true, + "open_weights": false, + "knowledge": "2026-03", + "release_date": "2026-10-13", + "last_updated": "2026-10-13", "type": "chat" }, { - "id": "THUDM/GLM-Z1-9B-0414", - "name": "THUDM/GLM-Z1-9B-0414", - "display_name": "THUDM/GLM-Z1-9B-0414", + "id": "qwen3.7-plus", + "name": "Qwen3.7 Plus", + "display_name": "Qwen3.7 Plus", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 1000000, + "output": 65536 }, + "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-04", + "release_date": "2026-06-02", + "last_updated": "2026-06-02", "type": "chat" }, { - "id": "THUDM/GLM-4-9B-0414", - "name": "THUDM/GLM-4-9B-0414", - "display_name": "THUDM/GLM-4-9B-0414", + "id": "kimi-k3", + "name": "Kimi K3", + "display_name": "Kimi K3", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 1048576, + "output": 131072 }, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "max" + ] + } }, + "attachment": true, + "open_weights": true, + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" }, { - "id": "Qwen/Qwen2.5-VL-32B-Instruct", - "name": "Qwen/Qwen2.5-VL-32B-Instruct", - "display_name": "Qwen/Qwen2.5-VL-32B-Instruct", + "id": "qwen3.8-flash", + "name": "Qwen3.8 Flash", + "display_name": "Qwen3.8 Flash", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 1000000, + "output": 131072 }, + "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "low", + "medium", + "xhigh" + ] + } }, + "attachment": true, + "open_weights": false, + "release_date": "2026-08-26", + "last_updated": "2026-08-26", "type": "chat" }, { - "id": "Qwen/Qwen3-235B-A22B", - "name": "Qwen/Qwen3-235B-A22B", - "display_name": "Qwen/Qwen3-235B-A22B", + "id": "beam-free", + "name": "Beam Free", + "display_name": "Beam Free", "modalities": { "input": [ "text" @@ -311789,12 +309901,14 @@ ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 1048576, + "output": 131072 }, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { @@ -311804,30 +309918,46 @@ "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" ] } }, + "attachment": false, + "open_weights": true, + "knowledge": "2026-06-30", + "release_date": "2026-10-05", + "last_updated": "2026-10-16", "type": "chat" }, { - "id": "Qwen/QwQ-32B", - "name": "Qwen/QwQ-32B", - "display_name": "Qwen/QwQ-32B", + "id": "glm-5.3-flash", + "name": "GLM-5.3-Flash", + "display_name": "GLM-5.3-Flash", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 1000000, + "output": 131072 }, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { @@ -311837,105 +309967,196 @@ "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "effort_options": [ + "low", + "high", + "max" ] } }, + "attachment": true, + "open_weights": true, + "release_date": "2026-08-26", + "last_updated": "2026-08-26", "type": "chat" }, { - "id": "Qwen/Qwen2.5-VL-72B-Instruct", - "name": "Qwen/Qwen2.5-VL-72B-Instruct", - "display_name": "Qwen/Qwen2.5-VL-72B-Instruct", + "id": "step-5-preview-free", + "name": "Step 5 Preview Free", + "display_name": "Step 5 Preview Free", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 1000000, + "output": 65536 }, + "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "low", + "medium", + "high" + ] + } }, + "attachment": true, + "open_weights": true, + "release_date": "2026-09-16", + "last_updated": "2026-09-20", "type": "chat" }, { - "id": "Pro/Qwen/Qwen2.5-VL-7B-Instruct", - "name": "Pro/Qwen/Qwen2.5-VL-7B-Instruct", - "display_name": "Pro/Qwen/Qwen2.5-VL-7B-Instruct", + "id": "grok-4.7", + "name": "Grok 4.7", + "display_name": "Grok 4.7", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 500000, + "output": 500000 }, + "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "high", + "xhigh" + ] + } }, + "attachment": true, + "open_weights": false, + "knowledge": "2026-05", + "release_date": "2026-09-21", + "last_updated": "2026-09-21", "type": "chat" - }, + } + ] + }, + "lilac": { + "id": "lilac", + "name": "Lilac", + "display_name": "Lilac", + "api": "https://api.getlilac.com/v1", + "doc": "https://docs.getlilac.com/inference/models", + "models": [ { - "id": "deepseek-ai/DeepSeek-R1-Distill-Qwen-32B", - "name": "deepseek-ai/DeepSeek-R1-Distill-Qwen-32B", - "display_name": "deepseek-ai/DeepSeek-R1-Distill-Qwen-32B", + "id": "minimaxai/minimax-m3", + "name": "MiniMax M3", + "display_name": "MiniMax M3", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 1048576, + "output": 1048576 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": true, + "open_weights": true, + "release_date": "2026-06-01", + "last_updated": "2026-06-01", "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-R1-Distill-Qwen-14B", - "name": "deepseek-ai/DeepSeek-R1-Distill-Qwen-14B", - "display_name": "deepseek-ai/DeepSeek-R1-Distill-Qwen-14B", + "id": "moonshotai/kimi-k2.6", + "name": "Kimi K2.6", + "display_name": "Kimi K2.6", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 262144, + "output": 262144 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": true, + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-04-20", + "last_updated": "2026-04-20", "type": "chat" }, { - "id": "deepseek-ai/DeepSeek-R1-Distill-Qwen-7B", - "name": "deepseek-ai/DeepSeek-R1-Distill-Qwen-7B", - "display_name": "deepseek-ai/DeepSeek-R1-Distill-Qwen-7B", + "id": "zai-org/glm-5.2", + "name": "GLM 5.2", + "display_name": "GLM 5.2", "modalities": { "input": [ "text" @@ -311945,99 +310166,117 @@ ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 524288, + "output": 524288 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "high", + "max" + ] + } + }, + "attachment": false, + "open_weights": true, + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "Qwen/QVQ-72B-Preview", - "name": "Qwen/QVQ-72B-Preview", - "display_name": "Qwen/QVQ-72B-Preview", + "id": "google/gemma-4-31b-it", + "name": "Gemma 4 31B IT", + "display_name": "Gemma 4 31B IT", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 262100, + "output": 262100 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": true, + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" - }, + } + ] + }, + "privatemode-ai": { + "id": "privatemode-ai", + "name": "Privatemode AI", + "display_name": "Privatemode AI", + "api": "http://localhost:8080/v1", + "doc": "https://docs.privatemode.ai/api/overview", + "models": [ { - "id": "deepseek-ai/DeepSeek-V2.5", - "name": "deepseek-ai/DeepSeek-V2.5", - "display_name": "deepseek-ai/DeepSeek-V2.5", + "id": "voxtral-mini-3b", + "name": "Voxtral Mini 3B", + "display_name": "Voxtral Mini 3B", "modalities": { "input": [ - "text" + "audio" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 8192 - }, - "tool_call": true, - "reasoning": { - "supported": false - }, - "type": "chat" - }, - { - "id": "fnlp/MOSS-TTSD-v0.5", - "name": "fnlp/MOSS-TTSD-v0.5", - "display_name": "fnlp/MOSS-TTSD-v0.5", - "modalities": { - "input": [ - "text" - ], - "output": [ - "audio" - ] + "context": 32000, + "output": 32000 }, + "temperature": true, "tool_call": false, "reasoning": { "supported": false - } - }, - { - "id": "FunAudioLLM/CosyVoice2-0.5B", - "name": "FunAudioLLM/CosyVoice2-0.5B", - "display_name": "FunAudioLLM/CosyVoice2-0.5B", - "modalities": { - "input": [ - "text" - ], - "output": [ - "audio" - ] }, - "tool_call": false, - "reasoning": { - "supported": false - } + "attachment": true, + "open_weights": true, + "release_date": "2025-07-15", + "last_updated": "2025-07-15" }, { - "id": "FunAudioLLM/SenseVoiceSmall", - "name": "FunAudioLLM/SenseVoiceSmall", - "display_name": "FunAudioLLM/SenseVoiceSmall", + "id": "whisper-large-v3", + "name": "Whisper large-v3", + "display_name": "Whisper large-v3", "modalities": { "input": [ "audio" @@ -312046,32 +310285,24 @@ "text" ] }, - "tool_call": false, - "reasoning": { - "supported": false - } - }, - { - "id": "IndexTeam/IndexTTS-2", - "name": "IndexTeam/IndexTTS-2", - "display_name": "IndexTeam/IndexTTS-2", - "modalities": { - "input": [ - "text" - ], - "output": [ - "audio" - ] + "limit": { + "context": 448, + "output": 4096 }, + "temperature": true, "tool_call": false, "reasoning": { "supported": false - } + }, + "attachment": true, + "open_weights": true, + "release_date": "2023-11-06", + "last_updated": "2023-11-06" }, { - "id": "BAAI/bge-m3", - "name": "BAAI/bge-m3", - "display_name": "BAAI/bge-m3", + "id": "glm-5.3", + "name": "GLM-5.3", + "display_name": "GLM-5.3", "modalities": { "input": [ "text" @@ -312081,122 +310312,214 @@ ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 1000000, + "output": 131072 }, + "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "type": "embedding" + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "low", + "high", + "max" + ] + } + }, + "attachment": false, + "open_weights": true, + "release_date": "2026-08-14", + "last_updated": "2026-08-14", + "type": "chat" }, { - "id": "BAAI/bge-reranker-v2-m3", - "name": "BAAI/bge-reranker-v2-m3", - "display_name": "BAAI/bge-reranker-v2-m3", + "id": "glm-flash-latest", + "name": "GLM Flash (latest)", + "display_name": "GLM Flash (latest)", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ - "score" + "text" ] }, "limit": { - "context": 8192, - "output": 2048 + "context": 1000000, + "output": 131072 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "type": "rerank" + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "high", + "max" + ] + } + }, + "attachment": true, + "open_weights": true, + "release_date": "2026-08-26", + "last_updated": "2026-08-26", + "type": "chat" }, - { - "id": "netease-youdao/bce-embedding-base_v1", - "name": "netease-youdao/bce-embedding-base_v1", - "display_name": "netease-youdao/bce-embedding-base_v1", + { + "id": "gpt-oss-120b", + "name": "gpt-oss-120b", + "display_name": "gpt-oss-120b", "modalities": { "input": [ "text" ], "output": [ - "embedding" + "text" ] }, "limit": { - "context": 8192, - "output": 2048 + "context": 128000, + "output": 32768 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "type": "embedding" + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "low", + "medium", + "high" + ] + } + }, + "attachment": false, + "open_weights": true, + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", + "type": "chat" }, { - "id": "netease-youdao/bce-reranker-base_v1", - "name": "netease-youdao/bce-reranker-base_v1", - "display_name": "netease-youdao/bce-reranker-base_v1", + "id": "kimi-k2.6", + "name": "Kimi K2.6", + "display_name": "Kimi K2.6", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ - "score" + "text" ] }, "limit": { - "context": 8192, - "output": 2048 + "context": 256000, + "output": 262144 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false - } + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": true, + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-04-20", + "last_updated": "2026-04-20", + "type": "chat" }, { - "id": "Qwen/Qwen2.5-Coder-32B-Instruct", - "name": "Qwen/Qwen2.5-Coder-32B-Instruct", - "display_name": "Qwen/Qwen2.5-Coder-32B-Instruct", + "id": "deepseek-ocr-2", + "name": "DeepSeek OCR 2", + "display_name": "DeepSeek OCR 2", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 131072, + "context": 8192, "output": 8192 }, - "tool_call": true, + "temperature": true, + "tool_call": false, "reasoning": { "supported": false - } + }, + "attachment": true, + "open_weights": true, + "release_date": "2026-01-27", + "last_updated": "2026-01-27", + "type": "chat" }, { - "id": "Kwai-Kolors/Kolors", - "name": "Kwai-Kolors/Kolors", - "display_name": "Kwai-Kolors/Kolors", + "id": "glm-5.3-flash", + "name": "GLM-5.3-Flash", + "display_name": "GLM-5.3-Flash", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ - "image" + "text" ] }, - "tool_call": false, + "limit": { + "context": 1000000, + "output": 131072 + }, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false - } + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "low", + "high", + "max" + ] + } + }, + "attachment": true, + "open_weights": true, + "release_date": "2026-08-26", + "last_updated": "2026-08-26", + "type": "chat" }, { - "id": "Qwen/Qwen2-VL-72B-Instruct", - "name": "Qwen/Qwen2-VL-72B-Instruct", - "display_name": "Qwen/Qwen2-VL-72B-Instruct", + "id": "qwen3-embedding-4b", + "name": "Qwen3-Embedding 4B", + "display_name": "Qwen3-Embedding 4B", "modalities": { "input": [ "text" @@ -312206,19 +310529,25 @@ ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 32000, + "output": 2560 }, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { "supported": false }, - "type": "chat" + "attachment": false, + "open_weights": true, + "knowledge": "2025-06", + "release_date": "2025-06-05", + "last_updated": "2025-06-05", + "type": "embedding" }, { - "id": "Qwen/Qwen2.5-72B-Instruct-128K", - "name": "Qwen/Qwen2.5-72B-Instruct-128K", - "display_name": "Qwen/Qwen2.5-72B-Instruct-128K", + "id": "glm-latest", + "name": "GLM (latest)", + "display_name": "GLM (latest)", "modalities": { "input": [ "text" @@ -312228,41 +310557,73 @@ ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 1000000, + "output": 131072 }, + "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "high", + "max" + ] + } + }, + "attachment": false, + "open_weights": true, + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "deepseek-ai/deepseek-vl2", - "name": "deepseek-ai/deepseek-vl2", - "display_name": "deepseek-ai/deepseek-vl2", + "id": "kimi-latest", + "name": "Kimi (latest)", + "display_name": "Kimi (latest)", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 256000, + "output": 262144 }, + "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, + "attachment": true, + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-04-20", + "last_updated": "2026-04-20", "type": "chat" - }, + } + ] + }, + "engy": { + "id": "engy", + "name": "engy", + "display_name": "engy", + "api": "https://api.engy.ai/v1", + "doc": "https://engy.ai/pricing", + "models": [ { - "id": "Qwen/Qwen2.5-32B-Instruct", - "name": "Qwen/Qwen2.5-32B-Instruct", - "display_name": "Qwen/Qwen2.5-32B-Instruct", + "id": "deepseek-v4-flash-0731", + "name": "DeepSeek V4 Flash 0731", + "display_name": "DeepSeek V4 Flash 0731", "modalities": { "input": [ "text" @@ -312272,19 +310633,42 @@ ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 1048576, + "output": 128000 }, + "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "low", + "high", + "max" + ] + } }, + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-07-31", + "last_updated": "2026-07-31", "type": "chat" }, { - "id": "Qwen/Qwen2.5-14B-Instruct", - "name": "Qwen/Qwen2.5-14B-Instruct", - "display_name": "Qwen/Qwen2.5-14B-Instruct", + "id": "glm-5.2", + "name": "GLM-5.2", + "display_name": "GLM-5.2", "modalities": { "input": [ "text" @@ -312294,40 +310678,86 @@ ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 262144, + "output": 32768 }, + "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "high", + "max" + ] + } }, + "attachment": false, + "open_weights": true, + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "Qwen/Qwen2.5-Coder-7B-Instruct", - "name": "Qwen/Qwen2.5-Coder-7B-Instruct", - "display_name": "Qwen/Qwen2.5-Coder-7B-Instruct", + "id": "deepseek-v4.1-flash", + "name": "DeepSeek V4.1 Flash", + "display_name": "DeepSeek V4.1 Flash", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 1048576, + "output": 65536 }, + "temperature": true, "tool_call": true, "reasoning": { - "supported": false - } + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "low", + "high", + "max" + ] + } + }, + "attachment": true, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-09-10", + "last_updated": "2026-09-10", + "type": "chat" }, { - "id": "internlm/internlm2_5-7b-chat", - "name": "internlm/internlm2_5-7b-chat", - "display_name": "internlm/internlm2_5-7b-chat", + "id": "glm-5.3", + "name": "GLM-5.3", + "display_name": "GLM-5.3", "modalities": { "input": [ "text" @@ -312337,19 +310767,41 @@ ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 327680, + "output": 32768 }, + "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "low", + "high", + "max" + ] + } }, + "attachment": false, + "open_weights": true, + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "Qwen/Qwen2-7B-Instruct", - "name": "Qwen/Qwen2-7B-Instruct", - "display_name": "Qwen/Qwen2-7B-Instruct", + "id": "qwen3.6-35b-a3b", + "name": "Qwen3.6 35B-A3B", + "display_name": "Qwen3.6 35B-A3B", "modalities": { "input": [ "text" @@ -312359,152 +310811,315 @@ ] }, "limit": { - "context": 131072, + "context": 208192, "output": 8192 }, + "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, + "attachment": false, + "open_weights": true, + "release_date": "2026-04-17", + "last_updated": "2026-04-17", "type": "chat" }, { - "id": "THUDM/glm-4-9b-chat", - "name": "THUDM/glm-4-9b-chat", - "display_name": "THUDM/glm-4-9b-chat", + "id": "deepseek-v4.1-flash-1017", + "name": "DeepSeek V4.1 Flash 1017", + "display_name": "DeepSeek V4.1 Flash 1017", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 1048576, + "output": 65536 }, + "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "low", + "high", + "max" + ] + } }, + "attachment": true, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-10-17", + "last_updated": "2026-10-17", "type": "chat" }, { - "id": "BAAI/bge-large-en-v1.5", - "name": "BAAI/bge-large-en-v1.5", - "display_name": "BAAI/bge-large-en-v1.5", + "id": "kimi-k3", + "name": "Kimi K3", + "display_name": "Kimi K3", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 1113088, + "output": 65536 }, + "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "type": "embedding" + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": true, + "open_weights": true, + "release_date": "2026-07-16", + "last_updated": "2026-07-16", + "type": "chat" }, { - "id": "BAAI/bge-large-zh-v1.5", - "name": "BAAI/bge-large-zh-v1.5", - "display_name": "BAAI/bge-large-zh-v1.5", + "id": "qwen3.8-27b", + "name": "Qwen3.8 27B", + "display_name": "Qwen3.8 27B", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 1001536, + "output": 65536 }, + "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "type": "embedding" + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "low", + "medium", + "xhigh" + ] + } + }, + "attachment": true, + "open_weights": true, + "release_date": "2026-08-14", + "last_updated": "2026-08-14", + "type": "chat" }, { - "id": "LoRA/Qwen/Qwen2.5-32B-Instruct", - "name": "LoRA/Qwen/Qwen2.5-32B-Instruct", - "display_name": "LoRA/Qwen/Qwen2.5-32B-Instruct", + "id": "glm-5.3-flash", + "name": "GLM-5.3-Flash", + "display_name": "GLM-5.3-Flash", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 327680, + "output": 32768 }, + "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "low", + "high", + "max" + ] + } }, + "attachment": true, + "open_weights": true, + "release_date": "2026-08-26", + "last_updated": "2026-08-26", "type": "chat" - }, + } + ] + }, + "infer": { + "id": "infer", + "name": "Infer by Flow7", + "display_name": "Infer by Flow7", + "api": "https://infer.flow7.org/v1", + "doc": "https://infer.flow7.org/opencode", + "models": [ { - "id": "LoRA/Qwen/Qwen2.5-14B-Instruct", - "name": "LoRA/Qwen/Qwen2.5-14B-Instruct", - "display_name": "LoRA/Qwen/Qwen2.5-14B-Instruct", + "id": "infer/gpt-6-astra:official", + "name": "GPT-6 Astra (Official API)", + "display_name": "GPT-6 Astra (Official API)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 271999, + "output": 128000 }, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } }, + "attachment": true, + "open_weights": false, + "knowledge": "2026-04-30", + "release_date": "2026-09-04", + "last_updated": "2026-09-04", "type": "chat" }, { - "id": "Pro/deepseek-ai/DeepSeek-R1-Distill-Qwen-7B", - "name": "Pro/deepseek-ai/DeepSeek-R1-Distill-Qwen-7B", - "display_name": "Pro/deepseek-ai/DeepSeek-R1-Distill-Qwen-7B", + "id": "infer/gpt-5.6-sol:official", + "name": "GPT-5.6 Sol (Official API)", + "display_name": "GPT-5.6 Sol (Official API)", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 271999, + "output": 128000 }, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2026-02-16", + "release_date": "2026-07-09", + "last_updated": "2026-07-09", "type": "chat" - }, + } + ] + }, + "pendra": { + "id": "pendra", + "name": "Pendra", + "display_name": "Pendra", + "api": "https://api.pendra.ai/api/v1", + "doc": "https://pendra.ai/docs/integrations/opencode", + "models": [ { - "id": "Pro/Qwen/Qwen2.5-Coder-7B-Instruct", - "name": "Pro/Qwen/Qwen2.5-Coder-7B-Instruct", - "display_name": "Pro/Qwen/Qwen2.5-Coder-7B-Instruct", + "id": "deepseek-v4-flash", + "name": "DeepSeek V4 Flash", + "display_name": "DeepSeek V4 Flash", "modalities": { "input": [ "text" @@ -312514,18 +311129,48 @@ ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 1000000, + "output": 384000 }, + "temperature": true, "tool_call": true, "reasoning": { - "supported": false - } + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "high", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." + ] + } + }, + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", + "type": "chat" }, { - "id": "Pro/BAAI/bge-m3", - "name": "Pro/BAAI/bge-m3", - "display_name": "Pro/BAAI/bge-m3", + "id": "gpt-oss:120b", + "name": "GPT OSS 120B", + "display_name": "GPT OSS 120B", "modalities": { "input": [ "text" @@ -312536,18 +311181,34 @@ }, "limit": { "context": 131072, - "output": 8192 + "output": 32768 }, + "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "type": "embedding" + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "high" + ] + } + }, + "attachment": false, + "open_weights": true, + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", + "type": "chat" }, { - "id": "Pro/Qwen/Qwen2.5-7B-Instruct", - "name": "Pro/Qwen/Qwen2.5-7B-Instruct", - "display_name": "Pro/Qwen/Qwen2.5-7B-Instruct", + "id": "glm-4.7-flash", + "name": "GLM-4.7-Flash", + "display_name": "GLM-4.7-Flash", "modalities": { "input": [ "text" @@ -312557,41 +311218,60 @@ ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 200000, + "output": 131072 }, + "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2026-01-19", + "last_updated": "2026-01-19", "type": "chat" }, { - "id": "Pro/BAAI/bge-reranker-v2-m3", - "name": "Pro/BAAI/bge-reranker-v2-m3", - "display_name": "Pro/BAAI/bge-reranker-v2-m3", + "id": "qwen3.6:27b", + "name": "Qwen3.6 27B", + "display_name": "Qwen3.6 27B", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ - "score" + "text" ] }, "limit": { - "context": 8192, - "output": 2048 + "context": 262144, + "output": 65536 }, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "type": "rerank" + "attachment": true, + "open_weights": true, + "release_date": "2026-04-22", + "last_updated": "2026-04-22", + "type": "chat" }, { - "id": "LoRA/Qwen/Qwen2.5-72B-Instruct", - "name": "LoRA/Qwen/Qwen2.5-72B-Instruct", - "display_name": "LoRA/Qwen/Qwen2.5-72B-Instruct", + "id": "qwen3-coder:30b", + "name": "Qwen3-Coder 30B-A3B Instruct", + "display_name": "Qwen3-Coder 30B-A3B Instruct", "modalities": { "input": [ "text" @@ -312601,19 +311281,25 @@ ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 262144, + "output": 65536 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": false }, + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-07-31", + "last_updated": "2025-07-31", "type": "chat" }, { - "id": "Pro/Qwen/Qwen2-7B-Instruct", - "name": "Pro/Qwen/Qwen2-7B-Instruct", - "display_name": "Pro/Qwen/Qwen2-7B-Instruct", + "id": "llama3.3:70b", + "name": "Llama-3.3-70B-Instruct", + "display_name": "Llama-3.3-70B-Instruct", "modalities": { "input": [ "text" @@ -312623,63 +311309,138 @@ ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 128000, + "output": 4096 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": false }, + "attachment": false, + "open_weights": true, + "knowledge": "2023-12", + "release_date": "2024-12-06", + "last_updated": "2024-12-06", "type": "chat" - }, + } + ] + }, + "frogbot": { + "id": "frogbot", + "name": "FrogBot", + "display_name": "FrogBot", + "api": "https://app.frogbot.ai/api/v1", + "doc": "https://docs.frogbot.ai", + "models": [ { - "id": "LoRA/Qwen/Qwen2.5-7B-Instruct", - "name": "LoRA/Qwen/Qwen2.5-7B-Instruct", - "display_name": "LoRA/Qwen/Qwen2.5-7B-Instruct", + "id": "claude-haiku-4-5", + "name": "Claude Haiku 4.5", + "display_name": "Claude Haiku 4.5", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 200000, + "output": 64000 }, + "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "budget", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", + "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." + ] + } }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-02-28", + "release_date": "2025-10-15", + "last_updated": "2025-10-15", "type": "chat" }, { - "id": "Pro/THUDM/glm-4-9b-chat", - "name": "Pro/THUDM/glm-4-9b-chat", - "display_name": "Pro/THUDM/glm-4-9b-chat", + "id": "gemini-3-flash-preview", + "name": "Gemini 3 Flash Preview", + "display_name": "Gemini 3 Flash Preview", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 1048576, + "output": 65536 }, + "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "high", + "level_options": [ + "minimal", + "low", + "medium", + "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] + } }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2025-12-17", + "last_updated": "2025-12-17", "type": "chat" }, { - "id": "THUDM/GLM-Z1-Rumination-32B-0414", - "name": "THUDM/GLM-Z1-Rumination-32B-0414", - "display_name": "THUDM/GLM-Z1-Rumination-32B-0414", + "id": "gpt-oss-20b", + "name": "GPT OSS 20B", + "display_name": "GPT OSS 20B", "modalities": { "input": [ "text" @@ -312690,242 +311451,379 @@ }, "limit": { "context": 131072, - "output": 8192 + "output": 32768 }, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "low", + "medium", + "high" + ] + } + }, + "attachment": false, + "open_weights": true, + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "stabilityai/stable-diffusion-xl-base-1.0", - "name": "stabilityai/stable-diffusion-xl-base-1.0", - "display_name": "stabilityai/stable-diffusion-xl-base-1.0", + "id": "gpt-5-4-nano", + "name": "GPT-5.4 Nano", + "display_name": "GPT-5.4 Nano", "modalities": { "input": [ - "text" - ], - "output": [ + "text", "image" - ] - }, - "tool_call": false, - "reasoning": { - "supported": false - } - }, - { - "id": "black-forest-labs/FLUX.1-schnell", - "name": "black-forest-labs/FLUX.1-schnell", - "display_name": "black-forest-labs/FLUX.1-schnell", - "modalities": { - "input": [ - "text" ], "output": [ - "image" - ] - }, - "tool_call": false, - "reasoning": { - "supported": false - } - }, - { - "id": "black-forest-labs/FLUX.1-dev", - "name": "black-forest-labs/FLUX.1-dev", - "display_name": "black-forest-labs/FLUX.1-dev", - "modalities": { - "input": [ "text" - ], - "output": [ - "image" ] }, - "tool_call": false, - "reasoning": { - "supported": false - } - }, - { - "id": "Pro/black-forest-labs/FLUX.1-schnell", - "name": "Pro/black-forest-labs/FLUX.1-schnell", - "display_name": "Pro/black-forest-labs/FLUX.1-schnell", - "modalities": { - "input": [ - "text" - ], - "output": [ - "image" - ] + "limit": { + "context": 400000, + "output": 128000 }, - "tool_call": false, + "temperature": false, + "tool_call": true, "reasoning": { - "supported": false - } + "supported": true, + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2024-05-30", + "release_date": "2026-03-17", + "last_updated": "2026-03-17", + "type": "chat" }, { - "id": "stabilityai/stable-diffusion-3-5-large", - "name": "stabilityai/stable-diffusion-3-5-large", - "display_name": "stabilityai/stable-diffusion-3-5-large", + "id": "grok-4-3", + "name": "Grok 4.3", + "display_name": "Grok 4.3", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ - "image" + "text" ] }, - "tool_call": false, + "limit": { + "context": 1000000, + "output": 128000 + }, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false - } - }, - { - "id": "fishaudio/fish-speech-1.4", - "name": "fishaudio/fish-speech-1.4", - "display_name": "fishaudio/fish-speech-1.4", - "modalities": { - "input": [ - "text" - ], - "output": [ - "audio" - ] + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "high" + ] + } }, - "tool_call": false, - "reasoning": { - "supported": false - } + "attachment": true, + "open_weights": false, + "knowledge": "2024-11", + "release_date": "2026-04-17", + "last_updated": "2026-04-17", + "type": "chat" }, { - "id": "RVC-Boss/GPT-SoVITS", - "name": "RVC-Boss/GPT-SoVITS", - "display_name": "RVC-Boss/GPT-SoVITS", + "id": "qwen-3-6-plus", + "name": "Qwen 3.6 Plus", + "display_name": "Qwen 3.6 Plus", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ - "audio" + "text" ] }, - "tool_call": false, + "limit": { + "context": 1000000, + "output": 64000 + }, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false - } + "supported": true, + "default": true + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-04", + "release_date": "2026-04-02", + "last_updated": "2026-04-02", + "type": "chat" }, { - "id": "fishaudio/fish-speech-1.5", - "name": "fishaudio/fish-speech-1.5", - "display_name": "fishaudio/fish-speech-1.5", + "id": "claude-sonnet-4-6", + "name": "Claude Sonnet 4.6", + "display_name": "Claude Sonnet 4.6", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ - "audio" + "text" ] }, - "tool_call": false, + "limit": { + "context": 200000, + "output": 64000 + }, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false - } + "supported": true, + "default": false + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-02-17", + "last_updated": "2026-03-13", + "type": "chat" }, { - "id": "black-forest-labs/FLUX.1-pro", - "name": "black-forest-labs/FLUX.1-pro", - "display_name": "black-forest-labs/FLUX.1-pro", + "id": "gpt-4o", + "name": "GPT-4o", + "display_name": "GPT-4o", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ - "image" + "text" ] }, - "tool_call": false, + "limit": { + "context": 128000, + "output": 16384 + }, + "temperature": true, + "tool_call": true, "reasoning": { "supported": false - } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2023-09", + "release_date": "2024-05-13", + "last_updated": "2024-08-06", + "type": "chat" }, { - "id": "LoRA/black-forest-labs/FLUX.1-dev", - "name": "LoRA/black-forest-labs/FLUX.1-dev", - "display_name": "LoRA/black-forest-labs/FLUX.1-dev", + "id": "gemini-2.5-pro", + "name": "Gemini 2.5 Pro", + "display_name": "Gemini 2.5 Pro", "modalities": { "input": [ - "text" + "text", + "image", + "audio", + "video", + "pdf" ], "output": [ - "image" + "text" ] }, - "tool_call": false, + "limit": { + "context": 1048576, + "output": 65536 + }, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false - } + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "budget", + "budget": { + "default": -1, + "min": 128, + "max": 32768, + "auto": -1, + "unit": "tokens" + }, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2025-06-17", + "last_updated": "2025-06-17", + "type": "chat" }, { - "id": "SeedLLM/Seed-Rice-7B", - "name": "SeedLLM/Seed-Rice-7B", - "display_name": "SeedLLM/Seed-Rice-7B", + "id": "grok-4-1-fast-reasoning", + "name": "Grok 4.1 Fast (Reasoning)", + "display_name": "Grok 4.1 Fast (Reasoning)", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 2000000, + "output": 128000 }, + "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-11", + "release_date": "2025-11-19", + "last_updated": "2025-11-19", "type": "chat" - } - ] - }, - "frogbot": { - "id": "frogbot", - "name": "FrogBot", - "display_name": "FrogBot", - "api": "https://app.frogbot.ai/api/v1", - "doc": "https://docs.frogbot.ai", - "models": [ + }, { - "id": "minimax-m2-7", - "name": "MiniMax-M2.7", - "display_name": "MiniMax-M2.7", + "id": "gpt-5-4-mini", + "name": "GPT-5.4 Mini", + "display_name": "GPT-5.4 Mini", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 192000, - "output": 8192 + "context": 400000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-09", - "release_date": "2026-03-18", - "last_updated": "2026-03-18", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "none", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-08-31", + "release_date": "2026-03-17", + "last_updated": "2026-03-17", "type": "chat" }, { @@ -312986,9 +311884,9 @@ "type": "chat" }, { - "id": "minimax-m2-5", - "name": "MiniMax-M2.5", - "display_name": "MiniMax-M2.5", + "id": "minimax-m2-7", + "name": "MiniMax-M2.7", + "display_name": "MiniMax-M2.7", "modalities": { "input": [ "text" @@ -313009,46 +311907,79 @@ "attachment": false, "open_weights": true, "knowledge": "2024-09", - "release_date": "2026-02-12", - "last_updated": "2026-02-12", + "release_date": "2026-03-18", + "last_updated": "2026-03-18", "type": "chat" }, { - "id": "zai-glm-5-1", - "name": "Z.AI GLM-5.1", - "display_name": "Z.AI GLM-5.1", + "id": "claude-opus-4-6", + "name": "Claude Opus 4.6", + "display_name": "Claude Opus 4.6", "modalities": { "input": [ - "text" + "text", + "image", + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 198000, - "output": 8192 + "context": 200000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": false }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-10", - "release_date": "2026-04-07", - "last_updated": "2026-04-07", + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-05-31", + "release_date": "2026-02-05", + "last_updated": "2026-03-13", "type": "chat" }, { - "id": "qwen-3-6-plus", - "name": "Qwen 3.6 Plus", - "display_name": "Qwen 3.6 Plus", + "id": "gemini-3-1-pro-preview", + "name": "Gemini 3.1 Pro Preview", + "display_name": "Gemini 3.1 Pro Preview", "modalities": { "input": [ "text", "image", + "video", + "audio", "pdf" ], "output": [ @@ -313065,98 +311996,77 @@ "supported": true, "default": true }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-04", - "release_date": "2026-04-02", - "last_updated": "2026-04-02", - "type": "chat" - }, - { - "id": "gpt-4o", - "name": "GPT-4o", - "display_name": "GPT-4o", - "modalities": { - "input": [ - "text", - "image" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 128000, - "output": 16384 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "high" + ] + } }, "attachment": true, "open_weights": false, - "knowledge": "2023-09", - "release_date": "2024-05-13", - "last_updated": "2024-08-06", + "knowledge": "2026-01", + "release_date": "2026-02-19", + "last_updated": "2026-02-19", "type": "chat" }, { - "id": "claude-haiku-4-5", - "name": "Claude Haiku 4.5", - "display_name": "Claude Haiku 4.5", + "id": "gpt-5-5", + "name": "GPT-5.5", + "display_name": "GPT-5.5", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 272000, + "output": 128000 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high", + "xhigh" ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." - ] + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" } }, "attachment": true, "open_weights": false, - "knowledge": "2025-02-28", - "release_date": "2025-10-15", - "last_updated": "2025-10-15", + "knowledge": "2025-08-31", + "release_date": "2026-04-23", + "last_updated": "2026-04-23", "type": "chat" }, { - "id": "gemini-2.5-pro", - "name": "Gemini 2.5 Pro", - "display_name": "Gemini 2.5 Pro", + "id": "gemini-2.5-flash", + "name": "Gemini 2.5 Flash", + "display_name": "Gemini 2.5 Flash", "modalities": { "input": [ "text", @@ -313186,9 +312096,10 @@ "mode": "budget", "budget": { "default": -1, - "min": 128, - "max": 32768, + "min": 0, + "max": 24576, "auto": -1, + "off": 0, "unit": "tokens" }, "summaries": true, @@ -313206,9 +312117,9 @@ "type": "chat" }, { - "id": "deepseek-v4-pro", - "name": "DeepSeek v4 Pro", - "display_name": "DeepSeek v4 Pro", + "id": "gpt-oss-120b", + "name": "GPT OSS 120B", + "display_name": "GPT OSS 120B", "modalities": { "input": [ "text" @@ -313218,8 +312129,8 @@ ] }, "limit": { - "context": 128000, - "output": 8192 + "context": 131072, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -313230,36 +312141,24 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", "effort_options": [ "low", - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." + "medium", + "high" ] } }, "attachment": false, "open_weights": true, - "knowledge": "2026-01", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "gpt-5-5", - "name": "GPT-5.5", - "display_name": "GPT-5.5", + "id": "kimi-k2-6", + "name": "Kimi-K2.6", + "display_name": "Kimi-K2.6", "modalities": { "input": [ "text", @@ -313270,7 +312169,65 @@ ] }, "limit": { - "context": 272000, + "context": 256000, + "output": 128000 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "attachment": true, + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-04-20", + "last_updated": "2026-04-20", + "type": "chat" + }, + { + "id": "minimax-m2-5", + "name": "MiniMax-M2.5", + "display_name": "MiniMax-M2.5", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 192000, + "output": 8192 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "knowledge": "2024-09", + "release_date": "2026-02-12", + "last_updated": "2026-02-12", + "type": "chat" + }, + { + "id": "gpt-5-3-codex", + "name": "GPT-5.3 Codex", + "display_name": "GPT-5.3 Codex", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 400000, "output": 128000 }, "temperature": false, @@ -313302,82 +312259,106 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-04-23", - "last_updated": "2026-04-23", + "knowledge": "2026-01-31", + "release_date": "2026-02-05", + "last_updated": "2026-02-05", "type": "chat" }, { - "id": "gpt-5-4-mini", - "name": "GPT-5.4 Mini", - "display_name": "GPT-5.4 Mini", + "id": "deepseek-v4-pro", + "name": "DeepSeek v4 Pro", + "display_name": "DeepSeek v4 Pro", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 128000, + "output": 8192 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, + "default_enabled": true, "mode": "effort", - "effort": "none", + "effort": "high", "effort_options": [ - "none", "low", - "medium", "high", - "xhigh" + "max" ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ], - "visibility": "hidden" + "notes": [ + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." + ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-17", - "last_updated": "2026-03-17", + "attachment": false, + "open_weights": true, + "knowledge": "2026-01", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "gemini-2.5-flash", - "name": "Gemini 2.5 Flash", - "display_name": "Gemini 2.5 Flash", + "id": "zai-glm-5-1", + "name": "Z.AI GLM-5.1", + "display_name": "Z.AI GLM-5.1", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 198000, + "output": 8192 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "knowledge": "2024-10", + "release_date": "2026-04-07", + "last_updated": "2026-04-07", + "type": "chat" + }, + { + "id": "kimi-k2.5", + "name": "Kimi-K2.5", + "display_name": "Kimi-K2.5", "modalities": { "input": [ "text", - "image", - "audio", - "video", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 256000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -313388,45 +312369,35 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "budget", - "budget": { - "default": -1, - "min": 0, - "max": 24576, - "auto": -1, - "off": 0, - "unit": "tokens" - }, + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" ] } }, "attachment": true, - "open_weights": false, + "open_weights": true, "knowledge": "2025-01", - "release_date": "2025-06-17", - "last_updated": "2025-06-17", + "release_date": "2026-01-27", + "last_updated": "2026-01-27", "type": "chat" }, { - "id": "grok-4-1-fast-reasoning", + "id": "grok-code-fast-1", "name": "Grok 4.1 Fast (Reasoning)", "display_name": "Grok 4.1 Fast (Reasoning)", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 2000000, + "context": 256000, "output": 128000 }, "temperature": true, @@ -313440,140 +312411,289 @@ "supported": true } }, + "attachment": false, + "open_weights": false, + "knowledge": "2023-10", + "release_date": "2025-09-02", + "last_updated": "2025-09-02", + "type": "chat" + }, + { + "id": "grok-4-1-fast-non-reasoning", + "name": "Grok 4.1 Fast (Non-Reasoning)", + "display_name": "Grok 4.1 Fast (Non-Reasoning)", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 2000000, + "output": 128000 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, "attachment": true, "open_weights": false, "knowledge": "2025-11", "release_date": "2025-11-19", "last_updated": "2025-11-19", "type": "chat" + } + ] + }, + "huggingface": { + "id": "huggingface", + "name": "Hugging Face", + "display_name": "Hugging Face", + "api": "https://router.huggingface.co/v1", + "doc": "https://huggingface.co/docs/inference-providers", + "models": [ + { + "id": "stepfun-ai/Step-3.5-Flash", + "name": "Step 3.5 Flash", + "display_name": "Step 3.5 Flash", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 262144, + "output": 256000 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "attachment": false, + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-01-29", + "last_updated": "2026-02-13", + "type": "chat" }, { - "id": "gpt-5-4-nano", - "name": "GPT-5.4 Nano", - "display_name": "GPT-5.4 Nano", + "id": "stepfun-ai/Step-3.7-Flash", + "name": "Step 3.7 Flash", + "display_name": "Step 3.7 Flash", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 262144, + "output": 256000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ "low", "medium", "high" - ], - "visibility": "hidden" + ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2024-05-30", - "release_date": "2026-03-17", - "last_updated": "2026-03-17", + "open_weights": true, + "knowledge": "2026-03-01", + "release_date": "2026-05-29", + "last_updated": "2026-05-29", "type": "chat" }, { - "id": "claude-sonnet-4-6", - "name": "Claude Sonnet 4.6", - "display_name": "Claude Sonnet 4.6", + "id": "meta-llama/Llama-3.1-8B-Instruct", + "name": "Llama-3.1-8B-Instruct", + "display_name": "Llama-3.1-8B-Instruct", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 131072, + "output": 4096 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "knowledge": "2023-12", + "release_date": "2024-07-23", + "last_updated": "2024-07-23", + "type": "chat" + }, + { + "id": "meta-llama/Llama-Guard-4-12B", + "name": "Llama Guard 4 12B", + "display_name": "Llama Guard 4 12B", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 163840, + "output": 163840 + }, + "temperature": true, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": true, + "release_date": "2025-04-29", + "last_updated": "2025-04-29", + "type": "chat" + }, + { + "id": "meta-llama/Llama-3.3-70B-Instruct", + "name": "Llama-3.3-70B-Instruct", + "display_name": "Llama-3.3-70B-Instruct", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 131072, + "output": 4096 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "knowledge": "2023-12", + "release_date": "2024-12-06", + "last_updated": "2024-12-06", + "type": "chat" + }, + { + "id": "moonshotai/Kimi-K2.6", + "name": "Kimi-K2.6", + "display_name": "Kimi-K2.6", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "max" - ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-17", - "last_updated": "2026-03-13", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-04-20", + "last_updated": "2026-04-20", "type": "chat" }, { - "id": "kimi-k2.5", - "name": "Kimi-K2.5", - "display_name": "Kimi-K2.5", + "id": "moonshotai/Kimi-K2-Instruct", + "name": "Kimi-K2-Instruct", + "display_name": "Kimi-K2-Instruct", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 128000 + "context": 131072, + "output": 16384 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "knowledge": "2024-10", + "release_date": "2025-07-11", + "last_updated": "2025-07-11", + "type": "chat" + }, + { + "id": "moonshotai/Kimi-K2-Thinking", + "name": "Kimi-K2-Thinking", + "display_name": "Kimi-K2-Thinking", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, @@ -313592,28 +312712,104 @@ ] } }, + "attachment": false, + "open_weights": true, + "knowledge": "2024-08", + "release_date": "2025-11-06", + "last_updated": "2025-11-06", + "type": "chat" + }, + { + "id": "moonshotai/Kimi-K2.7-Code", + "name": "Kimi K2.7 Code", + "display_name": "Kimi K2.7 Code", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 262144, + "output": 262144 + }, + "temperature": false, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, "attachment": true, "open_weights": true, "knowledge": "2025-01", - "release_date": "2026-01-27", - "last_updated": "2026-01-27", + "release_date": "2026-06-12", + "last_updated": "2026-06-12", "type": "chat" }, { - "id": "grok-code-fast-1", - "name": "Grok 4.1 Fast (Reasoning)", - "display_name": "Grok 4.1 Fast (Reasoning)", + "id": "moonshotai/Kimi-K3", + "name": "Kimi K3", + "display_name": "Kimi K3", "modalities": { "input": [ + "text", + "image" + ], + "output": [ "text" + ] + }, + "limit": { + "context": 1000000, + "output": 131072 + }, + "temperature": false, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "low", + "high", + "max" + ] + } + }, + "attachment": true, + "open_weights": true, + "release_date": "2026-07-16", + "last_updated": "2026-07-16", + "type": "chat" + }, + { + "id": "moonshotai/Kimi-K2.5", + "name": "Kimi-K2.5", + "display_name": "Kimi-K2.5", + "modalities": { + "input": [ + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 128000 + "context": 262144, + "output": 262144 }, "temperature": true, "tool_call": true, @@ -313623,61 +312819,65 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, - "attachment": false, - "open_weights": false, - "knowledge": "2023-10", - "release_date": "2025-09-02", - "last_updated": "2025-09-02", + "attachment": true, + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-01-27", + "last_updated": "2026-01-27", "type": "chat" }, { - "id": "grok-4-1-fast-non-reasoning", - "name": "Grok 4.1 Fast (Non-Reasoning)", - "display_name": "Grok 4.1 Fast (Non-Reasoning)", + "id": "moonshotai/Kimi-K2-Instruct-0905", + "name": "Kimi-K2-Instruct-0905", + "display_name": "Kimi-K2-Instruct-0905", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 2000000, - "output": 128000 + "context": 262144, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-11", - "release_date": "2025-11-19", - "last_updated": "2025-11-19", + "attachment": false, + "open_weights": true, + "knowledge": "2024-10", + "release_date": "2025-09-05", + "last_updated": "2025-09-05", "type": "chat" }, { - "id": "kimi-k2-6", - "name": "Kimi-K2.6", - "display_name": "Kimi-K2.6", + "id": "openai/gpt-oss-20b", + "name": "GPT OSS 20B", + "display_name": "GPT OSS 20B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 128000 + "context": 131072, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -313685,15 +312885,25 @@ "supported": true, "default": true }, - "attachment": true, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "low", + "medium", + "high" + ] + } + }, + "attachment": false, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-20", - "last_updated": "2026-04-20", + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" }, { - "id": "gpt-oss-120b", + "id": "openai/gpt-oss-120b", "name": "GPT OSS 120B", "display_name": "GPT OSS 120B", "modalities": { @@ -313732,22 +312942,20 @@ "type": "chat" }, { - "id": "grok-4-3", - "name": "Grok 4.3", - "display_name": "Grok 4.3", + "id": "MiniMaxAI/MiniMax-M2.7", + "name": "MiniMax-M2.7", + "display_name": "MiniMax-M2.7", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 204800, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -313757,98 +312965,64 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "low", - "medium", - "high" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-11", - "release_date": "2026-04-17", - "last_updated": "2026-04-17", + "attachment": false, + "open_weights": true, + "release_date": "2026-03-18", + "last_updated": "2026-03-18", "type": "chat" }, { - "id": "claude-opus-4-6", - "name": "Claude Opus 4.6", - "display_name": "Claude Opus 4.6", + "id": "MiniMaxAI/MiniMax-M2", + "name": "MiniMax-M2", + "display_name": "MiniMax-M2", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 128000 + "context": 204800, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." - ] - } + "default": true }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-05-31", - "release_date": "2026-02-05", - "last_updated": "2026-03-13", + "attachment": false, + "open_weights": true, + "release_date": "2025-10-27", + "last_updated": "2025-10-27", "type": "chat" }, { - "id": "gemini-3-flash-preview", - "name": "Gemini 3 Flash Preview", - "display_name": "Gemini 3 Flash Preview", + "id": "MiniMaxAI/MiniMax-M2.5", + "name": "MiniMax-M2.5", + "display_name": "MiniMax-M2.5", "modalities": { "input": [ - "text", - "image", - "video", - "audio", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 204800, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -313859,33 +313033,24 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", - "low", - "medium", - "high" - ], + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-12-17", - "last_updated": "2025-12-17", + "attachment": false, + "open_weights": true, + "release_date": "2026-02-12", + "last_updated": "2026-02-12", "type": "chat" }, { - "id": "gpt-oss-20b", - "name": "GPT OSS 20B", - "display_name": "GPT OSS 20B", + "id": "MiniMaxAI/MiniMax-M1-80k", + "name": "MiniMax M1 80K", + "display_name": "MiniMax M1 80K", "modalities": { "input": [ "text" @@ -313895,8 +313060,8 @@ ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 1000000, + "output": 80000 }, "temperature": true, "tool_call": true, @@ -313904,27 +313069,16 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "low", - "medium", - "high" - ] - } - }, "attachment": false, "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "release_date": "2025-06-17", + "last_updated": "2025-06-17", "type": "chat" }, { - "id": "gpt-5-3-codex", - "name": "GPT-5.3 Codex", - "display_name": "GPT-5.3 Codex", + "id": "MiniMaxAI/MiniMax-M3.1-Flash", + "name": "MiniMax-M3.1-Flash", + "display_name": "MiniMax-M3.1-Flash", "modalities": { "input": [ "text", @@ -313935,10 +313089,10 @@ ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 1000000, + "output": 512000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -313947,50 +313101,43 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ "low", "medium", "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "xhigh", + "max" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-02-05", - "last_updated": "2026-02-05", + "release_date": "2026-10-19", + "last_updated": "2026-10-19", "type": "chat" }, { - "id": "gemini-3-1-pro-preview", - "name": "Gemini 3.1 Pro Preview", - "display_name": "Gemini 3.1 Pro Preview", + "id": "MiniMaxAI/MiniMax-M3", + "name": "MiniMax-M3", + "display_name": "MiniMax-M3", "modalities": { "input": [ "text", - "image", - "video", - "audio", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 64000 + "context": 524288, + "output": 512000 }, "temperature": true, "tool_call": true, @@ -314000,48 +313147,32 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "low", - "medium", - "high" - ] + "supported": true } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-01", - "release_date": "2026-02-19", - "last_updated": "2026-02-19", + "open_weights": true, + "release_date": "2026-06-01", + "last_updated": "2026-06-01", "type": "chat" - } - ] - }, - "wallaby": { - "id": "wallaby", - "name": "Wallaby", - "display_name": "Wallaby", - "api": "https://api.wallabytoken.com/v1", - "doc": "https://wallabytoken.com/docs", - "models": [ + }, { - "id": "moonshotai/kimi-k3", - "name": "Kimi K3", - "display_name": "Kimi K3", + "id": "MiniMaxAI/MiniMax-M2.1", + "name": "MiniMax-M2.1", + "display_name": "MiniMax-M2.1", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, + "context": 204800, "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -314055,34 +313186,20 @@ "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "effort_options": [ - "low", - "medium", - "high", - "max" ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-16", + "knowledge": "2025-10", + "release_date": "2025-12-23", + "last_updated": "2025-12-23", "type": "chat" - } - ] - }, - "stackit": { - "id": "stackit", - "name": "STACKIT", - "display_name": "STACKIT", - "api": "https://api.openai-compat.model-serving.eu01.onstackit.cloud/v1", - "doc": "https://docs.stackit.cloud/products/data-and-ai/ai-model-serving/basics/available-shared-models", - "models": [ + }, { - "id": "Qwen/Qwen3-VL-235B-A22B-Instruct-FP8", - "name": "Qwen3-VL 235B", - "display_name": "Qwen3-VL 235B", + "id": "Qwen/Qwen3-VL-235B-A22B-Thinking", + "name": "Qwen3 VL 235B A22B Thinking", + "display_name": "Qwen3 VL 235B A22B Thinking", "modalities": { "input": [ "text", @@ -314093,13 +313210,30 @@ ] }, "limit": { - "context": 218000, - "output": 16384 + "context": 131072, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "low", + "medium", + "high" + ] + } }, "attachment": true, "open_weights": true, @@ -314109,9 +313243,9 @@ "type": "chat" }, { - "id": "Qwen/Qwen3-VL-Embedding-8B", - "name": "Qwen3-VL Embedding 8B", - "display_name": "Qwen3-VL Embedding 8B", + "id": "Qwen/Qwen3.5-122B-A10B", + "name": "Qwen3.5 122B-A10B", + "display_name": "Qwen3.5 122B-A10B", "modalities": { "input": [ "text", @@ -314122,27 +313256,40 @@ ] }, "limit": { - "context": 32000, - "output": 4096 + "context": 262144, + "output": 65536 }, - "temperature": false, - "tool_call": false, + "temperature": true, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": true, "open_weights": true, - "release_date": "2026-02-05", - "last_updated": "2026-02-05", - "type": "embedding" + "release_date": "2026-02-23", + "last_updated": "2026-02-23", + "type": "chat" }, { - "id": "Qwen/Qwen3.6-27B", - "name": "Qwen3.6 27B", - "display_name": "Qwen3.6 27B", + "id": "Qwen/Qwen3.6-35B-A3B", + "name": "Qwen3.6 35B-A3B", + "display_name": "Qwen3.6 35B-A3B", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" @@ -314150,12 +313297,13 @@ }, "limit": { "context": 262144, - "output": 16384 + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { @@ -314168,56 +313316,56 @@ ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-04-22", - "last_updated": "2026-04-22", + "release_date": "2026-04-17", + "last_updated": "2026-04-17", "type": "chat" }, { - "id": "google/gemma-3-27b-it", - "name": "Gemma 3 27B", - "display_name": "Gemma 3 27B", + "id": "Qwen/Qwen3-Coder-480B-A35B-Instruct", + "name": "Qwen3-Coder-480B-A35B-Instruct", + "display_name": "Qwen3-Coder-480B-A35B-Instruct", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 37000, - "output": 4096 + "context": 262144, + "output": 65536 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2024-08", - "release_date": "2025-03-12", - "last_updated": "2025-03-12", + "knowledge": "2025-04", + "release_date": "2025-07-22", + "last_updated": "2025-07-22", "type": "chat" }, { - "id": "openai/gpt-oss-120b", - "name": "GPT OSS 120B", - "display_name": "GPT OSS 120B", + "id": "Qwen/Qwen3.5-9B", + "name": "Qwen3.5 9B", + "display_name": "Qwen3.5 9B", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 131000, - "output": 8192 + "context": 262144, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -314228,24 +313376,24 @@ "extra_capabilities": { "reasoning": { "supported": true, - "effort_options": [ - "low", - "medium", - "high" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" }, { - "id": "openai/gpt-oss-20b", - "name": "GPT OSS 20B", - "display_name": "GPT OSS 20B", + "id": "Qwen/Qwen3-Coder-30B-A3B-Instruct", + "name": "Qwen3-Coder 30B-A3B Instruct", + "display_name": "Qwen3-Coder 30B-A3B Instruct", "modalities": { "input": [ "text" @@ -314255,31 +313403,25 @@ ] }, "limit": { - "context": 131072, - "output": 8192 + "context": 262144, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, "attachment": false, "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "knowledge": "2025-04", + "release_date": "2025-07-31", + "last_updated": "2025-07-31", "type": "chat" }, { - "id": "cortecs/Llama-3.3-70B-Instruct-FP8-Dynamic", - "name": "Llama 3.3 70B", - "display_name": "Llama 3.3 70B", + "id": "Qwen/Qwen3-Embedding-4B", + "name": "Qwen 3 Embedding 4B", + "display_name": "Qwen 3 Embedding 4B", "modalities": { "input": [ "text" @@ -314289,25 +313431,25 @@ ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 32768, + "output": 8192 }, - "temperature": true, - "tool_call": true, + "temperature": false, + "tool_call": false, "reasoning": { "supported": false }, "attachment": false, "open_weights": true, - "knowledge": "2023-12", - "release_date": "2024-12-06", - "last_updated": "2024-12-06", - "type": "chat" + "knowledge": "2024-12", + "release_date": "2025-06-05", + "last_updated": "2025-06-05", + "type": "embedding" }, { - "id": "intfloat/e5-mistral-7b-instruct", - "name": "E5 Mistral 7B", - "display_name": "E5 Mistral 7B", + "id": "Qwen/Qwen3-Embedding-8B", + "name": "Qwen 3 Embedding 8B", + "display_name": "Qwen 3 Embedding 8B", "modalities": { "input": [ "text" @@ -314317,8 +313459,8 @@ ] }, "limit": { - "context": 4096, - "output": 4096 + "context": 32768, + "output": 8192 }, "temperature": false, "tool_call": false, @@ -314327,34 +313469,27 @@ }, "attachment": false, "open_weights": true, - "release_date": "2023-12-11", - "last_updated": "2023-12-11", + "knowledge": "2024-12", + "release_date": "2025-06-05", + "last_updated": "2025-06-05", "type": "embedding" - } - ] - }, - "alibaba-coding-plan": { - "id": "alibaba-coding-plan", - "name": "Alibaba Coding Plan", - "display_name": "Alibaba Coding Plan", - "api": "https://coding-intl.dashscope.aliyuncs.com/v1", - "doc": "https://www.alibabacloud.com/help/en/model-studio/coding-plan", - "models": [ + }, { - "id": "glm-5", - "name": "GLM-5", - "display_name": "GLM-5", + "id": "Qwen/Qwen3.5-397B-A17B", + "name": "Qwen3.5-397B-A17B", + "display_name": "Qwen3.5-397B-A17B", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 202752, - "output": 16384 + "context": 262144, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -314370,32 +313505,37 @@ "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "effort_options": [ + "none", + "low", + "medium", + "high" ] } }, - "attachment": false, - "open_weights": false, - "release_date": "2026-02-11", - "last_updated": "2026-02-11", + "attachment": true, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2026-02-15", + "last_updated": "2026-02-15", "type": "chat" }, { - "id": "qwen3.7-plus", - "name": "Qwen3.7 Plus", - "display_name": "Qwen3.7 Plus", + "id": "Qwen/Qwen3-32B", + "name": "Qwen3 32B", + "display_name": "Qwen3 32B", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 64000 + "context": 131072, + "output": 16384 }, "temperature": true, "tool_call": true, @@ -314405,20 +313545,26 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, - "attachment": true, - "open_weights": false, + "attachment": false, + "open_weights": true, "knowledge": "2025-04", - "release_date": "2026-06-02", - "last_updated": "2026-06-02", + "release_date": "2025-04-28", + "last_updated": "2025-04-28", "type": "chat" }, { - "id": "qwen3-coder-next", - "name": "Qwen3 Coder Next", - "display_name": "Qwen3 Coder Next", + "id": "Qwen/Qwen3-235B-A22B-Instruct-2507", + "name": "Qwen3 235B-A22B Instruct 2507", + "display_name": "Qwen3 235B-A22B Instruct 2507", "modalities": { "input": [ "text" @@ -314429,7 +313575,7 @@ }, "limit": { "context": 262144, - "output": 65536 + "output": 16384 }, "temperature": true, "tool_call": true, @@ -314438,69 +313584,53 @@ }, "attachment": false, "open_weights": true, - "release_date": "2026-02-03", - "last_updated": "2026-02-03", + "release_date": "2025-07-21", + "last_updated": "2025-07-21", "type": "chat" }, { - "id": "qwen3.5-plus", - "name": "Qwen3.5 Plus", - "display_name": "Qwen3.5 Plus", + "id": "Qwen/Qwen3-VL-30B-A3B-Instruct", + "name": "Qwen3 VL 30B A3B Instruct", + "display_name": "Qwen3 VL 30B A3B Instruct", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 131072, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2025-04", - "release_date": "2026-02-16", - "last_updated": "2026-02-16", + "open_weights": true, + "release_date": "2025-10-04", + "last_updated": "2025-10-04", "type": "chat" }, { - "id": "qwen3.6-plus", - "name": "Qwen3.6 Plus", - "display_name": "Qwen3.6 Plus", + "id": "Qwen/Qwen3-30B-A3B", + "name": "Qwen3 30B A3B", + "display_name": "Qwen3 30B A3B", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 40960, + "output": 16384 }, "temperature": true, "tool_call": true, @@ -314519,17 +313649,16 @@ ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-04", - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "attachment": false, + "open_weights": true, + "release_date": "2025-04-28", + "last_updated": "2025-04-28", "type": "chat" }, { - "id": "qwen3-max-2026-01-23", - "name": "Qwen3 Max", - "display_name": "Qwen3 Max", + "id": "Qwen/Qwen3-Next-80B-A3B-Instruct", + "name": "Qwen3-Next-80B-A3B-Instruct", + "display_name": "Qwen3-Next-80B-A3B-Instruct", "modalities": { "input": [ "text" @@ -314545,35 +313674,23 @@ "temperature": true, "tool_call": true, "reasoning": { - "supported": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": false, - "open_weights": false, + "open_weights": true, "knowledge": "2025-04", - "release_date": "2026-01-23", - "last_updated": "2026-01-23", + "release_date": "2025-09", + "last_updated": "2025-09", "type": "chat" }, { - "id": "kimi-k2.5", - "name": "Kimi K2.5", - "display_name": "Kimi K2.5", + "id": "Qwen/Qwen3.8-27B", + "name": "Qwen3.8 27B", + "display_name": "Qwen3.8 27B", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" @@ -314591,66 +313708,52 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" + "effort_options": [ + "low", + "medium", + "xhigh" ] } }, "attachment": true, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-01-27", - "last_updated": "2026-01-27", + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "glm-4.7", - "name": "GLM-4.7", - "display_name": "GLM-4.7", + "id": "Qwen/Qwen3-VL-235B-A22B-Instruct", + "name": "Qwen3 VL 235B A22B Instruct", + "display_name": "Qwen3 VL 235B A22B Instruct", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 202752, - "output": 16384 + "context": 131072, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-12-22", - "last_updated": "2025-12-22", + "knowledge": "2025-03-31", + "release_date": "2025-09-23", + "last_updated": "2025-09-23", "type": "chat" }, { - "id": "qwen3-coder-plus", - "name": "Qwen3 Coder Plus", - "display_name": "Qwen3 Coder Plus", + "id": "Qwen/Qwen3-235B-A22B-Thinking-2507", + "name": "Qwen3-235B-A22B-Thinking-2507", + "display_name": "Qwen3-235B-A22B-Thinking-2507", "modalities": { "input": [ "text" @@ -314660,36 +313763,49 @@ ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 262144, + "output": 81920 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, "open_weights": true, "knowledge": "2025-04", - "release_date": "2025-07-23", - "last_updated": "2025-07-23", + "release_date": "2025-07-25", + "last_updated": "2025-07-25", "type": "chat" }, { - "id": "MiniMax-M2.5", - "name": "MiniMax-M2.5", - "display_name": "MiniMax-M2.5", + "id": "Qwen/Qwen3.5-27B", + "name": "Qwen3.5 27B", + "display_name": "Qwen3.5 27B", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 196608, - "output": 24576 + "context": 262144, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -314708,52 +313824,16 @@ ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-02-12", - "last_updated": "2026-02-12", - "type": "chat" - } - ] - }, - "ambient": { - "id": "ambient", - "name": "Ambient", - "display_name": "Ambient", - "api": "https://api.ambient.xyz/v1", - "doc": "https://ambient.xyz", - "models": [ - { - "id": "unsloth/qwen3.8-27b-gguf", - "name": "qwen3.8-27b-4q", - "display_name": "qwen3.8-27b-4q", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 101072, - "output": 101072 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-10-13", - "last_updated": "2026-10-13", + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" }, { - "id": "minimax/minimax-m3", - "name": "MiniMax-M3", - "display_name": "MiniMax-M3", + "id": "Qwen/Qwen3-8B", + "name": "Qwen3 8B", + "display_name": "Qwen3 8B", "modalities": { "input": [ "text" @@ -314763,8 +313843,8 @@ ] }, "limit": { - "context": 131072, - "output": 131702 + "context": 40960, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -314774,19 +313854,31 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "none", + "low", + "medium", + "high" + ] } }, "attachment": false, "open_weights": true, - "release_date": "2026-06-01", - "last_updated": "2026-06-01", + "release_date": "2025-04-29", + "last_updated": "2025-04-29", "type": "chat" }, { - "id": "zai-org/GLM-5.2-FP8", - "name": "GLM-5.2", - "display_name": "GLM-5.2", + "id": "Qwen/Qwen3-235B-A22B", + "name": "Qwen3 235B-A22B", + "display_name": "Qwen3 235B-A22B", "modalities": { "input": [ "text" @@ -314796,8 +313888,8 @@ ] }, "limit": { - "context": 202752, - "output": 202752 + "context": 40960, + "output": 16384 }, "temperature": true, "tool_call": true, @@ -314807,22 +313899,26 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "high", - "max" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, "attachment": false, "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "knowledge": "2025-04", + "release_date": "2025-04-28", + "last_updated": "2025-04-28", "type": "chat" }, { - "id": "qwen/qwen3.8-27b", - "name": "Qwen3.8 27B", - "display_name": "Qwen3.8 27B", + "id": "Qwen/Qwen3.5-35B-A3B", + "name": "Qwen3.5 35B-A3B", + "display_name": "Qwen3.5 35B-A3B", "modalities": { "input": [ "text", @@ -314833,8 +313929,8 @@ ] }, "limit": { - "context": 32768, - "output": 8192 + "context": 262144, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -314844,23 +313940,25 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "low", - "medium", - "xhigh" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, "attachment": true, "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "release_date": "2026-02-23", + "last_updated": "2026-02-23", "type": "chat" }, { - "id": "qwen/qwen3-30b-a3b-instruct-2507", - "name": "Qwen3 30B-A3B Instruct 2507", - "display_name": "Qwen3 30B-A3B Instruct 2507", + "id": "Qwen/Qwen3.8-2.4T-A95B", + "name": "Qwen3.8 2.4T A95B", + "display_name": "Qwen3.8 2.4T A95B", "modalities": { "input": [ "text" @@ -314870,24 +313968,35 @@ ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 262144, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "low", + "medium", + "xhigh" + ] + } }, "attachment": false, "open_weights": true, - "release_date": "2025-07-28", - "last_updated": "2025-07-28", + "release_date": "2026-08-12", + "last_updated": "2026-08-12", "type": "chat" }, { - "id": "qwen/qwen3.6-35b-a3b", - "name": "Qwen3.6 35B-A3B", - "display_name": "Qwen3.6 35B-A3B", + "id": "Qwen/Qwen3-Coder-Next", + "name": "Qwen3-Coder-Next", + "display_name": "Qwen3-Coder-Next", "modalities": { "input": [ "text" @@ -314898,46 +314007,36 @@ }, "limit": { "context": 262144, - "output": 262144 + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": false, "open_weights": true, - "release_date": "2026-04-17", - "last_updated": "2026-04-17", + "knowledge": "2025-09", + "release_date": "2026-02-03", + "last_updated": "2026-02-03", "type": "chat" }, { - "id": "qwen/qwen3.6-27b", + "id": "Qwen/Qwen3.6-27B", "name": "Qwen3.6 27B", "display_name": "Qwen3.6 27B", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 32768, - "output": 8192 + "context": 262144, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -314956,16 +314055,16 @@ ] } }, - "attachment": false, + "attachment": true, "open_weights": true, "release_date": "2026-04-22", "last_updated": "2026-04-22", "type": "chat" }, { - "id": "z-ai/glm-5.2", - "name": "GLM-5.2", - "display_name": "GLM-5.2", + "id": "Qwen/Qwen2.5-Coder-32B-Instruct", + "name": "Qwen2.5-Coder-32B-Instruct", + "display_name": "Qwen2.5-Coder-32B-Instruct", "modalities": { "input": [ "text" @@ -314975,34 +314074,24 @@ ] }, "limit": { - "context": 202752, - "output": 202752 + "context": 131072, + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "high", - "max" - ] - } + "supported": false }, "attachment": false, "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "release_date": "2024-11-12", + "last_updated": "2024-11-12", "type": "chat" }, { - "id": "ambient/small", - "name": "Ambient Small", - "display_name": "Ambient Small", + "id": "tencent/Hy4-preview", + "name": "Hy4 preview", + "display_name": "Hy4 preview", "modalities": { "input": [ "text" @@ -315012,24 +314101,34 @@ ] }, "limit": { - "context": 101072, - "output": 101072 + "context": 1000000, + "output": 64000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "none", + "high" + ] + } }, "attachment": false, "open_weights": true, - "release_date": "2026-10-13", - "last_updated": "2026-10-13", + "release_date": "2026-08-28", + "last_updated": "2026-08-28", "type": "chat" }, { - "id": "ambient/large", - "name": "Ambient Large", - "display_name": "Ambient Large", + "id": "tencent/Hy3", + "name": "Hy3", + "display_name": "Hy3", "modalities": { "input": [ "text" @@ -315039,8 +314138,8 @@ ] }, "limit": { - "context": 202752, - "output": 202752 + "context": 262144, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -315050,102 +314149,91 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, "effort_options": [ - "high", - "max" + "none", + "low", + "high" ] } }, "attachment": false, "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "release_date": "2026-07-06", + "last_updated": "2026-07-06", "type": "chat" - } - ] - }, - "bailing": { - "id": "bailing", - "name": "Bailing", - "display_name": "Bailing", - "api": "https://api.tbox.cn/api/llm/v1", - "doc": "https://alipaytbox.yuque.com/sxs0ba/ling/intro", - "models": [ + }, { - "id": "Ring-1T", - "name": "Ring-1T", - "display_name": "Ring-1T", + "id": "thinkingmachines/Inkling", + "name": "Inkling", + "display_name": "Inkling", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 32000 + "context": 1048576, + "output": 1048576 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, "default": true }, "extra_capabilities": { "reasoning": { - "supported": true + "effort_options": [ + "low", + "medium", + "high" + ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-10", - "last_updated": "2025-10", + "release_date": "2026-07-15", + "last_updated": "2026-07-15", "type": "chat" }, { - "id": "Ling-1T", - "name": "Ling-1T", - "display_name": "Ling-1T", + "id": "thinkingmachines/Inkling-Small", + "name": "Inkling Small", + "display_name": "Inkling Small", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 32000 + "context": 524288, + "output": 1048576 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-10", - "last_updated": "2025-10", + "release_date": "2026-07-30", + "last_updated": "2026-07-30", "type": "chat" - } - ] - }, - "inception": { - "id": "inception", - "name": "Inception", - "display_name": "Inception", - "api": "https://api.inceptionlabs.ai/v1/", - "doc": "https://docs.inceptionlabs.ai/get-started/models", - "models": [ + }, { - "id": "mercury-3", - "name": "Mercury 3", - "display_name": "Mercury 3", + "id": "zai-org/GLM-5", + "name": "GLM-5", + "display_name": "GLM-5", "modalities": { "input": [ "text" @@ -315155,7 +314243,7 @@ ] }, "limit": { - "context": 1000000, + "context": 202752, "output": 131072 }, "temperature": true, @@ -315166,50 +314254,55 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "low", - "medium", - "high" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, "attachment": false, - "open_weights": false, - "release_date": "2026-10-16", - "last_updated": "2026-10-20", + "open_weights": true, + "release_date": "2026-02-12", + "last_updated": "2026-02-12", "type": "chat" }, { - "id": "mercury-edit-2", - "name": "Mercury Edit 2", - "display_name": "Mercury Edit 2", + "id": "zai-org/GLM-4.5V", + "name": "GLM-4.5V", + "display_name": "GLM-4.5V", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 32000, - "output": 8192 + "context": 65536, + "output": 16384 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": false, - "open_weights": false, - "release_date": "2026-03-30", - "last_updated": "2026-03-30", + "attachment": true, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-08-11", + "last_updated": "2025-08-11", "type": "chat" }, { - "id": "mercury-2", - "name": "Mercury 2", - "display_name": "Mercury 2", + "id": "zai-org/GLM-4.7", + "name": "GLM-4.7", + "display_name": "GLM-4.7", "modalities": { "input": [ "text" @@ -315219,8 +314312,8 @@ ] }, "limit": { - "context": 128000, - "output": 50000 + "context": 204800, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -315230,24 +314323,26 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "low", - "medium", - "high" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, "attachment": false, - "open_weights": false, - "knowledge": "2025-01-01", - "release_date": "2026-02-24", - "last_updated": "2026-02-24", + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-12-22", + "last_updated": "2025-12-22", "type": "chat" }, { - "id": "mercury-2.5", - "name": "Mercury 2.5", - "display_name": "Mercury 2.5", + "id": "zai-org/GLM-5.2", + "name": "GLM-5.2", + "display_name": "GLM-5.2", "modalities": { "input": [ "text" @@ -315257,8 +314352,8 @@ ] }, "limit": { - "context": 260000, - "output": 65536 + "context": 262144, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -315268,46 +314363,30 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "low", - "medium", - "high" - ] + "supported": true } }, "attachment": false, - "open_weights": false, - "knowledge": "2025-11-01", - "release_date": "2026-09-08", - "last_updated": "2026-09-08", + "open_weights": true, + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" - } - ] - }, - "impossibl": { - "id": "impossibl", - "name": "Impossibl", - "display_name": "Impossibl", - "api": "https://api.impossibl.com/v1", - "doc": "https://impossibl.com/docs/models", - "models": [ + }, { - "id": "xai/grok-4.3", - "name": "Grok 4.3", - "display_name": "Grok 4.3", + "id": "zai-org/GLM-5.1", + "name": "GLM-5.1", + "display_name": "GLM-5.1", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 30000 + "context": 202752, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -315318,24 +314397,24 @@ "extra_capabilities": { "reasoning": { "supported": true, - "effort_options": [ - "none", - "low", - "medium", - "high" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, - "attachment": true, - "open_weights": false, - "release_date": "2026-04-17", - "last_updated": "2026-04-17", + "attachment": false, + "open_weights": true, + "release_date": "2026-04-07", + "last_updated": "2026-04-07", "type": "chat" }, { - "id": "xai/grok-4.5", - "name": "Grok 4.5", - "display_name": "Grok 4.5", + "id": "zai-org/GLM-5.3-Flash", + "name": "GLM-5.3-Flash", + "display_name": "GLM-5.3-Flash", "modalities": { "input": [ "text", @@ -315346,8 +314425,8 @@ ] }, "limit": { - "context": 500000, - "output": 500000 + "context": 1048576, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -315360,63 +314439,72 @@ "supported": true, "effort_options": [ "low", - "medium", - "high" + "high", + "max" ] } }, "attachment": true, - "open_weights": false, - "release_date": "2026-07-08", - "last_updated": "2026-07-08", + "open_weights": true, + "release_date": "2026-08-26", + "last_updated": "2026-08-26", "type": "chat" }, { - "id": "xai/grok-4.20-0309-non-reasoning", - "name": "Grok 4.20 (Non-Reasoning)", - "display_name": "Grok 4.20 (Non-Reasoning)", + "id": "zai-org/GLM-4.7-Flash", + "name": "GLM-4.7-Flash", + "display_name": "GLM-4.7-Flash", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 30000 + "context": 200000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, - "open_weights": false, - "release_date": "2026-03-09", - "last_updated": "2026-03-09", + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2026-01-19", + "last_updated": "2026-01-19", "type": "chat" }, { - "id": "xai/grok-4.20-0309-reasoning", - "name": "Grok 4.20 (Reasoning)", - "display_name": "Grok 4.20 (Reasoning)", + "id": "zai-org/GLM-4.5-Air", + "name": "GLM-4.5-Air", + "display_name": "GLM-4.5-Air", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 30000 + "context": 131072, + "output": 98304 }, "temperature": true, "tool_call": true, @@ -315424,29 +314512,28 @@ "supported": true, "default": true }, - "attachment": true, - "open_weights": false, - "release_date": "2026-03-09", - "last_updated": "2026-03-09", + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-07-28", + "last_updated": "2025-07-28", "type": "chat" }, { - "id": "xai/grok-build-0.1", - "name": "Grok Build 0.1", - "display_name": "Grok Build 0.1", + "id": "zai-org/GLM-4.6", + "name": "GLM-4.6", + "display_name": "GLM-4.6", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 256000, - "output": 256000 + "context": 204800, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -315459,19 +314546,21 @@ "supported": true } }, - "attachment": true, - "open_weights": false, - "release_date": "2026-04-16", - "last_updated": "2026-04-16", + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-09-30", + "last_updated": "2025-09-30", "type": "chat" }, { - "id": "cerebras/gpt-oss-120b", - "name": "GPT OSS 120B", - "display_name": "GPT OSS 120B", + "id": "zai-org/GLM-4.6V-Flash", + "name": "GLM-4.6V-Flash", + "display_name": "GLM-4.6V-Flash", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" @@ -315487,27 +314576,16 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "low", - "medium", - "high" - ] - } - }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "release_date": "2025-12-08", + "last_updated": "2025-12-08", "type": "chat" }, { - "id": "fireworks/gpt-oss-120b", - "name": "GPT OSS 120B", - "display_name": "GPT OSS 120B", + "id": "zai-org/GLM-5.3", + "name": "GLM-5.3", + "display_name": "GLM-5.3", "modalities": { "input": [ "text" @@ -315517,8 +314595,8 @@ ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 1048576, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -315531,22 +314609,49 @@ "supported": true, "effort_options": [ "low", - "medium", - "high" + "high", + "max" ] } }, "attachment": false, "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "fireworks/glm-5.2", - "name": "GLM-5.2", - "display_name": "GLM-5.2", + "id": "zai-org/AutoGLM-Phone-9B-Multilingual", + "name": "AutoGLM Phone 9B Multilingual", + "display_name": "AutoGLM Phone 9B Multilingual", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 65536, + "output": 65536 + }, + "temperature": true, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": true, + "release_date": "2025-12-10", + "last_updated": "2025-12-10", + "type": "chat" + }, + { + "id": "deepseek-ai/DeepSeek-V3-0324", + "name": "DeepSeek V3 0324", + "display_name": "DeepSeek V3 0324", "modalities": { "input": [ "text" @@ -315556,30 +314661,24 @@ ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 163840, + "output": 163840 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, "attachment": false, "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "release_date": "2025-03-24", + "last_updated": "2025-03-24", "type": "chat" }, { - "id": "fireworks/gpt-oss-20b", - "name": "GPT OSS 20B", - "display_name": "GPT OSS 20B", + "id": "deepseek-ai/DeepSeek-R1-0528", + "name": "DeepSeek-R1-0528", + "display_name": "DeepSeek-R1-0528", "modalities": { "input": [ "text" @@ -315589,7 +314688,7 @@ ] }, "limit": { - "context": 131072, + "context": 163840, "output": 32768 }, "temperature": true, @@ -315601,38 +314700,35 @@ "extra_capabilities": { "reasoning": { "supported": true, - "effort_options": [ - "low", - "medium", - "high" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, "attachment": false, "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "knowledge": "2025-05", + "release_date": "2025-05-28", + "last_updated": "2025-05-28", "type": "chat" }, { - "id": "google/gemini-2.5-pro", - "name": "Gemini 2.5 Pro", - "display_name": "Gemini 2.5 Pro", + "id": "deepseek-ai/DeepSeek-V3.2", + "name": "DeepSeek-V3.2", + "display_name": "DeepSeek-V3.2", "modalities": { "input": [ - "text", - "image", - "audio", - "video", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, + "context": 163840, "output": 65536 }, "temperature": true, @@ -315643,41 +314739,23 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "budget", - "budget": { - "default": -1, - "min": 128, - "max": 32768, - "auto": -1, - "unit": "tokens" - }, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] + "supported": true } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-06-17", - "last_updated": "2025-06-17", + "attachment": false, + "open_weights": true, + "knowledge": "2024-07", + "release_date": "2025-12-01", + "last_updated": "2025-12-01", "type": "chat" }, { - "id": "google/gemini-3.5-flash", - "name": "Gemini 3.5 Flash", - "display_name": "Gemini 3.5 Flash", + "id": "deepseek-ai/DeepSeek-V4-Flash-0731", + "name": "DeepSeek V4 Flash 0731", + "display_name": "DeepSeek V4 Flash 0731", "modalities": { "input": [ - "text", - "image", - "video", - "audio", - "pdf" + "text" ], "output": [ "text" @@ -315685,7 +314763,7 @@ }, "limit": { "context": 1048576, - "output": 65536 + "output": 384000 }, "temperature": true, "tool_call": true, @@ -315696,48 +314774,40 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", - "low", - "medium", - "high" - ], + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" + ], + "effort_options": [ + "high", + "max" ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-05-19", - "last_updated": "2026-05-19", + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-07-31", + "last_updated": "2026-07-31", "type": "chat" }, { - "id": "google/gemini-3.5-flash-lite", - "name": "Gemini 3.5 Flash Lite", - "display_name": "Gemini 3.5 Flash Lite", + "id": "deepseek-ai/DeepSeek-V3.1", + "name": "DeepSeek-V3.1", + "display_name": "DeepSeek-V3.1", "modalities": { "input": [ - "text", - "image", - "video", - "audio", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 131072, + "output": 8192 }, "temperature": true, "tool_call": true, @@ -315745,35 +314815,19 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "minimal", - "low", - "medium", - "high" - ] - } - }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-07-21", - "last_updated": "2026-07-21", + "attachment": false, + "open_weights": true, + "release_date": "2025-08-21", + "last_updated": "2025-08-21", "type": "chat" }, { - "id": "google/gemini-3.1-pro-preview", - "name": "Gemini 3.1 Pro Preview", - "display_name": "Gemini 3.1 Pro Preview", + "id": "deepseek-ai/DeepSeek-V4-Pro", + "name": "DeepSeek V4 Pro", + "display_name": "DeepSeek V4 Pro", "modalities": { "input": [ - "text", - "image", - "video", - "audio", - "pdf" + "text" ], "output": [ "text" @@ -315781,7 +314835,7 @@ }, "limit": { "context": 1048576, - "output": 65536 + "output": 393216 }, "temperature": true, "tool_call": true, @@ -315793,90 +314847,65 @@ "reasoning": { "supported": true, "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ + "mode": "effort", + "effort": "high", + "effort_options": [ "low", - "high" + "high", + "max" ], + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" + ], + "notes": [ + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-02-19", - "last_updated": "2026-02-19", + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "google/gemini-2.5-flash", - "name": "Gemini 2.5 Flash", - "display_name": "Gemini 2.5 Flash", + "id": "deepseek-ai/DeepSeek-V3", + "name": "DeepSeek-V3", + "display_name": "DeepSeek-V3", "modalities": { "input": [ - "text", - "image", - "audio", - "video", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 64000, + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "budget", - "budget": { - "default": -1, - "min": 0, - "max": 24576, - "auto": -1, - "off": 0, - "unit": "tokens" - }, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-06-17", - "last_updated": "2025-06-17", + "attachment": false, + "open_weights": true, + "release_date": "2024-12-26", + "last_updated": "2024-12-26", "type": "chat" }, { - "id": "google/gemini-2.5-flash-lite", - "name": "Gemini 2.5 Flash-Lite", - "display_name": "Gemini 2.5 Flash-Lite", + "id": "deepseek-ai/DeepSeek-V4-Flash", + "name": "DeepSeek V4 Flash", + "display_name": "DeepSeek V4 Flash", "modalities": { "input": [ - "text", - "image", - "audio", - "video", - "pdf" + "text" ], "output": [ "text" @@ -315884,51 +314913,51 @@ }, "limit": { "context": 1048576, - "output": 65536 + "output": 384000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "default": -1, - "min": 512, - "max": 24576, - "auto": -1, - "unit": "tokens" - }, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "high", + "max" + ], + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" + ], + "notes": [ + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2025-06-17", - "last_updated": "2025-06-17", + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "google/gemini-3.6-flash", - "name": "Gemini 3.6 Flash", - "display_name": "Gemini 3.6 Flash", + "id": "deepseek-ai/DeepSeek-V4-Flash-Vision-Exp", + "name": "DeepSeek V4 Flash Vision Exp", + "display_name": "DeepSeek V4 Flash Vision Exp", "modalities": { "input": [ "text", - "image", - "video", - "audio", - "pdf" + "image" ], "output": [ "text" @@ -315936,7 +314965,7 @@ }, "limit": { "context": 1048576, - "output": 65536 + "output": 384000 }, "temperature": true, "tool_call": true, @@ -315948,39 +314977,38 @@ "reasoning": { "supported": true, "default_enabled": true, - "mode": "level", - "level": "high", - "level_options": [ - "minimal", + "mode": "effort", + "effort": "high", + "effort_options": [ "low", - "medium", - "high" + "high", + "max" ], + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" + ], + "notes": [ + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-07-21", - "last_updated": "2026-07-21", + "open_weights": true, + "release_date": "2026-08-21", + "last_updated": "2026-09-01", "type": "chat" }, { - "id": "google/gemini-3.1-flash-lite", - "name": "Gemini 3.1 Flash Lite", - "display_name": "Gemini 3.1 Flash Lite", + "id": "deepseek-ai/DeepSeek-V4.1-Flash-1017", + "name": "DeepSeek V4.1 Flash 1017", + "display_name": "DeepSeek V4.1 Flash 1017", "modalities": { "input": [ "text", - "image", - "video", - "audio", - "pdf" + "image" ], "output": [ "text" @@ -315988,7 +315016,7 @@ }, "limit": { "context": 1048576, - "output": 65536 + "output": 384000 }, "temperature": true, "tool_call": true, @@ -315998,41 +315026,37 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, "effort_options": [ - "minimal", "low", - "medium", - "high" + "high", + "max" ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-05-07", - "last_updated": "2026-05-07", + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-10-17", + "last_updated": "2026-10-17", "type": "chat" }, { - "id": "moonshotai/kimi-k3", - "name": "Kimi K3", - "display_name": "Kimi K3", + "id": "deepseek-ai/DeepSeek-V4-Pro-0813", + "name": "DeepSeek V4 Pro 0813", + "display_name": "DeepSeek V4 Pro 0813", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 1000000, + "output": 384000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -316040,19 +315064,24 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "effort_options": [ + "low", + "high", + "max" + ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-16", + "release_date": "2026-08-13", + "last_updated": "2026-08-22", "type": "chat" }, { - "id": "openai/gpt-5.2", - "name": "GPT-5.2", - "display_name": "GPT-5.2", + "id": "deepseek-ai/DeepSeek-V4.1-Flash", + "name": "DeepSeek V4.1 Flash", + "display_name": "DeepSeek V4.1 Flash", "modalities": { "input": [ "text", @@ -316063,115 +315092,91 @@ ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 1048576, + "output": 384000 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", "effort_options": [ "none", "low", - "medium", "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "xhigh", + "max" + ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2025-12-11", - "last_updated": "2025-12-11", + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-09-10", + "last_updated": "2026-09-10", "type": "chat" }, { - "id": "openai/gpt-5.4-mini", - "name": "GPT-5.4 mini", - "display_name": "GPT-5.4 mini", + "id": "deepseek-ai/DeepSeek-R1", + "name": "DeepSeek-R1", + "display_name": "DeepSeek-R1", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 64000, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-17", - "last_updated": "2026-03-17", + "attachment": false, + "open_weights": true, + "knowledge": "2024-07", + "release_date": "2025-01-20", + "last_updated": "2025-05-29", "type": "chat" }, { - "id": "openai/gpt-5.6-sol", - "name": "GPT-5.6 Sol", - "display_name": "GPT-5.6 Sol", + "id": "XiaomiMiMo/MiMo-V2.5-Pro", + "name": "MiMo-V2.5-Pro", + "display_name": "MiMo-V2.5-Pro", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1048576, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -316179,53 +315184,39 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", "effort_options": [ "none", "low", "medium", "high", - "xhigh", - "max" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "xhigh" + ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "attachment": false, + "open_weights": true, + "knowledge": "2024-12", + "release_date": "2026-04-22", + "last_updated": "2026-04-22", "type": "chat" }, { - "id": "openai/gpt-5.2-codex", - "name": "GPT-5.2 Codex", - "display_name": "GPT-5.2 Codex", + "id": "XiaomiMiMo/MiMo-V2.5", + "name": "MiMo-V2.5", + "display_name": "MiMo-V2.5", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 262144, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -316233,77 +315224,55 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", "effort_options": [ + "none", "low", "medium", "high", "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2025-12-11", - "last_updated": "2025-12-11", + "attachment": false, + "open_weights": true, + "knowledge": "2024-12", + "release_date": "2026-04-22", + "last_updated": "2026-04-22", "type": "chat" }, { - "id": "openai/gpt-5.5-pro", - "name": "GPT-5.5 Pro", - "display_name": "GPT-5.5 Pro", + "id": "google/gemma-3-12b-it", + "name": "Gemma 3 12B IT", + "display_name": "Gemma 3 12B IT", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 131072, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "medium", - "high", - "xhigh" - ] - } + "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2025-12-01", - "release_date": "2026-04-23", - "last_updated": "2026-04-23", + "open_weights": true, + "knowledge": "2024-08", + "release_date": "2025-03-12", + "last_updated": "2025-03-12", "type": "chat" }, { - "id": "openai/gpt-5-nano", - "name": "GPT-5 Nano", - "display_name": "GPT-5 Nano", + "id": "google/gemma-4-31B-it", + "name": "Gemma 4 31B IT", + "display_name": "Gemma 4 31B IT", "modalities": { "input": [ "text", @@ -316314,10 +315283,10 @@ ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 262144, + "output": 32768 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -316325,49 +315294,32 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "minimal", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "supported": true } }, "attachment": true, - "open_weights": false, - "knowledge": "2024-05-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "openai/gpt-4o", - "name": "GPT-4o", - "display_name": "GPT-4o", + "id": "google/gemma-3-4b-it", + "name": "Gemma 3 4B IT", + "display_name": "Gemma 3 4B IT", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 131072, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -316375,16 +315327,16 @@ "supported": false }, "attachment": true, - "open_weights": false, - "knowledge": "2023-09", - "release_date": "2024-05-13", - "last_updated": "2024-08-06", + "open_weights": true, + "knowledge": "2024-08", + "release_date": "2025-03-12", + "last_updated": "2025-03-12", "type": "chat" }, { - "id": "openai/gpt-5.4-nano", - "name": "GPT-5.4 nano", - "display_name": "GPT-5.4 nano", + "id": "google/gemma-4-26B-A4B-it", + "name": "Gemma 4 26B A4B IT", + "display_name": "Gemma 4 26B A4B IT", "modalities": { "input": [ "text", @@ -316395,130 +315347,97 @@ ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 262144, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "supported": true } }, "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-17", - "last_updated": "2026-03-17", + "open_weights": true, + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "openai/gpt-3.5-turbo", - "name": "GPT-3.5-turbo", - "display_name": "GPT-3.5-turbo", + "id": "google/gemma-3-27b-it", + "name": "Gemma 3 27B IT", + "display_name": "Gemma 3 27B IT", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 16385, - "output": 4096 + "context": 131072, + "output": 131072 }, "temperature": true, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, - "attachment": false, - "open_weights": false, - "knowledge": "2021-09-01", - "release_date": "2023-03-01", - "last_updated": "2023-11-06", + "attachment": true, + "open_weights": true, + "knowledge": "2024-08", + "release_date": "2025-03-12", + "last_updated": "2025-03-12", "type": "chat" - }, + } + ] + }, + "modelscope": { + "id": "modelscope", + "name": "ModelScope", + "display_name": "ModelScope", + "api": "https://api-inference.modelscope.cn/v1", + "doc": "https://modelscope.cn/docs/model-service/API-Inference/intro", + "models": [ { - "id": "openai/gpt-5.6-luna", - "name": "GPT-5.6 Luna", - "display_name": "GPT-5.6 Luna", + "id": "ZhipuAI/GLM-4.5", + "name": "GLM-4.5", + "display_name": "GLM-4.5", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 131072, + "output": 98304 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } - }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-07-28", + "last_updated": "2025-07-28", "type": "chat" }, { - "id": "openai/o3-mini", - "name": "o3-mini", - "display_name": "o3-mini", + "id": "ZhipuAI/GLM-4.6", + "name": "GLM-4.6", + "display_name": "GLM-4.6", "modalities": { "input": [ "text" @@ -316528,10 +315447,10 @@ ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 202752, + "output": 98304 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -316539,142 +315458,89 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "supported": true } }, "attachment": false, - "open_weights": false, - "knowledge": "2024-05", - "release_date": "2024-12-20", - "last_updated": "2025-01-29", + "open_weights": true, + "knowledge": "2025-07", + "release_date": "2025-09-30", + "last_updated": "2025-09-30", "type": "chat" }, { - "id": "openai/gpt-5.6-terra", - "name": "GPT-5.6 Terra", - "display_name": "GPT-5.6 Terra", + "id": "Qwen/Qwen3-Coder-30B-A3B-Instruct", + "name": "Qwen3 Coder 30B A3B Instruct", + "display_name": "Qwen3 Coder 30B A3B Instruct", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 262144, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-02-16", - "release_date": "2026-07-09", - "last_updated": "2026-07-09", + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-07-31", + "last_updated": "2025-07-31", "type": "chat" }, { - "id": "openai/o3", - "name": "o3", - "display_name": "o3", + "id": "Qwen/Qwen3-235B-A22B-Instruct-2507", + "name": "Qwen3 235B A22B Instruct 2507", + "display_name": "Qwen3 235B A22B Instruct 2507", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 262144, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-05", - "release_date": "2025-04-16", - "last_updated": "2025-04-16", + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-07-21", + "last_updated": "2025-07-21", "type": "chat" }, { - "id": "openai/gpt-5-pro", - "name": "GPT-5 Pro", - "display_name": "GPT-5 Pro", + "id": "Qwen/Qwen3-235B-A22B-Thinking-2507", + "name": "Qwen3-235B-A22B-Thinking-2507", + "display_name": "Qwen3-235B-A22B-Thinking-2507", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 272000 + "context": 262144, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -316683,134 +315549,101 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "fixed", - "effort": "high", - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-10-06", - "last_updated": "2025-10-06", + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-07-25", + "last_updated": "2025-07-25", "type": "chat" }, { - "id": "openai/gpt-5.3-codex", - "name": "GPT-5.3 Codex", - "display_name": "GPT-5.3 Codex", + "id": "Qwen/Qwen3-30B-A3B-Instruct-2507", + "name": "Qwen3 30B A3B Instruct 2507", + "display_name": "Qwen3 30B A3B Instruct 2507", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 262144, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } + "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-05", - "last_updated": "2026-02-05", + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-07-28", + "last_updated": "2025-07-28", "type": "chat" }, { - "id": "openai/gpt-5.4", - "name": "GPT-5.4", - "display_name": "GPT-5.4", + "id": "Qwen/Qwen3-30B-A3B-Thinking-2507", + "name": "Qwen3 30B A3B Thinking 2507", + "display_name": "Qwen3 30B A3B Thinking 2507", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 262144, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-05", - "last_updated": "2026-03-05", + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-07-30", + "last_updated": "2025-07-30", "type": "chat" - }, + } + ] + }, + "cerebras": { + "id": "cerebras", + "name": "Cerebras", + "display_name": "Cerebras", + "doc": "https://inference-docs.cerebras.ai/models/overview", + "models": [ { - "id": "openai/gpt-5-codex", - "name": "GPT-5-Codex", - "display_name": "GPT-5-Codex", + "id": "qwen-3.8-27b", + "name": "Qwen3.8 27B", + "display_name": "Qwen3.8 27B", "modalities": { "input": [ "text", @@ -316821,10 +315654,10 @@ ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 131072, + "output": 40960 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -316832,132 +315665,116 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", "effort_options": [ - "minimal", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ + "none", "low", "medium", "high" - ], - "visibility": "hidden" + ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-09-15", - "last_updated": "2025-09-15", + "open_weights": true, + "release_date": "2026-08-14", + "last_updated": "2026-08-14", "type": "chat" }, { - "id": "openai/gpt-5.1", - "name": "GPT-5.1", - "display_name": "GPT-5.1", + "id": "gpt-oss-120b", + "name": "GPT OSS 120B", + "display_name": "GPT OSS 120B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 131072, + "output": 40960 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", "effort_options": [ - "none", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ "low", "medium", "high" - ], - "visibility": "hidden" + ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-11-13", - "last_updated": "2025-11-13", + "attachment": false, + "open_weights": true, + "knowledge": "2024-06", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", "type": "chat" - }, + } + ] + }, + "alibaba-cn": { + "id": "alibaba-cn", + "name": "alibaba-cn", + "display_name": "alibaba-cn", + "api": "https://dashscope.aliyuncs.com/compatible-mode/v1", + "doc": "https://www.alibabacloud.com/help/en/model-studio/models", + "models": [ { - "id": "openai/gpt-4.1-mini", - "name": "GPT-4.1 mini", - "display_name": "GPT-4.1 mini", + "id": "qwen-vl-ocr", + "name": "Qwen Vl Ocr", + "display_name": "Qwen Vl Ocr", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1047576, - "output": 32768 + "context": 34096, + "output": 4096 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, "knowledge": "2024-04", - "release_date": "2025-04-14", - "last_updated": "2025-04-14", + "release_date": "2024-10-28", + "last_updated": "2026-09-11", "type": "chat" }, { - "id": "openai/gpt-5.5", - "name": "GPT-5.5", - "display_name": "GPT-5.5", + "id": "qwen3.6-plus", + "name": "Qwen3.6 Plus", + "display_name": "Qwen3.6 Plus", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 1000000, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -316966,79 +315783,81 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": true, "open_weights": false, - "knowledge": "2025-12-01", - "release_date": "2026-04-23", - "last_updated": "2026-04-23", + "knowledge": "2025-04", + "release_date": "2026-04-02", + "last_updated": "2026-04-02", "type": "chat" }, { - "id": "openai/gpt-4o-mini", - "name": "GPT-4o mini", - "display_name": "GPT-4o mini", + "id": "glm-5.2", + "name": "GLM-5.2", + "display_name": "GLM-5.2", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 16384 + "context": 1000000, + "output": 128000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "attachment": true, - "open_weights": false, - "knowledge": "2023-09", - "release_date": "2024-07-18", - "last_updated": "2024-07-18", + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "high", + "max" + ] + } + }, + "attachment": false, + "open_weights": true, + "release_date": "2026-06-13", + "last_updated": "2026-06-13", "type": "chat" }, { - "id": "openai/gpt-5-mini", - "name": "GPT-5 Mini", - "display_name": "GPT-5 Mini", + "id": "deepseek-v4-flash", + "name": "DeepSeek V4 Flash", + "display_name": "DeepSeek V4 Flash", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 1000000, + "output": 384000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -317049,47 +315868,75 @@ "supported": true, "default_enabled": true, "mode": "effort", - "effort": "medium", + "effort": "high", "effort_options": [ - "minimal", "low", - "medium", - "high" + "high", + "max" ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ], - "visibility": "hidden" + "notes": [ + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." + ] } }, - "attachment": true, + "attachment": false, + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", + "type": "chat" + }, + { + "id": "qwen-mt-turbo", + "name": "Qwen Mt Turbo", + "display_name": "Qwen Mt Turbo", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 16384, + "output": 8192 + }, + "temperature": true, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, "open_weights": false, - "knowledge": "2024-05-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "knowledge": "2024-04", + "release_date": "2025-01", + "last_updated": "2025-01", "type": "chat" }, { - "id": "openai/gpt-5", - "name": "GPT-5", - "display_name": "GPT-5", + "id": "qwen3-max", + "name": "Qwen3 Max", + "display_name": "Qwen3 Max", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 262144, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -317098,65 +315945,52 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "minimal", - "low", - "medium", - "high" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-08-07", - "last_updated": "2025-08-07", + "knowledge": "2025-04", + "release_date": "2026-01-23", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "openai/gpt-4.1", - "name": "GPT-4.1", - "display_name": "GPT-4.1", + "id": "moonshot-kimi-k2-instruct", + "name": "Moonshot Kimi K2 Instruct", + "display_name": "Moonshot Kimi K2 Instruct", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1047576, - "output": 32768 + "context": 131072, + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-04-14", - "last_updated": "2025-04-14", + "attachment": false, + "open_weights": true, + "release_date": "2025-01-01", + "last_updated": "2025-01-01", "type": "chat" }, { - "id": "openai/gpt-5.1-codex-mini", - "name": "GPT-5.1 Codex mini", - "display_name": "GPT-5.1 Codex mini", + "id": "deepseek-v4.1-flash", + "name": "DeepSeek V4.1 Flash", + "display_name": "DeepSeek V4.1 Flash", "modalities": { "input": [ "text", @@ -317167,62 +316001,55 @@ ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 1000000, + "output": 384000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ], - "verbosity": "medium", - "verbosity_options": [ + "effort_options": [ "low", - "medium", - "high" - ], - "visibility": "hidden" + "high", + "max" + ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-11-13", - "last_updated": "2025-11-13", + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-09-10", + "last_updated": "2026-09-10", "type": "chat" }, { - "id": "openai/o1", - "name": "o1", - "display_name": "o1", + "id": "MiniMax-M2.5", + "name": "MiniMax-M2.5", + "display_name": "MiniMax-M2.5", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 204800, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -317231,71 +316058,82 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2023-09", - "release_date": "2024-12-05", - "last_updated": "2024-12-05", + "attachment": false, + "open_weights": true, + "release_date": "2026-02-12", + "last_updated": "2026-02-12", "type": "chat" }, { - "id": "openai/gpt-4.1-nano", - "name": "GPT-4.1 nano", - "display_name": "GPT-4.1 nano", + "id": "qwen3-8b", + "name": "Qwen3 8B", + "display_name": "Qwen3 8B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1047576, - "output": 32768 + "context": 131072, + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true, + "budget": { + "default": 38912, + "min": 0, + "max": 38912 + } }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-04", - "release_date": "2025-04-14", - "last_updated": "2025-04-14", + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-04", + "last_updated": "2025-04", "type": "chat" }, { - "id": "openai/o4-mini", - "name": "o4-mini", - "display_name": "o4-mini", + "id": "kimi-k2-thinking", + "name": "Moonshot Kimi K2 Thinking", + "display_name": "Moonshot Kimi K2 Thinking", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 262144, + "output": 16384 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -317304,199 +316142,217 @@ "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2024-05", - "release_date": "2025-04-16", - "last_updated": "2025-04-16", + "attachment": false, + "open_weights": true, + "release_date": "2025-11-06", + "last_updated": "2025-11-06", "type": "chat" }, { - "id": "openai/gpt-5.1-codex", - "name": "GPT-5.1 Codex", - "display_name": "GPT-5.1 Codex", + "id": "glm-5.3", + "name": "GLM-5.3", + "display_name": "GLM-5.3", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 400000, - "output": 128000 + "context": 1000000, + "output": 131072 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "none", - "effort_options": [ - "none", - "low", - "medium", - "high" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ], - "verbosity": "medium", - "verbosity_options": [ + "effort_options": [ "low", - "medium", - "high" - ], - "visibility": "hidden" + "high", + "max" + ] } }, - "attachment": true, + "attachment": false, + "open_weights": true, + "release_date": "2026-08-14", + "last_updated": "2026-08-14", + "type": "chat" + }, + { + "id": "qwen-math-turbo", + "name": "Qwen Math Turbo", + "display_name": "Qwen Math Turbo", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 4096, + "output": 3072 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": false, "open_weights": false, - "knowledge": "2024-09-30", - "release_date": "2025-11-13", - "last_updated": "2025-11-13", + "knowledge": "2024-04", + "release_date": "2024-09-19", + "last_updated": "2024-09-19", "type": "chat" }, { - "id": "openai/gpt-4-turbo", - "name": "GPT-4 Turbo", - "display_name": "GPT-4 Turbo", + "id": "qwen-doc-turbo", + "name": "Qwen Doc Turbo", + "display_name": "Qwen Doc Turbo", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 128000, - "output": 4096 + "context": 131072, + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2023-12", - "release_date": "2023-11-06", - "last_updated": "2024-04-09", + "knowledge": "2024-04", + "release_date": "2024-01", + "last_updated": "2024-01", "type": "chat" }, { - "id": "openai/gpt-5.4-pro", - "name": "GPT-5.4 Pro", - "display_name": "GPT-5.4 Pro", + "id": "qwen3-14b", + "name": "Qwen3 14B", + "display_name": "Qwen3 14B", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1050000, - "output": 128000 + "context": 131072, + "output": 8192 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": true, + "budget": { + "default": 38912, + "min": 0, + "max": 38912 + } }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "medium", - "high", - "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-03-05", - "last_updated": "2026-03-05", + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-04", + "last_updated": "2025-04", "type": "chat" }, { - "id": "qwen/qwen3.7-plus", - "name": "Qwen3.7 Plus", - "display_name": "Qwen3.7 Plus", + "id": "qwen3-235b-a22b", + "name": "Qwen3 235B A22B", + "display_name": "Qwen3 235B A22B", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 64000 + "context": 131072, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false, + "budget": { + "default": 81920, + "min": 0, + "max": 81920 + } }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, - "attachment": true, - "open_weights": false, + "attachment": false, + "open_weights": true, "knowledge": "2025-04", - "release_date": "2026-06-02", - "last_updated": "2026-06-02", + "release_date": "2025-04", + "last_updated": "2025-04", "type": "chat" }, { - "id": "qwen/qwen3.8-max-preview", - "name": "Qwen3.8 Max Preview", - "display_name": "Qwen3.8 Max Preview", + "id": "qwen3.7-max", + "name": "Qwen3.7 Max", + "display_name": "Qwen3.7 Max", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" @@ -317514,23 +316370,19 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "low", - "medium", - "xhigh" - ] + "supported": true } }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2026-07-19", - "last_updated": "2026-07-19", + "release_date": "2026-05-21", + "last_updated": "2026-05-21", "type": "chat" }, { - "id": "qwen/qwen3.6-flash", - "name": "Qwen3.6 Flash", - "display_name": "Qwen3.6 Flash", + "id": "qwen3.5-plus", + "name": "Qwen3.5 Plus", + "display_name": "Qwen3.5 Plus", "modalities": { "input": [ "text", @@ -317564,14 +316416,45 @@ }, "attachment": true, "open_weights": false, - "release_date": "2026-04-27", - "last_updated": "2026-04-27", + "knowledge": "2025-04", + "release_date": "2026-02-16", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "qwen/qwen3.7-max", - "name": "Qwen3.7 Max", - "display_name": "Qwen3.7 Max", + "id": "qwen3-omni-flash-realtime", + "name": "Qwen3-Omni Flash Realtime", + "display_name": "Qwen3-Omni Flash Realtime", + "modalities": { + "input": [ + "text", + "image", + "audio" + ], + "output": [ + "text", + "audio" + ] + }, + "limit": { + "context": 65536, + "output": 16384 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": false, + "knowledge": "2024-04", + "release_date": "2025-09-15", + "last_updated": "2025-09-15" + }, + { + "id": "tongyi-intent-detect-v3", + "name": "Tongyi Intent Detect V3", + "display_name": "Tongyi Intent Detect V3", "modalities": { "input": [ "text" @@ -317580,6 +316463,36 @@ "text" ] }, + "limit": { + "context": 8192, + "output": 1024 + }, + "temperature": true, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": false, + "knowledge": "2024-04", + "release_date": "2024-01", + "last_updated": "2024-01", + "type": "chat" + }, + { + "id": "qwen3.7-flash", + "name": "Qwen3.7 Flash", + "display_name": "Qwen3.7 Flash", + "modalities": { + "input": [ + "text", + "image", + "video" + ], + "output": [ + "text" + ] + }, "limit": { "context": 1000000, "output": 131072 @@ -317595,16 +316508,16 @@ "supported": true } }, - "attachment": false, + "attachment": true, "open_weights": false, - "release_date": "2026-05-21", - "last_updated": "2026-05-21", + "release_date": "2026-07-15", + "last_updated": "2026-07-15", "type": "chat" }, { - "id": "deepseek/deepseek-v4-flash", - "name": "DeepSeek V4 Flash", - "display_name": "DeepSeek V4 Flash", + "id": "qwen-plus", + "name": "Qwen Plus", + "display_name": "Qwen Plus", "modalities": { "input": [ "text" @@ -317615,47 +316528,47 @@ }, "limit": { "context": 1000000, - "output": 384000 + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false, + "budget": { + "default": 81920, + "min": 0, + "max": 81920 + } }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "high", - "max" - ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, + "search": { + "supported": true, + "default": false, + "forced_search": false, + "search_strategy": "turbo" + }, "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "open_weights": false, + "knowledge": "2024-04", + "release_date": "2024-01-25", + "last_updated": "2025-09-11", "type": "chat" }, { - "id": "deepseek/deepseek-v4-pro", - "name": "DeepSeek V4 Pro", - "display_name": "DeepSeek V4 Pro", + "id": "qwen-flash", + "name": "Qwen Flash", + "display_name": "Qwen Flash", "modalities": { "input": [ "text" @@ -317666,108 +316579,93 @@ }, "limit": { "context": 1000000, - "output": 384000 + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false, + "budget": { + "default": 81920, + "min": 0, + "max": 81920 + } }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "high", - "max" - ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, + "search": { + "supported": true, + "default": false, + "forced_search": false, + "search_strategy": "turbo" + }, "attachment": false, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "open_weights": false, + "knowledge": "2024-04", + "release_date": "2025-07-28", + "last_updated": "2025-07-28", "type": "chat" }, { - "id": "anthropic/claude-opus-4-7", - "name": "Claude Opus 4.7", - "display_name": "Claude Opus 4.7", + "id": "qwen3-vl-235b-a22b", + "name": "Qwen3-VL 235B-A22B", + "display_name": "Qwen3-VL 235B-A22B", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 131072, + "output": 32768 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], "interleaved": true, "summaries": true, - "visibility": "omitted", + "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, "attachment": true, - "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-04-16", - "last_updated": "2026-04-16", + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-04", + "last_updated": "2025-04", "type": "chat" }, { - "id": "anthropic/claude-sonnet-4-5", - "name": "Claude Sonnet 4.5 (latest)", - "display_name": "Claude Sonnet 4.5 (latest)", + "id": "qwen3.8-max", + "name": "Qwen3.8 Max", + "display_name": "Qwen3.8 Max", "modalities": { "input": [ "text", "image", + "video", "pdf" ], "output": [ @@ -317775,24 +316673,32 @@ ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "budget", + "default_enabled": true, + "mode": "effort", "budget": { - "min": 1024, + "min": 0, + "max": 262144, "unit": "tokens" }, + "effort": "xhigh", + "effort_options": [ + "none", + "low", + "medium", + "xhigh" + ], "interleaved": true, "summaries": true, "visibility": "summary", @@ -317800,298 +316706,237 @@ "thinking_blocks" ], "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." - ] + "Prefer reasoning_effort; thinking_budget is an alternative, not an additional control.", + "Omitting both controls differs from explicitly selecting xhigh, which maps to 262144 budget tokens." + ], + "budget_exclusive_with_effort": true } }, "attachment": true, "open_weights": false, - "knowledge": "2025-07-31", - "release_date": "2025-09-29", - "last_updated": "2025-09-29", + "release_date": "2026-08-03", + "last_updated": "2026-08-03", "type": "chat" }, { - "id": "anthropic/claude-haiku-4-5", - "name": "Claude Haiku 4.5 (latest)", - "display_name": "Claude Haiku 4.5 (latest)", + "id": "deepseek-r1-distill-qwen-1-5b", + "name": "DeepSeek R1 Distill Qwen 1.5B", + "display_name": "DeepSeek R1 Distill Qwen 1.5B", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 32768, + "output": 16384 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude 4 manual thinking uses thinking.type = \"enabled\" with budget_tokens.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header for this model family." - ] - } + "default": true }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-02-28", - "release_date": "2025-10-15", - "last_updated": "2025-10-15", + "release_date": "2025-01-01", + "last_updated": "2025-01-01", "type": "chat" }, { - "id": "anthropic/claude-sonnet-5", - "name": "Claude Sonnet 5", - "display_name": "Claude Sonnet 5", + "id": "qwen-omni-turbo", + "name": "Qwen-Omni Turbo", + "display_name": "Qwen-Omni Turbo", "modalities": { "input": [ "text", "image", - "pdf" + "audio", + "video" ], "output": [ - "text" + "text", + "audio" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 32768, + "output": 2048 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ] - } + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-30", - "last_updated": "2026-06-30", + "knowledge": "2024-04", + "release_date": "2025-01-19", + "last_updated": "2025-03-26", "type": "chat" }, { - "id": "anthropic/claude-opus-4-5", - "name": "Claude Opus 4.5 (latest)", - "display_name": "Claude Opus 4.5 (latest)", + "id": "qwen-mt-plus", + "name": "Qwen Mt Plus", + "display_name": "Qwen Mt Plus", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 64000 + "context": 16384, + "output": 8192 + }, + "temperature": true, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": false, + "knowledge": "2024-04", + "release_date": "2025-01", + "last_updated": "2025-01", + "type": "chat" + }, + { + "id": "qwen-max", + "name": "Qwen Max", + "display_name": "Qwen Max", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 32768, + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": false + "supported": false }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.5 uses manual thinking.type = \"enabled\" with budget_tokens; effort can be used alongside the thinking budget.", - "Interleaved thinking requires the interleaved-thinking-2025-05-14 beta header." - ] - } + "search": { + "supported": true, + "default": false, + "forced_search": false, + "search_strategy": "turbo" }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-05", - "release_date": "2025-11-24", - "last_updated": "2025-11-24", + "knowledge": "2024-04", + "release_date": "2024-04-03", + "last_updated": "2025-01-25", "type": "chat" }, { - "id": "anthropic/claude-sonnet-4-6", - "name": "Claude Sonnet 4.6", - "display_name": "Claude Sonnet 4.6", + "id": "deepseek-r1-distill-llama-70b", + "name": "DeepSeek R1 Distill Llama 70B", + "display_name": "DeepSeek R1 Distill Llama 70B", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 64000 + "context": 32768, + "output": 16384 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." - ] + "supported": true } }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-08-31", - "release_date": "2026-02-17", - "last_updated": "2026-03-13", + "release_date": "2025-01-01", + "last_updated": "2025-01-01", "type": "chat" }, { - "id": "anthropic/claude-opus-4-6", - "name": "Claude Opus 4.6", - "display_name": "Claude Opus 4.6", + "id": "deepseek-v3-1", + "name": "DeepSeek V3.1", + "display_name": "DeepSeek V3.1", "modalities": { "input": [ - "text", - "image", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 131072, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." - ] - } + "supported": false }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-05-31", - "release_date": "2026-02-05", - "last_updated": "2026-03-13", + "release_date": "2025-01-01", + "last_updated": "2025-01-01", "type": "chat" }, { - "id": "anthropic/claude-opus-4-8", - "name": "Claude Opus 4.8", - "display_name": "Claude Opus 4.8", + "id": "qwen3-next-80b-a3b-instruct", + "name": "Qwen3 Next 80B A3B Instruct", + "display_name": "Qwen3 Next 80B A3B Instruct", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 131072, + "output": 32768 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-09", + "last_updated": "2025-09", + "type": "chat" + }, + { + "id": "qwen3.6-flash", + "name": "Qwen3.6 Flash", + "display_name": "Qwen3.6 Flash", "modalities": { "input": [ "text", "image", - "pdf" + "video" ], "output": [ "text" @@ -318099,108 +316944,90 @@ }, "limit": { "context": 1000000, - "output": 128000 + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": false + "default": true }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], "interleaved": true, "summaries": true, - "visibility": "omitted", + "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "notes": [ - "Claude Opus 4.7 and newer Opus models require thinking.type = \"adaptive\" to enable thinking explicitly.", - "Manual budget_tokens requests return 400 on Claude Opus 4.7 and newer adaptive-only Opus models.", - "task_budget is separate from thinking control and should not be treated as a thinking budget." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-01", - "release_date": "2026-05-28", - "last_updated": "2026-05-28", + "release_date": "2026-04-27", + "last_updated": "2026-04-27", "type": "chat" }, { - "id": "anthropic/claude-fable-5", - "name": "Claude Fable 5", - "display_name": "Claude Fable 5", + "id": "qwen3-asr-flash", + "name": "Qwen3-ASR Flash", + "display_name": "Qwen3-ASR Flash", "modalities": { "input": [ - "text", - "image", - "pdf" + "audio" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 128000 + "context": 53248, + "output": 4096 }, "temperature": false, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "omitted", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", - "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", - "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." - ] - } + "supported": false }, "attachment": true, "open_weights": false, - "knowledge": "2026-01-31", - "release_date": "2026-06-09", - "last_updated": "2026-06-09", + "knowledge": "2024-04", + "release_date": "2025-09-08", + "last_updated": "2025-09-08" + }, + { + "id": "qwen3-coder-plus", + "name": "Qwen3 Coder Plus", + "display_name": "Qwen3 Coder Plus", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1000000, + "output": 65536 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-07-23", + "last_updated": "2026-09-11", "type": "chat" }, { - "id": "zai/glm-5.1", - "name": "GLM-5.1", - "display_name": "GLM-5.1", + "id": "deepseek-r1-distill-llama-8b", + "name": "DeepSeek R1 Distill Llama 8B", + "display_name": "DeepSeek R1 Distill Llama 8B", "modalities": { "input": [ "text" @@ -318210,8 +317037,8 @@ ] }, "limit": { - "context": 200000, - "output": 131072 + "context": 32768, + "output": 16384 }, "temperature": true, "tool_call": true, @@ -318219,31 +317046,29 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, "attachment": false, - "open_weights": true, - "release_date": "2026-04-07", - "last_updated": "2026-04-07", + "open_weights": false, + "release_date": "2025-01-01", + "last_updated": "2025-01-01", "type": "chat" }, { - "id": "zai/glm-5", - "name": "GLM-5", - "display_name": "GLM-5", + "id": "qwen3.8-omni-flash", + "name": "Qwen3.8 Omni Flash", + "display_name": "Qwen3.8 Omni Flash", "modalities": { "input": [ - "text" + "text", + "image", + "audio", + "video" ], "output": [ "text" ] }, "limit": { - "context": 204800, + "context": 1000000, "output": 131072 }, "temperature": true, @@ -318255,6 +317080,15 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "xhigh", + "effort_options": [ + "none", + "low", + "medium", + "xhigh" + ], "interleaved": true, "summaries": true, "visibility": "summary", @@ -318263,16 +317097,16 @@ ] } }, - "attachment": false, - "open_weights": true, - "release_date": "2026-02-12", - "last_updated": "2026-02-12", + "attachment": true, + "open_weights": false, + "release_date": "2026-09-17", + "last_updated": "2026-09-17", "type": "chat" }, { - "id": "zai/glm-4.6", - "name": "GLM-4.6", - "display_name": "GLM-4.6", + "id": "qwen3-next-80b-a3b-thinking", + "name": "Qwen3 Next 80B A3B Thinking", + "display_name": "Qwen3 Next 80B A3B Thinking", "modalities": { "input": [ "text" @@ -318282,31 +317116,42 @@ ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 131072, + "output": 32768 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, - "default": true + "default": true, + "budget": { + "default": 81920, + "min": 0, + "max": 81920 + } }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": false, "open_weights": true, "knowledge": "2025-04", - "release_date": "2025-09-30", - "last_updated": "2025-09-30", + "release_date": "2025-09", + "last_updated": "2025-09", "type": "chat" }, { - "id": "zai/glm-4.5-air", - "name": "GLM-4.5-Air", - "display_name": "GLM-4.5-Air", + "id": "qwen3-coder-30b-a3b-instruct", + "name": "Qwen3-Coder 30B-A3B Instruct", + "display_name": "Qwen3-Coder 30B-A3B Instruct", "modalities": { "input": [ "text" @@ -318316,26 +317161,25 @@ ] }, "limit": { - "context": 131072, - "output": 98304 + "context": 262144, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": false, "open_weights": true, "knowledge": "2025-04", - "release_date": "2025-07-28", - "last_updated": "2025-07-28", + "release_date": "2025-04", + "last_updated": "2025-04", "type": "chat" }, { - "id": "zai/glm-5.2", - "name": "GLM-5.2", - "display_name": "GLM-5.2", + "id": "deepseek-r1-distill-qwen-32b", + "name": "DeepSeek R1 Distill Qwen 32B", + "display_name": "DeepSeek R1 Distill Qwen 32B", "modalities": { "input": [ "text" @@ -318345,8 +317189,8 @@ ] }, "limit": { - "context": 1000000, - "output": 131072 + "context": 32768, + "output": 16384 }, "temperature": true, "tool_call": true, @@ -318354,21 +317198,16 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, "attachment": false, - "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", + "open_weights": false, + "release_date": "2025-01-01", + "last_updated": "2025-01-01", "type": "chat" }, { - "id": "zai/glm-5-turbo", - "name": "GLM-5-Turbo", - "display_name": "GLM-5-Turbo", + "id": "deepseek-r1-distill-qwen-14b", + "name": "DeepSeek R1 Distill Qwen 14B", + "display_name": "DeepSeek R1 Distill Qwen 14B", "modalities": { "input": [ "text" @@ -318378,8 +317217,8 @@ ] }, "limit": { - "context": 200000, - "output": 131072 + "context": 32768, + "output": 16384 }, "temperature": true, "tool_call": true, @@ -318387,21 +317226,16 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, "attachment": false, "open_weights": false, - "release_date": "2026-03-16", - "last_updated": "2026-03-16", + "release_date": "2025-01-01", + "last_updated": "2025-01-01", "type": "chat" }, { - "id": "zai/glm-4.7", - "name": "GLM-4.7", - "display_name": "GLM-4.7", + "id": "qwen-long", + "name": "Qwen Long", + "display_name": "Qwen Long", "modalities": { "input": [ "text" @@ -318411,37 +317245,25 @@ ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 1000000, + "output": 8192 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-12-22", - "last_updated": "2025-12-22", + "open_weights": false, + "knowledge": "2024-04", + "release_date": "2025-01-25", + "last_updated": "2025-01-25", "type": "chat" }, { - "id": "zai/glm-4.5", - "name": "GLM-4.5", - "display_name": "GLM-4.5", + "id": "deepseek-r1-distill-qwen-7b", + "name": "DeepSeek R1 Distill Qwen 7B", + "display_name": "DeepSeek R1 Distill Qwen 7B", "modalities": { "input": [ "text" @@ -318451,8 +317273,8 @@ ] }, "limit": { - "context": 131072, - "output": 98304 + "context": 32768, + "output": 16384 }, "temperature": true, "tool_call": true, @@ -318461,28 +317283,30 @@ "default": true }, "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-07-28", - "last_updated": "2025-07-28", + "open_weights": false, + "release_date": "2025-01-01", + "last_updated": "2025-01-01", "type": "chat" }, { - "id": "thinkingmachines/inkling", - "name": "Inkling", - "display_name": "Inkling", + "id": "qwen3-omni-flash", + "name": "Qwen3-Omni Flash", + "display_name": "Qwen3-Omni Flash", "modalities": { "input": [ "text", - "image" + "image", + "audio", + "video" ], "output": [ - "text" + "text", + "audio" ] }, "limit": { "context": 65536, - "output": 65536 + "output": 16384 }, "temperature": true, "tool_call": true, @@ -318492,37 +317316,39 @@ }, "extra_capabilities": { "reasoning": { - "effort_options": [ - "none", - "minimal", - "low", - "medium", - "high", - "xhigh" + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, "attachment": true, - "open_weights": true, - "release_date": "2026-07-15", - "last_updated": "2026-07-15", + "open_weights": false, + "knowledge": "2024-04", + "release_date": "2025-09-15", + "last_updated": "2025-09-15", "type": "chat" }, { - "id": "groq/gpt-oss-120b", - "name": "GPT OSS 120B", - "display_name": "GPT OSS 120B", + "id": "kimi-k2.6", + "name": "Moonshot Kimi K2.6", + "display_name": "Moonshot Kimi K2.6", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 262144, + "output": 16384 }, "temperature": true, "tool_call": true, @@ -318533,27 +317359,29 @@ "extra_capabilities": { "reasoning": { "supported": true, - "effort_options": [ - "low", - "medium", - "high" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "knowledge": "2025-01", + "release_date": "2026-04-21", + "last_updated": "2026-04-21", "type": "chat" }, { - "id": "groq/gpt-oss-20b", - "name": "GPT OSS 20B", - "display_name": "GPT OSS 20B", + "id": "qvq-max", + "name": "QVQ Max", + "display_name": "QVQ Max", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" @@ -318561,7 +317389,7 @@ }, "limit": { "context": 131072, - "output": 32768 + "output": 8192 }, "temperature": true, "tool_call": true, @@ -318569,68 +317397,45 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "low", - "medium", - "high" - ] - } - }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "attachment": true, + "open_weights": false, + "knowledge": "2024-04", + "release_date": "2025-03-25", + "last_updated": "2025-03-25", "type": "chat" }, { - "id": "xiaomi/mimo-v2.5", - "name": "MiMo-V2.5", - "display_name": "MiMo-V2.5", + "id": "qwen3-coder-flash", + "name": "Qwen3 Coder Flash", + "display_name": "Qwen3 Coder Flash", "modalities": { "input": [ - "text", - "image", - "audio", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 1000000, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": true, - "open_weights": true, - "knowledge": "2024-12", - "release_date": "2026-04-22", - "last_updated": "2026-04-22", + "attachment": false, + "open_weights": false, + "knowledge": "2025-04", + "release_date": "2025-07-28", + "last_updated": "2025-07-28", "type": "chat" - } - ] - }, - "alibaba-coding-plan-cn": { - "id": "alibaba-coding-plan-cn", - "name": "Alibaba Coding Plan (China)", - "display_name": "Alibaba Coding Plan (China)", - "api": "https://coding.dashscope.aliyuncs.com/v1", - "doc": "https://help.aliyun.com/zh/model-studio/coding-plan", - "models": [ + }, { - "id": "glm-5", - "name": "GLM-5", - "display_name": "GLM-5", + "id": "qwen3-32b", + "name": "Qwen3 32B", + "display_name": "Qwen3 32B", "modalities": { "input": [ "text" @@ -318640,14 +317445,19 @@ ] }, "limit": { - "context": 202752, + "context": 131072, "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": true, + "budget": { + "default": 38912, + "min": 0, + "max": 38912 + } }, "extra_capabilities": { "reasoning": { @@ -318661,51 +317471,44 @@ } }, "attachment": false, - "open_weights": false, - "release_date": "2026-02-11", - "last_updated": "2026-02-11", + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-04", + "last_updated": "2025-04", "type": "chat" }, { - "id": "qwen3.7-plus", - "name": "Qwen3.7 Plus", - "display_name": "Qwen3.7 Plus", + "id": "qwen3-coder-480b-a35b-instruct", + "name": "Qwen3-Coder 480B-A35B Instruct", + "display_name": "Qwen3-Coder 480B-A35B Instruct", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 64000 + "context": 262144, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, - "attachment": true, - "open_weights": false, + "attachment": false, + "open_weights": true, "knowledge": "2025-04", - "release_date": "2026-06-02", - "last_updated": "2026-06-02", + "release_date": "2025-04", + "last_updated": "2025-04", "type": "chat" }, { - "id": "qwen3-coder-next", - "name": "Qwen3 Coder Next", - "display_name": "Qwen3 Coder Next", + "id": "qwen-math-plus", + "name": "Qwen Math Plus", + "display_name": "Qwen Math Plus", "modalities": { "input": [ "text" @@ -318715,8 +317518,8 @@ ] }, "limit": { - "context": 262144, - "output": 65536 + "context": 4096, + "output": 3072 }, "temperature": true, "tool_call": true, @@ -318724,19 +317527,21 @@ "supported": false }, "attachment": false, - "open_weights": true, - "release_date": "2026-02-03", - "last_updated": "2026-02-03", + "open_weights": false, + "knowledge": "2024-04", + "release_date": "2024-08-16", + "last_updated": "2024-09-19", "type": "chat" }, { - "id": "qwen3.5-plus", - "name": "Qwen3.5 Plus", - "display_name": "Qwen3.5 Plus", + "id": "qwen3.5-flash", + "name": "Qwen3.5 Flash", + "display_name": "Qwen3.5 Flash", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" @@ -318766,27 +317571,25 @@ "attachment": true, "open_weights": false, "knowledge": "2025-04", - "release_date": "2026-02-16", - "last_updated": "2026-02-16", + "release_date": "2026-02-23", + "last_updated": "2026-09-22", "type": "chat" }, { - "id": "qwen3.6-plus", - "name": "Qwen3.6 Plus", - "display_name": "Qwen3.6 Plus", + "id": "deepseek-r1", + "name": "DeepSeek R1", + "display_name": "DeepSeek R1", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 65536 + "context": 131072, + "output": 16384 }, "temperature": true, "tool_call": true, @@ -318805,20 +317608,21 @@ ] } }, - "attachment": true, + "attachment": false, "open_weights": false, - "knowledge": "2025-04", - "release_date": "2026-04-02", - "last_updated": "2026-04-02", + "release_date": "2025-01-01", + "last_updated": "2025-01-01", "type": "chat" }, { - "id": "qwen3-max-2026-01-23", - "name": "Qwen3 Max", - "display_name": "Qwen3 Max", + "id": "qwen3.5-397b-a17b", + "name": "Qwen3.5 397B-A17B", + "display_name": "Qwen3.5 397B-A17B", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" @@ -318826,12 +317630,13 @@ }, "limit": { "context": 262144, - "output": 32768 + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true + "supported": true, + "default": true }, "extra_capabilities": { "reasoning": { @@ -318844,29 +317649,28 @@ ] } }, - "attachment": false, - "open_weights": false, + "attachment": true, + "open_weights": true, "knowledge": "2025-04", - "release_date": "2026-01-23", - "last_updated": "2026-01-23", + "release_date": "2026-02-16", + "last_updated": "2026-02-16", "type": "chat" }, { - "id": "kimi-k2.5", - "name": "Kimi K2.5", - "display_name": "Kimi K2.5", + "id": "deepseek-v4-pro", + "name": "DeepSeek V4 Pro", + "display_name": "DeepSeek V4 Pro", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 1000000, + "output": 384000 }, "temperature": true, "tool_call": true, @@ -318877,25 +317681,36 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "high", + "max" + ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "notes": [ + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-01-27", - "last_updated": "2026-01-27", + "knowledge": "2025-05", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" }, { - "id": "glm-4.7", - "name": "GLM-4.7", - "display_name": "GLM-4.7", + "id": "qwen-turbo", + "name": "Qwen Turbo", + "display_name": "Qwen Turbo", "modalities": { "input": [ "text" @@ -318905,14 +317720,19 @@ ] }, "limit": { - "context": 202752, + "context": 131072, "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false, + "budget": { + "default": 38912, + "min": 0, + "max": 38912 + } }, "extra_capabilities": { "reasoning": { @@ -318925,17 +317745,23 @@ ] } }, + "search": { + "supported": true, + "default": false, + "forced_search": false, + "search_strategy": "turbo" + }, "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-12-22", - "last_updated": "2025-12-22", + "open_weights": false, + "knowledge": "2024-04", + "release_date": "2024-11-01", + "last_updated": "2025-07-15", "type": "chat" }, { - "id": "qwen3-coder-plus", - "name": "Qwen3 Coder Plus", - "display_name": "Qwen3 Coder Plus", + "id": "deepseek-v3", + "name": "DeepSeek V3", + "display_name": "DeepSeek V3", "modalities": { "input": [ "text" @@ -318945,7 +317771,63 @@ ] }, "limit": { - "context": 1000000, + "context": 65536, + "output": 8192 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": false, + "release_date": "2024-12-01", + "last_updated": "2024-12-01", + "type": "chat" + }, + { + "id": "qwen-vl-plus", + "name": "Qwen-VL Plus", + "display_name": "Qwen-VL Plus", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 131072, + "output": 8192 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": true, + "open_weights": false, + "knowledge": "2024-04", + "release_date": "2024-01-25", + "last_updated": "2025-08-15", + "type": "chat" + }, + { + "id": "deepseek-v3-2-exp", + "name": "DeepSeek V3.2 Exp", + "display_name": "DeepSeek V3.2 Exp", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 131072, "output": 65536 }, "temperature": true, @@ -318954,16 +317836,15 @@ "supported": false }, "attachment": false, - "open_weights": true, - "knowledge": "2025-04", - "release_date": "2025-07-23", - "last_updated": "2025-07-23", + "open_weights": false, + "release_date": "2025-01-01", + "last_updated": "2025-01-01", "type": "chat" }, { - "id": "MiniMax-M2.5", - "name": "MiniMax-M2.5", - "display_name": "MiniMax-M2.5", + "id": "glm-5", + "name": "GLM-5", + "display_name": "GLM-5", "modalities": { "input": [ "text" @@ -318973,8 +317854,8 @@ ] }, "limit": { - "context": 196608, - "output": 24576 + "context": 202752, + "output": 16384 }, "temperature": true, "tool_call": true, @@ -318994,29 +317875,19 @@ } }, "attachment": false, - "open_weights": true, - "release_date": "2026-02-12", - "last_updated": "2026-02-12", + "open_weights": false, + "release_date": "2026-02-11", + "last_updated": "2026-02-11", "type": "chat" - } - ] - }, - "xiaomi": { - "id": "xiaomi", - "name": "Xiaomi", - "display_name": "Xiaomi", - "api": "https://api.xiaomimimo.com/v1", - "doc": "https://platform.xiaomimimo.com/#/docs", - "models": [ + }, { - "id": "mimo-v2.5", - "name": "MiMo-V2.5", - "display_name": "MiMo-V2.5", + "id": "qwen3.7-plus", + "name": "Qwen3.7 Plus", + "display_name": "Qwen3.7 Plus", "modalities": { "input": [ "text", "image", - "audio", "video" ], "output": [ @@ -319024,8 +317895,8 @@ ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 1000000, + "output": 64000 }, "temperature": true, "tool_call": true, @@ -319035,32 +317906,24 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, "attachment": true, - "open_weights": true, - "knowledge": "2024-12", - "release_date": "2026-04-22", - "last_updated": "2026-04-22", + "open_weights": false, + "knowledge": "2025-04", + "release_date": "2026-06-02", + "last_updated": "2026-06-02", "type": "chat" }, { - "id": "mimo-v2.6-pro", - "name": "MiMo-V2.6-Pro", - "display_name": "MiMo-V2.6-Pro", + "id": "kimi-k3", + "name": "Kimi K3", + "display_name": "Kimi K3", "modalities": { "input": [ "text", - "image", - "audio", - "video" + "image" ], "output": [ "text" @@ -319068,9 +317931,9 @@ }, "limit": { "context": 1048576, - "output": 131072 + "output": 1048576 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -319084,19 +317947,24 @@ "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "effort_options": [ + "low", + "high", + "max" ] } }, "attachment": true, "open_weights": true, - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" }, { - "id": "mimo-v2.6-pro-ultraspeed", - "name": "MiMo-V2.6-Pro-UltraSpeed", - "display_name": "MiMo-V2.6-Pro-UltraSpeed", + "id": "qwen2-5-omni-7b", + "name": "Qwen2.5-Omni 7B", + "display_name": "Qwen2.5-Omni 7B", "modalities": { "input": [ "text", @@ -319105,50 +317973,42 @@ "video" ], "output": [ - "text" + "text", + "audio" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 32768, + "output": 2048 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": true, "open_weights": true, - "release_date": "2026-09-21", - "last_updated": "2026-09-21", + "knowledge": "2024-04", + "release_date": "2024-12", + "last_updated": "2024-12", "type": "chat" }, { - "id": "mimo-v2.5-pro-ultraspeed", - "name": "MiMo-V2.5-Pro-UltraSpeed", - "display_name": "MiMo-V2.5-Pro-UltraSpeed", + "id": "qwen3.8-flash", + "name": "Qwen3.8 Flash", + "display_name": "Qwen3.8 Flash", "modalities": { "input": [ - "text" + "text", + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1048576, + "context": 1000000, "output": 131072 }, "temperature": true, @@ -319160,25 +318020,43 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "budget": { + "min": 0, + "max": 262144, + "unit": "tokens" + }, + "effort": "xhigh", + "effort_options": [ + "none", + "low", + "medium", + "xhigh" + ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" - ] + ], + "notes": [ + "Prefer reasoning_effort; thinking_budget is an alternative, not an additional control.", + "Omitting both controls differs from explicitly selecting xhigh, which maps to 262144 budget tokens." + ], + "budget_exclusive_with_effort": true } }, - "attachment": false, - "open_weights": true, - "knowledge": "2024-12", - "release_date": "2026-06-08", - "last_updated": "2026-06-09", + "attachment": true, + "open_weights": false, + "release_date": "2026-08-26", + "last_updated": "2026-08-26", "type": "chat" }, { - "id": "mimo-v2.5-pro", - "name": "MiMo-V2.5-Pro", - "display_name": "MiMo-V2.5-Pro", + "id": "deepseek-r1-0528", + "name": "DeepSeek R1 0528", + "display_name": "DeepSeek R1 0528", "modalities": { "input": [ "text" @@ -319188,8 +318066,8 @@ ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 131072, + "output": 16384 }, "temperature": true, "tool_call": true, @@ -319209,21 +318087,19 @@ } }, "attachment": false, - "open_weights": true, - "knowledge": "2024-12", - "release_date": "2026-04-22", - "last_updated": "2026-04-22", + "open_weights": false, + "release_date": "2025-05-28", + "last_updated": "2025-05-28", "type": "chat" }, { - "id": "mimo-v2.6-flash", - "name": "MiMo-V2.6-Flash", - "display_name": "MiMo-V2.6-Flash", + "id": "kimi-k2.5", + "name": "Moonshot Kimi K2.5", + "display_name": "Moonshot Kimi K2.5", "modalities": { "input": [ "text", "image", - "audio", "video" ], "output": [ @@ -319231,8 +318107,8 @@ ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 262144, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -319253,38 +318129,28 @@ }, "attachment": true, "open_weights": true, - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "knowledge": "2025-01", + "release_date": "2026-01-27", + "last_updated": "2026-01-27", "type": "chat" - } - ] - }, - "kimi-code-plan-cn": { - "id": "kimi-code-plan-cn", - "name": "Kimi For Coding (kimi.com)", - "display_name": "Kimi For Coding (kimi.com)", - "api": "https://api.kimi.com/coding/v1", - "doc": "https://www.kimi.com/code/docs/en/kimi-code/models.html", - "models": [ + }, { - "id": "k3.1-pro", - "name": "Kimi K3.1 Pro", - "display_name": "Kimi K3.1 Pro", + "id": "qwen3.6-max-preview", + "name": "Qwen3.6 Max Preview", + "display_name": "Qwen3.6 Max Preview", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 245800, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -319298,39 +318164,33 @@ "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "effort_options": [ - "low", - "high", - "max" ] } }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2026-10-23", - "last_updated": "2026-10-23", + "release_date": "2026-04-20", + "last_updated": "2026-04-21", "type": "chat" }, { - "id": "kimi-for-coding", - "name": "Kimi K2.8 Preview", - "display_name": "Kimi K2.8 Preview", + "id": "qwen3-vl-30b-a3b", + "name": "Qwen3-VL 30B-A3B", + "display_name": "Qwen3-VL 30B-A3B", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, + "context": 131072, "output": 32768 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -319344,44 +318204,70 @@ "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "effort_options": [ - "none", - "low", - "high", - "max" ] } }, "attachment": true, + "open_weights": true, + "knowledge": "2025-04", + "release_date": "2025-04", + "last_updated": "2025-04", + "type": "chat" + }, + { + "id": "qwen-plus-character", + "name": "Qwen Plus Character", + "display_name": "Qwen Plus Character", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 32768, + "output": 4096 + }, + "temperature": true, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, "open_weights": false, - "release_date": "2026-09-11", - "last_updated": "2026-09-11", + "knowledge": "2024-04", + "release_date": "2024-01", + "last_updated": "2024-01", "type": "chat" }, { - "id": "k3", - "name": "Kimi K3", - "display_name": "Kimi K3", + "id": "qwq-plus", + "name": "QwQ Plus", + "display_name": "QwQ Plus", "modalities": { "input": [ - "text", - "image", - "video" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 131072, + "output": 8192 }, - "temperature": false, - "tool_call": true, + "temperature": true, + "tool_call": false, "reasoning": { "supported": true, - "default": true + "default": true, + "budget": { + "default": 32768, + "min": 0, + "max": 32768 + } }, "extra_capabilities": { "reasoning": { @@ -319391,127 +318277,98 @@ "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "effort_options": [ - "none", - "low", - "high", - "max" ] } }, - "attachment": true, - "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-16", + "search": { + "supported": true, + "default": false, + "forced_search": false, + "search_strategy": "turbo" + }, + "attachment": false, + "open_weights": false, + "knowledge": "2024-04", + "release_date": "2025-03-05", + "last_updated": "2025-03-05", "type": "chat" }, { - "id": "kimi-for-coding-highspeed", - "name": "Kimi For Coding HighSpeed", - "display_name": "Kimi For Coding HighSpeed", + "id": "qwen-vl-max", + "name": "Qwen-VL Max", + "display_name": "Qwen-VL Max", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 131072, + "output": 8192 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } + "supported": false }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-06-12", - "last_updated": "2026-06-12", + "open_weights": false, + "knowledge": "2024-04", + "release_date": "2024-04-08", + "last_updated": "2025-08-13", "type": "chat" }, { - "id": "k3.1-pro-highspeed", - "name": "Kimi K3.1 Pro Highspeed", - "display_name": "Kimi K3.1 Pro Highspeed", + "id": "qwen-omni-turbo-realtime", + "name": "Qwen-Omni Turbo Realtime", + "display_name": "Qwen-Omni Turbo Realtime", "modalities": { "input": [ "text", "image", - "video" + "audio" ], "output": [ - "text" + "text", + "audio" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 32768, + "output": 2048 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "low", - "high", - "max" - ] - } + "supported": false }, "attachment": true, "open_weights": false, - "release_date": "2026-10-23", - "last_updated": "2026-10-23", - "type": "chat" + "knowledge": "2024-04", + "release_date": "2025-05-08", + "last_updated": "2025-05-08" }, { - "id": "k3-256k", - "name": "Kimi K3-256K", - "display_name": "Kimi K3-256K", + "id": "glm-5.1", + "name": "GLM-5.1", + "display_name": "GLM-5.1", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 131072 + "context": 202752, + "output": 128000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -319525,34 +318382,19 @@ "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "effort_options": [ - "none", - "low", - "high", - "max" ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-16", + "release_date": "2026-04-14", + "last_updated": "2026-04-14", "type": "chat" - } - ] - }, - "fireworks-ai": { - "id": "fireworks-ai", - "name": "Fireworks AI", - "display_name": "Fireworks AI", - "api": "https://api.fireworks.ai/inference/v1/", - "doc": "https://fireworks.ai/docs/", - "models": [ + }, { - "id": "accounts/fireworks/routers/minimax-latest", - "name": "MiniMax Latest", - "display_name": "MiniMax Latest", + "id": "qwen-deep-research", + "name": "Qwen Deep Research", + "display_name": "Qwen Deep Research", "modalities": { "input": [ "text" @@ -319562,41 +318404,25 @@ ] }, "limit": { - "context": 512000, - "output": 512000 + "context": 1000000, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "low", - "medium", - "high" - ] - } + "supported": false }, "attachment": false, - "open_weights": true, - "release_date": "2026-06-01", - "last_updated": "2026-06-01", + "open_weights": false, + "knowledge": "2024-04", + "release_date": "2024-01", + "last_updated": "2024-01", "type": "chat" }, { - "id": "accounts/fireworks/routers/kimi-latest", - "name": "Kimi Latest", - "display_name": "Kimi Latest", + "id": "qwen3-vl-plus", + "name": "Qwen3 VL Plus", + "display_name": "Qwen3 VL Plus", "modalities": { "input": [ "text", @@ -319607,14 +318433,19 @@ ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 262144, + "output": 32768 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false, + "budget": { + "default": 81920, + "min": 0, + "max": 81920 + } }, "extra_capabilities": { "reasoning": { @@ -319624,37 +318455,33 @@ "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "effort_options": [ - "low", - "medium", - "high", - "max" ] } }, - "attachment": true, - "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-16", + "attachment": false, + "open_weights": false, + "knowledge": "2025-04", + "release_date": "2025-09-23", + "last_updated": "2025-09-23", "type": "chat" }, { - "id": "accounts/fireworks/routers/kimi-fast-latest", - "name": "Kimi Fast Latest", - "display_name": "Kimi Fast Latest", + "id": "kimi/kimi-k2.5", + "name": "kimi/kimi-k2.5", + "display_name": "kimi/kimi-k2.5", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 262144, + "output": 262144 }, "temperature": false, "tool_call": true, @@ -319670,37 +318497,31 @@ "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "effort_options": [ - "low", - "medium", - "high", - "max" ] } }, "attachment": true, "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-16", + "knowledge": "2025-01", + "release_date": "2026-01-27", + "last_updated": "2026-01-27", "type": "chat" }, { - "id": "accounts/fireworks/routers/deepseek-v4p1-flash-spot", - "name": "DeepSeek V4.1 Flash Spot", - "display_name": "DeepSeek V4.1 Flash Spot", + "id": "MiniMax/MiniMax-M2.7", + "name": "MiniMax-M2.7", + "display_name": "MiniMax-M2.7", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 204800, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -319716,37 +318537,30 @@ "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "effort_options": [ - "low", - "high", - "max" ] } }, - "attachment": true, + "attachment": false, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-09-10", - "last_updated": "2026-09-10", + "release_date": "2026-03-18", + "last_updated": "2026-03-18", "type": "chat" }, { - "id": "accounts/fireworks/routers/qwen-max-latest", - "name": "Qwen Max Latest (Qwen3.8 Max)", - "display_name": "Qwen Max Latest (Qwen3.8 Max)", + "id": "siliconflow/deepseek-v3.1-terminus", + "name": "siliconflow/deepseek-v3.1-terminus", + "display_name": "siliconflow/deepseek-v3.1-terminus", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 131072 + "context": 163840, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -319754,16 +318568,16 @@ "supported": true, "default": true }, - "attachment": true, + "attachment": false, "open_weights": false, - "release_date": "2026-08-03", - "last_updated": "2026-08-03", + "release_date": "2025-09-29", + "last_updated": "2025-11-25", "type": "chat" }, { - "id": "accounts/fireworks/routers/glm-latest", - "name": "GLM Latest", - "display_name": "GLM Latest", + "id": "siliconflow/deepseek-v3-0324", + "name": "siliconflow/deepseek-v3-0324", + "display_name": "siliconflow/deepseek-v3-0324", "modalities": { "input": [ "text" @@ -319773,8 +318587,35 @@ ] }, "limit": { - "context": 1048573, - "output": 262144 + "context": 163840, + "output": 163840 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": false, + "open_weights": false, + "release_date": "2024-12-26", + "last_updated": "2025-11-25", + "type": "chat" + }, + { + "id": "siliconflow/deepseek-v3.2", + "name": "siliconflow/deepseek-v3.2", + "display_name": "siliconflow/deepseek-v3.2", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 163840, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -319784,42 +318625,30 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "low", - "high", - "max" - ] + "supported": true } }, "attachment": false, - "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", + "open_weights": false, + "release_date": "2025-12-03", + "last_updated": "2025-12-03", "type": "chat" }, { - "id": "accounts/fireworks/routers/deepseek-v4p1-flash-1017-spot", - "name": "DeepSeek V4.1 Flash 1017 Spot", - "display_name": "DeepSeek V4.1 Flash 1017 Spot", + "id": "siliconflow/deepseek-r1-0528", + "name": "siliconflow/deepseek-r1-0528", + "display_name": "siliconflow/deepseek-r1-0528", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 163840, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -319835,25 +318664,43 @@ "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "effort_options": [ - "low", - "high", - "max" ] } }, - "attachment": true, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-10-17", - "last_updated": "2026-10-17", + "attachment": false, + "open_weights": false, + "release_date": "2025-05-28", + "last_updated": "2025-11-25", + "type": "chat" + }, + { + "id": "qwen3-coder-plus-2025-09-23", + "name": "Qwen3 Coder Plus 2025 09 23", + "display_name": "Qwen3 Coder Plus 2025 09 23", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1000000, + "output": 65536 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": false + }, + "attachment": false, "type": "chat" }, { - "id": "accounts/fireworks/routers/glm-5p3-spot", - "name": "GLM 5.3 Spot", - "display_name": "GLM 5.3 Spot", + "id": "qwen3-coder-plus-2025-07-22", + "name": "Qwen3 Coder Plus 2025 07 22", + "display_name": "Qwen3 Coder Plus 2025 07 22", "modalities": { "input": [ "text" @@ -319863,85 +318710,77 @@ ] }, "limit": { - "context": 1048573, - "output": 262144 + "context": 1000000, + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "low", - "high", - "max" - ] - } + "supported": false }, "attachment": false, - "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", "type": "chat" }, { - "id": "accounts/fireworks/routers/glm-fast-latest", - "name": "GLM 5.3 Fast (Latest)", - "display_name": "GLM 5.3 Fast (Latest)", + "id": "qwen-vl-ocr-latest", + "name": "Qwen Vl Ocr Latest", + "display_name": "Qwen Vl Ocr Latest", "modalities": { "input": [ + "text", + "image" + ], + "output": [ "text" + ] + }, + "limit": { + "context": 34096, + "output": 4096 + }, + "temperature": true, + "tool_call": false, + "reasoning": { + "supported": false + }, + "attachment": false, + "type": "chat" + }, + { + "id": "qvq-max-2025-05-15", + "name": "Qvq Max 2025 05 15", + "display_name": "Qvq Max 2025 05 15", + "modalities": { + "input": [ + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048572, - "output": 262144 + "context": 131072, + "output": 8192 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "low", - "high", - "max" - ] + "default": false, + "budget": { + "default": 16384, + "min": 0, + "max": 16384 } }, "attachment": false, - "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", "type": "chat" }, { - "id": "accounts/fireworks/routers/glm-5p3-fast", - "name": "GLM 5.3 Fast", - "display_name": "GLM 5.3 Fast", + "id": "qwen-turbo-latest", + "name": "Qwen Turbo Latest", + "display_name": "Qwen Turbo Latest", "modalities": { "input": [ "text" @@ -319951,14 +318790,19 @@ ] }, "limit": { - "context": 1048572, - "output": 262144 + "context": 131072, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false, + "budget": { + "default": 38912, + "min": 0, + "max": 38912 + } }, "extra_capabilities": { "reasoning": { @@ -319968,73 +318812,49 @@ "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "effort_options": [ - "low", - "high", - "max" ] } }, + "search": { + "supported": true, + "default": false, + "forced_search": false, + "search_strategy": "turbo" + }, "attachment": false, - "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", "type": "chat" }, { - "id": "accounts/fireworks/routers/glm-flash-latest", - "name": "GLM Flash Latest (GLM 5.3 Flash)", - "display_name": "GLM Flash Latest (GLM 5.3 Flash)", + "id": "qwen-turbo-2024-09-19", + "name": "Qwen Turbo 2024 09 19", + "display_name": "Qwen Turbo 2024 09 19", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048573, - "output": 131072 + "context": 131072, + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "low", - "high", - "max" - ] - } + "supported": false }, - "attachment": true, - "open_weights": true, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", + "attachment": false, "type": "chat" }, { - "id": "accounts/fireworks/routers/deepseek-flash-latest", - "name": "DeepSeek Flash Latest", - "display_name": "DeepSeek Flash Latest", + "id": "qwen-flash-2025-07-28", + "name": "Qwen Flash 2025 07 28", + "display_name": "Qwen Flash 2025 07 28", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" @@ -320042,13 +318862,18 @@ }, "limit": { "context": 1000000, - "output": 384000 + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false, + "budget": { + "default": 81920, + "min": 0, + "max": 81920 + } }, "extra_capabilities": { "reasoning": { @@ -320058,43 +318883,44 @@ "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "effort_options": [ - "low", - "high", - "max" ] } }, - "attachment": true, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-10-17", - "last_updated": "2026-10-17", + "search": { + "supported": true, + "default": false, + "forced_search": false, + "search_strategy": "turbo" + }, + "attachment": false, "type": "chat" }, { - "id": "accounts/fireworks/routers/kimi-k3-spot", - "name": "Kimi K3 Spot", - "display_name": "Kimi K3 Spot", + "id": "qwen-plus-latest", + "name": "Qwen Plus Latest", + "display_name": "Qwen Plus Latest", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 1000000, + "output": 32768 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false, + "budget": { + "default": 81920, + "min": 0, + "max": 81920 + } }, "extra_capabilities": { "reasoning": { @@ -320104,89 +318930,68 @@ "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "effort_options": [ - "low", - "medium", - "high", - "max" ] } }, - "attachment": true, - "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-16", + "search": { + "supported": true, + "default": false, + "forced_search": false, + "search_strategy": "turbo" + }, + "attachment": false, "type": "chat" }, { - "id": "accounts/fireworks/routers/kimi-k3-fast", - "name": "Kimi K3 Fast", - "display_name": "Kimi K3 Fast", + "id": "qwen-plus-2024-09-19", + "name": "Qwen Plus 2024 09 19", + "display_name": "Qwen Plus 2024 09 19", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 131072, + "output": 8192 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "low", - "medium", - "high", - "max" - ] - } + "supported": false }, - "attachment": true, - "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-16", + "attachment": false, "type": "chat" }, { - "id": "accounts/fireworks/models/ember-1", - "name": "Ember-1", - "display_name": "Ember-1", + "id": "qwen-plus-2025-07-14", + "name": "Qwen Plus 2025 07 14", + "display_name": "Qwen Plus 2025 07 14", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 131072, + "output": 16384 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false, + "budget": { + "default": 38912, + "min": 0, + "max": 38912 + } }, "extra_capabilities": { "reasoning": { @@ -320196,43 +319001,44 @@ "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "effort_options": [ - "low", - "medium", - "high", - "max" ] } }, - "attachment": true, - "open_weights": false, - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "search": { + "supported": true, + "default": false, + "forced_search": false, + "search_strategy": "turbo" + }, + "attachment": false, "type": "chat" }, { - "id": "accounts/fireworks/models/glm-5p3-flash", - "name": "GLM 5.3 Flash", - "display_name": "GLM 5.3 Flash", + "id": "qwen-plus-2025-09-11", + "name": "Qwen Plus 2025 09 11", + "display_name": "Qwen Plus 2025 09 11", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048573, - "output": 131072 + "context": 1000000, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false, + "budget": { + "default": 81920, + "min": 0, + "max": 81920 + } }, "extra_capabilities": { "reasoning": { @@ -320242,24 +319048,22 @@ "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "effort_options": [ - "low", - "high", - "max" ] } }, - "attachment": true, - "open_weights": true, - "release_date": "2026-08-26", - "last_updated": "2026-08-26", + "search": { + "supported": true, + "default": false, + "forced_search": false, + "search_strategy": "turbo" + }, + "attachment": false, "type": "chat" }, { - "id": "accounts/fireworks/models/nemotron-lightning-3p5-30b-a3b", - "name": "Nemotron 3.5 Lightning 30B A3B", - "display_name": "Nemotron 3.5 Lightning 30B A3B", + "id": "qwen-max-latest", + "name": "Qwen Max Latest", + "display_name": "Qwen Max Latest", "modalities": { "input": [ "text" @@ -320269,251 +319073,165 @@ ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 131072, + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { + "supported": false + }, + "search": { "supported": true, - "default": true + "default": false, + "forced_search": false, + "search_strategy": "turbo" }, "attachment": false, - "open_weights": true, - "knowledge": "2025-09", - "release_date": "2026-08-11", - "last_updated": "2026-08-11", "type": "chat" }, { - "id": "accounts/fireworks/models/deepseek-v4p1-flash", - "name": "DeepSeek V4.1 Flash", - "display_name": "DeepSeek V4.1 Flash", + "id": "qwen-max-2024-09-19", + "name": "Qwen Max 2024 09 19", + "display_name": "Qwen Max 2024 09 19", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 32768, + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "low", - "high", - "max" - ] - } + "search": { + "supported": true, + "default": false, + "forced_search": false, + "search_strategy": "turbo" }, - "attachment": true, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-09-10", - "last_updated": "2026-09-10", + "attachment": false, "type": "chat" }, { - "id": "accounts/fireworks/models/minimax-m3p1-flash", - "name": "MiniMax-M3.1-Flash", - "display_name": "MiniMax-M3.1-Flash", + "id": "qwen-max-2024-04-28", + "name": "Qwen Max 2024 04 28", + "display_name": "Qwen Max 2024 04 28", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 512000 + "context": 8000, + "output": 2000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "low", - "medium", - "high", - "xhigh", - "max" - ] - } + "supported": false }, - "attachment": true, - "open_weights": false, - "release_date": "2026-10-19", - "last_updated": "2026-10-19", + "attachment": false, "type": "chat" }, { - "id": "accounts/fireworks/models/deepseek-v4p1-flash-1017", - "name": "DeepSeek V4.1 Flash 1017", - "display_name": "DeepSeek V4.1 Flash 1017", + "id": "qwen-max-2024-04-03", + "name": "Qwen Max 2024 04 03", + "display_name": "Qwen Max 2024 04 03", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 384000 + "context": 8000, + "output": 2000 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "low", - "high", - "max" - ] - } + "supported": false }, - "attachment": true, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-10-17", - "last_updated": "2026-10-17", + "attachment": false, "type": "chat" }, { - "id": "accounts/fireworks/models/muse-spark-open", - "name": "Muse Spark Open", - "display_name": "Muse Spark Open", + "id": "qwen-max-2025-01-25", + "name": "Qwen Max 2025 01 25", + "display_name": "Qwen Max 2025 01 25", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 131072, + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "xhigh" - ] - } + "search": { + "supported": true, + "default": false, + "forced_search": false, + "search_strategy": "turbo" }, - "attachment": true, - "open_weights": true, - "knowledge": "2026-01-04", - "release_date": "2026-10-15", - "last_updated": "2026-10-15", + "attachment": false, "type": "chat" }, { - "id": "accounts/fireworks/models/kimi-k3", - "name": "Kimi K3", - "display_name": "Kimi K3", + "id": "qwen3-max-2025-09-23", + "name": "Qwen3 Max 20250923", + "display_name": "Qwen3 Max 20250923", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 131072 + "context": 262144, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "low", - "medium", - "high", - "max" - ] - } + "search": { + "supported": true, + "default": false, + "forced_search": false, + "search_strategy": "turbo" }, - "attachment": true, - "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-16", + "attachment": false, "type": "chat" }, { - "id": "accounts/fireworks/models/qwen3p8-2p4t-a95b", - "name": "Qwen3.8 2.4T A95B", - "display_name": "Qwen3.8 2.4T A95B", + "id": "qwen3-max-preview", + "name": "Qwen3 Max Preview", + "display_name": "Qwen3 Max Preview", "modalities": { "input": [ "text" @@ -320524,13 +319242,12 @@ }, "limit": { "context": 262144, - "output": 131072 + "output": 65536 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": true }, "extra_capabilities": { "reasoning": { @@ -320540,24 +319257,22 @@ "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "effort_options": [ - "low", - "medium", - "xhigh" ] } }, + "search": { + "supported": true, + "default": false, + "forced_search": false, + "search_strategy": "turbo" + }, "attachment": false, - "open_weights": true, - "release_date": "2026-08-12", - "last_updated": "2026-08-12", "type": "chat" }, { - "id": "accounts/fireworks/models/gpt-oss-120b", - "name": "GPT OSS 120B", - "display_name": "GPT OSS 120B", + "id": "qwen3-235b-a22b-thinking-2507", + "name": "Qwen3 235B A22B Thinking 2507", + "display_name": "Qwen3 235B A22B Thinking 2507", "modalities": { "input": [ "text" @@ -320571,90 +319286,82 @@ "output": 32768 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, - "default": true + "default": true, + "budget": { + "default": 81920, + "min": 0, + "max": 81920 + } }, "extra_capabilities": { "reasoning": { "supported": true, - "effort_options": [ - "low", - "medium", - "high" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, "attachment": false, - "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", "type": "chat" }, { - "id": "accounts/fireworks/models/inkling", - "name": "Inkling", - "display_name": "Inkling", + "id": "qwen3-235b-a22b-instruct-2507", + "name": "Qwen3 235B A22B Instruct 2507", + "display_name": "Qwen3 235B A22B Instruct 2507", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 1048576 + "context": 131072, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": true, - "open_weights": true, - "release_date": "2026-07-15", - "last_updated": "2026-07-15", + "attachment": false, "type": "chat" }, { - "id": "accounts/fireworks/models/qwen3p8-max", - "name": "Qwen3.8 Max", - "display_name": "Qwen3.8 Max", + "id": "qwen3-30b-a3b-instruct-2507", + "name": "Qwen3 30B A3B Instruct 2507", + "display_name": "Qwen3 30B A3B Instruct 2507", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 131072 + "context": 131072, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "attachment": true, - "open_weights": false, - "release_date": "2026-08-03", - "last_updated": "2026-08-03", + "attachment": false, "type": "chat" }, { - "id": "accounts/fireworks/models/minimax-m3", - "name": "MiniMax-M3", - "display_name": "MiniMax-M3", + "id": "qwen3-30b-a3b-thinking-2507", + "name": "Qwen3 30B A3B Thinking 2507", + "display_name": "Qwen3 30B A3B Thinking 2507", "modalities": { "input": [ "text" @@ -320664,14 +319371,19 @@ ] }, "limit": { - "context": 512000, - "output": 512000 + "context": 131072, + "output": 32768 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { "supported": true, - "default": true + "default": true, + "budget": { + "default": 81920, + "min": 0, + "max": 81920 + } }, "extra_capabilities": { "reasoning": { @@ -320681,24 +319393,16 @@ "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "effort_options": [ - "low", - "medium", - "high" ] } }, "attachment": false, - "open_weights": true, - "release_date": "2026-06-01", - "last_updated": "2026-06-01", "type": "chat" }, { - "id": "accounts/fireworks/models/nemotron-3-ultra-nvfp4", - "name": "Nemotron 3 Ultra 550B A55B", - "display_name": "Nemotron 3 Ultra 550B A55B", + "id": "qwen3-30b-a3b", + "name": "Qwen3 30B A3B", + "display_name": "Qwen3 30B A3B", "modalities": { "input": [ "text" @@ -320708,26 +319412,38 @@ ] }, "limit": { - "context": 262144, - "output": 128000 + "context": 131072, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false, + "budget": { + "default": 81920, + "min": 0, + "max": 81920 + } + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, - "open_weights": true, - "knowledge": "2025-09", - "release_date": "2026-06-04", - "last_updated": "2026-06-04", "type": "chat" }, { - "id": "accounts/fireworks/models/glm-5p3", - "name": "GLM 5.3", - "display_name": "GLM 5.3", + "id": "qwen3-4b", + "name": "Qwen3 4B", + "display_name": "Qwen3 4B", "modalities": { "input": [ "text" @@ -320737,14 +319453,19 @@ ] }, "limit": { - "context": 1048573, - "output": 262144 + "context": 131072, + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": true, + "budget": { + "default": 38912, + "min": 0, + "max": 38912 + } }, "extra_capabilities": { "reasoning": { @@ -320754,32 +319475,16 @@ "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "effort_options": [ - "low", - "high", - "max" ] } }, "attachment": false, - "open_weights": true, - "release_date": "2026-08-14", - "last_updated": "2026-08-14", "type": "chat" - } - ] - }, - "watsonx": { - "id": "watsonx", - "name": "watsonx.ai", - "display_name": "watsonx.ai", - "doc": "https://www.ibm.com/docs/en/watsonx/saas?topic=solutions-supported-foundation-models", - "models": [ + }, { - "id": "openai/gpt-oss-120b", - "name": "GPT OSS 120B", - "display_name": "GPT OSS 120B", + "id": "qwen3-1.7b", + "name": "Qwen3 1.7B", + "display_name": "Qwen3 1.7B", "modalities": { "input": [ "text" @@ -320789,36 +319494,38 @@ ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 32768, + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": true, + "budget": { + "default": 30720, + "min": 0, + "max": 30720 + } }, "extra_capabilities": { "reasoning": { "supported": true, - "effort_options": [ - "low", - "medium", - "high" + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" ] } }, "attachment": false, - "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-08-05", - "last_updated": "2025-08-05", "type": "chat" }, { - "id": "ibm/granite-4-h-small", - "name": "Granite-4.0-H-Small", - "display_name": "Granite-4.0-H-Small", + "id": "qwen3-0.6b", + "name": "Qwen3 0.6B", + "display_name": "Qwen3 0.6B", "modalities": { "input": [ "text" @@ -320828,24 +319535,38 @@ ] }, "limit": { - "context": 131072, - "output": 131072 + "context": 32768, + "output": 8192 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true, + "budget": { + "default": 30720, + "min": 0, + "max": 30720 + } + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, - "open_weights": true, - "release_date": "2025-10-02", - "last_updated": "2025-10-02", "type": "chat" }, { - "id": "mistralai/mistral-small-3-1-24b-instruct-2503", - "name": "Mistral Small 3.1 24B", - "display_name": "Mistral Small 3.1 24B", + "id": "qwen3-vl-plus-2025-09-23", + "name": "Qwen3 VL Plus 2025 09 23", + "display_name": "Qwen3 VL Plus 2025 09 23", "modalities": { "input": [ "text", @@ -320856,57 +319577,41 @@ ] }, "limit": { - "context": 131072, - "output": 16384 + "context": 262144, + "output": 32768 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": false - }, - "attachment": true, - "open_weights": true, - "knowledge": "2024-06", - "release_date": "2025-03-17", - "last_updated": "2025-03-17", - "type": "chat" - }, - { - "id": "meta-llama/llama-3-3-70b-instruct", - "name": "Llama-3.3-70B-Instruct", - "display_name": "Llama-3.3-70B-Instruct", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 131072, - "output": 4096 + "supported": true, + "default": false, + "budget": { + "default": 81920, + "min": 0, + "max": 81920 + } }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } }, "attachment": false, - "open_weights": true, - "knowledge": "2023-12", - "release_date": "2024-12-06", - "last_updated": "2024-12-06", "type": "chat" }, { - "id": "meta-llama/llama-4-maverick-17b-128e-instruct-fp8", - "name": "Llama 4 Maverick 17B 128E Instruct FP8", - "display_name": "Llama 4 Maverick 17B 128E Instruct FP8", + "id": "qwq-plus-latest", + "name": "QwQ Plus Latest", + "display_name": "QwQ Plus Latest", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" @@ -320917,15 +319622,31 @@ "output": 8192 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { + "supported": true, + "default": true, + "budget": { + "default": 32768, + "min": 0, + "max": 32768 + } + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "search": { "supported": false }, - "attachment": true, - "open_weights": true, - "knowledge": "2024-08", - "release_date": "2025-04-05", - "last_updated": "2025-04-05", + "attachment": false, "type": "chat" } ] @@ -320938,21 +319659,20 @@ "doc": "https://www.kimi.com/code/docs/en/kimi-code/models.html", "models": [ { - "id": "k3.1-pro", - "name": "Kimi K3.1 Pro", - "display_name": "Kimi K3.1 Pro", + "id": "k3-256k", + "name": "Kimi K3-256K", + "display_name": "Kimi K3-256K", "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1048576, + "context": 262144, "output": 131072 }, "temperature": false, @@ -320971,6 +319691,7 @@ "thinking_blocks" ], "effort_options": [ + "none", "low", "high", "max" @@ -320978,15 +319699,15 @@ } }, "attachment": true, - "open_weights": false, - "release_date": "2026-10-23", - "last_updated": "2026-10-23", + "open_weights": true, + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" }, { - "id": "kimi-for-coding", - "name": "Kimi K2.8 Preview", - "display_name": "Kimi K2.8 Preview", + "id": "kimi-for-coding-highspeed", + "name": "Kimi For Coding HighSpeed", + "display_name": "Kimi For Coding HighSpeed", "modalities": { "input": [ "text", @@ -320998,7 +319719,7 @@ ] }, "limit": { - "context": 1048576, + "context": 262144, "output": 32768 }, "temperature": false, @@ -321015,25 +319736,20 @@ "visibility": "summary", "continuation": [ "thinking_blocks" - ], - "effort_options": [ - "none", - "low", - "high", - "max" ] } }, "attachment": true, - "open_weights": false, - "release_date": "2026-09-11", - "last_updated": "2026-09-11", + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-06-12", + "last_updated": "2026-06-12", "type": "chat" }, { - "id": "k3", - "name": "Kimi K3", - "display_name": "Kimi K3", + "id": "k3.1-pro-highspeed", + "name": "Kimi K3.1 Pro Highspeed", + "display_name": "Kimi K3.1 Pro Highspeed", "modalities": { "input": [ "text", @@ -321064,7 +319780,6 @@ "thinking_blocks" ], "effort_options": [ - "none", "low", "high", "max" @@ -321072,15 +319787,15 @@ } }, "attachment": true, - "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-16", + "open_weights": false, + "release_date": "2026-10-23", + "last_updated": "2026-10-23", "type": "chat" }, { - "id": "kimi-for-coding-highspeed", - "name": "Kimi For Coding HighSpeed", - "display_name": "Kimi For Coding HighSpeed", + "id": "kimi-for-coding", + "name": "Kimi K2.8 Preview", + "display_name": "Kimi K2.8 Preview", "modalities": { "input": [ "text", @@ -321092,7 +319807,7 @@ ] }, "limit": { - "context": 262144, + "context": 1048576, "output": 32768 }, "temperature": false, @@ -321109,20 +319824,25 @@ "visibility": "summary", "continuation": [ "thinking_blocks" + ], + "effort_options": [ + "none", + "low", + "high", + "max" ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-06-12", - "last_updated": "2026-06-12", + "open_weights": false, + "release_date": "2026-09-11", + "last_updated": "2026-09-11", "type": "chat" }, { - "id": "k3.1-pro-highspeed", - "name": "Kimi K3.1 Pro Highspeed", - "display_name": "Kimi K3.1 Pro Highspeed", + "id": "k3", + "name": "Kimi K3", + "display_name": "Kimi K3", "modalities": { "input": [ "text", @@ -321153,6 +319873,7 @@ "thinking_blocks" ], "effort_options": [ + "none", "low", "high", "max" @@ -321160,26 +319881,27 @@ } }, "attachment": true, - "open_weights": false, - "release_date": "2026-10-23", - "last_updated": "2026-10-23", + "open_weights": true, + "release_date": "2026-07-16", + "last_updated": "2026-07-16", "type": "chat" }, { - "id": "k3-256k", - "name": "Kimi K3-256K", - "display_name": "Kimi K3-256K", + "id": "k3.1-pro", + "name": "Kimi K3.1 Pro", + "display_name": "Kimi K3.1 Pro", "modalities": { "input": [ "text", - "image" + "image", + "video" ], "output": [ "text" ] }, "limit": { - "context": 262144, + "context": 1048576, "output": 131072 }, "temperature": false, @@ -321198,7 +319920,6 @@ "thinking_blocks" ], "effort_options": [ - "none", "low", "high", "max" @@ -321206,9 +319927,9 @@ } }, "attachment": true, - "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-07-16", + "open_weights": false, + "release_date": "2026-10-23", + "last_updated": "2026-10-23", "type": "chat" }, { @@ -336239,9 +334960,120 @@ "type": "chat" }, { - "id": "mistral-large-4", - "name": "Mistral Large 4", - "display_name": "Mistral Large 4", + "id": "glm-5.2", + "name": "GLM-5.2", + "display_name": "GLM-5.2", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 976000, + "output": 131072 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "effort_options": [ + "high", + "max" + ] + } + }, + "attachment": false, + "open_weights": true, + "release_date": "2026-06-13", + "last_updated": "2026-06-13", + "type": "chat" + }, + { + "id": "nemotron-3-ultra", + "name": "nemotron-3-ultra", + "display_name": "nemotron-3-ultra", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 262144, + "output": 128000 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "attachment": false, + "open_weights": true, + "knowledge": "2025-09", + "release_date": "2026-06-04", + "last_updated": "2026-06-04", + "type": "chat" + }, + { + "id": "minimax-m2.7", + "name": "minimax-m2.7", + "display_name": "minimax-m2.7", + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 196608, + "output": 196608 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": false, + "open_weights": true, + "release_date": "2026-03-18", + "last_updated": "2026-03-18", + "type": "chat" + }, + { + "id": "deepseek-v4.1-flash", + "name": "DeepSeek V4.1 Flash", + "display_name": "DeepSeek V4.1 Flash", "modalities": { "input": [ "text", @@ -336253,7 +335085,7 @@ }, "limit": { "context": 1048576, - "output": 262144 + "output": 384000 }, "temperature": true, "tool_call": true, @@ -336263,25 +335095,35 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ - "none", - "high" + "low", + "high", + "max" ] } }, "attachment": true, - "open_weights": false, - "release_date": "2026-10-06", - "last_updated": "2026-10-06", + "open_weights": true, + "knowledge": "2025-05", + "release_date": "2026-09-10", + "last_updated": "2026-09-10", "type": "chat" }, { - "id": "deepseek-v4-pro:0813", - "name": "DeepSeek V4 Pro 0813", - "display_name": "DeepSeek V4 Pro 0813", + "id": "deepseek-v4.1-flash:1017", + "name": "DeepSeek V4.1 Flash 1017", + "display_name": "DeepSeek V4.1 Flash 1017", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" @@ -336289,7 +335131,7 @@ }, "limit": { "context": 1048576, - "output": 1048576 + "output": 384000 }, "temperature": true, "tool_call": true, @@ -336299,6 +335141,13 @@ }, "extra_capabilities": { "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], "effort_options": [ "low", "high", @@ -336306,10 +335155,11 @@ ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-08-13", - "last_updated": "2026-08-22", + "knowledge": "2025-05", + "release_date": "2026-10-17", + "last_updated": "2026-10-17", "type": "chat" }, { @@ -336348,9 +335198,9 @@ "type": "chat" }, { - "id": "deepseek-v4-pro", - "name": "deepseek-v4-pro", - "display_name": "deepseek-v4-pro", + "id": "deepseek-v4-pro:0813", + "name": "DeepSeek V4 Pro 0813", + "display_name": "DeepSeek V4 Pro 0813", "modalities": { "input": [ "text" @@ -336371,31 +335221,171 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", "effort_options": [ "low", "high", "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, "attachment": false, "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-04-24", - "last_updated": "2026-04-24", + "release_date": "2026-08-13", + "last_updated": "2026-08-22", + "type": "chat" + }, + { + "id": "muse-spark-open", + "name": "Muse Spark Open", + "display_name": "Muse Spark Open", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1048576, + "output": 131072 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "low", + "medium", + "high", + "max" + ] + } + }, + "attachment": true, + "open_weights": true, + "knowledge": "2026-01-04", + "release_date": "2026-10-15", + "last_updated": "2026-10-15", + "type": "chat" + }, + { + "id": "mistral-large-4", + "name": "Mistral Large 4", + "display_name": "Mistral Large 4", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1048576, + "output": 262144 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "effort_options": [ + "none", + "high" + ] + } + }, + "attachment": true, + "open_weights": false, + "release_date": "2026-10-06", + "last_updated": "2026-10-06", + "type": "chat" + }, + { + "id": "kimi-k2.6", + "name": "kimi-k2.6", + "display_name": "kimi-k2.6", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 262144, + "output": 262144 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "attachment": true, + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-04-20", + "last_updated": "2026-04-20", + "type": "chat" + }, + { + "id": "minimax-m3", + "name": "minimax-m3", + "display_name": "minimax-m3", + "modalities": { + "input": [ + "text", + "image", + "video" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 512000, + "output": 131072 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "low", + "medium", + "high", + "max" + ] + } + }, + "attachment": true, + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-06-01", + "last_updated": "2026-06-01", "type": "chat" }, { @@ -336468,81 +335458,6 @@ "last_updated": "2025-12-02", "type": "chat" }, - { - "id": "muse-spark-open", - "name": "Muse Spark Open", - "display_name": "Muse Spark Open", - "modalities": { - "input": [ - "text", - "image" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 1048576, - "output": 131072 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "effort_options": [ - "low", - "medium", - "high", - "max" - ] - } - }, - "attachment": true, - "open_weights": true, - "knowledge": "2026-01-04", - "release_date": "2026-10-15", - "last_updated": "2026-10-15", - "type": "chat" - }, - { - "id": "kimi-k2.6", - "name": "kimi-k2.6", - "display_name": "kimi-k2.6", - "modalities": { - "input": [ - "text", - "image" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 262144, - "output": 262144 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, - "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-20", - "last_updated": "2026-04-20", - "type": "chat" - }, { "id": "beam", "name": "Beam 1.0 501B A23B", @@ -336584,9 +335499,9 @@ "type": "chat" }, { - "id": "glm-5.2", - "name": "GLM-5.2", - "display_name": "GLM-5.2", + "id": "deepseek-v4-pro", + "name": "deepseek-v4-pro", + "display_name": "deepseek-v4-pro", "modalities": { "input": [ "text" @@ -336595,129 +335510,9 @@ "text" ] }, - "limit": { - "context": 976000, - "output": 131072 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "high", - "max" - ] - } - }, - "attachment": false, - "open_weights": true, - "release_date": "2026-06-13", - "last_updated": "2026-06-13", - "type": "chat" - }, - { - "id": "deepseek-v4.1-flash", - "name": "DeepSeek V4.1 Flash", - "display_name": "DeepSeek V4.1 Flash", - "modalities": { - "input": [ - "text", - "image" - ], - "output": [ - "text" - ] - }, "limit": { "context": 1048576, - "output": 384000 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "effort_options": [ - "low", - "high", - "max" - ] - } - }, - "attachment": true, - "open_weights": true, - "knowledge": "2025-05", - "release_date": "2026-09-10", - "last_updated": "2026-09-10", - "type": "chat" - }, - { - "id": "nemotron-3-ultra", - "name": "nemotron-3-ultra", - "display_name": "nemotron-3-ultra", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 262144, - "output": 128000 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "attachment": false, - "open_weights": true, - "knowledge": "2025-09", - "release_date": "2026-06-04", - "last_updated": "2026-06-04", - "type": "chat" - }, - { - "id": "minimax-m3", - "name": "minimax-m3", - "display_name": "minimax-m3", - "modalities": { - "input": [ - "text", - "image", - "video" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 512000, - "output": 131072 + "output": 1048576 }, "temperature": true, "tool_call": true, @@ -336728,104 +335523,30 @@ "extra_capabilities": { "reasoning": { "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", "effort_options": [ "low", - "medium", "high", "max" - ] - } - }, - "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-06-01", - "last_updated": "2026-06-01", - "type": "chat" - }, - { - "id": "minimax-m2.7", - "name": "minimax-m2.7", - "display_name": "minimax-m2.7", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 196608, - "output": 196608 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, - "attachment": false, - "open_weights": true, - "release_date": "2026-03-18", - "last_updated": "2026-03-18", - "type": "chat" - }, - { - "id": "deepseek-v4.1-flash:1017", - "name": "DeepSeek V4.1 Flash 1017", - "display_name": "DeepSeek V4.1 Flash 1017", - "modalities": { - "input": [ - "text", - "image" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 1048576, - "output": 384000 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, + ], "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ "thinking_blocks" ], - "effort_options": [ - "low", - "high", - "max" + "notes": [ + "The DeepSeek API maps medium and xhigh to high for V4 models; effort_options lists distinct model-effective levels." ] } }, - "attachment": true, + "attachment": false, "open_weights": true, "knowledge": "2025-05", - "release_date": "2026-10-17", - "last_updated": "2026-10-17", + "release_date": "2026-04-24", + "last_updated": "2026-04-24", "type": "chat" } ] @@ -340567,7 +339288,7 @@ "default": true }, "attachment": true, - "last_updated": "2026-10-24T11:43:57Z", + "last_updated": "2026-10-29T03:22:19Z", "type": "chat" }, { @@ -340593,7 +339314,7 @@ "default": true }, "attachment": true, - "last_updated": "2026-10-24T11:43:57Z", + "last_updated": "2026-10-29T03:22:19Z", "type": "chat" }, { @@ -340619,7 +339340,7 @@ "default": true }, "attachment": true, - "last_updated": "2026-10-24T11:43:57Z", + "last_updated": "2026-10-29T03:22:19Z", "type": "chat" }, { @@ -340644,7 +339365,7 @@ "default": true }, "attachment": false, - "last_updated": "2026-10-24T11:43:57Z", + "last_updated": "2026-10-29T03:22:19Z", "type": "chat" }, { @@ -340669,7 +339390,7 @@ "default": true }, "attachment": false, - "last_updated": "2026-10-24T11:43:57Z", + "last_updated": "2026-10-29T03:22:19Z", "type": "chat" }, { @@ -340694,7 +339415,7 @@ "default": true }, "attachment": false, - "last_updated": "2026-10-24T11:43:57Z", + "last_updated": "2026-10-29T03:22:19Z", "type": "chat" }, { @@ -340719,7 +339440,7 @@ "supported": false }, "attachment": true, - "last_updated": "2026-10-24T11:43:57Z", + "last_updated": "2026-10-29T03:22:19Z", "type": "embedding" }, { @@ -340744,7 +339465,7 @@ "supported": false }, "attachment": true, - "last_updated": "2026-10-24T11:43:57Z", + "last_updated": "2026-10-29T03:22:19Z", "type": "embedding" }, { @@ -340770,7 +339491,7 @@ "default": true }, "attachment": true, - "last_updated": "2026-10-24T11:43:57Z", + "last_updated": "2026-10-29T03:22:19Z", "type": "chat" }, { @@ -340796,7 +339517,7 @@ "default": true }, "attachment": true, - "last_updated": "2026-10-24T11:43:57Z", + "last_updated": "2026-10-29T03:22:19Z", "type": "chat" }, { @@ -340822,7 +339543,7 @@ "default": true }, "attachment": true, - "last_updated": "2026-10-24T11:43:57Z", + "last_updated": "2026-10-29T03:22:19Z", "type": "chat" }, { @@ -340848,7 +339569,7 @@ "default": true }, "attachment": true, - "last_updated": "2026-10-24T11:43:57Z", + "last_updated": "2026-10-29T03:22:19Z", "type": "chat" }, { @@ -340874,7 +339595,7 @@ "default": true }, "attachment": true, - "last_updated": "2026-10-24T11:43:57Z", + "last_updated": "2026-10-29T03:22:19Z", "type": "chat" }, { @@ -340900,7 +339621,7 @@ "default": true }, "attachment": true, - "last_updated": "2026-10-24T11:43:57Z", + "last_updated": "2026-10-29T03:22:19Z", "type": "chat" }, { @@ -340926,7 +339647,7 @@ "default": true }, "attachment": true, - "last_updated": "2026-10-24T11:43:57Z", + "last_updated": "2026-10-29T03:22:19Z", "type": "chat" }, { @@ -340952,7 +339673,7 @@ "default": true }, "attachment": true, - "last_updated": "2026-10-24T11:43:57Z", + "last_updated": "2026-10-29T03:22:19Z", "type": "chat" }, { @@ -340978,7 +339699,7 @@ "default": true }, "attachment": true, - "last_updated": "2026-10-24T11:43:57Z", + "last_updated": "2026-10-29T03:22:19Z", "type": "chat" }, { @@ -341004,7 +339725,7 @@ "default": true }, "attachment": true, - "last_updated": "2026-10-24T11:43:57Z", + "last_updated": "2026-10-29T03:22:19Z", "type": "chat" }, { @@ -341028,7 +339749,7 @@ "supported": false }, "attachment": false, - "last_updated": "2026-10-24T11:43:57Z", + "last_updated": "2026-10-29T03:22:19Z", "type": "chat" }, { @@ -341054,7 +339775,7 @@ "default": true }, "attachment": true, - "last_updated": "2026-10-24T11:43:57Z", + "last_updated": "2026-10-29T03:22:19Z", "type": "chat" }, { @@ -341080,7 +339801,7 @@ "default": true }, "attachment": true, - "last_updated": "2026-10-24T11:43:57Z", + "last_updated": "2026-10-29T03:22:19Z", "type": "chat" }, { @@ -341104,7 +339825,7 @@ "supported": false }, "attachment": false, - "last_updated": "2026-10-24T11:43:57Z", + "last_updated": "2026-10-29T03:22:19Z", "type": "chat" }, { @@ -341124,7 +339845,7 @@ "supported": false }, "attachment": false, - "last_updated": "2026-10-24T11:43:57Z" + "last_updated": "2026-10-29T03:22:19Z" }, { "id": "doubao-seedance-1-0-pro-fast-251015", @@ -341143,7 +339864,7 @@ "supported": false }, "attachment": false, - "last_updated": "2026-10-24T11:43:57Z" + "last_updated": "2026-10-29T03:22:19Z" }, { "id": "doubao-seedance-2-0-260128", @@ -341163,7 +339884,7 @@ "supported": false }, "attachment": true, - "last_updated": "2026-10-24T11:43:57Z" + "last_updated": "2026-10-29T03:22:19Z" }, { "id": "doubao-seedance-2-0-fast-260128", @@ -341183,7 +339904,7 @@ "supported": false }, "attachment": true, - "last_updated": "2026-10-24T11:43:57Z" + "last_updated": "2026-10-29T03:22:19Z" }, { "id": "doubao-seedance-2-0-mini-260615", @@ -341203,7 +339924,7 @@ "supported": false }, "attachment": true, - "last_updated": "2026-10-24T11:43:57Z" + "last_updated": "2026-10-29T03:22:19Z" }, { "id": "doubao-seedance-2-5-260628", @@ -341223,7 +339944,7 @@ "supported": false }, "attachment": true, - "last_updated": "2026-10-24T11:43:57Z" + "last_updated": "2026-10-29T03:22:19Z" }, { "id": "doubao-seedream-4-0-250828", @@ -341243,7 +339964,7 @@ "supported": false }, "attachment": true, - "last_updated": "2026-10-24T11:43:57Z", + "last_updated": "2026-10-29T03:22:19Z", "type": "imageGeneration" }, { @@ -341264,7 +339985,7 @@ "supported": false }, "attachment": true, - "last_updated": "2026-10-24T11:43:57Z", + "last_updated": "2026-10-29T03:22:19Z", "type": "imageGeneration" }, { @@ -341285,7 +340006,7 @@ "supported": false }, "attachment": true, - "last_updated": "2026-10-24T11:43:57Z", + "last_updated": "2026-10-29T03:22:19Z", "type": "imageGeneration" }, { @@ -341306,7 +340027,7 @@ "supported": false }, "attachment": true, - "last_updated": "2026-10-24T11:43:57Z", + "last_updated": "2026-10-29T03:22:19Z", "type": "imageGeneration" }, { @@ -341327,7 +340048,7 @@ "supported": false }, "attachment": true, - "last_updated": "2026-10-24T11:43:57Z", + "last_updated": "2026-10-29T03:22:19Z", "type": "imageGeneration" }, { @@ -341352,7 +340073,7 @@ "default": true }, "attachment": false, - "last_updated": "2026-10-24T11:43:57Z", + "last_updated": "2026-10-29T03:22:19Z", "type": "chat" }, { @@ -341378,7 +340099,7 @@ "default": true }, "attachment": true, - "last_updated": "2026-10-24T11:43:57Z", + "last_updated": "2026-10-29T03:22:19Z", "type": "chat" }, { @@ -341404,7 +340125,33 @@ "default": true }, "attachment": true, - "last_updated": "2026-10-24T11:43:57Z", + "last_updated": "2026-10-29T03:22:19Z", + "type": "chat" + }, + { + "id": "LTS", + "name": "LTS", + "display_name": "LTS", + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 256000, + "output": 128000 + }, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "attachment": true, + "last_updated": "2026-10-29T03:22:19Z", "type": "chat" } ] @@ -342886,6 +341633,57 @@ "last_updated": "2025-10-15", "type": "chat" }, + { + "id": "claude-haiku-5-5", + "name": "Claude Haiku 5.5", + "display_name": "Claude Haiku 5.5", + "modalities": { + "input": [ + "text", + "image", + "pdf" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1000000, + "output": 128000 + }, + "temperature": false, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2026-06", + "release_date": "2026-10-07", + "last_updated": "2026-10-07", + "type": "chat" + }, { "id": "claude-opus-5", "name": "Claude Opus 5", @@ -343020,13 +341818,65 @@ "last_updated": "2026-06-30", "type": "chat" }, + { + "id": "claude-sonnet-5-5", + "name": "Claude Sonnet 5.5", + "display_name": "Claude Sonnet 5.5", + "modalities": { + "input": [ + "text", + "image", + "pdf" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1000000, + "output": 128000 + }, + "temperature": false, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2026-06", + "release_date": "2026-09-28", + "last_updated": "2026-09-28", + "type": "chat" + }, { "id": "deepseek-v4-flash", "name": "DeepSeek V4 Flash", "display_name": "DeepSeek V4 Flash", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" @@ -343064,11 +341914,10 @@ ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "knowledge": "2025-05", "release_date": "2026-07-31", - "last_updated": "2026-07-31", + "last_updated": "2026-10-17", "type": "chat" }, { @@ -343118,9 +341967,8 @@ }, "attachment": true, "open_weights": true, - "knowledge": "2025-05", "release_date": "2026-08-21", - "last_updated": "2026-08-21", + "last_updated": "2026-10-17", "type": "chat" }, { @@ -343216,7 +342064,7 @@ "attachment": true, "open_weights": true, "release_date": "2026-09-10", - "last_updated": "2026-09-10", + "last_updated": "2026-10-17", "type": "chat" }, { @@ -343300,9 +342148,159 @@ "supported": true, "default_enabled": true, "mode": "level", - "level": "high", + "level": "high", + "level_options": [ + "minimal", + "low", + "medium", + "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2025-01", + "release_date": "2026-05-19", + "last_updated": "2026-05-19", + "type": "chat" + }, + { + "id": "gemini-3.5-flash-lite", + "name": "Gemini 3.5 Flash Lite", + "display_name": "Gemini 3.5 Flash Lite", + "modalities": { + "input": [ + "text", + "image", + "video", + "audio", + "pdf" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1048576, + "output": 65536 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "effort_options": [ + "minimal", + "low", + "medium", + "high" + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2026-03", + "release_date": "2026-07-21", + "last_updated": "2026-07-21", + "type": "chat" + }, + { + "id": "gemini-3.6-flash", + "name": "Gemini 3.6 Flash", + "display_name": "Gemini 3.6 Flash", + "modalities": { + "input": [ + "text", + "image", + "video", + "audio", + "pdf" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1048576, + "output": 65536 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "medium", + "level_options": [ + "minimal", + "low", + "medium", + "high" + ], + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ], + "notes": [ + "The default thinkingLevel is medium." + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2026-03", + "release_date": "2026-07-21", + "last_updated": "2026-07-21", + "type": "chat" + }, + { + "id": "gemini-3.7-flash", + "name": "Gemini 3.7 Flash", + "display_name": "Gemini 3.7 Flash", + "modalities": { + "input": [ + "text", + "image", + "video", + "audio", + "pdf" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1048576, + "output": 65536 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "level", + "level": "medium", "level_options": [ - "minimal", "low", "medium", "high" @@ -343311,64 +342309,23 @@ "visibility": "summary", "continuation": [ "thought_signatures" - ] - } - }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-01", - "release_date": "2026-05-19", - "last_updated": "2026-05-19", - "type": "chat" - }, - { - "id": "gemini-3.5-flash-lite", - "name": "Gemini 3.5 Flash Lite", - "display_name": "Gemini 3.5 Flash Lite", - "modalities": { - "input": [ - "text", - "image", - "video", - "audio", - "pdf" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 1048576, - "output": 65536 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "effort_options": [ - "minimal", - "low", - "medium", - "high" + ], + "notes": [ + "The thinkingLevel parameter does not accept minimal." ] } }, "attachment": true, "open_weights": false, "knowledge": "2026-03", - "release_date": "2026-07-21", - "last_updated": "2026-07-21", + "release_date": "2026-08-13", + "last_updated": "2026-08-31", "type": "chat" }, { - "id": "gemini-3.6-flash", - "name": "Gemini 3.6 Flash", - "display_name": "Gemini 3.6 Flash", + "id": "gemini-3.8-flash", + "name": "Gemini 3.8 Flash", + "display_name": "Gemini 3.8 Flash", "modalities": { "input": [ "text", @@ -343398,7 +342355,6 @@ "mode": "level", "level": "medium", "level_options": [ - "minimal", "low", "medium", "high" @@ -343409,6 +342365,7 @@ "thought_signatures" ], "notes": [ + "The thinkingLevel parameter does not accept minimal.", "The default thinkingLevel is medium." ] } @@ -343416,14 +342373,14 @@ "attachment": true, "open_weights": false, "knowledge": "2026-03", - "release_date": "2026-07-21", - "last_updated": "2026-07-21", + "release_date": "2026-09-02", + "last_updated": "2026-09-02", "type": "chat" }, { - "id": "gemini-3.7-flash", - "name": "Gemini 3.7 Flash", - "display_name": "Gemini 3.7 Flash", + "id": "gemini-4-argon", + "name": "Gemini 4 Argon", + "display_name": "Gemini 4 Argon", "modalities": { "input": [ "text", @@ -343440,7 +342397,7 @@ "context": 1048576, "output": 65536 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -343463,36 +342420,30 @@ "thought_signatures" ], "notes": [ - "The thinkingLevel parameter does not accept minimal." + "Thinking level defaults to medium and accepts low, medium, and high." ] } }, "attachment": true, "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-08-13", - "last_updated": "2026-08-31", + "last_updated": "2026-10-27", "type": "chat" }, { - "id": "gemini-3.8-flash", - "name": "Gemini 3.8 Flash", - "display_name": "Gemini 3.8 Flash", + "id": "glm-5.2", + "name": "GLM-5.2", + "display_name": "GLM-5.2", "modalities": { "input": [ - "text", - "image", - "video", - "audio", - "pdf" + "text" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -343504,35 +342455,39 @@ "reasoning": { "supported": true, "default_enabled": true, - "mode": "level", - "level": "medium", - "level_options": [ + "mode": "effort", + "effort": "max", + "effort_options": [ + "none", + "minimal", "low", "medium", - "high" + "high", + "xhigh", + "max" ], + "interleaved": true, "summaries": true, "visibility": "summary", "continuation": [ - "thought_signatures" + "thinking_blocks" ], "notes": [ - "The thinkingLevel parameter does not accept minimal.", - "The default thinkingLevel is medium." + "none and minimal stop thinking; low and medium map to high; xhigh maps to max.", + "The same page also states that low is only supported by GLM-5.3 and GLM-5.3-Flash, which conflicts with the GLM-5.2 option list." ] } }, - "attachment": true, - "open_weights": false, - "knowledge": "2026-03", - "release_date": "2026-09-02", - "last_updated": "2026-09-02", + "attachment": false, + "open_weights": true, + "release_date": "2026-06-16", + "last_updated": "2026-06-16", "type": "chat" }, { - "id": "glm-5.2", - "name": "GLM-5.2", - "display_name": "GLM-5.2", + "id": "glm-5.3", + "name": "GLM-5.3", + "display_name": "GLM-5.3", "modalities": { "input": [ "text" @@ -343558,12 +342513,8 @@ "mode": "effort", "effort": "max", "effort_options": [ - "none", - "minimal", "low", - "medium", "high", - "xhigh", "max" ], "interleaved": true, @@ -343573,24 +342524,26 @@ "thinking_blocks" ], "notes": [ - "none and minimal stop thinking; low and medium map to high; xhigh maps to max.", - "The same page also states that low is only supported by GLM-5.3 and GLM-5.3-Flash, which conflicts with the GLM-5.2 option list." + "Thinking cannot be disabled; reasoning_effort defaults to max. Set thinking.clear_thinking to false to preserve reasoning across turns." ] } }, "attachment": false, "open_weights": true, - "release_date": "2026-06-16", - "last_updated": "2026-06-16", + "release_date": "2026-08-18", + "last_updated": "2026-08-31", "type": "chat" }, { - "id": "glm-5.3", - "name": "GLM-5.3", - "display_name": "GLM-5.3", + "id": "glm-5.3-flash", + "name": "GLM-5.3 Flash", + "display_name": "GLM-5.3 Flash", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "file" ], "output": [ "text" @@ -343628,16 +342581,16 @@ ] } }, - "attachment": false, + "attachment": true, "open_weights": true, - "release_date": "2026-08-18", + "release_date": "2026-08-26", "last_updated": "2026-08-31", "type": "chat" }, { - "id": "glm-5.3-flash", - "name": "GLM-5.3 Flash", - "display_name": "GLM-5.3 Flash", + "id": "glm-5.3-flashx", + "name": "GLM-5.3 FlashX", + "display_name": "GLM-5.3 FlashX", "modalities": { "input": [ "text", @@ -343682,15 +342635,13 @@ } }, "attachment": true, - "open_weights": true, - "release_date": "2026-08-26", - "last_updated": "2026-08-31", + "last_updated": "2026-09-20", "type": "chat" }, { - "id": "glm-5.3-flashx", - "name": "GLM-5.3 FlashX", - "display_name": "GLM-5.3 FlashX", + "id": "glm-5.3-flashx-legal", + "name": "GLM-5.3 FlashX Legal", + "display_name": "GLM-5.3 FlashX Legal", "modalities": { "input": [ "text", @@ -343735,7 +342686,7 @@ } }, "attachment": true, - "last_updated": "2026-09-20", + "last_updated": "2026-10-27", "type": "chat" }, { @@ -344207,6 +343158,57 @@ "last_updated": "2026-09-29", "type": "chat" }, + { + "id": "gpt-6.1-terra", + "name": "GPT-6.1 Terra", + "display_name": "GPT-6.1 Terra", + "modalities": { + "input": [ + "text", + "image", + "pdf" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1050000, + "output": 128000 + }, + "temperature": false, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ], + "visibility": "hidden", + "notes": [ + "The default reasoning effort is medium." + ] + } + }, + "attachment": true, + "open_weights": false, + "knowledge": "2026-06-01", + "release_date": "2026-10-26", + "last_updated": "2026-10-26", + "type": "chat" + }, { "id": "kimi-k2.5", "name": "Kimi K2.5", @@ -344288,21 +343290,66 @@ "thinking_blocks" ], "notes": [ - "Temperature is fixed at 1.0 with thinking enabled and 0.6 with thinking disabled." + "Temperature is fixed at 1.0 with thinking enabled and 0.6 with thinking disabled." + ] + } + }, + "attachment": true, + "open_weights": true, + "knowledge": "2025-01", + "release_date": "2026-04-21", + "last_updated": "2026-10-27", + "type": "chat" + }, + { + "id": "kimi-k2.7-code", + "name": "Kimi K2.7 Code", + "display_name": "Kimi K2.7 Code", + "modalities": { + "input": [ + "text", + "image", + "video" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 262144, + "output": 262144 + }, + "temperature": false, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "fixed", + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Thinking is always enabled and preserved. Disabling thinking is unsupported; temperature is fixed at 1.0." ] } }, "attachment": true, - "open_weights": true, - "knowledge": "2025-01", - "release_date": "2026-04-21", - "last_updated": "2026-08-31", + "release_date": "2026-06-12", + "last_updated": "2026-10-27", "type": "chat" }, { - "id": "kimi-k2.7-code", - "name": "Kimi K2.7 Code", - "display_name": "Kimi K2.7 Code", + "id": "kimi-k2.7-code-highspeed", + "name": "Kimi K2.7 Code Highspeed", + "display_name": "Kimi K2.7 Code Highspeed", "modalities": { "input": [ "text", @@ -344340,14 +343387,14 @@ } }, "attachment": true, - "release_date": "2026-06-12", - "last_updated": "2026-08-31", + "open_weights": true, + "last_updated": "2026-10-27", "type": "chat" }, { - "id": "kimi-k2.7-code-highspeed", - "name": "Kimi K2.7 Code Highspeed", - "display_name": "Kimi K2.7 Code Highspeed", + "id": "kimi-k3", + "name": "Kimi K3", + "display_name": "Kimi K3", "modalities": { "input": [ "text", @@ -344359,8 +343406,8 @@ ] }, "limit": { - "context": 262144, - "output": 262144 + "context": 1048576, + "output": 1048576 }, "temperature": false, "tool_call": true, @@ -344372,7 +343419,13 @@ "reasoning": { "supported": true, "default_enabled": true, - "mode": "fixed", + "mode": "effort", + "effort": "max", + "effort_options": [ + "low", + "high", + "max" + ], "interleaved": true, "summaries": true, "visibility": "summary", @@ -344380,19 +343433,21 @@ "thinking_blocks" ], "notes": [ - "Thinking is always enabled and preserved. Disabling thinking is unsupported; temperature is fixed at 1.0." + "Thinking is always enabled; reasoning_effort defaults to max.", + "max_completion_tokens defaults to 131072 and can reach 1048576 within the shared input/output context window." ] } }, "attachment": true, "open_weights": true, + "release_date": "2026-07-16", "last_updated": "2026-08-31", "type": "chat" }, { - "id": "kimi-k3", - "name": "Kimi K3", - "display_name": "Kimi K3", + "id": "kimi-k3.1-pro", + "name": "Kimi K3.1 Pro", + "display_name": "Kimi K3.1 Pro", "modalities": { "input": [ "text", @@ -344437,9 +343492,58 @@ } }, "attachment": true, - "open_weights": true, - "release_date": "2026-07-16", - "last_updated": "2026-08-31", + "last_updated": "2026-10-27", + "type": "chat" + }, + { + "id": "kimi-k3.1-pro-highspeed", + "name": "Kimi K3.1 Pro Highspeed", + "display_name": "Kimi K3.1 Pro Highspeed", + "modalities": { + "input": [ + "text", + "image", + "video" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1048576, + "output": 1048576 + }, + "temperature": false, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "max", + "effort_options": [ + "low", + "high", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Thinking is always enabled; reasoning_effort defaults to max.", + "max_completion_tokens defaults to 131072 and can reach 1048576 within the shared input/output context window." + ] + } + }, + "attachment": true, + "last_updated": "2026-10-27", "type": "chat" }, { @@ -344479,7 +343583,7 @@ "attachment": false, "open_weights": true, "release_date": "2026-03-18", - "last_updated": "2026-03-18", + "last_updated": "2026-10-27", "type": "chat" }, { @@ -344519,7 +343623,7 @@ "attachment": false, "open_weights": true, "release_date": "2026-03-18", - "last_updated": "2026-03-18", + "last_updated": "2026-10-27", "type": "chat" }, { @@ -344538,9 +343642,9 @@ }, "limit": { "context": 1000000, - "output": 128000 + "output": 524288 }, - "temperature": true, + "temperature": false, "tool_call": true, "reasoning": { "supported": true, @@ -344565,7 +343669,62 @@ "attachment": true, "open_weights": true, "release_date": "2026-06-01", - "last_updated": "2026-06-25", + "last_updated": "2026-10-27", + "type": "chat" + }, + { + "id": "MiniMax-M3.1-Flash", + "name": "MiniMax-M3.1 Flash", + "display_name": "MiniMax-M3.1 Flash", + "modalities": { + "input": [ + "text", + "image", + "video" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1000000, + "output": 524288 + }, + "temperature": false, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "max", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Thinking is always enabled; disabled and none return 400. reasoning_effort defaults to max.", + "Preserve reasoning_content in subsequent turns. reasoning_split=false is unsupported." + ] + } + }, + "attachment": true, + "open_weights": true, + "release_date": "2026-10-19", + "last_updated": "2026-10-27", "type": "chat" }, { @@ -345072,7 +344231,7 @@ }, "limit": { "context": 1000000, - "output": 384000 + "output": 64000 }, "temperature": true, "tool_call": true, @@ -345097,7 +344256,7 @@ } }, "attachment": true, - "last_updated": "2026-09-20", + "last_updated": "2026-10-27", "type": "chat" } ] @@ -345135,6 +344294,26 @@ }, "type": "chat" }, + { + "id": "gpt-6.1-terra", + "name": "gpt-6.1-terra", + "display_name": "gpt-6.1-terra", + "modalities": { + "input": [ + "text", + "image" + ] + }, + "limit": { + "context": 8192, + "output": 8192 + }, + "tool_call": false, + "reasoning": { + "supported": false + }, + "type": "chat" + }, { "id": "kimi-k3.1-pro", "name": "kimi-k3.1-pro", @@ -345460,6 +344639,25 @@ }, "type": "chat" }, + { + "id": "elephant-1-free", + "name": "elephant-1-free", + "display_name": "elephant-1-free", + "modalities": { + "input": [ + "text" + ] + }, + "limit": { + "context": 8192, + "output": 8192 + }, + "tool_call": false, + "reasoning": { + "supported": false + }, + "type": "chat" + }, { "id": "qwen-image-2.1-pro", "name": "qwen-image-2.1-pro", @@ -345501,13 +344699,12 @@ "type": "imageGeneration" }, { - "id": "nemotron-3.5-super-vl-free", - "name": "nemotron-3.5-super-vl-free", - "display_name": "nemotron-3.5-super-vl-free", + "id": "span-01-lite-free", + "name": "span-01-lite-free", + "display_name": "span-01-lite-free", "modalities": { "input": [ - "text", - "image" + "text" ] }, "limit": { @@ -345521,18 +344718,17 @@ "type": "chat" }, { - "id": "gpt-6-luna", - "name": "gpt-6-luna", - "display_name": "gpt-6-luna", + "id": "mammoth-1-free", + "name": "mammoth-1-free", + "display_name": "mammoth-1-free", "modalities": { "input": [ - "text", - "image" + "text" ] }, "limit": { - "context": 1050000, - "output": 1050000 + "context": 8192, + "output": 8192 }, "tool_call": false, "reasoning": { @@ -345541,9 +344737,9 @@ "type": "chat" }, { - "id": "gpt-6-sol", - "name": "gpt-6-sol", - "display_name": "gpt-6-sol", + "id": "nemotron-3.5-super-vl-free", + "name": "nemotron-3.5-super-vl-free", + "display_name": "nemotron-3.5-super-vl-free", "modalities": { "input": [ "text", @@ -345551,8 +344747,8 @@ ] }, "limit": { - "context": 1050000, - "output": 1050000 + "context": 8192, + "output": 8192 }, "tool_call": false, "reasoning": { @@ -345561,19 +344757,18 @@ "type": "chat" }, { - "id": "claude-opus-5-5", - "name": "claude-opus-5-5", - "display_name": "claude-opus-5-5", + "id": "gpt-6-luna", + "name": "gpt-6-luna", + "display_name": "gpt-6-luna", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ] }, "limit": { - "context": 1000000, - "output": 1000000 + "context": 1050000, + "output": 1050000 }, "tool_call": false, "reasoning": { @@ -345582,19 +344777,18 @@ "type": "chat" }, { - "id": "claude-sonnet-5-5", - "name": "claude-sonnet-5-5", - "display_name": "claude-sonnet-5-5", + "id": "gpt-6-sol", + "name": "gpt-6-sol", + "display_name": "gpt-6-sol", "modalities": { "input": [ "text", - "image", - "pdf" + "image" ] }, "limit": { - "context": 1000000, - "output": 1000000 + "context": 1050000, + "output": 1050000 }, "tool_call": false, "reasoning": { @@ -345603,14 +344797,14 @@ "type": "chat" }, { - "id": "qwen3.8-flash-free", - "name": "qwen3.8-flash-free", - "display_name": "qwen3.8-flash-free", + "id": "claude-opus-5-5", + "name": "claude-opus-5-5", + "display_name": "claude-opus-5-5", "modalities": { "input": [ "text", "image", - "video" + "pdf" ] }, "limit": { @@ -345619,24 +344813,19 @@ }, "tool_call": false, "reasoning": { - "supported": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, "type": "chat" }, { - "id": "qwen3.8-max-free", - "name": "qwen3.8-max-free", - "display_name": "qwen3.8-max-free", + "id": "claude-sonnet-5-5", + "name": "claude-sonnet-5-5", + "display_name": "claude-sonnet-5-5", "modalities": { "input": [ "text", "image", - "video" + "pdf" ] }, "limit": { @@ -345645,12 +344834,7 @@ }, "tool_call": false, "reasoning": { - "supported": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "supported": false }, "type": "chat" }, @@ -346915,27 +346099,50 @@ "type": "chat" }, { - "id": "deepseek-v4-flash-0731-fast", - "name": "deepseek-v4-flash-0731-fast", - "display_name": "deepseek-v4-flash-0731-fast", + "id": "wan3.0-video", + "name": "wan3.0-video", + "display_name": "wan3.0-video", "modalities": { "input": [ - "text" + "text", + "image", + "video", + "audio", + "document", + "link" ] }, "limit": { - "context": 1000000, - "output": 1000000 + "context": 8192, + "output": 8192 }, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, - "extra_capabilities": { - "reasoning": { - "supported": true - } + "type": "chat" + }, + { + "id": "wan3.0-video-prime", + "name": "wan3.0-video-prime", + "display_name": "wan3.0-video-prime", + "modalities": { + "input": [ + "text", + "image", + "video", + "audio", + "document", + "link" + ] + }, + "limit": { + "context": 8192, + "output": 8192 + }, + "tool_call": false, + "reasoning": { + "supported": false }, "type": "chat" }, @@ -346987,50 +346194,27 @@ "type": "chat" }, { - "id": "wan3.0-video", - "name": "wan3.0-video", - "display_name": "wan3.0-video", + "id": "deepseek-v4-flash-0731-fast", + "name": "deepseek-v4-flash-0731-fast", + "display_name": "deepseek-v4-flash-0731-fast", "modalities": { "input": [ - "text", - "image", - "video", - "audio", - "document", - "link" + "text" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 1000000, + "output": 1000000 }, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false - }, - "type": "chat" - }, - { - "id": "wan3.0-video-prime", - "name": "wan3.0-video-prime", - "display_name": "wan3.0-video-prime", - "modalities": { - "input": [ - "text", - "image", - "video", - "audio", - "document", - "link" - ] - }, - "limit": { - "context": 8192, - "output": 8192 + "supported": true, + "default": true }, - "tool_call": false, - "reasoning": { - "supported": false + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "type": "chat" }, @@ -350538,6 +349722,26 @@ }, "type": "chat" }, + { + "id": "gpt-5.3-chat-latest", + "name": "gpt-5.3-chat-latest", + "display_name": "gpt-5.3-chat-latest", + "modalities": { + "input": [ + "text", + "image" + ] + }, + "limit": { + "context": 128000, + "output": 128000 + }, + "tool_call": true, + "reasoning": { + "supported": false + }, + "type": "chat" + }, { "id": "gpt-5.3-codex", "name": "gpt-5.3-codex", @@ -350797,40 +350001,17 @@ "type": "chat" }, { - "id": "gpt-5.3-chat-latest", - "name": "gpt-5.3-chat-latest", - "display_name": "gpt-5.3-chat-latest", - "modalities": { - "input": [ - "text", - "image" - ] - }, - "limit": { - "context": 128000, - "output": 128000 - }, - "tool_call": true, - "reasoning": { - "supported": false - }, - "type": "chat" - }, - { - "id": "doubao-seed-2-0-pro", - "name": "doubao-seed-2-0-pro", - "display_name": "doubao-seed-2-0-pro", + "id": "coding-glm-5.1", + "name": "coding-glm-5.1", + "display_name": "coding-glm-5.1", "modalities": { "input": [ - "text", - "image", - "video", - "document" + "text" ] }, "limit": { - "context": 256000, - "output": 256000 + "context": 200000, + "output": 200000 }, "tool_call": true, "reasoning": { @@ -350993,117 +350174,20 @@ "type": "chat" }, { - "id": "coding-glm-5.1", - "name": "coding-glm-5.1", - "display_name": "coding-glm-5.1", - "modalities": { - "input": [ - "text" - ] - }, - "limit": { - "context": 200000, - "output": 200000 - }, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, - "type": "chat" - }, - { - "id": "claude-opus-4-6", - "name": "claude-opus-4-6", - "display_name": "claude-opus-4-6", + "id": "doubao-seed-2-0-pro", + "name": "doubao-seed-2-0-pro", + "display_name": "doubao-seed-2-0-pro", "modalities": { "input": [ "text", "image", - "pdf" - ] - }, - "limit": { - "context": 1000000, - "output": 1000000 - }, - "tool_call": true, - "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "mixed", - "budget": { - "min": 1024, - "unit": "tokens" - }, - "effort": "high", - "effort_options": [ - "low", - "medium", - "high", - "max" - ], - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ], - "notes": [ - "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", - "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." - ] - } - }, - "type": "chat" - }, - { - "id": "coding-glm-5.1-free", - "name": "coding-glm-5.1-free", - "display_name": "coding-glm-5.1-free", - "modalities": { - "input": [ - "text" - ] - }, - "limit": { - "context": 200000, - "output": 200000 - }, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, - "type": "chat" - }, - { - "id": "coding-minimax-m2.7-free", - "name": "coding-minimax-m2.7-free", - "display_name": "coding-minimax-m2.7-free", - "modalities": { - "input": [ - "text" + "video", + "document" ] }, "limit": { - "context": 204800, - "output": 204800 + "context": 256000, + "output": 256000 }, "tool_call": true, "reasoning": { @@ -351140,40 +350224,9 @@ "type": "chat" }, { - "id": "minimax-m2.7", - "name": "minimax-m2.7", - "display_name": "minimax-m2.7", - "modalities": { - "input": [ - "text" - ] - }, - "limit": { - "context": 204800, - "output": 204800 - }, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, - "type": "chat" - }, - { - "id": "claude-opus-4-6-think", - "name": "claude-opus-4-6-think", - "display_name": "claude-opus-4-6-think", + "id": "claude-opus-4-6", + "name": "claude-opus-4-6", + "display_name": "claude-opus-4-6", "modalities": { "input": [ "text", @@ -351188,12 +350241,12 @@ "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": false }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": true, + "default_enabled": false, "mode": "mixed", "budget": { "min": 1024, @@ -351221,9 +350274,9 @@ "type": "chat" }, { - "id": "coding-glm-5-free", - "name": "coding-glm-5-free", - "display_name": "coding-glm-5-free", + "id": "coding-glm-5.1-free", + "name": "coding-glm-5.1-free", + "display_name": "coding-glm-5.1-free", "modalities": { "input": [ "text" @@ -351246,9 +350299,9 @@ "type": "chat" }, { - "id": "coding-glm-5-turbo-free", - "name": "coding-glm-5-turbo-free", - "display_name": "coding-glm-5-turbo-free", + "id": "coding-minimax-m2.7-free", + "name": "coding-minimax-m2.7-free", + "display_name": "coding-minimax-m2.7-free", "modalities": { "input": [ "text" @@ -351271,9 +350324,9 @@ "type": "chat" }, { - "id": "coding-minimax-m2.5-free", - "name": "coding-minimax-m2.5-free", - "display_name": "coding-minimax-m2.5-free", + "id": "minimax-m2.7", + "name": "minimax-m2.7", + "display_name": "minimax-m2.7", "modalities": { "input": [ "text" @@ -351290,7 +350343,13 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "type": "chat" @@ -351463,74 +350522,127 @@ "type": "chat" }, { - "id": "embed-v-4-0", - "name": "embed-v-4-0", - "display_name": "embed-v-4-0", + "id": "claude-opus-4-6-think", + "name": "claude-opus-4-6-think", + "display_name": "claude-opus-4-6-think", "modalities": { "input": [ "text", - "image" + "image", + "pdf" ] }, "limit": { - "context": 128000, - "output": 128000 + "context": 1000000, + "output": 1000000 }, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "type": "embedding" + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "mixed", + "budget": { + "min": 1024, + "unit": "tokens" + }, + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Anthropic recommends adaptive thinking with effort for Claude 4.6; budget_tokens remains a deprecated compatibility path.", + "Anthropic API defaults effort to high; lower effort levels should be chosen per workload." + ] + } + }, + "type": "chat" }, { - "id": "ernie-image-turbo", - "name": "ernie-image-turbo", - "display_name": "ernie-image-turbo", + "id": "coding-glm-5-free", + "name": "coding-glm-5-free", + "display_name": "coding-glm-5-free", + "modalities": { + "input": [ + "text" + ] + }, "limit": { - "context": 8192, - "output": 8192 + "context": 200000, + "output": 200000 }, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "type": "imageGeneration" + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "type": "chat" }, { - "id": "flint-v1.0-free", - "name": "flint-v1.0-free", - "display_name": "flint-v1.0-free", + "id": "coding-glm-5-turbo-free", + "name": "coding-glm-5-turbo-free", + "display_name": "coding-glm-5-turbo-free", "modalities": { "input": [ "text" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 204800, + "output": 204800 }, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "type": "chat" }, { - "id": "xing4.0-29b-a4b-free", - "name": "xing4.0-29b-a4b-free", - "display_name": "xing4.0-29b-a4b-free", + "id": "coding-minimax-m2.5-free", + "name": "coding-minimax-m2.5-free", + "display_name": "coding-minimax-m2.5-free", "modalities": { "input": [ "text" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 204800, + "output": 204800 }, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } }, "type": "chat" }, @@ -351657,6 +350769,78 @@ }, "type": "chat" }, + { + "id": "xing4.0-29b-a4b-free", + "name": "xing4.0-29b-a4b-free", + "display_name": "xing4.0-29b-a4b-free", + "modalities": { + "input": [ + "text" + ] + }, + "limit": { + "context": 8192, + "output": 8192 + }, + "tool_call": false, + "reasoning": { + "supported": false + }, + "type": "chat" + }, + { + "id": "embed-v-4-0", + "name": "embed-v-4-0", + "display_name": "embed-v-4-0", + "modalities": { + "input": [ + "text", + "image" + ] + }, + "limit": { + "context": 128000, + "output": 128000 + }, + "tool_call": false, + "reasoning": { + "supported": false + }, + "type": "embedding" + }, + { + "id": "ernie-image-turbo", + "name": "ernie-image-turbo", + "display_name": "ernie-image-turbo", + "limit": { + "context": 8192, + "output": 8192 + }, + "tool_call": false, + "reasoning": { + "supported": false + }, + "type": "imageGeneration" + }, + { + "id": "flint-v1.0-free", + "name": "flint-v1.0-free", + "display_name": "flint-v1.0-free", + "modalities": { + "input": [ + "text" + ] + }, + "limit": { + "context": 8192, + "output": 8192 + }, + "tool_call": false, + "reasoning": { + "supported": false + }, + "type": "chat" + }, { "id": "cohere-command-a", "name": "cohere-command-a", @@ -351805,26 +350989,6 @@ }, "type": "chat" }, - { - "id": "veo-3.1-lite-generate-preview", - "name": "veo-3.1-lite-generate-preview", - "display_name": "veo-3.1-lite-generate-preview", - "modalities": { - "input": [ - "text", - "image" - ] - }, - "limit": { - "context": 8192, - "output": 8192 - }, - "tool_call": false, - "reasoning": { - "supported": false - }, - "type": "chat" - }, { "id": "glm-4.7-flash-free", "name": "glm-4.7-flash-free", @@ -354407,93 +353571,6 @@ }, "type": "chat" }, - { - "id": "gemini-2.5-flash", - "name": "gemini-2.5-flash", - "display_name": "gemini-2.5-flash", - "modalities": { - "input": [ - "text", - "image", - "video", - "audio", - "pdf" - ] - }, - "limit": { - "context": 1048576, - "output": 1048576 - }, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "budget", - "budget": { - "default": -1, - "min": 0, - "max": 24576, - "auto": -1, - "off": 0, - "unit": "tokens" - }, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] - } - }, - "type": "chat" - }, - { - "id": "gemini-2.5-flash-preview-09-2025", - "name": "gemini-2.5-flash-preview-09-2025", - "display_name": "gemini-2.5-flash-preview-09-2025", - "modalities": { - "input": [ - "text", - "image", - "video", - "audio" - ] - }, - "limit": { - "context": 1048576, - "output": 1048576 - }, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "budget", - "budget": { - "default": -1, - "min": 0, - "max": 24576, - "auto": -1, - "off": 0, - "unit": "tokens" - }, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] - } - }, - "type": "chat" - }, { "id": "glm-4.5v", "name": "glm-4.5v", @@ -354516,222 +353593,6 @@ }, "type": "chat" }, - { - "id": "gemini-2.5-flash-lite", - "name": "gemini-2.5-flash-lite", - "display_name": "gemini-2.5-flash-lite", - "modalities": { - "input": [ - "text", - "image", - "video", - "audio", - "pdf" - ] - }, - "limit": { - "context": 1048576, - "output": 1048576 - }, - "tool_call": true, - "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "default": -1, - "min": 512, - "max": 24576, - "auto": -1, - "unit": "tokens" - }, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] - } - }, - "type": "chat" - }, - { - "id": "gemini-2.5-flash-lite-nothink", - "name": "gemini-2.5-flash-lite-nothink", - "display_name": "gemini-2.5-flash-lite-nothink", - "modalities": { - "input": [ - "text", - "image", - "video", - "audio", - "pdf" - ] - }, - "limit": { - "context": 1048576, - "output": 1048576 - }, - "tool_call": true, - "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "default": -1, - "min": 512, - "max": 24576, - "auto": -1, - "unit": "tokens" - }, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] - } - }, - "type": "chat" - }, - { - "id": "gemini-2.5-flash-lite-preview-09-2025", - "name": "gemini-2.5-flash-lite-preview-09-2025", - "display_name": "gemini-2.5-flash-lite-preview-09-2025", - "modalities": { - "input": [ - "text", - "image", - "video", - "audio", - "pdf" - ] - }, - "limit": { - "context": 1048576, - "output": 1048576 - }, - "tool_call": true, - "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "default": -1, - "min": 512, - "max": 24576, - "auto": -1, - "unit": "tokens" - }, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] - } - }, - "type": "chat" - }, - { - "id": "gemini-2.5-flash-lite-preview-09-2025-nothink", - "name": "gemini-2.5-flash-lite-preview-09-2025-nothink", - "display_name": "gemini-2.5-flash-lite-preview-09-2025-nothink", - "modalities": { - "input": [ - "text", - "image", - "video", - "audio", - "pdf" - ] - }, - "limit": { - "context": 1048576, - "output": 1048576 - }, - "tool_call": true, - "reasoning": { - "supported": true, - "default": false - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "budget", - "budget": { - "default": -1, - "min": 512, - "max": 24576, - "auto": -1, - "unit": "tokens" - }, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] - } - }, - "type": "chat" - }, - { - "id": "gemini-2.5-flash-nothink", - "name": "gemini-2.5-flash-nothink", - "display_name": "gemini-2.5-flash-nothink", - "modalities": { - "input": [ - "text", - "image", - "video", - "audio", - "pdf" - ] - }, - "limit": { - "context": 1048576, - "output": 1048576 - }, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "budget", - "budget": { - "default": -1, - "min": 0, - "max": 24576, - "auto": -1, - "off": 0, - "unit": "tokens" - }, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] - } - }, - "type": "chat" - }, { "id": "gemini-2.5-flash-search", "name": "gemini-2.5-flash-search", @@ -354777,150 +353638,90 @@ "type": "chat" }, { - "id": "gemini-2.5-flash-preview-05-20-nothink", - "name": "gemini-2.5-flash-preview-05-20-nothink", - "display_name": "gemini-2.5-flash-preview-05-20-nothink", - "modalities": { - "input": [ - "text", - "image", - "video", - "audio" - ] - }, - "limit": { - "context": 1048576, - "output": 1048576 - }, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "budget", - "budget": { - "default": -1, - "min": 0, - "max": 24576, - "auto": -1, - "off": 0, - "unit": "tokens" - }, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] - } - }, - "type": "chat" - }, - { - "id": "gemini-2.5-flash-preview-05-20-search", - "name": "gemini-2.5-flash-preview-05-20-search", - "display_name": "gemini-2.5-flash-preview-05-20-search", - "modalities": { - "input": [ - "text", - "image", - "video", - "audio" - ] - }, - "limit": { - "context": 1048576, - "output": 1048576 - }, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "budget", - "budget": { - "default": -1, - "min": 0, - "max": 24576, - "auto": -1, - "off": 0, - "unit": "tokens" - }, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] - } - }, - "type": "chat" - }, - { - "id": "imagen-4.0-fast-generate-001", - "name": "imagen-4.0-fast-generate-001", - "display_name": "imagen-4.0-fast-generate-001", + "id": "gemini-2.5-flash-preview-05-20-nothink", + "name": "gemini-2.5-flash-preview-05-20-nothink", + "display_name": "gemini-2.5-flash-preview-05-20-nothink", "modalities": { "input": [ "text", - "image" + "image", + "video", + "audio" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 1048576, + "output": 1048576 }, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false - }, - "type": "imageGeneration" - }, - { - "id": "imagen-4.0-generate-001", - "name": "imagen-4.0-generate-001", - "display_name": "imagen-4.0-generate-001", - "modalities": { - "input": [ - "text", - "image" - ] - }, - "limit": { - "context": 8192, - "output": 8192 + "supported": true, + "default": true }, - "tool_call": false, - "reasoning": { - "supported": false + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "budget", + "budget": { + "default": -1, + "min": 0, + "max": 24576, + "auto": -1, + "off": 0, + "unit": "tokens" + }, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] + } }, - "type": "imageGeneration" + "type": "chat" }, { - "id": "imagen-4.0-ultra-generate-001", - "name": "imagen-4.0-ultra-generate-001", - "display_name": "imagen-4.0-ultra-generate-001", + "id": "gemini-2.5-flash-preview-05-20-search", + "name": "gemini-2.5-flash-preview-05-20-search", + "display_name": "gemini-2.5-flash-preview-05-20-search", "modalities": { "input": [ "text", - "image" + "image", + "video", + "audio" ] }, "limit": { - "context": 8192, - "output": 8192 + "context": 1048576, + "output": 1048576 }, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true }, - "type": "imageGeneration" + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "budget", + "budget": { + "default": -1, + "min": 0, + "max": 24576, + "auto": -1, + "off": 0, + "unit": "tokens" + }, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] + } + }, + "type": "chat" }, { "id": "gpt-image-1", @@ -354998,84 +353799,6 @@ }, "type": "chat" }, - { - "id": "grok-4", - "name": "grok-4", - "display_name": "grok-4", - "modalities": { - "input": [ - "text", - "image" - ] - }, - "limit": { - "context": 256000, - "output": 256000 - }, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, - "type": "chat" - }, - { - "id": "kimi-k2-instruct", - "name": "kimi-k2-instruct", - "display_name": "kimi-k2-instruct", - "modalities": { - "input": [ - "text" - ] - }, - "limit": { - "context": 8192, - "output": 8192 - }, - "tool_call": true, - "reasoning": { - "supported": false - }, - "type": "chat" - }, - { - "id": "kimi-k2-turbo-preview", - "name": "kimi-k2-turbo-preview", - "display_name": "kimi-k2-turbo-preview", - "modalities": { - "input": [ - "text" - ] - }, - "limit": { - "context": 262144, - "output": 262144 - }, - "tool_call": true, - "reasoning": { - "supported": false - }, - "type": "chat" - }, - { - "id": "alicloud-kimi-k2-instruct", - "name": "alicloud-kimi-k2-instruct", - "display_name": "alicloud-kimi-k2-instruct", - "limit": { - "context": 8192, - "output": 8192 - }, - "tool_call": false, - "reasoning": { - "supported": false - }, - "type": "chat" - }, { "id": "paddleocr-vl-0.9b", "name": "paddleocr-vl-0.9b", @@ -355126,37 +353849,73 @@ "type": "chat" }, { - "id": "veo-3.1-fast-generate-preview", - "name": "veo-3.1-fast-generate-preview", - "display_name": "veo-3.1-fast-generate-preview", + "id": "grok-4", + "name": "grok-4", + "display_name": "grok-4", "modalities": { "input": [ "text", - "image", - "video" + "image" + ] + }, + "limit": { + "context": 256000, + "output": 256000 + }, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true + } + }, + "type": "chat" + }, + { + "id": "kimi-k2-instruct", + "name": "kimi-k2-instruct", + "display_name": "kimi-k2-instruct", + "modalities": { + "input": [ + "text" ] }, "limit": { "context": 8192, "output": 8192 }, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": false }, "type": "chat" }, { - "id": "veo-3.1-generate-preview", - "name": "veo-3.1-generate-preview", - "display_name": "veo-3.1-generate-preview", + "id": "kimi-k2-turbo-preview", + "name": "kimi-k2-turbo-preview", + "display_name": "kimi-k2-turbo-preview", "modalities": { "input": [ - "text", - "image", - "video" + "text" ] }, + "limit": { + "context": 262144, + "output": 262144 + }, + "tool_call": true, + "reasoning": { + "supported": false + }, + "type": "chat" + }, + { + "id": "alicloud-kimi-k2-instruct", + "name": "alicloud-kimi-k2-instruct", + "display_name": "alicloud-kimi-k2-instruct", "limit": { "context": 8192, "output": 8192 @@ -355726,16 +354485,44 @@ "type": "chat" }, { - "id": "LongCat-Flash-Chat", - "name": "LongCat-Flash-Chat", - "display_name": "LongCat-Flash-Chat", + "id": "gemini-2.5-pro-preview-06-05-search", + "name": "gemini-2.5-pro-preview-06-05-search", + "display_name": "gemini-2.5-pro-preview-06-05-search", + "modalities": { + "input": [ + "text", + "image", + "audio", + "video" + ] + }, "limit": { "context": 8192, "output": 8192 }, - "tool_call": false, + "tool_call": true, "reasoning": { - "supported": false + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "budget", + "budget": { + "default": -1, + "min": 128, + "max": 32768, + "auto": -1, + "unit": "tokens" + }, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thought_signatures" + ] + } }, "type": "chat" }, @@ -355780,44 +354567,16 @@ "type": "embedding" }, { - "id": "gemini-2.5-pro-preview-06-05-search", - "name": "gemini-2.5-pro-preview-06-05-search", - "display_name": "gemini-2.5-pro-preview-06-05-search", - "modalities": { - "input": [ - "text", - "image", - "audio", - "video" - ] - }, + "id": "LongCat-Flash-Chat", + "name": "LongCat-Flash-Chat", + "display_name": "LongCat-Flash-Chat", "limit": { "context": 8192, "output": 8192 }, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "budget", - "budget": { - "default": -1, - "min": 128, - "max": 32768, - "auto": -1, - "unit": "tokens" - }, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thought_signatures" - ] - } + "supported": false }, "type": "chat" }, @@ -357834,25 +356593,6 @@ }, "type": "chat" }, - { - "id": "kat-dev", - "name": "kat-dev", - "display_name": "kat-dev", - "modalities": { - "input": [ - "text" - ] - }, - "limit": { - "context": 128000, - "output": 128000 - }, - "tool_call": true, - "reasoning": { - "supported": false - }, - "type": "chat" - }, { "id": "llama-3.3-70b", "name": "llama-3.3-70b", @@ -359678,6 +358418,20 @@ }, "type": "chat" }, + { + "id": "omni-moderation-latest", + "name": "omni-moderation-latest", + "display_name": "omni-moderation-latest", + "limit": { + "context": 8192, + "output": 8192 + }, + "tool_call": false, + "reasoning": { + "supported": false + }, + "type": "chat" + }, { "id": "qwen-flash", "name": "qwen-flash", @@ -360349,52 +359103,6 @@ }, "type": "tts" }, - { - "id": "wan3.0-video-free", - "name": "wan3.0-video-free", - "display_name": "wan3.0-video-free", - "modalities": { - "input": [ - "text", - "image", - "audio", - "video", - "pdf" - ] - }, - "limit": { - "context": 8192, - "output": 8192 - }, - "tool_call": false, - "reasoning": { - "supported": false - }, - "type": "chat" - }, - { - "id": "wan3.0-video-prime-free", - "name": "wan3.0-video-prime-free", - "display_name": "wan3.0-video-prime-free", - "modalities": { - "input": [ - "text", - "image", - "audio", - "video", - "pdf" - ] - }, - "limit": { - "context": 8192, - "output": 8192 - }, - "tool_call": false, - "reasoning": { - "supported": false - }, - "type": "chat" - }, { "id": "whisper-1", "name": "whisper-1", @@ -361194,20 +359902,6 @@ }, "type": "chat" }, - { - "id": "omni-moderation-latest", - "name": "omni-moderation-latest", - "display_name": "omni-moderation-latest", - "limit": { - "context": 8192, - "output": 8192 - }, - "tool_call": false, - "reasoning": { - "supported": false - }, - "type": "chat" - }, { "id": "deepinfra-llama-4-maverick-17b-128e-instruct", "name": "deepinfra-llama-4-maverick-17b-128e-instruct", @@ -361395,20 +360089,6 @@ }, "type": "chat" }, - { - "id": "deepseek-v3", - "name": "deepseek-v3", - "display_name": "deepseek-v3", - "limit": { - "context": 8192, - "output": 8192 - }, - "tool_call": false, - "reasoning": { - "supported": false - }, - "type": "chat" - }, { "id": "distil-whisper-large-v3-en", "name": "distil-whisper-large-v3-en", @@ -361920,20 +360600,6 @@ }, "type": "chat" }, - { - "id": "DeepSeek-v3", - "name": "DeepSeek-v3", - "display_name": "DeepSeek-v3", - "limit": { - "context": 8192, - "output": 8192 - }, - "tool_call": false, - "reasoning": { - "supported": false - }, - "type": "chat" - }, { "id": "Doubao-1.5-lite-32k", "name": "Doubao-1.5-lite-32k", @@ -363170,6 +361836,35 @@ }, "type": "chat" }, + { + "id": "o3-pro-global", + "name": "o3-pro-global", + "display_name": "o3-pro-global", + "limit": { + "context": 8192, + "output": 8192 + }, + "tool_call": false, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "type": "chat" + }, { "id": "qianfan-chinese-llama-2-13b", "name": "qianfan-chinese-llama-2-13b", @@ -363353,35 +362048,6 @@ } }, "type": "chat" - }, - { - "id": "o3-pro-global", - "name": "o3-pro-global", - "display_name": "o3-pro-global", - "limit": { - "context": 8192, - "output": 8192 - }, - "tool_call": false, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" - } - }, - "type": "chat" } ] }, @@ -365149,37 +363815,6 @@ "attachment": true, "type": "chat" }, - { - "id": "arcee-ai/trinity-large-thinking", - "name": "Arcee AI: Trinity Large Thinking", - "display_name": "Arcee AI: Trinity Large Thinking", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 262144, - "output": 80000 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "fixed" - } - }, - "type": "chat" - }, { "id": "bytedance-seed/seed-1.6", "name": "ByteDance Seed: Seed 1.6", @@ -365645,7 +364280,7 @@ }, "limit": { "context": 163840, - "output": 32768 + "output": 147456 }, "tool_call": true, "reasoning": { @@ -365845,7 +364480,7 @@ }, "limit": { "context": 1048576, - "output": 131072 + "output": 943718 }, "tool_call": true, "reasoning": { @@ -367737,7 +366372,7 @@ }, "limit": { "context": 131072, - "output": 117964 + "output": 16384 }, "tool_call": false, "reasoning": { @@ -367825,7 +366460,7 @@ }, "limit": { "context": 262144, - "output": 235929 + "output": 16384 }, "temperature": true, "tool_call": true, @@ -367941,28 +366576,6 @@ }, "type": "chat" }, - { - "id": "ibm-granite/granite-4.0-h-micro", - "name": "IBM: Granite 4.0 Micro", - "display_name": "IBM: Granite 4.0 Micro", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 131000, - "output": 117900 - }, - "tool_call": false, - "reasoning": { - "supported": false - }, - "type": "chat" - }, { "id": "ibm-granite/granite-4.2-8b", "name": "IBM: Granite 4.2 8B", @@ -368189,8 +366802,8 @@ ] }, "limit": { - "context": 262144, - "output": 235929 + "context": 1000000, + "output": 262144 }, "tool_call": true, "reasoning": { @@ -368841,7 +367454,7 @@ }, "limit": { "context": 1048576, - "output": 943718 + "output": 131072 }, "tool_call": true, "reasoning": { @@ -369234,30 +367847,6 @@ "attachment": true, "type": "chat" }, - { - "id": "mistralai/codestral-2508:batch", - "name": "Mistral: Codestral 2508 (batch)", - "display_name": "Mistral: Codestral 2508 (batch)", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 256000, - "output": 204800 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": true, - "type": "chat" - }, { "id": "mistralai/devstral-2512", "name": "Mistral: Devstral 2 2512", @@ -369354,30 +367943,6 @@ }, "type": "chat" }, - { - "id": "mistralai/ministral-8b-2512:batch", - "name": "Mistral: Ministral 3 8B 2512 (batch)", - "display_name": "Mistral: Ministral 3 8B 2512 (batch)", - "modalities": { - "input": [ - "text", - "image" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 262144, - "output": 209715 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, - "type": "chat" - }, { "id": "mistralai/mistral-large", "name": "Mistral Large", @@ -369451,31 +368016,6 @@ "attachment": true, "type": "chat" }, - { - "id": "mistralai/mistral-large-2512:batch", - "name": "Mistral: Mistral Large 3 2512 (batch)", - "display_name": "Mistral: Mistral Large 3 2512 (batch)", - "modalities": { - "input": [ - "text", - "image" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 262144, - "output": 209715 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": true, - "type": "chat" - }, { "id": "mistralai/mistral-large-4-0", "name": "Mistral: Mistral Large 4", @@ -369639,31 +368179,6 @@ "attachment": true, "type": "chat" }, - { - "id": "mistralai/mistral-medium-3.1:batch", - "name": "Mistral: Mistral Medium 3.1 (batch)", - "display_name": "Mistral: Mistral Medium 3.1 (batch)", - "modalities": { - "input": [ - "text", - "image" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 131072, - "output": 104857 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": false - }, - "attachment": true, - "type": "chat" - }, { "id": "mistralai/mistral-nemo", "name": "Mistral: Mistral Nemo", @@ -369771,43 +368286,6 @@ }, "type": "chat" }, - { - "id": "mistralai/mistral-small-2603:batch", - "name": "Mistral: Mistral Small 4 (batch)", - "display_name": "Mistral: Mistral Small 4 (batch)", - "modalities": { - "input": [ - "text", - "image" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 262144, - "output": 209715 - }, - "tool_call": true, - "reasoning": { - "supported": true, - "default": false, - "effort": "high" - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": false, - "mode": "effort", - "effort": "high", - "effort_options": [ - "none", - "high" - ] - } - }, - "type": "chat" - }, { "id": "mistralai/mistral-small-3.1-24b-instruct", "name": "Mistral: Mistral Small 3.1 24B", @@ -370534,46 +369012,8 @@ ] }, "limit": { - "context": 262144, - "output": 235929 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true, - "effort": "medium" - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "none", - "low", - "medium" - ] - } - }, - "type": "chat" - }, - { - "id": "nvidia/nemotron-3-super-120b-a12b:free", - "name": "NVIDIA: Nemotron 3 Super (free)", - "display_name": "NVIDIA: Nemotron 3 Super (free)", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 262144, - "output": 235929 + "context": 1048576, + "output": 262144 }, "temperature": true, "tool_call": true, @@ -370941,29 +369381,6 @@ }, "type": "chat" }, - { - "id": "openai/gpt-4-turbo", - "name": "OpenAI: GPT-4 Turbo", - "display_name": "OpenAI: GPT-4 Turbo", - "modalities": { - "input": [ - "text", - "image" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 128000, - "output": 4096 - }, - "tool_call": true, - "reasoning": { - "supported": false - }, - "type": "chat" - }, { "id": "openai/gpt-4-turbo:batch", "name": "OpenAI: GPT-4 Turbo (batch)", @@ -372316,24 +370733,122 @@ "type": "chat" }, { - "id": "openai/gpt-5.4-image-2", - "name": "OpenAI: GPT-5.4 Image 2", - "display_name": "OpenAI: GPT-5.4 Image 2", + "id": "openai/gpt-5.4-image-2", + "name": "OpenAI: GPT-5.4 Image 2", + "display_name": "OpenAI: GPT-5.4 Image 2", + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "image", + "text" + ] + }, + "limit": { + "context": 272000, + "output": 128000 + }, + "tool_call": false, + "reasoning": { + "supported": true, + "default": false, + "effort": "medium", + "verbosity": "medium" + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, + "type": "imageGeneration" + }, + { + "id": "openai/gpt-5.4-mini", + "name": "OpenAI: GPT-5.4 Mini", + "display_name": "OpenAI: GPT-5.4 Mini", + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 400000, + "output": 128000 + }, + "tool_call": true, + "reasoning": { + "supported": true, + "default": false, + "effort": "medium", + "verbosity": "medium" + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "verbosity": "medium", + "verbosity_options": [ + "low", + "medium", + "high" + ], + "visibility": "hidden" + } + }, + "attachment": true, + "type": "chat" + }, + { + "id": "openai/gpt-5.4-mini:batch", + "name": "OpenAI: GPT-5.4 Mini (batch)", + "display_name": "OpenAI: GPT-5.4 Mini (batch)", "modalities": { "input": [ "image", "text" ], "output": [ - "image", "text" ] }, "limit": { - "context": 272000, + "context": 400000, "output": 128000 }, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, "default": false, @@ -372363,12 +370878,12 @@ } }, "attachment": true, - "type": "imageGeneration" + "type": "chat" }, { - "id": "openai/gpt-5.4-mini", - "name": "OpenAI: GPT-5.4 Mini", - "display_name": "OpenAI: GPT-5.4 Mini", + "id": "openai/gpt-5.4-nano", + "name": "OpenAI: GPT-5.4 Nano", + "display_name": "OpenAI: GPT-5.4 Nano", "modalities": { "input": [ "image", @@ -372415,9 +370930,9 @@ "type": "chat" }, { - "id": "openai/gpt-5.4-mini:batch", - "name": "OpenAI: GPT-5.4 Mini (batch)", - "display_name": "OpenAI: GPT-5.4 Mini (batch)", + "id": "openai/gpt-5.4-nano:batch", + "name": "OpenAI: GPT-5.4 Nano (batch)", + "display_name": "OpenAI: GPT-5.4 Nano (batch)", "modalities": { "input": [ "image", @@ -372464,38 +370979,36 @@ "type": "chat" }, { - "id": "openai/gpt-5.4-nano", - "name": "OpenAI: GPT-5.4 Nano", - "display_name": "OpenAI: GPT-5.4 Nano", + "id": "openai/gpt-5.4-pro", + "name": "OpenAI: GPT-5.4 Pro", + "display_name": "OpenAI: GPT-5.4 Pro", "modalities": { "input": [ - "image", - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 400000, + "context": 1050000, "output": 128000 }, "tool_call": true, "reasoning": { "supported": true, - "default": false, + "default": true, "effort": "medium", "verbosity": "medium" }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, + "default_enabled": true, "mode": "effort", "effort": "medium", "effort_options": [ - "none", - "low", "medium", "high", "xhigh" @@ -372513,38 +371026,36 @@ "type": "chat" }, { - "id": "openai/gpt-5.4-nano:batch", - "name": "OpenAI: GPT-5.4 Nano (batch)", - "display_name": "OpenAI: GPT-5.4 Nano (batch)", + "id": "openai/gpt-5.4-pro:batch", + "name": "OpenAI: GPT-5.4 Pro (batch)", + "display_name": "OpenAI: GPT-5.4 Pro (batch)", "modalities": { "input": [ - "image", - "text" + "text", + "image" ], "output": [ "text" ] }, "limit": { - "context": 400000, + "context": 1050000, "output": 128000 }, "tool_call": true, "reasoning": { "supported": true, - "default": false, + "default": true, "effort": "medium", "verbosity": "medium" }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, + "default_enabled": true, "mode": "effort", "effort": "medium", "effort_options": [ - "none", - "low", "medium", "high", "xhigh" @@ -372562,9 +371073,9 @@ "type": "chat" }, { - "id": "openai/gpt-5.4-pro", - "name": "OpenAI: GPT-5.4 Pro", - "display_name": "OpenAI: GPT-5.4 Pro", + "id": "openai/gpt-5.4:batch", + "name": "OpenAI: GPT-5.4 (batch)", + "display_name": "OpenAI: GPT-5.4 (batch)", "modalities": { "input": [ "text", @@ -372579,6 +371090,47 @@ "output": 128000 }, "tool_call": true, + "reasoning": { + "supported": true, + "default": false, + "effort": "medium" + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": false, + "mode": "effort", + "effort": "medium", + "effort_options": [ + "none", + "low", + "medium", + "high", + "xhigh" + ] + } + }, + "attachment": true, + "type": "chat" + }, + { + "id": "openai/gpt-5.5", + "name": "OpenAI: GPT-5.5", + "display_name": "OpenAI: GPT-5.5", + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1050000, + "output": 128000 + }, + "tool_call": true, "reasoning": { "supported": true, "default": true, @@ -372592,6 +371144,8 @@ "mode": "effort", "effort": "medium", "effort_options": [ + "none", + "low", "medium", "high", "xhigh" @@ -372609,13 +371163,13 @@ "type": "chat" }, { - "id": "openai/gpt-5.4-pro:batch", - "name": "OpenAI: GPT-5.4 Pro (batch)", - "display_name": "OpenAI: GPT-5.4 Pro (batch)", + "id": "openai/gpt-5.5-pro", + "name": "OpenAI: GPT-5.5 Pro", + "display_name": "OpenAI: GPT-5.5 Pro", "modalities": { "input": [ - "text", - "image" + "image", + "text" ], "output": [ "text" @@ -372629,8 +371183,7 @@ "reasoning": { "supported": true, "default": true, - "effort": "medium", - "verbosity": "medium" + "effort": "medium" }, "extra_capabilities": { "reasoning": { @@ -372642,27 +371195,59 @@ "medium", "high", "xhigh" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", + ] + } + }, + "attachment": true, + "type": "chat" + }, + { + "id": "openai/gpt-5.5-pro:batch", + "name": "OpenAI: GPT-5.5 Pro (batch)", + "display_name": "OpenAI: GPT-5.5 Pro (batch)", + "modalities": { + "input": [ + "image", + "text" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1050000, + "output": 128000 + }, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true, + "effort": "medium" + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "medium", + "effort_options": [ "medium", - "high" - ], - "visibility": "hidden" + "high", + "xhigh" + ] } }, "attachment": true, "type": "chat" }, { - "id": "openai/gpt-5.4:batch", - "name": "OpenAI: GPT-5.4 (batch)", - "display_name": "OpenAI: GPT-5.4 (batch)", + "id": "openai/gpt-5.5:batch", + "name": "OpenAI: GPT-5.5 (batch)", + "display_name": "OpenAI: GPT-5.5 (batch)", "modalities": { "input": [ - "text", - "image" + "image", + "text" ], "output": [ "text" @@ -372675,13 +371260,13 @@ "tool_call": true, "reasoning": { "supported": true, - "default": false, + "default": true, "effort": "medium" }, "extra_capabilities": { "reasoning": { "supported": true, - "default_enabled": false, + "default_enabled": true, "mode": "effort", "effort": "medium", "effort_options": [ @@ -372697,9 +371282,9 @@ "type": "chat" }, { - "id": "openai/gpt-5.5", - "name": "OpenAI: GPT-5.5", - "display_name": "OpenAI: GPT-5.5", + "id": "openai/gpt-5.6-luna", + "name": "OpenAI: GPT-5.6 Luna", + "display_name": "OpenAI: GPT-5.6 Luna", "modalities": { "input": [ "image", @@ -372731,7 +371316,8 @@ "low", "medium", "high", - "xhigh" + "xhigh", + "max" ], "verbosity": "medium", "verbosity_options": [ @@ -372746,9 +371332,9 @@ "type": "chat" }, { - "id": "openai/gpt-5.5-pro", - "name": "OpenAI: GPT-5.5 Pro", - "display_name": "OpenAI: GPT-5.5 Pro", + "id": "openai/gpt-5.6-luna-pro", + "name": "OpenAI: GPT-5.6 Luna Pro", + "display_name": "OpenAI: GPT-5.6 Luna Pro", "modalities": { "input": [ "image", @@ -372775,9 +371361,12 @@ "mode": "effort", "effort": "medium", "effort_options": [ + "none", + "low", "medium", "high", - "xhigh" + "xhigh", + "max" ] } }, @@ -372785,9 +371374,9 @@ "type": "chat" }, { - "id": "openai/gpt-5.5-pro:batch", - "name": "OpenAI: GPT-5.5 Pro (batch)", - "display_name": "OpenAI: GPT-5.5 Pro (batch)", + "id": "openai/gpt-5.6-luna-pro:batch", + "name": "OpenAI: GPT-5.6 Luna Pro (batch)", + "display_name": "OpenAI: GPT-5.6 Luna Pro (batch)", "modalities": { "input": [ "image", @@ -372814,9 +371403,12 @@ "mode": "effort", "effort": "medium", "effort_options": [ + "none", + "low", "medium", "high", - "xhigh" + "xhigh", + "max" ] } }, @@ -372824,9 +371416,9 @@ "type": "chat" }, { - "id": "openai/gpt-5.5:batch", - "name": "OpenAI: GPT-5.5 (batch)", - "display_name": "OpenAI: GPT-5.5 (batch)", + "id": "openai/gpt-5.6-luna:batch", + "name": "OpenAI: GPT-5.6 Luna (batch)", + "display_name": "OpenAI: GPT-5.6 Luna (batch)", "modalities": { "input": [ "image", @@ -372857,7 +371449,8 @@ "low", "medium", "high", - "xhigh" + "xhigh", + "max" ] } }, @@ -372865,9 +371458,9 @@ "type": "chat" }, { - "id": "openai/gpt-5.6-luna", - "name": "OpenAI: GPT-5.6 Luna", - "display_name": "OpenAI: GPT-5.6 Luna", + "id": "openai/gpt-5.6-sol", + "name": "OpenAI: GPT-5.6 Sol", + "display_name": "OpenAI: GPT-5.6 Sol", "modalities": { "input": [ "image", @@ -372915,9 +371508,9 @@ "type": "chat" }, { - "id": "openai/gpt-5.6-luna-pro", - "name": "OpenAI: GPT-5.6 Luna Pro", - "display_name": "OpenAI: GPT-5.6 Luna Pro", + "id": "openai/gpt-5.6-sol-pro", + "name": "OpenAI: GPT-5.6 Sol Pro", + "display_name": "OpenAI: GPT-5.6 Sol Pro", "modalities": { "input": [ "image", @@ -372957,9 +371550,9 @@ "type": "chat" }, { - "id": "openai/gpt-5.6-luna-pro:batch", - "name": "OpenAI: GPT-5.6 Luna Pro (batch)", - "display_name": "OpenAI: GPT-5.6 Luna Pro (batch)", + "id": "openai/gpt-5.6-sol-pro:batch", + "name": "OpenAI: GPT-5.6 Sol Pro (batch)", + "display_name": "OpenAI: GPT-5.6 Sol Pro (batch)", "modalities": { "input": [ "image", @@ -372999,9 +371592,9 @@ "type": "chat" }, { - "id": "openai/gpt-5.6-luna:batch", - "name": "OpenAI: GPT-5.6 Luna (batch)", - "display_name": "OpenAI: GPT-5.6 Luna (batch)", + "id": "openai/gpt-5.6-sol:batch", + "name": "OpenAI: GPT-5.6 Sol (batch)", + "display_name": "OpenAI: GPT-5.6 Sol (batch)", "modalities": { "input": [ "image", @@ -373041,9 +371634,9 @@ "type": "chat" }, { - "id": "openai/gpt-5.6-sol", - "name": "OpenAI: GPT-5.6 Sol", - "display_name": "OpenAI: GPT-5.6 Sol", + "id": "openai/gpt-5.6-terra", + "name": "OpenAI: GPT-5.6 Terra", + "display_name": "OpenAI: GPT-5.6 Terra", "modalities": { "input": [ "image", @@ -373091,9 +371684,9 @@ "type": "chat" }, { - "id": "openai/gpt-5.6-sol-pro", - "name": "OpenAI: GPT-5.6 Sol Pro", - "display_name": "OpenAI: GPT-5.6 Sol Pro", + "id": "openai/gpt-5.6-terra-pro", + "name": "OpenAI: GPT-5.6 Terra Pro", + "display_name": "OpenAI: GPT-5.6 Terra Pro", "modalities": { "input": [ "image", @@ -373133,9 +371726,9 @@ "type": "chat" }, { - "id": "openai/gpt-5.6-sol-pro:batch", - "name": "OpenAI: GPT-5.6 Sol Pro (batch)", - "display_name": "OpenAI: GPT-5.6 Sol Pro (batch)", + "id": "openai/gpt-5.6-terra-pro:batch", + "name": "OpenAI: GPT-5.6 Terra Pro (batch)", + "display_name": "OpenAI: GPT-5.6 Terra Pro (batch)", "modalities": { "input": [ "image", @@ -373175,9 +371768,9 @@ "type": "chat" }, { - "id": "openai/gpt-5.6-sol:batch", - "name": "OpenAI: GPT-5.6 Sol (batch)", - "display_name": "OpenAI: GPT-5.6 Sol (batch)", + "id": "openai/gpt-5.6-terra:batch", + "name": "OpenAI: GPT-5.6 Terra (batch)", + "display_name": "OpenAI: GPT-5.6 Terra (batch)", "modalities": { "input": [ "image", @@ -373217,9 +371810,9 @@ "type": "chat" }, { - "id": "openai/gpt-5.6-terra", - "name": "OpenAI: GPT-5.6 Terra", - "display_name": "OpenAI: GPT-5.6 Terra", + "id": "openai/gpt-6-astra", + "name": "OpenAI: GPT-6 Astra", + "display_name": "OpenAI: GPT-6 Astra", "modalities": { "input": [ "image", @@ -373237,8 +371830,7 @@ "reasoning": { "supported": true, "default": true, - "effort": "medium", - "verbosity": "medium" + "effort": "medium" }, "extra_capabilities": { "reasoning": { @@ -373247,29 +371839,21 @@ "mode": "effort", "effort": "medium", "effort_options": [ - "none", "low", "medium", "high", "xhigh", "max" - ], - "verbosity": "medium", - "verbosity_options": [ - "low", - "medium", - "high" - ], - "visibility": "hidden" + ] } }, "attachment": true, "type": "chat" }, { - "id": "openai/gpt-5.6-terra-pro", - "name": "OpenAI: GPT-5.6 Terra Pro", - "display_name": "OpenAI: GPT-5.6 Terra Pro", + "id": "openai/gpt-6-astra-pro", + "name": "OpenAI: GPT-6 Astra Pro", + "display_name": "OpenAI: GPT-6 Astra Pro", "modalities": { "input": [ "image", @@ -373296,7 +371880,6 @@ "mode": "effort", "effort": "medium", "effort_options": [ - "none", "low", "medium", "high", @@ -373309,9 +371892,9 @@ "type": "chat" }, { - "id": "openai/gpt-5.6-terra-pro:batch", - "name": "OpenAI: GPT-5.6 Terra Pro (batch)", - "display_name": "OpenAI: GPT-5.6 Terra Pro (batch)", + "id": "openai/gpt-6-astra-pro:batch", + "name": "OpenAI: GPT-6 Astra Pro (batch)", + "display_name": "OpenAI: GPT-6 Astra Pro (batch)", "modalities": { "input": [ "image", @@ -373338,7 +371921,6 @@ "mode": "effort", "effort": "medium", "effort_options": [ - "none", "low", "medium", "high", @@ -373351,9 +371933,9 @@ "type": "chat" }, { - "id": "openai/gpt-5.6-terra:batch", - "name": "OpenAI: GPT-5.6 Terra (batch)", - "display_name": "OpenAI: GPT-5.6 Terra (batch)", + "id": "openai/gpt-6-astra:batch", + "name": "OpenAI: GPT-6 Astra (batch)", + "display_name": "OpenAI: GPT-6 Astra (batch)", "modalities": { "input": [ "image", @@ -373380,7 +371962,6 @@ "mode": "effort", "effort": "medium", "effort_options": [ - "none", "low", "medium", "high", @@ -373393,9 +371974,9 @@ "type": "chat" }, { - "id": "openai/gpt-6-astra", - "name": "OpenAI: GPT-6 Astra", - "display_name": "OpenAI: GPT-6 Astra", + "id": "openai/gpt-6-luna", + "name": "OpenAI: GPT-6 Luna", + "display_name": "OpenAI: GPT-6 Luna", "modalities": { "input": [ "image", @@ -373422,6 +372003,7 @@ "mode": "effort", "effort": "medium", "effort_options": [ + "none", "low", "medium", "high", @@ -373434,9 +372016,9 @@ "type": "chat" }, { - "id": "openai/gpt-6-astra-pro", - "name": "OpenAI: GPT-6 Astra Pro", - "display_name": "OpenAI: GPT-6 Astra Pro", + "id": "openai/gpt-6-luna-pro", + "name": "OpenAI: GPT-6 Luna Pro", + "display_name": "OpenAI: GPT-6 Luna Pro", "modalities": { "input": [ "image", @@ -373463,6 +372045,7 @@ "mode": "effort", "effort": "medium", "effort_options": [ + "none", "low", "medium", "high", @@ -373475,9 +372058,9 @@ "type": "chat" }, { - "id": "openai/gpt-6-astra-pro:batch", - "name": "OpenAI: GPT-6 Astra Pro (batch)", - "display_name": "OpenAI: GPT-6 Astra Pro (batch)", + "id": "openai/gpt-6-luna-pro:batch", + "name": "OpenAI: GPT-6 Luna Pro (batch)", + "display_name": "OpenAI: GPT-6 Luna Pro (batch)", "modalities": { "input": [ "image", @@ -373504,6 +372087,7 @@ "mode": "effort", "effort": "medium", "effort_options": [ + "none", "low", "medium", "high", @@ -373516,9 +372100,9 @@ "type": "chat" }, { - "id": "openai/gpt-6-astra:batch", - "name": "OpenAI: GPT-6 Astra (batch)", - "display_name": "OpenAI: GPT-6 Astra (batch)", + "id": "openai/gpt-6-luna:batch", + "name": "OpenAI: GPT-6 Luna (batch)", + "display_name": "OpenAI: GPT-6 Luna (batch)", "modalities": { "input": [ "image", @@ -373545,6 +372129,7 @@ "mode": "effort", "effort": "medium", "effort_options": [ + "none", "low", "medium", "high", @@ -373557,9 +372142,9 @@ "type": "chat" }, { - "id": "openai/gpt-6-luna", - "name": "OpenAI: GPT-6 Luna", - "display_name": "OpenAI: GPT-6 Luna", + "id": "openai/gpt-6-sol", + "name": "OpenAI: GPT-6 Sol", + "display_name": "OpenAI: GPT-6 Sol", "modalities": { "input": [ "image", @@ -373599,9 +372184,9 @@ "type": "chat" }, { - "id": "openai/gpt-6-luna-pro", - "name": "OpenAI: GPT-6 Luna Pro", - "display_name": "OpenAI: GPT-6 Luna Pro", + "id": "openai/gpt-6-sol-pro", + "name": "OpenAI: GPT-6 Sol Pro", + "display_name": "OpenAI: GPT-6 Sol Pro", "modalities": { "input": [ "image", @@ -373641,9 +372226,9 @@ "type": "chat" }, { - "id": "openai/gpt-6-luna-pro:batch", - "name": "OpenAI: GPT-6 Luna Pro (batch)", - "display_name": "OpenAI: GPT-6 Luna Pro (batch)", + "id": "openai/gpt-6-sol-pro:batch", + "name": "OpenAI: GPT-6 Sol Pro (batch)", + "display_name": "OpenAI: GPT-6 Sol Pro (batch)", "modalities": { "input": [ "image", @@ -373683,9 +372268,9 @@ "type": "chat" }, { - "id": "openai/gpt-6-luna:batch", - "name": "OpenAI: GPT-6 Luna (batch)", - "display_name": "OpenAI: GPT-6 Luna (batch)", + "id": "openai/gpt-6-sol:batch", + "name": "OpenAI: GPT-6 Sol (batch)", + "display_name": "OpenAI: GPT-6 Sol (batch)", "modalities": { "input": [ "image", @@ -373725,9 +372310,9 @@ "type": "chat" }, { - "id": "openai/gpt-6-sol", - "name": "OpenAI: GPT-6 Sol", - "display_name": "OpenAI: GPT-6 Sol", + "id": "openai/gpt-6.1-sol", + "name": "OpenAI: GPT-6.1 Sol", + "display_name": "OpenAI: GPT-6.1 Sol", "modalities": { "input": [ "image", @@ -373754,7 +372339,6 @@ "mode": "effort", "effort": "medium", "effort_options": [ - "none", "low", "medium", "high", @@ -373767,9 +372351,9 @@ "type": "chat" }, { - "id": "openai/gpt-6-sol-pro", - "name": "OpenAI: GPT-6 Sol Pro", - "display_name": "OpenAI: GPT-6 Sol Pro", + "id": "openai/gpt-6.1-sol-pro", + "name": "OpenAI: GPT-6.1 Sol Pro", + "display_name": "OpenAI: GPT-6.1 Sol Pro", "modalities": { "input": [ "image", @@ -373796,7 +372380,6 @@ "mode": "effort", "effort": "medium", "effort_options": [ - "none", "low", "medium", "high", @@ -373809,9 +372392,9 @@ "type": "chat" }, { - "id": "openai/gpt-6-sol-pro:batch", - "name": "OpenAI: GPT-6 Sol Pro (batch)", - "display_name": "OpenAI: GPT-6 Sol Pro (batch)", + "id": "openai/gpt-6.1-sol-pro:batch", + "name": "OpenAI: GPT-6.1 Sol Pro (batch)", + "display_name": "OpenAI: GPT-6.1 Sol Pro (batch)", "modalities": { "input": [ "image", @@ -373838,7 +372421,6 @@ "mode": "effort", "effort": "medium", "effort_options": [ - "none", "low", "medium", "high", @@ -373851,9 +372433,9 @@ "type": "chat" }, { - "id": "openai/gpt-6-sol:batch", - "name": "OpenAI: GPT-6 Sol (batch)", - "display_name": "OpenAI: GPT-6 Sol (batch)", + "id": "openai/gpt-6.1-sol:batch", + "name": "OpenAI: GPT-6.1 Sol (batch)", + "display_name": "OpenAI: GPT-6.1 Sol (batch)", "modalities": { "input": [ "image", @@ -373880,7 +372462,6 @@ "mode": "effort", "effort": "medium", "effort_options": [ - "none", "low", "medium", "high", @@ -373893,9 +372474,9 @@ "type": "chat" }, { - "id": "openai/gpt-6.1-sol", - "name": "OpenAI: GPT-6.1 Sol", - "display_name": "OpenAI: GPT-6.1 Sol", + "id": "openai/gpt-6.1-terra", + "name": "OpenAI: GPT-6.1 Terra", + "display_name": "OpenAI: GPT-6.1 Terra", "modalities": { "input": [ "image", @@ -373922,6 +372503,7 @@ "mode": "effort", "effort": "medium", "effort_options": [ + "none", "low", "medium", "high", @@ -373934,9 +372516,9 @@ "type": "chat" }, { - "id": "openai/gpt-6.1-sol-pro", - "name": "OpenAI: GPT-6.1 Sol Pro", - "display_name": "OpenAI: GPT-6.1 Sol Pro", + "id": "openai/gpt-6.1-terra-pro", + "name": "OpenAI: GPT-6.1 Terra Pro", + "display_name": "OpenAI: GPT-6.1 Terra Pro", "modalities": { "input": [ "image", @@ -373975,9 +372557,9 @@ "type": "chat" }, { - "id": "openai/gpt-6.1-sol-pro:batch", - "name": "OpenAI: GPT-6.1 Sol Pro (batch)", - "display_name": "OpenAI: GPT-6.1 Sol Pro (batch)", + "id": "openai/gpt-6.1-terra-pro:batch", + "name": "OpenAI: GPT-6.1 Terra Pro (batch)", + "display_name": "OpenAI: GPT-6.1 Terra Pro (batch)", "modalities": { "input": [ "image", @@ -374016,9 +372598,9 @@ "type": "chat" }, { - "id": "openai/gpt-6.1-sol:batch", - "name": "OpenAI: GPT-6.1 Sol (batch)", - "display_name": "OpenAI: GPT-6.1 Sol (batch)", + "id": "openai/gpt-6.1-terra:batch", + "name": "OpenAI: GPT-6.1 Terra (batch)", + "display_name": "OpenAI: GPT-6.1 Terra (batch)", "modalities": { "input": [ "image", @@ -374045,6 +372627,7 @@ "mode": "effort", "effort": "medium", "effort_options": [ + "none", "low", "medium", "high", @@ -374169,120 +372752,9 @@ "type": "chat" }, { - "id": "openai/gpt-oss-120b:batch", - "name": "OpenAI: gpt-oss-120b (batch)", - "display_name": "OpenAI: gpt-oss-120b (batch)", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 131072, - "output": 117964 - }, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true, - "effort": "medium" - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high" - ] - } - }, - "type": "chat" - }, - { - "id": "openai/gpt-oss-20b", - "name": "OpenAI: gpt-oss-20b", - "display_name": "OpenAI: gpt-oss-20b", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 131072, - "output": 32768 - }, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true, - "effort": "medium" - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high" - ] - } - }, - "type": "chat" - }, - { - "id": "openai/gpt-oss-20b:batch", - "name": "OpenAI: gpt-oss-20b (batch)", - "display_name": "OpenAI: gpt-oss-20b (batch)", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 131072, - "output": 117964 - }, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true, - "effort": "medium" - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "medium", - "effort_options": [ - "low", - "medium", - "high" - ] - } - }, - "type": "chat" - }, - { - "id": "openai/gpt-oss-safeguard-20b", - "name": "OpenAI: gpt-oss-safeguard-20b", - "display_name": "OpenAI: gpt-oss-safeguard-20b", + "id": "openai/gpt-oss-120b:batch", + "name": "OpenAI: gpt-oss-120b (batch)", + "display_name": "OpenAI: gpt-oss-120b (batch)", "modalities": { "input": [ "text" @@ -374293,97 +372765,109 @@ }, "limit": { "context": 131072, - "output": 65536 + "output": 117964 }, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": true, + "effort": "medium" }, "extra_capabilities": { "reasoning": { "supported": true, "default_enabled": true, - "mode": "fixed" + "mode": "effort", + "effort": "medium", + "effort_options": [ + "low", + "medium", + "high" + ] } }, "type": "chat" }, { - "id": "openai/o1", - "name": "OpenAI: o1", - "display_name": "OpenAI: o1", + "id": "openai/gpt-oss-20b", + "name": "OpenAI: gpt-oss-20b", + "display_name": "OpenAI: gpt-oss-20b", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 131072, + "output": 32768 }, "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": true, + "effort": "medium" }, "extra_capabilities": { "reasoning": { "supported": true, "default_enabled": true, - "mode": "fixed", + "mode": "effort", "effort": "medium", - "visibility": "hidden" + "effort_options": [ + "low", + "medium", + "high" + ] } }, - "attachment": true, "type": "chat" }, { - "id": "openai/o1-pro", - "name": "OpenAI: o1-pro", - "display_name": "OpenAI: o1-pro", + "id": "openai/gpt-oss-20b:batch", + "name": "OpenAI: gpt-oss-20b (batch)", + "display_name": "OpenAI: gpt-oss-20b (batch)", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 131072, + "output": 117964 }, - "tool_call": false, + "tool_call": true, "reasoning": { "supported": true, - "default": true + "default": true, + "effort": "medium" }, "extra_capabilities": { "reasoning": { "supported": true, "default_enabled": true, - "mode": "fixed", + "mode": "effort", "effort": "medium", - "visibility": "hidden" + "effort_options": [ + "low", + "medium", + "high" + ] } }, - "attachment": true, "type": "chat" }, { - "id": "openai/o3", - "name": "OpenAI: o3", - "display_name": "OpenAI: o3", + "id": "openai/gpt-oss-safeguard-20b", + "name": "OpenAI: gpt-oss-safeguard-20b", + "display_name": "OpenAI: gpt-oss-safeguard-20b", "modalities": { "input": [ - "image", "text" ], "output": [ @@ -374391,8 +372875,8 @@ ] }, "limit": { - "context": 200000, - "output": 100000 + "context": 131072, + "output": 65536 }, "tool_call": true, "reasoning": { @@ -374403,20 +372887,18 @@ "reasoning": { "supported": true, "default_enabled": true, - "mode": "fixed", - "effort": "medium", - "visibility": "hidden" + "mode": "fixed" } }, - "attachment": true, "type": "chat" }, { - "id": "openai/o3-mini", - "name": "OpenAI: o3 Mini", - "display_name": "OpenAI: o3 Mini", + "id": "openai/o3", + "name": "OpenAI: o3", + "display_name": "OpenAI: o3", "modalities": { "input": [ + "image", "text" ], "output": [ @@ -374444,43 +372926,6 @@ "attachment": true, "type": "chat" }, - { - "id": "openai/o3-mini-high", - "name": "OpenAI: o3 Mini High", - "display_name": "OpenAI: o3 Mini High", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 200000, - "output": 100000 - }, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true, - "effort": "high" - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "high" - ], - "visibility": "hidden" - } - }, - "attachment": true, - "type": "chat" - }, { "id": "openai/o3-mini:batch", "name": "OpenAI: o3 Mini (batch)", @@ -374580,78 +373025,6 @@ "attachment": true, "type": "chat" }, - { - "id": "openai/o4-mini", - "name": "OpenAI: o4 Mini", - "display_name": "OpenAI: o4 Mini", - "modalities": { - "input": [ - "image", - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 200000, - "output": 100000 - }, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "fixed", - "effort": "medium", - "visibility": "hidden" - } - }, - "attachment": true, - "type": "chat" - }, - { - "id": "openai/o4-mini-high", - "name": "OpenAI: o4 Mini High", - "display_name": "OpenAI: o4 Mini High", - "modalities": { - "input": [ - "image", - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 200000, - "output": 100000 - }, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true, - "effort": "high" - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "effort", - "effort": "high", - "effort_options": [ - "high" - ], - "visibility": "hidden" - } - }, - "attachment": true, - "type": "chat" - }, { "id": "openai/o4-mini:batch", "name": "OpenAI: o4 Mini (batch)", @@ -374836,6 +373209,48 @@ }, "type": "chat" }, + { + "id": "particle-ai/particle-1", + "name": "Particle AI: Particle-1", + "display_name": "Particle AI: Particle-1", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1048576, + "output": 131072 + }, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true, + "effort": "high" + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "none", + "minimal", + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + }, + "type": "chat" + }, { "id": "perceptron/perceptron-mk1", "name": "Perceptron: Perceptron Mk1", @@ -375202,6 +373617,37 @@ }, "type": "chat" }, + { + "id": "prism-ml/ternary-bonsai-2-9b", + "name": "PrismML: Ternary Bonsai 2 9B", + "display_name": "PrismML: Ternary Bonsai 2 9B", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 262144, + "output": 65536 + }, + "temperature": true, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true + } + }, + "type": "chat" + }, { "id": "qwen/qwen-2.5-72b-instruct", "name": "Qwen2.5 72B Instruct", @@ -375620,42 +374066,6 @@ }, "type": "chat" }, - { - "id": "qwen/qwen3-next-80b-a3b-thinking", - "name": "Qwen: Qwen3 Next 80B A3B Thinking", - "display_name": "Qwen: Qwen3 Next 80B A3B Thinking", - "modalities": { - "input": [ - "text" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 262144, - "output": 235929 - }, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "default_enabled": true, - "mode": "fixed", - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, - "type": "chat" - }, { "id": "qwen/qwen3-vl-235b-a22b-instruct", "name": "Qwen: Qwen3 VL 235B A22B Instruct", @@ -375820,7 +374230,7 @@ }, "limit": { "context": 262144, - "output": 65536 + "output": 81920 }, "temperature": true, "tool_call": true, @@ -376082,7 +374492,7 @@ }, "limit": { "context": 262144, - "output": 81920 + "output": 65536 }, "tool_call": true, "reasoning": { @@ -376389,7 +374799,7 @@ }, "limit": { "context": 262144, - "output": 235929 + "output": 65536 }, "temperature": true, "tool_call": true, @@ -378079,8 +376489,8 @@ ] }, "limit": { - "context": 1050000, - "output": 945000 + "context": 1000000, + "output": 65536 }, "temperature": true, "tool_call": true, @@ -378109,8 +376519,8 @@ ] }, "limit": { - "context": 1050000, - "output": 945000 + "context": 262144, + "output": 235929 }, "temperature": true, "tool_call": true, @@ -378359,7 +376769,7 @@ ] }, "limit": { - "context": 204800, + "context": 202752, "output": 131072 }, "temperature": true, @@ -378661,8 +377071,8 @@ ] }, "limit": { - "context": 1048575, - "output": 943717 + "context": 1048576, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -379323,6 +377733,154 @@ }, "type": "chat" }, + { + "id": "gpt-6-astra-es", + "name": "gpt-6-astra-es", + "display_name": "gpt-6-astra-es", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1050000, + "output": 128000 + }, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "type": "chat" + }, + { + "id": "claude-fable-5-es-cc", + "name": "claude-fable-5-es-cc", + "display_name": "claude-fable-5-es-cc", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1000000, + "output": 128000 + }, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", + "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", + "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." + ] + } + }, + "type": "chat" + }, + { + "id": "claude-fable-5-1-es-cc", + "name": "claude-fable-5-1-es-cc", + "display_name": "claude-fable-5-1-es-cc", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1000000, + "output": 128000 + }, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "default_enabled": true, + "mode": "effort", + "effort": "high", + "effort_options": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], + "interleaved": true, + "summaries": true, + "visibility": "omitted", + "continuation": [ + "thinking_blocks" + ], + "notes": [ + "Adaptive thinking is always on for Claude Fable 5 and Claude Mythos 5; thinking.type = \"disabled\" is rejected.", + "Manual budget_tokens requests return 400 on Claude Fable 5 and Claude Mythos 5.", + "thinking.display defaults to omitted; set display to summarized to receive readable thinking summaries." + ] + } + }, + "type": "chat" + }, + { + "id": "claude-opus-5-5-es-cc", + "name": "claude-opus-5-5-es-cc", + "display_name": "claude-opus-5-5-es-cc", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1000000, + "output": 128000 + }, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "type": "chat" + }, { "id": "gemini-4-argon", "name": "gemini-4-argon", @@ -383691,6 +382249,30 @@ }, "type": "chat" }, + { + "id": "anthropic/claude-opus-5-5-es-cc", + "name": "claude-opus-5-5-es-cc", + "display_name": "claude-opus-5-5-es-cc", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1000000, + "output": 128000 + }, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "type": "chat" + }, { "id": "gemini-nano-banana-2.1-as", "name": "gemini-nano-banana-2.1-as", @@ -384954,8 +383536,7 @@ "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" @@ -385076,10 +383657,10 @@ ] }, "limit": { - "context": 192000, + "context": 200000, "output": 64000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -385151,18 +383732,17 @@ "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 196608, + "context": 200000, "output": 32000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -385211,10 +383791,10 @@ ] }, "limit": { - "context": 196608, - "output": 64000 + "context": 200000, + "output": 32000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -385269,10 +383849,10 @@ ] }, "limit": { - "context": 983040, + "context": 1000000, "output": 128000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -385328,7 +383908,7 @@ ] }, "limit": { - "context": 1048576, + "context": 1000000, "output": 128000 }, "temperature": false, @@ -385385,7 +383965,7 @@ ] }, "limit": { - "context": 1048576, + "context": 1000000, "output": 128000 }, "temperature": false, @@ -385434,8 +384014,7 @@ "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" @@ -385501,18 +384080,17 @@ "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" ] }, "limit": { - "context": 983040, - "output": 32768 + "context": 200000, + "output": 64000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -385561,10 +384139,10 @@ ] }, "limit": { - "context": 983040, - "output": 128000 + "context": 1000000, + "output": 64000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -385612,8 +384190,7 @@ "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" @@ -385694,42 +384271,6 @@ }, "type": "chat" }, - { - "id": "baidu/ernie-5.0-thinking-preview", - "name": "Baidu: ERNIE 5.0", - "display_name": "Baidu: ERNIE 5.0", - "modalities": { - "input": [ - "text", - "image", - "video" - ], - "output": [ - "text" - ] - }, - "limit": { - "context": 128000, - "output": 64000 - }, - "temperature": true, - "tool_call": true, - "reasoning": { - "supported": true, - "default": true - }, - "extra_capabilities": { - "reasoning": { - "supported": true - } - }, - "attachment": true, - "open_weights": false, - "knowledge": "2025-01-01", - "release_date": "2026-01-22", - "last_updated": "2026-01-22", - "type": "chat" - }, { "id": "baidu/ernie-5.1", "name": "Baidu: ERNIE 5.1", @@ -386167,6 +384708,80 @@ }, "type": "imageGeneration" }, + { + "id": "cloudflare/clef", + "name": "Cloudflare: Clef", + "display_name": "Cloudflare: Clef", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "decisions" + ] + }, + "limit": { + "context": 64000, + "output": 64000 + }, + "tool_call": false, + "reasoning": { + "supported": true, + "default": true + }, + "type": "chat" + }, + { + "id": "cloudflare/clef-flash", + "name": "Cloudflare: Clef Flash", + "display_name": "Cloudflare: Clef Flash", + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "decisions" + ] + }, + "limit": { + "context": 24576, + "output": 24576 + }, + "tool_call": false, + "reasoning": { + "supported": true, + "default": true + }, + "type": "chat" + }, + { + "id": "cloudflare/clef-omni", + "name": "Cloudflare: Clef Omni", + "display_name": "Cloudflare: Clef Omni", + "modalities": { + "input": [ + "text", + "image", + "audio", + "video" + ], + "output": [ + "decisions" + ] + }, + "limit": { + "context": 64000, + "output": 64000 + }, + "tool_call": false, + "reasoning": { + "supported": true, + "default": true + }, + "type": "chat" + }, { "id": "deepseek/deepseek-v3.2", "name": "DeepSeek: DeepSeek V3.2", @@ -386181,7 +384796,7 @@ }, "limit": { "context": 128000, - "output": 32000 + "output": 64000 }, "temperature": true, "tool_call": true, @@ -386191,7 +384806,13 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": false, @@ -386265,7 +384886,7 @@ ] }, "limit": { - "context": 1000000, + "context": 512000, "output": 384000 }, "temperature": true, @@ -386328,7 +384949,13 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": true, @@ -386452,18 +385079,19 @@ "input": [ "text", "image", + "audio", "video", - "audio" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1065535, - "output": 65535 + "context": 1048576, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -386504,18 +385132,19 @@ "input": [ "text", "image", + "audio", "video", - "audio" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1024000, - "output": 64000 + "context": 1048576, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -386555,18 +385184,19 @@ "input": [ "text", "image", + "audio", "video", - "audio" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1065535, - "output": 65535 + "context": 1048576, + "output": 65536 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -386659,7 +385289,8 @@ "text", "image", "video", - "audio" + "audio", + "pdf" ], "output": [ "text" @@ -386745,7 +385376,9 @@ "input": [ "text", "image", - "video" + "video", + "audio", + "pdf" ], "output": [ "text" @@ -386795,16 +385428,15 @@ "input": [ "text", "image", - "video", - "audio" + "pdf" ], "output": [ "text" ] }, "limit": { - "context": 1048576, - "output": 65536 + "context": 1000000, + "output": 65000 }, "temperature": true, "tool_call": true, @@ -386832,8 +385464,7 @@ "input": [ "text", "image", - "video", - "audio" + "pdf" ], "output": [ "text" @@ -386883,8 +385514,7 @@ "input": [ "text", "image", - "video", - "audio" + "pdf" ], "output": [ "text" @@ -386933,9 +385563,7 @@ "modalities": { "input": [ "text", - "image", - "video", - "audio" + "image" ], "output": [ "text" @@ -386984,8 +385612,6 @@ "input": [ "text", "image", - "video", - "audio", "pdf" ], "output": [ @@ -387023,7 +385649,7 @@ }, "limit": { "context": 8192, - "output": 1 + "output": 3072 }, "temperature": false, "tool_call": false, @@ -387044,7 +385670,8 @@ "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" @@ -387052,7 +385679,7 @@ }, "limit": { "context": 262144, - "output": 128000 + "output": 131072 }, "temperature": true, "tool_call": true, @@ -387085,8 +385712,8 @@ ] }, "limit": { - "context": 256000, - "output": 16384 + "context": 262144, + "output": 32768 }, "temperature": true, "tool_call": true, @@ -387199,8 +385826,8 @@ ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 256000, + "output": 32000 }, "temperature": true, "tool_call": true, @@ -387208,17 +385835,6 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, "attachment": false, "open_weights": true, "release_date": "2026-07-23", @@ -387238,8 +385854,8 @@ ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 256000, + "output": 32000 }, "temperature": true, "tool_call": true, @@ -387247,17 +385863,6 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, "attachment": false, "open_weights": true, "release_date": "2026-08-27", @@ -387277,8 +385882,8 @@ ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 256000, + "output": 32000 }, "temperature": true, "tool_call": true, @@ -387286,17 +385891,6 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, "attachment": false, "open_weights": false, "release_date": "2026-09-04", @@ -387310,16 +385904,15 @@ "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 262144, - "output": 32768 + "context": 256000, + "output": 32000 }, "temperature": true, "tool_call": true, @@ -387327,17 +385920,6 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, "attachment": true, "open_weights": true, "release_date": "2026-09-10", @@ -387358,7 +385940,7 @@ }, "limit": { "context": 262144, - "output": 262144 + "output": 32768 }, "temperature": true, "tool_call": true, @@ -387366,17 +385948,6 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, "attachment": false, "open_weights": true, "release_date": "2026-09-29", @@ -387750,8 +386321,7 @@ "input": [ "text", "image", - "pdf", - "video" + "pdf" ], "output": [ "text" @@ -387759,7 +386329,7 @@ }, "limit": { "context": 1048576, - "output": 131072 + "output": 1048576 }, "temperature": true, "tool_call": true, @@ -387769,13 +386339,7 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, "attachment": true, @@ -387792,9 +386356,7 @@ "input": [ "text", "image", - "video", - "pdf", - "audio" + "pdf" ], "output": [ "text" @@ -387802,7 +386364,7 @@ }, "limit": { "context": 1048576, - "output": 131072 + "output": 1048576 }, "temperature": true, "tool_call": true, @@ -387812,13 +386374,7 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, "attachment": true, @@ -387835,9 +386391,7 @@ "input": [ "text", "image", - "video", - "pdf", - "audio" + "pdf" ], "output": [ "text" @@ -387845,7 +386399,7 @@ }, "limit": { "context": 1048576, - "output": 131072 + "output": 1048576 }, "temperature": true, "tool_call": true, @@ -387872,9 +386426,7 @@ "input": [ "text", "image", - "video", - "pdf", - "audio" + "pdf" ], "output": [ "text" @@ -387882,9 +386434,8 @@ }, "limit": { "context": 1048576, - "output": 131072 + "output": 1048576 }, - "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -387912,7 +386463,7 @@ }, "limit": { "context": 1048576, - "output": 131072 + "output": 1048576 }, "temperature": true, "tool_call": true, @@ -388148,8 +386699,8 @@ ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 204000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -388159,6 +386710,7 @@ }, "attachment": false, "open_weights": true, + "knowledge": "2025-01-01", "release_date": "2025-10-27", "last_updated": "2025-10-27", "type": "chat" @@ -388176,7 +386728,7 @@ ] }, "limit": { - "context": 65536, + "context": 65532, "output": 2048 }, "temperature": true, @@ -388203,7 +386755,7 @@ ] }, "limit": { - "context": 204800, + "context": 204000, "output": 131072 }, "temperature": true, @@ -388219,6 +386771,7 @@ }, "attachment": false, "open_weights": true, + "knowledge": "2025-01-01", "release_date": "2025-12-23", "last_updated": "2025-12-23", "type": "chat" @@ -388252,6 +386805,7 @@ }, "attachment": false, "open_weights": true, + "knowledge": "2025-01-01", "release_date": "2026-02-12", "last_updated": "2026-02-12", "type": "chat" @@ -388280,6 +386834,7 @@ }, "attachment": false, "open_weights": true, + "knowledge": "2025-01-01", "release_date": "2026-02-13", "last_updated": "2026-02-13", "type": "chat" @@ -388298,7 +386853,7 @@ }, "limit": { "context": 204800, - "output": 131072 + "output": 131070 }, "temperature": true, "tool_call": true, @@ -388319,6 +386874,7 @@ }, "attachment": false, "open_weights": true, + "knowledge": "2025-01-01", "release_date": "2026-03-18", "last_updated": "2026-03-18", "type": "chat" @@ -388337,7 +386893,7 @@ }, "limit": { "context": 204800, - "output": 131072 + "output": 131070 }, "temperature": true, "tool_call": true, @@ -388358,6 +386914,7 @@ }, "attachment": false, "open_weights": true, + "knowledge": "2025-01-01", "release_date": "2026-03-18", "last_updated": "2026-03-18", "type": "chat" @@ -388377,7 +386934,7 @@ ] }, "limit": { - "context": 1048576, + "context": 1000000, "output": 512000 }, "temperature": true, @@ -388412,7 +386969,7 @@ ] }, "limit": { - "context": 1048576, + "context": 1000000, "output": 512000 }, "temperature": true, @@ -388511,7 +387068,8 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true } }, "attachment": true, @@ -388528,8 +387086,7 @@ "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" @@ -388539,7 +387096,7 @@ "context": 262144, "output": 262144 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -388547,7 +387104,13 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": true, @@ -388583,7 +387146,13 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": true, @@ -388625,8 +387194,7 @@ "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" @@ -388634,9 +387202,9 @@ }, "limit": { "context": 1048576, - "output": 131072 + "output": 262144 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -388644,7 +387212,13 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": true, @@ -388660,8 +387234,7 @@ "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" @@ -388669,7 +387242,7 @@ }, "limit": { "context": 1048576, - "output": 943718 + "output": 131072 }, "temperature": false, "tool_call": true, @@ -388677,6 +387250,17 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, "attachment": true, "open_weights": false, "release_date": "2026-10-23", @@ -388690,8 +387274,7 @@ "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" @@ -388701,23 +387284,11 @@ "context": 1048576, "output": 1048576 }, - "temperature": false, "tool_call": true, "reasoning": { "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, "attachment": true, "open_weights": false, "release_date": "2026-10-23", @@ -388790,7 +387361,8 @@ "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" @@ -388800,7 +387372,7 @@ "context": 1047576, "output": 32768 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": false @@ -388819,7 +387391,8 @@ "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" @@ -388829,7 +387402,7 @@ "context": 1047576, "output": 32768 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": false @@ -388858,7 +387431,7 @@ "context": 1047576, "output": 32768 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": false @@ -388885,9 +387458,9 @@ }, "limit": { "context": 128000, - "output": 8192 + "output": 16384 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": false @@ -388913,10 +387486,10 @@ ] }, "limit": { - "context": 124096, - "output": 4096 + "context": 128000, + "output": 16384 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": false @@ -388996,7 +387569,7 @@ "context": 400000, "output": 128000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -389139,7 +387712,8 @@ "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" @@ -389147,9 +387721,9 @@ }, "limit": { "context": 400000, - "output": 128000 + "output": 272000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -389194,7 +387768,7 @@ "context": 400000, "output": 128000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -389245,7 +387819,7 @@ "context": 400000, "output": 128000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -389285,7 +387859,8 @@ "display_name": "OpenAI: GPT-5.1-Codex-Mini", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "text" @@ -389293,9 +387868,9 @@ }, "limit": { "context": 400000, - "output": 128000 + "output": 100000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -389322,7 +387897,7 @@ "visibility": "hidden" } }, - "attachment": false, + "attachment": true, "open_weights": false, "knowledge": "2024-09-30", "release_date": "2025-11-13", @@ -389346,7 +387921,7 @@ "context": 400000, "output": 128000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -389388,7 +387963,8 @@ "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" @@ -389438,7 +388014,8 @@ "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" @@ -389489,7 +388066,8 @@ "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" @@ -389499,7 +388077,7 @@ "context": 400000, "output": 128000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -389544,15 +388122,14 @@ "pdf" ], "output": [ - "text", - "image" + "text" ] }, "limit": { "context": 1050000, "output": 128000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -389585,7 +388162,7 @@ "knowledge": "2025-08-31", "release_date": "2026-03-05", "last_updated": "2026-03-05", - "type": "imageGeneration" + "type": "chat" }, { "id": "openai/gpt-5.4-mini", @@ -389597,15 +388174,14 @@ "image" ], "output": [ - "text", - "image" + "text" ] }, "limit": { "context": 400000, "output": 128000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -389638,7 +388214,7 @@ "knowledge": "2025-08-31", "release_date": "2026-03-17", "last_updated": "2026-03-17", - "type": "imageGeneration" + "type": "chat" }, { "id": "openai/gpt-5.4-nano", @@ -389650,15 +388226,14 @@ "image" ], "output": [ - "text", - "image" + "text" ] }, "limit": { "context": 400000, "output": 128000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -389691,7 +388266,7 @@ "knowledge": "2025-08-31", "release_date": "2026-03-17", "last_updated": "2026-03-17", - "type": "imageGeneration" + "type": "chat" }, { "id": "openai/gpt-5.4-pro", @@ -389700,18 +388275,18 @@ "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ - "text", - "image" + "text" ] }, "limit": { "context": 1050000, "output": 128000 }, - "temperature": false, + "temperature": true, "tool_call": true, "reasoning": { "supported": true, @@ -389742,7 +388317,7 @@ "knowledge": "2025-08-31", "release_date": "2026-03-05", "last_updated": "2026-03-05", - "type": "imageGeneration" + "type": "chat" }, { "id": "openai/gpt-5.5", @@ -389751,15 +388326,15 @@ "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ - "text", - "image" + "text" ] }, "limit": { - "context": 400000, + "context": 1050000, "output": 128000 }, "temperature": false, @@ -389794,7 +388369,7 @@ "knowledge": "2025-12-01", "release_date": "2026-04-23", "last_updated": "2026-04-23", - "type": "imageGeneration" + "type": "chat" }, { "id": "openai/gpt-5.5-pro", @@ -389803,15 +388378,15 @@ "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ - "text", - "image" + "text" ] }, "limit": { - "context": 400000, + "context": 1050000, "output": 128000 }, "temperature": false, @@ -389830,7 +388405,7 @@ "knowledge": "2025-12-01", "release_date": "2026-04-23", "last_updated": "2026-04-23", - "type": "imageGeneration" + "type": "chat" }, { "id": "openai/gpt-5.6-luna", @@ -390056,15 +388631,46 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2026-05-18", + "knowledge": "2026-05-18", + "release_date": "2026-09-22", + "last_updated": "2026-09-22", + "type": "chat" + }, + { + "id": "openai/gpt-6-sol", + "name": "OpenAI: GPT-6 Sol", + "display_name": "OpenAI: GPT-6 Sol", + "modalities": { + "input": [ + "text", + "image", + "pdf" + ], + "output": [ + "text" + ] + }, + "limit": { + "context": 1050000, + "output": 128000 + }, + "temperature": false, + "tool_call": true, + "reasoning": { + "supported": true, + "default": true + }, + "attachment": true, + "open_weights": false, + "knowledge": "2026-04-20", "release_date": "2026-09-22", "last_updated": "2026-09-22", "type": "chat" }, { - "id": "openai/gpt-6-sol", - "name": "OpenAI: GPT-6 Sol", - "display_name": "OpenAI: GPT-6 Sol", + "id": "openai/gpt-6.1-sol", + "name": "OpenAI: GPT-6.1 Sol", + "display_name": "OpenAI: GPT-6.1 Sol", "modalities": { "input": [ "text", @@ -390087,15 +388693,15 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2026-04-20", - "release_date": "2026-09-22", - "last_updated": "2026-09-22", + "knowledge": "2026-04-30", + "release_date": "2026-09-29", + "last_updated": "2026-09-29", "type": "chat" }, { - "id": "openai/gpt-6.1-sol", - "name": "OpenAI: GPT-6.1 Sol", - "display_name": "OpenAI: GPT-6.1 Sol", + "id": "openai/gpt-6.1-terra", + "name": "OpenAI: GPT-6.1 Terra", + "display_name": "OpenAI: GPT-6.1 Terra", "modalities": { "input": [ "text", @@ -390118,9 +388724,9 @@ }, "attachment": true, "open_weights": false, - "knowledge": "2026-04-30", - "release_date": "2026-09-29", - "last_updated": "2026-09-29", + "knowledge": "2026-06-01", + "release_date": "2026-10-26", + "last_updated": "2026-10-26", "type": "chat" }, { @@ -390137,7 +388743,7 @@ ] }, "limit": { - "context": 128000, + "context": 8192, "output": 8192 }, "temperature": false, @@ -390185,7 +388791,8 @@ "display_name": "OpenAI: GPT-Image-2.5-Flare", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "image" @@ -390200,7 +388807,7 @@ "reasoning": { "supported": false }, - "attachment": false, + "attachment": true, "open_weights": false, "release_date": "2026-09-08", "last_updated": "2026-09-08", @@ -390212,7 +388819,8 @@ "display_name": "OpenAI: GPT-Image-2.5-Sunburst", "modalities": { "input": [ - "text" + "text", + "image" ], "output": [ "image" @@ -390227,7 +388835,7 @@ "reasoning": { "supported": false }, - "attachment": false, + "attachment": true, "open_weights": false, "release_date": "2026-09-08", "last_updated": "2026-09-08", @@ -390579,8 +389187,8 @@ ] }, "limit": { - "context": 1000000, - "output": 64000 + "context": 1020000, + "output": 1020000 }, "temperature": true, "tool_call": true, @@ -390601,6 +389209,7 @@ }, "attachment": true, "open_weights": false, + "knowledge": "2025-01-01", "release_date": "2026-02-23", "last_updated": "2026-02-23", "type": "chat" @@ -390663,7 +389272,7 @@ }, "limit": { "context": 1000000, - "output": 64000 + "output": 65536 }, "temperature": true, "tool_call": true, @@ -390696,7 +389305,8 @@ "input": [ "text", "image", - "video" + "video", + "pdf" ], "output": [ "text" @@ -390746,7 +389356,7 @@ }, "limit": { "context": 1000000, - "output": 65536 + "output": 131072 }, "temperature": true, "tool_call": true, @@ -390778,8 +389388,8 @@ ] }, "limit": { - "context": 1064000, - "output": 64000 + "context": 1000000, + "output": 131072 }, "temperature": true, "tool_call": true, @@ -390813,7 +389423,7 @@ ] }, "limit": { - "context": 1064000, + "context": 1000000, "output": 64000 }, "temperature": true, @@ -390847,7 +389457,7 @@ ] }, "limit": { - "context": 1000000, + "context": 1010000, "output": 131072 }, "temperature": true, @@ -390858,7 +389468,13 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": false, @@ -390874,16 +389490,15 @@ "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1131072, - "output": 131072 + "context": 131072, + "output": 16384 }, "temperature": true, "tool_call": true, @@ -390918,8 +389533,7 @@ "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": true }, "extra_capabilities": { "reasoning": { @@ -390948,14 +389562,13 @@ ] }, "limit": { - "context": 1000000, + "context": 256000, "output": 131072 }, "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": true }, "extra_capabilities": { "reasoning": { @@ -390976,8 +389589,7 @@ "input": [ "text", "image", - "video", - "pdf" + "video" ], "output": [ "text" @@ -391037,8 +389649,7 @@ "modalities": { "input": [ "text", - "image", - "pdf" + "image" ], "output": [ "text" @@ -391046,7 +389657,7 @@ }, "limit": { "context": 1000000, - "output": 128000 + "output": 1000000 }, "temperature": false, "tool_call": true, @@ -391208,22 +389819,20 @@ "modalities": { "input": [ "text", - "image", - "video" + "image" ], "output": [ "text" ] }, "limit": { - "context": 1000000, - "output": 64000 + "context": 1048576, + "output": 1048576 }, "temperature": true, - "tool_call": true, + "tool_call": false, "reasoning": { - "supported": true, - "default": true + "supported": false }, "attachment": true, "open_weights": true, @@ -391245,7 +389854,7 @@ }, "limit": { "context": 262144, - "output": 131072 + "output": 262144 }, "temperature": true, "tool_call": true, @@ -391255,13 +389864,7 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, "attachment": false, @@ -391283,7 +389886,7 @@ ] }, "limit": { - "context": 1048576, + "context": 1024000, "output": 64000 }, "temperature": true, @@ -391294,13 +389897,7 @@ }, "extra_capabilities": { "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] + "supported": true } }, "attachment": false, @@ -391381,7 +389978,7 @@ }, "limit": { "context": 1000000, - "output": 30000 + "output": 1000000 }, "temperature": true, "tool_call": true, @@ -391407,7 +390004,8 @@ "modalities": { "input": [ "text", - "image" + "image", + "pdf" ], "output": [ "text" @@ -391415,7 +390013,7 @@ }, "limit": { "context": 500000, - "output": 65536 + "output": 500000 }, "temperature": true, "tool_call": true, @@ -391440,8 +390038,7 @@ "display_name": "xAI: Grok 4.6", "modalities": { "input": [ - "text", - "image" + "text" ], "output": [ "text" @@ -391449,7 +390046,7 @@ }, "limit": { "context": 500000, - "output": 65536 + "output": 500000 }, "temperature": true, "tool_call": true, @@ -391462,7 +390059,7 @@ "supported": true } }, - "attachment": true, + "attachment": false, "open_weights": false, "knowledge": "2026-02-01", "release_date": "2026-08-12", @@ -391485,7 +390082,7 @@ }, "limit": { "context": 500000, - "output": 65536 + "output": 500000 }, "temperature": true, "tool_call": true, @@ -391520,8 +390117,7 @@ "temperature": true, "tool_call": true, "reasoning": { - "supported": true, - "default": true + "supported": true }, "extra_capabilities": { "reasoning": { @@ -391616,9 +390212,7 @@ "modalities": { "input": [ "text", - "image", - "audio", - "video" + "image" ], "output": [ "text" @@ -391665,6 +390259,17 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, "attachment": true, "open_weights": true, "release_date": "2026-09-22", @@ -391678,9 +390283,7 @@ "modalities": { "input": [ "text", - "image", - "audio", - "video" + "image" ], "output": [ "text" @@ -391809,8 +390412,8 @@ ] }, "limit": { - "context": 131072, - "output": 32768 + "context": 200000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -391818,17 +390421,6 @@ "supported": true, "default": true }, - "extra_capabilities": { - "reasoning": { - "supported": true, - "interleaved": true, - "summaries": true, - "visibility": "summary", - "continuation": [ - "thinking_blocks" - ] - } - }, "attachment": true, "open_weights": true, "knowledge": "2025-04", @@ -391909,8 +390501,8 @@ ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 200000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -391998,6 +390590,17 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, "attachment": false, "open_weights": true, "knowledge": "2025-04", @@ -392018,8 +390621,8 @@ ] }, "limit": { - "context": 204800, - "output": 131072 + "context": 200000, + "output": 128000 }, "temperature": true, "tool_call": true, @@ -392058,7 +390661,7 @@ }, "limit": { "context": 200000, - "output": 131072 + "output": 128000 }, "temperature": true, "tool_call": true, @@ -392068,7 +390671,13 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": false, @@ -392091,7 +390700,7 @@ }, "limit": { "context": 200000, - "output": 131072 + "output": 128000 }, "temperature": true, "tool_call": true, @@ -392101,7 +390710,13 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": false, @@ -392124,7 +390739,7 @@ }, "limit": { "context": 1000000, - "output": 131072 + "output": 128000 }, "temperature": true, "tool_call": true, @@ -392134,7 +390749,13 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": false, @@ -392167,7 +390788,13 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": false, @@ -392183,9 +390810,7 @@ "modalities": { "input": [ "text", - "image", - "video", - "pdf" + "image" ], "output": [ "text" @@ -392203,7 +390828,13 @@ }, "extra_capabilities": { "reasoning": { - "supported": true + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] } }, "attachment": true, @@ -392229,7 +390860,7 @@ }, "limit": { "context": 1000000, - "output": 131072 + "output": 128000 }, "temperature": true, "tool_call": true, @@ -392237,6 +390868,17 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, "attachment": true, "open_weights": true, "release_date": "2026-08-26", @@ -392288,7 +390930,7 @@ }, "limit": { "context": 200000, - "output": 131072 + "output": 128000 }, "temperature": true, "tool_call": true, @@ -392296,6 +390938,17 @@ "supported": true, "default": true }, + "extra_capabilities": { + "reasoning": { + "supported": true, + "interleaved": true, + "summaries": true, + "visibility": "summary", + "continuation": [ + "thinking_blocks" + ] + } + }, "attachment": true, "open_weights": false, "release_date": "2026-04-01", diff --git a/rust-toolchain.toml b/rust-toolchain.toml new file mode 100644 index 0000000000..12dd5258cd --- /dev/null +++ b/rust-toolchain.toml @@ -0,0 +1,4 @@ +[toolchain] +channel = "1.95.0" +profile = "minimal" +components = ["rustfmt", "clippy"] diff --git a/scripts/afterPack.js b/scripts/afterPack.js index 2c835fed18..e5a0ce712c 100644 --- a/scripts/afterPack.js +++ b/scripts/afterPack.js @@ -835,9 +835,13 @@ async function encodeMacVssExtension(context) { async function afterPack(context) { const { targets, appOutDir } = context + await validateProviderCatalog(context) + await validateAcpRegistry(context) + await copyFffNativePackages(context) await copyParcelWatcherNativePackages(context) await copyOpendalNativePackages(context) + await shareHarnessDuckDbNativePackage(context) await packageLightOcrAssets(context) await validateNativeKitPrebuilds(context) await encodeMacVssExtension(context) @@ -847,4 +851,82 @@ async function afterPack(context) { } } +export async function validateProviderCatalog(context) { + const catalogPath = path.join( + getResourcesDir(context), + 'app.asar.unpacked', + 'resources', + 'model-db', + 'providers.json' + ) + const info = await fs.lstat(catalogPath) + if (!info.isFile() || info.isSymbolicLink()) { + throw new Error('Bundled Provider catalog is not a regular file') + } + const catalog = await readJson(catalogPath) + if ( + !catalog.providers || + typeof catalog.providers !== 'object' || + Array.isArray(catalog.providers) || + Object.keys(catalog.providers).length === 0 + ) { + throw new Error('Bundled Provider catalog is empty or invalid') + } +} + +export async function validateAcpRegistry(context) { + const directory = path.join( + getResourcesDir(context), + 'app.asar.unpacked', + 'resources', + 'acp-registry' + ) + const manifestPath = path.join(directory, 'registry.json') + const info = await fs.lstat(manifestPath) + if (!info.isFile() || info.isSymbolicLink()) { + throw new Error('Bundled ACP registry is not a regular file') + } + const manifest = await readJson(manifestPath) + if ( + typeof manifest.version !== 'string' || + !manifest.version.trim() || + !Array.isArray(manifest.agents) || + !manifest.agents.length + ) { + throw new Error('Bundled ACP registry is empty or invalid') + } + for (const agent of manifest.agents) { + if ( + !agent.icon?.startsWith('https://cdn.agentclientprotocol.com/registry/') || + !agent.icon.endsWith('.svg') + ) + continue + if (typeof agent.id !== 'string' || !/^[A-Za-z0-9._-]+$/.test(agent.id)) { + throw new Error('Bundled ACP registry icon has an invalid agent ID') + } + const icon = await fs.lstat(path.join(directory, 'icons', `${agent.id}.svg`)) + if (!icon.isFile() || icon.isSymbolicLink()) { + throw new Error('Bundled ACP registry icon is not a regular file') + } + } +} + +export async function shareHarnessDuckDbNativePackage(context) { + const unpacked = path.join(getResourcesDir(context), 'app.asar.unpacked') + const harness = path.join(unpacked, 'harness') + if (!(await pathExists(harness))) return + const packageName = `@duckdb/node-bindings-${context.electronPlatformName}-${getArchName(context.arch)}` + const sourceDir = path.join(harness, 'node_modules', packageName) + const nativePackage = await readJson(path.join(sourceDir, 'package.json')) + const apiPackage = await readJson( + path.join(harness, 'node_modules', '@duckdb/node-api', 'package.json') + ) + if (nativePackage.name !== packageName || nativePackage.version !== apiPackage.version) { + throw new Error('Harness DuckDB native package identity does not match its API') + } + // Both Knowledge and the standalone Memory runtime resolve this single unpacked native payload. + await copyPackageToUnpackedApp(sourceDir, path.join(unpacked, 'node_modules'), packageName) + await fs.rm(sourceDir, { recursive: true, force: true }) +} + export default afterPack diff --git a/scripts/build-harness.mjs b/scripts/build-harness.mjs new file mode 100644 index 0000000000..e682a9a82a --- /dev/null +++ b/scripts/build-harness.mjs @@ -0,0 +1,130 @@ +#!/usr/bin/env node +import { spawnSync } from 'node:child_process' +import { cp, mkdir, readFile, copyFile, chmod } from 'node:fs/promises' +import { createRequire } from 'node:module' +import path from 'node:path' +import { fileURLToPath, pathToFileURL } from 'node:url' +import { build } from 'vite' + +const repositoryRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..') +const require = createRequire(import.meta.url) +const targets = { + 'darwin-arm64': 'aarch64-apple-darwin', + 'darwin-x64': 'x86_64-apple-darwin', + 'win32-arm64': 'aarch64-pc-windows-msvc', + 'win32-x64': 'x86_64-pc-windows-msvc', + 'linux-arm64': 'aarch64-unknown-linux-gnu', + 'linux-x64': 'x86_64-unknown-linux-gnu' +} + +export async function buildHarness({ platform = process.platform, arch = process.arch } = {}) { + const target = targets[`${platform}-${arch}`] + if (!target) throw new Error(`Unsupported harness target: ${platform}-${arch}`) + const crate = path.join(repositoryRoot, 'crates', 'deepchat-harness') + const output = path.join(repositoryRoot, 'out', 'harness') + const result = spawnSync( + 'cargo', + [ + 'build', + '--locked', + '--release', + '--target', + target, + '--manifest-path', + path.join(crate, 'Cargo.toml') + ], + { cwd: repositoryRoot, stdio: 'inherit' } + ) + if (result.error) throw result.error + if (result.status !== 0) throw new Error(`Harness build failed for ${target}`) + await build({ + configFile: false, + root: repositoryRoot, + publicDir: false, + resolve: { + alias: { + '@': path.join(repositoryRoot, 'src', 'main'), + '@shared': path.join(repositoryRoot, 'src', 'shared') + } + }, + build: { + target: 'node24', + outDir: output, + emptyOutDir: true, + copyPublicDir: false, + lib: { + entry: { + admission: path.join(repositoryRoot, 'src', 'harness', 'plugins', 'admission.ts'), + 'memory-vector': path.join( + repositoryRoot, + 'src', + 'harness', + 'plugins', + 'memory-vector.ts' + ) + }, + formats: ['es'], + fileName: (_, name) => `${name}.mjs` + }, + rollupOptions: { external: [/^node:/, '@duckdb/node-api', '@duckdb/node-bindings'] } + } + }) + const extension = platform === 'win32' ? '.exe' : '' + const binary = path.join(output, `deepchat-harness-${platform}-${arch}${extension}`) + await copyFile( + path.join(crate, 'target', target, 'release', `deepchat-harness${extension}`), + binary + ) + await chmod(binary, 0o755) + const runtimePackage = require.resolve('@arcships/rutis-runtime/package.json') + const runtimeRoot = path.dirname(runtimePackage) + const runtimeOutput = path.join(output, 'node_modules', '@arcships', 'rutis-runtime') + await mkdir(runtimeOutput, { recursive: true }) + await copyFile(runtimePackage, path.join(runtimeOutput, 'package.json')) + await cp(path.join(runtimeRoot, 'src'), path.join(runtimeOutput, 'src'), { recursive: true }) + const runtimeRequire = createRequire(runtimePackage) + // The compiled first-party runtime needs Cordis and WebSocket support, not the TS generator. + const apiPackage = require.resolve('@duckdb/node-api/package.json') + const apiRequire = createRequire(apiPackage) + const bindingsPackage = apiRequire.resolve('@duckdb/node-bindings/package.json') + const bindingsRequire = createRequire(bindingsPackage) + const packages = new Map([ + ...['@deepseek-ai/cordis', '@deepseek-ai/cosmokit', 'ws'].map((name) => [ + name, + runtimeRequire.resolve(`${name}/package.json`) + ]), + ['@duckdb/node-api', apiPackage], + ['@duckdb/node-bindings', bindingsPackage], + ['detect-libc', bindingsRequire.resolve('detect-libc/package.json')], + [ + `@duckdb/node-bindings-${platform}-${arch}`, + bindingsRequire.resolve(`@duckdb/node-bindings-${platform}-${arch}/package.json`) + ] + ]) + for (const [name, packageFile] of packages) { + const source = path.dirname(packageFile) + await cp(source, path.join(output, 'node_modules', name), { + recursive: true, + dereference: true, + filter: (file) => !path.relative(source, file).split(path.sep).includes('node_modules') + }) + } + const pkg = JSON.parse(await readFile(runtimePackage, 'utf8')) + if (pkg.version !== '0.16.0') throw new Error('Rutis SDK/runtime version mismatch') +} + +export default async function beforePack(context) { + const arch = + typeof context.arch === 'string' + ? context.arch + : new Map([ + [1, 'x64'], + [3, 'arm64'] + ]).get(context.arch) + if (!arch) throw new Error(`Unsupported harness package architecture: ${context.arch}`) + await buildHarness({ platform: context.electronPlatformName, arch }) +} + +if (process.argv[1] && pathToFileURL(path.resolve(process.argv[1])).href === import.meta.url) { + await buildHarness() +} diff --git a/scripts/ci/classify-package-impact.mjs b/scripts/ci/classify-package-impact.mjs index 4fe009c258..b16006c6ab 100644 --- a/scripts/ci/classify-package-impact.mjs +++ b/scripts/ci/classify-package-impact.mjs @@ -22,6 +22,8 @@ const sharedPackagePaths = new Set([ 'resources/runtime-versions.json', 'scripts/afterPack.js', 'scripts/build-cli.mjs', + 'scripts/build-harness.mjs', + 'rust-toolchain.toml', 'scripts/build-cua-plugin-runtime.mjs', 'scripts/compare-light-ocr-package-size.mjs', 'scripts/install-runtime.mjs', @@ -30,6 +32,7 @@ const sharedPackagePaths = new Set([ 'scripts/package-plugin.mjs', 'scripts/plugin.mjs', 'scripts/smoke-duckdb-vss.js', + 'scripts/smoke-harness-memory.mjs', 'scripts/smoke-light-ocr.js', 'scripts/smoke-opendal-native.js', 'scripts/ci/check-package-size.mjs', @@ -80,7 +83,11 @@ const packageImpactRules = Object.freeze([ matches: (changedPath) => sharedPackagePaths.has(changedPath) || changedPath.startsWith('.github/actions/light-ocr-package-size/') || - changedPath.startsWith('plugins/') + changedPath.startsWith('plugins/') || + changedPath.startsWith('crates/deepchat-harness/') || + changedPath.startsWith('src/harness/') || + changedPath.startsWith('src/main/harness/') || + changedPath.startsWith('src/shared/harness/') }, { id: 'windows-package-input', diff --git a/scripts/smoke-harness-memory.mjs b/scripts/smoke-harness-memory.mjs new file mode 100644 index 0000000000..4cb24924cd --- /dev/null +++ b/scripts/smoke-harness-memory.mjs @@ -0,0 +1,146 @@ +#!/usr/bin/env node +import assert from 'node:assert/strict' +import { mkdtemp, rm } from 'node:fs/promises' +import os from 'node:os' +import path from 'node:path' +import { fileURLToPath, pathToFileURL } from 'node:url' +import { parseArgs } from 'node:util' +import { build } from 'vite' + +const repositoryRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..') +const { values } = parseArgs({ + args: process.argv.slice(2).filter((arg) => arg !== '--'), + options: { 'resources-path': { type: 'string' }, executable: { type: 'string' } } +}) +assert(values['resources-path'], '--resources-path is required') +assert(values.executable, '--executable is required') +const resourcesPath = path.resolve(values['resources-path']) +const electronExecutable = path.resolve(values.executable) +const temporaryRoot = await mkdtemp(path.join(os.tmpdir(), 'deepchat-harness-smoke-')) + +try { + const outDir = path.join(temporaryRoot, 'client') + await build({ + configFile: false, + root: repositoryRoot, + publicDir: false, + resolve: { + alias: { + '@': path.join(repositoryRoot, 'src', 'main'), + '@shared': path.join(repositoryRoot, 'src', 'shared') + } + }, + build: { + target: 'node24', + outDir, + emptyOutDir: true, + copyPublicDir: false, + lib: { + entry: Object.fromEntries( + ['runtime', 'admission', 'memory-vector'].map((name) => [ + name, + path.join(repositoryRoot, 'src', 'main', 'harness', `${name}.ts`) + ]) + ), + formats: ['es'], + fileName: (_, name) => `${name}.mjs` + }, + rollupOptions: { external: [/^node:/] } + }, + logLevel: 'warn' + }) + const { HarnessRuntime } = await import(pathToFileURL(path.join(outDir, 'runtime.mjs')).href) + const { RutisAgentInvocationAdmission } = await import( + pathToFileURL(path.join(outDir, 'admission.mjs')).href + ) + const { RutisMemoryVectorStores } = await import( + pathToFileURL(path.join(outDir, 'memory-vector.mjs')).href + ) + const embedding = { providerId: 'smoke', modelId: 'smoke' } + for (const restarting of [false, true]) { + const runtime = await HarnessRuntime.start({ + directory: path.join(resourcesPath, 'app.asar.unpacked', 'harness'), + electronExecutable, + capacity: 1, + maxPending: 4, + observe: () => {} + }) + const admission = RutisAgentInvocationAdmission.create({ runtime, capacity: 1, maxPending: 4 }) + const stores = new RutisMemoryVectorStores(runtime, { + memoryDbDir: path.join(temporaryRoot, 'memory'), + host: { + appPath: path.join(resourcesPath, 'app.asar'), + userDataPath: temporaryRoot, + isPackaged: true + } + }) + try { + assert.equal(runtime.memoryIdentity, undefined) + await stores.resetVectorStore('unused') + assert.equal(runtime.memoryIdentity, undefined) + const identity = runtime.identity + const permit = await admission.acquire({ ownerId: 'packaged-memory-smoke' }) + try { + const store = await stores.createVectorStore('smoke', embedding, 2) + assert.equal(store.isUsable(), true) + assert( + ![process.pid, identity.hostPid, identity.runtime.pid].includes( + runtime.memoryIdentity.pid + ) + ) + assert.equal(runtime.memoryIdentity.modules, identity.runtime.modules) + assert.equal(runtime.memoryIdentity.node, identity.runtime.node) + if (restarting) { + assert.deepEqual(await store.listMemoryIds(null, 512), ['other']) + } else { + await store.upsert([ + { memoryId: 'anchor', embedding: [1, 0] }, + { memoryId: 'other', embedding: [1, 0.5] } + ]) + const matches = await store.query([1, 0], { topK: 2 }) + assert.deepEqual( + matches.map((match) => match.memoryId), + ['anchor', 'other'] + ) + assert.equal(matches[0].distance, 0) + assert(Math.abs(matches[1].distance - (1 - 2 / Math.sqrt(5))) < 1e-6) + await store.deleteByMemoryIds(['anchor']) + } + await store.close() + if (restarting) { + await stores.resetVectorStore('smoke') + const cleared = await stores.createVectorStore('smoke', embedding, 2) + assert.deepEqual(await cleared.listMemoryIds(null, 512), []) + await cleared.close() + } + assert.deepEqual(runtime.identity, identity) + console.log('[Harness Smoke] packaged runtime:', { + restarting, + ...identity, + memory: runtime.memoryIdentity + }) + } finally { + permit.release() + } + await admission.run({ ownerId: 'after-memory' }, async () => {}) + assert.equal(runtime.memoryTransport.pending, 0) + } finally { + try { + await admission.close() + await stores.dispose() + } finally { + await runtime.stop() + } + for (const pid of [ + runtime.identity.hostPid, + runtime.identity.runtime.pid, + runtime.memoryIdentity?.pid + ]) { + if (pid) assert.throws(() => process.kill(pid, 0), { code: 'ESRCH' }) + } + } + } + console.log('[Harness Smoke] packaged native read/write, restart, reset and shutdown passed') +} finally { + await rm(temporaryRoot, { recursive: true, force: true }) +} diff --git a/src/harness/admission.ts b/src/harness/admission.ts new file mode 100644 index 0000000000..054eb72253 --- /dev/null +++ b/src/harness/admission.ts @@ -0,0 +1,427 @@ +import { + BoundedNumberRing, + MAX_DIAGNOSTIC_DISTRIBUTION_SAMPLES, + summarizeNumberDistribution +} from '@/lib/boundedNumberRing' +import { BoundedObservationQueue } from '@/lib/boundedObservationQueue' +import { elapsedMonotonicBetween, readMonotonicNow } from '@/lib/monotonicTime' + +import { + snapshotAdmissionCorrelation, + normalizeAdmissionOwnerId, + normalizeAdmissionOwnerLimit, + DEFAULT_AGENT_INVOCATION_CAPACITY, + DEFAULT_AGENT_INVOCATION_MAX_PENDING, + AgentInvocationAdmissionAbortedError, + AgentInvocationAdmissionClosedError, + AgentInvocationAdmissionQueueFullError, + type AgentInvocationAdmissionOptions, + type AgentInvocationAdmissionCorrelation, + type AgentInvocationAdmissionSnapshot, + type AgentInvocationAdmissionObservation, + type AgentInvocationAdmissionDiagnosticsOptions, + type AgentInvocationAdmissionPort, + type AgentInvocationPermit, + type AgentInvocationLease, + type InternalAgentInvocationPermit +} from '@shared/harness/admission' +import { StatefulAgentInvocationLease } from '@shared/harness/lease' + +export * from '@shared/harness/admission' + +type AgentInvocationAdmissionState = Pick< + AgentInvocationAdmissionSnapshot, + 'capacity' | 'active' | 'pending' +> + +interface AdmissionWaiter { + ownerId: string + maxActiveForOwner: number + correlation?: AgentInvocationAdmissionCorrelation + acquisitionSeq: number + queuedAt: number | undefined + resolve: (permit: AgentInvocationPermit) => void + reject: (error: Error) => void + signal?: AbortSignal + onAbort?: () => void + settled: boolean +} + +export class AgentInvocationAdmission implements AgentInvocationAdmissionPort { + private readonly ownerQueues = new Map() + private readonly ownerRing: string[] = [] + private readonly activeByOwner = new Map() + private active = 0 + private pending = 0 + private closedError: AgentInvocationAdmissionClosedError | null = null + private acquisitionSequence = 0 + private activeHighWater = 0 + private pendingHighWater = 0 + private granted = 0 + private rejected = 0 + private readonly waitSamples = new BoundedNumberRing(MAX_DIAGNOSTIC_DISTRIBUTION_SAMPLES) + private readonly holdSamples = new BoundedNumberRing(MAX_DIAGNOSTIC_DISTRIBUTION_SAMPLES) + private readonly observationQueue: BoundedObservationQueue + private readonly now: () => number + + constructor( + private readonly capacity = DEFAULT_AGENT_INVOCATION_CAPACITY, + private readonly maxPending = DEFAULT_AGENT_INVOCATION_MAX_PENDING, + diagnostics: AgentInvocationAdmissionDiagnosticsOptions & { now?: () => number } = {} + ) { + if (!Number.isInteger(capacity) || capacity < 1) { + throw new Error('Agent invocation capacity must be a positive integer.') + } + if (!Number.isInteger(maxPending) || maxPending < 0) { + throw new Error('Agent invocation pending limit must be a non-negative integer.') + } + this.observationQueue = new BoundedObservationQueue({ + observe: diagnostics.observe ?? (() => undefined), + enabled: diagnostics.observe ? (diagnostics.observationsEnabled ?? (() => true)) : () => false + }) + this.now = diagnostics.now ?? performance.now.bind(performance) + } + + acquire(options: AgentInvocationAdmissionOptions): Promise { + let ownerId: string + let maxActiveForOwner: number + try { + ownerId = normalizeAdmissionOwnerId(options.ownerId) + maxActiveForOwner = normalizeAdmissionOwnerLimit(options.maxActiveForOwner, this.capacity) + } catch (error) { + return Promise.reject(error) + } + const acquisitionSeq = this.nextAcquisitionSequence() + const startedAt = readMonotonicNow(this.now) + const correlation = snapshotAdmissionCorrelation(options.correlation) + if (this.closedError) { + this.recordImmediateRejection(correlation, acquisitionSeq, 'closed') + return Promise.reject(this.closedError) + } + if (options.signal?.aborted) { + this.recordImmediateRejection(correlation, acquisitionSeq, 'aborted') + return Promise.reject(new AgentInvocationAdmissionAbortedError()) + } + if ( + this.active < this.capacity && + this.pending === 0 && + this.getActiveForOwner(ownerId) < maxActiveForOwner + ) { + return Promise.resolve(this.grant(ownerId, correlation, acquisitionSeq, startedAt)) + } + if (this.pending >= this.maxPending) { + this.recordImmediateRejection(correlation, acquisitionSeq, 'queue_full') + return Promise.reject(new AgentInvocationAdmissionQueueFullError(this.maxPending)) + } + + return new Promise((resolve, reject) => { + const waiter: AdmissionWaiter = { + ownerId, + maxActiveForOwner, + correlation, + acquisitionSeq, + queuedAt: startedAt, + resolve, + reject, + signal: options.signal, + settled: false + } + if (options.signal) { + waiter.onAbort = () => this.abortWaiter(waiter) + options.signal.addEventListener('abort', waiter.onAbort, { once: true }) + } + const queue = this.ownerQueues.get(ownerId) + if (queue) { + queue.push(waiter) + } else { + this.ownerQueues.set(ownerId, [waiter]) + this.ownerRing.push(ownerId) + } + this.pending += 1 + this.pendingHighWater = Math.max(this.pendingHighWater, this.pending) + if (waiter.correlation) { + this.emit({ + type: 'queued', + ...waiter.correlation, + acquisitionSeq, + ...this.currentState() + }) + } + this.dispatch() + }) + } + + createLease(options: AgentInvocationAdmissionOptions): AgentInvocationLease { + return new StatefulAgentInvocationLease(this, options) + } + + async run(options: AgentInvocationAdmissionOptions, task: () => Promise): Promise { + const permit = await this.acquire(options) + try { + if (options.signal?.aborted) { + throw new AgentInvocationAdmissionAbortedError() + } + return await task() + } finally { + permit.release() + } + } + + close(reason = 'Agent invocation admission is closed.'): void { + if (this.closedError) { + return + } + this.closedError = new AgentInvocationAdmissionClosedError(reason) + for (const queue of this.ownerQueues.values()) { + for (const waiter of queue) { + if (!waiter.settled) this.pending -= 1 + this.rejectWaiter(waiter, this.closedError, 'closed') + } + } + this.ownerQueues.clear() + this.ownerRing.splice(0) + this.pending = 0 + const snapshot = this.snapshot() + this.emit({ + type: 'closed', + capacity: snapshot.capacity, + active: snapshot.active, + pending: snapshot.pending, + activeHighWater: snapshot.activeHighWater, + pendingHighWater: snapshot.pendingHighWater, + granted: snapshot.granted, + rejected: snapshot.rejected, + observationsDropped: snapshot.observationsDropped, + waitMs: snapshot.waitMs, + holdMs: snapshot.holdMs + }) + } + + flushObservations(): Promise { + return this.observationQueue.flush() + } + + snapshot(): AgentInvocationAdmissionSnapshot { + return { + capacity: this.capacity, + active: this.active, + pending: this.pending, + pendingOwners: this.ownerQueues.size, + closed: this.closedError !== null, + activeHighWater: this.activeHighWater, + pendingHighWater: this.pendingHighWater, + granted: this.granted, + rejected: this.rejected, + observationsDropped: this.observationQueue.droppedCount, + waitMs: summarizeNumberDistribution(this.waitSamples.snapshot()), + holdMs: summarizeNumberDistribution(this.holdSamples.snapshot()) + } + } + + private dispatch(): void { + while (this.active < this.capacity && this.pending > 0 && this.ownerRing.length > 0) { + const ownersInRound = this.ownerRing.length + let grantedInRound = false + + for ( + let ownerIndex = 0; + ownerIndex < ownersInRound && this.active < this.capacity; + ownerIndex += 1 + ) { + const ownerId = this.ownerRing.shift()! + const queue = this.ownerQueues.get(ownerId) + if (!queue || queue.length === 0) { + this.ownerQueues.delete(ownerId) + continue + } + + const waiter = queue[0] + if (this.getActiveForOwner(ownerId) >= waiter.maxActiveForOwner) { + this.ownerRing.push(ownerId) + continue + } + + queue.shift() + if (queue.length > 0) { + this.ownerRing.push(ownerId) + } else { + this.ownerQueues.delete(ownerId) + } + if (waiter.settled) { + continue + } + + waiter.settled = true + this.detachAbort(waiter) + this.pending -= 1 + grantedInRound = true + waiter.resolve( + this.grant(ownerId, waiter.correlation, waiter.acquisitionSeq, waiter.queuedAt) + ) + } + + if (!grantedInRound) { + return + } + } + } + + private abortWaiter(waiter: AdmissionWaiter): void { + if (waiter.settled) { + return + } + const queue = this.ownerQueues.get(waiter.ownerId) + if (queue) { + const index = queue.indexOf(waiter) + if (index >= 0) { + queue.splice(index, 1) + } + if (queue.length === 0) { + this.ownerQueues.delete(waiter.ownerId) + const ownerIndex = this.ownerRing.indexOf(waiter.ownerId) + if (ownerIndex >= 0) { + this.ownerRing.splice(ownerIndex, 1) + } + } + } + this.pending -= 1 + this.rejectWaiter(waiter, new AgentInvocationAdmissionAbortedError(), 'aborted') + this.dispatch() + } + + private rejectWaiter(waiter: AdmissionWaiter, error: Error, reason: 'aborted' | 'closed'): void { + if (waiter.settled) { + return + } + waiter.settled = true + this.detachAbort(waiter) + this.rejected += 1 + const waitMs = this.elapsedSince(waiter.queuedAt) + if (waitMs !== undefined) this.waitSamples.push(waitMs) + if (waiter.correlation) { + this.emit({ + type: 'rejected', + ...waiter.correlation, + acquisitionSeq: waiter.acquisitionSeq, + ...(waitMs === undefined ? {} : { waitMs }), + reason, + ...this.currentState() + }) + } + waiter.reject(error) + } + + private detachAbort(waiter: AdmissionWaiter): void { + if (waiter.signal && waiter.onAbort) { + waiter.signal.removeEventListener('abort', waiter.onAbort) + } + } + + private getActiveForOwner(ownerId: string): number { + return this.activeByOwner.get(ownerId) ?? 0 + } + + private grant( + ownerId: string, + correlation: AgentInvocationAdmissionCorrelation | undefined, + acquisitionSeq: number, + startedAt: number | undefined + ): InternalAgentInvocationPermit { + this.active += 1 + this.activeByOwner.set(ownerId, this.getActiveForOwner(ownerId) + 1) + this.activeHighWater = Math.max(this.activeHighWater, this.active) + this.granted += 1 + const grantedAt = readMonotonicNow(this.now) + const waitMs = elapsedMonotonicBetween(startedAt, grantedAt) + if (waitMs !== undefined) this.waitSamples.push(waitMs) + if (correlation) { + this.emit({ + type: 'granted', + ...correlation, + acquisitionSeq, + ...(waitMs === undefined ? {} : { waitMs }), + ...this.currentState() + }) + } + let released = false + const releaseWithReason: InternalAgentInvocationPermit['releaseWithReason'] = (reason) => { + if (released) { + return + } + if (this.active <= 0) { + throw new Error('Agent invocation permit accounting underflow.') + } + const ownerActive = this.getActiveForOwner(ownerId) + if (ownerActive <= 0) { + throw new Error(`Agent invocation owner permit accounting underflow: ${ownerId}`) + } + released = true + this.active -= 1 + if (ownerActive === 1) { + this.activeByOwner.delete(ownerId) + } else { + this.activeByOwner.set(ownerId, ownerActive - 1) + } + const holdMs = this.elapsedSince(grantedAt) + if (holdMs !== undefined) this.holdSamples.push(holdMs) + if (correlation) { + this.emit({ + type: 'released', + ...correlation, + acquisitionSeq, + ...(holdMs === undefined ? {} : { holdMs }), + reason, + active: this.active, + pending: this.pending + }) + } + this.dispatch() + } + return { + release: () => releaseWithReason('permit_released'), + releaseWithReason + } + } + + private recordImmediateRejection( + correlation: AgentInvocationAdmissionCorrelation | undefined, + acquisitionSeq: number, + reason: 'queue_full' | 'aborted' | 'closed' + ): void { + this.rejected += 1 + if (!correlation) return + this.emit({ + type: 'rejected', + ...correlation, + acquisitionSeq, + waitMs: 0, + reason, + ...this.currentState() + }) + } + + private currentState(): AgentInvocationAdmissionState { + return { capacity: this.capacity, active: this.active, pending: this.pending } + } + + private nextAcquisitionSequence(): number { + this.acquisitionSequence = + this.acquisitionSequence >= Number.MAX_SAFE_INTEGER ? 1 : this.acquisitionSequence + 1 + return this.acquisitionSequence + } + + private elapsedSince(startedAt: number | undefined): number | undefined { + return elapsedMonotonicBetween(startedAt, readMonotonicNow(this.now)) + } + + private emit(observation: AgentInvocationAdmissionObservation): void { + if (observation.type !== 'closed') { + this.observationQueue.enqueue(observation) + return + } + this.observationQueue.enqueueWithDroppedCount((observationsDropped) => ({ + ...observation, + observationsDropped + })) + } +} diff --git a/src/harness/memory-vector.ts b/src/harness/memory-vector.ts new file mode 100644 index 0000000000..85dd7b1d96 --- /dev/null +++ b/src/harness/memory-vector.ts @@ -0,0 +1,411 @@ +import { AsyncSemaphore } from '@/lib/asyncSemaphore' +import fs from 'node:fs' +import path from 'node:path' +import { DuckDBInstance } from '@duckdb/node-api' +import { MemoryVectorStore, type PackedMemoryVectors } from '@/memory/infra/memoryVectorStore' +import { + createMemoryVectorStorePaths, + MEMORY_VECTOR_OWNER_FILE, + MEMORY_VECTOR_LEASE_SUFFIX +} from '@/memory/infra/memoryVectorStorePaths' +import { isSafeAgentId } from '@shared/types/agent-memory' +import { + isDuckDbFatalError, + MemoryVectorStoreQuarantineRequiredError +} from '@/memory/infra/vectorStoreErrors' +import { + decodeMemoryVector, + isMemoryVectorControl, + MEMORY_VECTOR_PENDING, + MEMORY_VECTOR_NATIVE_PART_BYTES, + MemoryVectorNativeCommandSchema, + MemoryVectorConfigSchema, + type MemoryVectorNativeCommand, + type MemoryVectorConfig +} from '@shared/harness/memory-vector' + +interface Resource { + agentId: string + dimensions: number + opening: Promise + tail: Promise + closing: boolean + openingDone: boolean + writes: number + disposal?: Promise +} + +interface Upload { + id: string + resource: string + memoryIds: string[] + bytes: Buffer + offset: number + committing: boolean + records: ReturnType> + writing: Promise +} + +export class MemoryVectorOwner { + private readonly config: MemoryVectorConfig + private readonly resources = new Map() + private readonly agents = new Map() + private readonly jobs = new AsyncSemaphore(2) + private readonly operations = new Set() + private readonly recovered = new Set() + private readonly quarantined = new Set() + private upload: Upload | undefined + private stopped = false + private readonly ownership: Promise + + constructor(config: MemoryVectorConfig) { + this.config = MemoryVectorConfigSchema.parse(config) + const memoryDbDir = this.config.memoryDbDir + this.ownership = (async () => { + fs.mkdirSync(memoryDbDir, { recursive: true }) + let owner: DuckDBInstance + try { + owner = await DuckDBInstance.create(path.join(memoryDbDir, MEMORY_VECTOR_OWNER_FILE), { + threads: '1', + memory_limit: '16MB' + }) + } catch { + const error = new Error('Memory vector file ownership is unavailable') + error.name = 'MemoryVectorOwnershipUnavailableError' + throw error + } + try { + if (this.stopped) throw new Error('Memory vector owner is stopping') + for (const entry of fs.readdirSync(memoryDbDir, { withFileTypes: true })) { + const suffix = entry.name.endsWith(MEMORY_VECTOR_LEASE_SUFFIX) + ? MEMORY_VECTOR_LEASE_SUFFIX + : entry.name.endsWith('.v2.duckdb.quarantine') + ? '.v2.duckdb.quarantine' + : undefined + if (!entry.isFile() || !suffix) continue + const agentId = entry.name.slice(0, -suffix.length) + if (!isSafeAgentId(agentId)) continue + this.recovered.add(agentId) + MemoryVectorStore.markQuarantined(this.paths(agentId)) + } + MemoryVectorStore.recoverQuarantinedStores(memoryDbDir) + return owner + } catch (error) { + owner.closeSync() + throw error + } + })() + void this.ownership.catch(() => undefined) + } + + async command(input: unknown): Promise { + const command = MemoryVectorNativeCommandSchema.parse(input) + if (this.stopped || command.generation !== this.config.generation) { + throw new Error('Memory vector generation is unavailable') + } + if ( + this.operations.has(command.operation) || + this.operations.size >= + (isMemoryVectorControl(command.method) ? MEMORY_VECTOR_PENDING : MEMORY_VECTOR_PENDING - 8) + ) { + throw new Error('Memory vector operation limit exceeded') + } + this.operations.add(command.operation) + try { + await this.ownership + if (this.stopped) throw new Error('Memory vector owner is stopping') + return await this.execute(command) + } finally { + this.operations.delete(command.operation) + } + } + + async dispose(): Promise { + this.stopped = true + this.upload?.records.reject(new Error('Memory vector owner is stopping')) + this.upload = undefined + await Promise.all([...this.resources].map(([id, resource]) => this.close(id, resource, true))) + const owner = await this.ownership.catch(() => undefined) + owner?.closeSync() + } + + private paths(agentId: string) { + return createMemoryVectorStorePaths(this.config.memoryDbDir, agentId) + } + + private lease(agentId: string) { + return `${this.paths(agentId).current}.lease` + } + + private quarantine(agentId: string): void { + this.quarantined.add(agentId) + const id = this.agents.get(agentId) + const resource = id ? this.resources.get(id) : undefined + if (resource) resource.closing = true + try { + MemoryVectorStore.markQuarantined(this.paths(agentId)) + } catch (error) { + throw new MemoryVectorStoreQuarantineRequiredError('Vector quarantine marker failed', { + cause: error + }) + } + } + + private assertRecoverable(agentId: string): void { + if (this.quarantined.has(agentId)) + throw new MemoryVectorStoreQuarantineRequiredError( + 'Native vector recovery requires a new process' + ) + } + + private async execute(command: MemoryVectorNativeCommand): Promise { + if (command.method === 'open') { + this.assertRecoverable(command.agentId) + if (this.resources.has(command.resource) || this.agents.has(command.agentId)) { + throw new Error('Memory vector store already has an owner') + } + if (fs.existsSync(this.lease(command.agentId))) { + this.recovered.add(command.agentId) + MemoryVectorStore.markQuarantined(this.paths(command.agentId)) + } + fs.writeFileSync(this.lease(command.agentId), '') + const opening = this.jobs.run(() => + MemoryVectorStore.create( + this.paths(command.agentId), + command.dimensions, + command.embedding, + this.config.host + ) + ) + const resource: Resource = { + agentId: command.agentId, + dimensions: command.dimensions, + opening, + tail: opening, + closing: false, + openingDone: false, + writes: 0 + } + this.resources.set(command.resource, resource) + this.agents.set(command.agentId, command.resource) + void opening.then( + () => { + resource.openingDone = true + }, + () => { + resource.openingDone = true + } + ) + try { + const store = await opening + if (resource.closing) throw new Error('Memory vector resource was revoked while opening') + return { + resource: command.resource, + usable: store.isUsable() && !this.recovered.has(command.agentId) + } + } catch (error) { + if ( + error instanceof MemoryVectorStoreQuarantineRequiredError || + isDuckDbFatalError(error) + ) { + this.quarantine(resource.agentId) + throw error + } + // Failed or late opens remain owned until the native promise has settled and cleanup runs. + await this.close(command.resource, resource) + throw error + } + } + if (command.method === 'reset' || command.method === 'quarantine') { + const id = this.agents.get(command.agentId) + const resource = id ? this.resources.get(id) : undefined + if (command.method === 'quarantine') { + this.quarantine(command.agentId) + return null + } + this.assertRecoverable(command.agentId) + if (id && resource) await this.close(id, resource) + if (command.method === 'reset') { + MemoryVectorStore.destroyFiles(this.paths(command.agentId)) + this.recovered.delete(command.agentId) + } + return null + } + const resource = this.resources.get(command.resource) + if (command.method === 'close') { + if (resource) await this.close(command.resource, resource, command.preserveLease) + return null + } + if (!resource || resource.closing) throw new Error('Memory vector resource is unavailable') + switch (command.method) { + case 'query': { + const vector = decodeMemoryVector( + Buffer.from(command.vector, 'base64'), + resource.dimensions + ) + return this.run(resource, (store) => store.query(vector, { topK: command.topK })) + } + case 'queryByMemoryId': + return this.run(resource, (store) => + store.queryByMemoryId(command.memoryId, { topK: command.topK }) + ) + case 'delete': + return this.run(resource, (store) => store.deleteByMemoryIds(command.memoryIds), true) + case 'list': + return this.run(resource, (store) => store.listMemoryIds(command.afterId, command.limit)) + case 'upsert': { + const complete = command.offset === 0 && command.data.length === command.bytes + if ( + !(command.data.buffer instanceof ArrayBuffer) || + new Set(command.memoryIds).size !== command.memoryIds.length || + command.bytes !== command.memoryIds.length * resource.dimensions * 4 + ) + throw new Error('Invalid memory vector upload shape') + if (command.offset === 0) { + if (this.upload) throw new Error('Memory vector upload is busy') + const bytes = complete + ? Buffer.from(command.data.buffer, command.data.byteOffset, command.data.byteLength) + : Buffer.allocUnsafe(command.bytes) + const records = Promise.withResolvers() + void records.promise.catch(() => undefined) + const writing = this.run(resource, async (store) => { + const batch = await records.promise + if (resource.closing || this.recovered.has(resource.agentId) || !store.isUsable()) + throw new Error('Memory vector resource is unavailable') + resource.writes++ + try { + await store.upsertPacked(batch) + } finally { + resource.writes-- + } + }) + void writing.catch(() => undefined) + this.upload = { + id: command.upload, + resource: command.resource, + memoryIds: command.memoryIds, + bytes, + offset: 0, + committing: false, + records, + writing + } + } + const upload = this.upload + if ( + !upload || + upload.id !== command.upload || + upload.resource !== command.resource || + upload.committing + ) + throw new Error('Memory vector upload is unavailable') + try { + if ( + command.offset !== upload.offset || + command.bytes !== upload.bytes.length || + command.memoryIds.length !== upload.memoryIds.length || + command.memoryIds.some((id, index) => id !== upload.memoryIds[index]) || + command.data.length > MEMORY_VECTOR_NATIVE_PART_BYTES || + command.data.length > upload.bytes.length - upload.offset + ) + throw new Error('Invalid memory vector upload part') + if (!complete) upload.bytes.set(command.data, upload.offset) + upload.offset += command.data.length + if (upload.offset !== upload.bytes.length) return null + upload.committing = true + upload.records.resolve({ + memoryIds: upload.memoryIds, + dimensions: resource.dimensions, + bytes: upload.bytes + }) + await upload.writing + return null + } catch (error) { + upload.records.reject(error) + await upload.writing.catch(() => undefined) + if (this.upload === upload) this.upload = undefined + throw error + } finally { + if (upload.committing || upload.offset === upload.bytes.length) this.upload = undefined + } + } + case 'abort': + if ( + this.upload?.id === command.upload && + this.upload.resource === command.resource && + !this.upload.committing + ) { + const upload = this.upload + upload.records.reject(new Error('Memory vector upload was aborted')) + await upload.writing.catch(() => undefined) + if (this.upload === upload) this.upload = undefined + } + return null + } + } + + private run( + resource: Resource, + task: (store: MemoryVectorStore) => Promise, + write = false + ): Promise { + if (write) resource.writes++ + const result = resource.tail + .catch(() => undefined) + .then(async () => { + const store = await resource.opening + try { + return await this.jobs.run(() => { + if (resource.closing || this.recovered.has(resource.agentId) || !store.isUsable()) + throw new Error('Memory vector resource is unavailable') + return task(store) + }) + } catch (error) { + if ( + error instanceof MemoryVectorStoreQuarantineRequiredError || + isDuckDbFatalError(error) + ) { + this.quarantine(resource.agentId) + } + throw error + } + }) + .finally(() => { + if (write) resource.writes-- + }) + resource.tail = result + return result + } + + private close(id: string, resource: Resource, preserveLease = false): Promise { + if (this.upload?.resource === id && !this.upload.committing) { + this.upload.records.reject(new Error('Memory vector resource is closing')) + this.upload = undefined + } + if (resource.disposal) return resource.disposal + resource.closing = true + const dirty = preserveLease || resource.writes > 0 || !resource.openingDone + resource.disposal = (async () => { + await resource.tail.catch(() => undefined) + this.assertRecoverable(resource.agentId) + const store = await resource.opening.catch(() => undefined) + if (store) { + try { + await this.jobs.run(() => store.close()) + } catch (error) { + this.quarantine(resource.agentId) + throw new MemoryVectorStoreQuarantineRequiredError( + 'Native vector close failed; recovery requires a new process', + { cause: error } + ) + } + } + if (!dirty) fs.rmSync(this.lease(resource.agentId), { force: true }) + if (this.resources.get(id) === resource) { + this.resources.delete(id) + this.agents.delete(resource.agentId) + } + })() + return resource.disposal + } +} diff --git a/src/harness/plugins/admission.ts b/src/harness/plugins/admission.ts new file mode 100644 index 0000000000..c66bedfab4 --- /dev/null +++ b/src/harness/plugins/admission.ts @@ -0,0 +1,190 @@ +import { definePlugin } from '@arcships/rutis' +import { AgentInvocationAdmission } from '../admission' +import type { + AgentInvocationAdmissionObservation, + AgentInvocationAdmissionOptions, + InternalAgentInvocationPermit +} from '@shared/harness/admission' + +export default definePlugin<{ capacity: number; maxPending: number }>({ + name: 'deepchat-admission', + config: { + type: 'object', + required: ['capacity', 'maxPending'], + additionalProperties: false, + properties: { + capacity: { type: 'integer', minimum: 1 }, + maxPending: { type: 'integer', minimum: 0 } + } + }, + provides: { + harnessAdmission: { + acquire: 'async', + release: 'async', + snapshot: 'async', + close: 'async', + flushObservations: 'async', + dispatch: 'async' + } + }, + apply(ctx, config) { + let observationsEnabled = false + let observationsDropped = 0 + let observationSequence = 0 + const observations = new Set>() + const forwardObservation = (observation: AgentInvocationAdmissionObservation) => { + if (observations.size >= 512 && observation.type !== 'closed') { + observationsDropped += 1 + return + } + const value = + observation.type === 'closed' + ? { + ...observation, + observationsDropped: observation.observationsDropped + observationsDropped + } + : observation + const task = ctx + .parallel('deepchat/admission/observation', ++observationSequence, value) + .catch(() => undefined) + .finally(() => observations.delete(task)) + observations.add(task) + } + const admission = new AgentInvocationAdmission(config.capacity, config.maxPending, { + observationsEnabled: () => observationsEnabled, + observe: forwardObservation + }) + const permits = new Map< + string, + { controller: AbortController; permit?: InternalAgentInvocationPermit } + >() + const flushObservations = async () => { + await admission.flushObservations() + await Promise.all(observations) + } + const snapshot = () => ({ + admission: { + ...admission.snapshot(), + observationsDropped: admission.snapshot().observationsDropped + observationsDropped + }, + runtime: { + pid: process.pid, + node: process.versions.node, + electron: process.versions.electron ?? null, + modules: process.versions.modules + } + }) + + ctx.effect(async () => { + admission.close() + for (const record of permits.values()) { + record.controller.abort() + record.permit?.release() + } + permits.clear() + await flushObservations() + }) + + const service = { + async acquire( + id: string, + options: Omit & { aborted?: boolean }, + signal: AbortSignal, + enabled: boolean + ): Promise { + if (!(signal instanceof AbortSignal)) throw new Error('Admission requires an AbortSignal') + observationsEnabled = enabled === true + if (typeof id !== 'string' || !/^[0-9a-f-]{36}$/.test(id) || permits.has(id)) { + throw new Error('Invalid admission acquisition identity') + } + const record: { controller: AbortController; permit?: InternalAgentInvocationPermit } = { + controller: new AbortController() + } + permits.set(id, record) + if (options.aborted === true) record.controller.abort() + const cancellation = AbortSignal.any([ctx.signal, signal, record.controller.signal]) + try { + const permit = await admission.acquire({ ...options, signal: cancellation }) + record.permit = permit as InternalAgentInvocationPermit + if (cancellation.aborted) { + permit.release() + cancellation.throwIfAborted() + } + return id + } catch (error) { + if (permits.get(id) === record) permits.delete(id) + throw error + } + }, + release( + id: string, + reason: 'permit_released' | 'lease_suspended' | 'lease_released', + enabled: boolean + ): boolean { + if (!['permit_released', 'lease_suspended', 'lease_released'].includes(reason)) { + throw new Error('Invalid admission release reason') + } + observationsEnabled = enabled === true + const record = permits.get(id) + if (!record) return false + permits.delete(id) + record.controller.abort() + record.permit?.releaseWithReason(reason) + return true + }, + snapshot, + async close(reason: string, enabled: boolean) { + observationsEnabled = enabled === true + admission.close(reason) + await flushObservations() + }, + flushObservations + } + let nextRequest = 1 + const requests = new Map< + number, + { + method: keyof typeof service + args: unknown[] + resolve: (value: unknown) => void + reject: (error: unknown) => void + } + >() + ctx.effect(() => { + for (const request of requests.values()) + request.reject(new Error('Admission generation ended')) + requests.clear() + }) + ctx.provide('harnessAdmission', { + ...service, + dispatch(sequence: number, method: string, args: unknown[]): Promise { + if ( + !Number.isSafeInteger(sequence) || + sequence < nextRequest || + sequence - nextRequest > 1024 || + requests.has(sequence) || + !Object.hasOwn(service, method) || + !Array.isArray(args) + ) { + throw new Error('Invalid admission command sequence') + } + return new Promise((resolve, reject) => { + requests.set(sequence, { method: method as keyof typeof service, args, resolve, reject }) + while (requests.has(nextRequest)) { + const request = requests.get(nextRequest)! + requests.delete(nextRequest++) + try { + // Start in caller order; a queued acquire must not block later release commands. + Promise.resolve(Reflect.apply(service[request.method], undefined, request.args)).then( + request.resolve, + request.reject + ) + } catch (error) { + request.reject(error) + } + } + }) + } + }) + } +}) diff --git a/src/harness/plugins/memory-vector.ts b/src/harness/plugins/memory-vector.ts new file mode 100644 index 0000000000..657ea57f7b --- /dev/null +++ b/src/harness/plugins/memory-vector.ts @@ -0,0 +1,76 @@ +import { definePlugin } from '@arcships/rutis' +import { MemoryVectorOwner } from '../memory-vector' +import { + MEMORY_VECTOR_PENDING, + type MemoryVectorNativeCommand, + type MemoryVectorConfig +} from '@shared/harness/memory-vector' +import { + isDuckDbFatalError, + MemoryVectorStoreQuarantineRequiredError +} from '@/memory/infra/vectorStoreErrors' + +export default definePlugin({ + name: 'deepchat-memory-vector', + provides: { harnessMemoryVector: { dispatch: 'async', identity: 'async' } }, + apply(ctx, config) { + const owner = new MemoryVectorOwner(config) + let nextRequest = 1 + const requests = new Map< + number, + { + command: unknown + resolve: (value: unknown) => void + reject: (error: unknown) => void + } + >() + ctx.effect(async () => { + for (const request of requests.values()) + request.reject(new Error('Memory vector generation ended')) + requests.clear() + await owner.dispose() + }) + ctx.provide('harnessMemoryVector', { + identity: () => ({ + generation: config.generation, + pid: process.pid, + node: process.versions.node, + modules: process.versions.modules + }), + dispatch(sequence: number, command: unknown): Promise { + if ( + !Number.isSafeInteger(sequence) || + sequence < nextRequest || + sequence - nextRequest >= MEMORY_VECTOR_PENDING || + requests.has(sequence) + ) { + throw new Error('Invalid memory vector command sequence') + } + return new Promise((resolve, reject) => { + requests.set(sequence, { command, resolve, reject }) + while (requests.has(nextRequest)) { + const request = requests.get(nextRequest)! + requests.delete(nextRequest++) + // Start in wire order; close must fence an opening native handle without waiting for it. + owner.command(request.command).then( + (value) => { + // Poisoned native handles cannot run GC finalizers before the file owner dies. + if ((request.command as MemoryVectorNativeCommand).method === 'quarantine') + process.kill(process.pid, 'SIGKILL') + else request.resolve(value) + }, + (error) => { + if ( + error instanceof MemoryVectorStoreQuarantineRequiredError || + isDuckDbFatalError(error) + ) + process.kill(process.pid, 'SIGKILL') + else request.reject(error) + } + ) + } + }) + } + }) + } +}) diff --git a/src/main/agent/acp/catalog/acpRegistryConstants.ts b/src/main/agent/acp/catalog/acpRegistryConstants.ts index 605197fc1d..6cb62730ca 100644 --- a/src/main/agent/acp/catalog/acpRegistryConstants.ts +++ b/src/main/agent/acp/catalog/acpRegistryConstants.ts @@ -5,12 +5,6 @@ export const ACP_REGISTRY_ICON_PREFIX = 'https://cdn.agentclientprotocol.com/reg export const ACP_REGISTRY_CACHE_TTL_MS = 60 * 60 * 1000 -export const ACP_REGISTRY_RESOURCE_DIR = ['resources', 'acp-registry'] as const - -export const ACP_REGISTRY_RESOURCE_PATH = ['resources', 'acp-registry', 'registry.json'] as const - -export const ACP_REGISTRY_ICON_RESOURCE_DIR = ['resources', 'acp-registry', 'icons'] as const - export const ACP_REGISTRY_ICON_CACHE_DIRNAME = 'icons' const ACP_REGISTRY_FILE_SEGMENT_PATTERN = /^[A-Za-z0-9._-]+$/ diff --git a/src/main/agent/acp/catalog/acpRegistryService.ts b/src/main/agent/acp/catalog/acpRegistryService.ts index 67a9b3041b..4f294541e4 100644 --- a/src/main/agent/acp/catalog/acpRegistryService.ts +++ b/src/main/agent/acp/catalog/acpRegistryService.ts @@ -1,6 +1,5 @@ import fs from 'fs' import path from 'path' -import { app, net } from 'electron' import type { AcpRegistryAgent } from '@shared/types/acp' import type { AcpRegistryBinaryDistribution, @@ -11,9 +10,6 @@ import { SVGSanitizer } from '@/lib/svgSanitizer' import { ACP_REGISTRY_CACHE_TTL_MS, ACP_REGISTRY_ICON_CACHE_DIRNAME, - ACP_REGISTRY_ICON_RESOURCE_DIR, - ACP_REGISTRY_RESOURCE_DIR, - ACP_REGISTRY_RESOURCE_PATH, ACP_REGISTRY_URL, getAcpRegistryIconFileName, isAcpRegistryIconUrl @@ -31,7 +27,10 @@ type RegistryManifest = { agents: AcpRegistryAgent[] } -type AcpRegistryServiceOptions = { +export type AcpRegistryServiceOptions = { + userDataDirectory: string + builtInDirectory: string + fetchIcon: (url: string, signal: AbortSignal) => Promise isPrivacyModeEnabled?: () => boolean } @@ -218,11 +217,15 @@ export class AcpRegistryService { private readonly iconMarkupCache = new Map>() private readonly isPrivacyModeEnabled: () => boolean private manifest: RegistryManifest | null = null + private readonly stopController = new AbortController() + private refreshPromise: Promise | null = null - constructor(options: AcpRegistryServiceOptions = {}) { + constructor(private readonly options: AcpRegistryServiceOptions) { + if (!path.isAbsolute(options.userDataDirectory) || !path.isAbsolute(options.builtInDirectory)) { + throw new Error('ACP registry directories must be absolute') + } this.isPrivacyModeEnabled = options.isPrivacyModeEnabled ?? (() => false) - const userDataPath = app.getPath('userData') - this.cacheDir = path.join(userDataPath, 'acp-registry') + this.cacheDir = path.join(options.userDataDirectory, 'acp-registry') this.cacheFilePath = path.join(this.cacheDir, 'registry.json') this.metaFilePath = path.join(this.cacheDir, 'meta.json') this.iconCacheDir = path.join(this.cacheDir, ACP_REGISTRY_ICON_CACHE_DIRNAME) @@ -235,18 +238,25 @@ export class AcpRegistryService { } } - async initialize(): Promise { + initialize(): void { + if (this.stopController.signal.aborted) return this.manifest = this.loadFromBuiltIn() ?? this.loadFromCache() const cached = this.loadFromCache() if (cached) { this.manifest = cached } + } - if (this.isAutomaticRefreshBlocked()) { - return - } + stop(): void { + this.stopController.abort() + } + + get isStopped(): boolean { + return this.stopController.signal.aborted + } - await this.refreshIfNeeded(false, { automatic: true }) + async drain(): Promise { + await Promise.allSettled([this.refreshPromise]) } listAgents(): AcpRegistryAgent[] { @@ -258,8 +268,11 @@ export class AcpRegistryService { return agent ? clone(agent) : null } - async refresh(force = false): Promise { - await this.refreshIfNeeded(force) + async refresh( + force = false, + options: { automatic?: boolean; signal?: AbortSignal } = {} + ): Promise { + await this.refreshIfNeeded(force, options) return this.listAgents() } @@ -270,6 +283,8 @@ export class AcpRegistryService { return null } + if (this.stopController.signal.aborted) return null + if (normalizedIconUrl && !isAcpRegistryIconUrl(normalizedIconUrl)) { return null } @@ -284,13 +299,15 @@ export class AcpRegistryService { this.iconMarkupCache.set(normalizedAgentId, pending) } - return await pending + const markup = await pending + return this.stopController.signal.aborted ? null : markup } private getManifest(): RegistryManifest { if (this.manifest) { return this.manifest } + this.stopController.signal.throwIfAborted() this.manifest = this.loadFromCache() ?? this.loadFromBuiltIn() if (!this.manifest) { @@ -331,21 +348,13 @@ export class AcpRegistryService { } private loadFromBuiltIn(): RegistryManifest | null { - for (const candidate of this.getBuiltInManifestCandidatePaths()) { - try { - if (!fs.existsSync(candidate)) { - continue - } - const parsed = JSON.parse(fs.readFileSync(candidate, 'utf-8')) - const normalized = normalizeManifest(parsed) - if (normalized) { - return normalized - } - } catch (error) { - console.warn('[ACP Registry] Failed to load built-in snapshot:', candidate, error) - } + const file = path.join(this.options.builtInDirectory, 'registry.json') + try { + if (!fs.existsSync(file)) return null + return normalizeManifest(JSON.parse(fs.readFileSync(file, 'utf-8'))) + } catch (error) { + console.warn('[ACP Registry] Failed to load built-in snapshot:', file, error) } - return null } @@ -353,12 +362,17 @@ export class AcpRegistryService { force: boolean, options: { automatic?: boolean + signal?: AbortSignal } = {} ): Promise { + this.stopController.signal.throwIfAborted() + options.signal?.throwIfAborted() if (options.automatic && this.isAutomaticRefreshBlocked()) { return } + if (this.refreshPromise) return this.refreshPromise + const meta = this.readMeta() const now = Date.now() const expired = !meta || now - meta.lastUpdated > ACP_REGISTRY_CACHE_TTL_MS @@ -367,7 +381,10 @@ export class AcpRegistryService { return } - await this.fetchAndCache(meta) + this.refreshPromise = this.fetchAndCache(meta, options.signal).finally(() => { + this.refreshPromise = null + }) + await this.refreshPromise } private isAutomaticRefreshBlocked(): boolean { @@ -378,15 +395,28 @@ export class AcpRegistryService { } } - private async fetchAndCache(previousMeta: RegistryCacheMeta | null): Promise { + private async fetchAndCache( + previousMeta: RegistryCacheMeta | null, + callerSignal?: AbortSignal + ): Promise { const now = Date.now() const controller = new AbortController() const timeout = setTimeout(() => controller.abort(), 15000) + const signal = AbortSignal.any([ + this.stopController.signal, + controller.signal, + ...(callerSignal ? [callerSignal] : []) + ]) + const assertCurrent = () => { + this.stopController.signal.throwIfAborted() + callerSignal?.throwIfAborted() + } try { const response = await fetch(ACP_REGISTRY_URL, { - signal: controller.signal + signal }) + assertCurrent() if (!response.ok) { if (previousMeta) { @@ -396,6 +426,7 @@ export class AcpRegistryService { } const text = await response.text() + assertCurrent() if (!text || text.length > 5 * 1024 * 1024) { if (previousMeta) { this.writeMeta({ ...previousMeta, lastAttemptedAt: now }) @@ -411,15 +442,17 @@ export class AcpRegistryService { return } - const tmpPath = `${this.cacheFilePath}.tmp` - fs.writeFileSync(tmpPath, JSON.stringify(normalized, null, 2), 'utf-8') - fs.renameSync(tmpPath, this.cacheFilePath) - try { - await this.syncIconCache(normalized) + await this.syncIconCache(normalized, signal) } catch (error) { + assertCurrent() console.warn('[ACP Registry] Failed to sync icon cache after manifest refresh:', error) } + assertCurrent() + + const tmpPath = `${this.cacheFilePath}.tmp` + fs.writeFileSync(tmpPath, JSON.stringify(normalized, null, 2), 'utf-8') + fs.renameSync(tmpPath, this.cacheFilePath) this.writeMeta({ version: normalized.version, @@ -430,6 +463,7 @@ export class AcpRegistryService { this.manifest = normalized } catch (error) { + assertCurrent() if (previousMeta) { this.writeMeta({ ...previousMeta, lastAttemptedAt: now }) } @@ -439,26 +473,6 @@ export class AcpRegistryService { } } - private getBuiltInResourceRoots(): string[] { - return [ - path.join(app.getAppPath(), ...ACP_REGISTRY_RESOURCE_DIR), - path.join(process.cwd(), ...ACP_REGISTRY_RESOURCE_DIR) - ] - } - - private getBuiltInManifestCandidatePaths(): string[] { - return this.getBuiltInResourceRoots().map((root) => - path.join(root, path.basename(ACP_REGISTRY_RESOURCE_PATH.at(-1)!)) - ) - } - - private getBuiltInIconCandidatePaths(agentId: string): string[] { - const filename = getAcpRegistryIconFileName(agentId) - return this.getBuiltInResourceRoots().map((root) => - path.join(root, path.basename(ACP_REGISTRY_ICON_RESOURCE_DIR.at(-1)!), filename) - ) - } - private getCachedIconPath(agentId: string): string { return path.join(this.iconCacheDir, getAcpRegistryIconFileName(agentId)) } @@ -469,13 +483,12 @@ export class AcpRegistryService { return cachedPath } - for (const candidate of this.getBuiltInIconCandidatePaths(agentId)) { - if (fs.existsSync(candidate)) { - return candidate - } - } - - return null + const builtInPath = path.join( + this.options.builtInDirectory, + ACP_REGISTRY_ICON_CACHE_DIRNAME, + getAcpRegistryIconFileName(agentId) + ) + return fs.existsSync(builtInPath) ? builtInPath : null } private async loadIconMarkupFromDisk(agentId: string): Promise { @@ -497,7 +510,8 @@ export class AcpRegistryService { } } - private async syncIconCache(manifest: RegistryManifest): Promise { + private async syncIconCache(manifest: RegistryManifest, signal: AbortSignal): Promise { + signal.throwIfAborted() fs.mkdirSync(this.iconCacheDir, { recursive: true }) const cacheableAgents = manifest.agents.filter( @@ -505,12 +519,13 @@ export class AcpRegistryService { ) const expectedAgentIds = new Set(cacheableAgents.map((agent) => agent.id)) - await Promise.allSettled(cacheableAgents.map((agent) => this.syncAgentIcon(agent))) + await Promise.allSettled(cacheableAgents.map((agent) => this.syncAgentIcon(agent, signal))) + signal.throwIfAborted() this.pruneStaleIconCache(expectedAgentIds) this.iconMarkupCache.clear() } - private async syncAgentIcon(agent: AcpRegistryAgent): Promise { + private async syncAgentIcon(agent: AcpRegistryAgent, refreshSignal: AbortSignal): Promise { const iconUrl = agent.icon?.trim() if (!iconUrl || !isAcpRegistryIconUrl(iconUrl)) { return @@ -518,17 +533,11 @@ export class AcpRegistryService { const controller = new AbortController() const timeout = setTimeout(() => controller.abort(), 10000) + const signal = AbortSignal.any([refreshSignal, controller.signal]) try { - const response = await net.fetch(iconUrl, { - signal: controller.signal - }) - - if (!response.ok) { - throw new Error(`Failed to fetch icon: ${response.status} ${response.statusText}`) - } - - const text = await response.text() + const text = await this.options.fetchIcon(iconUrl, signal) + signal.throwIfAborted() const sanitized = this.svgSanitizer.sanitize(text) if (!sanitized) { throw new Error(`Failed to sanitize icon for agent ${agent.id}`) diff --git a/src/main/agent/acp/catalog/settings.ts b/src/main/agent/acp/catalog/settings.ts index 0f115bac06..2bf674fb3b 100644 --- a/src/main/agent/acp/catalog/settings.ts +++ b/src/main/agent/acp/catalog/settings.ts @@ -1,4 +1,3 @@ -import ElectronStore from 'electron-store' import { nanoid } from 'nanoid' import type { AcpAgentConfig } from '@shared/types/acp' import type { @@ -10,7 +9,7 @@ import type { AcpLegacyBuiltinAgentId, AcpManualAgent } from '@shared/types/acp' -import { McpSettings } from '@/mcp/settings' +import type { McpSettings } from '@/mcp/settings' import { ACP_LEGACY_AGENT_ID_ALIASES, resolveAcpAgentAlias } from '@shared/utils/acpAgentAlias' import type { StoreLike } from '@/config/storeLike' import type { AgentDatabase } from '@/agent/data/database' @@ -166,23 +165,27 @@ const getActiveLegacyProfile = (agent: AcpBuiltinAgent): AcpAgentProfile | null ) } +export function createAcpCatalogDefaults(): InternalStore { + return { + enabled: false, + version: ACP_STORE_VERSION, + registryStates: {}, + manualAgents: [], + installStates: {}, + sharedMcpSelections: [] + } +} + export class AcpCatalogSettings { private store: StoreLike> - private readonly mcpSettings: McpSettings + private readonly mcpSettings: Pick - constructor(options: { mcpSettings: McpSettings }) { + constructor(options: { + mcpSettings: Pick + store: StoreLike> + }) { this.mcpSettings = options.mcpSettings - this.store = new ElectronStore({ - name: 'acp_agents', - defaults: { - enabled: false, - version: ACP_STORE_VERSION, - registryStates: {}, - manualAgents: [], - installStates: {}, - sharedMcpSelections: [] - } - }) + this.store = options.store this.ensureStoreInitialized() } @@ -195,10 +198,9 @@ export class AcpCatalogSettings { } connectDatabase(database: AgentDatabase): void { - this.store = new AcpDbStore( - this.store as StoreLike>, - () => database.catalogSettingsTable - ) as StoreLike> + this.store = new AcpDbStore(this.store.store, () => database.catalogSettingsTable) as StoreLike< + InternalStore & Record + > } getGlobalEnabled(): boolean { @@ -242,36 +244,6 @@ export class AcpCatalogSettings { return state ? clone(state) : null } - setAgentEnabled(agentId: string, enabled: boolean): void { - const resolvedId = resolveAcpAgentAlias(agentId) - const manualAgents = this.getManualAgents() - const manualIndex = manualAgents.findIndex((agent) => agent.id === resolvedId) - if (manualIndex !== -1) { - manualAgents[manualIndex].enabled = enabled - this.store.set('manualAgents', manualAgents) - return - } - - const states = this.getRegistryStates() - states[resolvedId] = normalizeRegistryState(resolvedId, states[resolvedId], { enabled }) - states[resolvedId].enabled = enabled - states[resolvedId].updatedAt = Date.now() - this.store.set('registryStates', states) - } - - setAgentEnvOverride(agentId: string, env: Record): void { - const resolvedId = resolveAcpAgentAlias(agentId) - const states = this.getRegistryStates() - states[resolvedId] = normalizeRegistryState(resolvedId, states[resolvedId]) - states[resolvedId].envOverride = normalizeEnv(env) - states[resolvedId].updatedAt = Date.now() - this.store.set('registryStates', states) - } - - getAgentEnvOverride(agentId: string): Record | undefined { - return this.getRegistryStates()[resolveAcpAgentAlias(agentId)]?.envOverride - } - getManualAgents(): AcpManualAgent[] { const raw = this.store.get('manualAgents') if (!Array.isArray(raw)) { @@ -295,80 +267,11 @@ export class AcpCatalogSettings { this.store.set('sharedMcpSelections', validated) } - addManualAgent(agent: Omit & { id?: string }): AcpManualAgent { - const normalized = normalizeManualAgent( - { - ...agent, - id: agent.id ?? nanoid(8) - }, - { enabled: agent.enabled } - ) - - if (!normalized) { - throw new Error('Invalid ACP manual agent payload') - } - - const manualAgents = this.getManualAgents() - const next = manualAgents.filter((item) => item.id !== normalized.id) - next.push(normalized) - this.store.set('manualAgents', next) - return normalized - } - - updateManualAgent( - agentId: string, - updates: Partial> - ): AcpManualAgent | null { - const manualAgents = this.getManualAgents() - const index = manualAgents.findIndex((agent) => agent.id === agentId) - if (index === -1) { - return null - } - - const normalized = normalizeManualAgent( - { - ...manualAgents[index], - ...updates, - id: agentId - }, - { enabled: updates.enabled ?? manualAgents[index].enabled } - ) - - if (!normalized) { - return null - } - - manualAgents[index] = normalized - this.store.set('manualAgents', manualAgents) - return normalized - } - - removeManualAgent(agentId: string): boolean { - const manualAgents = this.getManualAgents() - const next = manualAgents.filter((agent) => agent.id !== agentId) - if (next.length === manualAgents.length) { - return false - } - this.store.set('manualAgents', next) - return true - } - getInstallState(agentId: string): AcpAgentInstallState | null { const installStates = this.getInstallStates() return installStates[resolveAcpAgentAlias(agentId)] ?? null } - setInstallState(agentId: string, state: AcpAgentInstallState | null): void { - const resolvedId = resolveAcpAgentAlias(agentId) - const installStates = this.getInstallStates() - if (!state) { - delete installStates[resolvedId] - } else { - installStates[resolvedId] = state - } - this.store.set('installStates', installStates) - } - getInstallStates(): Record { const raw = this.store.get('installStates') if (!raw || typeof raw !== 'object' || Array.isArray(raw)) { diff --git a/src/main/agent/acp/catalog/settingsDbStore.ts b/src/main/agent/acp/catalog/settingsDbStore.ts index 05a92a5390..2973a358a7 100644 --- a/src/main/agent/acp/catalog/settingsDbStore.ts +++ b/src/main/agent/acp/catalog/settingsDbStore.ts @@ -4,10 +4,14 @@ import type { StoreLike } from '@/config/storeLike' const clone = (value: T): T => JSON.parse(JSON.stringify(value)) as T export class AcpDbStore implements StoreLike> { + private readonly legacySnapshot: Record + constructor( - private readonly legacyStore: StoreLike>, + legacySnapshot: Record, private readonly getSettingsTable: () => AgentCatalogSettingsTable - ) {} + ) { + this.legacySnapshot = clone(legacySnapshot) + } private get settingsTable(): AgentCatalogSettingsTable { return this.getSettingsTable() @@ -32,12 +36,19 @@ export class AcpDbStore implements StoreLike> { const value = this.settingsTable.getAgentSetting(key) return value === undefined ? defaultValue : value } - const legacyValue = this.legacyStore.get(key) + const legacyValue = this.legacySnapshot[key] as TValue | undefined return legacyValue === undefined ? defaultValue : clone(legacyValue) } set(keyOrValues: string | Record, value?: unknown): void { if (typeof keyOrValues !== 'string') { + if ( + Object.keys(keyOrValues).some( + (key) => key !== 'enabled' && key !== 'version' && key !== 'sharedMcpSelections' + ) + ) { + throw new Error('Legacy ACP settings are read-only after database attachment') + } for (const [key, nextValue] of Object.entries(keyOrValues)) this.set(key, nextValue) return } @@ -51,7 +62,7 @@ export class AcpDbStore implements StoreLike> { this.settingsTable.setAgentSetting(keyOrValues, value) return } - this.legacyStore.set(keyOrValues, value) + throw new Error('Legacy ACP settings are read-only after database attachment') } delete(key: string): void { @@ -63,11 +74,11 @@ export class AcpDbStore implements StoreLike> { this.settingsTable.deleteAgentSetting(key) return } - this.legacyStore.delete(key) + throw new Error('Legacy ACP settings are read-only after database attachment') } private getLegacyStoreSnapshot(): Record { - const snapshot = { ...this.legacyStore.store } + const snapshot = clone(this.legacySnapshot) delete snapshot.enabled delete snapshot.version delete snapshot.sharedMcpSelections diff --git a/src/main/agent/acp/client/connection/AcpConnectionManager.ts b/src/main/agent/acp/client/connection/AcpConnectionManager.ts index 4ef65431b7..0748655d00 100644 --- a/src/main/agent/acp/client/connection/AcpConnectionManager.ts +++ b/src/main/agent/acp/client/connection/AcpConnectionManager.ts @@ -5,6 +5,7 @@ import { AcpProcessManager, type AcpProcessHandle } from '@/agent/acp/runtime' import type { AcpConnectionRef, AcpRegistryPort, StartAcpConnectionInput } from '../types' import { PROTOCOL_VERSION } from '@agentclientprotocol/sdk' import type { DeepChatEventPublisher } from '@/agent/deepchat/runtime/types' +import type { AcpRuntimeBootstrap } from '../../runtime/types' export class AcpConnectionManager { readonly processManager: AcpProcessManager @@ -13,9 +14,11 @@ export class AcpConnectionManager { provider: LLM_PROVIDER, agentSettings: AgentSettingsPort, registry: AcpRegistryPort, - publishEvent: DeepChatEventPublisher + publishEvent: DeepChatEventPublisher, + bootstrap: AcpRuntimeBootstrap ) { this.processManager = new AcpProcessManager({ + bootstrap, publishEvent, providerId: provider.id, resolveLaunchSpec: (agentId, workdir) => agentSettings.resolveAcpLaunchSpec(agentId, workdir), diff --git a/src/main/agent/acp/client/index.ts b/src/main/agent/acp/client/index.ts index b922786db3..138666158b 100644 --- a/src/main/agent/acp/client/index.ts +++ b/src/main/agent/acp/client/index.ts @@ -4,6 +4,7 @@ import { AcpSessionController, AcpSessionPersistence, type AcpSessionCapabilityEvents, + type AcpRuntimeBootstrap, type AcpProcessHandle, type AcpSessionRecord } from '@/agent/acp/runtime' @@ -27,6 +28,7 @@ export class AcpClientRuntime { readonly sessionController: AcpSessionController constructor(input: { + bootstrap: AcpRuntimeBootstrap provider: LLM_PROVIDER agentSettings: AgentSettingsPort mcpSettings: McpSettings @@ -40,7 +42,8 @@ export class AcpClientRuntime { input.provider, input.agentSettings, input.registry, - input.publishEvent + input.publishEvent, + input.bootstrap ) this.sessionRuntime = new AcpSessionRuntime({ providerId: input.provider.id, diff --git a/src/main/agent/acp/createRuntimeOwner.ts b/src/main/agent/acp/createRuntimeOwner.ts index 71da64ce31..eea84eaaec 100644 --- a/src/main/agent/acp/createRuntimeOwner.ts +++ b/src/main/agent/acp/createRuntimeOwner.ts @@ -3,9 +3,11 @@ import type { AgentSettingsPort } from '@/agent/settings' import type { DeepChatEventPublisher } from '@/agent/deepchat/runtime/types' import { AcpClientRuntime, AcpRuntimeOwner, type AcpRegistryPort } from './client' import { AcpSessionPersistence } from './runtime' +import type { AcpRuntimeBootstrap } from './runtime/types' import type { McpSettings } from '@/mcp/settings' export interface AcpRuntimeOwnerDependencies { + bootstrap: AcpRuntimeBootstrap providerConfig: Pick agentSettings: AgentSettingsPort mcpSettings: McpSettings @@ -23,6 +25,7 @@ export function createAcpRuntimeOwner(dependencies: AcpRuntimeOwnerDependencies) const provider = dependencies.providerConfig.getProviderById('acp') if (!provider) throw new Error('[ACP] Provider configuration not found') return new AcpClientRuntime({ + bootstrap: dependencies.bootstrap, publishEvent: dependencies.publishEvent, provider, agentSettings: dependencies.agentSettings, diff --git a/src/main/agent/acp/launch/acpLaunchSpecService.ts b/src/main/agent/acp/launch/acpLaunchSpecService.ts index 1bfbaed85d..fded44e9bd 100644 --- a/src/main/agent/acp/launch/acpLaunchSpecService.ts +++ b/src/main/agent/acp/launch/acpLaunchSpecService.ts @@ -4,6 +4,7 @@ import path from 'path' import { execFileSync } from 'child_process' import { createHash } from 'crypto' import { unzipSync } from 'fflate' +import { replaceDirectory } from '@/toolchains/extract' import type { AcpAgentConfig } from '@shared/types/acp' import type { AcpAgentInstallState, @@ -89,6 +90,17 @@ const listFilesRecursive = (root: string): string[] => { export class AcpLaunchSpecService { private readonly installRoot: string + private stopped = false + private readonly uninstallingAgents = new Set() + private readonly installations = new Map< + string, + { + agentId: string + controller: AbortController + repair: boolean + promise: Promise + } + >() constructor(registryRoot: string) { this.installRoot = path.join(registryRoot, 'agents') @@ -151,7 +163,61 @@ export class AcpLaunchSpecService { async ensureRegistryAgentInstalled( agent: AcpRegistryAgent, currentState: AcpAgentInstallState | null, - options?: { repair?: boolean } + options?: { repair?: boolean; signal?: AbortSignal } + ): Promise { + if (this.stopped) throw new DOMException('ACP installer is stopping', 'AbortError') + if (this.uninstallingAgents.has(agent.id)) throw new Error('ACP uninstall is in progress') + options?.signal?.throwIfAborted() + const key = JSON.stringify([agent.id, agent.version]) + const existing = this.installations.get(key) + if (existing) { + if (!options?.repair || existing.repair) return existing.promise + await existing.promise.catch(() => undefined) + existing.controller.signal.throwIfAborted() + return this.ensureRegistryAgentInstalled(agent, currentState, options) + } + if (this.installations.size >= 32) throw new Error('Too many pending ACP installations') + const controller = new AbortController() + const signal = options?.signal + ? AbortSignal.any([controller.signal, options.signal]) + : controller.signal + const promise = Promise.resolve() + .then(() => { + signal.throwIfAborted() + return this.installRegistryAgent(agent, currentState, options?.repair === true, signal) + }) + .finally(() => { + if (this.installations.get(key)?.promise === promise) this.installations.delete(key) + }) + this.installations.set(key, { + agentId: agent.id, + controller, + repair: options?.repair === true, + promise + }) + return promise + } + + stop(): void { + this.stopped = true + this.cancelPendingInstallations() + } + + cancelPendingInstallations(agentId?: string): void { + for (const job of this.installations.values()) { + if (!agentId || job.agentId === agentId) job.controller.abort() + } + } + + async drain(): Promise { + await Promise.allSettled([...this.installations.values()].map((job) => job.promise)) + } + + private async installRegistryAgent( + agent: AcpRegistryAgent, + currentState: AcpAgentInstallState | null, + repair: boolean, + signal: AbortSignal ): Promise { const selection = this.selectRegistryDistribution(agent) const lastCheckedAt = Date.now() @@ -180,9 +246,13 @@ export class AcpLaunchSpecService { const binaryConfig = selection.binary const installDir = this.getBinaryInstallDir(agent) + const previousDir = `${installDir}.prev` + if (!fs.existsSync(installDir) && fs.existsSync(previousDir)) { + fs.renameSync(previousDir, installDir) + } const commandPath = this.resolveInstalledBinaryPath(installDir, binaryConfig.cmd) - if (!options?.repair && commandPath) { + if (!repair && commandPath) { return { status: 'installed', distributionType: 'binary', @@ -194,24 +264,26 @@ export class AcpLaunchSpecService { } } + let stagingDir: string | undefined try { - if (options?.repair && fs.existsSync(installDir)) { - fs.rmSync(installDir, { recursive: true, force: true }) - } - ensureDir(installDir) - + signal.throwIfAborted() + ensureDir(path.dirname(installDir)) + stagingDir = fs.mkdtempSync(`${installDir}.staging-`) const downloadedArchive = await this.downloadArchive( binaryConfig.archive, agent, - binaryConfig.sha256 + binaryConfig.sha256, + signal ) try { - await this.extractArchive(downloadedArchive.archivePath, installDir) + signal.throwIfAborted() + await this.extractArchive(downloadedArchive.archivePath, stagingDir) + signal.throwIfAborted() } finally { fs.rmSync(downloadedArchive.tempDir, { recursive: true, force: true }) } - const installedCommand = this.resolveInstalledBinaryPath(installDir, binaryConfig.cmd) + const installedCommand = this.resolveInstalledBinaryPath(stagingDir, binaryConfig.cmd) if (!installedCommand) { throw new Error(`Installed archive does not contain ${binaryConfig.cmd}`) } @@ -219,6 +291,14 @@ export class AcpLaunchSpecService { if (process.platform !== 'win32') { fs.chmodSync(installedCommand, 0o755) } + signal.throwIfAborted() + fs.rmSync(previousDir, { recursive: true, force: true }) + replaceDirectory(stagingDir, installDir) + try { + fs.rmSync(previousDir, { recursive: true, force: true }) + } catch (error) { + console.warn('[ACP] Failed to remove the previous installation:', error) + } return { status: 'installed', @@ -230,6 +310,7 @@ export class AcpLaunchSpecService { error: null } } catch (error) { + signal.throwIfAborted() return { status: 'error', distributionType: 'binary', @@ -239,6 +320,8 @@ export class AcpLaunchSpecService { installDir, error: error instanceof Error ? error.message : String(error) } + } finally { + if (stagingDir) fs.rmSync(stagingDir, { recursive: true, force: true }) } } @@ -246,28 +329,45 @@ export class AcpLaunchSpecService { agent: AcpRegistryAgent, installState: AcpAgentInstallState | null ): Promise { - const selection = this.selectRegistryDistribution(agent) - if (selection?.type !== 'binary') { - return - } + if (this.stopped) throw new DOMException('ACP installer is stopping', 'AbortError') + if (this.uninstallingAgents.has(agent.id)) throw new Error('ACP uninstall is in progress') + this.uninstallingAgents.add(agent.id) + try { + this.cancelPendingInstallations(agent.id) + await Promise.allSettled( + [...this.installations.values()] + .filter((job) => job.agentId === agent.id) + .map((job) => job.promise) + ) + if (this.stopped) throw new DOMException('ACP installer is stopping', 'AbortError') + const selection = this.selectRegistryDistribution(agent) + if (selection?.type !== 'binary') { + return + } - const candidateDirs = new Set() - if (typeof installState?.installDir === 'string' && installState.installDir.trim()) { - candidateDirs.add(path.resolve(installState.installDir)) - } - candidateDirs.add(this.getBinaryInstallDir(agent)) + const candidateDirs = new Set() + if (typeof installState?.installDir === 'string' && installState.installDir.trim()) { + candidateDirs.add(path.resolve(installState.installDir)) + } + candidateDirs.add(this.getBinaryInstallDir(agent)) - for (const installDir of candidateDirs) { - this.removeInstallDir(installDir) - } + for (const installDir of candidateDirs) { + this.removeInstallDir(installDir) + } - this.pruneEmptyAgentInstallRoot(agent.id) + this.pruneEmptyAgentInstallRoot(agent.id) + } finally { + this.uninstallingAgents.delete(agent.id) + } } async resolveRegistryLaunchSpec( agent: AcpRegistryAgent, - installState: AcpAgentInstallState | null + installState: AcpAgentInstallState | null, + signal?: AbortSignal ): Promise { + if (this.stopped) throw new DOMException('ACP installer is stopping', 'AbortError') + signal?.throwIfAborted() const selection = this.selectRegistryDistribution(agent) if (!selection) { throw new Error( @@ -276,7 +376,7 @@ export class AcpLaunchSpecService { } if (selection.type === 'binary') { - const ensuredState = await this.ensureRegistryAgentInstalled(agent, installState) + const ensuredState = await this.ensureRegistryAgentInstalled(agent, installState, { signal }) if (ensuredState.status !== 'installed' || !ensuredState.installDir) { throw new Error(ensuredState.error || `Failed to install ACP agent ${agent.id}`) } @@ -407,7 +507,8 @@ export class AcpLaunchSpecService { private async downloadArchive( url: string, agent: AcpRegistryAgent, - expectedSha256?: string + expectedSha256: string | undefined, + signal: AbortSignal ): Promise { const safeAgentId = sanitizeInstallSegment(agent.id, 'agent id') const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), `deepchat-acp-${safeAgentId}-`)) @@ -417,14 +518,18 @@ export class AcpLaunchSpecService { throw new Error(`Invalid archive URL for ACP registry agent ${agent.id}`) } const archivePath = path.join(tempDir, archiveName) - const response = await fetch(url, { - signal: AbortSignal.timeout(ACP_BINARY_DOWNLOAD_TIMEOUT_MS) - }) + const downloadSignal = AbortSignal.any([ + signal, + AbortSignal.timeout(ACP_BINARY_DOWNLOAD_TIMEOUT_MS) + ]) + const response = await fetch(url, { signal: downloadSignal }) + downloadSignal.throwIfAborted() if (!response.ok) { throw new Error(`Failed to download archive: ${response.status} ${response.statusText}`) } const archive = Buffer.from(await response.arrayBuffer()) + downloadSignal.throwIfAborted() if (expectedSha256 !== undefined) { const normalizedSha256 = expectedSha256.trim().toLowerCase() if (!SHA256_PATTERN.test(normalizedSha256)) { diff --git a/src/main/agent/acp/runtime/acpProcessManager.ts b/src/main/agent/acp/runtime/acpProcessManager.ts index aedd898f13..f4873d101e 100644 --- a/src/main/agent/acp/runtime/acpProcessManager.ts +++ b/src/main/agent/acp/runtime/acpProcessManager.ts @@ -5,7 +5,6 @@ import spawn from 'cross-spawn' import type { ChildProcessWithoutNullStreams } from 'child_process' import { Readable, Writable } from 'node:stream' import { randomUUID } from 'node:crypto' -import { app } from 'electron' import * as fs from 'fs' import * as path from 'path' import { client, PROTOCOL_VERSION, RequestError } from '@agentclientprotocol/sdk' @@ -24,7 +23,7 @@ import type { AcpResolvedLaunchSpec } from '@shared/types/acp' import type { DeepChatEventPublisher } from '@/agent/deepchat/runtime/types' -import type { AgentProcessHandle, AgentProcessManager } from './types' +import type { AcpRuntimeBootstrap, AgentProcessHandle, AgentProcessManager } from './types' import { getPathEntriesFromEnv, getShellEnvironment, @@ -32,7 +31,7 @@ import { setPathEntriesOnEnv } from '@/agent/shared/process/shellEnvHelper' import { childProcessRegistry } from '@/agent/shared/process/childProcessRegistry' -import { RuntimeHelper } from '@/lib/runtimeHelper' +import { expandRuntimePath } from '@/lib/runtimeHelper' import { ToolchainService } from '@/toolchains' import { buildCapabilitySnapshot, @@ -88,6 +87,7 @@ export interface AcpProcessHandle extends AgentProcessHandle { } interface AcpProcessManagerOptions { + bootstrap: AcpRuntimeBootstrap publishEvent: DeepChatEventPublisher providerId: string resolveLaunchSpec: (agentId: string, workdir?: string) => Promise @@ -140,14 +140,6 @@ interface NpxCacheRepairResult { movedTo?: string } -/** - * Check if running in Electron environment. - * Reference: @modelcontextprotocol/sdk/client/stdio.js - */ -function isElectron(): boolean { - return 'type' in process -} - interface PermissionResolverEntry { agentId: string connectionId: string @@ -267,8 +259,8 @@ export class AcpProcessManager implements AgentProcessManager() - private readonly runtimeHelper = RuntimeHelper.getInstance() - private readonly terminalManager = new AcpTerminalManager() + private readonly bootstrap: AcpRuntimeBootstrap + private readonly terminalManager: AcpTerminalManager private readonly sessionWorkdirs = new Map() private readonly sessionConversations = new Map() private readonly fsHandlers = new Map() @@ -297,6 +289,14 @@ export class AcpProcessManager implements AgentProcessManager constructor(options: AcpProcessManagerOptions) { + if ( + !path.isAbsolute(options.bootstrap.homeDirectory) || + !path.isAbsolute(options.bootstrap.temporaryDirectory) + ) { + throw new Error('ACP bootstrap directories must be absolute') + } + this.bootstrap = { ...options.bootstrap } + this.terminalManager = new AcpTerminalManager(this.bootstrap.temporaryDirectory) this.elicitation = new AcpElicitationBridge(() => this.publishEvent('acp.elicitation.changed', { version: this.elicitation.version }) ) @@ -416,12 +416,12 @@ export class AcpProcessManager implements AgentProcessManager - typeof arg === 'string' ? this.runtimeHelper.expandPath(arg) : arg + typeof arg === 'string' ? expandRuntimePath(arg, this.bootstrap.homeDirectory) : arg ) const rewritten = useResolvedToolchain @@ -2017,7 +2017,7 @@ export class AcpProcessManager implements AgentProcessManager void = () => undefined - ) {} + ) { + if (!path.isAbsolute(homeDirectory)) { + throw new Error('ACP session home directory must be absolute') + } + } getProjectMetadata( workdir: string, @@ -395,13 +399,8 @@ export class AcpSessionPersistence { } getDefaultWorkdir(): string { - try { - const home = app.getPath('home') - if (this.isWorkdirUsable(home)) { - return home - } - } catch { - // fall through to process fallbacks + if (this.isWorkdirUsable(this.homeDirectory)) { + return this.homeDirectory } if (this.isWorkdirUsable(process.env.HOME)) { diff --git a/src/main/agent/acp/runtime/acpTerminalManager.ts b/src/main/agent/acp/runtime/acpTerminalManager.ts index 4377173a40..68920395f1 100644 --- a/src/main/agent/acp/runtime/acpTerminalManager.ts +++ b/src/main/agent/acp/runtime/acpTerminalManager.ts @@ -3,7 +3,6 @@ import path from 'path' import { spawn } from 'node-pty' import type { IPty } from 'node-pty' import { nanoid } from 'nanoid' -import { app } from 'electron' import { RequestError } from '@agentclientprotocol/sdk' import type * as schema from '@agentclientprotocol/sdk' @@ -37,19 +36,25 @@ export class AcpTerminalManager { private readonly terminals = new Map() private readonly defaultMaxOutputBytes = 1024 * 1024 // 1MB default + constructor(private readonly temporaryDirectory: string) { + if (!path.isAbsolute(temporaryDirectory)) { + throw new Error('ACP terminal temporary directory must be absolute') + } + } + private resolveTerminalCwd(cwd?: string | null): string { const normalized = cwd?.trim() if (normalized) { return path.resolve(normalized) } - const fallbackDir = path.join(app.getPath('temp'), 'deepchat-acp', 'terminals') + const fallbackDir = path.join(this.temporaryDirectory, 'deepchat-acp', 'terminals') try { fs.mkdirSync(fallbackDir, { recursive: true }) console.warn(`[ACP Terminal] Missing cwd, using fallback directory: ${fallbackDir}`) return fallbackDir } catch (error) { - const tempDir = app.getPath('temp') + const tempDir = this.temporaryDirectory console.warn( `[ACP Terminal] Failed to create fallback directory, using temp path instead: ${tempDir}`, error diff --git a/src/main/agent/acp/runtime/types.ts b/src/main/agent/acp/runtime/types.ts index 23fe614f34..2c76eb6f4b 100644 --- a/src/main/agent/acp/runtime/types.ts +++ b/src/main/agent/acp/runtime/types.ts @@ -12,6 +12,12 @@ export type { AgentSessionState } +export interface AcpRuntimeBootstrap { + appVersion: string + homeDirectory: string + temporaryDirectory: string +} + export interface AgentSessionManager< TSession extends AgentSessionState = AgentSessionState, TAgentDescriptor = string, diff --git a/src/main/agent/deepchat/harness/deepChatAgentHarness.ts b/src/main/agent/deepchat/harness/deepChatAgentHarness.ts index ea0029715a..610222483f 100644 --- a/src/main/agent/deepchat/harness/deepChatAgentHarness.ts +++ b/src/main/agent/deepchat/harness/deepChatAgentHarness.ts @@ -27,10 +27,7 @@ import type { SessionStatePort } from '@/session/data/contracts' import type { SessionTranscriptRuntimePort } from '@/session/transcriptMutations' import type { DeepChatRuntimeServices } from './runtimeServices' -/** - * Public boundary of the DeepChat agent runtime. Every method delegates to exactly one owner; the - * harness holds no phase, queue, cache, subscription, or derived fact of its own. - */ +/** Delegates each public operation to its existing runtime owner without retaining state. */ export class DeepChatAgentHarness implements DeepChatAgentBackendPort, SessionStatePort, SessionTranscriptRuntimePort { @@ -74,6 +71,8 @@ export class DeepChatAgentHarness this.services.runtime.markToolRegistryChanged() } + readonly abortGenerations = (): void => this.services.runtime.abortGenerations() + readonly reconcileAfterDatabaseReopen = (): void => this.services.reconcileAfterDatabaseReopen() createAcpAgentInstanceDependencies( diff --git a/src/main/agent/deepchat/instance/deepChatAgentRuntime.ts b/src/main/agent/deepchat/instance/deepChatAgentRuntime.ts index 90ff8a0096..044ff1d087 100644 --- a/src/main/agent/deepchat/instance/deepChatAgentRuntime.ts +++ b/src/main/agent/deepchat/instance/deepChatAgentRuntime.ts @@ -88,6 +88,13 @@ export class DeepChatAgentRuntime { return this.instances.delete(sessionId) } + abortGenerations(): void { + for (const instance of this.instances.values()) { + instance.requestGenerationAbort() + instance.abortDeferredToolCalls() + } + } + getToolRegistryRevision(): number { return this.toolRegistryRevision } diff --git a/src/main/agent/invocationAdmission.ts b/src/main/agent/invocationAdmission.ts index 0679fafbd3..58284d0783 100644 --- a/src/main/agent/invocationAdmission.ts +++ b/src/main/agent/invocationAdmission.ts @@ -1,702 +1,2 @@ -import { types as utilTypes } from 'node:util' -import { - BoundedNumberRing, - MAX_DIAGNOSTIC_DISTRIBUTION_SAMPLES, - summarizeNumberDistribution, - type NumberDistribution -} from '@/lib/boundedNumberRing' -import { BoundedObservationQueue } from '@/lib/boundedObservationQueue' -import { elapsedMonotonicBetween, readMonotonicNow } from '@/lib/monotonicTime' - -export const DEFAULT_AGENT_INVOCATION_CAPACITY = 6 -export const DEFAULT_AGENT_INVOCATION_MAX_PENDING = 256 -const MAX_AGENT_INVOCATION_IDENTIFIER_LENGTH = 256 - -export interface AgentInvocationPermit { - release(): void -} - -export type AgentInvocationLeaseState = 'suspended' | 'acquiring' | 'active' | 'released' - -export interface AgentInvocationLease { - readonly state: AgentInvocationLeaseState - resume(options?: { signal?: AbortSignal }): Promise - suspend(): void - release(): void -} - -export interface AgentInvocationAdmissionOptions { - ownerId: string - maxActiveForOwner?: number - signal?: AbortSignal - correlation?: AgentInvocationAdmissionCorrelation -} - -export interface AgentInvocationAdmissionCorrelation { - kind: 'live_delegation' - parentSessionId: string - delegationId: string - turnId: string -} - -export interface AgentInvocationAdmissionSnapshot { - capacity: number - active: number - pending: number - pendingOwners: number - closed: boolean - activeHighWater: number - pendingHighWater: number - granted: number - rejected: number - observationsDropped: number - waitMs: NumberDistribution - holdMs: NumberDistribution -} - -type AgentInvocationAdmissionState = Pick< - AgentInvocationAdmissionSnapshot, - 'capacity' | 'active' | 'pending' -> - -export type AgentInvocationAdmissionObservation = - | ({ - type: 'queued' - acquisitionSeq: number - } & AgentInvocationAdmissionCorrelation & - AgentInvocationAdmissionState) - | ({ - type: 'granted' - acquisitionSeq: number - waitMs?: number - } & AgentInvocationAdmissionCorrelation & - AgentInvocationAdmissionState) - | ({ - type: 'released' - acquisitionSeq: number - holdMs?: number - reason: 'permit_released' | 'lease_suspended' | 'lease_released' - active: number - pending: number - } & AgentInvocationAdmissionCorrelation) - | ({ - type: 'rejected' - acquisitionSeq: number - waitMs?: number - reason: 'queue_full' | 'aborted' | 'closed' - } & AgentInvocationAdmissionCorrelation & - AgentInvocationAdmissionState) - | ({ - type: 'closed' - } & Omit) - -export interface AgentInvocationAdmissionDiagnosticsOptions { - observe?: (observation: AgentInvocationAdmissionObservation) => void - observationsEnabled?: () => boolean - now?: () => number -} - -export interface AgentInvocationAdmissionPort { - acquire(options: AgentInvocationAdmissionOptions): Promise - createLease(options: AgentInvocationAdmissionOptions): AgentInvocationLease - run(options: AgentInvocationAdmissionOptions, task: () => Promise): Promise -} - -export class AgentInvocationAdmissionClosedError extends Error { - constructor(message = 'Agent invocation admission is closed.') { - super(message) - this.name = 'AgentInvocationAdmissionClosedError' - } -} - -export class AgentInvocationAdmissionAbortedError extends Error { - constructor() { - super('Agent invocation admission was cancelled while queued.') - this.name = 'AgentInvocationAdmissionAbortedError' - } -} - -export class AgentInvocationAdmissionQueueFullError extends Error { - constructor(maxPending: number) { - super(`Agent invocation admission queue is full (${maxPending} pending).`) - this.name = 'AgentInvocationAdmissionQueueFullError' - } -} - -interface AdmissionWaiter { - ownerId: string - maxActiveForOwner: number - correlation?: AgentInvocationAdmissionCorrelation - acquisitionSeq: number - queuedAt: number | undefined - resolve: (permit: AgentInvocationPermit) => void - reject: (error: Error) => void - signal?: AbortSignal - onAbort?: () => void - settled: boolean -} - -interface InternalAgentInvocationPermit extends AgentInvocationPermit { - releaseWithReason(reason: 'permit_released' | 'lease_suspended' | 'lease_released'): void -} - -export class AgentInvocationAdmission implements AgentInvocationAdmissionPort { - private readonly ownerQueues = new Map() - private readonly ownerRing: string[] = [] - private readonly activeByOwner = new Map() - private active = 0 - private pending = 0 - private closedError: AgentInvocationAdmissionClosedError | null = null - private acquisitionSequence = 0 - private activeHighWater = 0 - private pendingHighWater = 0 - private granted = 0 - private rejected = 0 - private readonly waitSamples = new BoundedNumberRing(MAX_DIAGNOSTIC_DISTRIBUTION_SAMPLES) - private readonly holdSamples = new BoundedNumberRing(MAX_DIAGNOSTIC_DISTRIBUTION_SAMPLES) - private readonly observationQueue: BoundedObservationQueue - private readonly now: () => number - - constructor( - private readonly capacity = DEFAULT_AGENT_INVOCATION_CAPACITY, - private readonly maxPending = DEFAULT_AGENT_INVOCATION_MAX_PENDING, - diagnostics: AgentInvocationAdmissionDiagnosticsOptions = {} - ) { - if (!Number.isInteger(capacity) || capacity < 1) { - throw new Error('Agent invocation capacity must be a positive integer.') - } - if (!Number.isInteger(maxPending) || maxPending < 0) { - throw new Error('Agent invocation pending limit must be a non-negative integer.') - } - this.observationQueue = new BoundedObservationQueue({ - observe: diagnostics.observe ?? (() => undefined), - enabled: diagnostics.observe ? (diagnostics.observationsEnabled ?? (() => true)) : () => false - }) - this.now = diagnostics.now ?? performance.now.bind(performance) - } - - acquire(options: AgentInvocationAdmissionOptions): Promise { - let ownerId: string - let maxActiveForOwner: number - try { - ownerId = normalizeOwnerId(options.ownerId) - maxActiveForOwner = normalizeOwnerLimit(options.maxActiveForOwner, this.capacity) - } catch (error) { - return Promise.reject(error) - } - const acquisitionSeq = this.nextAcquisitionSequence() - const startedAt = readMonotonicNow(this.now) - const correlation = this.snapshotCorrelation(options.correlation) - if (this.closedError) { - this.recordImmediateRejection(correlation, acquisitionSeq, 'closed') - return Promise.reject(this.closedError) - } - if (options.signal?.aborted) { - this.recordImmediateRejection(correlation, acquisitionSeq, 'aborted') - return Promise.reject(new AgentInvocationAdmissionAbortedError()) - } - if ( - this.active < this.capacity && - this.pending === 0 && - this.getActiveForOwner(ownerId) < maxActiveForOwner - ) { - return Promise.resolve(this.grant(ownerId, correlation, acquisitionSeq, startedAt)) - } - if (this.pending >= this.maxPending) { - this.recordImmediateRejection(correlation, acquisitionSeq, 'queue_full') - return Promise.reject(new AgentInvocationAdmissionQueueFullError(this.maxPending)) - } - - return new Promise((resolve, reject) => { - const waiter: AdmissionWaiter = { - ownerId, - maxActiveForOwner, - correlation, - acquisitionSeq, - queuedAt: startedAt, - resolve, - reject, - signal: options.signal, - settled: false - } - if (options.signal) { - waiter.onAbort = () => this.abortWaiter(waiter) - options.signal.addEventListener('abort', waiter.onAbort, { once: true }) - } - const queue = this.ownerQueues.get(ownerId) - if (queue) { - queue.push(waiter) - } else { - this.ownerQueues.set(ownerId, [waiter]) - this.ownerRing.push(ownerId) - } - this.pending += 1 - this.pendingHighWater = Math.max(this.pendingHighWater, this.pending) - if (waiter.correlation) { - this.emit({ - type: 'queued', - ...waiter.correlation, - acquisitionSeq, - ...this.currentState() - }) - } - this.dispatch() - }) - } - - createLease(options: AgentInvocationAdmissionOptions): AgentInvocationLease { - return new StatefulAgentInvocationLease(this, options) - } - - async run(options: AgentInvocationAdmissionOptions, task: () => Promise): Promise { - const permit = await this.acquire(options) - try { - if (options.signal?.aborted) { - throw new AgentInvocationAdmissionAbortedError() - } - return await task() - } finally { - permit.release() - } - } - - close(reason = 'Agent invocation admission is closed.'): void { - if (this.closedError) { - return - } - this.closedError = new AgentInvocationAdmissionClosedError(reason) - for (const queue of this.ownerQueues.values()) { - for (const waiter of queue) { - if (!waiter.settled) this.pending -= 1 - this.rejectWaiter(waiter, this.closedError, 'closed') - } - } - this.ownerQueues.clear() - this.ownerRing.splice(0) - this.pending = 0 - const snapshot = this.snapshot() - this.emit({ - type: 'closed', - capacity: snapshot.capacity, - active: snapshot.active, - pending: snapshot.pending, - activeHighWater: snapshot.activeHighWater, - pendingHighWater: snapshot.pendingHighWater, - granted: snapshot.granted, - rejected: snapshot.rejected, - observationsDropped: snapshot.observationsDropped, - waitMs: snapshot.waitMs, - holdMs: snapshot.holdMs - }) - } - - flushObservations(): Promise { - return this.observationQueue.flush() - } - - snapshot(): AgentInvocationAdmissionSnapshot { - return { - capacity: this.capacity, - active: this.active, - pending: this.pending, - pendingOwners: this.ownerQueues.size, - closed: this.closedError !== null, - activeHighWater: this.activeHighWater, - pendingHighWater: this.pendingHighWater, - granted: this.granted, - rejected: this.rejected, - observationsDropped: this.observationQueue.droppedCount, - waitMs: summarizeNumberDistribution(this.waitSamples.snapshot()), - holdMs: summarizeNumberDistribution(this.holdSamples.snapshot()) - } - } - - private dispatch(): void { - while (this.active < this.capacity && this.pending > 0 && this.ownerRing.length > 0) { - const ownersInRound = this.ownerRing.length - let grantedInRound = false - - for ( - let ownerIndex = 0; - ownerIndex < ownersInRound && this.active < this.capacity; - ownerIndex += 1 - ) { - const ownerId = this.ownerRing.shift()! - const queue = this.ownerQueues.get(ownerId) - if (!queue || queue.length === 0) { - this.ownerQueues.delete(ownerId) - continue - } - - const waiter = queue[0] - if (this.getActiveForOwner(ownerId) >= waiter.maxActiveForOwner) { - this.ownerRing.push(ownerId) - continue - } - - queue.shift() - if (queue.length > 0) { - this.ownerRing.push(ownerId) - } else { - this.ownerQueues.delete(ownerId) - } - if (waiter.settled) { - continue - } - - waiter.settled = true - this.detachAbort(waiter) - this.pending -= 1 - grantedInRound = true - waiter.resolve( - this.grant(ownerId, waiter.correlation, waiter.acquisitionSeq, waiter.queuedAt) - ) - } - - if (!grantedInRound) { - return - } - } - } - - private abortWaiter(waiter: AdmissionWaiter): void { - if (waiter.settled) { - return - } - const queue = this.ownerQueues.get(waiter.ownerId) - if (queue) { - const index = queue.indexOf(waiter) - if (index >= 0) { - queue.splice(index, 1) - } - if (queue.length === 0) { - this.ownerQueues.delete(waiter.ownerId) - const ownerIndex = this.ownerRing.indexOf(waiter.ownerId) - if (ownerIndex >= 0) { - this.ownerRing.splice(ownerIndex, 1) - } - } - } - this.pending -= 1 - this.rejectWaiter(waiter, new AgentInvocationAdmissionAbortedError(), 'aborted') - this.dispatch() - } - - private rejectWaiter(waiter: AdmissionWaiter, error: Error, reason: 'aborted' | 'closed'): void { - if (waiter.settled) { - return - } - waiter.settled = true - this.detachAbort(waiter) - this.rejected += 1 - const waitMs = this.elapsedSince(waiter.queuedAt) - if (waitMs !== undefined) this.waitSamples.push(waitMs) - if (waiter.correlation) { - this.emit({ - type: 'rejected', - ...waiter.correlation, - acquisitionSeq: waiter.acquisitionSeq, - ...(waitMs === undefined ? {} : { waitMs }), - reason, - ...this.currentState() - }) - } - waiter.reject(error) - } - - private detachAbort(waiter: AdmissionWaiter): void { - if (waiter.signal && waiter.onAbort) { - waiter.signal.removeEventListener('abort', waiter.onAbort) - } - } - - private getActiveForOwner(ownerId: string): number { - return this.activeByOwner.get(ownerId) ?? 0 - } - - private grant( - ownerId: string, - correlation: AgentInvocationAdmissionCorrelation | undefined, - acquisitionSeq: number, - startedAt: number | undefined - ): InternalAgentInvocationPermit { - this.active += 1 - this.activeByOwner.set(ownerId, this.getActiveForOwner(ownerId) + 1) - this.activeHighWater = Math.max(this.activeHighWater, this.active) - this.granted += 1 - const grantedAt = readMonotonicNow(this.now) - const waitMs = elapsedMonotonicBetween(startedAt, grantedAt) - if (waitMs !== undefined) this.waitSamples.push(waitMs) - if (correlation) { - this.emit({ - type: 'granted', - ...correlation, - acquisitionSeq, - ...(waitMs === undefined ? {} : { waitMs }), - ...this.currentState() - }) - } - let released = false - const releaseWithReason: InternalAgentInvocationPermit['releaseWithReason'] = (reason) => { - if (released) { - return - } - if (this.active <= 0) { - throw new Error('Agent invocation permit accounting underflow.') - } - const ownerActive = this.getActiveForOwner(ownerId) - if (ownerActive <= 0) { - throw new Error(`Agent invocation owner permit accounting underflow: ${ownerId}`) - } - released = true - this.active -= 1 - if (ownerActive === 1) { - this.activeByOwner.delete(ownerId) - } else { - this.activeByOwner.set(ownerId, ownerActive - 1) - } - const holdMs = this.elapsedSince(grantedAt) - if (holdMs !== undefined) this.holdSamples.push(holdMs) - if (correlation) { - this.emit({ - type: 'released', - ...correlation, - acquisitionSeq, - ...(holdMs === undefined ? {} : { holdMs }), - reason, - active: this.active, - pending: this.pending - }) - } - this.dispatch() - } - return { - release: () => releaseWithReason('permit_released'), - releaseWithReason - } - } - - private snapshotCorrelation( - correlation: AgentInvocationAdmissionCorrelation | undefined - ): AgentInvocationAdmissionCorrelation | undefined { - if (!correlation) return undefined - try { - if (typeof correlation !== 'object' || utilTypes.isProxy(correlation)) return undefined - const prototype = Object.getPrototypeOf(correlation) - if (prototype !== Object.prototype && prototype !== null) return undefined - const kind = Object.getOwnPropertyDescriptor(correlation, 'kind') - const parentSessionId = Object.getOwnPropertyDescriptor(correlation, 'parentSessionId') - const delegationId = Object.getOwnPropertyDescriptor(correlation, 'delegationId') - const turnId = Object.getOwnPropertyDescriptor(correlation, 'turnId') - if ( - !kind || - !('value' in kind) || - kind.value !== 'live_delegation' || - !parentSessionId || - !('value' in parentSessionId) || - !isBoundedAdmissionIdentifier(parentSessionId.value) || - !delegationId || - !('value' in delegationId) || - !isBoundedAdmissionIdentifier(delegationId.value) || - !turnId || - !('value' in turnId) || - !isBoundedAdmissionIdentifier(turnId.value) - ) { - return undefined - } - return { - kind: kind.value, - parentSessionId: parentSessionId.value, - delegationId: delegationId.value, - turnId: turnId.value - } - } catch { - return undefined - } - } - - private recordImmediateRejection( - correlation: AgentInvocationAdmissionCorrelation | undefined, - acquisitionSeq: number, - reason: 'queue_full' | 'aborted' | 'closed' - ): void { - this.rejected += 1 - if (!correlation) return - this.emit({ - type: 'rejected', - ...correlation, - acquisitionSeq, - waitMs: 0, - reason, - ...this.currentState() - }) - } - - private currentState(): AgentInvocationAdmissionState { - return { capacity: this.capacity, active: this.active, pending: this.pending } - } - - private nextAcquisitionSequence(): number { - this.acquisitionSequence = - this.acquisitionSequence >= Number.MAX_SAFE_INTEGER ? 1 : this.acquisitionSequence + 1 - return this.acquisitionSequence - } - - private elapsedSince(startedAt: number | undefined): number | undefined { - return elapsedMonotonicBetween(startedAt, readMonotonicNow(this.now)) - } - - private emit(observation: AgentInvocationAdmissionObservation): void { - if (observation.type !== 'closed') { - this.observationQueue.enqueue(observation) - return - } - this.observationQueue.enqueueWithDroppedCount((observationsDropped) => ({ - ...observation, - observationsDropped - })) - } -} - -class StatefulAgentInvocationLease implements AgentInvocationLease { - private currentState: AgentInvocationLeaseState = 'suspended' - private permit: InternalAgentInvocationPermit | null = null - private acquisition: - | { - controller: AbortController - promise: Promise - cleanupSignals: () => void - } - | undefined - - constructor( - private readonly admission: AgentInvocationAdmission, - private readonly options: AgentInvocationAdmissionOptions - ) {} - - get state(): AgentInvocationLeaseState { - return this.currentState - } - - resume(options?: { signal?: AbortSignal }): Promise { - if (this.currentState === 'released') { - return Promise.reject(new AgentInvocationAdmissionAbortedError()) - } - if (this.currentState === 'active') return Promise.resolve() - if (this.acquisition) { - if (this.currentState === 'acquiring') return this.acquisition.promise - return this.acquisition.promise - .catch(() => undefined) - .then(async () => await this.resume(options)) - } - - const controller = new AbortController() - const cleanupSignals = forwardAbortSignals([this.options.signal, options?.signal], controller) - this.currentState = 'acquiring' - const promise = this.admission - .acquire({ ...this.options, signal: controller.signal }) - .then((permit) => { - const internalPermit = permit as InternalAgentInvocationPermit - if ( - controller.signal.aborted || - this.currentState !== 'acquiring' || - this.acquisition?.controller !== controller - ) { - internalPermit.releaseWithReason( - this.currentState === 'released' ? 'lease_released' : 'lease_suspended' - ) - throw new AgentInvocationAdmissionAbortedError() - } - this.permit = internalPermit - this.currentState = 'active' - }) - .finally(() => { - if (this.acquisition?.controller !== controller) return - this.acquisition.cleanupSignals() - this.acquisition = undefined - if (this.currentState === 'acquiring') this.currentState = 'suspended' - }) - this.acquisition = { controller, promise, cleanupSignals } - return promise - } - - suspend(): void { - if (this.currentState === 'released' || this.currentState === 'suspended') return - if (this.currentState === 'active') { - this.releaseActivePermit('lease_suspended', 'suspended') - return - } - this.currentState = 'suspended' - this.acquisition?.controller.abort('Agent invocation lease suspended.') - } - - release(): void { - if (this.currentState === 'released') return - if (this.currentState === 'active') { - this.releaseActivePermit('lease_released', 'released') - return - } - this.currentState = 'released' - this.acquisition?.controller.abort('Agent invocation lease released.') - } - - private releaseActivePermit( - reason: 'lease_suspended' | 'lease_released', - nextState: 'suspended' | 'released' - ): void { - if (!this.permit) throw new Error('Active Agent invocation lease has no permit.') - this.permit.releaseWithReason(reason) - this.permit = null - this.currentState = nextState - } -} - -function forwardAbortSignals( - signals: Array, - target: AbortController -): () => void { - const listeners: Array<{ signal: AbortSignal; listener: () => void }> = [] - for (const signal of signals) { - if (!signal) continue - const listener = () => target.abort(signal.reason) - if (signal.aborted) { - listener() - break - } - signal.addEventListener('abort', listener, { once: true }) - listeners.push({ signal, listener }) - } - return () => { - for (const { signal, listener } of listeners) { - signal.removeEventListener('abort', listener) - } - } -} - -function normalizeOwnerId(ownerId: string): string { - const normalized = ownerId.trim() - if (!normalized || normalized.length > MAX_AGENT_INVOCATION_IDENTIFIER_LENGTH) { - throw new Error( - `Agent invocation ownerId must contain 1 to ${MAX_AGENT_INVOCATION_IDENTIFIER_LENGTH} characters.` - ) - } - return normalized -} - -function isBoundedAdmissionIdentifier(value: unknown): value is string { - return ( - typeof value === 'string' && - value.length > 0 && - value.length <= MAX_AGENT_INVOCATION_IDENTIFIER_LENGTH - ) -} - -function normalizeOwnerLimit(requested: number | undefined, capacity: number): number { - if (requested === undefined) { - return capacity - } - if (!Number.isSafeInteger(requested) || requested < 1) { - throw new Error('Agent invocation owner limit must be a positive safe integer.') - } - return Math.min(requested, capacity) -} +export * from '@shared/harness/admission' +export { RutisAgentInvocationAdmission } from '../harness/admission' diff --git a/src/main/agent/settings.ts b/src/main/agent/settings.ts index c9efd0062a..c92b3992ba 100644 --- a/src/main/agent/settings.ts +++ b/src/main/agent/settings.ts @@ -22,7 +22,7 @@ import { normalizeDeepChatSubagentConfig } from '@shared/lib/deepchatSubagents' import { resolveAcpAgentAlias } from '@shared/utils/acpAgentAlias' import type { SettingsStore } from '@/config/settingsStore' import { AcpCatalogSettings } from '@/agent/acp/catalog/settings' -import { AcpRegistryService } from '@/agent/acp/catalog/acpRegistryService' +import type { AcpRegistryService } from '@/agent/acp/catalog/acpRegistryService' import { AcpLaunchSpecService } from '@/agent/acp/launch/acpLaunchSpecService' import { normalizeAutoCompactionRetainRecentPairs, @@ -172,15 +172,24 @@ const getLiveLegacyModelSelection = (value: unknown): ModelSelection | null => { } export class AgentSettings implements AgentSettingsPort { - private readonly registry: AcpRegistryService private readonly launchSpecs: AcpLaunchSpecService private deleteDeepChatAgentTasks?: Map> + private registryRefreshPromise: Promise | null = null + private acpWork?: Map }> + private acpInstalls?: Map< + string, + { + repair: boolean + promise: Promise + } + > + private acpUninstalls?: Map> constructor( private readonly settings: SettingsStore, private readonly repository: AgentRepository, private readonly acpCatalog: AcpCatalogSettings, - isPrivacyModeEnabled: () => boolean, + private readonly registry: AcpRegistryService, userDataPath: string, private readonly provider: AgentSettingsProviderPort, private readonly events: AgentSettingsEvents, @@ -190,15 +199,14 @@ export class AgentSettings implements AgentSettingsPort { private readonly cleanupDeletedAgentSkills: (agentId: string) => Promise, private readonly notifyMemoryConfigChanged: (agentId: string) => void, private readonly skillMigrationSettings: AgentSkillMigrationSettingsPort, - private readonly agentLifecycle: AgentLifecycleGatePort + private readonly agentLifecycle: AgentLifecycleGatePort, + private readonly assertAcpOperationAllowed: () => void ) { - this.registry = new AcpRegistryService({ - isPrivacyModeEnabled - }) this.launchSpecs = new AcpLaunchSpecService(path.join(userDataPath, 'acp-registry')) } start(): void { + this.registry.initialize() this.initializeUnifiedAgents() const needsIndependentConfigMigration = (this.settings.get('unifiedAgentsMigrationVersion') ?? 0) < @@ -219,21 +227,59 @@ export class AgentSettings implements AgentSettingsPort { } } this.provider.setAcpProviderEnabled(this.acpCatalog.getGlobalEnabled()) - const previousAgents = this.registry.listAgents() - void this.registry - .initialize() - .then(async () => { - const registryAgents = this.registry.listAgents() - this.syncRegistryAgentsToRepository() - const changedAgentIds = findChangedAcpRegistryAgentIds(previousAgents, registryAgents) - if (changedAgentIds.length > 0) { - await this.provider.refreshAcpProviderAgents(changedAgentIds) - } - this.notifyAcpAgentsChanged() + } + + stop(): void { + this.registry.stop() + this.cancelAcpWork() + this.launchSpecs.stop() + } + + async drain(): Promise { + await Promise.allSettled([this.registryRefreshPromise]) + while (this.acpWork?.size || this.acpUninstalls?.size) { + await Promise.allSettled([ + ...[...(this.acpWork?.values() ?? [])].map((job) => job.promise), + ...(this.acpUninstalls?.values() ?? []) + ]) + } + await this.launchSpecs.drain() + await this.registry.drain() + } + + async cancelAndDrainAcpWork(): Promise { + this.cancelAcpWork() + await this.drain() + } + + private cancelAcpWork(agentId?: string): void { + for (const [controller, job] of this.acpWork ?? []) { + if (!agentId || job.agentId === agentId) controller.abort() + } + this.launchSpecs.cancelPendingInstallations(agentId) + } + + private runAcpWork( + run: (signal: AbortSignal, assertCurrent: () => void) => Promise, + agentId?: string, + controller = new AbortController() + ): Promise { + const jobs = (this.acpWork ??= new Map()) + const assertCurrent = () => { + controller.signal.throwIfAborted() + if (this.registry.isStopped) throw new DOMException('ACP owner is stopping', 'AbortError') + this.assertAcpOperationAllowed() + } + const promise = Promise.resolve() + .then(() => { + assertCurrent() + return run(controller.signal, assertCurrent) }) - .catch((error) => { - console.error('[ACP] Failed to initialize registry service:', error) + .finally(() => { + jobs.delete(controller) }) + jobs.set(controller, { agentId, promise }) + return promise } async getAcpEnabled(): Promise { @@ -299,15 +345,46 @@ export class AgentSettings implements AgentSettingsPort { }) } - async refreshAcpRegistry(force = true): Promise { + async refreshAcpRegistry( + force = true, + options: { automatic?: boolean; signal?: AbortSignal } = {} + ): Promise { + if (this.registry.isStopped) throw new DOMException('ACP registry is stopping', 'AbortError') + options.signal?.throwIfAborted() + if (this.registryRefreshPromise) return this.registryRefreshPromise + this.registryRefreshPromise = this.refreshRegistry(force, options).finally(() => { + this.registryRefreshPromise = null + }) + return this.registryRefreshPromise + } + + private async refreshRegistry( + force: boolean, + options: { automatic?: boolean; signal?: AbortSignal } + ): Promise { + const assertCurrent = () => { + if (this.registry.isStopped) throw new DOMException('ACP registry is stopping', 'AbortError') + options.signal?.throwIfAborted() + } + assertCurrent() const previousAgents = this.registry.listAgents() - const refreshedAgents = await this.registry.refresh(force) + const refreshedAgents = await this.registry.refresh(force, options) + assertCurrent() this.syncRegistryAgentsToRepository() const changedAgentIds = findChangedAcpRegistryAgentIds(previousAgents, refreshedAgents) + for (const agentId of changedAgentIds) this.cancelAcpWork(agentId) + await Promise.allSettled( + [...(this.acpWork?.values() ?? [])] + .filter((job) => job.agentId && changedAgentIds.includes(job.agentId)) + .map((job) => job.promise) + ) + assertCurrent() if (changedAgentIds.length > 0) { await this.provider.refreshAcpProviderAgents(changedAgentIds) } + assertCurrent() const agents = await this.listAcpRegistryAgents() + assertCurrent() this.notifyAcpAgentsChanged() return agents } @@ -351,28 +428,48 @@ export class AgentSettings implements AgentSettingsPort { async uninstallAcpRegistryAgent(agentId: string): Promise { const registryAgent = this.getRegistryAgentOrThrow(agentId) + const uninstalls = (this.acpUninstalls ??= new Map()) + const existing = uninstalls.get(registryAgent.id) + if (existing) return existing if (this.repository.hasAgentSessions(registryAgent.id)) { throw new Error( 'ACP registry agent still has related conversations. Move or delete them first.' ) } - const currentState = this.repository.getAgentInstallState(registryAgent.id) - await this.launchSpecs.uninstallRegistryAgent(registryAgent, currentState) - const updated = this.repository.clearRegistryAcpAgentInstallation(registryAgent.id, { - status: 'not_installed', - version: registryAgent.version, - distributionType: this.launchSpecs.selectRegistryDistribution(registryAgent)?.type, - lastCheckedAt: Date.now(), - installedAt: null, - installDir: null, - error: null + const promise = this.uninstallRegistryAgent(registryAgent).finally(() => { + if (uninstalls.get(registryAgent.id) === promise) uninstalls.delete(registryAgent.id) }) - if (!updated) { - throw new Error( - `ACP registry agent not found or still has related conversations: ${registryAgent.id}` - ) - } - this.handleAcpAgentsMutated([registryAgent.id]) + uninstalls.set(registryAgent.id, promise) + return promise + } + + private async uninstallRegistryAgent(registryAgent: AcpRegistryAgent): Promise { + this.cancelAcpWork(registryAgent.id) + await Promise.allSettled( + [...(this.acpWork?.values() ?? [])] + .filter((job) => job.agentId === registryAgent.id) + .map((job) => job.promise) + ) + await this.runAcpWork(async (_signal, assertCurrent) => { + const currentState = this.repository.getAgentInstallState(registryAgent.id) + await this.launchSpecs.uninstallRegistryAgent(registryAgent, currentState) + assertCurrent() + const updated = this.repository.clearRegistryAcpAgentInstallation(registryAgent.id, { + status: 'not_installed', + version: registryAgent.version, + distributionType: this.launchSpecs.selectRegistryDistribution(registryAgent)?.type, + lastCheckedAt: Date.now(), + installedAt: null, + installDir: null, + error: null + }) + if (!updated) { + throw new Error( + `ACP registry agent not found or still has related conversations: ${registryAgent.id}` + ) + } + this.handleAcpAgentsMutated([registryAgent.id]) + }, registryAgent.id) } async listManualAcpAgents(): Promise { @@ -419,23 +516,32 @@ export class AgentSettings implements AgentSettingsPort { } async resolveAcpLaunchSpec(agentId: string, _workdir?: string): Promise { - const resolvedId = resolveAcpAgentAlias(agentId) - const manualAgent = this.repository.getManualAcpAgent(resolvedId) - if (manualAgent) return this.launchSpecs.resolveManualLaunchSpec(manualAgent) - - const registryAgent = this.getRegistryAgentOrThrow(resolvedId) - const installState = this.repository.getAgentInstallState(registryAgent.id) - const launchSpec = await this.launchSpecs.resolveRegistryLaunchSpec(registryAgent, installState) - this.repository.setAgentInstallState(resolvedId, { - status: 'installed', - distributionType: launchSpec.distributionType, - version: launchSpec.version, - lastCheckedAt: Date.now(), - installedAt: installState?.installedAt ?? Date.now(), - installDir: launchSpec.installDir ?? null, - error: null - }) - return launchSpec + return this.runAcpWork(async (signal, assertCurrent) => { + const resolvedId = resolveAcpAgentAlias(agentId) + if (this.acpUninstalls?.has(resolvedId)) throw new Error('ACP uninstall is in progress') + const manualAgent = this.repository.getManualAcpAgent(resolvedId) + if (manualAgent) return this.launchSpecs.resolveManualLaunchSpec(manualAgent) + + const registryAgent = this.getRegistryAgentOrThrow(resolvedId) + const installState = this.repository.getAgentInstallState(registryAgent.id) + const launchSpec = await this.launchSpecs.resolveRegistryLaunchSpec( + registryAgent, + installState, + signal + ) + assertCurrent() + this.assertRegistryDescriptor(registryAgent) + this.repository.setAgentInstallState(resolvedId, { + status: 'installed', + distributionType: launchSpec.distributionType, + version: launchSpec.version, + lastCheckedAt: Date.now(), + installedAt: installState?.installedAt ?? Date.now(), + installDir: launchSpec.installDir ?? null, + error: null + }) + return launchSpec + }, resolveAcpAgentAlias(agentId)) } async getAcpSharedMcpSelections(): Promise { @@ -664,16 +770,57 @@ export class AgentSettings implements AgentSettingsPort { this.events.publishSessionsUpdated() } - private async installRegistryAgent( + private installRegistryAgent(agentId: string, repair: boolean): Promise { + const resolvedId = resolveAcpAgentAlias(agentId) + if (this.acpUninstalls?.has(resolvedId)) { + return Promise.reject(new Error('ACP uninstall is in progress')) + } + const installs = (this.acpInstalls ??= new Map()) + const existing = installs.get(resolvedId) + if (existing) { + if (!repair || existing.repair) return existing.promise + return this.runAcpWork(async (_signal, assertCurrent) => { + await existing.promise.catch(() => undefined) + assertCurrent() + return this.installRegistryAgent(resolvedId, true) + }, resolvedId) + } + const controller = new AbortController() + const promise = this.runAcpWork( + (signal, assertCurrent) => + this.performRegistryInstall(resolvedId, repair, signal, assertCurrent), + resolvedId, + controller + ).finally(() => { + if (installs.get(resolvedId)?.promise === promise) installs.delete(resolvedId) + }) + installs.set(resolvedId, { repair, promise }) + return promise + } + + private assertRegistryDescriptor(agent: AcpRegistryAgent): void { + const current = this.registry.getAgent(agent.id) + if ( + !current || + current.version !== agent.version || + !isDeepStrictEqual(current.distribution, agent.distribution) + ) { + throw new DOMException('ACP registry descriptor changed', 'AbortError') + } + } + + private async performRegistryInstall( agentId: string, - repair: boolean + repair: boolean, + signal: AbortSignal, + assertCurrent: () => void ): Promise { const registryAgent = this.getRegistryAgentOrThrow(agentId) const currentState = this.repository.getAgentInstallState(registryAgent.id) const installingState: AcpAgentInstallState = { status: 'installing', version: registryAgent.version, - distributionType: this.launchSpecs.selectRegistryDistribution(registryAgent)?.type, + distributionType: this.launchSpecs.selectRegistryDistribution(registryAgent)?.type ?? null, lastCheckedAt: Date.now(), installedAt: currentState?.installedAt ?? null, installDir: currentState?.installDir ?? null, @@ -681,18 +828,30 @@ export class AgentSettings implements AgentSettingsPort { } this.repository.setAgentInstallState(registryAgent.id, installingState) this.notifyAcpAgentsChanged([registryAgent.id]) - if (repair) await this.provider.refreshAcpProviderAgents([registryAgent.id]) - try { + if (repair) await this.provider.refreshAcpProviderAgents([registryAgent.id]) + assertCurrent() + this.assertRegistryDescriptor(registryAgent) const installedState = await this.launchSpecs.ensureRegistryAgentInstalled( registryAgent, currentState, - repair ? { repair: true } : undefined + { repair, signal } ) + assertCurrent() + this.assertRegistryDescriptor(registryAgent) this.repository.setAgentInstallState(registryAgent.id, installedState) this.handleAcpAgentsMutated([registryAgent.id]) return installedState } catch (error) { + if (signal.aborted || (error instanceof Error && error.name === 'AbortError')) { + if ( + isDeepStrictEqual(this.repository.getAgentInstallState(registryAgent.id), installingState) + ) { + this.repository.setAgentInstallState(registryAgent.id, currentState) + } + throw error + } + assertCurrent() const failedState: AcpAgentInstallState = { status: 'error', version: registryAgent.version, @@ -902,7 +1061,13 @@ export class AgentSettings implements AgentSettingsPort { private handleAcpAgentsMutated(agentIds?: string[]): void { this.provider.clearAcpProviderModelStatus() this.notifyAcpAgentsChanged(agentIds) - void this.provider.refreshAcpProviderAgents(agentIds).catch((error) => { + void this.runAcpWork( + async (_signal, assertCurrent) => { + await this.provider.refreshAcpProviderAgents(agentIds) + assertCurrent() + }, + agentIds?.length === 1 ? agentIds[0] : undefined + ).catch((error) => { console.warn('[ACP] Failed to refresh agent processes after config change:', error) }) } diff --git a/src/main/agent/shared/process/backgroundExecSessionManager.ts b/src/main/agent/shared/process/backgroundExecSessionManager.ts index 439b58443e..aca830ed94 100644 --- a/src/main/agent/shared/process/backgroundExecSessionManager.ts +++ b/src/main/agent/shared/process/backgroundExecSessionManager.ts @@ -1,8 +1,6 @@ import { spawn, type ChildProcess } from 'child_process' import fs from 'fs' import path from 'path' -import { fileURLToPath } from 'url' -import type { UtilityProcess } from 'electron' import { nanoid } from 'nanoid' import { z } from 'zod' import logger from './backgroundExecLogger' @@ -1185,11 +1183,37 @@ export class BackgroundExecSessionManager { } } -class BackgroundExecUtilityProxy { - private host: UtilityProcess | null = null - private hostReady: Promise | null = null +export interface BackgroundExecHost { + readonly pid: number | undefined + postMessage(message: BackgroundExecRpcRequest): void + kill(): void + onMessage(listener: (message: unknown) => void): void + onExit(listener: (code: number) => void): void + onError(listener: (type: string, location: string) => void): void +} + +export type BackgroundExecPort = Pick< + BackgroundExecService, + | 'start' + | 'list' + | 'poll' + | 'log' + | 'waitForCompletionOrYield' + | 'getCompletionResult' + | 'write' + | 'kill' + | 'clear' + | 'remove' + | 'cleanupConversation' +> + +export class BackgroundExecService { + private host: BackgroundExecHost | null = null + private hostReady: Promise | null = null private requestId = 0 - private shuttingDown = false + private readonly lifetime = new AbortController() + private shutdownPromise: Promise | null = null + private readonly operations = new Set>() private readonly pendingRequests = new Map< string, { @@ -1202,7 +1226,35 @@ class BackgroundExecUtilityProxy { private readonly crashedSessions = new Map() private completedSessionReconciliationTimer: NodeJS.Timeout | null = null - async start( + constructor(private readonly spawnHost: (signal: AbortSignal) => Promise) {} + + private assertActive(): void { + this.lifetime.signal.throwIfAborted() + } + + private trackOperation(operation: () => Promise): Promise { + const promise = Promise.resolve() + .then(operation) + .finally(() => { + this.operations.delete(promise) + }) + this.operations.add(promise) + return promise + } + + start( + conversationId: string, + command: string, + cwd: string, + options: BackgroundExecStartOptions, + beforeStart?: () => Promise + ): Promise { + return this.trackOperation(() => + this.startSession(conversationId, command, cwd, options, beforeStart) + ) + } + + private async startSession( conversationId: string, command: string, cwd: string, @@ -1222,6 +1274,7 @@ class BackgroundExecUtilityProxy { } } ) + this.assertActive() this.activeSessions.set(result.sessionId, { conversationId, sessionId: result.sessionId, @@ -1247,6 +1300,7 @@ class BackgroundExecUtilityProxy { } async list(conversationId: string): Promise { + this.assertActive() const completedAtListStart = new Map(this.completedSessions) const active = Array.from(this.activeSessions.values()) .filter((session) => session.conversationId === conversationId) @@ -1264,6 +1318,7 @@ class BackgroundExecUtilityProxy { logger.warn('[BackgroundExecProxy] Failed to list utility sessions:', error) } } + this.assertActive() if (hostListSucceeded) { const hostSessionIds = new Set(hostSessions.map((session) => session.sessionId)) for (const [sessionId, session] of completedAtListStart) { @@ -1296,6 +1351,7 @@ class BackgroundExecUtilityProxy { sessionId: string, previewChars?: number ): Promise { + this.assertActive() const crashed = this.getCrashedSession(conversationId, sessionId) if (crashed) { return this.toCrashedPollResult(crashed) @@ -1315,6 +1371,7 @@ class BackgroundExecUtilityProxy { offset = 0, limit = 1000 ): Promise { + this.assertActive() const crashed = this.getCrashedSession(conversationId, sessionId) if (crashed) { return { @@ -1333,6 +1390,7 @@ class BackgroundExecUtilityProxy { yieldMs = getConfig().backgroundMs, previewChars = FOREGROUND_PREVIEW_CHARS ): Promise { + this.assertActive() const crashed = this.getCrashedCompletionResult(conversationId, sessionId) if (crashed) { return { @@ -1358,6 +1416,7 @@ class BackgroundExecUtilityProxy { sessionId: string, previewChars = FOREGROUND_PREVIEW_CHARS ): Promise { + this.assertActive() const crashed = this.getCrashedCompletionResult(conversationId, sessionId) if (crashed) { return crashed @@ -1379,6 +1438,7 @@ class BackgroundExecUtilityProxy { eof = false, beforeMutation?: () => void ): Promise { + this.assertActive() this.assertTrackedSessionOwner(conversationId, sessionId) if ( this.getCrashedSession(conversationId, sessionId) || @@ -1395,6 +1455,7 @@ class BackgroundExecUtilityProxy { sessionId: string, beforeMutation?: () => void ): Promise { + this.assertActive() this.assertTrackedSessionOwner(conversationId, sessionId) if (this.getCrashedSession(conversationId, sessionId)) return if (this.getCompletedSession(conversationId, sessionId)) return @@ -1407,6 +1468,7 @@ class BackgroundExecUtilityProxy { sessionId: string, beforeMutation?: () => void ): Promise { + this.assertActive() this.assertTrackedSessionOwner(conversationId, sessionId) if (this.getCrashedSession(conversationId, sessionId)) return const completed = this.getCompletedSession(conversationId, sessionId) @@ -1433,6 +1495,7 @@ class BackgroundExecUtilityProxy { sessionId: string, beforeMutation?: () => void ): Promise { + this.assertActive() this.assertTrackedSessionOwner(conversationId, sessionId) if (this.getCrashedSession(conversationId, sessionId)) { beforeMutation?.() @@ -1452,6 +1515,7 @@ class BackgroundExecUtilityProxy { } async cleanupConversation(conversationId: string): Promise { + this.assertActive() try { await this.request('cleanupConversation', [conversationId]) } finally { @@ -1474,49 +1538,63 @@ class BackgroundExecUtilityProxy { } } - async shutdown(): Promise { - this.shuttingDown = true + stop(): void { + this.lifetime.abort(new DOMException('Background exec owner is stopping', 'AbortError')) + this.stopCompletedSessionReconciliation() + } + + shutdown(): Promise { + if (this.shutdownPromise) return this.shutdownPromise + this.stop() + this.shutdownPromise = this.performShutdown() + return this.shutdownPromise + } + + private async performShutdown(): Promise { + await this.hostReady?.catch(() => undefined) try { - if (this.host) { - await this.request('shutdown', []) - } + if (this.host) await this.postRequest(this.host, 'shutdown', []) } finally { - this.stopCompletedSessionReconciliation() this.host?.kill() this.host = null - this.hostReady = null this.rejectPendingRequests(new Error('Background exec utility process shut down.')) + while (this.operations.size) await Promise.allSettled(this.operations) this.activeSessions.clear() this.completedSessions.clear() this.crashedSessions.clear() } } - private async request( + private request( method: BackgroundExecRpcMethod, args: unknown[], lifecycle: { beforePost?: () => Promise; onPosted?: () => void } = {} ): Promise { - const host = await this.ensureHost() - await lifecycle.beforePost?.() - const id = `exec_rpc_${++this.requestId}` - - return await new Promise((resolve, reject) => { - this.pendingRequests.set(id, { - resolve: (value) => resolve(value as T), - reject - }) - - const payload: BackgroundExecRpcRequest = { - type: 'background-exec:request', - id, - method, - args - } + return this.trackOperation(async () => { + this.assertActive() + const host = await this.ensureHost() + this.assertActive() + await lifecycle.beforePost?.() + this.assertActive() + if (this.host !== host) throw new Error('Background exec helper changed before dispatch') + const result = await this.postRequest(host, method, args, lifecycle.onPosted) + this.assertActive() + return result + }) + } + private postRequest( + host: BackgroundExecHost, + method: BackgroundExecRpcMethod, + args: unknown[], + onPosted?: () => void + ): Promise { + const id = `exec_rpc_${++this.requestId}` + return new Promise((resolve, reject) => { + this.pendingRequests.set(id, { resolve: (value) => resolve(value as T), reject }) try { - host.postMessage(payload) - lifecycle.onPosted?.() + host.postMessage({ type: 'background-exec:request', id, method, args }) + onPosted?.() } catch (error) { this.pendingRequests.delete(id) reject(error) @@ -1524,84 +1602,39 @@ class BackgroundExecUtilityProxy { }) } - private async ensureHost(): Promise { - if (this.host) { - return this.host - } - if (this.hostReady) { - return await this.hostReady - } - - this.shuttingDown = false - this.hostReady = this.startHost() + private async ensureHost(): Promise { + this.assertActive() + if (this.host) return this.host + if (this.hostReady) return this.hostReady + const spawning = this.startHost() + this.hostReady = spawning try { - return await this.hostReady + return await spawning } finally { - this.hostReady = null + if (this.hostReady === spawning) this.hostReady = null } } - private async startHost(): Promise { - const { app, utilityProcess } = await import('electron') - const modulePath = this.resolveUtilityHostEntryPoint(app.getAppPath()) - const host = utilityProcess.fork(modulePath, ['--deepchat-exec-utility-host'], { - serviceName: 'DeepChat Exec Utility', - stdio: 'ignore', - env: { - ...process.env, - DEEPCHAT_EXEC_UTILITY_HOST: '1' - } + private async startHost(): Promise { + this.assertActive() + const host = await this.spawnHost(this.lifetime.signal) + if (this.lifetime.signal.aborted) { + host.kill() + this.assertActive() + } + this.host = host + host.onMessage((message) => { + if (this.host === host) this.handleHostMessage(message) }) - - host.on('message', (message) => this.handleHostMessage(message)) - host.on('exit', (code) => this.handleHostExit(code)) - host.on('error', (type, location) => { - logger.error('[BackgroundExecProxy] Utility process error:', { type, location }) + host.onExit((code) => { + if (this.host === host) this.handleHostExit(code) }) - - return await new Promise((resolve, reject) => { - let settled = false - const settle = (callback: () => void) => { - if (settled) { - return - } - settled = true - host.off('spawn', onSpawn) - host.off('exit', onExit) - callback() - } - const onSpawn = () => { - settle(() => { - this.host = host - this.scheduleCompletedSessionReconciliation() - resolve(host) - }) - } - const onExit = (code: number) => { - settle(() => { - reject(new Error(`Background exec utility process exited before spawn: ${code}`)) - }) - } - - host.once('spawn', onSpawn) - host.once('exit', onExit) + host.onError((type, location) => { + if (this.host === host) + logger.error('[BackgroundExecProxy] Utility process error:', { type, location }) }) - } - - private resolveUtilityHostEntryPoint(appPath?: string): string { - const modulePath = fileURLToPath(import.meta.url) - const candidates = [ - ...(appPath - ? [ - path.join(appPath, 'out/main/backgroundExecUtilityHost.js'), - path.join(appPath, 'backgroundExecUtilityHost.js') - ] - : []), - path.resolve(path.dirname(modulePath), 'backgroundExecUtilityHost.js'), - path.resolve(path.dirname(modulePath), '../backgroundExecUtilityHost.js'), - path.resolve(process.cwd(), 'out/main/backgroundExecUtilityHost.js') - ] - return candidates.find((candidate) => fs.existsSync(candidate)) ?? candidates[0] + this.scheduleCompletedSessionReconciliation() + return host } private handleHostMessage(message: unknown): void { @@ -1630,7 +1663,7 @@ class BackgroundExecUtilityProxy { private handleHostExit(code: number): void { const error = new Error(`Background exec utility process exited with code ${code}.`) - if (!this.shuttingDown) { + if (!this.lifetime.signal.aborted) { for (const session of this.activeSessions.values()) { this.crashedSessions.set(session.sessionId, { ...session, @@ -1692,6 +1725,7 @@ class BackgroundExecUtilityProxy { sessionId: string, result: PollResult | LogResult ): void { + this.assertActive() const session = this.activeSessions.get(sessionId) if (!session || session.conversationId !== conversationId) { return @@ -1708,6 +1742,7 @@ class BackgroundExecUtilityProxy { sessionId: string, result: SessionCompletionResult | PollResult | LogResult ): void { + this.assertActive() const session = this.activeSessions.get(sessionId) if (!session || session.conversationId !== conversationId || result.status === 'running') { return @@ -1730,7 +1765,7 @@ class BackgroundExecUtilityProxy { this.completedSessionReconciliationTimer || this.completedSessions.size === 0 || !this.host || - this.shuttingDown + this.lifetime.signal.aborted ) { return } @@ -1828,5 +1863,3 @@ class BackgroundExecUtilityProxy { return `Background exec utility process exited before session ${session.sessionId} completed. The command may have been terminated: ${session.command}` } } - -export const backgroundExecSessionManager = new BackgroundExecUtilityProxy() diff --git a/src/main/app/backgroundExecHost.ts b/src/main/app/backgroundExecHost.ts new file mode 100644 index 0000000000..2a9ce43ec5 --- /dev/null +++ b/src/main/app/backgroundExecHost.ts @@ -0,0 +1,68 @@ +import path from 'node:path' +import { utilityProcess } from 'electron' +import type { BackgroundExecHost } from '@/agent/shared/process/backgroundExecSessionManager' + +export async function spawnBackgroundExecHost( + entry: string, + signal: AbortSignal +): Promise { + if (!path.isAbsolute(entry)) throw new Error('Background exec helper entry must be absolute') + signal.throwIfAborted() + const host = utilityProcess.fork(entry, ['--deepchat-exec-utility-host'], { + serviceName: 'DeepChat Exec Utility', + stdio: 'ignore', + env: { ...process.env, DEEPCHAT_EXEC_UTILITY_HOST: '1' } + }) + return new Promise((resolve, reject) => { + let settled = false + const settle = (callback: () => void) => { + if (settled) return + settled = true + host.off('spawn', onSpawn) + host.off('exit', onExit) + host.off('error', onError) + signal.removeEventListener('abort', onAbort) + callback() + } + const fail = (error: unknown) => + settle(() => { + try { + host.kill() + } catch {} + reject(error) + }) + const onSpawn = () => + settle(() => + resolve({ + get pid() { + return host.pid + }, + postMessage(message) { + host.postMessage(message) + }, + kill() { + host.kill() + }, + onMessage(listener) { + host.on('message', listener) + }, + onExit(listener) { + host.on('exit', listener) + }, + onError(listener) { + host.on('error', listener) + } + }) + ) + const onExit = (code: number) => + fail(new Error(`Background exec helper exited before spawn: ${code}`)) + const onError = (type: string, location: string) => + fail(new Error(`Background exec helper error: ${type} at ${location}`)) + const onAbort = () => fail(signal.reason) + host.once('spawn', onSpawn) + host.once('exit', onExit) + host.once('error', onError) + signal.addEventListener('abort', onAbort, { once: true }) + if (signal.aborted) onAbort() + }) +} diff --git a/src/main/app/codeModeHost.ts b/src/main/app/codeModeHost.ts new file mode 100644 index 0000000000..07196bbfb7 --- /dev/null +++ b/src/main/app/codeModeHost.ts @@ -0,0 +1,49 @@ +import path from 'node:path' +import { app, utilityProcess } from 'electron' +import type { CodeModeHost } from '@/tool/codeMode/runCodeRuntimeManager' + +export async function spawnCodeModeHost(entry: string, signal: AbortSignal): Promise { + if (!path.isAbsolute(entry)) throw new Error('Code Mode helper entry must be absolute') + signal.throwIfAborted() + const env: Record = { DEEPCHAT_CODE_MODE_HOST: '1' } + for (const name of ['LANG', 'LC_ALL', 'TMPDIR', 'TEMP', 'TMP', 'SystemRoot']) { + const value = process.env[name] + if (value) env[name] = value + } + const host = utilityProcess.fork(entry, ['--deepchat-code-mode-host'], { + serviceName: 'DeepChat Code Mode Cell', + stdio: 'ignore', + env, + execArgv: ['--max-old-space-size=64'], + allowLoadingUnsignedLibraries: false + }) + if (signal.aborted) { + host.kill() + signal.throwIfAborted() + } + const events: NodeJS.EventEmitter = host + return { + get pid() { + return host.pid + }, + postMessage(message) { + host.postMessage(message) + }, + kill() { + host.kill() + }, + on(event, listener) { + events.on(event, listener) + }, + off(event, listener) { + events.off(event, listener) + }, + async getRssBytes(requestSignal) { + requestSignal.throwIfAborted() + if (!host.pid) return null + const metric = app.getAppMetrics().find((entry) => entry.pid === host.pid) + requestSignal.throwIfAborted() + return metric ? metric.memory.workingSetSize * 1024 : null + } + } +} diff --git a/src/main/app/composition.ts b/src/main/app/composition.ts index fa63e4b4a6..96d3c78689 100644 --- a/src/main/app/composition.ts +++ b/src/main/app/composition.ts @@ -1,3 +1,4 @@ +import { randomUUID } from 'node:crypto' import { SyncReplicaStore } from '@/sync/replica/store' import { SyncReplicaEndpoint } from '@/sync/replica/endpoint' import { AutomaticSync } from '@/sync/replica/automatic' @@ -25,6 +26,7 @@ import { projectEnvironmentsChangedEvent } from '@shared/contracts/events/projec import { approvalClosedEvent, approvalRequestedEvent, + settingsChangedEvent, liveDelegationChangedEvent, sessionsTapeInspectorHeadChangedEvent, sessionsUpdatedEvent @@ -32,7 +34,17 @@ import { import path from 'path' import { pathToFileURL } from 'node:url' import { DialogService } from '../desktop/dialog' -import { safeStorage, app, ipcMain, webContents as electronWebContents } from 'electron' +import { + safeStorage, + shell, + app, + ipcMain, + powerMonitor, + nativeTheme, + nativeImage, + net, + webContents as electronWebContents +} from 'electron' import { DEEPCHAT_EVENT_CHANNEL } from '@shared/contracts/channels' import { createDeepchatEventEnvelope, type DeepchatEventName } from '@shared/contracts/events' import { optimizer } from '@electron-toolkit/utils' @@ -55,14 +67,22 @@ import type { import type { DialogServicePort } from '@shared/types/dialog' import type { KnowledgeServicePort } from '@shared/types/knowledge' import { ProviderRuntime } from '../provider' -import { AgentInvocationAdmission } from '@/agent/invocationAdmission' +import { + RutisAgentInvocationAdmission, + DEFAULT_AGENT_INVOCATION_CAPACITY, + DEFAULT_AGENT_INVOCATION_MAX_PENDING +} from '@/agent/invocationAdmission' +import { HarnessRuntime } from '../harness/runtime' +import { RutisMemoryVectorStores } from '../harness/memory-vector' import { ProviderImportService } from '../provider/providerImportService' import { ProviderDatabase } from '../provider/data/database' import { createProviderRoutes } from '../provider/routes' import { ProviderSettings } from '../provider/settings' import type { SettingsStore } from '../config/settingsStore' import type { SecretStore } from '../config/secretStore' -import { providerDbLoader } from '../provider/providerDbLoader' +import { providerDbLoader, type ProviderDbBootstrap } from '../provider/providerDbLoader' +import { buildDefaultProviderHeaders } from '../provider/providerHeaders' +import { isInsecureTlsAllowed } from '../lib/insecureTls' import { AcpProvider } from '../provider/providers/acpProvider' import { proxyConfig, ProxyMode } from '../platform/proxy' import { DeviceService } from '../device' @@ -75,10 +95,21 @@ import { ToolchainResolutionError } from '@/toolchains/errors' import { createToolchainRoutes } from '@/toolchains/routes' import { AttachmentCapabilityRouter } from '@/ocr/attachmentCapabilityRouter' import { OcrRuntimeService } from '@/ocr/ocrRuntimeService' +import { SafeStorageOcrCacheKeyProvider } from '@/ocr/ocrCacheKeyProvider' import { OcrSettings } from '@/ocr/ocrSettings' import { createOcrRoutes } from '@/ocr/routes' import { McpService } from '../mcp' -import { ImportMode, SyncService, type SyncImportDatabasePort } from '../sync' +import { McpOAuthCredentialStore } from '@/mcp/oauthCredentialStore' +import { credentialCrypto, secureCredentialCrypto } from './credentialCrypto' +import { + ImportMode, + SyncService, + type SyncImportDatabasePort, + type SyncImportResult +} from '../sync' +import type { DatabaseSecurityStatus } from '@shared/contracts/routes' +import type { DatabaseRepairReport } from '@shared/types/databaseSchema' +import { DatabaseRequestGate } from './databaseRequestGate' import { SyncSettings } from '../sync/settings' import { DeeplinkService } from '../deeplink' import { createDeeplinkActions } from '../deeplink/actions' @@ -91,11 +122,19 @@ import { type SemanticNotificationPublisher } from '../notifications' import { DesktopSettings } from '../desktop/settings' +import { DesktopConfigurationHost } from '../desktop/configurationHost' +import { DesktopConfigurationProjection } from '../desktop/configurationProjection' +import { DesktopRemoteAuthWindows } from '../desktop/remoteAuthWindows' +import { DesktopImageActions } from '../desktop/imageActions' import { FontSettings } from '../desktop/fontSettings' import { TabPresenter } from '../desktop/tab' import { DesktopSessionBinding } from '@/desktop/sessionBinding' import { TrayPresenter } from '../desktop/tray' import { OAuthService } from '../provider/auth' +import { OpenAICodexCredentialStore } from '../provider/auth/openaiCodex/credentialStore' +import { XaiGrokCredentialStore } from '../provider/auth/xaiGrok/credentialStore' +import { initializeGlobalOpenAICodexAuth } from '../provider/auth/openaiCodex' +import { initializeGlobalXaiGrokAuth } from '../provider/auth/xaiGrok' import { FloatingButtonPresenter } from '../desktop/floatingButton' import { YoBrowserPresenter } from '../desktop/browser/YoBrowserPresenter' import { ComputerUsePreviewPresenter } from '@/desktop/computerUse/ComputerUsePreviewPresenter' @@ -108,7 +147,7 @@ import { RendererPerformanceLogService } from './rendererPerformanceLogService' import type { PrivacySettings } from './privacy' import type { ProxySettings } from '@/platform/proxySettings' import type { McpSettings } from '@/mcp/settings' -import type { McpAppSandboxRegistry } from '@/mcp/apps/sandboxRegistry' +import type { McpAppSandboxRegistry, McpAppDesktopPort } from '@/mcp/apps/sandboxRegistry' import type { AcpCatalogSettings } from '@/agent/acp/catalog/settings' import { ToolService } from '../tool' import { createToolRoutes } from '../tool/routes' @@ -137,6 +176,8 @@ import { createSyncHostRoutes } from '../sync/host/routes' import { createPlatformRoutes } from '../platform/routes' import { createHookRoutes } from '../hook/routes' import { createAppSettingsRoutes } from './settingsRoutes' +import { AppSettingsService } from './settingsService' +import type { SettingsActivityInput } from '@shared/contracts/routes' import { createAppRoutes } from './routes' import { registerClipboardIpc } from './clipboardIpc' import { createRendererIpcAuthorizer } from './rendererIpcSecurity' @@ -159,6 +200,8 @@ import { SkillExecutionAuthorityResolver } from '../skill/skillExecutionAuthorit import { HookService } from '../hook' import { HookSettings } from '../hook/config' import { SchedulerService, createCronJobRunSessionStarter } from '../scheduler' +import { SchedulerProcessManager } from '@/scheduler/schedulerProcessManager' +import { spawnSchedulerHost } from './schedulerHost' import { AgentManager } from '@/agent/manager/agentManager' import { createDeepChatAgentBackend } from '@/agent/manager/deepChatAgentBackend' import { createDirectAcpAgentBackend } from '@/agent/manager/directAcpAgentBackend' @@ -184,14 +227,15 @@ import { createDeepChatAgentHarness, type DeepChatAgentHarness } from '@/agent/d import type { RunJournalObservation } from '@/agent/deepchat/runtime/types' import { AcpAgentRuntime } from '@/agent/acp/instance' import { createAcpRuntimeOwner } from '@/agent/acp/createRuntimeOwner' +import { AcpRegistryService } from '@/agent/acp/catalog/acpRegistryService' +import { isAcpRegistryIconUrl } from '@/agent/acp/catalog/acpRegistryConstants' import { createAcpRoutes } from '@/agent/acp/routes' import { AcpSessionPersistence } from '@/agent/acp/runtime' import type { MemoryIngestionDrainOutcome, MemoryIngestionObserver } from '@/agent/deepchat/memory/memoryIngestionObserver' -import { MemoryService, isSafeAgentId, type MemoryServicePort } from '../memory' -import { createMemoryVectorStorePaths, MemoryVectorStore } from '../memory/infra/memoryVectorStore' +import { MemoryService, type MemoryServicePort } from '../memory' import { ProjectService } from '../project' import { ProjectDatabase } from '@/project/data/database' import { SettingsDatabase } from '@/settings/data/database' @@ -214,8 +258,10 @@ import { createProjectRoutes } from '../project/routes' import { RemoteService } from '../remote' import type { RemoteServiceLike } from '../remote/ports' import { PluginService, type PluginServicePort } from '../plugin' +import type { PluginToolPolicyStore } from '@/plugin/toolPolicyStore' import { createPluginRoutes } from '../plugin/routes' import { PluginRuntimeSupervisor } from '../plugin/runtimeSupervisor' +import { createMinimalProcessEnvironment } from '@/mcp/processEnvironment' import { AgentRepository } from '../agent/repository' import { AgentDatabase } from '@/agent/data/database' import { DeepChatDefaults } from '../agent/deepchat/defaults' @@ -290,7 +336,9 @@ import { import { CliRequestError } from '@/cli/errors' import { AcpRegistryMigrationService } from '@/agent/acp/catalog/acpRegistryMigrationService' import { AcpAuthService } from '@/agent/acp/auth/acpAuthService' -import { backgroundExecSessionManager } from '@/agent/shared/process/backgroundExecSessionManager' +import { BackgroundExecService } from '@/agent/shared/process/backgroundExecSessionManager' +import { spawnBackgroundExecHost } from './backgroundExecHost' +import { spawnCodeModeHost } from './codeModeHost' import { runBuiltinMcpAllowlistCompatibilityMigration, runDisabledAgentToolCapabilityCleanupMigration, @@ -313,6 +361,22 @@ import { type ApplicationDatabaseMaintenancePort = SyncImportDatabasePort & DatabaseSecurityMigrationDatabasePort +type DatabaseImportCommand = + | { kind: 'import-backup-file'; filePath: string; mode: 'increment' | 'overwrite' } + | { kind: 'import-backup'; fileName: string; mode: 'increment' | 'overwrite' } + +type DatabaseEncryptionCommand = + | { kind: 'enable-encryption'; password: string } + | { kind: 'change-password'; currentPassword: string; newPassword: string } + | { kind: 'disable-encryption'; currentPassword: string } + +type DatabaseRepairCommand = { kind: 'repair-schema' } +type DatabaseMaintenanceCommand = + | DatabaseImportCommand + | DatabaseEncryptionCommand + | DatabaseRepairCommand +type DatabaseMaintenanceResult = SyncImportResult | DatabaseSecurityStatus | DatabaseRepairReport + export interface MainProcessControl { focusPrimaryWindow(): void handleDeepLink(url: string): Promise @@ -499,12 +563,16 @@ function createLivePort(resolve: () => T): T { export async function createMainProcessControl(dependencies: { previousAppVersion?: string + currentAppVersion: string + providerCatalogBootstrap: ProviderDbBootstrap settingsStore: SettingsStore secretStore: SecretStore privacySettings: PrivacySettings proxySettings: ProxySettings mcpSettings: McpSettings + pluginToolPolicies: PluginToolPolicyStore mcpAppSandboxRegistry: McpAppSandboxRegistry + mcpAppDesktop: McpAppDesktopPort acpCatalogSettings: AcpCatalogSettings database: MainDatabase settingsDatabase: SettingsDatabase @@ -596,8 +664,13 @@ export async function createMainProcessControl(dependencies: { let cliRequestPolicy: CliRequestPolicy let cliRunService: CliRunService let hasInitialized = false - let databaseMaintenanceState: 'running' | 'maintenance' | 'failed' = 'running' let appLifecycleState: 'starting' | 'running' | 'stopping' | 'stopped' = 'starting' + const databaseRequests = new DatabaseRequestGate(() => { + if (appLifecycleState === 'stopping' || appLifecycleState === 'stopped') + throw new Error(`App lifecycle is ${appLifecycleState}`) + }) + let nativeSettings: DesktopConfigurationProjection + let appSettingsService: AppSettingsService let shutdownStepFailures = 0 let pluginInitializationPromise: Promise | null = null let skillInitializationPromise: Promise | null = null @@ -605,12 +678,8 @@ export async function createMainProcessControl(dependencies: { windowPresenter = new WindowPresenter( { - getCloseToQuit: () => dependencies.settingsStore.get('closeToQuit') ?? false, - getContentProtectionEnabled: () => - dependencies.settingsStore.get('contentProtectionEnabled') ?? false - }, - () => { - restartApplication().catch((error) => logger.error('Application restart failed:', error)) + getCloseToQuit: () => nativeSettings.getCloseToQuit(), + getContentProtectionEnabled: () => nativeSettings.getContentProtectionEnabled() }, dependencies.onWindowCreated, startupWorkloadCoordinator @@ -652,12 +721,14 @@ export async function createMainProcessControl(dependencies: { appVersion: app.getVersion(), dispatch: async (method, input, caller, signal) => { if (cliAudioTranscriptionService?.handlesRpc(method)) { - assertRouteAllowedDuringDatabaseMaintenance(method) - return await cliAudioTranscriptionService.dispatchRpc(method, input, caller, signal) + return await databaseRequests.runRequest(method, () => + cliAudioTranscriptionService!.dispatchRpc(method, input, caller, signal) + ) } if (cliOcrService?.handlesRpc(method)) { - assertRouteAllowedDuringDatabaseMaintenance(method) - return await cliOcrService.dispatchRpc(method, input, caller, signal) + return await databaseRequests.runRequest(method, () => + cliOcrService!.dispatchRpc(method, input, caller, signal) + ) } if (!routeDispatcher) throw new Error('CLI route dispatcher is not ready') signal.throwIfAborted() @@ -673,14 +744,15 @@ export async function createMainProcessControl(dependencies: { signal, takeSettlementOwnership ) => { - assertRouteAllowedDuringDatabaseMaintenance(method) - return await programmaticToolDispatcher.dispatch( - method, - input, - caller, - operation, - signal, - takeSettlementOwnership + return await databaseRequests.runRequest(method, () => + programmaticToolDispatcher.dispatch( + method, + input, + caller, + operation, + signal, + takeSettlementOwnership + ) ) }, completeProgrammaticToolPreDispatchFailure: (method, operation, error) => { @@ -688,35 +760,39 @@ export async function createMainProcessControl(dependencies: { }, dispatchStream: async (method, input, caller, requestId, signal, emit) => { if (cliRunService?.handlesStream(method)) { - assertRouteAllowedDuringDatabaseMaintenance(method) + databaseRequests.assertRouteAllowed(method) return await cliRunService.dispatchStream(method, input, caller, signal, emit) } if (!cliComputeService) throw new Error('CLI compute service is not ready') - assertRouteAllowedDuringDatabaseMaintenance(method) - return await cliComputeService.dispatchStream(method, input, caller, requestId, signal, emit) + return await databaseRequests.runRequest(method, () => + cliComputeService.dispatchStream(method, input, caller, requestId, signal, emit) + ) }, dispatchUpload: async (method, input, upload, caller, signal) => { - assertRouteAllowedDuringDatabaseMaintenance(method) - if (cliAudioTranscriptionService?.handlesUpload(method)) { - return await cliAudioTranscriptionService.dispatchUpload( - method, - input, - upload, - caller, - signal - ) - } - if (cliOcrService?.handlesUpload(method)) { - return await cliOcrService.dispatchUpload(method, input, upload, caller, signal) - } - if (cliSkillService?.handlesUpload(method)) { - return await cliSkillService.dispatchUpload(method, input, upload, caller, signal) - } - throw new Error(`CLI upload service is not ready for ${method}`) + return await databaseRequests.runRequest(method, async () => { + if (cliAudioTranscriptionService?.handlesUpload(method)) { + return await cliAudioTranscriptionService.dispatchUpload( + method, + input, + upload, + caller, + signal + ) + } + if (cliOcrService?.handlesUpload(method)) { + return await cliOcrService.dispatchUpload(method, input, upload, caller, signal) + } + if (cliSkillService?.handlesUpload(method)) { + return await cliSkillService.dispatchUpload(method, input, upload, caller, signal) + } + throw new Error(`CLI upload service is not ready for ${method}`) + }) }, authorize: async (input) => { if (!cliRequestPolicy) throw new Error('CLI request policy is not ready') - return await cliRequestPolicy.authorize(input) + return await databaseRequests.runAuthorization(input.entry.contract.name, () => + cliRequestPolicy.authorize(input) + ) }, beginAgentRequest: (token) => agentCliTokenAuthority.beginRequest(token), artifactSpool, @@ -767,7 +843,15 @@ export async function createMainProcessControl(dependencies: { }) } } + let settingsRevision = 0 + const nextSettingsVersion = () => ++settingsRevision const publishDeepchatEvent = (name: DeepchatEventName, payload: unknown): void => { + if (name === 'settings.changed') { + payload = { + ...settingsChangedEvent.payload.parse(payload), + version: nextSettingsVersion() + } + } sessionEventRouter.publish(name, payload) if (name === 'sessions.status.changed') { const state = payload as { sessionId: string; status: string } @@ -794,6 +878,8 @@ export async function createMainProcessControl(dependencies: { dependencies.privacySettings, dependencies.providerDatabase, publishDeepchatEvent, + dependencies.currentAppVersion, + dependencies.providerCatalogBootstrap, dependencies.previousAppVersion ) @@ -978,7 +1064,7 @@ export async function createMainProcessControl(dependencies: { projectDatabase, memoryDatabase, sessionData.tapeStore, - undefined, + path.join(app.getPath('userData'), 'app_db', 'chat.db'), () => projectService.notifyEnvironmentProjectionChanged() ) usageStatsService = new UsageStatsService( @@ -987,41 +1073,134 @@ export async function createMainProcessControl(dependencies: { dependencies.settingsStore, sessionData.tapeStore ) + const desktopConfigurationHost = new DesktopConfigurationHost( + app.getPath('userData'), + setMainLoggingEnabled, + restartApplication + ) const desktopSettings = new DesktopSettings( dependencies.settingsStore, { - refreshLanguage: () => { - floatingButtonPresenter.refreshLanguage() - void tabPresenter.refreshLanguage() + systemLocale: app.getLocale(), + readTheme: async () => ({ + theme: nativeTheme.themeSource, + isDark: nativeTheme.shouldUseDarkColors + }), + applyTheme: async (theme) => { + nativeTheme.themeSource = theme + return nativeTheme.shouldUseDarkColors + }, + refreshLanguage: async (locale) => { + floatingButtonPresenter.refreshLanguage(locale) + await tabPresenter.refreshLanguage(locale) + }, + refreshTheme: (isDark) => floatingButtonPresenter.refreshTheme(isDark), + readLaunchAtLogin: async () => app.getLoginItemSettings().openAtLogin, + setLaunchAtLogin: async (enabled) => { + app.setLoginItemSettings({ openAtLogin: enabled }) + return app.getLoginItemSettings().openAtLogin + }, + applyContentProtection: async (enabled) => { + ;(windowPresenter as WindowPresenter).applyContentProtection(enabled) + desktopConfigurationHost.requestRestart() }, - refreshTheme: () => floatingButtonPresenter.refreshTheme() + applyFloatingButtonEnabled: (enabled) => floatingButtonPresenter.setEnabled(enabled) }, - publishDeepchatEvent + publishDeepchatEvent, + () => appSettingsService.publishNativeSnapshot() + ) + const fontSettings = new FontSettings(dependencies.settingsStore, publishDeepchatEvent, () => + desktopConfigurationHost.listSystemFonts() ) - const fontSettings = new FontSettings(dependencies.settingsStore, publishDeepchatEvent) - const skillSettings = new SkillSettings(dependencies.settingsStore) + const skillSettings = new SkillSettings(dependencies.settingsStore, app.getPath('home')) const traceSettings = new AgentTraceSettings(dependencies.settingsStore) + const acpBootstrap = { + appVersion: dependencies.currentAppVersion, + homeDirectory: app.getPath('home'), + temporaryDirectory: app.getPath('temp') + } const acpSessionPersistence = new AcpSessionPersistence( agentDatabase, sessionData.database, projectDatabase, + acpBootstrap.homeDirectory, () => projectService.notifyEnvironmentProjectionChanged() ) let providerRuntime!: ProviderRuntime + const codexAuth = initializeGlobalOpenAICodexAuth( + publishDeepchatEvent, + new OpenAICodexCredentialStore({ + filePath: path.join(app.getPath('userData'), 'openai-codex-auth', 'credentials.json'), + crypto: credentialCrypto + }), + (url) => shell.openExternal(url) + ) + const grokAuth = initializeGlobalXaiGrokAuth( + publishDeepchatEvent, + new XaiGrokCredentialStore({ + filePath: path.join(app.getPath('userData'), 'xai-grok-auth', 'credentials.json'), + crypto: credentialCrypto + }), + (url) => shell.openExternal(url) + ) oauthService = new OAuthService( { - getProviderById: (providerId) => providerSettings.getProviderById(providerId), - setProviderById: (providerId, provider) => - providerRuntime.setProviderById(providerId, provider) + getGitHubCopilotSignInTarget: async (providerId) => { + if (databaseRequests.state !== 'running') + throw new Error(`App database maintenance is ${databaseRequests.state}`) + return await providerRuntime.getGitHubCopilotSignInTarget(providerId) + }, + commitGitHubCopilotCredential: async (target, apiKey) => { + if (databaseRequests.state !== 'running') + throw new Error(`App database maintenance is ${databaseRequests.state}`) + await providerRuntime.commitGitHubCopilotCredential(target, apiKey) + }, + invalidateGitHubCopilotSignIns: () => providerRuntime.invalidateGitHubCopilotSignIns() }, - publishDeepchatEvent + { + getOpenAICodexStatus: () => codexAuth.getStatus(), + startOpenAICodexBrowserLogin: () => codexAuth.startBrowserLogin(), + completeOpenAICodexBrowserLoginFromUrl: (url) => + codexAuth.completeBrowserLoginFromCallbackUrl(url), + cancelOpenAICodexLogin: () => codexAuth.cancelLogin(), + logoutOpenAICodex: () => codexAuth.logout(), + getXaiGrokStatus: () => grokAuth.getStatus(), + startXaiGrokDeviceLogin: () => grokAuth.startDeviceLogin(), + cancelXaiGrokLogin: () => grokAuth.cancelLogin(), + logoutXaiGrok: () => grokAuth.logout(), + stop: async () => { + codexAuth.stop() + grokAuth.stop() + } + } ) + const acpRegistry = new AcpRegistryService({ + userDataDirectory: app.getPath('userData'), + builtInDirectory: path.join( + app.isPackaged ? path.join(process.resourcesPath, 'app.asar.unpacked') : app.getAppPath(), + 'resources', + 'acp-registry' + ), + isPrivacyModeEnabled: () => dependencies.privacySettings.isEnabled(), + fetchIcon: async (url, signal) => { + if (!isAcpRegistryIconUrl(url)) throw new Error('Unsupported ACP registry icon URL') + signal.throwIfAborted() + const response = await net.fetch(url, { signal }) + if (!response.ok) { + throw new Error(`Failed to fetch icon: ${response.status} ${response.statusText}`) + } + const text = await response.text() + signal.throwIfAborted() + if (text.length > 1024 * 1024) throw new Error('ACP registry icon exceeds the size limit') + return text + } + }) const agentSettings = new AgentSettings( dependencies.settingsStore, agentRepository, dependencies.acpCatalogSettings, - () => dependencies.privacySettings.isEnabled(), + acpRegistry, app.getPath('userData'), { getModelConfig: (modelId, providerId) => providerSettings.getModelConfig(modelId, providerId), @@ -1061,9 +1240,11 @@ export async function createMainProcessControl(dependencies: { }, (agentId) => memoryService.onAgentMemoryMaintenanceConfigChanged(agentId), skillSettings, - agentLifecycle + agentLifecycle, + () => databaseRequests.assertRouteAllowed('config.ensureAcpAgentInstalled') ) const acpRuntimeOwner = createAcpRuntimeOwner({ + bootstrap: acpBootstrap, providerConfig: providerSettings, agentSettings, mcpSettings: dependencies.mcpSettings, @@ -1104,7 +1285,11 @@ export async function createMainProcessControl(dependencies: { }) providerRuntime = new ProviderRuntime( providerSettings, - desktopSettings, + { + getLanguage: () => desktopSettings.getLanguage(), + defaultHeaders: buildDefaultProviderHeaders(dependencies.currentAppVersion), + allowInsecureTls: isInsecureTlsAllowed() + }, agentSettings, dependencies.mcpSettings, acpRuntimeOwner, @@ -1219,19 +1404,37 @@ export async function createMainProcessControl(dependencies: { deviceService = new DeviceService() const loggingService = new LoggingService( dependencies.settingsStore, - () => { - restartApplication().catch((error) => logger.error('Application restart failed:', error)) - }, + desktopConfigurationHost, publishDeepchatEvent, - setMainLoggingEnabled + () => appSettingsService.publishNativeSnapshot() ) const rendererPerformanceLogService = new RendererPerformanceLogService( - dependencies.settingsStore + () => nativeSettings.getLoggingEnabled(), + app.getPath('userData') ) + const resolveProjectDirectory = (name: 'documents' | 'home'): string | null => { + try { + return app.getPath(name) + } catch (error) { + console.warn( + `[ProjectService] Failed to resolve ${name === 'documents' ? 'Documents' : 'Home'} path:`, + error + ) + return null + } + } projectService = new ProjectService( projectDatabase, sessionData.database, - deviceService, + { + tempDirectory: app.getPath('temp'), + userDataDirectory: app.getPath('userData'), + appDataDirectory: app.getPath('appData'), + documentsDirectory: resolveProjectDirectory('documents'), + homeDirectory: resolveProjectDirectory('home'), + selectDirectory: () => deviceService.selectDirectory(), + openPath: (directory) => shell.openPath(directory) + }, dependencies.settingsStore, (projectPath, version) => publishDeepchatEvent('config.defaultProjectPath.changed', { @@ -1258,10 +1461,13 @@ export async function createMainProcessControl(dependencies: { sqlitePresenter: sessionData.database, settings: dependencies.settingsStore }) - const updateSettings = new UpdateSettings(dependencies.settingsStore) + const updateSettings = new UpdateSettings( + dependencies.settingsStore, + dependencies.currentAppVersion + ) upgradeService = new UpgradeService( - updateSettings, - () => dependencies.privacySettings.isEnabled(), + { getChannel: () => nativeSettings.getChannel() }, + () => nativeSettings.isPrivacyModeEnabled(), dependencies.requestUpdateInstall, publishDeepchatEvent, (observation) => @@ -1270,9 +1476,40 @@ export async function createMainProcessControl(dependencies: { error: { category: observation.errorCategory } }) ) - shortcutPresenter = new ShortcutPresenter(desktopSettings, windowPresenter, publishDeepchatEvent) - fileService = new FileService(dependencies.settingsStore) + fileService = new FileService(dependencies.settingsStore, app.getPath('userData')) + const desktopImageActions = new DesktopImageActions(app.getPath('userData')) ocrSettings = new OcrSettings(dependencies.settingsStore, publishDeepchatEvent) + const recordSettingsActivity = (input: SettingsActivityInput) => { + void settingsDatabase.recordSettingsActivity(input).catch((error) => { + console.warn('[SettingsActivity] Failed to record settings activity:', error) + }) + } + appSettingsService = new AppSettingsService({ + ownerId: randomUUID(), + updateSettings, + publishNativeSnapshot: (snapshot) => nativeSettings.apply(snapshot), + agentDefaults, + privacy: dependencies.privacySettings, + traceSettings, + desktopSettings, + fonts: fontSettings, + logging: loggingService, + ocr: ocrSettings, + recordActivity: recordSettingsActivity, + publishEvent: publishDeepchatEvent, + nextVersion: nextSettingsVersion, + assertActive: () => { + databaseRequests.assertRouteAllowed('settings.update') + if (databaseRequests.state !== 'running') + throw new Error(`App database maintenance is ${databaseRequests.state}`) + } + }) + nativeSettings = new DesktopConfigurationProjection( + appSettingsService.readNativeSnapshot(), + () => nativeTheme.shouldUseDarkColors, + (bounds) => appSettingsService.setFloatingButtonBounds(bounds) + ) + shortcutPresenter = new ShortcutPresenter(nativeSettings, windowPresenter, publishDeepchatEvent) const toolchainHomeDir = app.getPath('home') const toolchainService = ToolchainService.initialize({ appPath: app.getAppPath(), @@ -1307,6 +1544,9 @@ export async function createMainProcessControl(dependencies: { }) } ocrRuntimeService = new OcrRuntimeService({ + cacheKeyProvider: new SafeStorageOcrCacheKeyProvider( + path.join(app.getPath('userData'), 'ocr', 'cache-key.json') + ), appPath: app.getAppPath(), isPackaged: app.isPackaged, nodeRuntimePath: null, @@ -1344,7 +1584,8 @@ export async function createMainProcessControl(dependencies: { const syncSettings = new SyncSettings( dependencies.settingsStore, dependencies.secretStore, - publishDeepchatEvent + publishDeepchatEvent, + app.getPath('home') ) const hookSettings = new HookSettings(dependencies.settingsStore) const knowledgeSettings = new KnowledgeSettings( @@ -1356,19 +1597,24 @@ export async function createMainProcessControl(dependencies: { mainDatabase, settingsDatabase, providerDatabase, - publishDeepchatEvent + publishDeepchatEvent, + { + profileDirectory: app.getPath('userData'), + temporaryDirectory: app.getPath('temp'), + openPath: (directory) => shell.openPath(directory) + } ) const syncTokenStorage = { - protectToken: (token: string) => { + protectToken: async (token: string) => { if ( - !safeStorage.isEncryptionAvailable() || - (process.platform === 'linux' && safeStorage.getSelectedStorageBackend() === 'basic_text') + process.platform === 'linux' && + safeStorage.getSelectedStorageBackend() === 'basic_text' ) { throw new Error('sync.error.safeStorageUnavailable') } - return safeStorage.encryptString(token).toString('base64') + return await dependencies.secretStore.wrap(token) }, - revealToken: (wrapped: string) => safeStorage.decryptString(Buffer.from(wrapped, 'base64')) + revealToken: (wrapped: string) => dependencies.secretStore.unwrap(wrapped) } syncPeerService = new SyncPeerService({ directory: path.join(app.getPath('userData'), 'sync-peer'), @@ -1376,10 +1622,8 @@ export async function createMainProcessControl(dependencies: { ...syncTokenStorage, isLocalDatabaseEncrypted: () => Boolean(mainDatabase.getDatabasePassword()), importSnapshot: (filePath, mode) => { - if (databaseMaintenanceState !== 'running') throw new Error('sync.tunnel.error.busy') - return runDatabaseMaintenance((database) => - syncService.importBackupFile(filePath, mode, database) - ) + if (databaseRequests.state !== 'running') throw new Error('sync.tunnel.error.busy') + return runDatabaseMaintenance({ kind: 'import-backup-file', filePath, mode }) } }) const syncAppliedSessions = new Set() @@ -1396,7 +1640,7 @@ export async function createMainProcessControl(dependencies: { database: () => mainDatabase.getDatabase(), directory: path.join(app.getPath('userData'), 'sync-replica'), canApply: (kind, id) => - databaseMaintenanceState === 'running' && + databaseRequests.state === 'running' && (kind === 'session' ? !syncActiveSessions.has(id) && !hasPendingSyncSession(id) && @@ -1517,7 +1761,7 @@ export async function createMainProcessControl(dependencies: { directory: path.join(app.getPath('userData'), 'sync-host'), hostId: () => syncHostService.getHostId(), available: () => - databaseMaintenanceState === 'running' && + databaseRequests.state === 'running' && !syncService.isBackupInProgress() && !mainDatabase.getDatabasePassword() }) @@ -1526,7 +1770,7 @@ export async function createMainProcessControl(dependencies: { directory: path.join(app.getPath('userData'), 'sync-peer'), connection: () => syncPeerService.connection(), available: () => - databaseMaintenanceState === 'running' && + databaseRequests.state === 'running' && !syncService.isBackupInProgress() && !mainDatabase.getDatabasePassword(), isEncrypted: () => Boolean(mainDatabase.getDatabasePassword()), @@ -1540,7 +1784,7 @@ export async function createMainProcessControl(dependencies: { ...syncTokenStorage, createBackup: () => { - if (databaseMaintenanceState !== 'running') throw new Error('sync.tunnel.error.busy') + if (databaseRequests.state !== 'running') throw new Error('sync.tunnel.error.busy') return syncService.createHostBackup() }, getFolderPath: () => syncSettings.getFolderPath(), @@ -1548,8 +1792,8 @@ export async function createMainProcessControl(dependencies: { getAppVersion: () => app.getVersion(), logger }) - notificationService = new NotificationService(desktopSettings, publishDeepchatEvent) - trayPresenter = new TrayPresenter(desktopSettings, windowPresenter) + notificationService = new NotificationService(nativeSettings, publishDeepchatEvent) + trayPresenter = new TrayPresenter(nativeSettings, windowPresenter) dialogService = new DialogService(publishDeepchatEvent) agentPreviewCoordinator = new AgentPreviewCoordinator() yoBrowserPresenter = new YoBrowserPresenter( @@ -1567,6 +1811,12 @@ export async function createMainProcessControl(dependencies: { knowledgeService = new KnowledgeService({ config: knowledgeSettings, storageRoot: dbDir, + extensionDirectory: path.join( + app.getAppPath().replace('app.asar', 'app.asar.unpacked'), + 'runtime', + 'duckdb', + 'extensions' + ), files: fileService, dialog: dialogService, embeddings: providerRuntime, @@ -1602,11 +1852,26 @@ export async function createMainProcessControl(dependencies: { () => deepChatAgentHarness.refreshToolRegistry(), semanticNotifications, publishDeepchatEvent, + dependencies.pluginToolPolicies, + { + homeDirectory: app.getPath('home'), + appVersion: app.getVersion(), + toolchains: toolchainService, + getProxyUrl: async () => proxyConfig.getProxyUrl() + }, + { + store: new McpOAuthCredentialStore({ + filePath: path.join(app.getPath('userData'), 'mcp-oauth', 'credentials.json'), + crypto: secureCredentialCrypto + }), + openExternal: (url) => shell.openExternal(url) + }, (data, options) => deviceService.cacheImage(data, options), pluginRuntimeSupervisor, computerUsePreviewPresenter, { registry: dependencies.mcpAppSandboxRegistry, + desktop: dependencies.mcpAppDesktop, permissionBroker: toolPermissionBroker, getPermissionMode: async (conversationId) => sessionData.settings.get(conversationId)?.permission_mode ?? 'default', @@ -1638,8 +1903,11 @@ export async function createMainProcessControl(dependencies: { }) const deeplinkActions = createDeeplinkActions({ window: windowPresenter, - config: providerSettings, - mcp: mcpService, + hasProvider: async (providerId) => { + if (databaseRequests.state !== 'running') + throw new Error(`App database maintenance is ${databaseRequests.state}`) + return Boolean(providerSettings.getProviderById(providerId)) + }, notifications: semanticNotifications }) deeplinkService = new DeeplinkService( @@ -1673,6 +1941,21 @@ export async function createMainProcessControl(dependencies: { skillSessionStatePort, fileWatcherService, publishDeepchatEvent, + { + homeDirectory: app.getPath('home'), + tempDirectory: app.getPath('temp'), + userDataDirectory: app.getPath('userData'), + builtinSkillsDirectories: app.isPackaged + ? [ + path.join(process.resourcesPath, 'app.asar.unpacked', 'resources', 'skills'), + path.join(process.resourcesPath, 'resources', 'skills'), + path.join(process.resourcesPath, 'skills') + ] + : [path.join(app.getAppPath(), 'resources', 'skills')], + openSkillsDirectory: async (directory) => { + await shell.openPath(directory) + } + }, { isDeepChatAgent: async (agentId) => (await agentSettings.getAgent(agentId))?.type === 'deepchat', @@ -1706,9 +1989,11 @@ export async function createMainProcessControl(dependencies: { log: logger }) - const agentInvocationAdmission = new AgentInvocationAdmission(undefined, undefined, { + const admissionDiagnostics = { observationsEnabled: () => mainLogger.isOutputEnabled(), - observe: (observation) => { + observe: ( + observation: import('@shared/harness/admission').AgentInvocationAdmissionObservation + ) => { switch (observation.type) { case 'queued': mainLogger.emit('agent.admission.queued', observation) @@ -1727,7 +2012,21 @@ export async function createMainProcessControl(dependencies: { break } } + } + const harnessRuntime = await HarnessRuntime.start({ + directory: app.isPackaged + ? path.join(process.resourcesPath, 'app.asar.unpacked', 'harness') + : path.join(app.getAppPath(), 'out', 'harness'), + electronExecutable: process.execPath, + capacity: DEFAULT_AGENT_INVOCATION_CAPACITY, + maxPending: DEFAULT_AGENT_INVOCATION_MAX_PENDING, + observe: admissionDiagnostics.observe + }) + const agentInvocationAdmission = RutisAgentInvocationAdmission.create({ + runtime: harnessRuntime, + diagnostics: admissionDiagnostics }) + console.info('[Harness] Rutis admission ready', agentInvocationAdmission.identity) const resolveConversationExecutionAuthorityNow = (conversationId: string) => { const session = appSessionService.get(conversationId) if (!session) return null @@ -1775,7 +2074,14 @@ export async function createMainProcessControl(dependencies: { }) } } + const backgroundExec = new BackgroundExecService((signal) => + spawnBackgroundExecHost( + path.join(app.getAppPath(), 'out/main/backgroundExecUtilityHost.js'), + signal + ) + ) const agentToolDependencies: AgentToolDependencies = { + backgroundExec, readSession: (callerSessionId, input) => sessionData.sessionReferences.read(callerSessionId, input), agentInvocationAdmission, @@ -1938,6 +2244,14 @@ export async function createMainProcessControl(dependencies: { }, cacheImage: (data, options) => deviceService.cacheImage(data, options), desktop: { + tempDirectory: app.getPath('temp'), + profileTempDirectory: path.join(app.getPath('userData'), 'temp'), + readImageSize: async (filePath, signal) => { + signal?.throwIfAborted() + const size = nativeImage.createFromPath(filePath).getSize() + signal?.throwIfAborted() + return { width: size.width, height: size.height } + }, createSettingsWindow: () => windowPresenter.createSettingsWindow(), sendToWindow: (windowId, channel, ...args) => windowPresenter.sendToWindow(windowId, channel, ...args), @@ -1958,12 +2272,15 @@ export async function createMainProcessControl(dependencies: { // Initialize the merged MCP and built-in Tool service. toolService = new ToolService({ + pluginToolPolicies: dependencies.pluginToolPolicies, + spawnCodeModeHost: (signal) => + spawnCodeModeHost(path.join(app.getAppPath(), 'out/main/codeModeUtilityHost.js'), signal), mcpService: mcpService, providerSettings: providerSettings, settings: dependencies.settingsStore, agentSettings, skillSettings, - desktopSettings, + desktopSettings: appSettingsService, commandPermissionHandler, commandEnvironment: agentCliCommandAccess, permissionBroker: toolPermissionBroker, @@ -1986,6 +2303,20 @@ export async function createMainProcessControl(dependencies: { // Plugin activation is a shared startup barrier for Skill migration and MCP startup. const pluginSettingsWindow = new PluginSettingsWindow() pluginService = new PluginService({ + workingDirectory: process.cwd(), + profileDirectory: app.getPath('userData'), + homeDirectory: app.getPath('home'), + appPath: app.getAppPath(), + appVersion: app.getVersion(), + isPackaged: app.isPackaged, + resourcesPath: process.resourcesPath, + openExternal: (url) => shell.openExternal(url), + openPath: (filePath) => shell.openPath(filePath), + hookEnvironment: () => + toolchainService.prependResolvedToEnv( + createMinimalProcessEnvironment(process.env, process.platform) + ), + toolPolicies: dependencies.pluginToolPolicies, nowledgeMem: nowledgeMemConnections, exportNowledgeSession: (input) => agentSessionExportService.submitToNowledgeMem(input), contextTape: sessionData.tapeStore, @@ -1999,9 +2330,11 @@ export async function createMainProcessControl(dependencies: { // Initialize Skill Sync service skillSyncService = new SkillSyncService(skillService, skillSettings, publishDeepchatEvent) - hookService = new HookService(hookSettings, { - getSession: (sessionId) => sessionQuery.getSession(sessionId) - }) + hookService = new HookService( + hookSettings, + { getSession: (sessionId) => sessionQuery.getSession(sessionId) }, + app.getVersion() + ) const providerCatalogPort: ProviderCatalogPort = { getProviderModels: (providerId) => providerSettings.getProviderModels(providerId), getCustomModels: (providerId) => providerSettings.getCustomModels(providerId), @@ -2025,9 +2358,14 @@ export async function createMainProcessControl(dependencies: { }) // Initialize agent memory layer (opt-in per agent; vectors stored separately from knowledge base) const memoryDbDir = path.join(dbDir, 'AgentMemory') - MemoryVectorStore.recoverQuarantinedStores(memoryDbDir) - const memoryVectorDbPaths = (agentId: string) => - createMemoryVectorStorePaths(memoryDbDir, agentId) + const memoryVectorStores = new RutisMemoryVectorStores(harnessRuntime, { + memoryDbDir, + host: { + appPath: app.getAppPath(), + userDataPath: app.getPath('userData'), + isPackaged: app.isPackaged + } + }) memoryService = new MemoryService({ repository: createLivePort(() => memoryDatabase.agentMemoryTable), directiveRepository: createLivePort(() => memoryDatabase.agentMemoryDirectiveTable), @@ -2051,26 +2389,10 @@ export async function createMainProcessControl(dependencies: { (agentId) => agentRepository.resolveDeepChatAgentConfig(agentId).memoryEnabled === true ), ...createMemoryProviderBindings(providerRuntime), - createVectorStore: (agentId, embedding, dimensions) => { - if (!isSafeAgentId(agentId)) { - throw new Error(`[Memory] refusing to open vector store for unsafe agentId: ${agentId}`) - } - return MemoryVectorStore.create(memoryVectorDbPaths(agentId), dimensions, embedding) - }, - resetVectorStore: async (agentId) => { - if (!isSafeAgentId(agentId)) { - throw new Error(`[Memory] refusing to reset vector store for unsafe agentId: ${agentId}`) - } - MemoryVectorStore.destroyFiles(memoryVectorDbPaths(agentId)) - }, - markVectorStoreQuarantined: (agentId) => { - if (!isSafeAgentId(agentId)) { - throw new Error( - `[Memory] refusing to quarantine vector store for unsafe agentId: ${agentId}` - ) - } - MemoryVectorStore.markQuarantined(memoryVectorDbPaths(agentId)) - }, + createVectorStore: (agentId, embedding, dimensions) => + memoryVectorStores.createVectorStore(agentId, embedding, dimensions), + resetVectorStore: (agentId) => memoryVectorStores.resetVectorStore(agentId), + markVectorStoreQuarantined: (agentId) => memoryVectorStores.markVectorStoreQuarantined(agentId), onMemoryChanged: (agentId, reason, context) => publishDeepchatEvent('memory.updated', { agentId, @@ -2148,10 +2470,8 @@ export async function createMainProcessControl(dependencies: { }) const sessionTranscriptMutations = new SessionTranscriptMutations({ transcript: sessionData.transcript, - settings: sessionData.settings, - pendingInputs: sessionData.pendingInputs, runtime: deepChatAgentHarness, - runInTransaction: (operation) => sessionData.database.getDatabase().transaction(operation)() + clearTranscript: sessionData.clearTranscript }) memoryIngestionObserver = deepChatAgentHarness.memoryIngestionObserver acpAgentRuntime = new AcpAgentRuntime( @@ -2251,7 +2571,7 @@ export async function createMainProcessControl(dependencies: { ;(windowPresenter as WindowPresenter).bindTabPresenter(tabPresenter) floatingButtonPresenter = new FloatingButtonPresenter( agentSettings, - desktopSettings, + nativeSettings, sessionQuery, desktopSessionBinding, windowPresenter as WindowPresenter, @@ -2464,6 +2784,7 @@ export async function createMainProcessControl(dependencies: { (turn.status === 'waiting_permission' || turn.status === 'waiting_question') && resolveSessionRunId(delegation.parentSessionId) === runId ), + readSubscriptionSnapshot: (read) => databaseRequests.runRequest('events.subscribe', read), eventHub: typedEventHub, log: logger }) @@ -2581,7 +2902,12 @@ export async function createMainProcessControl(dependencies: { } }) liveDelegationService = createLiveDelegationService() + const remoteAuthWindows = new DesktopRemoteAuthWindows((event) => + remoteService.handleAuthWindowEvent(event) + ) remoteService = new RemoteService({ + profileDirectory: app.getPath('userData'), + authWindows: remoteAuthWindows, settings: dependencies.settingsStore, catalog: { getAgentType: (agentId) => agentSettings.getAgentType(agentId), @@ -2613,7 +2939,7 @@ export async function createMainProcessControl(dependencies: { } }, workspace: { - getDefaultProjectPath: () => projectService.getDefaultProjectPath(), + getDefaultProjectPath: async () => projectService.getDefaultProjectPath(), prepareFile: (filePath, type) => fileService.prepareFile(filePath, type) }, lifecycle: sessionLifecycle, @@ -2632,6 +2958,8 @@ export async function createMainProcessControl(dependencies: { } }) cronJobs = new SchedulerService({ + createSchedulerManager: (deps) => + new SchedulerProcessManager({ ...deps, spawnHost: spawnSchedulerHost }), database: schedulerDatabase, agentSettings, sessionEvents: sessionRuntimeEvents, @@ -2642,8 +2970,22 @@ export async function createMainProcessControl(dependencies: { }), remoteDeliveryPort: remoteService }) + const onSystemResume = () => { + if (appLifecycleState !== 'running' || databaseRequests.state !== 'running') return + void cronJobs.handleSystemResume().catch((error) => { + console.warn('[CronJobs] Failed to reconcile after system resume:', error) + }) + } + powerMonitor.on('resume', onSystemResume) - desktopSettings.initializeTheme() + await appSettingsService.initializeDesktop() + const onSystemThemeUpdated = () => { + if (appLifecycleState !== 'running' || databaseRequests.state !== 'running') return + void appSettingsService.observeSystemTheme().catch((error) => { + console.warn('[Settings] Failed to refresh system theme:', error) + }) + } + nativeTheme.on('updated', onSystemThemeUpdated) function setupTray() { console.info('setupTray', !!trayPresenter) @@ -2874,7 +3216,9 @@ export async function createMainProcessControl(dependencies: { try { deepChatAgentHarness.refreshToolRegistry() - deeplinkService.processPendingMcpInstall() + deeplinkService.observeMcpReadiness( + !['stopping', 'stopped'].includes(appLifecycleState) && databaseRequests.state === 'running' + ) } catch (error) { reportMainStartupComponentFailure(dependencies.startupRunId, 'mcp_integration', 'unknown') console.error('Failed to finish MCP startup integration:', error) @@ -2891,6 +3235,23 @@ export async function createMainProcessControl(dependencies: { } async function initializeIdleProviderWarmup(taskContext: StartupWorkloadTaskContext) { + taskContext.signal.throwIfAborted() + const [registryRefresh, catalogRefresh] = await Promise.allSettled([ + agentSettings.refreshAcpRegistry(false, { + automatic: true, + signal: taskContext.signal + }), + providerDbLoader.refreshIfNeeded(true, { + automatic: true, + signal: taskContext.signal + }) + ]) + taskContext.signal.throwIfAborted() + if (registryRefresh.status === 'rejected') throw registryRefresh.reason + if (catalogRefresh.status === 'rejected') throw catalogRefresh.reason + if (catalogRefresh.value.status === 'error') { + console.warn('[ProviderDbLoader] Startup refresh failed:', catalogRefresh.value.message) + } const enabledProviders = providerSettings .getEnabledProviders() .map((provider) => provider.id) @@ -2930,8 +3291,16 @@ export async function createMainProcessControl(dependencies: { } async function destroy(): Promise { + nativeTheme.off('updated', onSystemThemeUpdated) + nativeSettings.stopWrites() + await appSettingsService.stop() + await nativeSettings.drainWrites() await runDestroyStep('agentCliTokenAuthority.clear', () => agentCliTokenAuthority.clear()) await runDestroyStep('cliServer.stop', () => cliServer.stop()) + await runDestroyStep('oauthService.stop', () => oauthService.stop()) + await providerDbLoader.drain() + await agentSettings.drain() + await startupWorkloadCoordinator.cancelAndDrainTarget('main') await runDestroyStep('automaticSync.close', () => automaticSync!.close()) await runDestroyStep('syncPeerService.stop', () => syncPeerService.stop()) await runDestroyStep('syncHostService.stop', () => syncHostService.stop()) @@ -2948,11 +3317,17 @@ export async function createMainProcessControl(dependencies: { await runDestroyStep('agentInvocationAdmission.flushObservations', () => agentInvocationAdmission.flushObservations() ) + await runDestroyStep('cronJobs.detachResume', () => { + powerMonitor.off('resume', onSystemResume) + }) await runDestroyStep('cronJobs.destroy', () => cronJobs.destroy()) await runDestroyStep('remoteService.destroy', () => remoteService.destroy()) - await runDestroyStep('hookService.stop', () => hookService.stop()) + await runDestroyStep('remoteAuthWindows.closeAll', () => remoteAuthWindows.closeAll()) + await hookService.stop() + await pluginService.contextHooks?.stop() await runDestroyStep('sessionRuntimes.suspend', () => suspendSessionRuntimes()) - await runDestroyStep('toolService.shutdownCodeRuntime', () => toolService.shutdownCodeRuntime()) + await backgroundExec.shutdown() + await toolService.shutdownCodeRuntime() const pendingSkillInitialization = skillInitializationPromise if (pendingSkillInitialization) { await runDestroyStep('skillInitialization.drain', async () => { @@ -3008,9 +3383,6 @@ export async function createMainProcessControl(dependencies: { await runDestroyStep('skillSyncService.destroy', () => skillSyncService.destroy()) await runDestroyStep('skillService.destroy', () => skillService.destroy()) await runDestroyStep('fileWatcherService.destroy', () => fileWatcherService.destroy()) - await runDestroyStep('backgroundExecSessionManager.shutdown', () => - backgroundExecSessionManager.shutdown() - ) // Fence new ingestion synchronously, then let Memory disposal abort provider-bound work before // awaiting the existing chains. This avoids both late SQLite writes and shutdown deadlocks. const memoryIngestionDrain = (() => { @@ -3024,6 +3396,8 @@ export async function createMainProcessControl(dependencies: { } })() await runDestroyStep('memoryService.dispose', () => memoryService.dispose()) + await runDestroyStep('memoryVectorStores.dispose', () => memoryVectorStores.dispose()) + await runDestroyStep('harnessRuntime.stop', () => harnessRuntime.stop()) let memoryIngestionDrainOutcome: MemoryIngestionDrainOutcome | undefined await runDestroyStep('memoryIngestionObserver.drainAndFence', async () => { const result = await memoryIngestionDrain @@ -3039,6 +3413,7 @@ export async function createMainProcessControl(dependencies: { await runDestroyStep('ocrRuntimeService.close', () => ocrRuntimeService.close()) await runDestroyStep('providerRuntime.shutdown', () => providerRuntime.shutdown()) await runDestroyStep('acpRuntime.shutdown', () => acpRuntimeOwner.shutdown()) + await databaseRequests.drainForShutdown() await runDestroyStep('mainDatabase.close', () => mainDatabase.close()) await runDestroyStep('shortcutPresenter.destroy', () => shortcutPresenter.destroy()) await runDestroyStep('notificationService.clearAllNotifications', () => @@ -3089,6 +3464,7 @@ export async function createMainProcessControl(dependencies: { const toolRoutes = createToolRoutes(toolService) const pluginRoutes = createPluginRoutes(pluginService, pluginSettingsWindow) const skillRoutes = createSkillRoutes({ + tempDirectory: app.getPath('temp'), skillService, skillSyncService, skillSettings, @@ -3131,15 +3507,15 @@ export async function createMainProcessControl(dependencies: { desktopSessionBinding, tabPresenter, dialogService, - settings: desktopSettings, - setFloatingButtonEnabled: (enabled) => floatingButtonPresenter.setEnabled(enabled), + settings: appSettingsService, + appearance: appSettingsService, recordActivity: (input) => { void settingsDatabase.recordSettingsActivity(input).catch((error) => { console.warn('[SettingsActivity] Failed to record settings activity:', error) }) } }) - const fileRoutes = createFileRoutes(fileService) + const fileRoutes = createFileRoutes(fileService, desktopImageActions) const ocrRoutes = createOcrRoutes({ runtime: ocrRuntimeService }) const toolchainRoutes = createToolchainRoutes({ service: toolchainService, @@ -3253,15 +3629,20 @@ export async function createMainProcessControl(dependencies: { resetDataByType: (resetType) => resetApplicationData(resetType) }) const onboardingRoutes = createOnboardingRoutes(dependencies.settingsStore) - const upgradeRoutes = createUpgradeRoutes({ upgrade: upgradeService, settings: updateSettings }) + const upgradeRoutes = createUpgradeRoutes({ + upgrade: upgradeService, + settings: appSettingsService + }) const exporterRoutes = createExporterRoutes(exporter) const syncRoutes = createSyncRoutes({ sync: syncService, settings: syncSettings, importFromSync: (backupFileName, importMode) => - runDatabaseMaintenance((database) => - syncService.importFromSync(backupFileName, importMode ?? ImportMode.INCREMENT, database) - ), + runDatabaseMaintenance({ + kind: 'import-backup', + fileName: backupFileName, + mode: importMode ?? ImportMode.INCREMENT + }), pullLatestBackupFromCloud: (importMode) => pullLatestBackupFromCloud(importMode), recordActivity: (input) => { void settingsDatabase.recordSettingsActivity(input).catch((error) => { @@ -3297,58 +3678,34 @@ export async function createMainProcessControl(dependencies: { }) const appSettingsRoutes = createAppSettingsRoutes({ settings: dependencies.settingsStore, - agentDefaults, - privacy: dependencies.privacySettings, - traceSettings, - desktopSettings, - fonts: fontSettings, - applyContentProtection: (enabled) => - (windowPresenter as WindowPresenter).applyContentProtection(enabled), - logging: loggingService, - ocr: ocrSettings, + appSettings: appSettingsService, commandShell: commandShellService, publishEvent: publishDeepchatEvent, - recordActivity: (input) => { - void settingsDatabase.recordSettingsActivity(input).catch((error) => { - console.warn('[SettingsActivity] Failed to record settings activity:', error) - }) - }, + recordActivity: recordSettingsActivity, listActivities: (limit) => settingsDatabase.listSettingsActivity(limit) }) const appRoutes = createAppRoutes({ - logging: loggingService, + logging: { openFolder: () => appSettingsService.openLoggingFolder() }, rendererPerformance: rendererPerformanceLogService, isMainWindowContext: (caller) => windowPresenter.mainWindow?.webContents.id === caller.webContentsId, agentSettings, projects: projectService, databaseSecurity: databaseSecurityService, - database: mainDatabase, + database: { + getDatabase: () => mainDatabase.getDatabase(), + repairSchema: () => runDatabaseMaintenance({ kind: 'repair-schema' }) + }, startupSession: sessionQuery, desktopSession: desktopSessionBinding, startup: startupWorkloadCoordinator, ensureDefaultWorkspace: () => projectService.ensureDefaultWorkspace(), enableDatabaseEncryption: (password) => - runDatabaseMaintenance((database) => - databaseSecurityService.enableEncryption({ password, database, providerSettings }) - ), + runDatabaseMaintenance({ kind: 'enable-encryption', password }), changeDatabasePassword: (currentPassword, newPassword) => - runDatabaseMaintenance((database) => - databaseSecurityService.changePassword({ - currentPassword, - newPassword, - database, - providerSettings - }) - ), + runDatabaseMaintenance({ kind: 'change-password', currentPassword, newPassword }), disableDatabaseEncryption: (currentPassword) => - runDatabaseMaintenance((database) => - databaseSecurityService.disableEncryption({ - currentPassword, - database, - providerSettings - }) - ), + runDatabaseMaintenance({ kind: 'disable-encryption', currentPassword }), recordActivity: (input) => { void settingsDatabase.recordSettingsActivity(input).catch((error) => { console.warn('[SettingsActivity] Failed to record settings activity:', error) @@ -3394,9 +3751,7 @@ export async function createMainProcessControl(dependencies: { }) const cliRunRoutes = cliRunService.createRoutes() routeDispatcher = createRouteDispatcher({ - appDatabaseMaintenance: { - assertRouteAllowed: (routeName) => assertRouteAllowedDuringDatabaseMaintenance(routeName) - }, + appDatabaseMaintenance: databaseRequests, routeMaps: [ providerRoutes, toolRoutes, @@ -3620,6 +3975,16 @@ export async function createMainProcessControl(dependencies: { async () => { shutdownStepFailures = 0 appLifecycleState = 'stopping' + desktopConfigurationHost.close() + deeplinkService.observeMcpReadiness(false) + databaseRequests.beginShutdown() + providerDbLoader.stop() + agentSettings.stop() + deepChatAgentHarness.abortGenerations() + backgroundExec.stop() + toolService.stopCodeRuntime() + databaseSecurityService.stop() + dependencies.secretStore.pause() windowPresenter.setApplicationQuitting(true) startupWorkloadCoordinator.cancelTarget('main') await runDestroyStep('acpAuth.shutdown', () => acpAuthService.shutdown()) @@ -3665,44 +4030,70 @@ export async function createMainProcessControl(dependencies: { return shutdownCoordinator.cleanup() } - function assertRouteAllowedDuringDatabaseMaintenance(routeName: string): void { - if (appLifecycleState === 'stopping' || appLifecycleState === 'stopped') { + function runDatabaseMaintenance(command: DatabaseImportCommand): Promise + function runDatabaseMaintenance( + command: DatabaseEncryptionCommand + ): Promise + function runDatabaseMaintenance(command: DatabaseRepairCommand): Promise + async function runDatabaseMaintenance( + command: DatabaseMaintenanceCommand + ): Promise { + if (['stopping', 'stopped'].includes(appLifecycleState)) { throw new Error(`App lifecycle is ${appLifecycleState}`) } - if (databaseMaintenanceState === 'running') return - if (routeName === 'sync.startBackup') throw new Error('sync.tunnel.error.busy') - if ( - routeName.startsWith('chat.') || - routeName.startsWith('sessions.') || - routeName.startsWith('memory.') || - routeName.startsWith('orchestration.') || - routeName.startsWith('remoteControl.') || - routeName.startsWith('cronJobs.') - ) { - throw new Error(`App database maintenance is ${databaseMaintenanceState}`) + const maintenanceState = databaseRequests.state + if (maintenanceState !== 'running') { + throw new Error(`App database maintenance is ${maintenanceState}`) + } + if (syncService.isBackupInProgress()) throw new Error('sync.tunnel.error.busy') + try { + return await databaseRequests.runMaintenance(() => performDatabaseMaintenance(command)) + } catch (error) { + if ( + databaseRequests.state === 'failed' && + !['stopping', 'stopped'].includes(appLifecycleState) + ) + await stopForCleanup() + throw error } } - async function runDatabaseMaintenance( - operation: (database: ApplicationDatabaseMaintenancePort) => Promise - ): Promise { - if (databaseMaintenanceState !== 'running') { - throw new Error(`App database maintenance is ${databaseMaintenanceState}`) + async function performDatabaseMaintenance( + command: DatabaseMaintenanceCommand + ): Promise { + desktopConfigurationHost.pause() + try { + await providerRuntime.invalidateGitHubCopilotSignIns() + await startupWorkloadCoordinator.cancelAndDrainTarget('main') + await agentSettings.cancelAndDrainAcpWork() + if (['stopping', 'stopped'].includes(appLifecycleState)) { + throw new Error(`App lifecycle is ${appLifecycleState}`) + } + } catch (error) { + if (databaseRequests.state === 'maintenance') { + databaseRequests.resume() + desktopConfigurationHost.resume() + agentSettings.notifyAgentCatalogChanged() + } + throw error } - if (syncService.isBackupInProgress()) throw new Error('sync.tunnel.error.busy') - databaseMaintenanceState = 'maintenance' - replicaEndpoint.stop() - await automaticSync?.pause() - startupWorkloadCoordinator.cancelTarget('main') - memoryService.stopBackgroundMaintenance() - let operationResult: T | undefined + let operationResult: DatabaseMaintenanceResult | undefined let operationError: unknown try { + nativeSettings.stopWrites() + await appSettingsService.stop() + await nativeSettings.drainWrites() + dependencies.secretStore.pause() + replicaEndpoint.stop() + await automaticSync?.pause() + memoryService.stopBackgroundMaintenance() await liveDelegationService.stop() await cronJobs.stop() await remoteService.destroy() + await remoteAuthWindows.closeAll() await hookService.stop() + await pluginService.contextHooks?.stop() const drain = await memoryIngestionObserver.drainAndFence() if (drain.timedOut) { throw new Error( @@ -3716,7 +4107,11 @@ export async function createMainProcessControl(dependencies: { ) } await suspendSessionRuntimes() - operationResult = await operation({ + await databaseRequests.drain() + if (['stopping', 'stopped'].includes(appLifecycleState)) { + throw new Error(`App lifecycle is ${appLifecycleState}`) + } + const database: ApplicationDatabaseMaintenancePort = { getDatabasePath: () => mainDatabase.getDatabasePath(), checkpointAndClose: () => { const database = mainDatabase.getDatabase() @@ -3733,36 +4128,95 @@ export async function createMainProcessControl(dependencies: { isOpen: () => mainDatabase.getDatabase().open, importLegacyChatDb: (sourceDbPath, mode) => legacyChatImportService.importFromSourceDb(sourceDbPath, mode) - }) + } + switch (command.kind) { + case 'import-backup-file': + operationResult = await syncService.importBackupFile( + command.filePath, + command.mode, + database + ) + break + case 'import-backup': + operationResult = await syncService.importFromSync( + command.fileName, + command.mode, + database + ) + break + case 'enable-encryption': + operationResult = await databaseSecurityService.enableEncryption({ + password: command.password, + database, + providerSettings + }) + break + case 'change-password': + operationResult = await databaseSecurityService.changePassword({ + currentPassword: command.currentPassword, + newPassword: command.newPassword, + database, + providerSettings + }) + break + case 'disable-encryption': + operationResult = await databaseSecurityService.disableEncryption({ + currentPassword: command.currentPassword, + database, + providerSettings + }) + break + case 'repair-schema': + operationResult = await mainDatabase.repairSchema() + break + default: + throw new Error('Unsupported database maintenance command') + } } catch (error) { operationError = error } try { + if (['stopping', 'stopped'].includes(appLifecycleState)) { + throw new Error(`App lifecycle is ${appLifecycleState}`) + } if (!mainDatabase.getDatabase().open) { reopenApplicationDatabase() } deepChatAgentHarness.reconcileAfterDatabaseReopen() + dependencies.secretStore.resume() memoryIngestionObserver.resumeIngestion() memoryService.startBackgroundMaintenance() + pluginService.contextHooks?.start() hookService.start() cronJobs.start() await remoteService.initialize() + if (['stopping', 'stopped'].includes(appLifecycleState)) { + await remoteService.destroy() + await remoteAuthWindows.closeAll() + throw new Error(`App lifecycle is ${appLifecycleState}`) + } liveDelegationService = createLiveDelegationService() liveDelegationService.start() const startupRunId = startupWorkloadCoordinator.createRun('main') scheduleBackgroundWork(startupRunId) - databaseMaintenanceState = 'running' + appSettingsService.start() + databaseRequests.resume() + await appSettingsService.publishSnapshot() + await appSettingsService.observeSystemTheme() + nativeSettings.startWrites() + agentSettings.notifyAgentCatalogChanged() syncReplica?.wake() await automaticSync?.start() + desktopConfigurationHost.resume() } catch (error) { - databaseMaintenanceState = 'failed' - await stopForCleanup() + if (!['stopping', 'stopped'].includes(appLifecycleState)) databaseRequests.fail() throw error } if (operationError) throw operationError - return operationResult as T + if (operationResult === undefined) throw new Error('Database maintenance returned no result') + return operationResult } function reopenApplicationDatabase(): void { @@ -3791,9 +4245,11 @@ export async function createMainProcessControl(dependencies: { const download = await syncService.downloadLatestBackupFromCloud() if (!download.success || !download.fileName) return download const backupFileName = download.fileName - const result = await runDatabaseMaintenance((database) => - syncService.importFromSync(backupFileName, importMode, database) - ) + const result = await runDatabaseMaintenance({ + kind: 'import-backup', + fileName: backupFileName, + mode: importMode + }) return { ...result, fileName: backupFileName } } @@ -3908,6 +4364,8 @@ export async function createMainProcessControl(dependencies: { cronJobs.start() memoryService.startBackgroundMaintenance() appLifecycleState = 'running' + desktopConfigurationHost.resume() + onSystemThemeUpdated() try { await artifactSpool.initialize() await cliServer.start() diff --git a/src/main/app/credentialCrypto.ts b/src/main/app/credentialCrypto.ts new file mode 100644 index 0000000000..159d2e465b --- /dev/null +++ b/src/main/app/credentialCrypto.ts @@ -0,0 +1,22 @@ +import { safeStorage } from 'electron' +import type { CredentialCryptoPort } from '@/config/secretStore' + +export const credentialCrypto: CredentialCryptoPort = { + isAvailable: () => safeStorage.isAsyncEncryptionAvailable(), + encrypt: async (value) => (await safeStorage.encryptStringAsync(value)).toString('base64'), + decrypt: async (wrapped) => + (await safeStorage.decryptStringAsync(Buffer.from(wrapped, 'base64'))).result +} + +export const secureCredentialCrypto: CredentialCryptoPort = { + ...credentialCrypto, + isAvailable: async () => { + if (!(await credentialCrypto.isAvailable())) return false + if (process.platform !== 'linux') return true + try { + return safeStorage.getSelectedStorageBackend() !== 'basic_text' + } catch { + return false + } + } +} diff --git a/src/main/app/databaseRequestGate.ts b/src/main/app/databaseRequestGate.ts new file mode 100644 index 0000000000..d62a4aeba9 --- /dev/null +++ b/src/main/app/databaseRequestGate.ts @@ -0,0 +1,165 @@ +import type { DeepchatRouteName } from '@shared/contracts/routes' + +const PRESENTATION_ROUTES = new Set([ + 'window.getCurrentState', + 'window.getRuntimeIdentity', + 'window.minimizeCurrent', + 'window.toggleMaximizeCurrent', + 'window.closeCurrent', + 'window.closeFloatingCurrent', + 'window.closeSettings', + 'device.getInfo', + 'device.getAppVersion', + 'databaseSecurity.getStatus', + 'approvals.resolve', + 'cli.status', + 'cli.version', + 'cli.capabilities' +] satisfies DeepchatRouteName[]) + +const MAINTENANCE_ROUTES = new Set([ + 'sync.import', + 'sync.pullFromCloud', + 'databaseSecurity.enable', + 'databaseSecurity.changePassword', + 'databaseSecurity.disable', + 'databaseSecurity.repairSchema' +] satisfies DeepchatRouteName[]) + +const SHUTDOWN_ROUTES = new Set([ + 'device.restartApp', + 'device.resetDataByType' +] satisfies DeepchatRouteName[]) + +export class DatabaseRequestGate { + private currentState: 'running' | 'maintenance' | 'failed' | 'stopping' = 'running' + private activeRequests = 0 + private drainPromise: Promise | null = null + private onDrained: (() => void) | null = null + private maintenanceCompletion: Promise | null = null + + constructor(private readonly assertActive: () => void) {} + + get state(): 'running' | 'maintenance' | 'failed' | 'stopping' { + return this.currentState + } + + assertRouteAllowed(method: string): void { + this.assertActive() + if (this.currentState === 'stopping') throw new Error('App database owner is stopping') + if (this.currentState === 'running' || PRESENTATION_ROUTES.has(method)) return + if (method === 'sync.startBackup') throw new Error('sync.tunnel.error.busy') + throw new Error(`App database maintenance is ${this.currentState}`) + } + + async runRequest(method: string, run: () => Promise): Promise { + this.assertRouteAllowed(method) + if ( + PRESENTATION_ROUTES.has(method) || + MAINTENANCE_ROUTES.has(method) || + SHUTDOWN_ROUTES.has(method) + ) + return await run() + return await this.trackRequest(run) + } + + async runAuthorization(method: string, run: () => Promise): Promise { + this.assertRouteAllowed(method) + if (PRESENTATION_ROUTES.has(method)) return await run() + return await this.trackRequest(run) + } + + private async trackRequest(run: () => Promise): Promise { + this.activeRequests++ + try { + return await run() + } finally { + if (--this.activeRequests === 0) { + const onDrained = this.onDrained + this.onDrained = null + onDrained?.() + } + } + } + + beginMaintenance(): void { + this.assertActive() + if (this.currentState !== 'running') + throw new Error(`App database maintenance is ${this.currentState}`) + this.currentState = 'maintenance' + } + + async runMaintenance(run: () => Promise): Promise { + if (this.maintenanceCompletion) throw new Error('Database maintenance is still completing') + this.beginMaintenance() + const pending = Promise.resolve().then(run) + const finished = pending.then( + () => undefined, + () => undefined + ) + this.maintenanceCompletion = finished + try { + return await pending + } finally { + if (this.maintenanceCompletion === finished) this.maintenanceCompletion = null + } + } + + beginShutdown(): void { + this.currentState = 'stopping' + } + + async drain(): Promise { + if (this.currentState !== 'maintenance') throw new Error('Database maintenance is not active') + await this.drainRequests() + } + + async drainForShutdown(): Promise { + if (this.currentState !== 'stopping') throw new Error('Database shutdown is not active') + let timeout: NodeJS.Timeout | undefined + try { + await Promise.race([ + Promise.all([this.drainRequests(), this.maintenanceCompletion]), + new Promise((_, reject) => { + timeout = setTimeout( + () => reject(new Error('Timed out waiting for database shutdown (30000ms)')), + 30_000 + ) + }) + ]) + } finally { + clearTimeout(timeout) + } + } + + private async drainRequests(): Promise { + if (this.activeRequests === 0) return + if (!this.drainPromise) { + const pending = new Promise((resolve, reject) => { + const onDrained = () => { + clearTimeout(timeout) + resolve() + } + const timeout = setTimeout(() => { + if (this.onDrained === onDrained) this.onDrained = null + reject(new Error('Timed out waiting for database requests to drain (30000ms)')) + }, 30_000) + this.onDrained = onDrained + }).finally(() => { + if (this.drainPromise === pending) this.drainPromise = null + }) + this.drainPromise = pending + } + await this.drainPromise + } + + resume(): void { + if (this.currentState !== 'maintenance' || this.drainPromise) + throw new Error('Database maintenance cannot resume') + this.currentState = 'running' + } + + fail(): void { + this.currentState = 'failed' + } +} diff --git a/src/main/app/databaseSecurity.ts b/src/main/app/databaseSecurity.ts index ef253153cb..376a516139 100644 --- a/src/main/app/databaseSecurity.ts +++ b/src/main/app/databaseSecurity.ts @@ -1,6 +1,5 @@ import type { ProviderSettingsPort } from '@/provider/settings' -import { app, safeStorage } from 'electron' -import ElectronStore from 'electron-store' +import type { CredentialCryptoPort } from '@/config/secretStore' import fs from 'fs' import path from 'path' import Database from 'better-sqlite3-multiple-ciphers' @@ -16,7 +15,7 @@ import { import { shouldExcludeFromSqliteCopy } from '@/data/sqliteCopyExclusions' import { orderSqliteTablesForCopy } from '@/data/sqliteCopyOrder' -type DatabaseSecurityMetadata = { +export type DatabaseSecurityMetadata = { version: 1 enabled: boolean cipher: 'sqlcipher' @@ -27,6 +26,15 @@ type DatabaseSecurityMetadata = { lastMigrationDirection?: 'enable' | 'change-password' | 'disable' } +export interface DatabaseSecurityCryptoPort extends CredentialCryptoPort { + getBackend(): Promise +} + +export interface DatabaseSecurityMetadataStore { + get(key: 'metadata'): DatabaseSecurityMetadata | undefined + set(key: 'metadata', value: DatabaseSecurityMetadata): void +} + type UnlockRequest = { reason: DatabaseUnlockReason safeStorageAvailable: boolean @@ -48,7 +56,7 @@ export interface DatabaseSecurityMigrationDatabasePort { isOpen(): boolean } -const DEFAULT_METADATA: DatabaseSecurityMetadata = { +export const DEFAULT_DATABASE_SECURITY_METADATA: DatabaseSecurityMetadata = { version: 1, enabled: false, cipher: 'sqlcipher', @@ -98,70 +106,103 @@ function isFtsMaintenanceSchemaObject(row: SqliteSchemaRow & { tbl_name?: string } export class DatabaseSecurityService { - private readonly store: ElectronStore<{ metadata: DatabaseSecurityMetadata }> + private readonly store: DatabaseSecurityMetadataStore private readonly dbPath: string private migrationInProgress = false - - constructor(options?: { dbPath?: string }) { - const dbDir = path.join(app.getPath('userData'), 'app_db') - this.dbPath = options?.dbPath ?? path.join(dbDir, 'agent.db') - this.store = new ElectronStore<{ metadata: DatabaseSecurityMetadata }>({ - name: 'database-security', - defaults: { - metadata: DEFAULT_METADATA - } - }) + private generation = 0 + private stopped = false + + constructor( + private readonly options: { + dbPath: string + metadata: DatabaseSecurityMetadataStore + crypto: DatabaseSecurityCryptoPort + } + ) { + this.dbPath = options.dbPath + this.store = options.metadata + if (this.isMigrationInProgress(this.dbPath)) + throw new Error('Database migration is already in progress') this.recoverInterruptedMigrationFiles() } + stop(): void { + this.stopped = true + this.generation++ + } + + private captureOperation(): () => void { + const generation = this.generation + const check = () => { + if (this.stopped || generation !== this.generation) + throw new Error('Database security operation interrupted') + } + check() + return check + } + getDatabasePath(): string { return this.dbPath } - private rememberPasswordAfterUnlock( + private async rememberPasswordAfterUnlock( password: string, metadata: DatabaseSecurityMetadata, - safeStorageAvailable: boolean - ): void { + safeStorageAvailable: boolean, + check: () => void + ): Promise { if (!safeStorageAvailable) { return } + const wrappedPassword = await this.options.crypto.encrypt(password) + check() + const safeStorageBackend = await this.getSafeStorageBackend() + check() this.persistMetadata({ ...metadata, passwordStorage: 'safeStorage', - wrappedPassword: this.wrapPassword(password), - safeStorageBackend: this.getSafeStorageBackend() + wrappedPassword, + safeStorageBackend }) } - persistRecoveredEncryptionMetadata(password: string): void { - this.assertPassword(password) - const safeStorageAvailable = this.isSafeStorageAvailable() - const metadata = this.getMetadata() - this.persistMetadata({ - version: 1, - enabled: true, - cipher: 'sqlcipher', - passwordStorage: safeStorageAvailable ? 'safeStorage' : 'manual', - wrappedPassword: safeStorageAvailable ? this.wrapPassword(password) : undefined, - safeStorageBackend: this.getSafeStorageBackend(), - lastMigrationAt: metadata.lastMigrationAt, - lastMigrationDirection: metadata.lastMigrationDirection + async persistRecoveredEncryptionMetadata(password: string): Promise { + await this.runMigration(async (check) => { + this.assertPassword(password) + const metadata = this.getMetadata() + const recovered = await this.prepareMetadata(password, { + version: 1, + enabled: true, + cipher: 'sqlcipher', + passwordStorage: 'manual', + lastMigrationAt: metadata.lastMigrationAt, + lastMigrationDirection: metadata.lastMigrationDirection + }) + check() + this.persistMetadata(recovered) }) } clearEncryptionMetadata(): void { - this.persistMetadata({ ...DEFAULT_METADATA }) + this.captureOperation() + if (this.isMigrationInProgress(this.dbPath)) + throw new Error('Database migration is already in progress') + this.generation++ + this.persistMetadata({ ...DEFAULT_DATABASE_SECURITY_METADATA }) } - getStatus(): DatabaseSecurityStatus { + async getStatus(): Promise { + const check = this.captureOperation() + const safeStorageAvailable = await this.isSafeStorageAvailable() + check() + const safeStorageBackend = await this.getSafeStorageBackend() + check() const metadata = this.getMetadata() - const safeStorageAvailable = this.isSafeStorageAvailable() return { enabled: metadata.enabled, cipher: 'sqlcipher', safeStorageAvailable, - safeStorageBackend: this.getSafeStorageBackend(), + safeStorageBackend, passwordStorage: metadata.passwordStorage, manualUnlockRequired: metadata.enabled && @@ -174,12 +215,16 @@ export class DatabaseSecurityService { } async resolveStartupPassword(unlockProvider: UnlockProvider): Promise { + if (this.isMigrationInProgress(this.dbPath)) + throw new Error('Database migration is already in progress') + const check = this.captureOperation() const metadata = this.getMetadata() if (!metadata.enabled) { return undefined } - const safeStorageAvailable = this.isSafeStorageAvailable() + const safeStorageAvailable = await this.isSafeStorageAvailable() + check() let safeStorageUnlockFailed = false if ( safeStorageAvailable && @@ -188,10 +233,12 @@ export class DatabaseSecurityService { ) { let password: string | undefined try { - password = this.unwrapPassword(metadata.wrappedPassword) + password = await this.options.crypto.decrypt(metadata.wrappedPassword) + check() this.validatePassword(password) return password } catch (error) { + check() if (password !== undefined && isDecryptedDatabaseCorruptionError(error)) { return password } @@ -211,25 +258,42 @@ export class DatabaseSecurityService { while (true) { const password = await unlockProvider({ reason, safeStorageAvailable }) + check() if (password === null) { - app.quit() throw new Error('Database unlock canceled') } try { this.validatePassword(password) - this.rememberPasswordAfterUnlock(password, metadata, safeStorageAvailable) - return password } catch (error) { if (isDecryptedDatabaseCorruptionError(error)) { - this.rememberPasswordAfterUnlock(password, metadata, safeStorageAvailable) + await this.rememberPasswordAfterUnlock(password, metadata, safeStorageAvailable, check) + check() return password } if (error instanceof OrphanWalDatabaseError) { throw error } reason = 'invalid' + continue } + await this.rememberPasswordAfterUnlock(password, metadata, safeStorageAvailable, check) + check() + return password + } + } + + private async runMigration(operation: (check: () => void) => Promise): Promise { + this.captureOperation() + this.acquireMigrationLock(this.dbPath) + this.generation++ + this.migrationInProgress = true + const check = this.captureOperation() + try { + return await operation(check) + } finally { + this.migrationInProgress = false + this.releaseMigrationLock(this.dbPath) } } @@ -238,20 +302,27 @@ export class DatabaseSecurityService { database: DatabaseSecurityMigrationDatabasePort providerSettings: ProviderEncryptionCleanupPort }): Promise { - this.assertPassword(input.password) - const metadata = this.getMetadata() - if (metadata.enabled) { - throw new Error('Database encryption is already enabled') - } - - this.cleanupLegacyProviderJson(input.providerSettings) - await this.migrateDatabase({ - database: input.database, - sourcePassword: undefined, - targetPassword: input.password, - direction: 'enable' + await this.runMigration(async (check) => { + this.assertPassword(input.password) + if (this.getMetadata().enabled) throw new Error('Database encryption is already enabled') + const metadata = await this.prepareMetadata(input.password, { + version: 1, + enabled: true, + cipher: 'sqlcipher', + passwordStorage: 'manual', + lastMigrationAt: Date.now(), + lastMigrationDirection: 'enable' + }) + check() + this.cleanupLegacyProviderJson(input.providerSettings) + this.migrateDatabase({ + database: input.database, + sourcePassword: undefined, + targetPassword: input.password, + direction: 'enable', + metadata + }) }) - this.persistUnlockedMetadata(input.password, 'enable') return this.getStatus() } @@ -261,22 +332,31 @@ export class DatabaseSecurityService { database: DatabaseSecurityMigrationDatabasePort providerSettings: ProviderEncryptionCleanupPort }): Promise { - this.assertEnabled() - this.assertPassword(input.currentPassword) - this.assertPassword(input.newPassword) - if (input.currentPassword === input.newPassword) { - throw new Error('New SQLite password must differ from the current password') - } - this.validatePassword(input.currentPassword) - - this.cleanupLegacyProviderJson(input.providerSettings) - await this.migrateDatabase({ - database: input.database, - sourcePassword: input.currentPassword, - targetPassword: input.newPassword, - direction: 'change-password' + await this.runMigration(async (check) => { + this.assertEnabled() + this.assertPassword(input.currentPassword) + this.assertPassword(input.newPassword) + if (input.currentPassword === input.newPassword) + throw new Error('New SQLite password must differ from the current password') + this.validatePassword(input.currentPassword) + const metadata = await this.prepareMetadata(input.newPassword, { + version: 1, + enabled: true, + cipher: 'sqlcipher', + passwordStorage: 'manual', + lastMigrationAt: Date.now(), + lastMigrationDirection: 'change-password' + }) + check() + this.cleanupLegacyProviderJson(input.providerSettings) + this.migrateDatabase({ + database: input.database, + sourcePassword: input.currentPassword, + targetPassword: input.newPassword, + direction: 'change-password', + metadata + }) }) - this.persistUnlockedMetadata(input.newPassword, 'change-password') return this.getStatus() } @@ -285,20 +365,22 @@ export class DatabaseSecurityService { database: DatabaseSecurityMigrationDatabasePort providerSettings: ProviderEncryptionCleanupPort }): Promise { - this.assertEnabled() - this.assertPassword(input.currentPassword) - this.validatePassword(input.currentPassword) - - await this.migrateDatabase({ - database: input.database, - sourcePassword: input.currentPassword, - targetPassword: undefined, - direction: 'disable' - }) - this.persistMetadata({ - ...DEFAULT_METADATA, - lastMigrationAt: Date.now(), - lastMigrationDirection: 'disable' + await this.runMigration(async (check) => { + this.assertEnabled() + this.assertPassword(input.currentPassword) + this.validatePassword(input.currentPassword) + check() + this.migrateDatabase({ + database: input.database, + sourcePassword: input.currentPassword, + targetPassword: undefined, + direction: 'disable', + metadata: { + ...DEFAULT_DATABASE_SECURITY_METADATA, + lastMigrationAt: Date.now(), + lastMigrationDirection: 'disable' + } + }) }) return this.getStatus() } @@ -312,15 +394,17 @@ export class DatabaseSecurityService { } } - private async migrateDatabase(input: { + private migrateDatabase(input: { database: DatabaseSecurityMigrationDatabasePort sourcePassword: string | undefined targetPassword: string | undefined direction: MigrationDirection - }): Promise { + metadata: DatabaseSecurityMetadata + }): void { const dbPath = input.database.getDatabasePath() - this.acquireMigrationLock(dbPath) - this.migrationInProgress = true + if (getMigrationLockPath(dbPath) !== getMigrationLockPath(this.dbPath)) + throw new Error('Database security owner path mismatch') + const previousMetadata = this.getMetadata() const tempPath = this.getTempPath(dbPath) const rollbackPath = this.getRollbackPath(dbPath) @@ -339,10 +423,12 @@ export class DatabaseSecurityService { try { input.database.reopenWithPassword(input.targetPassword) + this.persistMetadata(input.metadata) } catch (error) { input.database.close() this.restoreRollbackDatabase(dbPath, rollbackPath) input.database.reopenWithPassword(input.sourcePassword) + this.persistMetadata(previousMetadata) throw error } @@ -362,9 +448,6 @@ export class DatabaseSecurityService { } } throw error - } finally { - this.migrationInProgress = false - this.releaseMigrationLock(dbPath) } } @@ -620,25 +703,30 @@ export class DatabaseSecurityService { return counts } - private persistUnlockedMetadata(password: string, direction: MigrationDirection): void { - const safeStorageAvailable = this.isSafeStorageAvailable() - this.persistMetadata({ - version: 1, - enabled: true, - cipher: 'sqlcipher', - passwordStorage: safeStorageAvailable ? 'safeStorage' : 'manual', - wrappedPassword: safeStorageAvailable ? this.wrapPassword(password) : undefined, - safeStorageBackend: this.getSafeStorageBackend(), - lastMigrationAt: Date.now(), - lastMigrationDirection: direction - }) + private async prepareMetadata( + password: string, + metadata: DatabaseSecurityMetadata + ): Promise { + const check = this.captureOperation() + const available = await this.isSafeStorageAvailable() + check() + const backend = await this.getSafeStorageBackend() + check() + const wrapped = available ? await this.options.crypto.encrypt(password) : undefined + check() + return { + ...metadata, + passwordStorage: available ? 'safeStorage' : 'manual', + wrappedPassword: wrapped, + safeStorageBackend: backend + } } private getMetadata(): DatabaseSecurityMetadata { const raw = this.store.get('metadata') return { - ...DEFAULT_METADATA, - ...clone(raw ?? DEFAULT_METADATA), + ...DEFAULT_DATABASE_SECURITY_METADATA, + ...clone(raw ?? DEFAULT_DATABASE_SECURITY_METADATA), cipher: 'sqlcipher', version: 1 } @@ -652,25 +740,17 @@ export class DatabaseSecurityService { providerSettings.cleanupLegacyProviderJsonForDatabaseEncryption() } - private wrapPassword(password: string): string { - return Buffer.from(safeStorage.encryptString(password)).toString('base64') - } - - private unwrapPassword(wrappedPassword: string): string { - return safeStorage.decryptString(Buffer.from(wrappedPassword, 'base64')) - } - - private isSafeStorageAvailable(): boolean { + private async isSafeStorageAvailable(): Promise { try { - return safeStorage.isEncryptionAvailable() + return await this.options.crypto.isAvailable() } catch { return false } } - private getSafeStorageBackend(): string | undefined { + private async getSafeStorageBackend(): Promise { try { - return process.platform === 'linux' ? safeStorage.getSelectedStorageBackend() : undefined + return await this.options.crypto.getBackend() } catch { return undefined } diff --git a/src/main/app/databaseStartup.ts b/src/main/app/databaseStartup.ts index a61c49ee7b..431fae9b11 100644 --- a/src/main/app/databaseStartup.ts +++ b/src/main/app/databaseStartup.ts @@ -42,9 +42,11 @@ export async function initializeMainDatabaseWithRecovery(input: { while (true) { if (!passwordResolved) { try { - password = await input.security.resolveStartupPassword((request) => - input.splash.requestDatabaseUnlock(request) - ) + password = await input.security.resolveStartupPassword(async (request) => { + const value = await input.splash.requestDatabaseUnlock(request) + if (value === null) app.quit() + return value + }) passwordResolved = true } catch (error) { const kind = classifyDatabaseStartupFailure({ error, dbPath, password }) @@ -75,7 +77,7 @@ export async function initializeMainDatabaseWithRecovery(input: { if (isDecryptedDatabaseCorruptionError(error)) { password = choice.password passwordResolved = true - input.security.persistRecoveredEncryptionMetadata(choice.password) + await input.security.persistRecoveredEncryptionMetadata(choice.password) pending = { ...pending, kind: 'true-corruption', @@ -99,7 +101,7 @@ export async function initializeMainDatabaseWithRecovery(input: { password = choice.password passwordResolved = true - input.security.persistRecoveredEncryptionMetadata(choice.password) + await input.security.persistRecoveredEncryptionMetadata(choice.password) pending = undefined continue } diff --git a/src/main/app/logging.ts b/src/main/app/logging.ts index 3d837a7881..d362fcb9a9 100644 --- a/src/main/app/logging.ts +++ b/src/main/app/logging.ts @@ -1,38 +1,36 @@ -import { app, shell } from 'electron' -import fs from 'fs' -import path from 'path' import type { SettingsStore } from '@/config/settingsStore' import type { DeepchatEventPublisher } from '@shared/contracts/events' +export interface LoggingHost { + applyLogging(enabled: boolean): Promise + openLoggingFolder(): Promise +} + export class LoggingService { constructor( private readonly settings: SettingsStore, - private readonly restartApp: () => void, + private readonly host: LoggingHost, private readonly publishEvent: DeepchatEventPublisher, - private readonly setMainPersistenceEnabled: (enabled: boolean) => void + private readonly committed: () => void ) {} getEnabled(): boolean { return this.settings.get('loggingEnabled') ?? false } - setEnabled(enabled: boolean): void { + async setEnabled(enabled: boolean): Promise { const value = Boolean(enabled) this.settings.set('loggingEnabled', value) - this.setMainPersistenceEnabled(value) + this.committed() + await this.host.applyLogging(value) this.publishEvent('settings.changed', { changedKeys: ['loggingEnabled'], version: Date.now(), values: { loggingEnabled: value } }) - setTimeout(() => this.restartApp(), 1000) } async openFolder(): Promise { - const loggingFolderPath = path.join(app.getPath('userData'), 'logs') - if (!fs.existsSync(loggingFolderPath)) { - fs.mkdirSync(loggingFolderPath, { recursive: true }) - } - await shell.openPath(loggingFolderPath) + await this.host.openLoggingFolder() } } diff --git a/src/main/app/mainProcess.ts b/src/main/app/mainProcess.ts index 41f7e2d639..6cd269e6fe 100644 --- a/src/main/app/mainProcess.ts +++ b/src/main/app/mainProcess.ts @@ -1,8 +1,16 @@ import { electronApp } from '@electron-toolkit/utils' -import { app } from 'electron' +import { app, safeStorage } from 'electron' +import ElectronStore from 'electron-store' +import path from 'node:path' import { createSettingsStore } from '@/config/settingsStore' +import type { StoreLike } from '@/config/storeLike' import { SecretStore } from '@/config/secretStore' -import { DatabaseSecurityService } from './databaseSecurity' +import { credentialCrypto } from './credentialCrypto' +import { + DatabaseSecurityService, + DEFAULT_DATABASE_SECURITY_METADATA, + type DatabaseSecurityMetadata +} from './databaseSecurity' import { proxyConfig } from '@/platform/proxy' import type { StartupWorkloadCoordinator } from '@/app/startupWorkloadCoordinator' import { createMainProcessControl, type MainProcessControl } from './composition' @@ -12,14 +20,16 @@ import { McpAppSandboxRegistry } from '@/mcp/apps/sandboxRegistry' import { SplashWindow } from './splashWindow' import { PrivacySettings } from './privacy' import { ProxySettings } from '@/platform/proxySettings' -import { McpSettings } from '@/mcp/settings' -import { AcpCatalogSettings } from '@/agent/acp/catalog/settings' +import { McpSettings, createMcpSettingsDefaults } from '@/mcp/settings' +import { AcpCatalogSettings, createAcpCatalogDefaults } from '@/agent/acp/catalog/settings' import { SettingsDatabase } from '@/settings/data/database' import { migrateConfigStorage } from '@/config/migration' import { ProviderDatabase } from '@/provider/data/database' +import { providerDbLoader } from '@/provider/providerDbLoader' import { McpDatabase } from '@/mcp/data/database' import { AgentDatabase } from '@/agent/data/database' import { mainLogger, setMainLoggingEnabled } from '@/logging' +import { PluginToolPolicyStore, type StoredToolPolicy } from '@/plugin/toolPolicyStore' export type { MainProcessControl } from './composition' @@ -36,16 +46,44 @@ export async function startMainProcess( try { electronApp.setAppUserModelId('com.wefonk.deepchat') - const settingsStore = createSettingsStore() + const currentAppVersion = app.getVersion() + const settingsStore = createSettingsStore({ + userDataDirectory: app.getPath('userData'), + homeDirectory: app.getPath('home'), + currentAppVersion + }) setMainLoggingEnabled(settingsStore.get('loggingEnabled') ?? false) - const secretStore = new SecretStore(settingsStore) + const secretStore = new SecretStore(settingsStore, credentialCrypto) const privacySettings = new PrivacySettings(settingsStore) const proxySettings = new ProxySettings(settingsStore) - const mcpSettings = new McpSettings(secretStore) + const mcpSettings = new McpSettings( + new ElectronStore({ + name: 'mcp-settings', + defaults: createMcpSettingsDefaults() + }) as unknown as StoreLike>, + secretStore + ) const mcpAppSandboxRegistry = new McpAppSandboxRegistry() - const acpCatalogSettings = new AcpCatalogSettings({ mcpSettings }) - const databaseSecurityService = new DatabaseSecurityService() - const securityStatus = databaseSecurityService.getStatus() + const acpCatalogSettings = new AcpCatalogSettings({ + mcpSettings, + store: new ElectronStore({ + name: 'acp_agents', + defaults: createAcpCatalogDefaults() + }) as unknown as StoreLike> + }) + const databaseSecurityService = new DatabaseSecurityService({ + dbPath: path.join(app.getPath('userData'), 'app_db', 'agent.db'), + metadata: new ElectronStore<{ metadata: DatabaseSecurityMetadata }>({ + name: 'database-security', + defaults: { metadata: { ...DEFAULT_DATABASE_SECURITY_METADATA } } + }), + crypto: { + ...credentialCrypto, + getBackend: async () => + process.platform === 'linux' ? safeStorage.getSelectedStorageBackend() : undefined + } + }) + const securityStatus = await databaseSecurityService.getStatus() splashWindow.showDatabaseUnlockProgress( { active: securityStatus.enabled, @@ -80,7 +118,7 @@ export async function startMainProcess( }) splashWindow.showDatabaseUnlockProgress({ active: false, - safeStorageAvailable: databaseSecurityService.getStatus().safeStorageAvailable + safeStorageAvailable: (await databaseSecurityService.getStatus()).safeStorageAvailable }) const settingsDatabase = new SettingsDatabase(database) const providerDatabase = new ProviderDatabase(database) @@ -94,7 +132,8 @@ export async function startMainProcess( settings: settingsStore, mcpSettings: mcpSettings.getMigrationSnapshot(), acpCatalog: acpCatalogSettings.getMigrationSnapshot(), - userDataPath: app.getPath('userData') + userDataPath: app.getPath('userData'), + currentAppVersion }) settingsStore.attachDatabase(settingsDatabase) mcpSettings.connectDatabase(mcpDatabase) @@ -103,16 +142,33 @@ export async function startMainProcess( mcpSettings.onUpgrade(configMigration.previousAppVersion) } proxyConfig.initFromConfig(proxySettings.getMode(), proxySettings.getCustomUrl()) - await registerProtocols(mcpAppSandboxRegistry) + const mcpAppDesktop = await registerProtocols(mcpAppSandboxRegistry) mainProcess = await createMainProcessControl({ previousAppVersion: configMigration.previousAppVersion, + currentAppVersion, + providerCatalogBootstrap: { + userDataDirectory: app.getPath('userData'), + builtInCatalogPath: path.join( + app.isPackaged ? path.join(process.resourcesPath, 'app.asar.unpacked') : app.getAppPath(), + 'resources', + 'model-db', + 'providers.json' + ) + }, settingsStore, secretStore, privacySettings, proxySettings, mcpSettings, + pluginToolPolicies: new PluginToolPolicyStore( + new ElectronStore<{ policies: StoredToolPolicy[] }>({ + name: 'plugin-tool-policies', + defaults: { policies: [] } + }) + ), mcpAppSandboxRegistry, + mcpAppDesktop, acpCatalogSettings, database, settingsDatabase, @@ -132,10 +188,12 @@ export async function startMainProcess( await splashWindow.close() return mainProcess } catch (error) { + providerDbLoader.stop() await splashWindow.close() if (mainProcess) { await mainProcess.stopForCleanup() } else { + await providerDbLoader.drain() database?.close() } throw error diff --git a/src/main/app/protocols.ts b/src/main/app/protocols.ts index 7d379fca1f..f5621fe2f0 100644 --- a/src/main/app/protocols.ts +++ b/src/main/app/protocols.ts @@ -14,7 +14,7 @@ import { WORKSPACE_PREVIEW_PROTOCOL } from '@/workspace/workspacePreviewProtocol' import { registerMcpAppProtocol } from '@/mcp/apps/sandboxProtocol' -import type { McpAppSandboxRegistry } from '@/mcp/apps/sandboxRegistry' +import type { McpAppSandboxRegistry, McpAppDesktopPort } from '@/mcp/apps/sandboxRegistry' const workspacePreviewMimeCache = new Map() @@ -148,7 +148,7 @@ const findDeepCdnResourcesDir = async (candidates: string[]): Promise => export async function registerProtocols( mcpAppSandboxRegistry: McpAppSandboxRegistry -): Promise { +): Promise { logger.info('registerProtocols: Registering application protocols') // Register 'deepcdn' protocol for loading built-in resources (simulating CDN) @@ -298,7 +298,8 @@ export async function registerProtocols( } }) - registerMcpAppProtocol(mcpAppSandboxRegistry) + const mcpAppDesktop = registerMcpAppProtocol(mcpAppSandboxRegistry) logger.info('registerProtocols: Application protocols registered successfully') + return mcpAppDesktop } diff --git a/src/main/app/rendererPerformanceLogService.ts b/src/main/app/rendererPerformanceLogService.ts index 3c4d793243..727edcd97f 100644 --- a/src/main/app/rendererPerformanceLogService.ts +++ b/src/main/app/rendererPerformanceLogService.ts @@ -1,7 +1,5 @@ -import { app } from 'electron' import fs from 'node:fs/promises' import path from 'node:path' -import type { SettingsStore } from '@/config/settingsStore' import { RendererPerformanceRecordSchema, type RendererPerformanceRecord @@ -26,17 +24,20 @@ export class RendererPerformanceLogService { private writeQueue: Promise = Promise.resolve(true) constructor( - private readonly settings: Pick, - private readonly getUserDataPath: () => string = () => app.getPath('userData'), + private readonly isLoggingEnabled: () => boolean, + private readonly userDataDirectory: string, private readonly fsImpl: RendererPerformanceLogFs = fs, private readonly now: () => number = Date.now, private readonly onWriteError: () => void = () => { console.warn('[RendererPerformance] Failed to persist diagnostic record') } - ) {} + ) { + if (!path.isAbsolute(userDataDirectory)) + throw new Error('Diagnostic profile directory must be absolute') + } async record(rawRecord: unknown): Promise { - if (!this.settings.get('loggingEnabled')) { + if (!this.isLoggingEnabled()) { return false } @@ -50,7 +51,7 @@ export class RendererPerformanceLogService { recordedAt: this.now() } const line = `${JSON.stringify(record)}\n` - const logDirectory = path.join(this.getUserDataPath(), 'logs') + const logDirectory = path.join(this.userDataDirectory, 'logs') const logPath = path.join(logDirectory, 'renderer-performance.ndjson') const write = async (): Promise => { diff --git a/src/main/app/routes.ts b/src/main/app/routes.ts index 348368e370..721df3fdce 100644 --- a/src/main/app/routes.ts +++ b/src/main/app/routes.ts @@ -86,7 +86,7 @@ export function createAppRoutes(deps: { async (rawInput) => { databaseSecurityGetStatusRoute.input.parse(rawInput) return databaseSecurityGetStatusRoute.output.parse({ - status: deps.databaseSecurity.getStatus() + status: await deps.databaseSecurity.getStatus() }) } ], diff --git a/src/main/app/schedulerHost.ts b/src/main/app/schedulerHost.ts new file mode 100644 index 0000000000..8c211dd710 --- /dev/null +++ b/src/main/app/schedulerHost.ts @@ -0,0 +1,78 @@ +import fs from 'node:fs' +import path from 'node:path' +import { fileURLToPath } from 'node:url' +import { app, utilityProcess } from 'electron' +import type { SchedulerHost } from '@/scheduler/schedulerProcessManager' + +export async function spawnSchedulerHost(signal: AbortSignal): Promise { + signal.throwIfAborted() + const modulePath = fileURLToPath(import.meta.url) + const appPath = app.getAppPath() + const candidates = [ + path.join(appPath, 'out/main/schedulerUtilityHost.js'), + path.join(appPath, 'schedulerUtilityHost.js'), + path.resolve(path.dirname(modulePath), 'schedulerUtilityHost.js'), + path.resolve(path.dirname(modulePath), '../schedulerUtilityHost.js'), + path.resolve(process.cwd(), 'out/main/schedulerUtilityHost.js') + ] + const entry = candidates.find((candidate) => fs.existsSync(candidate)) ?? candidates[0] + const host = utilityProcess.fork(entry, ['--deepchat-cron-scheduler-host'], { + serviceName: 'DeepChat Cron Jobs Scheduler', + stdio: 'ignore', + env: { ...process.env, DEEPCHAT_CRON_SCHEDULER_HOST: '1' } + }) + + return await new Promise((resolve, reject) => { + let settled = false + const settle = (callback: () => void) => { + if (settled) return + settled = true + host.off('spawn', onSpawn) + host.off('exit', onExit) + host.off('error', onError) + signal.removeEventListener('abort', onAbort) + callback() + } + const fail = (error: Error) => + settle(() => { + try { + host.kill() + } catch {} + reject(error) + }) + const onSpawn = () => + settle(() => + resolve({ + get pid() { + return host.pid + }, + postMessage(command) { + host.postMessage(command) + }, + kill() { + host.kill() + }, + onMessage(listener) { + host.on('message', listener) + }, + onExit(listener) { + host.on('exit', listener) + }, + onError(listener) { + host.on('error', listener) + } + }) + ) + const onExit = (code: number) => + fail(new Error(`Cron scheduler utility exited before spawn: ${code}`)) + const onError = (type: string, location: string) => + fail(new Error(`Scheduler utility process error: ${type} at ${location}`)) + const onAbort = () => fail(new Error('Scheduler utility spawn canceled.')) + + host.once('spawn', onSpawn) + host.once('exit', onExit) + host.once('error', onError) + signal.addEventListener('abort', onAbort, { once: true }) + if (signal.aborted) onAbort() + }) +} diff --git a/src/main/app/settingsRoutes.ts b/src/main/app/settingsRoutes.ts index e0a2c9cb2c..522678b593 100644 --- a/src/main/app/settingsRoutes.ts +++ b/src/main/app/settingsRoutes.ts @@ -1,5 +1,4 @@ import { - SETTINGS_KEYS, configGetEntriesRoute, configUpdateEntriesRoute, settingsActivityListRoute, @@ -13,18 +12,9 @@ import { settingsUpdateRoute, type ConfigEntryKey, type ConfigEntryValues, - type SettingsActivityInput, - type SettingsChange, - type SettingsKey, - type SettingsSnapshotValues + type SettingsActivityInput } from '@shared/contracts/routes' -import type { DeepChatDefaults } from '@/agent/deepchat/defaults' -import type { AgentTraceSettingsPort } from '@/agent/traceSettings' -import type { PrivacySettingsPort } from './privacy' -import type { DesktopSettings } from '@/desktop/settings' -import type { FontSettings } from '@/desktop/fontSettings' -import type { LoggingService } from './logging' -import type { OcrSettingsPort } from '@/ocr/ocrSettings' +import type { AppSettingsService } from './settingsService' import type { SettingsStore } from '@/config/settingsStore' import type { CommandShellService } from '@/agent/shared/process/commandShellService' import type { DeepchatEventPublisher } from '@shared/contracts/events' @@ -32,16 +22,9 @@ import { createRouteMap, type DeepchatRouteMap } from '@/routes/routeRegistry' export function createAppSettingsRoutes(deps: { settings: Pick - agentDefaults: DeepChatDefaults - privacy: PrivacySettingsPort - traceSettings: AgentTraceSettingsPort - desktopSettings: DesktopSettings - fonts: FontSettings - logging: LoggingService - ocr: OcrSettingsPort + appSettings: Pick commandShell: Pick publishEvent: DeepchatEventPublisher - applyContentProtection(enabled: boolean): void recordActivity(input: SettingsActivityInput): void listActivities(limit?: number): Promise }): DeepchatRouteMap { @@ -70,129 +53,6 @@ export function createAppSettingsRoutes(deps: { read('input_enabledMcpTools') return values } - const readSnapshot = (): SettingsSnapshotValues => ({ - fontSizeLevel: deps.desktopSettings.getFontSizeLevel(), - fontFamily: deps.fonts.getFontFamily(), - codeFontFamily: deps.fonts.getCodeFontFamily(), - autoScrollEnabled: deps.desktopSettings.getAutoScrollEnabled(), - autoCompactionEnabled: deps.agentDefaults.getAutoCompactionEnabled(), - autoCompactionTriggerThreshold: deps.agentDefaults.getAutoCompactionTriggerThreshold(), - autoCompactionRetainRecentPairs: deps.agentDefaults.getAutoCompactionRetainRecentPairs(), - contentProtectionEnabled: deps.desktopSettings.getContentProtectionEnabled(), - privacyModeEnabled: deps.privacy.isEnabled(), - notificationsEnabled: deps.desktopSettings.getNotificationsEnabled(), - launchAtLoginEnabled: deps.desktopSettings.getLaunchAtLoginEnabled(), - traceDebugEnabled: deps.traceSettings.isEnabled(), - copyWithCotEnabled: deps.desktopSettings.getCopyWithCotEnabled(), - loggingEnabled: deps.logging.getEnabled(), - ocrAutoExtractForNonVisionModels: deps.ocr.getAutomaticExtractionEnabled(), - ocrBackend: deps.ocr.getBackend() - }) - const pickSnapshot = ( - snapshot: SettingsSnapshotValues, - keys?: SettingsKey[] - ): Partial => { - const result: Partial = {} - for (const key of keys?.length ? keys : SETTINGS_KEYS) { - ;(result as Record)[key] = snapshot[key] - } - return result - } - const applyChange = (change: SettingsChange): void => { - switch (change.key) { - case 'fontSizeLevel': - deps.desktopSettings.setFontSizeLevel(change.value) - return - case 'fontFamily': - deps.fonts.setFontFamily(change.value) - return - case 'codeFontFamily': - deps.fonts.setCodeFontFamily(change.value) - return - case 'autoScrollEnabled': - deps.desktopSettings.setAutoScrollEnabled(change.value) - return - case 'autoCompactionEnabled': - deps.agentDefaults.setAutoCompactionEnabled(change.value) - return - case 'autoCompactionTriggerThreshold': - deps.agentDefaults.setAutoCompactionTriggerThreshold(change.value) - return - case 'autoCompactionRetainRecentPairs': - deps.agentDefaults.setAutoCompactionRetainRecentPairs(change.value) - return - case 'contentProtectionEnabled': - deps.desktopSettings.setContentProtectionEnabled(change.value) - deps.applyContentProtection(change.value) - return - case 'privacyModeEnabled': - deps.privacy.setEnabled(change.value) - return - case 'notificationsEnabled': - deps.desktopSettings.setNotificationsEnabled(change.value) - return - case 'launchAtLoginEnabled': - deps.desktopSettings.setLaunchAtLoginEnabled(change.value) - return - case 'traceDebugEnabled': - deps.traceSettings.setEnabled(change.value) - return - case 'copyWithCotEnabled': - deps.desktopSettings.setCopyWithCotEnabled(change.value) - return - case 'loggingEnabled': - deps.logging.setEnabled(change.value) - return - case 'ocrAutoExtractForNonVisionModels': - deps.ocr.setAutomaticExtractionEnabled(change.value) - return - case 'ocrBackend': - deps.ocr.setBackend(change.value) - } - } - const recordChange = (change: SettingsChange): void => { - deps.recordActivity({ - category: - change.key === 'privacyModeEnabled' - ? 'privacy' - : change.key === 'fontSizeLevel' || - change.key === 'fontFamily' || - change.key === 'codeFontFamily' || - change.key === 'contentProtectionEnabled' - ? 'appearance' - : 'system', - action: - typeof change.value === 'boolean' ? (change.value ? 'enabled' : 'disabled') : 'updated', - targetType: 'setting', - targetId: change.key, - targetLabel: change.key, - routeName: - change.key === 'privacyModeEnabled' - ? 'settings-database' - : change.key === 'ocrAutoExtractForNonVisionModels' || change.key === 'ocrBackend' - ? 'settings-ocr' - : 'settings-common', - summaryKey: 'settings.controlCenter.activity.settingUpdated', - summaryParams: { key: change.key } - }) - } - const getSnapshot = (keys?: SettingsKey[]) => ({ - version: Date.now(), - values: pickSnapshot(readSnapshot(), keys) - }) - const updateSnapshot = (changes: SettingsChange[]) => { - for (const change of changes) { - applyChange(change) - recordChange(change) - } - const changedKeys = changes.map((change) => change.key) - return { - version: Date.now(), - changedKeys, - values: pickSnapshot(readSnapshot(), changedKeys) - } - } - return createRouteMap([ [ configGetEntriesRoute.name, @@ -220,14 +80,14 @@ export function createAppSettingsRoutes(deps: { settingsGetSnapshotRoute.name, async (rawInput) => { const input = settingsGetSnapshotRoute.input.parse(rawInput) - return settingsGetSnapshotRoute.output.parse(getSnapshot(input.keys)) + return settingsGetSnapshotRoute.output.parse(await deps.appSettings.getSnapshot(input.keys)) } ], [ settingsGetPublicRoute.name, async (rawInput) => { const input = settingsGetPublicRoute.input.parse(rawInput) - return settingsGetPublicRoute.output.parse(getSnapshot(input.keys)) + return settingsGetPublicRoute.output.parse(await deps.appSettings.getSnapshot(input.keys)) } ], [ @@ -235,7 +95,7 @@ export function createAppSettingsRoutes(deps: { async (rawInput) => { settingsListSystemFontsRoute.input.parse(rawInput) return settingsListSystemFontsRoute.output.parse({ - fonts: await deps.fonts.getSystemFonts() + fonts: await deps.appSettings.listSystemFonts() }) } ], @@ -286,14 +146,14 @@ export function createAppSettingsRoutes(deps: { settingsUpdateRoute.name, async (rawInput) => { const input = settingsUpdateRoute.input.parse(rawInput) - return settingsUpdateRoute.output.parse(updateSnapshot(input.changes)) + return settingsUpdateRoute.output.parse(await deps.appSettings.update(input.changes)) } ], [ settingsUpdatePublicRoute.name, async (rawInput) => { const input = settingsUpdatePublicRoute.input.parse(rawInput) - return settingsUpdatePublicRoute.output.parse(updateSnapshot(input.changes)) + return settingsUpdatePublicRoute.output.parse(await deps.appSettings.update(input.changes)) } ], [ diff --git a/src/main/app/settingsService.ts b/src/main/app/settingsService.ts new file mode 100644 index 0000000000..4cbbb2b6db --- /dev/null +++ b/src/main/app/settingsService.ts @@ -0,0 +1,426 @@ +import { + SETTINGS_KEYS, + configSetLanguageRoute, + configSetThemeRoute, + settingsGetSnapshotRoute, + settingsUpdateRoute, + type DeepchatRouteOutput, + type SettingsActivityInput, + type SettingsChange, + type SettingsKey, + type SettingsSnapshotValues +} from '@shared/contracts/routes' +import { + ChatSettingMutationSchema, + type ApplyChatSettingSuccess, + type ChatSettingMutation +} from '@shared/types/chatSettings' +import type { DeepchatEventPublisher } from '@shared/contracts/events' +import type { DeepChatDefaults } from '@/agent/deepchat/defaults' +import type { AgentTraceSettingsPort } from '@/agent/traceSettings' +import type { PrivacySettingsPort } from './privacy' +import type { DesktopSettings } from '@/desktop/settings' +import type { FontSettings } from '@/desktop/fontSettings' +import type { LoggingService } from './logging' +import type { OcrSettingsPort } from '@/ocr/ocrSettings' +import { getLocaleDirection } from '@shared/locales' +import type { NativeConfigurationSnapshot } from '@shared/types/nativeConfiguration' +import type { FloatingButtonBounds } from '@shared/types/floating-widget' +import type { ShortcutKeySetting } from '@shared/types/desktop' +import type { UpdateSettings } from '@/upgrade/settings' +import { defaultShortcutKey } from '@/desktop/shortcutKeySettings' + +export interface AppSettingsServiceDependencies { + agentDefaults: DeepChatDefaults + privacy: PrivacySettingsPort + traceSettings: AgentTraceSettingsPort + desktopSettings: DesktopSettings + fonts: FontSettings + logging: LoggingService + ocr: OcrSettingsPort + recordActivity(input: SettingsActivityInput): void + publishEvent: DeepchatEventPublisher + nextVersion(): number + assertActive(): void + ownerId: string + updateSettings: UpdateSettings + publishNativeSnapshot(snapshot: NativeConfigurationSnapshot): void +} + +export class AppSettingsService { + private accepting = true + private pendingCommands = 0 + private tail: Promise = Promise.resolve() + private systemThemeObservation: Promise | undefined + private nativeVersion = 0 + + constructor(private readonly deps: AppSettingsServiceDependencies) {} + + private async enqueue(run: () => T | Promise, systemObservation = false): Promise { + this.deps.assertActive() + if (!this.accepting) throw new Error('Settings owner is stopped') + if (this.pendingCommands >= 64 && !systemObservation) + throw new Error('Settings command queue is full') + this.pendingCommands++ + const result = this.tail + .then(() => { + this.deps.assertActive() + if (!this.accepting) throw new Error('Settings owner is stopped') + return run() + }) + .finally(() => this.pendingCommands--) + this.tail = result.then( + () => undefined, + () => undefined + ) + return await result + } + + async stop(): Promise { + this.accepting = false + let timeout: NodeJS.Timeout | undefined + try { + await Promise.race([ + this.tail, + new Promise((_, reject) => { + timeout = setTimeout( + () => reject(new Error('Settings owner did not drain (30000ms)')), + 30_000 + ) + }) + ]) + } finally { + clearTimeout(timeout) + } + } + + start(): void { + if (this.pendingCommands > 0) throw new Error('Settings owner is still draining') + this.accepting = true + } + + readNativeSnapshot(): NativeConfigurationSnapshot { + const settings = this.deps.desktopSettings + const shortcuts = settings.getShortcutKeys() + const bounds = settings.getFloatingButtonBounds() + return structuredClone({ + ownerId: this.deps.ownerId, + version: ++this.nativeVersion, + language: settings.getLanguage(), + notificationsEnabled: settings.getNotificationsEnabled(), + closeToQuit: settings.getCloseToQuit(), + contentProtectionEnabled: settings.getContentProtectionEnabled(), + shortcutKeys: Object.fromEntries( + Object.keys(defaultShortcutKey).map((key) => [ + key, + shortcuts[key as keyof ShortcutKeySetting] + ]) + ) as ShortcutKeySetting, + floatingButtonEnabled: settings.getFloatingButtonEnabled(), + floatingButtonBounds: bounds ? { x: bounds.x, y: bounds.y, dockSide: bounds.dockSide } : null, + loggingEnabled: this.deps.logging.getEnabled(), + privacyModeEnabled: this.deps.privacy.isEnabled(), + updateChannel: this.deps.updateSettings.getChannel() + }) + } + + publishNativeSnapshot(): void { + this.deps.publishNativeSnapshot(this.readNativeSnapshot()) + } + + async getFloatingButtonEnabled(): Promise { + return await this.enqueue(() => this.deps.desktopSettings.getFloatingButtonEnabled()) + } + + async setFloatingButtonEnabled(enabled: boolean): Promise { + return await this.enqueue(async () => { + await this.deps.desktopSettings.setFloatingButtonEnabled(enabled) + return this.deps.desktopSettings.getFloatingButtonEnabled() + }) + } + + async setFloatingButtonBounds(bounds: FloatingButtonBounds): Promise { + if ( + !Number.isFinite(bounds.x) || + !Number.isFinite(bounds.y) || + !['left', 'right'].includes(bounds.dockSide) + ) + throw new Error('Invalid floating bounds') + const value = { x: bounds.x, y: bounds.y, dockSide: bounds.dockSide } + await this.enqueue(() => this.deps.desktopSettings.setFloatingButtonBounds(value)) + } + + async getShortcutKeys(): Promise { + return await this.enqueue(() => this.deps.desktopSettings.getShortcutKeys()) + } + + async setShortcutKeys(shortcuts: ShortcutKeySetting): Promise { + return await this.enqueue(() => { + this.deps.desktopSettings.setShortcutKeys(shortcuts) + return this.deps.desktopSettings.getShortcutKeys() + }) + } + + async resetShortcutKeys(): Promise { + return await this.enqueue(() => { + this.deps.desktopSettings.resetShortcutKeys() + return this.deps.desktopSettings.getShortcutKeys() + }) + } + + async getUpdateChannel(): Promise<'stable' | 'beta'> { + return await this.enqueue(() => this.deps.updateSettings.getChannel()) + } + + async setUpdateChannel(channel: 'stable' | 'beta'): Promise<'stable' | 'beta'> { + return await this.enqueue(() => { + this.deps.updateSettings.setChannel(channel) + this.publishNativeSnapshot() + return this.deps.updateSettings.getChannel() + }) + } + + async initializeDesktop(): Promise { + await this.enqueue(() => this.deps.desktopSettings.initialize()) + } + + async listSystemFonts(): Promise { + return await this.enqueue(() => this.deps.fonts.getSystemFonts()) + } + + async openLoggingFolder(): Promise { + await this.enqueue(() => this.deps.logging.openFolder()) + } + + async observeSystemTheme(): Promise { + this.deps.assertActive() + if (!this.accepting) throw new Error('Settings owner is stopped') + if (this.systemThemeObservation) return await this.systemThemeObservation + // Reserve the single coalesced observation so a full command queue cannot lose an OS change. + const pending = this.enqueue(async () => { + this.systemThemeObservation = undefined + await this.deps.desktopSettings.observeSystemTheme() + }, true) + this.systemThemeObservation = pending + const clear = () => { + if (this.systemThemeObservation === pending) this.systemThemeObservation = undefined + } + void pending.then(clear, clear) + await pending + } + + private readLanguage(): DeepchatRouteOutput<'config.getLanguage'> { + const locale = this.deps.desktopSettings.getLanguage() + return { + requestedLanguage: this.deps.desktopSettings.getRequestedLanguage(), + locale, + direction: getLocaleDirection(locale) + } + } + + async getLanguage(): Promise> { + return await this.enqueue(() => this.readLanguage()) + } + + async setLanguage(language: string): Promise> { + const input = configSetLanguageRoute.input.parse({ language }) + return await this.enqueue(async () => { + await this.deps.desktopSettings.setLanguage(input.language) + return this.readLanguage() + }) + } + + private async readTheme(): Promise> { + return { + theme: this.deps.desktopSettings.getTheme(), + isDark: await this.deps.desktopSettings.getCurrentThemeIsDark() + } + } + + async getTheme(): Promise> { + return await this.enqueue(() => this.readTheme()) + } + + async setTheme( + theme: 'dark' | 'light' | 'system' + ): Promise> { + const input = configSetThemeRoute.input.parse({ theme }) + return await this.enqueue(async () => ({ + theme: input.theme, + isDark: await this.deps.desktopSettings.setTheme(input.theme) + })) + } + + private readonly readSnapshot = async ( + keys?: SettingsKey[] + ): Promise> => { + const values: Partial = { + fontSizeLevel: this.deps.desktopSettings.getFontSizeLevel(), + fontFamily: this.deps.fonts.getFontFamily(), + codeFontFamily: this.deps.fonts.getCodeFontFamily(), + autoScrollEnabled: this.deps.desktopSettings.getAutoScrollEnabled(), + autoCompactionEnabled: this.deps.agentDefaults.getAutoCompactionEnabled(), + autoCompactionTriggerThreshold: this.deps.agentDefaults.getAutoCompactionTriggerThreshold(), + autoCompactionRetainRecentPairs: this.deps.agentDefaults.getAutoCompactionRetainRecentPairs(), + contentProtectionEnabled: this.deps.desktopSettings.getContentProtectionEnabled(), + privacyModeEnabled: this.deps.privacy.isEnabled(), + notificationsEnabled: this.deps.desktopSettings.getNotificationsEnabled(), + traceDebugEnabled: this.deps.traceSettings.isEnabled(), + copyWithCotEnabled: this.deps.desktopSettings.getCopyWithCotEnabled(), + loggingEnabled: this.deps.logging.getEnabled(), + ocrAutoExtractForNonVisionModels: this.deps.ocr.getAutomaticExtractionEnabled(), + ocrBackend: this.deps.ocr.getBackend() + } + if (!keys?.length || keys.includes('launchAtLoginEnabled')) { + values.launchAtLoginEnabled = await this.deps.desktopSettings.getLaunchAtLoginEnabled() + } + return this.pickSnapshot(values, keys) + } + private readonly pickSnapshot = ( + snapshot: Partial, + keys?: SettingsKey[] + ): Partial => { + const result: Partial = {} + for (const key of keys?.length ? keys : SETTINGS_KEYS) { + ;(result as Record)[key] = + snapshot[key] + } + return result + } + private readonly applyChange = (change: SettingsChange): void | Promise => { + switch (change.key) { + case 'fontSizeLevel': + this.deps.desktopSettings.setFontSizeLevel(change.value) + return + case 'fontFamily': + this.deps.fonts.setFontFamily(change.value) + return + case 'codeFontFamily': + this.deps.fonts.setCodeFontFamily(change.value) + return + case 'autoScrollEnabled': + this.deps.desktopSettings.setAutoScrollEnabled(change.value) + return + case 'autoCompactionEnabled': + this.deps.agentDefaults.setAutoCompactionEnabled(change.value) + return + case 'autoCompactionTriggerThreshold': + this.deps.agentDefaults.setAutoCompactionTriggerThreshold(change.value) + return + case 'autoCompactionRetainRecentPairs': + this.deps.agentDefaults.setAutoCompactionRetainRecentPairs(change.value) + return + case 'contentProtectionEnabled': + return this.deps.desktopSettings.setContentProtectionEnabled(change.value) + case 'privacyModeEnabled': + this.deps.privacy.setEnabled(change.value) + this.publishNativeSnapshot() + return + case 'notificationsEnabled': + this.deps.desktopSettings.setNotificationsEnabled(change.value) + return + case 'launchAtLoginEnabled': + return this.deps.desktopSettings.setLaunchAtLoginEnabled(change.value) + case 'traceDebugEnabled': + this.deps.traceSettings.setEnabled(change.value) + return + case 'copyWithCotEnabled': + this.deps.desktopSettings.setCopyWithCotEnabled(change.value) + return + case 'loggingEnabled': + return this.deps.logging.setEnabled(change.value) + case 'ocrAutoExtractForNonVisionModels': + this.deps.ocr.setAutomaticExtractionEnabled(change.value) + return + case 'ocrBackend': + this.deps.ocr.setBackend(change.value) + } + } + private readonly recordChange = (change: SettingsChange): void => { + this.deps.recordActivity({ + category: + change.key === 'privacyModeEnabled' + ? 'privacy' + : change.key === 'fontSizeLevel' || + change.key === 'fontFamily' || + change.key === 'codeFontFamily' || + change.key === 'contentProtectionEnabled' + ? 'appearance' + : 'system', + action: + typeof change.value === 'boolean' ? (change.value ? 'enabled' : 'disabled') : 'updated', + targetType: 'setting', + targetId: change.key, + targetLabel: change.key, + routeName: + change.key === 'privacyModeEnabled' + ? 'settings-database' + : change.key === 'ocrAutoExtractForNonVisionModels' || change.key === 'ocrBackend' + ? 'settings-ocr' + : 'settings-common', + summaryKey: 'settings.controlCenter.activity.settingUpdated', + summaryParams: { key: change.key } + }) + } + + async getSnapshot(keys?: SettingsKey[]): Promise> { + const input = settingsGetSnapshotRoute.input.parse({ keys }) + return await this.enqueue(async () => { + const version = this.deps.nextVersion() + return { version, values: await this.readSnapshot(input.keys) } + }) + } + + async update(changes: SettingsChange[]): Promise> { + const input = settingsUpdateRoute.input.parse({ changes }) + return await this.enqueue(async () => { + for (const change of input.changes) { + const pending = this.applyChange(change) + if (pending) await pending + this.recordChange(change) + } + const changedKeys = input.changes.map((change) => change.key) + const values = await this.readSnapshot(changedKeys) + return { version: this.deps.nextVersion(), changedKeys, values } + }) + } + + async publishSnapshot(): Promise { + await this.enqueue(async () => { + this.publishNativeSnapshot() + const version = this.deps.nextVersion() + this.deps.publishEvent('settings.changed', { + version, + changedKeys: [...SETTINGS_KEYS], + values: await this.readSnapshot() + }) + }) + } + + async applyDisplayChange(raw: ChatSettingMutation): Promise { + const change = ChatSettingMutationSchema.parse(raw) + return await this.enqueue(async () => { + const settings = this.deps.desktopSettings + let previousValue: ApplyChatSettingSuccess['previousValue'] + switch (change.id) { + case 'copyWithCotEnabled': + previousValue = settings.getCopyWithCotEnabled() + settings.setCopyWithCotEnabled(change.value) + break + case 'fontSizeLevel': + previousValue = settings.getFontSizeLevel() + settings.setFontSizeLevel(change.value) + break + case 'language': + previousValue = settings.getRequestedLanguage() + await settings.setLanguage(change.value) + break + case 'theme': + previousValue = settings.getTheme() + await settings.setTheme(change.value) + break + } + return { ok: true, id: change.id, value: change.value, previousValue, appliedAt: Date.now() } + }) + } +} diff --git a/src/main/app/startupMigrations/legacyChatImportService.ts b/src/main/app/startupMigrations/legacyChatImportService.ts index 881beb7eff..7cf3358987 100644 --- a/src/main/app/startupMigrations/legacyChatImportService.ts +++ b/src/main/app/startupMigrations/legacyChatImportService.ts @@ -1,4 +1,3 @@ -import { app } from 'electron' import path from 'path' import fs from 'fs' import Database from 'better-sqlite3-multiple-ciphers' @@ -46,7 +45,7 @@ export class LegacyChatImportService { projectDatabase: ProjectDatabase, memoryDatabase: MemoryDatabase, tapeFacts: TranscriptTapePort, - sourceDbPath?: string, + sourceDbPath: string, notifyEnvironmentProjectionChanged: () => void = () => undefined ) { this.appDatabase = appDatabase @@ -54,7 +53,8 @@ export class LegacyChatImportService { this.projectDatabase = projectDatabase this.memoryDatabase = memoryDatabase this.messageStore = new SessionTranscript(this.sessionDatabase, tapeFacts) - this.sourceDbPath = sourceDbPath ?? path.join(app.getPath('userData'), 'app_db', 'chat.db') + if (!path.isAbsolute(sourceDbPath)) throw new Error('Legacy database path must be absolute') + this.sourceDbPath = sourceDbPath this.notifyEnvironmentProjectionChanged = notifyEnvironmentProjectionChanged } diff --git a/src/main/app/startupWorkloadCoordinator/index.ts b/src/main/app/startupWorkloadCoordinator/index.ts index bf86e7d1d8..2dc688b51e 100644 --- a/src/main/app/startupWorkloadCoordinator/index.ts +++ b/src/main/app/startupWorkloadCoordinator/index.ts @@ -74,6 +74,8 @@ type StartupTaskRecord = { resolve: (value: T | PromiseLike) => void reject: (reason?: unknown) => void promise: Promise + finished: Promise + finish: () => void } const PHASE_PRIORITY: Record = { @@ -133,7 +135,8 @@ export class StartupWorkloadCoordinator { const tasks = [...runState.tasks] for (const task of tasks) { - if (task.state === 'pending') { + const pending = task.state === 'pending' + if (pending) { this.removePendingTask(task.internalKey) } @@ -144,6 +147,8 @@ export class StartupWorkloadCoordinator { task.reject(this.createAbortError(task.id)) } + if (pending) this.finishTask(task, 'cancelled') + if (!task.visibleId) { runState.tasks.delete(task) } @@ -153,6 +158,29 @@ export class StartupWorkloadCoordinator { this.runs.delete(target) } + async cancelAndDrainTarget(target: StartupWorkloadTarget): Promise { + this.cancelTarget(target) + const pending = [...this.inFlightByDedupeKey.values()] + .filter((task) => task.target === target) + .map((task) => task.finished) + if (pending.length === 0) return + + let timeout: NodeJS.Timeout | undefined + try { + await Promise.race([ + Promise.all(pending), + new Promise((_, reject) => { + timeout = setTimeout( + () => reject(new Error(`Startup workload target "${target}" did not drain (30000ms)`)), + 30_000 + ) + }) + ]) + } finally { + clearTimeout(timeout) + } + } + replayTarget(target: StartupWorkloadTarget): void { if (!this.runs.has(target)) { this.ensureRun(target) @@ -194,6 +222,10 @@ export class StartupWorkloadCoordinator { resolveTask = resolve rejectTask = reject }) + let finish!: () => void + const finished = new Promise((resolve) => { + finish = resolve + }) const now = Date.now() const task: StartupTaskRecord = { @@ -213,7 +245,9 @@ export class StartupWorkloadCoordinator { run: options.run, resolve: resolveTask, reject: rejectTask, - promise + promise, + finished, + finish } runState.tasks.add(task as StartupTaskRecord) @@ -370,6 +404,7 @@ export class StartupWorkloadCoordinator { task.state = finalState task.updatedAt = Date.now() this.inFlightByDedupeKey.delete(task.dedupeKey) + task.finish() const runState = this.runs.get(task.target) if (!runState || runState.runId !== task.runId) { diff --git a/src/main/cli/runService.ts b/src/main/cli/runService.ts index f6a7b653bb..1b4cef4f54 100644 --- a/src/main/cli/runService.ts +++ b/src/main/cli/runService.ts @@ -79,6 +79,7 @@ export type CliRunServiceOptions = Readonly<{ sessions: RunSessionStorePort getPendingAssistantMessages(runId: string): ChatMessageRecord[] hasWaitingDescendantInteraction(runId: string): boolean + readSubscriptionSnapshot(read: () => Promise): Promise eventHub: TypedEventHub now?: () => number log?: Pick @@ -390,7 +391,9 @@ export class CliRunService { let lastCursor = subscription.initialCursor try { - const currentRun = await this.buildSnapshot(input.runId, input.messageLimit) + const currentRun = await this.options.readSubscriptionSnapshot(() => + this.buildSnapshot(input.runId, input.messageLimit) + ) const terminalAtSubscribe = currentRun.status !== 'generating' if (subscription.recoveryReason) { const snapshot = runsSnapshotEvent.payload.parse({ diff --git a/src/main/config/migration.ts b/src/main/config/migration.ts index bae46ed380..011979c3f5 100644 --- a/src/main/config/migration.ts +++ b/src/main/config/migration.ts @@ -1,4 +1,3 @@ -import { app } from 'electron' import ElectronStore from 'electron-store' import path from 'node:path' import type { Prompt, SystemPrompt } from '@shared/types/prompt' @@ -44,9 +43,9 @@ export function migrateConfigStorage(options: { mcpSettings: Record acpCatalog: { enabled: boolean; sharedMcpSelections: string[] } userDataPath: string - currentAppVersion?: string + currentAppVersion: string }): ConfigMigrationResult { - const currentAppVersion = options.currentAppVersion ?? app.getVersion() + const currentAppVersion = options.currentAppVersion const previousAppVersion = options.settings.get('appVersion') migrateBusinessConfigToSqlite(options) diff --git a/src/main/config/secretStore.ts b/src/main/config/secretStore.ts index d91664d609..c1a8aacb92 100644 --- a/src/main/config/secretStore.ts +++ b/src/main/config/secretStore.ts @@ -1,46 +1,102 @@ -import { safeStorage } from 'electron' import type { SettingsStore } from './settingsStore' +export interface CredentialCryptoPort { + isAvailable(): Promise + encrypt(value: string): Promise + decrypt(wrapped: string): Promise +} + export class SecretStore { - constructor(private readonly settings: SettingsStore) {} + private generation = 0 + private paused = false + + constructor( + private readonly settings: SettingsStore, + private readonly crypto: CredentialCryptoPort + ) {} + + pause(): void { + this.paused = true + this.generation++ + } - isAvailable(): boolean { + resume(): void { + this.generation++ + this.paused = false + } + + captureOperation(): () => void { + const generation = this.generation + const check = () => { + if (this.paused || generation !== this.generation) + throw new Error('Credential operation interrupted by maintenance or shutdown') + } + check() + return check + } + + async isAvailable(): Promise { + const check = this.captureOperation() + let available = false try { - return safeStorage.isEncryptionAvailable() + available = await this.crypto.isAvailable() } catch { - return false + available = false } + check() + return available } - get(key: string): string { + async get(key: string): Promise { + const check = this.captureOperation() const wrapped = this.settings.get(key) if (!wrapped) { return '' } + let value = '' try { - return safeStorage.decryptString(Buffer.from(wrapped, 'base64')) + value = await this.crypto.decrypt(wrapped) } catch (error) { console.error(`[SecretStore] Failed to decrypt ${key}:`, error) - return '' } + check() + if (this.getWrapped(key) !== wrapped) throw new Error('The saved credential changed') + return value } getWrapped(key: string): string | undefined { return this.settings.get(key) } - wrap(value: string): string { - if (!this.isAvailable()) { + async unwrap(wrapped: string): Promise { + const check = this.captureOperation() + try { + return await this.crypto.decrypt(wrapped) + } finally { + check() + } + } + + async wrap(value: string): Promise { + const check = this.captureOperation() + if (!(await this.isAvailable())) { throw new Error('sync.error.safeStorageUnavailable') } - return Buffer.from(safeStorage.encryptString(value)).toString('base64') + check() + try { + return await this.crypto.encrypt(value) + } finally { + check() + } } setWrapped(key: string, wrapped: string): void { + this.captureOperation() this.settings.set(key, wrapped) } restoreWrapped(key: string, wrapped: string | undefined): void { + this.captureOperation() if (wrapped === undefined) { this.settings.delete(key) return diff --git a/src/main/config/settingsStore.ts b/src/main/config/settingsStore.ts index 9fd4cc0634..35bb1fc0f6 100644 --- a/src/main/config/settingsStore.ts +++ b/src/main/config/settingsStore.ts @@ -1,46 +1,8 @@ +import Conf from 'conf' +import path from 'node:path' import type { SettingsDatabase } from '@/settings/data/database' import { AppSettingsDbBackedStore } from '@/settings/appSettingsDbStore' import type { StoreLike } from '@/config/storeLike' -import ElectronStore from 'electron-store' -import path from 'node:path' -import { app } from 'electron' - -export function createSettingsStore(): SettingsStore { - const userDataPath = app.getPath('userData') - return new SettingsStore( - new ElectronStore>({ - name: 'app-settings', - defaults: { - language: 'system', - providers: [], - closeToQuit: false, - proxyMode: 'system', - customProxyUrl: '', - searchPreviewEnabled: true, - contentProtectionEnabled: false, - privacyModeEnabled: false, - syncEnabled: false, - syncFolderPath: path.join(userDataPath, 'sync'), - lastSyncTime: 0, - copyWithCotEnabled: true, - autoCompactionEnabled: true, - autoCompactionTriggerThreshold: 80, - autoCompactionRetainRecentPairs: 2, - loggingEnabled: false, - floatingButtonEnabled: false, - fontFamily: '', - codeFontFamily: '', - default_system_prompt: '', - skillsPath: path.join(app.getPath('home'), '.deepchat', 'skills'), - enableSkills: true, - skillDraftSuggestionsEnabled: false, - appVersion: app.getVersion(), - hooksNotifications: { hooks: [] }, - agentCommandShell: { preference: 'auto' } - } - }) as unknown as StoreLike> - ) -} export class SettingsStore implements StoreLike> { private activeStore: StoreLike> @@ -102,3 +64,49 @@ export class SettingsStore implements StoreLike> { this.legacyStore.delete(key) } } + +export function createSettingsStore(options: { + userDataDirectory: string + homeDirectory: string + currentAppVersion: string +}): SettingsStore { + for (const directory of [options.userDataDirectory, options.homeDirectory]) { + if (!path.isAbsolute(directory)) throw new Error('Settings directories must be absolute') + } + const userDataPath = options.userDataDirectory + return new SettingsStore( + new Conf>({ + configName: 'app-settings', + cwd: userDataPath, + projectVersion: options.currentAppVersion, + defaults: { + language: 'system', + providers: [], + closeToQuit: false, + proxyMode: 'system', + customProxyUrl: '', + searchPreviewEnabled: true, + contentProtectionEnabled: false, + privacyModeEnabled: false, + syncEnabled: false, + syncFolderPath: path.join(userDataPath, 'sync'), + lastSyncTime: 0, + copyWithCotEnabled: true, + autoCompactionEnabled: true, + autoCompactionTriggerThreshold: 80, + autoCompactionRetainRecentPairs: 2, + loggingEnabled: false, + floatingButtonEnabled: false, + fontFamily: '', + codeFontFamily: '', + default_system_prompt: '', + skillsPath: path.join(options.homeDirectory, '.deepchat', 'skills'), + enableSkills: true, + skillDraftSuggestionsEnabled: false, + appVersion: options.currentAppVersion, + hooksNotifications: { hooks: [] }, + agentCommandShell: { preference: 'auto' } + } + }) as unknown as StoreLike> + ) +} diff --git a/src/main/deeplink/actions.ts b/src/main/deeplink/actions.ts index d18447f229..46fc5eb1a2 100644 --- a/src/main/deeplink/actions.ts +++ b/src/main/deeplink/actions.ts @@ -1,6 +1,4 @@ -import type { ProviderSettingsPort } from '@/provider/settings' import { BrowserWindow } from 'electron' -import type { McpServicePort } from '@shared/types/mcp' import type { IWindowPresenter } from '@shared/types/desktop' import type { ProviderInstallPreview } from '@shared/providerDeeplink' import type { ProviderDeeplinkFailureReason } from '@shared/notifications' @@ -17,8 +15,7 @@ import type { type DeeplinkActionsDeps = { window: IWindowPresenter - config: Pick - mcp: Pick + hasProvider(providerId: string): Promise notifications: SemanticNotificationPublisher } @@ -72,14 +69,7 @@ class DesktopActions implements DeeplinkDesktopPort { } class McpInstallActions implements DeeplinkMcpInstallPort { - constructor( - private readonly windowPresenter: IWindowPresenter, - private readonly mcpService: Pick - ) {} - - isReady(): boolean { - return this.mcpService.isReady() - } + constructor(private readonly windowPresenter: IWindowPresenter) {} async requestInstall(mcpConfig: string): Promise { const targetWindow = await resolveChatWindow(this.windowPresenter) @@ -94,12 +84,12 @@ class McpInstallActions implements DeeplinkMcpInstallPort { class ProviderInstallActions implements DeeplinkProviderInstallPort { constructor( private readonly windowPresenter: IWindowPresenter, - private readonly providerSettings: Pick, + private readonly providerExists: DeeplinkActionsDeps['hasProvider'], private readonly notifications: SemanticNotificationPublisher ) {} - hasProvider(providerId: string): boolean { - return Boolean(this.providerSettings.getProviderById(providerId)) + hasProvider(providerId: string): Promise { + return this.providerExists(providerId) } async requestInstall(preview: ProviderInstallPreview): Promise { @@ -129,6 +119,6 @@ class ProviderInstallActions implements DeeplinkProviderInstallPort { export const createDeeplinkActions = (deps: DeeplinkActionsDeps) => ({ desktop: new DesktopActions(deps.window), - mcp: new McpInstallActions(deps.window, deps.mcp), - provider: new ProviderInstallActions(deps.window, deps.config, deps.notifications) + mcp: new McpInstallActions(deps.window), + provider: new ProviderInstallActions(deps.window, deps.hasProvider, deps.notifications) }) diff --git a/src/main/deeplink/index.ts b/src/main/deeplink/index.ts index 277c4d56ad..e43a9356a0 100644 --- a/src/main/deeplink/index.ts +++ b/src/main/deeplink/index.ts @@ -56,6 +56,7 @@ class ProviderDeeplinkError extends Error { export class DeeplinkService { private startupUrl: string | null = null private pendingMcpInstallUrl: string | null = null + private mcpReady = false constructor( private readonly desktop: DeeplinkDesktopPort, @@ -92,8 +93,9 @@ export class DeeplinkService { this.startupUrl = null } - processPendingMcpInstall(): void { - if (!this.pendingMcpInstallUrl) { + observeMcpReadiness(ready: boolean): void { + this.mcpReady = ready + if (!ready || !this.pendingMcpInstallUrl) { return } @@ -101,8 +103,9 @@ export class DeeplinkService { 'Processing pending MCP install URL:', this.redactDeepLinkUrlForLog(this.pendingMcpInstallUrl) ) - void this.handleDeepLink(this.pendingMcpInstallUrl) + const pendingUrl = this.pendingMcpInstallUrl this.pendingMcpInstallUrl = null + void this.handleDeepLink(pendingUrl) } async handleDeepLink(url: string): Promise { @@ -122,7 +125,7 @@ export class DeeplinkService { logger.info('Parsed deeplink - command:', command, 'subCommand:', subCommand) - if (command === 'mcp' && subCommand === 'install' && !this.mcpInstall.isReady()) { + if (command === 'mcp' && subCommand === 'install' && !this.mcpReady) { logger.info('MCP not ready yet, saving MCP install URL for later') this.pendingMcpInstallUrl = url return @@ -363,7 +366,7 @@ export class DeeplinkService { let preview: ProviderInstallPreview try { - preview = this.parseProviderInstallParams(params) + preview = await this.parseProviderInstallParams(params) } catch (error) { const isExpectedRejection = error instanceof ProviderDeeplinkError const reason = isExpectedRejection ? error.reason : ('invalid-payload' as const) @@ -387,7 +390,9 @@ export class DeeplinkService { } } - private parseProviderInstallParams(params: URLSearchParams): ProviderInstallPreview { + private async parseProviderInstallParams( + params: URLSearchParams + ): Promise { const version = params.get('v') if (version !== PROVIDER_INSTALL_VERSION) { throw new ProviderDeeplinkError( @@ -417,7 +422,7 @@ export class DeeplinkService { ) } - if (!this.providerInstall.hasProvider(id)) { + if (!(await this.providerInstall.hasProvider(id))) { throw new ProviderDeeplinkError('provider-not-found', `Unknown provider id: ${id}`) } diff --git a/src/main/deeplink/ports.ts b/src/main/deeplink/ports.ts index ea3b213589..38dd25e689 100644 --- a/src/main/deeplink/ports.ts +++ b/src/main/deeplink/ports.ts @@ -14,12 +14,11 @@ export interface DeeplinkDesktopPort { } export interface DeeplinkMcpInstallPort { - isReady(): boolean requestInstall(mcpConfig: string): Promise } export interface DeeplinkProviderInstallPort { - hasProvider(providerId: string): boolean + hasProvider(providerId: string): Promise requestInstall(preview: ProviderInstallPreview): Promise reportFailure(reason: ProviderDeeplinkFailureReason): void } diff --git a/src/main/desktop/configurationHost.ts b/src/main/desktop/configurationHost.ts new file mode 100644 index 0000000000..41b9120a45 --- /dev/null +++ b/src/main/desktop/configurationHost.ts @@ -0,0 +1,91 @@ +import { mkdir } from 'node:fs/promises' +import { isAbsolute, join } from 'node:path' +import { shell } from 'electron' +import fontList from 'font-list' +import { reportNativeMainError } from '@/logging' + +export class DesktopConfigurationHost { + private state: 'active' | 'paused' | 'closed' = 'paused' + private restartPending = false + private restartTimer: NodeJS.Timeout | undefined + + constructor( + private readonly userDataDirectory: string, + private readonly setLoggingPersistence: (enabled: boolean) => void, + private readonly restartApplication: () => Promise + ) { + if (!isAbsolute(userDataDirectory)) + throw new Error('Desktop profile directory must be absolute') + } + + async listSystemFonts(): Promise { + this.assertOpen() + return await fontList.getFonts() + } + + async openLoggingFolder(): Promise { + this.assertOpen() + const directory = join(this.userDataDirectory, 'logs') + await mkdir(directory, { recursive: true }) + this.assertOpen() + const error = await shell.openPath(directory) + if (error) throw new Error(`Unable to open logging folder: ${error}`) + } + + async applyLogging(enabled: boolean): Promise { + this.assertOpen() + this.setLoggingPersistence(enabled) + this.requestRestart() + } + + requestRestart(): void { + this.assertOpen() + this.restartPending = true + this.scheduleRestart() + } + + pause(): void { + if (this.state === 'closed') return + this.state = 'paused' + this.clearRestartTimer() + } + + resume(): void { + this.assertOpen() + this.state = 'active' + this.scheduleRestart() + } + + close(): void { + this.state = 'closed' + this.restartPending = false + this.clearRestartTimer() + } + + private assertOpen(): void { + if (this.state === 'closed') throw new Error('Desktop configuration host is closed') + } + + private clearRestartTimer(): void { + clearTimeout(this.restartTimer) + this.restartTimer = undefined + } + + private scheduleRestart(): void { + this.clearRestartTimer() + if (this.state !== 'active' || !this.restartPending) return + this.restartTimer = setTimeout(() => { + this.restartTimer = undefined + if (this.state !== 'active' || !this.restartPending) return + this.restartPending = false + try { + // The shutdown coordinator owns a fired restart; awaiting it during close would deadlock. + void this.restartApplication().catch((error) => { + reportNativeMainError('Application restart failed:', error) + }) + } catch (error) { + reportNativeMainError('Application restart failed:', error) + } + }, 1000) + } +} diff --git a/src/main/desktop/configurationProjection.ts b/src/main/desktop/configurationProjection.ts new file mode 100644 index 0000000000..2360e63e22 --- /dev/null +++ b/src/main/desktop/configurationProjection.ts @@ -0,0 +1,82 @@ +import type { NativeConfigurationSnapshot } from '@shared/types/nativeConfiguration' +import type { FloatingButtonBounds } from '@shared/types/floating-widget' + +export class DesktopConfigurationProjection { + private snapshot: NativeConfigurationSnapshot + private acceptingWrites = true + private readonly pendingWrites = new Set>() + + constructor( + initial: NativeConfigurationSnapshot, + private readonly readNativeDarkMode: () => boolean, + private readonly writeBounds: (bounds: FloatingButtonBounds) => Promise + ) { + this.snapshot = structuredClone(initial) + } + + apply(snapshot: NativeConfigurationSnapshot): void { + if ( + !Number.isSafeInteger(snapshot.version) || + snapshot.ownerId !== this.snapshot.ownerId || + snapshot.version <= this.snapshot.version + ) + return + this.snapshot = structuredClone(snapshot) + } + + getLanguage() { + return this.snapshot.language + } + getNotificationsEnabled() { + return this.snapshot.notificationsEnabled + } + getCloseToQuit() { + return this.snapshot.closeToQuit + } + getContentProtectionEnabled() { + return this.snapshot.contentProtectionEnabled + } + getShortcutKeys() { + return structuredClone(this.snapshot.shortcutKeys) + } + getFloatingButtonEnabled() { + return this.snapshot.floatingButtonEnabled + } + getFloatingButtonBounds() { + return structuredClone(this.snapshot.floatingButtonBounds) + } + getLoggingEnabled() { + return this.snapshot.loggingEnabled + } + isPrivacyModeEnabled() { + return this.snapshot.privacyModeEnabled + } + getChannel() { + return this.snapshot.updateChannel + } + async getCurrentThemeIsDark(): Promise { + return this.readNativeDarkMode() + } + + async setFloatingButtonBounds(bounds: FloatingButtonBounds): Promise { + if (!this.acceptingWrites) throw new Error('Native configuration writes are stopped') + const pending = this.writeBounds(structuredClone(bounds)) + this.pendingWrites.add(pending) + try { + await pending + } finally { + this.pendingWrites.delete(pending) + } + } + + stopWrites(): void { + this.acceptingWrites = false + } + startWrites(): void { + if (this.pendingWrites.size) throw new Error('Native configuration writes are still draining') + this.acceptingWrites = true + } + async drainWrites(): Promise { + await Promise.allSettled(this.pendingWrites) + } +} diff --git a/src/main/desktop/floatingButton/index.ts b/src/main/desktop/floatingButton/index.ts index 59eb91936f..729eb841e2 100644 --- a/src/main/desktop/floatingButton/index.ts +++ b/src/main/desktop/floatingButton/index.ts @@ -21,7 +21,7 @@ import type { SessionQuery } from '@/session/query' import type { DesktopSessionBinding } from '@/desktop/sessionBinding' import type { WindowPresenter } from '../window' import type { TabPresenter } from '../tab' -import type { DesktopSettings } from '../settings' +import type { DesktopConfigurationProjection } from '../configurationProjection' const EMPTY_SNAPSHOT: FloatingWidgetSnapshot = { expanded: false, @@ -82,7 +82,7 @@ export class FloatingButtonPresenter { 'getAcpRegistryIconMarkup' | 'listAgents' | 'getAcpEnabled' >, private readonly settings: Pick< - DesktopSettings, + DesktopConfigurationProjection, | 'getFloatingButtonEnabled' | 'getFloatingButtonBounds' | 'setFloatingButtonBounds' @@ -208,7 +208,7 @@ export class FloatingButtonPresenter { } } - public refreshLanguage(): void { + public refreshLanguage(locale = this.settings.getLanguage()): void { if (!this.floatingWindow?.exists()) { return } @@ -218,13 +218,10 @@ export class FloatingButtonPresenter { return } - buttonWindow.webContents.send( - FLOATING_BUTTON_EVENTS.LANGUAGE_CHANGED, - this.settings.getLanguage() - ) + buttonWindow.webContents.send(FLOATING_BUTTON_EVENTS.LANGUAGE_CHANGED, locale) } - public async refreshTheme(): Promise { + public async refreshTheme(isDark?: boolean): Promise { if (!this.floatingWindow?.exists()) { return } @@ -234,7 +231,8 @@ export class FloatingButtonPresenter { return } - buttonWindow.webContents.send(FLOATING_BUTTON_EVENTS.THEME_CHANGED, await this.resolveTheme()) + const theme = isDark === undefined ? await this.resolveTheme() : isDark ? 'dark' : 'light' + buttonWindow.webContents.send(FLOATING_BUTTON_EVENTS.THEME_CHANGED, theme) } private async createFloatingWindow(): Promise { @@ -331,7 +329,8 @@ export class FloatingButtonPresenter { void this.openSession(sessionId.trim()) }) - ipcMain.on(FLOATING_BUTTON_EVENTS.DRAG_START, (_event, payload: unknown) => { + ipcMain.on(FLOATING_BUTTON_EVENTS.DRAG_START, (event, payload: unknown) => { + if (!this.isWidgetSender(event)) return if (!isPointPayload(payload)) { return } @@ -362,7 +361,8 @@ export class FloatingButtonPresenter { } }) - ipcMain.on(FLOATING_BUTTON_EVENTS.DRAG_MOVE, (_event, payload: unknown) => { + ipcMain.on(FLOATING_BUTTON_EVENTS.DRAG_MOVE, (event, payload: unknown) => { + if (!this.isWidgetSender(event)) return if (!isPointPayload(payload)) { return } @@ -382,7 +382,8 @@ export class FloatingButtonPresenter { }) }) - ipcMain.on(FLOATING_BUTTON_EVENTS.DRAG_END, () => { + ipcMain.on(FLOATING_BUTTON_EVENTS.DRAG_END, (event) => { + if (!this.isWidgetSender(event)) return if (!dragState || !this.floatingWindow?.exists()) { this.isDragging = false dragState = null @@ -418,6 +419,15 @@ export class FloatingButtonPresenter { }) } + private isWidgetSender(event: Electron.IpcMainEvent): boolean { + const window = this.floatingWindow?.getWindow() + if (!window || window.isDestroyed()) return false + return ( + event.sender.id === window.webContents.id && + event.senderFrame === window.webContents.mainFrame + ) + } + private setExpanded(expanded: boolean): void { if (this.snapshot.expanded === expanded) { return @@ -571,11 +581,15 @@ export class FloatingButtonPresenter { private persistFloatingBounds(snapped: WidgetRect & { dockSide: FloatingWidgetDockSide }): void { try { - this.settings.setFloatingButtonBounds({ - x: snapped.x, - y: snapped.y, - dockSide: snapped.dockSide - }) + void this.settings + .setFloatingButtonBounds({ + x: snapped.x, + y: snapped.y, + dockSide: snapped.dockSide + }) + .catch((error) => { + console.error('Failed to persist floating button bounds:', error) + }) } catch (error) { console.error('Failed to persist floating button bounds:', error) } @@ -631,7 +645,7 @@ export class FloatingButtonPresenter { } private async resolveTheme(): Promise<'dark' | 'light'> { - const isDark = this.settings.getCurrentThemeIsDark() + const isDark = await this.settings.getCurrentThemeIsDark() return isDark ? 'dark' : 'light' } diff --git a/src/main/desktop/fontSettings.ts b/src/main/desktop/fontSettings.ts index 1b8bb0da16..d11421f52b 100644 --- a/src/main/desktop/fontSettings.ts +++ b/src/main/desktop/fontSettings.ts @@ -1,4 +1,3 @@ -import fontList from 'font-list' import type { SettingsStore } from '@/config/settingsStore' import type { DeepchatEventPublisher } from '@shared/contracts/events' @@ -25,7 +24,8 @@ export class FontSettings { constructor( private readonly settings: SettingsStore, - private readonly publishEvent: DeepchatEventPublisher + private readonly publishEvent: DeepchatEventPublisher, + private readonly enumerateFonts: () => Promise ) {} getFontFamily(): string { @@ -48,7 +48,7 @@ export class FontSettings { if (this.systemFontsCache) return this.systemFontsCache try { - const detected = await fontList.getFonts() + const detected = await this.enumerateFonts() const seen = new Set() this.systemFontsCache = detected.flatMap((font) => { const name = normalizeFontNameValue(font) @@ -58,7 +58,7 @@ export class FontSettings { return [name] }) } catch (error) { - console.warn('Failed to detect system fonts with font-list:', error) + console.warn('Failed to detect system fonts:', error) this.systemFontsCache = [] } return this.systemFontsCache diff --git a/src/main/desktop/imageActions.ts b/src/main/desktop/imageActions.ts new file mode 100644 index 0000000000..7e71f698b5 --- /dev/null +++ b/src/main/desktop/imageActions.ts @@ -0,0 +1,259 @@ +import { clipboard, dialog, nativeImage, net } from 'electron' +import fs from 'node:fs/promises' +import path from 'node:path' + +type SaveImageInput = { + source: string + mimeType?: string + suggestedName?: string +} + +type ResolvedImageData = { + data: Buffer + mimeType: string +} + +const IMAGE_SAVE_EXTENSIONS = ['png', 'jpg', 'jpeg', 'webp', 'gif', 'bmp', 'svg', 'avif', 'ico'] +const INVALID_FILE_NAME_CHARS = new Set(['<', '>', ':', '"', '/', '\\', '|', '?', '*']) + +function normalizeImageMimeType(mimeType?: string): string | null { + const normalized = mimeType?.split(';')[0]?.trim().toLowerCase() + if (!normalized?.startsWith('image/')) { + return null + } + return normalized +} + +function getImageExtensionFromMimeType(mimeType?: string): string { + const normalized = normalizeImageMimeType(mimeType) + if (!normalized) { + return 'png' + } + + switch (normalized) { + case 'image/jpeg': + case 'image/jpg': + return 'jpg' + case 'image/svg+xml': + return 'svg' + case 'image/x-icon': + case 'image/vnd.microsoft.icon': + return 'ico' + default: + return normalized.replace('image/', '').replace(/[^a-z0-9]/g, '') || 'png' + } +} + +function inferImageMimeTypeFromPath(filePath: string): string | null { + const extension = path.extname(filePath).toLowerCase() + switch (extension) { + case '.png': + return 'image/png' + case '.jpg': + case '.jpeg': + return 'image/jpeg' + case '.gif': + return 'image/gif' + case '.webp': + return 'image/webp' + case '.bmp': + return 'image/bmp' + case '.svg': + return 'image/svg+xml' + case '.avif': + return 'image/avif' + case '.ico': + return 'image/x-icon' + default: + return null + } +} + +function sanitizeFileName(fileName?: string): string | null { + const sanitized = fileName + ?.split('') + .map((char) => (INVALID_FILE_NAME_CHARS.has(char) || char.charCodeAt(0) < 32 ? '_' : char)) + .join('') + .replace(/\s+/g, ' ') + .replace(/[. ]+$/g, '') + .trim() + + return sanitized || null +} + +function formatImageTimestamp(date: Date): string { + const pad = (value: number) => value.toString().padStart(2, '0') + return `${date.getFullYear()}${pad(date.getMonth() + 1)}${pad(date.getDate())}-${pad( + date.getHours() + )}${pad(date.getMinutes())}${pad(date.getSeconds())}` +} + +function buildDefaultImageName(mimeType: string, suggestedName?: string): string { + const extension = getImageExtensionFromMimeType(mimeType) + const sanitizedName = sanitizeFileName(suggestedName) + if (sanitizedName) { + return path.extname(sanitizedName) ? sanitizedName : `${sanitizedName}.${extension}` + } + + return `deepchat-image-${formatImageTimestamp(new Date())}.${extension}` +} + +export class DesktopImageActions { + constructor(private readonly userDataPath: string) { + if (!path.isAbsolute(userDataPath)) throw new Error('Image profile directory must be absolute') + } + + async saveImage(file: SaveImageInput): Promise<{ canceled: boolean; path?: string }> { + const image = await this.resolveImageData(file) + const defaultPath = buildDefaultImageName(image.mimeType, file.suggestedName) + + const preferredExtension = getImageExtensionFromMimeType(image.mimeType) + const extensions = Array.from(new Set([preferredExtension, ...IMAGE_SAVE_EXTENSIONS])) + const { canceled, filePath } = await dialog.showSaveDialog({ + defaultPath, + filters: [ + { name: 'Images', extensions }, + { name: 'All Files', extensions: ['*'] } + ] + }) + + if (canceled || !filePath) { + return { canceled: true } + } + + await fs.writeFile(filePath, image.data) + return { canceled: false, path: filePath } + } + + async copyImage(file: SaveImageInput): Promise<{ copied: boolean }> { + const image = await this.resolveImageData(file) + const clipboardImage = this.createClipboardImage(image) + clipboard.writeImage(clipboardImage) + return { copied: true } + } + + private async resolveImageData(file: SaveImageInput): Promise { + const source = file.source.trim() + if (source.startsWith('data:image/')) { + return this.resolveDataUrlImage(source) + } + + if (source.startsWith('imgcache://')) { + return this.resolveCachedImage(source) + } + + if (source.startsWith('http://') || source.startsWith('https://')) { + return this.resolveRemoteImage(source, file.mimeType) + } + + return this.resolveRawBase64Image(source, file.mimeType) + } + + private resolveDataUrlImage(source: string): ResolvedImageData { + const match = source.match(/^data:(image\/[a-zA-Z0-9.+-]+);base64,(.*)$/s) + const mimeType = normalizeImageMimeType(match?.[1]) + const base64Data = match?.[2]?.replace(/\s/g, '') + + if (!mimeType || !base64Data) { + throw new Error('Invalid image data URL') + } + + const data = Buffer.from(base64Data, 'base64') + if (data.length === 0) { + throw new Error('Invalid image data URL') + } + + return { data, mimeType } + } + + private async resolveCachedImage(source: string): Promise { + const cacheDir = path.join(this.userDataPath, 'images') + const rawCachePath = source.slice('imgcache://'.length) + const cachePath = this.safeDecodePath(rawCachePath) + const fullPath = path.resolve(cacheDir, cachePath) + const relativePath = path.relative(cacheDir, fullPath) + + if (!relativePath || relativePath.startsWith('..') || path.isAbsolute(relativePath)) { + throw new Error('Invalid cached image path') + } + + const mimeType = inferImageMimeTypeFromPath(fullPath) + if (!mimeType) { + throw new Error('Invalid cached image type') + } + + return { + data: await fs.readFile(fullPath), + mimeType + } + } + + private async resolveRemoteImage( + source: string, + fallbackMimeType?: string + ): Promise { + const url = new URL(source) + if (url.protocol !== 'http:' && url.protocol !== 'https:') { + throw new Error('Unsupported image URL') + } + + const response = await net.fetch(url.toString()) + if (!response.ok) { + throw new Error(`Failed to download image: ${response.status}`) + } + + const responseMimeType = normalizeImageMimeType( + response.headers.get('content-type') ?? undefined + ) + const mimeType = + responseMimeType || + normalizeImageMimeType(fallbackMimeType) || + inferImageMimeTypeFromPath(url.pathname) + + if (!mimeType) { + throw new Error('Remote URL is not an image') + } + + return { + data: Buffer.from(await response.arrayBuffer()), + mimeType + } + } + + private resolveRawBase64Image(source: string, fallbackMimeType?: string): ResolvedImageData { + const mimeType = normalizeImageMimeType(fallbackMimeType) + if (!mimeType) { + throw new Error('Raw image data requires an image MIME type') + } + + const data = Buffer.from(source.replace(/\s/g, ''), 'base64') + if (data.length === 0) { + throw new Error('Invalid raw image data') + } + + return { data, mimeType } + } + + private createClipboardImage(image: ResolvedImageData): Electron.NativeImage { + const imageFromBuffer = nativeImage.createFromBuffer(image.data) + if (!imageFromBuffer.isEmpty()) { + return imageFromBuffer + } + + const dataUrl = `data:${image.mimeType};base64,${image.data.toString('base64')}` + const imageFromDataUrl = nativeImage.createFromDataURL(dataUrl) + if (!imageFromDataUrl.isEmpty()) { + return imageFromDataUrl + } + + throw new Error('Image data cannot be copied to clipboard') + } + + private safeDecodePath(filePath: string): string { + try { + return decodeURIComponent(filePath) + } catch { + return filePath + } + } +} diff --git a/src/main/desktop/notification.ts b/src/main/desktop/notification.ts index 9616d51f6e..fddd5eb65d 100644 --- a/src/main/desktop/notification.ts +++ b/src/main/desktop/notification.ts @@ -1,7 +1,7 @@ import { BrowserWindow, nativeImage, Notification, NotificationConstructorOptions } from 'electron' import icon from '../../../resources/icon.png?asset' import type { DeepchatEventPublisher } from '@shared/contracts/events' -import type { DesktopSettings } from './settings' +import type { DesktopConfigurationProjection } from './configurationProjection' const notificationMessages = import.meta.glob<{ generationComplete: string }>( '../../renderer/src/i18n/*/chat.json', @@ -12,7 +12,10 @@ export class NotificationService { private notifications = new Map() constructor( - private readonly settings: Pick, + private readonly settings: Pick< + DesktopConfigurationProjection, + 'getNotificationsEnabled' | 'getLanguage' + >, private readonly publishEvent: DeepchatEventPublisher ) {} diff --git a/src/main/desktop/pluginSettingsWindow.ts b/src/main/desktop/pluginSettingsWindow.ts index fd2c045d6c..98fb04af85 100644 --- a/src/main/desktop/pluginSettingsWindow.ts +++ b/src/main/desktop/pluginSettingsWindow.ts @@ -4,15 +4,33 @@ import { pathToFileURL } from 'node:url' import type { PluginSettingsWindowPort } from '@/plugin' export class PluginSettingsWindow implements PluginSettingsWindowPort { - private readonly windows = new Map() + private readonly windows = new Map< + string, + { + window: BrowserWindow + webContentsId: number + closing: boolean + closed: Promise + loading: Promise + finishClose: () => void + } + >() private readonly pluginIdByWebContentsId = new Map() + private accepting = true async open(input: { pluginId: string; title: string; entry: string }): Promise { + if (!this.accepting) throw new Error('Plugin settings windows are closed') const existing = this.windows.get(input.pluginId) - if (existing && !existing.isDestroyed()) { - existing.show() - existing.focus() - return + if (existing) { + if (existing.closing) { + await existing.closed + return this.open(input) + } + if (!existing.window.isDestroyed()) { + existing.window.show() + existing.window.focus() + return existing.loading + } } const settingsWindow = new BrowserWindow({ @@ -32,7 +50,19 @@ export class PluginSettingsWindow implements PluginSettingsWindowPort { const webContentsId = settingsWindow.webContents.id const entryPath = pathToFileURL(input.entry).pathname - this.windows.set(input.pluginId, settingsWindow) + let finishClose!: () => void + const closed = new Promise((resolve) => { + finishClose = resolve + }) + const record = { + window: settingsWindow, + webContentsId, + closing: false, + closed, + loading: Promise.resolve(), + finishClose + } + this.windows.set(input.pluginId, record) this.pluginIdByWebContentsId.set(webContentsId, input.pluginId) settingsWindow.webContents.setWindowOpenHandler(() => ({ action: 'deny' })) settingsWindow.webContents.on('will-navigate', (event, url) => { @@ -42,39 +72,60 @@ export class PluginSettingsWindow implements PluginSettingsWindowPort { } }) settingsWindow.on('ready-to-show', () => { - if (!settingsWindow.isDestroyed()) { + if (!record.closing && !settingsWindow.isDestroyed()) { settingsWindow.show() } }) + settingsWindow.on('close', () => { + record.closing = true + }) settingsWindow.on('closed', () => { this.pluginIdByWebContentsId.delete(webContentsId) - if (this.windows.get(input.pluginId) === settingsWindow) { + if (this.windows.get(input.pluginId) === record) { this.windows.delete(input.pluginId) } + finishClose() }) + settingsWindow.webContents.on('will-prevent-unload', (event) => event.preventDefault()) - await settingsWindow.loadFile(input.entry, { - query: { - pluginId: input.pluginId + record.loading = (async () => { + try { + await settingsWindow.loadFile(input.entry, { + query: { pluginId: input.pluginId } + }) + } catch (error) { + if (record.closing || settingsWindow.isDestroyed()) { + await closed + return + } + await this.close(input.pluginId) + throw error } - }) + })() + await record.loading } getPluginIdForWebContents(webContentsId: number): string | null { return this.pluginIdByWebContentsId.get(webContentsId) ?? null } - close(pluginId: string): void { - const settingsWindow = this.windows.get(pluginId) - if (settingsWindow && !settingsWindow.isDestroyed()) { - settingsWindow.close() + async close(pluginId: string): Promise { + const record = this.windows.get(pluginId) + if (!record) return + if (!record.closing) { + record.closing = true + if (!record.window.isDestroyed()) record.window.destroy() + else { + this.pluginIdByWebContentsId.delete(record.webContentsId) + this.windows.delete(pluginId) + record.finishClose() + } } - this.windows.delete(pluginId) + await record.closed } - closeAll(): void { - for (const pluginId of Array.from(this.windows.keys())) { - this.close(pluginId) - } + async closeAll(): Promise { + this.accepting = false + await Promise.all(Array.from(this.windows.keys(), (pluginId) => this.close(pluginId))) } } diff --git a/src/main/desktop/remoteAuthWindows.ts b/src/main/desktop/remoteAuthWindows.ts new file mode 100644 index 0000000000..e37cef0bfd --- /dev/null +++ b/src/main/desktop/remoteAuthWindows.ts @@ -0,0 +1,113 @@ +import { BrowserWindow } from 'electron' +import { resolveFeishuAuthDomains } from '@/remote/channels/feishu/feishuAuth' +import type { + RemoteAuthWindowEvent, + RemoteAuthWindowInput, + RemoteAuthWindowPort +} from '@/remote/ports' + +export class DesktopRemoteAuthWindows implements RemoteAuthWindowPort { + private readonly windows = new Map< + string, + { window: BrowserWindow; url: string; closed: Promise; closing: boolean } + >() + + constructor(private readonly publish: (event: RemoteAuthWindowEvent) => void) {} + + async open(input: RemoteAuthWindowInput): Promise { + if (input.kind === 'feishu' && !this.isAllowedFeishuNavigation(input.url, input)) + throw new Error('Invalid Feishu authorization URL') + const existing = this.windows.get(input.id) + if (existing) { + if (existing.url !== input.url) throw new Error('Auth window identity is already in use') + existing.window.show() + existing.window.focus() + return + } + const parent = BrowserWindow.getFocusedWindow() ?? BrowserWindow.getAllWindows()[0] + const window = new BrowserWindow({ + width: input.kind === 'feishu' ? 480 : 420, + height: 760, + minWidth: input.kind === 'feishu' ? 420 : 380, + minHeight: 680, + autoHideMenuBar: true, + title: input.kind === 'feishu' ? 'Feishu / Lark Authorization' : 'WeChat iLink Login', + ...(parent ? { parent } : {}), + webPreferences: { nodeIntegration: false, contextIsolation: true, webSecurity: true } + }) + const closed = Promise.withResolvers() + const entry = { window, url: input.url, closed: closed.promise, closing: false } + this.windows.set(input.id, entry) + window.on('close', () => { + entry.closing = true + }) + window.webContents.on('will-prevent-unload', (event) => event.preventDefault()) + const allowed = (url: string) => + input.kind === 'weixin-ilink' || this.isAllowedFeishuNavigation(url, input) + if (input.kind === 'feishu') { + window.webContents.on('will-navigate', (event, url) => { + if (!allowed(url)) event.preventDefault() + }) + } + const navigate = (url: string) => { + void window.loadURL(url).catch(() => { + // Closing a loading window can reject navigation before the native closed event. + if (entry.closing || window.isDestroyed()) return + if (this.windows.get(input.id) === entry) this.publish({ id: input.id, type: 'error' }) + }) + } + window.webContents.setWindowOpenHandler(({ url }) => { + if (allowed(url)) navigate(url) + return { action: 'deny' } + }) + window.once('closed', () => { + closed.resolve() + if (this.windows.get(input.id) !== entry) return + this.windows.delete(input.id) + this.publish({ id: input.id, type: 'closed' }) + }) + try { + navigate(input.url) + window.show() + window.focus() + } catch (error) { + await this.close(input.id) + throw error + } + } + + async close(id: string): Promise { + const entry = this.windows.get(id) + if (!entry) return + entry.closing = true + // An auth page must not retain an owned window with a beforeunload handler after cancellation. + if (!entry.window.isDestroyed()) entry.window.destroy() + await entry.closed + } + + async closeAll(): Promise { + await Promise.all(Array.from(this.windows.keys(), (id) => this.close(id))) + } + + private isAllowedFeishuNavigation( + url: string, + input: Extract + ): boolean { + try { + const parsed = new URL(url) + const redirect = new URL(input.redirectUri) + const domains = resolveFeishuAuthDomains(input.brand) + return ( + (parsed.protocol === 'https:' && + [domains.accountsBaseUrl, domains.openBaseUrl].some( + (base) => parsed.host === new URL(base).host + )) || + (parsed.protocol === redirect.protocol && + parsed.host === redirect.host && + parsed.pathname === redirect.pathname) + ) + } catch { + return false + } + } +} diff --git a/src/main/desktop/routes.ts b/src/main/desktop/routes.ts index 70c69ec56b..5f376d88a8 100644 --- a/src/main/desktop/routes.ts +++ b/src/main/desktop/routes.ts @@ -9,8 +9,7 @@ import type { IYoBrowserPresenter } from '@shared/types/desktop' import type { DialogServicePort } from '@shared/types/dialog' -import { getLocaleDirection } from '@shared/locales' -import type { DesktopSettings } from './settings' +import type { AppSettingsService } from '@/app/settingsService' import { browserAttachCurrentWindowRoute, browserFocusContentRoute, @@ -81,8 +80,15 @@ export function createDesktopRoutes(deps: { desktopSessionBinding: Pick tabPresenter: ITabPresenter dialogService: DialogServicePort - settings: DesktopSettings - setFloatingButtonEnabled(enabled: boolean): void + settings: Pick< + AppSettingsService, + | 'getFloatingButtonEnabled' + | 'setFloatingButtonEnabled' + | 'getShortcutKeys' + | 'setShortcutKeys' + | 'resetShortcutKeys' + > + appearance: Pick recordActivity(input: SettingsActivityInput): void }): DeepchatRouteMap { const { @@ -107,48 +113,36 @@ export function createDesktopRoutes(deps: { } const readBrowserStatus = async (sessionId: string) => await browserPresenter.getBrowserStatus(sessionId) - const readLanguage = () => { - const locale = deps.settings.getLanguage() - return { - requestedLanguage: deps.settings.getRequestedLanguage(), - locale, - direction: getLocaleDirection(locale) - } - } - const readTheme = () => ({ - theme: deps.settings.getTheme(), - isDark: deps.settings.getCurrentThemeIsDark() - }) return createRouteMap([ [ configGetLanguageRoute.name, async (rawInput) => { configGetLanguageRoute.input.parse(rawInput) - return configGetLanguageRoute.output.parse(readLanguage()) + return configGetLanguageRoute.output.parse(await deps.appearance.getLanguage()) } ], [ configSetLanguageRoute.name, async (rawInput) => { const input = configSetLanguageRoute.input.parse(rawInput) - deps.settings.setLanguage(input.language) - return configSetLanguageRoute.output.parse(readLanguage()) + return configSetLanguageRoute.output.parse( + await deps.appearance.setLanguage(input.language) + ) } ], [ configGetThemeRoute.name, async (rawInput) => { configGetThemeRoute.input.parse(rawInput) - return configGetThemeRoute.output.parse(readTheme()) + return configGetThemeRoute.output.parse(await deps.appearance.getTheme()) } ], [ configSetThemeRoute.name, async (rawInput) => { const input = configSetThemeRoute.input.parse(rawInput) - deps.settings.setTheme(input.theme) - return configSetThemeRoute.output.parse(readTheme()) + return configSetThemeRoute.output.parse(await deps.appearance.setTheme(input.theme)) } ], [ @@ -156,7 +150,7 @@ export function createDesktopRoutes(deps: { async (rawInput) => { configGetFloatingButtonRoute.input.parse(rawInput) return configGetFloatingButtonRoute.output.parse({ - enabled: deps.settings.getFloatingButtonEnabled() + enabled: await deps.settings.getFloatingButtonEnabled() }) } ], @@ -164,10 +158,8 @@ export function createDesktopRoutes(deps: { configSetFloatingButtonRoute.name, async (rawInput) => { const input = configSetFloatingButtonRoute.input.parse(rawInput) - deps.settings.setFloatingButtonEnabled(input.enabled) - deps.setFloatingButtonEnabled(input.enabled) return configSetFloatingButtonRoute.output.parse({ - enabled: deps.settings.getFloatingButtonEnabled() + enabled: await deps.settings.setFloatingButtonEnabled(input.enabled) }) } ], @@ -176,7 +168,7 @@ export function createDesktopRoutes(deps: { async (rawInput) => { configGetShortcutKeysRoute.input.parse(rawInput) return configGetShortcutKeysRoute.output.parse({ - shortcuts: deps.settings.getShortcutKeys() + shortcuts: await deps.settings.getShortcutKeys() }) } ], @@ -184,9 +176,8 @@ export function createDesktopRoutes(deps: { configSetShortcutKeysRoute.name, async (rawInput) => { const input = configSetShortcutKeysRoute.input.parse(rawInput) - deps.settings.setShortcutKeys(input.shortcuts) return configSetShortcutKeysRoute.output.parse({ - shortcuts: deps.settings.getShortcutKeys() + shortcuts: await deps.settings.setShortcutKeys(input.shortcuts) }) } ], @@ -194,7 +185,7 @@ export function createDesktopRoutes(deps: { configResetShortcutKeysRoute.name, async (rawInput) => { configResetShortcutKeysRoute.input.parse(rawInput) - deps.settings.resetShortcutKeys() + const shortcuts = await deps.settings.resetShortcutKeys() deps.recordActivity({ category: 'shortcut', action: 'reset', @@ -205,7 +196,7 @@ export function createDesktopRoutes(deps: { summaryParams: { key: 'shortcuts' } }) return configResetShortcutKeysRoute.output.parse({ - shortcuts: deps.settings.getShortcutKeys() + shortcuts }) } ], diff --git a/src/main/desktop/settings.ts b/src/main/desktop/settings.ts index 832d817bd4..ae0a74c343 100644 --- a/src/main/desktop/settings.ts +++ b/src/main/desktop/settings.ts @@ -2,7 +2,6 @@ import type { SettingsStore } from '@/config/settingsStore' import type { DeepchatEventPublisher } from '@shared/contracts/events' import type { ShortcutKeySetting } from '@shared/types/desktop' import { defaultShortcutKey } from './shortcutKeySettings' -import { app, nativeTheme } from 'electron' import type { FloatingButtonBounds } from '@shared/types/floating-widget' import { getLocaleDirection, @@ -12,14 +11,24 @@ import { type SupportedLocale } from '@shared/locales' +export interface DesktopSettingsHost { + readonly systemLocale: string + readTheme(): Promise<{ theme: 'dark' | 'light' | 'system'; isDark: boolean }> + applyTheme(theme: 'dark' | 'light' | 'system'): Promise + refreshLanguage(locale: SupportedLocale): Promise + refreshTheme(isDark: boolean): Promise + readLaunchAtLogin(): Promise + setLaunchAtLogin(enabled: boolean): Promise + applyContentProtection(enabled: boolean): Promise + applyFloatingButtonEnabled(enabled: boolean): Promise +} + export class DesktopSettings { constructor( private readonly settings: SettingsStore, - private readonly effects: { - refreshLanguage(): void - refreshTheme(): Promise - }, - private readonly publishEvent: DeepchatEventPublisher + private readonly host: DesktopSettingsHost, + private readonly publishEvent: DeepchatEventPublisher, + private readonly committed: () => void ) {} getRequestedLanguage(): RequestedLocale { @@ -28,52 +37,57 @@ export class DesktopSettings { getLanguage(): SupportedLocale { const language = this.getRequestedLanguage() - return resolveSupportedLocale(language === 'system' ? app.getLocale() : language) + return resolveSupportedLocale(language === 'system' ? this.host.systemLocale : language) } - setLanguage(language: string): void { + async setLanguage(language: string): Promise { const requestedLanguage = resolveRequestedLocale(language) this.settings.set('language', requestedLanguage) + this.committed() const locale = this.getLanguage() + await this.host.refreshLanguage(locale) this.publishEvent('config.language.changed', { requestedLanguage, locale, direction: getLocaleDirection(locale), version: Date.now() }) - this.effects.refreshLanguage() - } - - initializeTheme(): void { - nativeTheme.themeSource = this.getTheme() - nativeTheme.on('updated', () => { - if (nativeTheme.themeSource !== 'system') return - this.publishEvent('config.systemTheme.changed', { - isDark: nativeTheme.shouldUseDarkColors, - version: Date.now() - }) - void this.effects.refreshTheme() + } + + async initialize(): Promise { + await this.host.applyTheme(this.getTheme()) + await this.host.refreshLanguage(this.getLanguage()) + } + + async observeSystemTheme(): Promise { + const observed = await this.host.readTheme() + if (this.getTheme() !== 'system' || observed.theme !== 'system') return + await this.host.refreshTheme(observed.isDark) + this.publishEvent('config.systemTheme.changed', { + isDark: observed.isDark, + version: Date.now() }) } - setTheme(theme: 'dark' | 'light' | 'system'): boolean { - nativeTheme.themeSource = theme + async setTheme(theme: 'dark' | 'light' | 'system'): Promise { + const isDark = await this.host.applyTheme(theme) this.settings.set('appTheme', theme) + this.committed() + await this.host.refreshTheme(isDark) this.publishEvent('config.theme.changed', { theme, - isDark: nativeTheme.shouldUseDarkColors, + isDark, version: Date.now() }) - void this.effects.refreshTheme() - return nativeTheme.shouldUseDarkColors + return isDark } getTheme(): 'dark' | 'light' | 'system' { return this.settings.get<'dark' | 'light' | 'system'>('appTheme') || 'system' } - getCurrentThemeIsDark(): boolean { - return nativeTheme.shouldUseDarkColors + async getCurrentThemeIsDark(): Promise { + return (await this.host.readTheme()).isDark } getNotificationsEnabled(): boolean { @@ -102,6 +116,7 @@ export class DesktopSettings { setAutoScrollEnabled(enabled: boolean): void { this.settings.set('autoScrollEnabled', Boolean(enabled)) + this.committed() this.publishEvent('settings.changed', { changedKeys: ['autoScrollEnabled'], version: Date.now(), @@ -112,6 +127,7 @@ export class DesktopSettings { setNotificationsEnabled(enabled: boolean): void { const value = Boolean(enabled) this.settings.set('notificationsEnabled', value) + this.committed() this.publishEvent('settings.changed', { changedKeys: ['notificationsEnabled'], version: Date.now(), @@ -119,16 +135,16 @@ export class DesktopSettings { }) } - getLaunchAtLoginEnabled(): boolean { - return app.getLoginItemSettings().openAtLogin + async getLaunchAtLoginEnabled(): Promise { + return await this.host.readLaunchAtLogin() } - setLaunchAtLoginEnabled(enabled: boolean): void { - app.setLoginItemSettings({ openAtLogin: Boolean(enabled) }) + async setLaunchAtLoginEnabled(enabled: boolean): Promise { + const observed = await this.host.setLaunchAtLogin(Boolean(enabled)) this.publishEvent('settings.changed', { changedKeys: ['launchAtLoginEnabled'], version: Date.now(), - values: { launchAtLoginEnabled: this.getLaunchAtLoginEnabled() } + values: { launchAtLoginEnabled: observed } }) } @@ -140,9 +156,11 @@ export class DesktopSettings { return this.settings.get('contentProtectionEnabled') ?? false } - setContentProtectionEnabled(enabled: boolean): void { + async setContentProtectionEnabled(enabled: boolean): Promise { const value = Boolean(enabled) this.settings.set('contentProtectionEnabled', value) + this.committed() + await this.host.applyContentProtection(value) this.publishEvent('settings.changed', { changedKeys: ['contentProtectionEnabled'], version: Date.now(), @@ -154,9 +172,11 @@ export class DesktopSettings { return this.settings.get('floatingButtonEnabled') ?? false } - setFloatingButtonEnabled(enabled: boolean): void { + async setFloatingButtonEnabled(enabled: boolean): Promise { const value = Boolean(enabled) this.settings.set('floatingButtonEnabled', value) + this.committed() + await this.host.applyFloatingButtonEnabled(value) this.publishEvent('config.floatingButton.changed', { enabled: value, version: Date.now() @@ -178,6 +198,7 @@ export class DesktopSettings { setFloatingButtonBounds(bounds: FloatingButtonBounds): void { this.settings.set('floatingButtonBounds', bounds) + this.committed() } getShortcutKeys(): ShortcutKeySetting { @@ -189,11 +210,13 @@ export class DesktopSettings { setShortcutKeys(shortcuts: ShortcutKeySetting): void { this.settings.set('shortcutKey', shortcuts) + this.committed() this.publishShortcutKeysChanged() } resetShortcutKeys(): void { this.settings.set('shortcutKey', { ...defaultShortcutKey }) + this.committed() this.publishShortcutKeysChanged() } @@ -206,6 +229,7 @@ export class DesktopSettings { private setSetting(key: 'fontSizeLevel' | 'copyWithCotEnabled', value: number | boolean): void { this.settings.set(key, value) + this.committed() this.publishEvent('settings.changed', { changedKeys: [key], version: Date.now(), diff --git a/src/main/desktop/shortcut.ts b/src/main/desktop/shortcut.ts index 2a89d83393..ecd9041add 100644 --- a/src/main/desktop/shortcut.ts +++ b/src/main/desktop/shortcut.ts @@ -8,13 +8,13 @@ import type { IWindowPresenter, ShortcutKeySetting } from '@shared/types/desktop' -import type { DesktopSettings } from './settings' +import type { DesktopConfigurationProjection } from './configurationProjection' import { getContextMenuLabels, type TranslationMap } from '@shared/i18n' import { is } from '@electron-toolkit/utils' import type { DeepchatEventPublisher } from '@shared/contracts/events' export class ShortcutPresenter implements IShortcutPresenter { - private settings: Pick + private settings: Pick private windowPresenter: IWindowPresenter private shortcutKeys: ShortcutKeySetting = { ...defaultShortcutKey @@ -25,7 +25,7 @@ export class ShortcutPresenter implements IShortcutPresenter { * @param shortKey 可选的自定义快捷键设置 */ constructor( - settings: Pick, + settings: Pick, windowPresenter: IWindowPresenter, private readonly publishEvent: DeepchatEventPublisher ) { diff --git a/src/main/desktop/tab.ts b/src/main/desktop/tab.ts index da03822101..5033c4c94b 100644 --- a/src/main/desktop/tab.ts +++ b/src/main/desktop/tab.ts @@ -50,6 +50,7 @@ export class TabPresenter implements ITabPresenter { private windowTypes: Map = new Map() private chromeHeights: Map = new Map() + private contextMenuLocale: string | undefined private static readonly DEFAULT_CHROME_HEIGHT = 60 private static readonly DEFAULT_WINDOW_TYPE: 'chat' | 'browser' = 'chat' @@ -103,7 +104,8 @@ export class TabPresenter implements ITabPresenter { this.chromeHeights.delete(windowId) } - async refreshLanguage(): Promise { + async refreshLanguage(locale?: string): Promise { + if (locale) this.contextMenuLocale = locale for (const [tabId] of this.tabWindowMap.entries()) { await this.setupTabContextMenu(tabId) } @@ -730,7 +732,7 @@ export class TabPresenter implements ITabPresenter { this.tabContextMenuDisposers.delete(tabId) } - const lang = app.getLocale() + const lang = this.contextMenuLocale ?? app.getLocale() const labels = await getContextMenuLabels(lang) const disposer = contextMenu({ diff --git a/src/main/desktop/tray.ts b/src/main/desktop/tray.ts index 6a4c018a3f..e036bd663c 100644 --- a/src/main/desktop/tray.ts +++ b/src/main/desktop/tray.ts @@ -2,14 +2,14 @@ import { Tray, Menu, app, nativeImage, NativeImage } from 'electron' import * as path from 'path' import { getContextMenuLabels } from '@shared/i18n' import type { IWindowPresenter } from '@shared/types/desktop' -import type { DesktopSettings } from './settings' +import type { DesktopConfigurationProjection } from './configurationProjection' export class TrayPresenter { private tray: Tray | null = null private iconPath: string constructor( - private readonly settings: Pick, + private readonly settings: Pick, private readonly windowPresenter: IWindowPresenter ) { this.iconPath = path.join(app.getAppPath(), 'resources') diff --git a/src/main/desktop/window/index.ts b/src/main/desktop/window/index.ts index 8dd0ea4fef..1b7ade5cf8 100644 --- a/src/main/desktop/window/index.ts +++ b/src/main/desktop/window/index.ts @@ -14,7 +14,7 @@ import icon from '../../../../resources/icon.png?asset' // App icon (macOS/Linux import iconWin from '../../../../resources/icon.ico?asset' // App icon (Windows) import { is } from '@electron-toolkit/utils' // Electron utilities import type { IWindowPresenter } from '@shared/types/desktop' -import type { DesktopSettings } from '../settings' +import type { DesktopConfigurationProjection } from '../configurationProjection' import { resolveSettingsNavigationPath, type SettingsNavigationPayload @@ -43,7 +43,10 @@ type PendingSettingsMessage = { export class WindowPresenter implements IWindowPresenter { // Map managing all BrowserWindow instances, key is window ID windows: Map - private settings: Pick + private settings: Pick< + DesktopConfigurationProjection, + 'getCloseToQuit' | 'getContentProtectionEnabled' + > // Exit flag indicating if app is in the process of quitting (set by 'before-quit' hook) private isQuitting: boolean = false // Current focused window ID (internal record) @@ -58,7 +61,6 @@ export class WindowPresenter implements IWindowPresenter { private pendingSettingsMessages: PendingSettingsMessage[] = [] private pendingSettingsProviderInstalls: ProviderInstallPreview[] = [] private readonly startupWorkloadCoordinator?: StartupWorkloadCoordinator - private readonly restartApp: () => void private tabPresenter!: TabPresenter // Serializes async tab lookups/deliveries per window so consecutive broadcasts // cannot reorder against each other when a delayed `getTab` resolves out of turn. @@ -82,23 +84,23 @@ export class WindowPresenter implements IWindowPresenter { } constructor( - settings: Pick, - restartApp: () => void, + settings: Pick< + DesktopConfigurationProjection, + 'getCloseToQuit' | 'getContentProtectionEnabled' + >, private readonly onWindowCreated: (isMainWindow: boolean) => void, startupWorkloadCoordinator?: StartupWorkloadCoordinator ) { this.windows = new Map() this.settings = settings - this.restartApp = restartApp this.startupWorkloadCoordinator = startupWorkloadCoordinator } applyContentProtection(enabled: boolean): void { - logger.info(`Content protection setting changed to ${enabled}, restarting application.`) + logger.info(`Content protection setting changed to ${enabled}.`) this.windows.forEach((window) => { if (!window.isDestroyed()) this.updateContentProtection(window, enabled) }) - setTimeout(() => this.restartApp(), 1000) } bindTabPresenter(tabPresenter: TabPresenter): void { diff --git a/src/main/device/index.ts b/src/main/device/index.ts index c5058f954a..69cea36bb4 100644 --- a/src/main/device/index.ts +++ b/src/main/device/index.ts @@ -11,14 +11,6 @@ import { cacheImage, type CacheImageOptions } from '@/platform/imageCache' const execAsync = promisify(exec) export class DeviceService implements DeviceServicePort { - static getDefaultHeaders(): Record { - const version = app.getVersion() - return { - 'HTTP-Referer': 'https://deepchatai.cn', - 'X-Title': 'DeepChat', - 'User-Agent': `DeepChat/${version}` - } - } async getAppVersion(): Promise { return app.getVersion() } diff --git a/src/main/exporter/agentSessionExporter.ts b/src/main/exporter/agentSessionExporter.ts index 6fce83f981..4487d576c3 100644 --- a/src/main/exporter/agentSessionExporter.ts +++ b/src/main/exporter/agentSessionExporter.ts @@ -40,7 +40,7 @@ export class AgentSessionExportService { ) {} async submitToNowledgeMem(input: NowledgeExportInput): Promise<{ threadId: string }> { - const connection = this.dependencies.nowledgeMemConnections?.getExportConfig() + const connection = await this.dependencies.nowledgeMemConnections?.getExportConfig() if (!connection || connection.baseUrl !== input.apiBaseUrl) { throw new Error('The Nowledge export destination changed; confirm it again') } diff --git a/src/main/exporter/index.ts b/src/main/exporter/index.ts index f72feb6283..f10cba1633 100644 --- a/src/main/exporter/index.ts +++ b/src/main/exporter/index.ts @@ -88,7 +88,7 @@ export class ConversationExporterService implements IConversationExporter { // Capture the destination before loading/serializing the conversation. let connection: NowledgeMemConfig | undefined try { - connection = this.deps.nowledgeMemConnections?.getExportConfig() + connection = await this.deps.nowledgeMemConnections?.getExportConfig() } catch (error) { return { success: false, @@ -128,7 +128,7 @@ export class ConversationExporterService implements IConversationExporter { const state = await this.deps.nowledgeMemConnections.getState() const connection = state.connection if (!connection || config) throw new Error('Verify connections in the Nowledge Mem plugin') - const resolved = this.deps.nowledgeMemConnections.getExportConfig() + const resolved = await this.deps.nowledgeMemConnections.getExportConfig() await this.deps.nowledgeMemConnections.verify( connection, resolved.apiKey ?? '', diff --git a/src/main/file/index.ts b/src/main/file/index.ts index 011816291a..ba7bdf7163 100644 --- a/src/main/file/index.ts +++ b/src/main/file/index.ts @@ -1,12 +1,11 @@ import logger from '@shared/logger' -import { app, clipboard, dialog, nativeImage, net } from 'electron' import fs from 'fs/promises' import path from 'path' import { BaseFileAdapter } from './adapters/BaseFileAdapter' import { FileAdapterConstructor } from './adapters/FileAdapterConstructor' import type { SettingsStore } from '@/config/settingsStore' -import type { FileOperation, FileServicePort } from '@shared/types/file' +import type { FileServicePort } from '@shared/types/file' import { detectMimeType, getMimeTypeAdapterMap } from './mime' import type { MessageFile } from '@shared/chat' import { estimateTokenCount } from 'tokenx' @@ -17,102 +16,6 @@ import { DirectoryAdapter } from './adapters/DirectoryAdapter' import { UnsupportFileAdapter } from './adapters/UnsupportFileAdapter' import { FileValidationService, FileValidationResult, IFileValidationService } from './validation' -type SaveImageInput = { - source: string - mimeType?: string - suggestedName?: string -} - -type ResolvedImageData = { - data: Buffer - mimeType: string -} - -const IMAGE_SAVE_EXTENSIONS = ['png', 'jpg', 'jpeg', 'webp', 'gif', 'bmp', 'svg', 'avif', 'ico'] -const INVALID_FILE_NAME_CHARS = new Set(['<', '>', ':', '"', '/', '\\', '|', '?', '*']) - -function normalizeImageMimeType(mimeType?: string): string | null { - const normalized = mimeType?.split(';')[0]?.trim().toLowerCase() - if (!normalized?.startsWith('image/')) { - return null - } - return normalized -} - -function getImageExtensionFromMimeType(mimeType?: string): string { - const normalized = normalizeImageMimeType(mimeType) - if (!normalized) { - return 'png' - } - - switch (normalized) { - case 'image/jpeg': - case 'image/jpg': - return 'jpg' - case 'image/svg+xml': - return 'svg' - case 'image/x-icon': - case 'image/vnd.microsoft.icon': - return 'ico' - default: - return normalized.replace('image/', '').replace(/[^a-z0-9]/g, '') || 'png' - } -} - -function inferImageMimeTypeFromPath(filePath: string): string | null { - const extension = path.extname(filePath).toLowerCase() - switch (extension) { - case '.png': - return 'image/png' - case '.jpg': - case '.jpeg': - return 'image/jpeg' - case '.gif': - return 'image/gif' - case '.webp': - return 'image/webp' - case '.bmp': - return 'image/bmp' - case '.svg': - return 'image/svg+xml' - case '.avif': - return 'image/avif' - case '.ico': - return 'image/x-icon' - default: - return null - } -} - -function sanitizeFileName(fileName?: string): string | null { - const sanitized = fileName - ?.split('') - .map((char) => (INVALID_FILE_NAME_CHARS.has(char) || char.charCodeAt(0) < 32 ? '_' : char)) - .join('') - .replace(/\s+/g, ' ') - .replace(/[. ]+$/g, '') - .trim() - - return sanitized || null -} - -function formatImageTimestamp(date: Date): string { - const pad = (value: number) => value.toString().padStart(2, '0') - return `${date.getFullYear()}${pad(date.getMonth() + 1)}${pad(date.getDate())}-${pad( - date.getHours() - )}${pad(date.getMinutes())}${pad(date.getSeconds())}` -} - -function buildDefaultImageName(mimeType: string, suggestedName?: string): string { - const extension = getImageExtensionFromMimeType(mimeType) - const sanitizedName = sanitizeFileName(suggestedName) - if (sanitizedName) { - return path.extname(sanitizedName) ? sanitizedName : `${sanitizedName}.${extension}` - } - - return `deepchat-image-${formatImageTimestamp(new Date())}.${extension}` -} - export class FileService implements FileServicePort { private userDataPath: string private settings: Pick @@ -125,21 +28,15 @@ export class FileService implements FileServicePort { constructor( settings: Pick, + userDataDirectory: string, fileValidationService?: IFileValidationService ) { - this.userDataPath = app.getPath('userData') + if (!path.isAbsolute(userDataDirectory)) + throw new Error('File profile directory must be absolute') + this.userDataPath = userDataDirectory this.tempDir = path.join(this.userDataPath, 'temp') this.settings = settings this.fileValidationService = fileValidationService || new FileValidationService() - // Ensure temp directory exists - try { - const mkdirResult = fs.mkdir(this.tempDir, { recursive: true }) - if (mkdirResult && typeof mkdirResult.catch === 'function') { - mkdirResult.catch(console.error) - } - } catch (error) { - console.error('Failed to create temp directory:', error) - } } async getMimeType(filePath: string): Promise { @@ -151,18 +48,7 @@ export class FileService implements FileServicePort { return fs.readFile(fullPath, 'utf-8') } - async writeFile(operation: FileOperation): Promise { - const fullPath = path.join(this.userDataPath, operation.path) - await fs.mkdir(path.dirname(fullPath), { recursive: true }) - await fs.writeFile(fullPath, operation.content || '', 'utf-8') - } - - async deleteFile(relativePath: string): Promise { - const fullPath = path.join(this.userDataPath, relativePath) - await fs.unlink(fullPath) - } - - async createFileAdapter(filePath: string, typeInfo?: string): Promise { + private async createFileAdapter(filePath: string, typeInfo?: string): Promise { // Use the refined getMimeType method // Prioritize provided typeInfo if available const mimeType = typeInfo ?? (await this.getMimeType(filePath)) @@ -300,24 +186,6 @@ export class FileService implements FileServicePort { return UnsupportFileAdapter } - async writeTemp(file: { name: string; content: string | Buffer | ArrayBuffer }): Promise { - const ext = path.extname(file.name) - const tempName = `${nanoid()}${ext || '.tmp'}` // Add .tmp extension if original name has none - const tempPath = path.join(this.tempDir, tempName) - // Check if content is binary (Buffer or ArrayBuffer) or string - if (typeof file.content === 'string') { - await fs.writeFile(tempPath, file.content, 'utf-8') - } else if (Buffer.isBuffer(file.content)) { - // If it's already a Buffer, write it directly - await fs.writeFile(tempPath, file.content) - } else { - // Otherwise, assume it's ArrayBuffer and convert to Buffer - await fs.writeFile(tempPath, Buffer.from(file.content)) - } - - return tempPath - } - async writeImageBase64(file: { name: string; content: string }): Promise { // Check if it's base64 format image data if (!file.content.startsWith('data:image/')) { @@ -341,166 +209,12 @@ export class FileService implements FileServicePort { const tempName = `${nanoid()}${ext}` const tempPath = path.join(this.tempDir, tempName) - // Write file + await fs.mkdir(this.tempDir, { recursive: true }) await fs.writeFile(tempPath, binaryData) return tempPath } - async saveImage(file: SaveImageInput): Promise<{ canceled: boolean; path?: string }> { - const image = await this.resolveImageData(file) - const defaultPath = buildDefaultImageName(image.mimeType, file.suggestedName) - - const preferredExtension = getImageExtensionFromMimeType(image.mimeType) - const extensions = Array.from(new Set([preferredExtension, ...IMAGE_SAVE_EXTENSIONS])) - const { canceled, filePath } = await dialog.showSaveDialog({ - defaultPath, - filters: [ - { name: 'Images', extensions }, - { name: 'All Files', extensions: ['*'] } - ] - }) - - if (canceled || !filePath) { - return { canceled: true } - } - - await fs.writeFile(filePath, image.data) - return { canceled: false, path: filePath } - } - - async copyImage(file: SaveImageInput): Promise<{ copied: boolean }> { - const image = await this.resolveImageData(file) - const clipboardImage = this.createClipboardImage(image) - clipboard.writeImage(clipboardImage) - return { copied: true } - } - - private async resolveImageData(file: SaveImageInput): Promise { - const source = file.source.trim() - if (source.startsWith('data:image/')) { - return this.resolveDataUrlImage(source) - } - - if (source.startsWith('imgcache://')) { - return this.resolveCachedImage(source) - } - - if (source.startsWith('http://') || source.startsWith('https://')) { - return this.resolveRemoteImage(source, file.mimeType) - } - - return this.resolveRawBase64Image(source, file.mimeType) - } - - private resolveDataUrlImage(source: string): ResolvedImageData { - const match = source.match(/^data:(image\/[a-zA-Z0-9.+-]+);base64,(.*)$/s) - const mimeType = normalizeImageMimeType(match?.[1]) - const base64Data = match?.[2]?.replace(/\s/g, '') - - if (!mimeType || !base64Data) { - throw new Error('Invalid image data URL') - } - - const data = Buffer.from(base64Data, 'base64') - if (data.length === 0) { - throw new Error('Invalid image data URL') - } - - return { data, mimeType } - } - - private async resolveCachedImage(source: string): Promise { - const cacheDir = path.join(app.getPath('userData'), 'images') - const rawCachePath = source.slice('imgcache://'.length) - const cachePath = this.safeDecodePath(rawCachePath) - const fullPath = path.resolve(cacheDir, cachePath) - const relativePath = path.relative(cacheDir, fullPath) - - if (!relativePath || relativePath.startsWith('..') || path.isAbsolute(relativePath)) { - throw new Error('Invalid cached image path') - } - - const mimeType = inferImageMimeTypeFromPath(fullPath) - if (!mimeType) { - throw new Error('Invalid cached image type') - } - - return { - data: await fs.readFile(fullPath), - mimeType - } - } - - private async resolveRemoteImage( - source: string, - fallbackMimeType?: string - ): Promise { - const url = new URL(source) - if (url.protocol !== 'http:' && url.protocol !== 'https:') { - throw new Error('Unsupported image URL') - } - - const response = await net.fetch(url.toString()) - if (!response.ok) { - throw new Error(`Failed to download image: ${response.status}`) - } - - const responseMimeType = normalizeImageMimeType( - response.headers.get('content-type') ?? undefined - ) - const mimeType = - responseMimeType || - normalizeImageMimeType(fallbackMimeType) || - inferImageMimeTypeFromPath(url.pathname) - - if (!mimeType) { - throw new Error('Remote URL is not an image') - } - - return { - data: Buffer.from(await response.arrayBuffer()), - mimeType - } - } - - private resolveRawBase64Image(source: string, fallbackMimeType?: string): ResolvedImageData { - const mimeType = normalizeImageMimeType(fallbackMimeType) - if (!mimeType) { - throw new Error('Raw image data requires an image MIME type') - } - - const data = Buffer.from(source.replace(/\s/g, ''), 'base64') - if (data.length === 0) { - throw new Error('Invalid raw image data') - } - - return { data, mimeType } - } - - private createClipboardImage(image: ResolvedImageData): Electron.NativeImage { - const imageFromBuffer = nativeImage.createFromBuffer(image.data) - if (!imageFromBuffer.isEmpty()) { - return imageFromBuffer - } - - const dataUrl = `data:${image.mimeType};base64,${image.data.toString('base64')}` - const imageFromDataUrl = nativeImage.createFromDataURL(dataUrl) - if (!imageFromDataUrl.isEmpty()) { - return imageFromDataUrl - } - - throw new Error('Image data cannot be copied to clipboard') - } - - private safeDecodePath(filePath: string): string { - try { - return decodeURIComponent(filePath) - } catch { - return filePath - } - } - async isDirectory(absPath: string): Promise { try { const fullPath = path.join(absPath) diff --git a/src/main/file/routes.ts b/src/main/file/routes.ts index 4d2d0c0a0f..9993ab6adf 100644 --- a/src/main/file/routes.ts +++ b/src/main/file/routes.ts @@ -1,4 +1,5 @@ import type { FileServicePort } from '@shared/types/file' +import type { DesktopImageActions } from '@/desktop/imageActions' import { fileCopyImageRoute, fileGetMimeTypeRoute, @@ -11,7 +12,10 @@ import { } from '@shared/contracts/routes' import { createRouteMap, type DeepchatRouteMap } from '@/routes/routeRegistry' -export function createFileRoutes(fileService: FileServicePort): DeepchatRouteMap { +export function createFileRoutes( + fileService: FileServicePort, + images: Pick +): DeepchatRouteMap { return createRouteMap([ [ fileGetMimeTypeRoute.name, @@ -69,14 +73,14 @@ export function createFileRoutes(fileService: FileServicePort): DeepchatRouteMap fileSaveImageRoute.name, async (rawInput) => { const input = fileSaveImageRoute.input.parse(rawInput) - return fileSaveImageRoute.output.parse(await fileService.saveImage(input)) + return fileSaveImageRoute.output.parse(await images.saveImage(input)) } ], [ fileCopyImageRoute.name, async (rawInput) => { const input = fileCopyImageRoute.input.parse(rawInput) - return fileCopyImageRoute.output.parse(await fileService.copyImage(input)) + return fileCopyImageRoute.output.parse(await images.copyImage(input)) } ] ]) diff --git a/src/main/harness/admission.ts b/src/main/harness/admission.ts new file mode 100644 index 0000000000..e0e5dfb33f --- /dev/null +++ b/src/main/harness/admission.ts @@ -0,0 +1,171 @@ +import { randomUUID } from 'node:crypto' +import { z } from 'zod' +import { + AdmissionSnapshotSchema, + DEFAULT_AGENT_INVOCATION_CAPACITY, + DEFAULT_AGENT_INVOCATION_MAX_PENDING, + AgentInvocationAdmissionAbortedError, + AgentInvocationAdmissionClosedError, + AgentInvocationAdmissionQueueFullError, + normalizeAdmissionOwnerId, + normalizeAdmissionOwnerLimit, + snapshotAdmissionCorrelation, + type AgentInvocationAdmissionDiagnosticsOptions, + type AgentInvocationAdmissionOptions, + type AgentInvocationAdmissionPort, + type AgentInvocationPermit, + type InternalAgentInvocationPermit +} from '@shared/harness/admission' +import { StatefulAgentInvocationLease } from '@shared/harness/lease' +import { HarnessRuntime } from './runtime' + +export class RutisAgentInvocationAdmission implements AgentInvocationAdmissionPort { + private closed: AgentInvocationAdmissionClosedError | undefined + private closePromise: Promise | undefined + private readonly releases = new Set>() + + private constructor( + private readonly runtime: HarnessRuntime, + private readonly capacity: number, + private readonly maxPending: number, + private readonly diagnostics: AgentInvocationAdmissionDiagnosticsOptions + ) {} + + static create(options: { + runtime: HarnessRuntime + capacity?: number + maxPending?: number + diagnostics?: AgentInvocationAdmissionDiagnosticsOptions + }): RutisAgentInvocationAdmission { + const capacity = options.capacity ?? DEFAULT_AGENT_INVOCATION_CAPACITY + const maxPending = options.maxPending ?? DEFAULT_AGENT_INVOCATION_MAX_PENDING + if ( + !Number.isSafeInteger(capacity) || + capacity < 1 || + !Number.isSafeInteger(maxPending) || + maxPending < 0 + ) { + throw new Error('Invalid admission limits') + } + const diagnostics = options.diagnostics ?? {} + return new RutisAgentInvocationAdmission(options.runtime, capacity, maxPending, diagnostics) + } + + get identity() { + return this.runtime.identity + } + + async acquire(options: AgentInvocationAdmissionOptions): Promise { + if (this.closed) throw this.closed + const ownerId = normalizeAdmissionOwnerId(options.ownerId) + const maxActiveForOwner = normalizeAdmissionOwnerLimit(options.maxActiveForOwner, this.capacity) + const id = randomUUID() + let released = false + const releaseRemote = (reason: 'permit_released' | 'lease_suspended' | 'lease_released') => { + if (released) return + released = true + const release = this.runtime + .request('release', [id, reason, this.observationsEnabled()]) + .catch(() => undefined) + .finally(() => this.releases.delete(release)) + this.releases.add(release) + } + const request = this.runtime.request('acquire', [ + id, + { + ownerId, + maxActiveForOwner, + aborted: options.signal?.aborted === true, + correlation: snapshotAdmissionCorrelation(options.correlation) + }, + this.observationsEnabled() + ]) + const cancel = () => releaseRemote('permit_released') + options.signal?.addEventListener('abort', cancel, { once: true }) + if (options.signal?.aborted) cancel() + try { + z.literal(id).parse(await request) + } catch (error) { + // Cancellation can discard a successful remote reply; identity is known before acquire. + releaseRemote('permit_released') + throw options.signal?.aborted + ? new AgentInvocationAdmissionAbortedError() + : this.admissionError(error) + } finally { + options.signal?.removeEventListener('abort', cancel) + } + const permit: InternalAgentInvocationPermit = { + release: () => permit.releaseWithReason('permit_released'), + releaseWithReason: (reason) => { + releaseRemote(reason) + } + } + if (options.signal?.aborted || this.closed) { + permit.release() + throw this.closed ?? new AgentInvocationAdmissionAbortedError() + } + return permit + } + + createLease(options: AgentInvocationAdmissionOptions) { + return new StatefulAgentInvocationLease(this, options) + } + + async run(options: AgentInvocationAdmissionOptions, task: () => Promise): Promise { + const permit = await this.acquire(options) + try { + if (options.signal?.aborted) throw new AgentInvocationAdmissionAbortedError() + return await task() + } finally { + permit.release() + } + } + + close(reason = 'Agent invocation admission is closed.'): Promise { + if (this.closePromise) return this.closePromise + this.closed = new AgentInvocationAdmissionClosedError(reason) + this.closePromise = (async () => { + await Promise.all(this.releases) + await this.runtime.request('close', [reason, this.observationsEnabled()]) + })() + return this.closePromise + } + + async flushObservations(): Promise { + await Promise.all(this.releases) + await this.runtime.request('flushObservations', []) + } + + async snapshot() { + await Promise.all(this.releases) + const value = z + .object({ admission: AdmissionSnapshotSchema, runtime: z.unknown() }) + .strict() + .parse(await this.runtime.request('snapshot', [])) + return value.admission + } + + private observationsEnabled(): boolean { + try { + return ( + this.diagnostics.observe !== undefined && (this.diagnostics.observationsEnabled?.() ?? true) + ) + } catch { + return false + } + } + + private admissionError(value: unknown): Error { + if (!(value instanceof Error)) return new Error('Admission request failed') + switch (value.name) { + case 'AgentInvocationAdmissionAbortedError': + return new AgentInvocationAdmissionAbortedError() + case 'AgentInvocationAdmissionClosedError': + return new AgentInvocationAdmissionClosedError(value.message) + case 'AgentInvocationAdmissionQueueFullError': + return new AgentInvocationAdmissionQueueFullError(this.maxPending) + default: + return value + } + } +} diff --git a/src/main/harness/memory-vector.ts b/src/main/harness/memory-vector.ts new file mode 100644 index 0000000000..b59d9e8c5f --- /dev/null +++ b/src/main/harness/memory-vector.ts @@ -0,0 +1,352 @@ +import { randomUUID } from 'node:crypto' +import fs from 'node:fs' +import { endianness } from 'node:os' +import { z } from 'zod' +import { AsyncSemaphore } from '@/lib/asyncSemaphore' +import { withSoftDeadline } from '@/memory/core/asyncDeadline' +import type { IMemoryVectorStore, MemoryVectorStoreFactoryPort } from '@/memory/ports' +import type { MemoryVectorRecord, MemoryVectorQueryOptions } from '@/memory/types' +import { + createMemoryVectorStorePaths, + persistMemoryVectorQuarantine +} from '@/memory/infra/memoryVectorStorePaths' +import { + isDuckDbFatalError, + MemoryVectorStoreQuarantineRequiredError, + MemoryVectorStoreTerminalRecoveryError +} from '@/memory/infra/vectorStoreErrors' +import { + encodeMemoryVector, + MEMORY_VECTOR_CHUNK_BYTES, + MEMORY_VECTOR_INITIAL_CHUNK_BYTES, + MEMORY_VECTOR_UPLOAD_BYTES, + MemoryVectorCommandSchema, + type MemoryVectorCommand, + type MemoryVectorConfig +} from '@shared/harness/memory-vector' +import { isSafeAgentId } from '@shared/types/agent-memory' +import type { HarnessRuntime } from './runtime' + +const matches = z + .array( + z.object({ memoryId: z.string().min(1).max(1024), distance: z.number().finite() }).strict() + ) + .max(800) + +export class RutisMemoryVectorStores implements MemoryVectorStoreFactoryPort { + private readonly config: MemoryVectorConfig + private readonly stores = new Map() + private readonly barriers = new Map>() + private readonly uploads = new AsyncSemaphore(1) + private startup: Promise | undefined + private stopped = false + + constructor( + readonly runtime: HarnessRuntime, + config: Omit + ) { + this.config = { ...config, generation: randomUUID() } + } + + async createVectorStore( + agentId: string, + embedding: { providerId: string; modelId: string }, + dimensions: number + ): Promise { + this.assertAgent(agentId) + await this.barriers.get(agentId) + if (this.stopped) throw new Error('Memory vector stores are stopping') + if ([...this.stores.values()].some((store) => store.agentId === agentId)) { + throw new Error('Memory vector store already has a local owner') + } + const store = new RemoteMemoryVectorStore(this, agentId, randomUUID(), dimensions) + const opening = MemoryVectorCommandSchema.parse({ + method: 'open', + resource: store.id, + agentId, + embedding, + dimensions, + generation: this.config.generation, + operation: randomUUID() + }) + this.stores.set(store.id, store) + try { + await this.start() + store.assertUsable() + const grant = z + .object({ resource: z.literal(store.id), usable: z.boolean() }) + .strict() + .parse(await this.request(opening)) + if (!grant.usable) store.revoke() + return store + } catch (error) { + await store.close().catch(() => undefined) + throw error + } + } + + async resetVectorStore(agentId: string): Promise { + this.assertAgent(agentId) + await this.barriers.get(agentId) + if (!this.startup) { + const paths = createMemoryVectorStorePaths(this.config.memoryDbDir, agentId) + if ( + !fs.existsSync(`${paths.current}.lease`) && + !Object.values(paths).some((file) => fs.existsSync(file) || fs.existsSync(`${file}.wal`)) + ) + return + } + for (const store of this.stores.values()) if (store.agentId === agentId) store.revoke() + await this.start() + await this.request({ method: 'reset', agentId }) + for (const [id, store] of this.stores) if (store.agentId === agentId) this.stores.delete(id) + } + + markVectorStoreQuarantined(agentId: string): void { + this.assertAgent(agentId) + for (const store of this.stores.values()) if (store.agentId === agentId) store.revoke() + // Append-only intent survives a dead worker; only the locked native owner consumes it. + try { + persistMemoryVectorQuarantine(createMemoryVectorStorePaths(this.config.memoryDbDir, agentId)) + } finally { + const previous = this.barriers.get(agentId) + const barrier = (async () => { + await previous + await this.start() + await this.request({ method: 'quarantine', agentId }) + })() + this.barriers.set(agentId, barrier) + void barrier.catch(() => undefined) + } + } + + async dispose(): Promise { + this.stopped = true + const drain = (async () => { + await Promise.allSettled([...this.stores.values()].map((store) => store.close(true))) + await Promise.allSettled(this.barriers.values()) + })() + // The composition owner stops the host next; unresolved native work stays owned until death. + const result = await withSoftDeadline(drain, 5_000) + if (result.timedOut) + console.warn('[Memory] Vector disposal timed out; host shutdown will fence native work') + } + + async close(store: RemoteMemoryVectorStore, preserveLease: boolean): Promise { + try { + await this.startup + if (this.startup) await this.request({ method: 'close', resource: store.id, preserveLease }) + await this.barriers.get(store.agentId) + } finally { + this.stores.delete(store.id) + } + } + + async upsert(store: RemoteMemoryVectorStore, records: MemoryVectorRecord[]): Promise { + store.assertUsable() + if (!records.length) return + if (endianness() !== 'LE') throw new Error('Memory vector uploads require a little-endian host') + const bytes = records.length * store.dimensions * 4 + if (records.length > 50 || bytes > MEMORY_VECTOR_UPLOAD_BYTES) + throw new Error('Memory vector upload exceeds batch limit') + for (const record of records) { + if (record.embedding.length !== store.dimensions) + throw new Error('Invalid memory vector upload values') + for (let index = 0; index < record.embedding.length; index++) { + const value = record.embedding[index] + if (!Number.isFinite(value) || !Number.isFinite(Math.fround(value))) + throw new Error('Invalid memory vector upload values') + } + } + if (this.uploads.activeCount + this.uploads.pendingCount >= 24) + throw new Error('Memory vector upload queue limit exceeded') + await this.uploads.run(async () => { + store.assertUsable() + const upload = randomUUID() + const chunkAt = (offset: number, limit = MEMORY_VECTOR_CHUNK_BYTES) => { + const chunk = Buffer.allocUnsafe(Math.min(limit, bytes - offset)) + const values = new Float32Array(chunk.buffer, chunk.byteOffset, chunk.length / 4) + let sourceOffset = offset / 4 + for (let local = 0; local < values.length; ) { + const source = records[Math.floor(sourceOffset / store.dimensions)].embedding + const start = sourceOffset % store.dimensions + const count = Math.min(source.length - start, values.length - local) + if (start === 0 && count === source.length) values.set(source, local) + else { + for (let index = 0; index < count; index++) + values[local + index] = source[start + index] + } + local += count + sourceOffset += count + } + return chunk + } + try { + let offset: number + { + const first = chunkAt(0, MEMORY_VECTOR_INITIAL_CHUNK_BYTES) + offset = first.length + await this.request({ + method: 'begin', + resource: store.id, + upload, + memoryIds: records.map((record) => record.memoryId), + bytes, + data: first + }) + } + while (offset < bytes) { + store.assertUsable() + const chunk = chunkAt(offset) + if (offset + chunk.length === bytes) { + await this.request({ + method: 'commit', + resource: store.id, + upload, + offset, + data: chunk + }) + return + } + z.literal(offset + chunk.length).parse( + await this.request({ + method: 'chunk', + resource: store.id, + upload, + offset, + data: chunk + }) + ) + offset += chunk.length + } + store.assertUsable() + await this.request({ method: 'commit', resource: store.id, upload }) + } catch (error) { + await this.request({ method: 'abort', resource: store.id, upload }).catch(() => undefined) + throw error + } + }) + } + + async request(command: MemoryCommand): Promise { + try { + return await this.runtime.requestMemory({ + ...command, + generation: this.config.generation, + operation: randomUUID() + } as MemoryVectorCommand) + } catch (error) { + if (!this.runtime.memoryAvailable) + throw new MemoryVectorStoreQuarantineRequiredError( + 'Memory vector runtime is unavailable; restart DeepChat', + { cause: error } + ) + if (error instanceof Error) { + if (error.name === 'MemoryVectorStoreTerminalRecoveryError') { + throw new MemoryVectorStoreTerminalRecoveryError(error.message, { + fatal: isDuckDbFatalError(error) + }) + } + if ( + ['MemoryVectorStoreQuarantineRequiredError', 'MemoryVectorStorePostCommitError'].includes( + error.name + ) + ) { + throw new MemoryVectorStoreQuarantineRequiredError(error.message) + } + } + throw error + } + } + + private start(): Promise { + return (this.startup ??= this.runtime.startMemory(this.config).catch((error) => { + throw new MemoryVectorStoreQuarantineRequiredError( + 'Memory vector runtime failed to start; restart DeepChat', + { cause: error } + ) + })) + } + + private assertAgent(agentId: string): void { + if (!isSafeAgentId(agentId)) throw new Error('Invalid memory vector Agent identity') + } +} + +type MemoryCommand = MemoryVectorCommand extends infer T + ? T extends MemoryVectorCommand + ? Omit + : never + : never + +class RemoteMemoryVectorStore implements IMemoryVectorStore { + private usable = true + private closing: Promise | undefined + + constructor( + private readonly owner: RutisMemoryVectorStores, + readonly agentId: string, + readonly id: string, + readonly dimensions: number + ) {} + + isUsable(): boolean { + return this.usable && this.owner.runtime.memoryAvailable + } + revoke(): void { + this.usable = false + } + assertUsable(): void { + if (!this.owner.runtime.memoryAvailable) + throw new MemoryVectorStoreQuarantineRequiredError( + 'Memory vector runtime is unavailable; restart DeepChat' + ) + if (!this.isUsable()) throw new Error('Memory vector resource is unavailable') + } + + upsert(records: MemoryVectorRecord[]): Promise { + return this.owner.upsert(this, records) + } + + async query(embedding: number[], options: MemoryVectorQueryOptions) { + this.assertUsable() + return matches.parse( + await this.owner.request({ + method: 'query', + resource: this.id, + vector: encodeMemoryVector(embedding, this.dimensions).toString('base64'), + topK: options.topK + }) + ) + } + + async queryByMemoryId(memoryId: string, options: MemoryVectorQueryOptions) { + this.assertUsable() + return matches.parse( + await this.owner.request({ + method: 'queryByMemoryId', + resource: this.id, + memoryId, + topK: options.topK + }) + ) + } + + async deleteByMemoryIds(memoryIds: string[]): Promise { + this.assertUsable() + await this.owner.request({ method: 'delete', resource: this.id, memoryIds }) + } + + async listMemoryIds(afterId: string | null, limit: number): Promise { + this.assertUsable() + return z + .array(z.string().min(1).max(1024)) + .max(512) + .parse(await this.owner.request({ method: 'list', resource: this.id, afterId, limit })) + } + + close(preserveLease = false): Promise { + this.revoke() + return (this.closing ??= this.owner.close(this, preserveLease)) + } +} diff --git a/src/main/harness/runtime.ts b/src/main/harness/runtime.ts new file mode 100644 index 0000000000..79cba87a55 --- /dev/null +++ b/src/main/harness/runtime.ts @@ -0,0 +1,458 @@ +import { spawn, type ChildProcessWithoutNullStreams } from 'node:child_process' +import path from 'node:path' +import { z } from 'zod' +import { AdmissionObservationSchema } from '@shared/harness/admission' +import type { AgentInvocationAdmissionObservation } from '@shared/harness/admission' +import { + isMemoryVectorControl, + MEMORY_VECTOR_BINARY_FLAG, + MEMORY_VECTOR_FRAME_BYTES, + MEMORY_VECTOR_FRAME_FLAG, + MEMORY_VECTOR_PENDING, + MemoryVectorCommandSchema, + MemoryVectorConfigSchema, + type MemoryVectorCommand, + type MemoryVectorConfig +} from '@shared/harness/memory-vector' + +const MAX_FRAME_BYTES = 64 * 1024 +const MAX_BUFFER_BYTES = 1024 * 1024 +const MAX_REQUESTS = 1024 +const memoryIdentitySchema = z + .object({ + generation: z.string().uuid(), + pid: z.number().int().positive(), + node: z.string().max(64), + modules: z.string().max(32) + }) + .strict() +const frameSchema = z.union([ + z + .object({ + type: z.literal('memoryReady'), + protocol: z.literal(1), + runtime: memoryIdentitySchema + }) + .strict(), + z.object({ type: z.literal('memoryStopped'), message: z.string().max(8192) }).strict(), + z + .object({ type: z.literal('memoryReply'), id: z.number().int().positive(), value: z.unknown() }) + .strict(), + z + .object({ + type: z.literal('memoryReply'), + id: z.number().int().positive(), + error: z.object({ name: z.string().max(256), message: z.string().max(8192) }).strict() + }) + .strict(), + z + .object({ + type: z.literal('ready'), + protocol: z.literal(1), + hostPid: z.number().int().positive(), + runtime: z + .object({ + pid: z.number().int().positive(), + node: z.string().max(64), + electron: z.string().max(64).nullable(), + modules: z.string().max(32) + }) + .strict() + }) + .strict(), + z + .object({ type: z.literal('reply'), id: z.number().int().positive(), value: z.unknown() }) + .strict(), + z + .object({ + type: z.literal('reply'), + id: z.number().int().positive(), + error: z + .object({ + name: z.string().max(256), + message: z.string().max(8192) + }) + .strict() + }) + .strict(), + z + .object({ + type: z.literal('observation'), + sequence: z.number().int().positive().max(Number.MAX_SAFE_INTEGER), + value: z.unknown() + }) + .strict() +]) + +type Method = 'acquire' | 'release' | 'snapshot' | 'close' | 'flushObservations' +type RuntimeInfo = Extract, { type: 'ready' }> +interface Pending { + resolve: (value: unknown) => void + reject: (error: Error) => void + cleanup: () => void +} + +export class HarnessRuntime { + private readonly child: ChildProcessWithoutNullStreams + private readonly ready = Promise.withResolvers() + private readonly exited = Promise.withResolvers() + private readonly pending = new Map() + private buffer = Buffer.alloc(0) + private nextId = 0 + private nextObservation = 1 + private observationDrops = 0 + private readonly observations = new Map() + private failure: Error | undefined + private stopping = false + private stopPromise: Promise | undefined + private info: RuntimeInfo | undefined + private memoryConfig: MemoryVectorConfig | undefined + private readonly memoryReady = Promise.withResolvers>() + private readonly memoryPending = new Map() + private nextMemoryId = 0 + private memoryFailure: Error | undefined + private memoryInfo: z.infer | undefined + private memorySentBytes = 0 + private memoryReceivedBytes = 0 + private memoryPeakPending = 0 + + private constructor( + directory: string, + electronExecutable: string, + capacity: number, + maxPending: number, + private readonly observe: (value: AgentInvocationAdmissionObservation) => void | Promise + ) { + const host = path.join( + directory, + `deepchat-harness-${process.platform}-${process.arch}${process.platform === 'win32' ? '.exe' : ''}` + ) + this.child = spawn( + host, + [ + electronExecutable, + path.join(directory, 'node_modules', '@arcships', 'rutis-runtime'), + path.join(directory, 'admission.mjs'), + String(capacity), + String(maxPending) + ], + { stdio: ['pipe', 'pipe', 'pipe'], windowsHide: true } + ) + this.child.stderr.resume() + this.child.on('error', () => + this.fail(new Error('Cannot start Rutis host. Run pnpm harness:build.')) + ) + this.child.on('close', (code, signal) => { + this.fail( + new Error( + `Rutis host exited (${signal ?? code ?? 'unknown'}). Restart DeepChat to restore admission.` + ) + ) + this.exited.resolve() + }) + this.child.stdout.on('data', (bytes: Buffer) => { + try { + this.read(bytes) + } catch { + this.fail(new Error('Invalid Rutis host response')) + } + }) + this.child.stdout.on('error', () => this.fail(new Error('Rutis host output failed'))) + this.child.stdin.on('error', () => this.fail(new Error('Rutis host input failed'))) + } + + static async start(options: { + directory: string + electronExecutable: string + capacity: number + maxPending: number + observe: (value: AgentInvocationAdmissionObservation) => void | Promise + }): Promise { + const runtime = new HarnessRuntime( + options.directory, + options.electronExecutable, + options.capacity, + options.maxPending, + options.observe + ) + const timer = setTimeout( + () => runtime.fail(new Error('Rutis admission startup timed out')), + 15_000 + ) + timer.unref() + try { + await runtime.ready.promise + return runtime + } catch (error) { + await runtime.stop().catch(() => undefined) + throw error + } finally { + clearTimeout(timer) + } + } + + get identity(): RuntimeInfo | undefined { + return this.info + } + + get memoryIdentity() { + return this.memoryInfo + } + + get memoryAvailable(): boolean { + return !!this.memoryInfo && !this.memoryFailure && !this.failure && !this.stopping + } + + get memoryTransport() { + return { + sentBytes: this.memorySentBytes, + receivedBytes: this.memoryReceivedBytes, + pending: this.memoryPending.size, + peakPending: this.memoryPeakPending + } + } + + async startMemory(config: MemoryVectorConfig): Promise { + if (this.memoryFailure) throw this.memoryFailure + if (this.failure) throw this.failure + if (!this.memoryConfig) { + this.memoryConfig = MemoryVectorConfigSchema.parse(config) + this.send({ type: 'memoryStart', config: this.memoryConfig }) + } else if (this.memoryConfig.generation !== config.generation) { + throw new Error('Memory vector generation cannot change') + } + const timer = setTimeout( + () => this.failMemory(new Error('Memory vector runtime startup timed out')), + 15_000 + ) + timer.unref() + try { + await this.memoryReady.promise + } finally { + clearTimeout(timer) + } + } + + requestMemory(input: MemoryVectorCommand): Promise { + if (this.failure || this.memoryFailure) + return Promise.reject(this.failure ?? this.memoryFailure) + if (this.stopping || !this.memoryInfo) + return Promise.reject(new Error('Memory vector runtime is unavailable')) + let command: MemoryVectorCommand + let packet: Buffer + const id = this.nextMemoryId + 1 + try { + command = MemoryVectorCommandSchema.parse(input) + if (command.generation !== this.memoryInfo.generation) + throw new Error('Memory vector generation changed') + const control = isMemoryVectorControl(command.method) + if ( + this.memoryPending.size >= (control ? MEMORY_VECTOR_PENDING : MEMORY_VECTOR_PENDING - 8) + ) { + throw new Error('Memory vector operation limit exceeded') + } + const data = 'data' in command ? command.data : undefined + packet = this.packet( + { type: 'memoryCall', id, command: data ? { ...command, data: undefined } : command }, + control ? MAX_FRAME_BYTES : MEMORY_VECTOR_FRAME_BYTES, + control ? 0 : MAX_FRAME_BYTES + 4, + true, + data + ) + } catch (error) { + return Promise.reject(error) + } + this.nextMemoryId = id + return new Promise((resolve, reject) => { + // Native deadlines belong to Memory; retain ownership until settlement or confirmed death. + this.memoryPending.set(id, { resolve, reject, cleanup: () => {} }) + this.memorySentBytes += packet.length + this.memoryPeakPending = Math.max(this.memoryPeakPending, this.memoryPending.size) + this.child.stdin.write(packet) + }) + } + + request(method: Method, args: unknown[]): Promise { + if (this.failure) return Promise.reject(this.failure) + if (this.stopping) return Promise.reject(new Error('Rutis admission is stopping')) + if (this.pending.size >= MAX_REQUESTS) { + this.fail(new Error('Rutis admission request limit exceeded')) + return Promise.reject(this.failure) + } + const id = ++this.nextId + return new Promise((resolve, reject) => { + const timer = + method === 'acquire' + ? undefined + : setTimeout(() => this.fail(new Error(`Rutis admission ${method} timed out`)), 10_000) + timer?.unref() + this.pending.set(id, { + resolve, + reject, + cleanup: () => { + clearTimeout(timer) + } + }) + this.send({ type: 'call', id, method, args }) + }) + } + + async stop(): Promise { + if (this.stopPromise) return this.stopPromise + this.stopping = true + this.child.stdin.end() + this.stopPromise = (async () => { + const timer = setTimeout(() => this.child.kill('SIGKILL'), 12_000) + timer.unref() + try { + await this.exited.promise + } finally { + clearTimeout(timer) + } + })() + return this.stopPromise + } + + private send(value: unknown): void { + if (this.failure) return + try { + this.child.stdin.write(this.packet(value, MAX_FRAME_BYTES, 0)) + } catch { + this.fail(new Error('Rutis admission transport write failed')) + } + } + + private packet( + value: unknown, + maxFrame: number, + reserve: number, + vector = false, + data?: Uint8Array + ): Buffer { + const json = Buffer.from(JSON.stringify(value)) + const length = json.length + (data ? 4 + data.byteLength : 0) + if ( + length > maxFrame || + this.child.stdin.writableLength + 4 + length > MAX_BUFFER_BYTES - reserve + ) { + throw new Error('Rutis transport limit exceeded') + } + const packet = Buffer.allocUnsafe(4 + length) + packet.writeUInt32BE( + length + (vector ? MEMORY_VECTOR_FRAME_FLAG : 0) + (data ? MEMORY_VECTOR_BINARY_FLAG : 0) + ) + if (data) { + packet.writeUInt32BE(json.length, 4) + json.copy(packet, 8) + packet.set(data, 8 + json.length) + } else json.copy(packet, 4) + return packet + } + + private read(bytes: Buffer): void { + if (this.buffer.length + bytes.length > MAX_BUFFER_BYTES) + throw new Error('Host buffer exceeded') + this.buffer = Buffer.concat([this.buffer, bytes]) + while (this.buffer.length >= 4) { + const header = this.buffer.readUInt32BE(0) + const vector = header >= MEMORY_VECTOR_FRAME_FLAG + const length = vector ? header - MEMORY_VECTOR_FRAME_FLAG : header + if (length === 0 || length > (vector ? MEMORY_VECTOR_FRAME_BYTES : MAX_FRAME_BYTES)) + throw new Error('Invalid frame length') + if (this.buffer.length < length + 4) return + const frame = frameSchema.parse( + JSON.parse(this.buffer.subarray(4, 4 + length).toString('utf8')) + ) + this.buffer = this.buffer.subarray(4 + length) + if (frame.type === 'memoryReply') this.memoryReceivedBytes += length + 4 + if (vector !== (frame.type === 'memoryReply')) throw new Error('Invalid frame kind') + if (frame.type !== 'memoryReply' && length > MAX_FRAME_BYTES) + throw new Error('Invalid control frame length') + if (frame.type === 'memoryReady') { + if ( + !this.memoryConfig || + frame.runtime.generation !== this.memoryConfig.generation || + this.memoryInfo + ) { + throw new Error('Invalid memory generation') + } + this.memoryInfo = frame.runtime + this.memoryReady.resolve(frame.runtime) + } else if (frame.type === 'memoryStopped') { + this.failMemory(new Error(frame.message)) + } else if (frame.type === 'ready') { + if (this.info) throw new Error('Admission generation changed') + this.info = frame + this.ready.resolve(frame) + } else if (frame.type === 'observation') { + if (frame.sequence < this.nextObservation) continue + const parsed = AdmissionObservationSchema.safeParse(frame.value) + this.observations.set(frame.sequence, parsed.success ? parsed.data : null) + if (this.observations.size > 1024) { + this.observationDrops += this.observations.size + this.observations.clear() + this.nextObservation = frame.sequence + 1 + } + while (this.observations.has(this.nextObservation)) { + const value = this.observations.get(this.nextObservation++) + this.observations.delete(this.nextObservation - 1) + if (!value) { + this.observationDrops += 1 + continue + } + try { + const observed = this.observe( + value.type === 'closed' + ? { + ...value, + observationsDropped: value.observationsDropped + this.observationDrops + } + : value + ) + if (observed) void observed.catch(() => undefined) + } catch { + /* Observers cannot alter admission. */ + } + } + } else { + const requests = frame.type === 'memoryReply' ? this.memoryPending : this.pending + const pending = requests.get(frame.id) + if (frame.type === 'memoryReply' && this.memoryFailure) continue + if (!pending) throw new Error('Unknown harness reply') + requests.delete(frame.id) + pending.cleanup() + if ('error' in frame) { + const error = new Error(frame.error.message) + error.name = frame.error.name + pending.reject(error) + } else pending.resolve(frame.value) + } + } + } + + private fail(error: Error): void { + if (this.failure) return + this.failure = error + this.ready.reject(error) + this.failMemory(error) + for (const pending of this.pending.values()) { + pending.cleanup() + pending.reject(error) + } + this.pending.clear() + this.child.stdin.destroy() + if (!this.stopping && this.child.exitCode === null && this.child.pid) { + const timer = setTimeout(() => this.child.kill('SIGKILL'), 12_000) + timer.unref() + this.child.once('exit', () => clearTimeout(timer)) + } + } + + private failMemory(error: Error): void { + if (this.memoryFailure) return + this.memoryFailure = error + if (this.memoryConfig) this.memoryReady.reject(error) + for (const pending of this.memoryPending.values()) pending.reject(error) + this.memoryPending.clear() + } +} diff --git a/src/main/hook/index.ts b/src/main/hook/index.ts index 9ad94623d6..9d22760070 100644 --- a/src/main/hook/index.ts +++ b/src/main/hook/index.ts @@ -1,5 +1,4 @@ import { spawn, type ChildProcess } from 'child_process' -import { app } from 'electron' import fs from 'fs' import type { HookCommandItem, @@ -199,14 +198,15 @@ const projectHookEvent = (event: HookEvent, time: string): HookEventProjection = export class HookService implements HookObserver { private accepting = true - private readonly activeChildren = new Set() + private readonly activeChildren = new Map>() /** Per-session delivery chain: emission order within a session, no coupling across sessions. */ private readonly sessionChains = new Map>() private snapshot: HookConfigSnapshot | null = null constructor( private readonly settings: HookSettingsPort, - private readonly query: HookQueryPort + private readonly query: HookQueryPort, + private readonly appVersion: string ) {} getConfigSnapshot(): HooksNotificationsSettings { @@ -226,20 +226,36 @@ export class HookService implements HookObserver { } start(): void { + if (this.activeChildren.size > 0 || this.sessionChains.size > 0) { + throw new Error('Hook work must drain before restarting') + } this.accepting = true this.refreshSubscriptions() } async stop(): Promise { this.accepting = false - for (const child of this.activeChildren) { + for (const child of this.activeChildren.keys()) { try { child.kill('SIGKILL') } catch { // Process may already be closing. } } - await Promise.allSettled(Array.from(this.sessionChains.values())) + const drain = Promise.allSettled([ + ...this.sessionChains.values(), + ...this.activeChildren.values() + ]) + await new Promise((resolve, reject) => { + const timeout = setTimeout( + () => reject(new Error('Hook work did not drain before shutdown')), + COMMAND_TIMEOUT_MS + ) + void drain.then(() => { + clearTimeout(timeout) + resolve() + }) + }) } isObserved(event: HookEventName): boolean { @@ -268,6 +284,9 @@ export class HookService implements HookObserver { } async testHookCommand(hookId: string): Promise { + if (!this.accepting) { + return { success: false, durationMs: 0, error: 'Hook commands are stopped' } + } const hook = this.getConfigSnapshot().hooks.find((item) => item.id === hookId) if (!hook) { return { @@ -291,7 +310,7 @@ export class HookService implements HookObserver { event, time: new Date().toISOString(), isTest: true, - app: { version: app.getVersion(), platform: process.platform }, + app: { version: this.appVersion, platform: process.platform }, session: { conversationId: undefined, agentId: null, workdir: null }, user: { messageId: undefined, promptPreview: 'Test message' }, tool: null, @@ -406,7 +425,7 @@ export class HookService implements HookObserver { time: projection.time, isTest: false, app: { - version: app.getVersion(), + version: this.appVersion, platform: process.platform }, session: { @@ -489,7 +508,13 @@ export class HookService implements HookObserver { env, windowsHide: true }) - this.activeChildren.add(child) + let releaseChild: () => void + this.activeChildren.set( + child, + new Promise((resolve) => { + releaseChild = resolve + }) + ) const finalize = (result: HookCommandResult) => { if (finished) { @@ -525,7 +550,6 @@ export class HookService implements HookObserver { }, COMMAND_TIMEOUT_MS) child.on('error', (error) => { - this.activeChildren.delete(child) clearTimeout(timeout) finalize({ success: false, @@ -545,6 +569,7 @@ export class HookService implements HookObserver { child.on('close', (code) => { this.activeChildren.delete(child) + releaseChild() clearTimeout(timeout) finalize({ success: !timedOut && code === 0, diff --git a/src/main/index.ts b/src/main/index.ts index d493ff2cf5..d2eb244ad1 100644 --- a/src/main/index.ts +++ b/src/main/index.ts @@ -1,3 +1,6 @@ +import { app } from 'electron' +import { setLegacyConsoleDebugEnabled } from '@shared/logger' import { startApp } from './appMain' +setLegacyConsoleDebugEnabled(!app.isPackaged) startApp() diff --git a/src/main/knowledge/database/knowledgeDatabase.ts b/src/main/knowledge/database/knowledgeDatabase.ts index 5e94ae7147..54db5619ad 100644 --- a/src/main/knowledge/database/knowledgeDatabase.ts +++ b/src/main/knowledge/database/knowledgeDatabase.ts @@ -15,12 +15,6 @@ import type { import type { KnowledgeDatabasePort } from '../ports' import { nanoid } from 'nanoid' -import { app } from 'electron' - -const runtimeBasePath = path - .join(app.getAppPath(), 'runtime') - .replace('app.asar', 'app.asar.unpacked') -const extensionDir = path.join(runtimeBasePath, 'duckdb', 'extensions') const extensionSuffix = '.duckdb_extension' // 数据库版本常量 @@ -72,7 +66,12 @@ export class KnowledgeDatabase implements KnowledgeDatabasePort { private readonly chunkTable = 'chunk' private readonly metadataTable = 'metadata' - constructor(dbPath: string) { + constructor( + dbPath: string, + private readonly extensionDirectory: string + ) { + if (!path.isAbsolute(extensionDirectory)) + throw new Error('Knowledge extension directory must be absolute') this.dbPath = dbPath } @@ -673,7 +672,7 @@ export class KnowledgeDatabase implements KnowledgeDatabasePort { const conn = await ins.connect() // load vss - const extensionPath = path.join(extensionDir, `vss${extensionSuffix}`) + const extensionPath = path.join(this.extensionDirectory, `vss${extensionSuffix}`) if (fs.existsSync(extensionPath)) { const escapedPath = extensionPath.replace(/\\/g, '\\\\') logger.info(`[DuckDB] LOAD VSS extension from ${escapedPath}`) @@ -699,7 +698,7 @@ export class KnowledgeDatabase implements KnowledgeDatabasePort { name: string, afterRun?: () => Promise ): Promise { - const extensionPath = path.join(extensionDir, `${name}${extensionSuffix}`) + const extensionPath = path.join(this.extensionDirectory, `${name}${extensionSuffix}`) if (fs.existsSync(extensionPath)) { const escapedPath = extensionPath.replace(/\\/g, '\\\\') logger.info(`[DuckDB] LOAD ${name} extension from ${escapedPath}`) diff --git a/src/main/knowledge/index.ts b/src/main/knowledge/index.ts index 8f3aeac8ec..17d925dd92 100644 --- a/src/main/knowledge/index.ts +++ b/src/main/knowledge/index.ts @@ -44,6 +44,7 @@ export class KnowledgeService implements KnowledgeServicePort { * 知识库存储目录 */ private readonly storageDir + private readonly extensionDirectory: string private readonly configPort: KnowledgeServiceDeps['config'] @@ -76,6 +77,7 @@ export class KnowledgeService implements KnowledgeServicePort { this.embeddingPort = deps.embeddings this.events = deps.events this.storageDir = path.join(deps.storageRoot, 'KnowledgeBase') + this.extensionDirectory = deps.extensionDirectory this.taskQueue = new KnowledgeTaskQueue() this.knowledgeBases = new Map() this.knowledgeBaseInitializations = new Map() @@ -303,12 +305,12 @@ export class KnowledgeService implements KnowledgeServicePort { ): Promise => { const dbPath = path.join(this.storageDir, id) if (fs.existsSync(dbPath)) { - const db = new KnowledgeDatabase(dbPath) + const db = new KnowledgeDatabase(dbPath, this.extensionDirectory) await db.open() return db } // 如果数据库不存在,则初始化 - const db = new KnowledgeDatabase(dbPath) + const db = new KnowledgeDatabase(dbPath, this.extensionDirectory) await db.initialize(dimensions, { metric: getMetric(normalized) }) diff --git a/src/main/knowledge/ports.ts b/src/main/knowledge/ports.ts index 825416a770..e9484747cb 100644 --- a/src/main/knowledge/ports.ts +++ b/src/main/knowledge/ports.ts @@ -105,6 +105,7 @@ export interface KnowledgeEventPublisher { export type KnowledgeServiceDeps = { config: KnowledgeConfigPort storageRoot: string + extensionDirectory: string files: KnowledgeFilePort dialog: KnowledgeDialogPort embeddings: KnowledgeEmbeddingPort diff --git a/src/main/lib/runtimeHelper.ts b/src/main/lib/runtimeHelper.ts index a54c837613..551ad5b069 100644 --- a/src/main/lib/runtimeHelper.ts +++ b/src/main/lib/runtimeHelper.ts @@ -1,115 +1,35 @@ -import logger from '@shared/logger' -import { app } from 'electron' -import * as path from 'path' +export function expandRuntimePath(inputPath: string, homeDirectory: string): string { + let expandedPath = inputPath -/** - * Utilities for environment paths and platform-specific installation locations. - */ -export class RuntimeHelper { - private static instance: RuntimeHelper | null = null - - private constructor() { - // Private constructor to enforce singleton pattern - } - - /** - * Get the singleton instance of RuntimeHelper - */ - public static getInstance(): RuntimeHelper { - if (!RuntimeHelper.instance) { - RuntimeHelper.instance = new RuntimeHelper() - } - return RuntimeHelper.instance - } - - /** - * Expand various symbols and variables in paths - * @param inputPath Input path that may contain ~ or environment variables - * @returns Expanded path - */ - public expandPath(inputPath: string): string { - let expandedPath = inputPath - - // Handle ~ symbol (user home directory) - if (expandedPath.startsWith('~/') || expandedPath === '~') { - const homeDir = app.getPath('home') - expandedPath = expandedPath.replace('~', homeDir) - } - - // Handle environment variable expansion - expandedPath = expandedPath.replace(/\$\{([^}]+)\}/g, (match, varName) => { - return process.env[varName] || match - }) - - // Handle simple $VAR format (without braces) - expandedPath = expandedPath.replace(/\$([A-Z_][A-Z0-9_]*)/g, (match, varName) => { - return process.env[varName] || match - }) - - return expandedPath - } - - /** - * Get system-specific default paths - * @param homeDir User home directory - * @returns Array of default system paths - */ - public getDefaultPaths(homeDir: string): string[] { - if (process.platform === 'darwin') { - return [ - '/bin', - '/usr/bin', - '/usr/local/bin', - '/usr/local/sbin', - '/opt/homebrew/bin', - '/opt/homebrew/sbin', - '/usr/local/opt/node/bin', - '/opt/local/bin', - `${homeDir}/.cargo/bin` - ] - } else if (process.platform === 'linux') { - return ['/bin', '/usr/bin', '/usr/local/bin', `${homeDir}/.cargo/bin`] - } else { - // Windows - return [`${homeDir}\\.cargo\\bin`, `${homeDir}\\.local\\bin`] - } + if (expandedPath.startsWith('~/') || expandedPath === '~') { + expandedPath = expandedPath.replace('~', homeDirectory) } - /** - * Check if the application is installed in a Windows system directory - * System directories include Program Files and Program Files (x86) - * @returns true if installed in system directory, false otherwise - */ - public isInstalledInSystemDirectory(): boolean { - if (process.platform !== 'win32') { - return false - } - - const appPath = app.getAppPath() - const normalizedPath = appPath.toLowerCase() + expandedPath = expandedPath.replace(/\$\{([^}]+)\}/g, (match, varName) => { + return process.env[varName] || match + }) - // Check if app is installed in Program Files or Program Files (x86) - const isSystemDir = - normalizedPath.includes('program files') || normalizedPath.includes('program files (x86)') - - if (isSystemDir) { - logger.info('[RuntimeHelper] Application is installed in system directory:', appPath) - } + return expandedPath.replace(/\$([A-Z_][A-Z0-9_]*)/g, (match, varName) => { + return process.env[varName] || match + }) +} - return isSystemDir +export function getDefaultRuntimePaths(homeDirectory: string): string[] { + if (process.platform === 'darwin') { + return [ + '/bin', + '/usr/bin', + '/usr/local/bin', + '/usr/local/sbin', + '/opt/homebrew/bin', + '/opt/homebrew/sbin', + '/usr/local/opt/node/bin', + '/opt/local/bin', + `${homeDirectory}/.cargo/bin` + ] } - - /** - * Get user npm prefix path for Windows - * Returns the path where npm should install global packages when app is in system directory - * @returns User npm prefix path or null if not applicable - */ - public getUserNpmPrefix(): string | null { - if (process.platform !== 'win32') { - return null - } - - const appDataPath = app.getPath('appData') - return path.join(appDataPath, 'npm') + if (process.platform === 'linux') { + return ['/bin', '/usr/bin', '/usr/local/bin', `${homeDirectory}/.cargo/bin`] } + return [`${homeDirectory}\\.cargo\\bin`, `${homeDirectory}\\.local\\bin`] } diff --git a/src/main/mcp/apps/appHost.ts b/src/main/mcp/apps/appHost.ts index 88ca7bac4d..fb5c290327 100644 --- a/src/main/mcp/apps/appHost.ts +++ b/src/main/mcp/apps/appHost.ts @@ -1,5 +1,4 @@ import { createHash } from 'node:crypto' -import { shell } from 'electron' import type { PermissionMode } from '@shared/types/agent-interface' import type { MCPContentItem, @@ -24,11 +23,13 @@ import type { ToolPermissionBroker } from '@/tool/permission' import type { McpAppSandboxInstance, McpAppSandboxRegistry, - McpAppRouteContext + McpAppRouteContext, + McpAppDesktopPort } from './sandboxRegistry' import { MCP_APP_SCHEME } from './sandboxRegistry' import { assertBoundedMcpJson } from '../schemaValidation' -import { resolvePluginToolPolicy } from '@/plugin/toolPolicyStore' +import { awaitWithAbort } from '@/lib/awaitWithAbort' +import type { PluginToolPolicyStore } from '@/plugin/toolPolicyStore' const MCP_APP_RESOURCE_MIME_TYPE = 'text/html;profile=mcp-app' const MAX_APP_HTML_BYTES = 2 * 1024 * 1024 @@ -188,10 +189,12 @@ type BoundServer = { export class McpAppHost implements McpAppHostPort { constructor( private readonly deps: { + toolPolicies: Pick settings: McpSettings serverManager: ServerManager permissionBroker: ToolPermissionBroker registry: McpAppSandboxRegistry + desktop: McpAppDesktopPort ensureServerRunning(serverName: string): Promise getPermissionMode(conversationId: string): Promise validateSource(input: { @@ -229,59 +232,75 @@ export class McpAppHost implements McpAppHostPort { if (!this.deps.validateSource(input)) { throw new Error('The MCP App source no longer matches the saved tool result') } - const bound = await this.resolveBoundServer(input.descriptor) - const tools = await bound.client.listTools() - await this.assertBoundServerCurrent(input.descriptor, bound) - const tool = tools.find((entry) => entry.name === input.descriptor.toolName) - if (!tool || getToolUiResourceUri(tool) !== input.descriptor.resourceUri) { - throw new Error('MCP App tool declaration no longer matches the saved result') - } + const creationId = this.deps.registry.reserveCreation(context, input.descriptor.serverId) + const signal = this.deps.registry.getCreationSignal(creationId) + try { + await awaitWithAbort(this.deps.desktop.observeOwner(context), signal) + this.deps.registry.assertCreationCurrent(creationId) + if (!this.deps.validateSource(input)) { + throw new Error('The MCP App source no longer matches the saved tool result') + } + const bound = await awaitWithAbort(this.resolveBoundServer(input.descriptor), signal) + const tools = await awaitWithAbort(bound.client.listTools({ signal }), signal) + await awaitWithAbort(this.assertBoundServerCurrent(input.descriptor, bound), signal) + const tool = tools.find((entry) => entry.name === input.descriptor.toolName) + if (!tool || getToolUiResourceUri(tool) !== input.descriptor.resourceUri) { + throw new Error('MCP App tool declaration no longer matches the saved result') + } - const resources = await bound.client.readResourceContents(input.descriptor.resourceUri) - await this.assertBoundServerCurrent(input.descriptor, bound) - const matching = resources.filter((entry) => entry.uri === input.descriptor.resourceUri) - if (matching.length !== 1) { - throw new Error('MCP App resource must return exactly one matching content item') - } - const resource = matching[0] - if (resource.mimeType !== MCP_APP_RESOURCE_MIME_TYPE) { - throw new Error(`Unsupported MCP App resource MIME type: ${resource.mimeType ?? 'missing'}`) - } + const resources = await awaitWithAbort( + bound.client.readResourceContents(input.descriptor.resourceUri, signal), + signal + ) + await awaitWithAbort(this.assertBoundServerCurrent(input.descriptor, bound), signal) + const matching = resources.filter((entry) => entry.uri === input.descriptor.resourceUri) + if (matching.length !== 1) { + throw new Error('MCP App resource must return exactly one matching content item') + } + const resource = matching[0] + if (resource.mimeType !== MCP_APP_RESOURCE_MIME_TYPE) { + throw new Error(`Unsupported MCP App resource MIME type: ${resource.mimeType ?? 'missing'}`) + } - const html = decodeResourceHtml(resource) - const uiMeta = - readUiMeta(resource) ?? - (await this.findListedResourceUiMeta(bound.client, input.descriptor.resourceUri)) - await this.assertBoundServerCurrent(input.descriptor, bound) - if (!this.deps.validateSource(input)) { - throw new Error('The MCP App source no longer matches the saved tool result') - } - const instance = this.deps.registry.create({ - context, - conversationId: input.conversationId, - messageId: input.messageId, - blockId: input.blockId, - descriptor: { ...input.descriptor, serverName: bound.serverName }, - toolInput: input.toolInput, - html, - csp: normalizeCsp(uiMeta?.csp), - permissions: normalizePermissions(uiMeta?.permissions), - prefersBorder: typeof uiMeta?.prefersBorder === 'boolean' ? uiMeta.prefersBorder : undefined, - advisoryDomain: normalizeAdvisoryDomain(uiMeta?.domain), - validateLive: () => this.deps.validateSource(input) - }) + const html = decodeResourceHtml(resource) + const uiMeta = + readUiMeta(resource) ?? + (await this.findListedResourceUiMeta(bound.client, input.descriptor.resourceUri, signal)) + await awaitWithAbort(this.assertBoundServerCurrent(input.descriptor, bound), signal) + if (!this.deps.validateSource(input)) { + throw new Error('The MCP App source no longer matches the saved tool result') + } + const instance = this.deps.registry.create({ + creationId, + context, + conversationId: input.conversationId, + messageId: input.messageId, + blockId: input.blockId, + descriptor: { ...input.descriptor, serverName: bound.serverName }, + toolInput: input.toolInput, + html, + csp: normalizeCsp(uiMeta?.csp), + permissions: normalizePermissions(uiMeta?.permissions), + prefersBorder: + typeof uiMeta?.prefersBorder === 'boolean' ? uiMeta.prefersBorder : undefined, + advisoryDomain: normalizeAdvisoryDomain(uiMeta?.domain), + validateLive: () => this.deps.validateSource(input) + }) - return { - instanceId: instance.instanceId, - sandboxUrl: `${MCP_APP_SCHEME}://${instance.instanceId}/sandbox.html`, - html: instance.html, - sandbox: 'allow-scripts allow-same-origin', - tool, - csp: instance.csp, - permissions: instance.permissions, - prefersBorder: instance.prefersBorder, - advisoryDomain: instance.advisoryDomain, - expiresAt: instance.expiresAt + return { + instanceId: instance.instanceId, + sandboxUrl: `${MCP_APP_SCHEME}://${instance.instanceId}/sandbox.html`, + html: instance.html, + sandbox: 'allow-scripts allow-same-origin', + tool, + csp: instance.csp, + permissions: instance.permissions, + prefersBorder: instance.prefersBorder, + advisoryDomain: instance.advisoryDomain, + expiresAt: instance.expiresAt + } + } finally { + this.deps.registry.cancelCreation(creationId) } } @@ -539,7 +558,7 @@ export class McpAppHost implements McpAppHostPort { } this.assertLiveInstance(instanceId, context) await this.assertDescriptorCurrent(instance.descriptor) - await shell.openExternal(normalizedUrl) + await this.deps.desktop.openExternal(normalizedUrl, context) return true } @@ -700,18 +719,19 @@ export class McpAppHost implements McpAppHostPort { } private isToolAllowedByPluginPolicy(serverName: string, toolName: string): boolean { - const policy = resolvePluginToolPolicy(serverName, toolName) + const policy = this.deps.toolPolicies.resolve(serverName, toolName) return !policy.managed || policy.decision === 'allow' || policy.decision === 'ask' } private async findListedResourceUiMeta( client: BoundServer['client'], - resourceUri: string + resourceUri: string, + signal: AbortSignal ): Promise | undefined> { try { let cursor: string | undefined for (let page = 0; page < MAX_RESOURCE_LIST_PAGES; page += 1) { - const result = await client.listResourcesPage(cursor) + const result = await awaitWithAbort(client.listResourcesPage(cursor, signal), signal) const resource = result.resources.find((entry) => entry.uri === resourceUri) if (resource) { return readUiMeta(resource as Resource) @@ -723,6 +743,7 @@ export class McpAppHost implements McpAppHostPort { } return undefined } catch { + signal.throwIfAborted() return undefined } } diff --git a/src/main/mcp/apps/sandboxProtocol.ts b/src/main/mcp/apps/sandboxProtocol.ts index 4169786528..d322a5765e 100644 --- a/src/main/mcp/apps/sandboxProtocol.ts +++ b/src/main/mcp/apps/sandboxProtocol.ts @@ -1,9 +1,19 @@ -import { protocol } from 'electron' -import type { McpAppCsp, McpAppPermissions } from '@shared/types/mcp' -import { MCP_APP_SCHEME, type McpAppSandboxRegistry } from './sandboxRegistry' +import { protocol, session, webContents, BrowserWindow, shell, type Session } from 'electron' +import type { McpAppConsentKind, McpAppCsp, McpAppPermissions } from '@shared/types/mcp' +import { + MCP_APP_SCHEME, + type McpAppSandboxRegistry, + type McpAppRouteContext, + type McpAppDesktopPort +} from './sandboxRegistry' let schemeRegistered = false +type McpAppSandboxPort = Pick< + McpAppSandboxRegistry, + 'getProtocolPolicy' | 'requestBrowserPermission' | 'revokeByWebContents' +> + const normalizeCspSource = (source: string): string | null => { const valid = Array.from(source).every((character) => { const codePoint = character.codePointAt(0) ?? 0 @@ -195,8 +205,9 @@ export function registerMcpAppScheme(): void { schemeRegistered = true } -export function registerMcpAppProtocol(registry: McpAppSandboxRegistry): void { - protocol.handle(MCP_APP_SCHEME, (request) => { +export function registerMcpAppProtocol(registry: McpAppSandboxPort): McpAppDesktopPort { + const observedOwners = new Set() + protocol.handle(MCP_APP_SCHEME, async (request) => { let instanceId = '' try { const url = new URL(request.url) @@ -211,8 +222,14 @@ export function registerMcpAppProtocol(registry: McpAppSandboxRegistry): void { }) } - const instance = registry.getForProtocol(instanceId) - if (!instance) { + let policy: Awaited> = null + try { + policy = await registry.getProtocolPolicy(instanceId) + if (policy) requireNativeOwner(policy.context) + } catch { + policy = null + } + if (!policy) { return new Response('MCP App instance expired', { status: 410, headers: { @@ -225,12 +242,166 @@ export function registerMcpAppProtocol(registry: McpAppSandboxRegistry): void { return new Response(createSandboxProxyHtml(), { headers: { 'Cache-Control': 'no-store', - 'Content-Security-Policy': buildMcpAppContentSecurityPolicy(instance.csp), + 'Content-Security-Policy': buildMcpAppContentSecurityPolicy(policy.csp), 'Content-Type': 'text/html; charset=utf-8', - 'Permissions-Policy': buildMcpAppPermissionsPolicy(instance.permissions), + 'Permissions-Policy': buildMcpAppPermissionsPolicy(policy.permissions), 'X-Content-Type-Options': 'nosniff' } }) }) - registry.configureDefaultSessionPermissions() + configureMcpAppSessionPermissions(registry) + return { + observeOwner: async (context) => { + const owner = requireNativeOwner(context) + if (!observedOwners.has(owner.id)) { + observedOwners.add(owner.id) + owner.once('destroyed', () => { + registry.revokeByWebContents(context.webContentsId) + observedOwners.delete(context.webContentsId) + }) + } + }, + openExternal: async (url, context) => { + requireNativeOwner(context) + await shell.openExternal(url) + } + } +} + +type PermissionRequestHandler = NonNullable[0]> +type PermissionCheckHandler = NonNullable[0]> +type ElectronPermission = + | Parameters[1] + | Parameters[1] + +const isFirstPartyRendererUrl = (value: string): boolean => { + try { + const url = new URL(value) + if (url.protocol === 'file:') { + return true + } + return ( + (url.protocol === 'http:' || url.protocol === 'https:') && + (url.hostname === 'localhost' || url.hostname === '127.0.0.1') + ) + } catch { + return false + } +} + +const parseMcpAppInstanceId = (value: string | undefined): string | null => { + if (!value) { + return null + } + try { + const url = new URL(value) + return url.protocol === `${MCP_APP_SCHEME}:` && url.hostname ? url.hostname : null + } catch { + return null + } +} + +const resolvePermissionKinds = ( + permission: ElectronPermission, + mediaTypes: string[] | undefined +): McpAppConsentKind[] => { + if (permission === 'geolocation') { + return ['geolocation'] + } + if (permission === 'clipboard-sanitized-write') { + return ['clipboard-write'] + } + if (permission !== 'media') { + return [] + } + const kinds: McpAppConsentKind[] = [] + if (mediaTypes?.includes('video')) { + kinds.push('camera') + } + if (mediaTypes?.includes('audio')) { + kinds.push('microphone') + } + return kinds +} + +const configuredSessions = new WeakMap() + +const requireNativeOwner = (context: McpAppRouteContext) => { + const owner = webContents.fromId(context.webContentsId) + if ( + !owner || + owner.isDestroyed() || + (BrowserWindow.fromWebContents(owner)?.id ?? null) !== context.windowId + ) + throw new Error('MCP App owner is unavailable') + return owner +} + +export function configureMcpAppSessionPermissions( + registry: McpAppSandboxPort, + target: Session = session.defaultSession +): void { + if (configuredSessions.get(target) === registry) return + configuredSessions.set(target, registry) + target.setPermissionRequestHandler((owner, permission, callback, details) => { + const requestingUrl = details.requestingUrl || owner.getURL() + const securityOrigin = + 'securityOrigin' in details && typeof details.securityOrigin === 'string' + ? details.securityOrigin + : undefined + const instanceId = parseMcpAppInstanceId(requestingUrl) ?? parseMcpAppInstanceId(securityOrigin) + if (!instanceId) { + const ownerUrl = owner.getURL() + callback(!isFirstPartyRendererUrl(ownerUrl) || isFirstPartyRendererUrl(requestingUrl)) + return + } + + const mediaTypes = + 'mediaTypes' in details && Array.isArray(details.mediaTypes) + ? details.mediaTypes.map(String) + : undefined + const kinds = resolvePermissionKinds(permission, mediaTypes) + if (kinds.length === 0) { + callback(false) + return + } + const context = { + webContentsId: owner.id, + windowId: BrowserWindow.fromWebContents(owner)?.id ?? null + } + let settled = false + const complete = (allowed: boolean): void => { + if (settled) return + settled = true + callback(allowed) + } + void registry + .requestBrowserPermission(instanceId, context, kinds) + .then((approved) => { + try { + requireNativeOwner(context) + complete(approved) + } catch { + complete(false) + } + }) + .catch(() => complete(false)) + }) + + target.setPermissionCheckHandler((owner, _permission, requestingOrigin, details) => { + const requestingUrl = + requestingOrigin || details.requestingUrl || details.securityOrigin || owner?.getURL() || '' + const instanceId = + parseMcpAppInstanceId(requestingUrl) ?? + parseMcpAppInstanceId(details.securityOrigin) ?? + parseMcpAppInstanceId(details.requestingUrl) + if (!instanceId) { + const ownerUrl = owner?.getURL() + return ( + !ownerUrl || !isFirstPartyRendererUrl(ownerUrl) || isFirstPartyRendererUrl(requestingUrl) + ) + } + // MCP App browser permissions are request-scoped; there is no standing grant to check. + return false + }) } diff --git a/src/main/mcp/apps/sandboxRegistry.ts b/src/main/mcp/apps/sandboxRegistry.ts index 5c7450cff2..0ab733c5e3 100644 --- a/src/main/mcp/apps/sandboxRegistry.ts +++ b/src/main/mcp/apps/sandboxRegistry.ts @@ -1,5 +1,4 @@ import { randomBytes, randomUUID } from 'node:crypto' -import { session, webContents, type Session } from 'electron' import type { McpAppConsentKind, McpAppConsentRequestPayload, @@ -14,12 +13,6 @@ const MAX_PENDING_CONSENTS = 64 const MAX_SANDBOX_INSTANCES = 64 const MAX_SANDBOX_INSTANCES_PER_WEB_CONTENTS = 32 -type PermissionRequestHandler = NonNullable[0]> -type PermissionCheckHandler = NonNullable[0]> -type ElectronPermission = - | Parameters[1] - | Parameters[1] - export const MCP_APP_SCHEME = 'mcp-app' export type McpAppRouteContext = { @@ -27,6 +20,11 @@ export type McpAppRouteContext = { windowId: number | null } +export type McpAppDesktopPort = { + observeOwner(context: McpAppRouteContext): Promise + openExternal(url: string, context: McpAppRouteContext): Promise +} + export type McpAppSandboxInstance = { instanceId: string webContentsId: number @@ -62,56 +60,6 @@ type ConsentPublisher = ( payload: { request: McpAppConsentRequestPayload; version: number } ) => void -const isFirstPartyRendererUrl = (value: string): boolean => { - try { - const url = new URL(value) - if (url.protocol === 'file:') { - return true - } - return ( - (url.protocol === 'http:' || url.protocol === 'https:') && - (url.hostname === 'localhost' || url.hostname === '127.0.0.1') - ) - } catch { - return false - } -} - -const parseMcpAppInstanceId = (value: string | undefined): string | null => { - if (!value) { - return null - } - try { - const url = new URL(value) - return url.protocol === `${MCP_APP_SCHEME}:` && url.hostname ? url.hostname : null - } catch { - return null - } -} - -const resolvePermissionKinds = ( - permission: ElectronPermission, - mediaTypes: string[] | undefined -): McpAppConsentKind[] => { - if (permission === 'geolocation') { - return ['geolocation'] - } - if (permission === 'clipboard-sanitized-write') { - return ['clipboard-write'] - } - if (permission !== 'media') { - return [] - } - const kinds: McpAppConsentKind[] = [] - if (mediaTypes?.includes('video')) { - kinds.push('camera') - } - if (mediaTypes?.includes('audio')) { - kinds.push('microphone') - } - return kinds -} - const hasDeclaredPermission = ( permissions: McpAppPermissions | undefined, kind: McpAppConsentKind @@ -134,15 +82,91 @@ export class McpAppSandboxRegistry { private readonly instances = new Map() private readonly liveValidators = new Map boolean>() private readonly pendingConsents = new Map() - private readonly observedWebContents = new Set() + private readonly creations = new Map< + string, + { context: McpAppRouteContext; serverId: string; controller: AbortController } + >() private publishConsent?: ConsentPublisher - private configuredSession: Session | null = null setConsentPublisher(publisher: ConsentPublisher): void { this.publishConsent = publisher } + reserveCreation(context: McpAppRouteContext, serverId: string): string { + this.pruneExpired() + const owned = + Array.from(this.instances.values()).filter( + (instance) => instance.webContentsId === context.webContentsId + ).length + + Array.from(this.creations.values()).filter( + (creation) => creation.context.webContentsId === context.webContentsId + ).length + if ( + this.instances.size + this.creations.size >= MAX_SANDBOX_INSTANCES || + owned >= MAX_SANDBOX_INSTANCES_PER_WEB_CONTENTS + ) + throw new Error('MCP App sandbox instance limit reached') + const id = randomUUID() + this.creations.set(id, { context: { ...context }, serverId, controller: new AbortController() }) + return id + } + + assertCreationCurrent(creationId: string): void { + if (!this.creations.has(creationId)) { + throw new Error('MCP App view creation is no longer active') + } + } + + cancelCreation(creationId: string): void { + const creation = this.creations.get(creationId) + this.creations.delete(creationId) + creation?.controller.abort(new Error('MCP App view creation is no longer active')) + } + + getCreationSignal(creationId: string): AbortSignal { + this.assertCreationCurrent(creationId) + return this.creations.get(creationId)!.controller.signal + } + + async getProtocolPolicy(instanceId: string): Promise<{ + context: McpAppRouteContext + csp?: McpAppCsp + permissions?: McpAppPermissions + } | null> { + const instance = this.getForProtocol(instanceId) + if (!instance) return null + return structuredClone({ + context: { webContentsId: instance.webContentsId, windowId: instance.windowId }, + csp: instance.csp, + permissions: instance.permissions + }) + } + + async requestBrowserPermission( + instanceId: string, + context: McpAppRouteContext, + kinds: readonly McpAppConsentKind[] + ): Promise { + const instance = this.getForProtocol(instanceId) + if ( + !instance || + instance.webContentsId !== context.webContentsId || + instance.windowId !== context.windowId || + kinds.length === 0 || + kinds.length > 4 || + kinds.some((kind) => !hasDeclaredPermission(instance.permissions, kind)) + ) + return false + const decisions = await Promise.all( + kinds.map((kind) => + this.requestConsent(instance, { kind, title: kind, detail: instance.descriptor.toolName }) + ) + ) + return decisions.every(Boolean) && this.getForProtocol(instanceId) === instance + } + create(input: { + creationId: string context: McpAppRouteContext conversationId: string messageId: string @@ -156,6 +180,14 @@ export class McpAppSandboxRegistry { advisoryDomain?: string validateLive(): boolean }): McpAppSandboxInstance { + this.assertCreationCurrent(input.creationId) + const creation = this.creations.get(input.creationId)! + if ( + creation.context.webContentsId !== input.context.webContentsId || + creation.context.windowId !== input.context.windowId || + creation.serverId !== input.descriptor.serverId + ) + throw new Error('MCP App creation binding changed') this.pruneExpired() const ownerInstanceCount = Array.from(this.instances.values()).filter( (instance) => instance.webContentsId === input.context.webContentsId @@ -184,20 +216,10 @@ export class McpAppSandboxRegistry { expiresAt: Date.now() + DEFAULT_INSTANCE_TTL_MS, toolAccessSuspended: false } + this.creations.delete(input.creationId) this.instances.set(instanceId, instance) this.liveValidators.set(instanceId, input.validateLive) - if (!this.observedWebContents.has(input.context.webContentsId)) { - const owner = webContents.fromId(input.context.webContentsId) - if (owner) { - this.observedWebContents.add(input.context.webContentsId) - owner.once('destroyed', () => { - this.revokeByWebContents(input.context.webContentsId) - this.observedWebContents.delete(input.context.webContentsId) - }) - } - } - return instance } @@ -247,6 +269,9 @@ export class McpAppSandboxRegistry { } revokeByWebContents(webContentsId: number): void { + for (const [id, creation] of this.creations) { + if (creation.context.webContentsId === webContentsId) this.cancelCreation(id) + } for (const instance of this.instances.values()) { if (instance.webContentsId === webContentsId) { this.revoke(instance.instanceId) @@ -255,6 +280,9 @@ export class McpAppSandboxRegistry { } revokeByServer(serverId: string): void { + for (const [id, creation] of this.creations) { + if (creation.serverId === serverId) this.cancelCreation(id) + } for (const instance of this.instances.values()) { if (instance.descriptor.serverId === serverId) { this.revoke(instance.instanceId) @@ -263,6 +291,7 @@ export class McpAppSandboxRegistry { } clear(): void { + for (const id of this.creations.keys()) this.cancelCreation(id) for (const instanceId of this.instances.keys()) { this.revoke(instanceId) } @@ -368,72 +397,6 @@ export class McpAppSandboxRegistry { return true } - configureDefaultSessionPermissions(target: Session = session.defaultSession): void { - if (this.configuredSession === target) { - return - } - this.configuredSession = target - - target.setPermissionRequestHandler((owner, permission, callback, details) => { - const requestingUrl = details.requestingUrl || owner.getURL() - const securityOrigin = - 'securityOrigin' in details && typeof details.securityOrigin === 'string' - ? details.securityOrigin - : undefined - const instanceId = - parseMcpAppInstanceId(requestingUrl) ?? parseMcpAppInstanceId(securityOrigin) - if (!instanceId) { - const ownerUrl = owner.getURL() - callback(!isFirstPartyRendererUrl(ownerUrl) || isFirstPartyRendererUrl(requestingUrl)) - return - } - - const instance = this.getForProtocol(instanceId) - const mediaTypes = - 'mediaTypes' in details && Array.isArray(details.mediaTypes) - ? details.mediaTypes.map(String) - : undefined - const kinds = resolvePermissionKinds(permission, mediaTypes) - if ( - !instance || - instance.webContentsId !== owner.id || - kinds.length === 0 || - kinds.some((kind) => !hasDeclaredPermission(instance.permissions, kind)) - ) { - callback(false) - return - } - void Promise.all( - kinds.map((kind) => - this.requestConsent(instance, { - kind, - title: kind, - detail: instance.descriptor.toolName - }) - ) - ) - .then((decisions) => callback(decisions.every(Boolean))) - .catch(() => callback(false)) - }) - - target.setPermissionCheckHandler((owner, _permission, requestingOrigin, details) => { - const requestingUrl = - requestingOrigin || details.requestingUrl || details.securityOrigin || owner?.getURL() || '' - const instanceId = - parseMcpAppInstanceId(requestingUrl) ?? - parseMcpAppInstanceId(details.securityOrigin) ?? - parseMcpAppInstanceId(details.requestingUrl) - if (!instanceId) { - const ownerUrl = owner?.getURL() - return ( - !ownerUrl || !isFirstPartyRendererUrl(ownerUrl) || isFirstPartyRendererUrl(requestingUrl) - ) - } - // MCP App browser permissions are request-scoped; there is no standing grant to check. - return false - }) - } - private pruneExpired(): void { const now = Date.now() for (const instance of this.instances.values()) { diff --git a/src/main/mcp/enterpriseIdentityManager.ts b/src/main/mcp/enterpriseIdentityManager.ts index d34c2e6237..3e3b9339b5 100644 --- a/src/main/mcp/enterpriseIdentityManager.ts +++ b/src/main/mcp/enterpriseIdentityManager.ts @@ -1,5 +1,4 @@ import { createHash, createPublicKey, randomBytes, verify as verifySignature } from 'node:crypto' -import { shell } from 'electron' import { CrossAppAccessProvider, discoverAndRequestJwtAuthGrant, @@ -20,7 +19,7 @@ import { import { MCP_OAUTH_CALLBACK_TIMEOUT_MS, MCP_OAUTH_REDIRECT_PORT } from './oauthConstants' import type { McpSettings } from './settings' import { - McpOAuthCredentialStore, + type McpOAuthCredentialStore, type McpEnterpriseIdentityCredential } from './oauthCredentialStore' @@ -43,6 +42,7 @@ type PendingEnterpriseFlow = { metadata: OpenIdMetadata callbackSession: OAuthLoopbackCallbackSession flowPromise?: Promise + assertActive(): void } type JwtHeader = { @@ -238,13 +238,55 @@ const statusError = (error: unknown): string => { export class McpEnterpriseIdentityManager { private readonly pendingFlows = new Map() private readonly statuses = new Map() + private stopped = false + private readonly generations = new Map() + + private invalidate(id?: string): void { + if (id) { + this.generations.set(id, (this.generations.get(id) ?? 0) + 1) + this.cancelPendingFlow(id) + this.statuses.delete(id) + } + } + + private captureOperation(id?: string): () => void { + const generation = id ? (this.generations.get(id) ?? 0) : 0 + const check = () => { + if (this.stopped || (id && generation !== (this.generations.get(id) ?? 0))) + throw new Error('MCP enterprise identity operation interrupted') + } + check() + return check + } + + private captureProfile(profile: McpEnterpriseIdentityProfile): () => void { + const check = this.captureOperation(profile.id) + const assertCurrent = () => { + check() + if (!sameProfileBinding(this.requireProfile(profile.id), profile)) + throw new Error('MCP enterprise identity profile changed') + } + assertCurrent() + return assertCurrent + } + + stop(): void { + this.stopped = true + for (const id of this.pendingFlows.keys()) this.cancelPendingFlow(id) + this.statuses.clear() + this.generations.clear() + } constructor( private readonly settings: McpSettings, private readonly store: McpOAuthCredentialStore, - private readonly publishEvent: DeepchatEventPublisher + private readonly publishEvent: DeepchatEventPublisher, + private readonly openExternal: (url: string) => Promise, + private readonly onProfileInvalidated?: ( + profileId: string, + assertCurrent: () => void + ) => Promise ) {} - listProfiles(): McpEnterpriseIdentityProfile[] { return this.settings.getEnterpriseIdentityProfiles().flatMap((profile) => { try { @@ -254,196 +296,273 @@ export class McpEnterpriseIdentityManager { } }) } - - saveProfile(input: McpEnterpriseIdentityProfile): McpEnterpriseIdentityProfile { + async saveProfile(input: McpEnterpriseIdentityProfile): Promise { const profile = this.normalizeProfile(input) - const profiles = this.listProfiles() - const existing = profiles.find((item) => item.id === profile.id) - if (existing && !sameProfileBinding(existing, profile)) { + const existing = this.listProfiles().find((item) => item.id === profile.id) + const bindingChanged = Boolean(existing && !sameProfileBinding(existing, profile)) + if (bindingChanged) { + this.invalidate(profile.id) this.cancelPendingFlow(profile.id) - this.store.clearEnterpriseProfileCredentials(profile.id) - this.statuses.delete(profile.id) } - const next = [...profiles.filter((item) => item.id !== profile.id), profile].sort((a, b) => - a.label.localeCompare(b.label) - ) - this.settings.setEnterpriseIdentityProfiles(next) - return profile + const assertCurrent = this.captureOperation(profile.id) + try { + if (bindingChanged) { + assertCurrent() + await this.store.clearEnterpriseProfileCredentials(profile.id) + } + assertCurrent() + const profiles = this.listProfiles() + const current = profiles.find((item) => item.id === profile.id) + if ( + bindingChanged && + (!current || !sameProfileBinding(existing!, current) || existing!.label !== current.label) + ) + throw new Error('MCP enterprise identity profile changed') + const next = [...profiles.filter((item) => item.id !== profile.id), profile].sort( + (left, right) => left.label.localeCompare(right.label) + ) + assertCurrent() + this.settings.setEnterpriseIdentityProfiles(next) + if (bindingChanged) { + this.statuses.delete(profile.id) + await this.onProfileInvalidated?.(profile.id, assertCurrent) + } + return profile + } finally { + assertCurrent() + } } - removeProfile(profileId: string): void { - this.cancelPendingFlow(profileId) - const next = this.listProfiles().filter((profile) => profile.id !== profileId) - this.settings.setEnterpriseIdentityProfiles(next) - this.store.clearEnterpriseProfileCredentials(profileId) - this.statuses.delete(profileId) + async removeProfile(profileId: string): Promise { + this.invalidate(profileId) + const assertCurrent = this.captureOperation(profileId) + try { + this.cancelPendingFlow(profileId) + assertCurrent() + await this.store.clearEnterpriseProfileCredentials(profileId) + assertCurrent() + assertCurrent() + this.settings.setEnterpriseIdentityProfiles( + this.listProfiles().filter((profile) => profile.id !== profileId) + ) + this.statuses.delete(profileId) + await this.onProfileInvalidated?.(profileId, assertCurrent) + } finally { + assertCurrent() + } } - - setClientSecret(profileId: string, secret: string): McpEnterpriseIdentityStatus { - const profile = this.requireProfile(profileId) - if (profile.clientAuthentication !== 'client_secret') { - throw new Error('Enterprise profile is not configured for client secret authentication') - } - if (!secret || secret.length > 8192) { - throw new Error('Enterprise identity client secret is invalid') - } - this.store.saveEnterpriseIdentityClientSecret( - profileKey('enterprise_identity_client_secret', profile), - { - profileId: profile.id, - issuer: profile.issuer, - clientId: profile.clientId, - secret + async setClientSecret(profileId: string, secret: string): Promise { + this.invalidate(profileId) + const assertCurrent = this.captureProfile(this.requireProfile(profileId)) + try { + const profile = this.requireProfile(profileId) + if (profile.clientAuthentication !== 'client_secret') { + throw new Error('Enterprise profile is not configured for client secret authentication') } - ) - return this.getStatus(profileId) + if (!secret || secret.length > 8192) { + throw new Error('Enterprise identity client secret is invalid') + } + assertCurrent() + await this.store.saveEnterpriseIdentityClientSecret( + profileKey('enterprise_identity_client_secret', profile), + { + profileId: profile.id, + issuer: profile.issuer, + clientId: profile.clientId, + secret + } + ) + assertCurrent() + return await this.getStatus(profileId) + } finally { + assertCurrent() + } } - - getStatus(profileId: string): McpEnterpriseIdentityStatus { - const profile = this.requireProfile(profileId) - const clientSecretConfigured = this.hasClientSecret(profile) - const pending = this.pendingFlows.get(profileId) - if (pending) { + async getStatus(profileId: string): Promise { + const assertCurrent = this.captureProfile(this.requireProfile(profileId)) + try { + const profile = this.requireProfile(profileId) + const clientSecretConfigured = await this.hasClientSecret(profile) + assertCurrent() + const pending = this.pendingFlows.get(profileId) + if (pending) { + return { + profileId, + state: 'authenticating', + authenticated: false, + persistent: await this.store.isPersistent(), + clientSecretConfigured + } + } + const credential = await this.loadIdentity(profile) + assertCurrent() + if (credential && (credential.expiresAt > Date.now() || Boolean(credential.refreshToken))) { + return { + profileId, + state: 'authenticated', + authenticated: true, + persistent: await this.store.isPersistent(), + clientSecretConfigured, + subjectLabel: credential.subjectLabel, + updatedAt: credential.updatedAt + } + } + const existing = this.statuses.get(profileId) + if (existing?.state === 'error') { + return existing + } return { profileId, - state: 'authenticating', + state: 'signed_out', authenticated: false, - persistent: this.store.isPersistent(), + persistent: await this.store.isPersistent(), clientSecretConfigured } - } - - const credential = this.loadIdentity(profile) - if (credential && (credential.expiresAt > Date.now() || Boolean(credential.refreshToken))) { - return { - profileId, - state: 'authenticated', - authenticated: true, - persistent: this.store.isPersistent(), - clientSecretConfigured, - subjectLabel: credential.subjectLabel, - updatedAt: credential.updatedAt - } - } - - const existing = this.statuses.get(profileId) - if (existing?.state === 'error') { - return existing - } - - return { - profileId, - state: 'signed_out', - authenticated: false, - persistent: this.store.isPersistent(), - clientSecretConfigured + } finally { + assertCurrent() } } - async startAuth(profileId: string): Promise { - const profile = this.requireProfile(profileId) - this.cancelPendingFlow(profileId) - let flow: PendingEnterpriseFlow | null = null - + this.invalidate(profileId) + const assertCurrent = this.captureProfile(this.requireProfile(profileId)) try { - const metadata = await this.discoverMetadata(profile) - const state = encodeBase64Url(randomBytes(24)) - const nonce = encodeBase64Url(randomBytes(24)) - const pkce = createPkcePair() - const callbackPath = `/mcp/enterprise/callback/${encodeBase64Url(randomBytes(12))}` - const callbackSession = await startOAuthLoopbackCallbackSession({ - expectedState: state, - path: callbackPath, - preferredPort: MCP_OAUTH_REDIRECT_PORT, - redirectHost: 'localhost', - timeoutMs: MCP_OAUTH_CALLBACK_TIMEOUT_MS, - invalidCallbackMessage: 'Invalid enterprise identity callback', - validateParameters: (parameters) => { - validateAuthorizationResponseIssuer({ - iss: parameters.get('iss') || undefined, - expectedIssuer: metadata.issuer, - issParameterSupported: metadata.authorization_response_iss_parameter_supported === true - }) + const profile = this.requireProfile(profileId) + this.cancelPendingFlow(profileId) + let flow: PendingEnterpriseFlow | null = null + let callbackSession: OAuthLoopbackCallbackSession | null = null + try { + const metadata = await this.discoverMetadata(profile) + assertCurrent() + const state = encodeBase64Url(randomBytes(24)) + const nonce = encodeBase64Url(randomBytes(24)) + const pkce = createPkcePair() + const callbackPath = `/mcp/enterprise/callback/${encodeBase64Url(randomBytes(12))}` + callbackSession = await startOAuthLoopbackCallbackSession({ + expectedState: state, + path: callbackPath, + preferredPort: MCP_OAUTH_REDIRECT_PORT, + redirectHost: 'localhost', + timeoutMs: MCP_OAUTH_CALLBACK_TIMEOUT_MS, + invalidCallbackMessage: 'Invalid enterprise identity callback', + validateParameters: (parameters) => { + validateAuthorizationResponseIssuer({ + iss: parameters.get('iss') || undefined, + expectedIssuer: metadata.issuer, + issParameterSupported: + metadata.authorization_response_iss_parameter_supported === true + }) + } + }) + assertCurrent() + const authorizationUrl = new URL(metadata.authorization_endpoint) + authorizationUrl.searchParams.set('client_id', profile.clientId) + authorizationUrl.searchParams.set('response_type', 'code') + authorizationUrl.searchParams.set('redirect_uri', callbackSession.redirectUri) + authorizationUrl.searchParams.set('scope', normalizeScopes(profile.scopes).join(' ')) + authorizationUrl.searchParams.set('state', state) + authorizationUrl.searchParams.set('nonce', nonce) + authorizationUrl.searchParams.set('code_challenge', pkce.challenge) + authorizationUrl.searchParams.set('code_challenge_method', 'S256') + flow = { + profile, + state, + nonce, + codeVerifier: pkce.verifier, + redirectUri: callbackSession.redirectUri, + metadata, + callbackSession, + assertActive: assertCurrent } - }) - const authorizationUrl = new URL(metadata.authorization_endpoint) - authorizationUrl.searchParams.set('client_id', profile.clientId) - authorizationUrl.searchParams.set('response_type', 'code') - authorizationUrl.searchParams.set('redirect_uri', callbackSession.redirectUri) - authorizationUrl.searchParams.set('scope', normalizeScopes(profile.scopes).join(' ')) - authorizationUrl.searchParams.set('state', state) - authorizationUrl.searchParams.set('nonce', nonce) - authorizationUrl.searchParams.set('code_challenge', pkce.challenge) - authorizationUrl.searchParams.set('code_challenge_method', 'S256') - - flow = { - profile, - state, - nonce, - codeVerifier: pkce.verifier, - redirectUri: callbackSession.redirectUri, - metadata, - callbackSession + assertCurrent() + this.pendingFlows.set(profileId, flow) + await this.setStatus( + { + profileId, + state: 'authenticating', + authenticated: false, + persistent: await this.store.isPersistent() + }, + assertCurrent + ) + assertCurrent() + flow.flowPromise = callbackSession + .waitForCallback() + .then(async (callback) => await this.finishAuth(flow!, callback.code)) + .catch(async (error) => await this.failAuth(flow!, error)) + assertCurrent() + await this.openExternal(authorizationUrl.toString()) + assertCurrent() + return await this.getStatus(profileId) + } catch (error) { + callbackSession?.close() + assertCurrent() + if (flow && this.pendingFlows.get(flow.profile.id) === flow) + this.cancelPendingFlow(flow.profile.id) + await this.setStatus( + { + profileId, + state: 'error', + authenticated: false, + persistent: await this.store.isPersistent(), + error: statusError(error) + }, + assertCurrent + ) + assertCurrent() + return await this.getStatus(profileId) } - this.pendingFlows.set(profileId, flow) - this.setStatus({ - profileId, - state: 'authenticating', - authenticated: false, - persistent: this.store.isPersistent() - }) - flow.flowPromise = callbackSession - .waitForCallback() - .then((callback) => this.finishAuth(flow!, callback.code)) - .catch((error) => this.failAuth(flow!, error)) - - await shell.openExternal(authorizationUrl.toString()) - return this.getStatus(profileId) - } catch (error) { - if (flow) { - this.cancelPendingFlow(flow.profile.id) - } - this.setStatus({ - profileId, - state: 'error', - authenticated: false, - persistent: this.store.isPersistent(), - error: statusError(error) - }) - return this.getStatus(profileId) + } finally { + assertCurrent() } } - async completeAuthFromCallbackUrl( profileId: string, callbackUrl: string ): Promise { - const flow = this.pendingFlows.get(profileId) - if (!flow) { - return this.getStatus(profileId) - } - const resolution = flow.callbackSession.resolveCallbackUrl(callbackUrl) - if (resolution.kind === 'not-found') { - this.failAuth(flow, new Error('Enterprise identity callback URL is invalid')) - return this.getStatus(profileId) + const assertCurrent = this.captureProfile(this.requireProfile(profileId)) + try { + const flow = this.pendingFlows.get(profileId) + if (!flow) { + return await this.getStatus(profileId) + } + const resolution = flow.callbackSession.resolveCallbackUrl(callbackUrl) + if (resolution.kind === 'not-found') { + await this.failAuth(flow, new Error('Enterprise identity callback URL is invalid')) + assertCurrent() + return await this.getStatus(profileId) + } + await flow.flowPromise + assertCurrent() + return await this.getStatus(profileId) + } finally { + assertCurrent() } - await flow.flowPromise - return this.getStatus(profileId) } - - logout(profileId: string): McpEnterpriseIdentityStatus { - const profile = this.requireProfile(profileId) - this.cancelPendingFlow(profileId) - this.store.clearEntry(profileKey('enterprise_identity', profile)) - this.setStatus({ - profileId, - state: 'signed_out', - authenticated: false, - persistent: this.store.isPersistent() - }) - return this.getStatus(profileId) + async logout(profileId: string): Promise { + this.invalidate(profileId) + const assertCurrent = this.captureProfile(this.requireProfile(profileId)) + try { + const profile = this.requireProfile(profileId) + this.cancelPendingFlow(profileId) + assertCurrent() + await this.store.clearEntry(profileKey('enterprise_identity', profile)) + assertCurrent() + await this.setStatus( + { + profileId, + state: 'signed_out', + authenticated: false, + persistent: await this.store.isPersistent() + }, + assertCurrent + ) + assertCurrent() + await this.onProfileInvalidated?.(profileId, assertCurrent) + return await this.getStatus(profileId) + } finally { + assertCurrent() + } } - async createCrossAppProvider( config: MCPServerConfig, targetClientSecret: string, @@ -455,25 +574,30 @@ export class McpEnterpriseIdentityManager { throw new Error('Enterprise authorization profile and target client ID are required') } const profile = this.requireProfile(profileId) - + this.captureProfile(profile) return new CrossAppAccessProvider({ clientId: targetClientId, clientSecret: targetClientSecret, clientName: 'DeepChat', expectedIssuer, assertion: async (context) => { + const assertProfileCurrent = this.captureProfile(profile) + assertProfileCurrent() const identity = await this.getValidIdentity(profile) + assertProfileCurrent() const idpClientSecret = profile.clientAuthentication === 'client_secret' - ? this.store.loadEnterpriseIdentityClientSecret( + ? (await this.store.loadEnterpriseIdentityClientSecret( profileKey('enterprise_identity_client_secret', profile) - ) || undefined + )) || undefined : undefined + assertProfileCurrent() if (profile.clientAuthentication === 'client_secret' && !idpClientSecret) { throw new Error('Enterprise identity client secret is not configured') } const fetchFn: FetchLike = (input, init) => context.fetchFn(input, { ...init, redirect: 'error' }) + assertProfileCurrent() const grant = await discoverAndRequestJwtAuthGrant({ idpUrl: profile.issuer, audience: context.authorizationServerUrl, @@ -484,56 +608,79 @@ export class McpEnterpriseIdentityManager { scope: context.scope, fetchFn }) + assertProfileCurrent() return grant.jwtAuthGrant } }) } - private async finishAuth(flow: PendingEnterpriseFlow, code: string): Promise { + if (this.stopped || this.pendingFlows.get(flow.profile.id) !== flow) return + const assertCurrent = flow.assertActive try { - if (this.pendingFlows.get(flow.profile.id) !== flow) { - return - } const credential = await this.exchangeAuthorizationCode(flow, code) + assertCurrent() if ( this.pendingFlows.get(flow.profile.id) !== flow || !sameProfileBinding(this.requireProfile(flow.profile.id), flow.profile) - ) { + ) return - } - const existing = this.loadIdentity(flow.profile) - if (existing && existing.subject !== credential.subject) { + const existing = await this.loadIdentity(flow.profile) + assertCurrent() + if (existing && existing.subject !== credential.subject) throw new Error('A different enterprise subject is already signed in; sign out first') - } - this.store.saveEnterpriseIdentity(profileKey('enterprise_identity', flow.profile), credential) + assertCurrent() + await this.store.saveEnterpriseIdentity( + profileKey('enterprise_identity', flow.profile), + credential + ) + assertCurrent() + const persistent = await this.store.isPersistent() + assertCurrent() + if (this.pendingFlows.get(flow.profile.id) !== flow) return this.pendingFlows.delete(flow.profile.id) flow.callbackSession.close() - this.setStatus({ - profileId: flow.profile.id, - state: 'authenticated', - authenticated: true, - persistent: this.store.isPersistent(), - subjectLabel: credential.subjectLabel, - updatedAt: Date.now() - }) + await this.setStatus( + { + profileId: flow.profile.id, + state: 'authenticated', + authenticated: true, + persistent, + subjectLabel: credential.subjectLabel, + updatedAt: Date.now() + }, + assertCurrent + ) + assertCurrent() } catch (error) { - this.failAuth(flow, error) + await this.failAuth(flow, error) + assertCurrent() } } - private failAuth(flow: PendingEnterpriseFlow, error: unknown): void { - if (this.pendingFlows.get(flow.profile.id) !== flow) { - return + private async failAuth(flow: PendingEnterpriseFlow, error: unknown): Promise { + if (this.stopped || this.pendingFlows.get(flow.profile.id) !== flow) return + const assertCurrent = flow.assertActive + try { + const persistent = await this.store.isPersistent() + assertCurrent() + if (this.pendingFlows.get(flow.profile.id) !== flow) return + this.pendingFlows.delete(flow.profile.id) + flow.callbackSession.close() + await this.setStatus( + { + profileId: flow.profile.id, + state: 'error', + authenticated: false, + persistent, + error: statusError(error) + }, + assertCurrent + ) + assertCurrent() + } catch (failure) { + if (this.stopped || this.pendingFlows.get(flow.profile.id) !== flow) return + throw failure } - this.pendingFlows.delete(flow.profile.id) - flow.callbackSession.close() - this.setStatus({ - profileId: flow.profile.id, - state: 'error', - authenticated: false, - persistent: this.store.isPersistent(), - error: statusError(error) - }) } private cancelPendingFlow(profileId: string): void { @@ -544,25 +691,25 @@ export class McpEnterpriseIdentityManager { this.pendingFlows.delete(profileId) flow.callbackSession.close() } - - private setStatus( + private async setStatus( status: Omit & { clientSecretConfigured?: boolean - } - ): void { + }, + assertCurrent: () => void + ): Promise { const profile = this.listProfiles().find((item) => item.id === status.profileId) const next = { ...status, - clientSecretConfigured: profile ? this.hasClientSecret(profile) : false, + clientSecretConfigured: profile ? await this.hasClientSecret(profile) : false, updatedAt: status.updatedAt || Date.now() } + assertCurrent() this.statuses.set(status.profileId, next) this.publishEvent('mcp.enterprise.auth.changed', { status: next, version: Date.now() }) } - private requireProfile(profileId: string): McpEnterpriseIdentityProfile { const profile = this.listProfiles().find((item) => item.id === profileId) if (!profile) { @@ -570,7 +717,6 @@ export class McpEnterpriseIdentityManager { } return profile } - private normalizeProfile(input: McpEnterpriseIdentityProfile): McpEnterpriseIdentityProfile { const profile = { id: input.id.trim(), @@ -591,18 +737,16 @@ export class McpEnterpriseIdentityManager { } return profile } - - private hasClientSecret(profile: McpEnterpriseIdentityProfile): boolean { + private async hasClientSecret(profile: McpEnterpriseIdentityProfile): Promise { if (profile.clientAuthentication !== 'client_secret') { return false } return Boolean( - this.store.loadEnterpriseIdentityClientSecret( + await this.store.loadEnterpriseIdentityClientSecret( profileKey('enterprise_identity_client_secret', profile) ) ) } - private async discoverMetadata(profile: McpEnterpriseIdentityProfile): Promise { const issuer = new URL(profile.issuer) const issuerPath = issuer.pathname === '/' ? '' : issuer.pathname.replace(/\/$/, '') @@ -644,11 +788,13 @@ export class McpEnterpriseIdentityManager { } return metadata as OpenIdMetadata } - private async exchangeAuthorizationCode( flow: PendingEnterpriseFlow, code: string ): Promise> { + const assertCurrent = flow.assertActive + assertCurrent() + const parameters = new URLSearchParams({ grant_type: 'authorization_code', code, @@ -660,7 +806,8 @@ export class McpEnterpriseIdentityManager { Accept: 'application/json', 'Content-Type': 'application/x-www-form-urlencoded' }) - this.applyIdpClientAuthentication(flow.profile, flow.metadata, parameters, headers) + await this.applyIdpClientAuthentication(flow.profile, flow.metadata, parameters, headers) + assertCurrent() const response = await fetch(flow.metadata.token_endpoint, { method: 'POST', headers, @@ -668,10 +815,12 @@ export class McpEnterpriseIdentityManager { redirect: 'error', signal: AbortSignal.timeout(OIDC_REQUEST_TIMEOUT_MS) }) + assertCurrent() if (!response.ok) { throw new Error(`Enterprise identity token exchange failed (${response.status})`) } const tokens = await readIdentityTokenResponse(response, 'Enterprise identity token response') + assertCurrent() if (!tokens.idToken) { throw new Error('Enterprise identity response did not include an ID token') } @@ -681,6 +830,7 @@ export class McpEnterpriseIdentityManager { flow.metadata, flow.nonce ) + assertCurrent() return { profileId: flow.profile.id, issuer: flow.profile.issuer, @@ -697,99 +847,113 @@ export class McpEnterpriseIdentityManager { scope: tokens.scope } } - - private applyIdpClientAuthentication( + private async applyIdpClientAuthentication( profile: McpEnterpriseIdentityProfile, metadata: OpenIdMetadata, parameters: URLSearchParams, headers: Headers - ): void { - if (profile.clientAuthentication === 'none') { - return - } - const secret = this.store.loadEnterpriseIdentityClientSecret( - profileKey('enterprise_identity_client_secret', profile) - ) - if (!secret) { - throw new Error('Enterprise identity client secret is not configured') - } - const methods = metadata.token_endpoint_auth_methods_supported || ['client_secret_basic'] - if (methods.includes('client_secret_basic')) { - headers.set( - 'Authorization', - `Basic ${Buffer.from( - `${encodeFormComponent(profile.clientId)}:${encodeFormComponent(secret)}` - ).toString('base64')}` + ): Promise { + const assertCurrent = this.captureProfile(profile) + try { + if (profile.clientAuthentication === 'none') { + return + } + const secret = await this.store.loadEnterpriseIdentityClientSecret( + profileKey('enterprise_identity_client_secret', profile) ) - return - } - if (methods.includes('client_secret_post')) { - parameters.set('client_secret', secret) - return + assertCurrent() + if (!secret) { + throw new Error('Enterprise identity client secret is not configured') + } + const methods = metadata.token_endpoint_auth_methods_supported || ['client_secret_basic'] + if (methods.includes('client_secret_basic')) { + headers.set( + 'Authorization', + `Basic ${Buffer.from(`${encodeFormComponent(profile.clientId)}:${encodeFormComponent(secret)}`).toString('base64')}` + ) + return + } + if (methods.includes('client_secret_post')) { + parameters.set('client_secret', secret) + return + } + throw new Error('Enterprise identity provider does not support the configured client auth') + } finally { + assertCurrent() } - throw new Error('Enterprise identity provider does not support the configured client auth') } - private async getValidIdentity( profile: McpEnterpriseIdentityProfile ): Promise { - const current = this.loadIdentity(profile) - if (!current) { - throw new Error('Enterprise identity sign-in is required') - } - if (current.expiresAt > Date.now() + 60_000) { - return current - } - if (!current.refreshToken) { - throw new Error('Enterprise identity sign-in has expired') + const assertCurrent = this.captureProfile(profile) + try { + const current = await this.loadIdentity(profile) + assertCurrent() + if (!current) { + throw new Error('Enterprise identity sign-in is required') + } + if (current.expiresAt > Date.now() + 60000) { + return current + } + if (!current.refreshToken) { + throw new Error('Enterprise identity sign-in has expired') + } + const metadata = await this.discoverMetadata(profile) + assertCurrent() + const parameters = new URLSearchParams({ + grant_type: 'refresh_token', + refresh_token: current.refreshToken, + client_id: profile.clientId + }) + const headers = new Headers({ + Accept: 'application/json', + 'Content-Type': 'application/x-www-form-urlencoded' + }) + await this.applyIdpClientAuthentication(profile, metadata, parameters, headers) + assertCurrent() + const response = await fetch(metadata.token_endpoint, { + method: 'POST', + headers, + body: parameters, + redirect: 'error', + signal: AbortSignal.timeout(OIDC_REQUEST_TIMEOUT_MS) + }) + assertCurrent() + if (!response.ok) { + throw new Error(`Enterprise identity refresh failed (${response.status})`) + } + const tokens = await readIdentityTokenResponse( + response, + 'Enterprise identity refresh response' + ) + assertCurrent() + const idToken = tokens.idToken || current.idToken + const payload = await this.verifyIdToken(idToken, profile, metadata) + assertCurrent() + if (payload.sub !== current.subject) { + throw new Error('Enterprise identity subject changed during refresh') + } + assertCurrent() + return await this.store.saveEnterpriseIdentity(profileKey('enterprise_identity', profile), { + ...current, + idToken, + accessToken: tokens.accessToken || current.accessToken, + refreshToken: tokens.refreshToken || current.refreshToken, + expiresAt: Math.min( + (payload.exp || Math.floor(Date.now() / 1000) + 300) * 1000, + Date.now() + tokens.expiresInSeconds * 1000 + ), + scope: tokens.scope || current.scope + }) + } finally { + assertCurrent() } - - const metadata = await this.discoverMetadata(profile) - const parameters = new URLSearchParams({ - grant_type: 'refresh_token', - refresh_token: current.refreshToken, - client_id: profile.clientId - }) - const headers = new Headers({ - Accept: 'application/json', - 'Content-Type': 'application/x-www-form-urlencoded' - }) - this.applyIdpClientAuthentication(profile, metadata, parameters, headers) - const response = await fetch(metadata.token_endpoint, { - method: 'POST', - headers, - body: parameters, - redirect: 'error', - signal: AbortSignal.timeout(OIDC_REQUEST_TIMEOUT_MS) - }) - if (!response.ok) { - throw new Error(`Enterprise identity refresh failed (${response.status})`) - } - const tokens = await readIdentityTokenResponse(response, 'Enterprise identity refresh response') - const idToken = tokens.idToken || current.idToken - const payload = await this.verifyIdToken(idToken, profile, metadata) - if (payload.sub !== current.subject) { - throw new Error('Enterprise identity subject changed during refresh') - } - return this.store.saveEnterpriseIdentity(profileKey('enterprise_identity', profile), { - ...current, - idToken, - accessToken: tokens.accessToken || current.accessToken, - refreshToken: tokens.refreshToken || current.refreshToken, - expiresAt: Math.min( - (payload.exp || Math.floor(Date.now() / 1000) + 300) * 1000, - Date.now() + tokens.expiresInSeconds * 1000 - ), - scope: tokens.scope || current.scope - }) } - - private loadIdentity( + private async loadIdentity( profile: McpEnterpriseIdentityProfile - ): McpEnterpriseIdentityCredential | null { - return this.store.loadEnterpriseIdentity(profileKey('enterprise_identity', profile)) + ): Promise { + return await this.store.loadEnterpriseIdentity(profileKey('enterprise_identity', profile)) } - private async verifyIdToken( token: string, profile: McpEnterpriseIdentityProfile, @@ -834,11 +998,11 @@ export class McpEnterpriseIdentityManager { (payload.iat != null && (typeof payload.iat !== 'number' || !Number.isSafeInteger(payload.iat) || - payload.iat * 1000 > now + 60_000)) || + payload.iat * 1000 > now + 60000)) || (payload.nbf != null && (typeof payload.nbf !== 'number' || !Number.isSafeInteger(payload.nbf) || - payload.nbf * 1000 > now + 60_000)) || + payload.nbf * 1000 > now + 60000)) || (expectedNonce != null && payload.nonce !== expectedNonce) ) { throw new Error('Enterprise identity ID token claims are invalid') @@ -852,7 +1016,6 @@ export class McpEnterpriseIdentityManager { ) { throw new Error('Enterprise identity ID token authorized party is invalid') } - const jwksResponse = await fetch(metadata.jwks_uri, { headers: { Accept: 'application/json' }, redirect: 'error', @@ -861,10 +1024,9 @@ export class McpEnterpriseIdentityManager { if (!jwksResponse.ok) { throw new Error(`Enterprise identity JWKS request failed (${jwksResponse.status})`) } - const jwks = await readBoundedJson<{ keys?: Array> }>( - jwksResponse, - 'Enterprise identity JWKS' - ) + const jwks = await readBoundedJson<{ + keys?: Array> + }>(jwksResponse, 'Enterprise identity JWKS') if (!Array.isArray(jwks.keys) || jwks.keys.length > MAX_JWKS_KEYS) { throw new Error('Enterprise identity JWKS is invalid') } diff --git a/src/main/mcp/index.ts b/src/main/mcp/index.ts index 3ed248e506..a6b72e1391 100644 --- a/src/main/mcp/index.ts +++ b/src/main/mcp/index.ts @@ -1,3 +1,4 @@ +import type { McpOAuthCredentialStore } from './oauthCredentialStore' import type { ProviderSettingsPort } from '@/provider/settings' import logger from '@shared/logger' import { performance } from 'node:perf_hooks' @@ -35,6 +36,7 @@ import { import type { ToolCallImagePreview } from '@shared/types/core/mcp' import type { ProviderRuntimePort } from '@shared/types/provider' import { ServerManager } from './serverManager' +import type { McpClientRuntime } from './mcpClient' import type { McpClient as RuntimeMcpClient } from './mcpClient' import { ToolManager, type ComputerUsePreviewObserver } from './toolManager' import { McpRouterManager } from './mcprouterManager' @@ -54,8 +56,9 @@ import type { SemanticNotificationPublisher } from '@/notifications' import { McpSettings } from './settings' import type { PermissionMode } from '@shared/types/agent-interface' import type { ToolPermissionBroker } from '@/tool/permission' -import type { McpAppSandboxRegistry } from './apps/sandboxRegistry' +import type { McpAppSandboxRegistry, McpAppDesktopPort } from './apps/sandboxRegistry' import { McpAppHost } from './apps/appHost' +import type { PluginToolPolicyStore } from '@/plugin/toolPolicyStore' import { hasMcpIdentityBearingChange } from './serverIdentity' import type { CacheImageOptions } from '@/platform/imageCache' import { awaitWithAbort } from '@/lib/awaitWithAbort' @@ -170,11 +173,17 @@ export class McpService implements McpServicePort { onRegistryChanged: () => void, semanticNotifications: SemanticNotificationPublisher, private readonly publishEvent: DeepchatEventPublisher, + toolPolicies: Pick, + runtime: Pick & { + getProxyUrl(): Promise + }, + oauth: { store: McpOAuthCredentialStore; openExternal(url: string): Promise }, cacheImage?: (data: string, options?: CacheImageOptions) => Promise, pluginRuntimeSupervisor?: PluginRuntimeSupervisor, computerUsePreviewObserver?: ComputerUsePreviewObserver, mcpApps?: { registry: McpAppSandboxRegistry + desktop: McpAppDesktopPort permissionBroker: ToolPermissionBroker getPermissionMode(conversationId: string): Promise validateSource(input: { @@ -209,9 +218,18 @@ export class McpService implements McpServicePort { this.pluginRuntimeSupervisor = pluginRuntimeSupervisor ?? new PluginRuntimeSupervisor() this.mcpAppSandboxRegistry = mcpApps?.registry this.mcpOAuthManager = new McpOAuthManager( - undefined, + oauth.store, + oauth.openExternal, this.publishEvent, - (serverName) => this.restartServerAfterAuthentication(serverName), + async (serverId, action, assertCurrent) => { + const { name } = await this.requireServerById(serverId) + assertCurrent() + if (action === 'restart') await this.restartServerAfterAuthentication(name, assertCurrent) + else if (this.pluginRuntimeSupervisor.ownsServer(name)) + await this.pluginRuntimeSupervisor.requestExternalStop(name, assertCurrent) + else if (this.serverManager.isServerActive(name)) await this.stopServer(name) + assertCurrent() + }, this.mcpSettings, (serverId) => { this.revokeMcpAppsByServer(serverId) @@ -223,6 +241,9 @@ export class McpService implements McpServicePort { this.privacy, inMemoryServerFactory, { + homeDirectory: runtime.homeDirectory, + appVersion: runtime.appVersion, + toolchains: runtime.toolchains, sampling: this, resolveMcpBindings: (config) => this.mcpSettings.getMcpVariableBindings(config), elicitation: this, @@ -232,12 +253,14 @@ export class McpService implements McpServicePort { () => this.handleRegistryChanged(), semanticNotifications, this.publishEvent, + runtime.getProxyUrl, this.mcpOAuthManager ) this.toolManager = new ToolManager( agentSettings, this.mcpSettings, this.serverManager, + toolPolicies, semanticNotifications, this.publishEvent, { @@ -255,10 +278,12 @@ export class McpService implements McpServicePort { ) this.appHost = mcpApps ? new McpAppHost({ + toolPolicies, settings: this.mcpSettings, serverManager: this.serverManager, permissionBroker: mcpApps.permissionBroker, registry: mcpApps.registry, + desktop: mcpApps.desktop, ensureServerRunning: async (serverName) => { if (this.pluginRuntimeSupervisor.ownsServer(serverName)) { await this.pluginRuntimeSupervisor.ensureRunning(serverName, 'external') @@ -424,6 +449,7 @@ export class McpService implements McpServicePort { return this.shutdownPromise } + this.mcpOAuthManager.stop() this.shutdownPromise = this.shutdownRunningClients() try { await this.shutdownPromise @@ -539,12 +565,21 @@ export class McpService implements McpServicePort { } } - private async restartServerAfterAuthentication(serverName: string): Promise { + private async restartServerAfterAuthentication( + serverName: string, + assertCurrent: () => void + ): Promise { try { - if (await this.pluginRuntimeSupervisor.restartIfRunning(serverName, 'authentication')) { - return - } + assertCurrent() + const restarted = await this.pluginRuntimeSupervisor.restartIfRunning( + serverName, + 'authentication', + assertCurrent + ) + assertCurrent() + if (restarted) return const servers = await this.mcpSettings.getMcpServers() + assertCurrent() const serverConfig = servers[serverName] if (this.isPluginOwnedServerConfig(serverConfig)) { console.warn( @@ -552,13 +587,21 @@ export class McpService implements McpServicePort { ) return } - if (!serverConfig?.enabled) { - return - } + if (this.serverManager.isServerActive(serverName)) await this.stopServer(serverName) + assertCurrent() + if (!serverConfig?.enabled) return const connectResult = await this.serverManager.startServer(serverName, { - onBackgroundConnected: () => this.emitServerStarted(serverName) + onBackgroundConnected: () => { + try { + assertCurrent() + } catch { + return + } + this.emitServerStarted(serverName) + } }) + assertCurrent() if (connectResult === 'connected') { this.emitServerStarted(serverName) } @@ -685,7 +728,7 @@ export class McpService implements McpServicePort { updatedServerCount > 0 ? servers : undefined ) for (const serverId of invalidatedServerIds) { - this.mcpOAuthManager.clearServerCredentials(serverId) + await this.mcpOAuthManager.clearServerCredentials(serverId) } logger.info(`Synchronized Authorization for ${updatedServerCount} mcprouter servers`) } @@ -869,7 +912,7 @@ export class McpService implements McpServicePort { previousConfig?.serverId && updatedConfig?.configGeneration !== previousConfig.configGeneration ) { - this.mcpOAuthManager.clearServerCredentials(previousConfig.serverId) + await this.mcpOAuthManager.clearServerCredentials(previousConfig.serverId) } // If server was previously running, restart it to apply new configuration @@ -907,7 +950,7 @@ export class McpService implements McpServicePort { const servers = await this.mcpSettings.getMcpServers() const persistedServerId = servers[serverName]?.serverId if (persistedServerId) { - this.mcpOAuthManager.clearServerCredentials(persistedServerId) + await this.mcpOAuthManager.clearServerCredentials(persistedServerId) } await this.mcpSettings.removeMcpServer(serverName) } @@ -1036,7 +1079,7 @@ export class McpService implements McpServicePort { binding: McpCredentialBinding, credential: McpCredentialInput ): Promise { - const { name, config } = await this.requireCurrentCredentialBinding(binding) + const { config } = await this.requireCurrentCredentialBinding(binding) const expectedKind: McpCredentialKind = config.authorization?.mode === 'private_key_jwt' ? 'private_key' @@ -1052,8 +1095,7 @@ export class McpService implements McpServicePort { ) { throw new Error('MCP private key algorithm does not match the server configuration') } - const status = this.mcpOAuthManager.setCredential(binding, credential) - await this.restartServerAfterAuthentication(name) + const status = await this.mcpOAuthManager.setCredential(binding, credential) return status } @@ -1061,12 +1103,8 @@ export class McpService implements McpServicePort { binding: McpCredentialBinding, kind: McpCredentialKind ): Promise { - const { name } = await this.requireCurrentCredentialBinding(binding) - const status = this.mcpOAuthManager.removeCredential(binding, kind) - if (this.serverManager.isServerRunning(name)) { - await this.stopServer(name) - } - return status + await this.requireCurrentCredentialBinding(binding) + return this.mcpOAuthManager.removeCredential(binding, kind) } listMcpEnterpriseProfiles(): Promise { @@ -1076,7 +1114,7 @@ export class McpService implements McpServicePort { saveMcpEnterpriseProfile( profile: McpEnterpriseIdentityProfile ): Promise { - return Promise.resolve(this.mcpOAuthManager.saveEnterpriseProfile(profile)) + return this.mcpOAuthManager.saveEnterpriseProfile(profile) } async removeMcpEnterpriseProfile(profileId: string): Promise { @@ -1086,13 +1124,13 @@ export class McpService implements McpServicePort { continue } if (config.serverId) { - this.mcpOAuthManager.clearServerCredentials(config.serverId) + await this.mcpOAuthManager.clearServerCredentials(config.serverId) } await this.updateMcpServer(serverName, { authorization: { mode: 'interactive' } }) } - this.mcpOAuthManager.removeEnterpriseProfile(profileId) + await this.mcpOAuthManager.removeEnterpriseProfile(profileId) } setMcpEnterpriseProfileClientSecret( @@ -1118,7 +1156,7 @@ export class McpService implements McpServicePort { } logoutMcpEnterpriseProfile(profileId: string): Promise { - return Promise.resolve(this.mcpOAuthManager.logoutEnterpriseProfile(profileId)) + return this.mcpOAuthManager.logoutEnterpriseProfile(profileId) } private async requireServerById( @@ -1152,19 +1190,19 @@ export class McpService implements McpServicePort { async getServerDiagnostics(serverId: string): Promise { const { name: serverName, config } = await this.requireServerById(serverId) - const auth = this.mcpOAuthManager.getStatus(serverName, config) + const auth = await this.mcpOAuthManager.getStatus(serverName, config) const client = this.serverManager.getClient(serverName) const lastError = this.serverManager.getServerLastError(serverName)?.slice(0, 2048) if (client) { return { - ...client.getDiagnostics(auth), + ...(await client.getDiagnostics(auth)), ...(lastError ? { lastError } : {}) } } let authorizationExtensions: string[] = [] try { - authorizationExtensions = this.mcpOAuthManager.getUsableAuthorizationExtensions(config) + authorizationExtensions = await this.mcpOAuthManager.getUsableAuthorizationExtensions(config) } catch { authorizationExtensions = [] } diff --git a/src/main/mcp/mcpClient.ts b/src/main/mcp/mcpClient.ts index 177e08cc9c..d6253410c8 100644 --- a/src/main/mcp/mcpClient.ts +++ b/src/main/mcp/mcpClient.ts @@ -37,11 +37,9 @@ import type { import type { DeepchatEventPublisher } from '@shared/contracts/events' import { randomUUID } from 'node:crypto' import path from 'node:path' -import { app } from 'electron' -// import { NO_PROXY, proxyConfig } from '@/platform/proxy' import type { InMemoryServerFactory } from './inMemoryServers/builder' -import { RuntimeHelper } from '@/lib/runtimeHelper' -import { ToolchainService } from '@/toolchains' +import { expandRuntimePath, getDefaultRuntimePaths } from '@/lib/runtimeHelper' +import type { ToolchainService } from '@/toolchains/service' import { getPathEntriesFromEnv, setPathEntriesOnEnv } from '@/agent/shared/process/shellEnvHelper' import { terminateProcessTreeByPid } from '@/agent/shared/process/processTree' import { childProcessRegistry } from '@/agent/shared/process/childProcessRegistry' @@ -195,7 +193,10 @@ interface ServerStatusChangedOptions { } export type McpClientRuntime = { - resolveMcpBindings?(config: Partial): Record + readonly homeDirectory: string + readonly appVersion: string + toolchains: Pick + resolveMcpBindings?(config: Partial): Promise> sampling: Pick elicitation: Pick completion: Pick @@ -304,8 +305,6 @@ export class McpClient { private readonly inMemoryServerFactory?: InMemoryServerFactory private readonly runtime: McpClientRuntime private readonly onRegistryChanged: () => void - private readonly runtimeHelper = RuntimeHelper.getInstance() - private readonly toolchainService: ToolchainService private probe: McpServerDiagnostics['probe'] = { outcome: 'not-run' } constructor( @@ -319,6 +318,9 @@ export class McpClient { onRegistryChanged: () => void, private readonly publishEvent: DeepchatEventPublisher ) { + if (!path.isAbsolute(runtime.homeDirectory)) { + throw new Error('MCP home directory must be absolute') + } this.serverName = serverName this.serverConfig = serverConfig this.npmRegistry = npmRegistry @@ -327,7 +329,6 @@ export class McpClient { this.inMemoryServerFactory = inMemoryServerFactory this.runtime = runtime this.onRegistryChanged = onRegistryChanged - this.toolchainService = ToolchainService.getInstance() } private emitServerStatusChanged( @@ -357,16 +358,16 @@ export class McpClient { command: string, args: string[] ): { command: string; args: string[] } { - return this.toolchainService.rewriteCommand(command, args) + return this.runtime.toolchains.rewriteCommand(command, args) } public expandPath(inputPath: string): string { - return this.runtimeHelper.expandPath(inputPath) + return expandRuntimePath(inputPath, this.runtime.homeDirectory) } public get nodeRuntimePath(): string | null { try { - return this.toolchainService.resolve('node').rootDir + return this.runtime.toolchains.resolve('node').rootDir } catch { return null } @@ -374,7 +375,7 @@ export class McpClient { public get uvRuntimePath(): string | null { try { - return this.toolchainService.resolve('uv').rootDir + return this.runtime.toolchains.resolve('uv').rootDir } catch { return null } @@ -389,11 +390,7 @@ export class McpClient { ): void { setPathEntriesOnEnv( env, - [ - this.toolchainService.resolvedBinDirs(), - inheritedPaths, - this.runtimeHelper.getDefaultPaths(homeDir) - ], + [this.runtime.toolchains.resolvedBinDirs(), inheritedPaths, getDefaultRuntimePaths(homeDir)], { includeDefaultPaths: false } ) } @@ -510,8 +507,12 @@ export class McpClient { this.serverConfig.ownerPluginId.startsWith('user.') const privateBindings = userPlugin || this.serverConfig.ownerPluginId === NOWLEDGE_PLUGIN_ID const bindingEnvironment = privateBindings - ? (this.runtime.resolveMcpBindings?.(this.serverConfig as Partial) ?? {}) + ? ((await this.runtime.resolveMcpBindings?.( + this.serverConfig as Partial + )) ?? {}) : process.env + if (this.connectAborted || attempt !== this.startupAttempt) + throw new McpConnectionCancelledError(this.serverName) const resolveBinding = (value: string) => resolveMcpEnvironmentBinding( value, @@ -551,6 +552,9 @@ export class McpClient { this.serverConfig as Partial ) + if (this.connectAborted || attempt !== this.startupAttempt) + throw new McpConnectionCancelledError(this.serverName) + if (this.serverConfig.type === 'inmemory') { const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair() const _args = Array.isArray(this.serverConfig.args) ? this.serverConfig.args : [] @@ -569,10 +573,10 @@ export class McpClient { let args = (this.serverConfig.args as string[]).map(resolveBinding) // Handle path expansion (including ~ and environment variables) - command = this.runtimeHelper.expandPath(command) - args = args.map((arg) => this.runtimeHelper.expandPath(arg)) + command = this.expandPath(command) + args = args.map((arg) => this.expandPath(arg)) - const HOME_DIR = app.getPath('home') + const homeDirectory = this.runtime.homeDirectory // Define allowed environment variables whitelist const allowedEnvVars = [ @@ -595,7 +599,7 @@ export class McpClient { const env: Record = {} // Handle command and argument replacement - const processedCommand = this.toolchainService.rewriteCommand(command, args) + const processedCommand = this.processCommandWithArgs(command, args) command = processedCommand.command args = processedCommand.args @@ -603,7 +607,7 @@ export class McpClient { if (this.serverConfig.inheritEnv === 'minimal') { Object.assign(env, createMinimalProcessEnvironment(process.env, process.platform)) - this.addRuntimePathsToEnvironment(env, HOME_DIR) + this.addRuntimePathsToEnvironment(env, homeDirectory) } else if (isNodeCommand) { // Node.js/UV commands use whitelist processing if (process.env) { @@ -623,7 +627,7 @@ export class McpClient { } }) - this.addRuntimePathsToEnvironment(env, HOME_DIR, existingPaths) + this.addRuntimePathsToEnvironment(env, homeDirectory, existingPaths) } } else { // 非 Node.js/UV 命令,保留所有系统环境变量,只补充 PATH @@ -642,7 +646,7 @@ export class McpClient { existingPaths.push(env.Path) } - this.addRuntimePathsToEnvironment(env, HOME_DIR, existingPaths) + this.addRuntimePathsToEnvironment(env, homeDirectory, existingPaths) } // 添加自定义环境变量 @@ -730,11 +734,13 @@ export class McpClient { // 创建 MCP 客户端 this.probe = { outcome: 'not-run' } const authorizationExtensions = - this.mcpOAuthManager?.getUsableAuthorizationExtensions( + (await this.mcpOAuthManager?.getUsableAuthorizationExtensions( this.serverConfig as Partial - ) ?? [] + )) ?? [] + if (this.connectAborted || attempt !== this.startupAttempt) + throw new McpConnectionCancelledError(this.serverName) this.client = new Client( - { name: 'DeepChat', version: app.getVersion() }, + { name: 'DeepChat', version: this.runtime.appVersion }, { capabilities: { sampling: {}, @@ -823,6 +829,9 @@ export class McpClient { // 等待连接完成或硬超时 await Promise.race([connectPromise, timeoutPromise]) + if (this.connectAborted || attempt !== this.startupAttempt) + throw new McpConnectionCancelledError(this.serverName) + // 清除超时 if (this.connectionTimeout) { clearTimeout(this.connectionTimeout) @@ -845,6 +854,7 @@ export class McpClient { this.emitServerStatusChanged('connected', { phase, attempt }) } catch (error) { + if (attempt !== this.startupAttempt) throw new McpConnectionCancelledError(this.serverName) // 清除超时 if (this.connectionTimeout) { clearTimeout(this.connectionTimeout) @@ -1867,15 +1877,22 @@ export class McpClient { return content } - async readResourceContents(resourceUri: string): Promise { + async readResourceContents(resourceUri: string, signal?: AbortSignal): Promise { try { - await this.ensureConnectedForRequest() + await this.ensureConnectedForRequest(signal) + signal?.throwIfAborted() if (!this.client) { throw new Error(`MCP client ${this.serverName} not initialized`) } - const rawResource = await this.client.readResource({ uri: resourceUri }) + const rawResource = await awaitWithAbort( + signal + ? this.client.readResource({ uri: resourceUri }, { signal }) + : this.client.readResource({ uri: resourceUri }), + signal + ) + signal?.throwIfAborted() this.assertControlResult(rawResource, `resource ${resourceUri}`) return rawResource.contents.map((content) => ({ uri: content.uri, @@ -1924,7 +1941,7 @@ export class McpClient { ) } - getDiagnostics(auth: McpServerAuthStatus): McpServerDiagnostics { + async getDiagnostics(auth: McpServerAuthStatus): Promise { const client = this.client const capabilities = client?.getServerCapabilities() const serverVersion = client?.getServerVersion() @@ -1932,9 +1949,9 @@ export class McpClient { let authorizationExtensions: string[] = [] try { authorizationExtensions = - this.mcpOAuthManager?.getUsableAuthorizationExtensions( + (await this.mcpOAuthManager?.getUsableAuthorizationExtensions( this.serverConfig as Partial - ) ?? [] + )) ?? [] } catch { authorizationExtensions = [] } diff --git a/src/main/mcp/mcpOAuthManager.ts b/src/main/mcp/mcpOAuthManager.ts index 2187b90745..2a5ea2087e 100644 --- a/src/main/mcp/mcpOAuthManager.ts +++ b/src/main/mcp/mcpOAuthManager.ts @@ -34,7 +34,7 @@ import { MCP_OAUTH_REDIRECT_PORT } from './oauthConstants' import { - McpOAuthCredentialStore, + type McpOAuthCredentialStore, normalizeMcpOAuthIssuer, type McpOAuthCredentialEntry } from './oauthCredentialStore' @@ -51,6 +51,7 @@ type PendingMcpOAuthFlow = { provider: DeepChatMcpOAuthProvider callbackSession: OAuthLoopbackCallbackSession flowPromise?: Promise + assertActive(): void } const OAUTH_AUTH_ERROR_PATTERNS = [ @@ -257,538 +258,722 @@ export class McpOAuthManager { private readonly statuses = new Map() private readonly pendingFlows = new Map() private readonly enterpriseIdentity: McpEnterpriseIdentityManager | null + private stopped = false + private readonly generations = new Map() + + private invalidate(id?: string): void { + if (id) { + this.generations.set(id, (this.generations.get(id) ?? 0) + 1) + this.cancelPendingFlow(id) + this.statuses.delete(id) + } + } + + private captureOperation(id?: string): () => void { + const generation = id ? (this.generations.get(id) ?? 0) : 0 + const check = () => { + if (this.stopped || (id && generation !== (this.generations.get(id) ?? 0))) + throw new Error('MCP OAuth operation interrupted') + } + check() + return check + } + + stop(): void { + this.stopped = true + for (const id of this.pendingFlows.keys()) this.cancelPendingFlow(id) + this.statuses.clear() + this.generations.clear() + this.enterpriseIdentity?.stop() + this.store.stop() + } constructor( - store = new McpOAuthCredentialStore(), + store: McpOAuthCredentialStore, + private readonly openExternal: (url: string) => Promise, private readonly publishEvent: DeepchatEventPublisher, - private readonly onAuthenticated?: (serverName: string) => void | Promise, + private readonly onRuntimeChange?: ( + serverId: string, + action: 'restart' | 'stop', + assertCurrent: () => void + ) => void | Promise, settings?: McpSettings, private readonly onServerBindingChanged?: (serverId: string) => void ) { this.store = store this.settings = settings this.enterpriseIdentity = settings - ? new McpEnterpriseIdentityManager(settings, store, publishEvent) + ? new McpEnterpriseIdentityManager( + settings, + store, + publishEvent, + openExternal, + async (profileId, assertCurrent) => { + const servers = await settings.getMcpServers() + assertCurrent() + for (const config of Object.values(servers)) { + if (config.serverId && config.authorization?.identityProfileId === profileId) { + const assertServerCurrent = this.captureOperation(config.serverId) + await this.applyRuntimeChange(config.serverId, 'stop', () => { + assertCurrent() + assertServerCurrent() + }) + } + } + } + ) : null } - - getStatus(serverName: string, config?: Partial | null): McpServerAuthStatus { - if (!config || !isRemoteOAuthCapable(config)) { - const authenticated = hasAuthorizationHeader(config) - const mode = config ? getAuthorizationMode(config) : undefined - return { - serverName, - serverId: config?.serverId, - state: authenticated ? 'authenticated' : mode === 'none' ? 'none' : 'unsupported', - authenticated, - storage: this.store.getStorageState(), - persistent: this.store.isPersistent(), - mode + async getStatus( + serverName: string, + config?: Partial | null + ): Promise { + const assertCurrent = this.captureOperation(config?.serverId) + try { + if (!config || !isRemoteOAuthCapable(config)) { + const authenticated = hasAuthorizationHeader(config) + const mode = config ? getAuthorizationMode(config) : undefined + return { + serverName, + serverId: config?.serverId, + state: authenticated ? 'authenticated' : mode === 'none' ? 'none' : 'unsupported', + authenticated, + ...(await this.getStorageSnapshot()), + mode + } } - } - - const binding = requireServerBinding(config as Partial) - const mode = getAuthorizationMode(config) - const pending = this.pendingFlows.get(binding.serverId) - if (pending) { - return this.buildStatus(serverName, binding, mode, { - state: 'authenticating', - authenticated: false - }) - } - - if (mode === 'interactive') { - const found = this.findInteractiveCredential(serverName, config, binding) - if (found?.entry.tokens?.access_token) { - return this.buildStatus(serverName, binding, mode, { - state: 'authenticated', - authenticated: true, - updatedAt: found.entry.updatedAt + const binding = requireServerBinding(config as Partial) + const mode = getAuthorizationMode(config) + const pending = this.pendingFlows.get(binding.serverId) + if (pending) { + return await this.buildStatus(serverName, binding, mode, { + state: 'authenticating', + authenticated: false }) } - } else { - const credential = this.getSelectedCredentialStatus(binding, mode) - if (!credential.configured) { - return this.buildStatus(serverName, binding, mode, { - state: 'required', - authenticated: false, - credential - }) + if (mode === 'interactive') { + const found = await this.findInteractiveCredential(serverName, config, binding) + assertCurrent() + if (found?.entry.tokens?.access_token) { + return await this.buildStatus(serverName, binding, mode, { + state: 'authenticated', + authenticated: true, + updatedAt: found.entry.updatedAt + }) + } + } else { + const credential = await this.getSelectedCredentialStatus(binding, mode) + assertCurrent() + if (!credential.configured) { + return await this.buildStatus(serverName, binding, mode, { + state: 'required', + authenticated: false, + credential + }) + } + const existing = this.statuses.get(binding.serverId) + if (existing?.state === 'authenticated') { + return { ...existing, serverName, credential } + } + if (!existing || existing.state !== 'error') { + return await this.buildStatus(serverName, binding, mode, { + state: 'none', + authenticated: false, + credential + }) + } } const existing = this.statuses.get(binding.serverId) - if (existing?.state === 'authenticated') { - return { ...existing, serverName, credential } + if (existing?.state === 'required' || existing?.state === 'error') { + return { ...existing, serverName } } - if (!existing || existing.state !== 'error') { - return this.buildStatus(serverName, binding, mode, { - state: 'none', - authenticated: false, - credential - }) - } - } - - const existing = this.statuses.get(binding.serverId) - if (existing?.state === 'required' || existing?.state === 'error') { - return { ...existing, serverName } + return await this.buildStatus(serverName, binding, mode, { + state: 'none', + authenticated: false + }) + } finally { + assertCurrent() } - - return this.buildStatus(serverName, binding, mode, { - state: 'none', - authenticated: false - }) } - async createRuntimeProvider( serverName: string, config: Partial ): Promise { - if (!isRemoteOAuthCapable(config)) { - return undefined - } - const completeConfig = config as MCPServerConfig - const binding = requireServerBinding(completeConfig) - const mode = getAuthorizationMode(completeConfig) - - if (mode === 'interactive') { - const found = this.findInteractiveCredential(serverName, completeConfig, binding) - if (!found?.entry.tokens?.access_token) { + const assertCurrent = this.captureOperation(config.serverId) + try { + if (!isRemoteOAuthCapable(config)) { return undefined } + const completeConfig = config as MCPServerConfig + const binding = requireServerBinding(completeConfig) + const mode = getAuthorizationMode(completeConfig) + if (mode === 'interactive') { + const found = await this.findInteractiveCredential(serverName, completeConfig, binding) + assertCurrent() + if (!found?.entry.tokens?.access_token) { + return undefined + } + assertCurrent() + const info = await discoverOAuthServerInfo(binding.endpoint) + assertCurrent() + assertConfiguredDiscovery(completeConfig, info) + if (!this.isInteractiveCredentialCurrent(found.entry, info)) { + assertCurrent() + await this.store.clearEntry(found.key) + assertCurrent() + return undefined + } + const provider = this.createInteractiveProvider(completeConfig, binding, { + interactive: false, + assertActive: assertCurrent, + initialCredentialKey: found.key + }) + await this.finalizeInteractiveBinding( + completeConfig, + provider, + info, + found.entry.clientInformation?.client_id + ) + assertCurrent() + return provider + } + if ( + !completeConfig.authorization?.authorizationServerIssuer || + !completeConfig.authorization.protectedResourceUrl + ) { + throw new Error('MCP machine authorization requires an issuer and protected resource') + } + assertCurrent() const info = await discoverOAuthServerInfo(binding.endpoint) - assertConfiguredDiscovery(completeConfig, info) - if (!this.isInteractiveCredentialCurrent(found.entry, info)) { - this.store.clearEntry(found.key) - return undefined + assertCurrent() + const issuer = assertConfiguredDiscovery(completeConfig, info) + const discoveredBinding: McpCredentialBinding = { + ...binding, + authorizationServerIssuer: issuer, + protectedResourceUrl: normalizeUrlIdentifier( + info.resourceMetadata?.resource || binding.protectedResourceUrl! + ) } - const provider = this.createInteractiveProvider(completeConfig, binding, { - interactive: false, - initialCredentialKey: found.key + const provider = await this.createMachineProvider(completeConfig, discoveredBinding, info) + assertCurrent() + const result = await auth(provider, { + serverUrl: binding.endpoint, + scope: completeConfig.authorization?.scopes?.join(' ') }) - await this.finalizeInteractiveBinding( - completeConfig, - provider, - info, - found.entry.clientInformation?.client_id + assertCurrent() + if (result !== 'AUTHORIZED') { + throw new Error('MCP machine authorization did not produce an access token') + } + this.setStatus( + await this.buildStatus(serverName, discoveredBinding, mode, { + state: 'authenticated', + authenticated: true, + credential: await this.getSelectedCredentialStatus(discoveredBinding, mode) + }), + assertCurrent ) + assertCurrent() return provider + } finally { + assertCurrent() } - - if ( - !completeConfig.authorization?.authorizationServerIssuer || - !completeConfig.authorization.protectedResourceUrl - ) { - throw new Error('MCP machine authorization requires an issuer and protected resource') - } - const info = await discoverOAuthServerInfo(binding.endpoint) - const issuer = assertConfiguredDiscovery(completeConfig, info) - const discoveredBinding: McpCredentialBinding = { - ...binding, - authorizationServerIssuer: issuer, - protectedResourceUrl: normalizeUrlIdentifier( - info.resourceMetadata?.resource || binding.protectedResourceUrl! - ) - } - const provider = await this.createMachineProvider(completeConfig, discoveredBinding, info) - const result = await auth(provider, { - serverUrl: binding.endpoint, - scope: completeConfig.authorization?.scopes?.join(' ') - }) - if (result !== 'AUTHORIZED') { - throw new Error('MCP machine authorization did not produce an access token') - } - this.setStatus( - this.buildStatus(serverName, discoveredBinding, mode, { - state: 'authenticated', - authenticated: true, - credential: this.getSelectedCredentialStatus(discoveredBinding, mode) - }) - ) - return provider } - - handleConnectionError( + async handleConnectionError( serverName: string, config: Partial, error: unknown - ): boolean { - if (!isRemoteOAuthCapable(config) || !isOAuthError(error)) { - return false + ): Promise { + const assertCurrent = this.captureOperation(config?.serverId) + try { + if (!isRemoteOAuthCapable(config) || !isOAuthError(error)) { + return false + } + const binding = requireServerBinding(config) + const mode = getAuthorizationMode(config) + this.setStatus( + await this.buildStatus(serverName, binding, mode, { + state: mode === 'interactive' ? 'required' : 'error', + authenticated: false, + error: sanitizeError(error), + ...(mode === 'interactive' + ? {} + : { credential: await this.getSelectedCredentialStatus(binding, mode) }) + }), + assertCurrent + ) + assertCurrent() + return true + } finally { + assertCurrent() } - const binding = requireServerBinding(config) - const mode = getAuthorizationMode(config) - this.setStatus( - this.buildStatus(serverName, binding, mode, { - state: mode === 'interactive' ? 'required' : 'error', - authenticated: false, - error: sanitizeError(error), - ...(mode === 'interactive' - ? {} - : { credential: this.getSelectedCredentialStatus(binding, mode) }) - }) - ) - return true } - async startAuth( serverName: string, config: Partial ): Promise { - if (!isRemoteOAuthCapable(config) || !config.baseUrl) { - throw new Error('MCP server does not support OAuth authentication') - } - const completeConfig = config as MCPServerConfig - const binding = requireServerBinding(completeConfig) - const mode = getAuthorizationMode(completeConfig) - if (mode !== 'interactive') { - try { - await this.createRuntimeProvider(serverName, completeConfig) - } catch (error) { - this.setStatus( - this.buildStatus(serverName, binding, mode, { - state: 'error', - authenticated: false, - error: sanitizeError(error), - credential: this.getSelectedCredentialStatus(binding, mode) - }) - ) - return this.getStatus(serverName, config) + this.invalidate(config.serverId) + const assertCurrent = this.captureOperation(config.serverId) + try { + if (!isRemoteOAuthCapable(config) || !config.baseUrl) { + throw new Error('MCP server does not support OAuth authentication') } - await Promise.resolve(this.onAuthenticated?.(serverName)).catch((error) => { - logger.warn( - '[MCP OAuth] Failed to restart server after machine authentication:', - sanitizeError(error) - ) + const completeConfig = config as MCPServerConfig + const binding = requireServerBinding(completeConfig) + const mode = getAuthorizationMode(completeConfig) + if (mode !== 'interactive') { + try { + await this.createRuntimeProvider(serverName, completeConfig) + assertCurrent() + } catch (error) { + this.setStatus( + await this.buildStatus(serverName, binding, mode, { + state: 'error', + authenticated: false, + error: sanitizeError(error), + credential: await this.getSelectedCredentialStatus(binding, mode) + }), + assertCurrent + ) + assertCurrent() + return await this.getStatus(serverName, config) + } + assertCurrent() + await this.applyRuntimeChange(binding.serverId, 'restart', assertCurrent).catch((error) => { + logger.warn( + '[MCP OAuth] Failed to restart server after machine authentication:', + sanitizeError(error) + ) + }) + assertCurrent() + return await this.getStatus(serverName, config) + } + this.cancelPendingFlow(binding.serverId) + const state = createState() + let existing = await this.findInteractiveCredential(serverName, completeConfig, binding) + assertCurrent() + if (existing?.entry.discoveryState) { + try { + assertCurrent() + const info = await discoverOAuthServerInfo(binding.endpoint) + assertCurrent() + assertConfiguredDiscovery(completeConfig, info) + if (!this.isInteractiveCredentialCurrent(existing.entry, info)) { + assertCurrent() + await this.store.clearEntry(existing.key) + assertCurrent() + existing = null + } + } catch (error) { + this.setStatus( + await this.buildStatus(serverName, binding, mode, { + state: 'error', + authenticated: false, + error: sanitizeError(error) + }), + assertCurrent + ) + assertCurrent() + return await this.getStatus(serverName, config) + } + } + const client = existing?.entry.clientInformation + const dynamicClient = + client && client.client_id !== completeConfig.authorization?.clientMetadataUrl + let callbackPath = + completeConfig.authorization?.clientMetadataUrl && !dynamicClient + ? MCP_OAUTH_REDIRECT_PATH + : `${MCP_OAUTH_REDIRECT_PATH}/${encodeURIComponent(binding.serverId)}` + let registeredRedirect: URL | null | undefined + if (dynamicClient) { + registeredRedirect = + 'redirect_uris' in client && Array.isArray(client.redirect_uris) + ? client.redirect_uris + .map((uri) => URL.parse(uri)) + .find( + (url) => + url?.protocol === 'http:' && + url.hostname === 'localhost' && + !url.username && + !url.password && + !url.search && + !url.hash && + (url.pathname === MCP_OAUTH_REDIRECT_PATH || + url.pathname.startsWith(`${MCP_OAUTH_REDIRECT_PATH}/`)) + ) + : undefined + if (registeredRedirect) { + callbackPath = registeredRedirect.pathname + } + } + let provider!: DeepChatMcpOAuthProvider + const callbackSession = await startOAuthLoopbackCallbackSession({ + expectedState: state, + path: callbackPath, + preferredPort: Number(registeredRedirect?.port) || MCP_OAUTH_REDIRECT_PORT, + redirectHost: 'localhost', + timeoutMs: MCP_OAUTH_CALLBACK_TIMEOUT_MS, + invalidCallbackMessage: 'Invalid MCP OAuth callback', + validateParameters: (parameters) => { + const validation = provider.getCallbackValidation() + validateAuthorizationResponseIssuer({ + iss: parameters.get('iss') || undefined, + expectedIssuer: validation.issuer, + issParameterSupported: validation.issParameterSupported + }) + } }) - return this.getStatus(serverName, config) - } - - this.cancelPendingFlow(binding.serverId) - const state = createState() - let existing = this.findInteractiveCredential(serverName, completeConfig, binding) - if (existing?.entry.discoveryState) { try { - const info = await discoverOAuthServerInfo(binding.endpoint) - assertConfiguredDiscovery(completeConfig, info) - if (!this.isInteractiveCredentialCurrent(existing.entry, info)) { - this.store.clearEntry(existing.key) - existing = null + assertCurrent() + if ( + existing && + dynamicClient && + registeredRedirect?.href !== new URL(callbackSession.redirectUri).href + ) { + assertCurrent() + await this.store.clearEntryScope(existing.key, 'client') + assertCurrent() + await this.store.clearEntryScope(existing.key, 'tokens') + assertCurrent() } + provider = this.createInteractiveProvider(completeConfig, binding, { + redirectUrl: callbackSession.redirectUri, + state, + interactive: true, + assertActive: assertCurrent, + initialCredentialKey: existing?.key + }) } catch (error) { + callbackSession.close() + assertCurrent() this.setStatus( - this.buildStatus(serverName, binding, mode, { + await this.buildStatus(serverName, binding, mode, { state: 'error', authenticated: false, error: sanitizeError(error) - }) + }), + assertCurrent ) - return this.getStatus(serverName, config) + assertCurrent() + return await this.getStatus(serverName, config) } - } - const client = existing?.entry.clientInformation - const dynamicClient = - client && client.client_id !== completeConfig.authorization?.clientMetadataUrl - let callbackPath = - completeConfig.authorization?.clientMetadataUrl && !dynamicClient - ? MCP_OAUTH_REDIRECT_PATH - : `${MCP_OAUTH_REDIRECT_PATH}/${encodeURIComponent(binding.serverId)}` - let registeredRedirect: URL | null | undefined - if (dynamicClient) { - registeredRedirect = - 'redirect_uris' in client && Array.isArray(client.redirect_uris) - ? client.redirect_uris - .map((uri) => URL.parse(uri)) - .find( - (url) => - url?.protocol === 'http:' && - url.hostname === 'localhost' && - !url.username && - !url.password && - !url.search && - !url.hash && - (url.pathname === MCP_OAUTH_REDIRECT_PATH || - url.pathname.startsWith(`${MCP_OAUTH_REDIRECT_PATH}/`)) - ) - : undefined - if (registeredRedirect) { - callbackPath = registeredRedirect.pathname + const flow: PendingMcpOAuthFlow = { + serverId: binding.serverId, + serverName, + serverUrl: config.baseUrl, + initialBinding: binding, + binding, + provider, + callbackSession, + assertActive: assertCurrent } - } - let provider!: DeepChatMcpOAuthProvider - const callbackSession = await startOAuthLoopbackCallbackSession({ - expectedState: state, - path: callbackPath, - preferredPort: Number(registeredRedirect?.port) || MCP_OAUTH_REDIRECT_PORT, - redirectHost: 'localhost', - timeoutMs: MCP_OAUTH_CALLBACK_TIMEOUT_MS, - invalidCallbackMessage: 'Invalid MCP OAuth callback', - validateParameters: (parameters) => { - const discovery = provider.discoveryState() - validateAuthorizationResponseIssuer({ - iss: parameters.get('iss') || undefined, - expectedIssuer: - discovery?.authorizationServerMetadata?.issuer || discovery?.authorizationServerUrl, - issParameterSupported: - discovery?.authorizationServerMetadata - ?.authorization_response_iss_parameter_supported === true + assertCurrent() + this.pendingFlows.set(binding.serverId, flow) + this.setStatus( + await this.buildStatus(serverName, binding, mode, { + state: 'authenticating', + authenticated: false + }), + assertCurrent + ) + assertCurrent() + try { + assertCurrent() + const result = await auth(provider, { + serverUrl: config.baseUrl, + scope: completeConfig.authorization?.scopes?.join(' ') }) + assertCurrent() + const discovery = await provider.discoveryState() + assertCurrent() + if (!discovery) { + throw new Error('MCP OAuth discovery state is unavailable') + } + flow.binding = await this.finalizeInteractiveBinding(completeConfig, provider, discovery) + assertCurrent() + if (result === 'AUTHORIZED') { + await this.finishAuthenticatedFlow(flow) + assertCurrent() + return await this.getStatus( + serverName, + await this.getCurrentConfig(serverName, completeConfig) + ) + } + flow.flowPromise = callbackSession + .waitForCallback() + .then(async (callback) => await this.finishAuthFlow(flow, callback.code, callback.iss)) + .catch(async (error) => await this.failAuthFlow(flow, error)) + return await this.getStatus( + serverName, + await this.getCurrentConfig(serverName, completeConfig) + ) + } catch (error) { + await this.failAuthFlow(flow, error) + assertCurrent() + return await this.getStatus( + serverName, + await this.getCurrentConfig(serverName, completeConfig) + ) } - }) + } finally { + assertCurrent() + } + } + async completeAuthFromCallbackUrl( + serverName: string, + config: Partial, + callbackUrl: string + ): Promise { + const assertCurrent = this.captureOperation(config.serverId) try { + const binding = requireServerBinding(config) + const flow = this.pendingFlows.get(binding.serverId) + if (!flow) { + const status = await this.getStatus(serverName, config) + assertCurrent() + if (status.authenticated) { + return status + } + this.setStatus( + await this.buildStatus(serverName, binding, getAuthorizationMode(config), { + state: 'error', + authenticated: false, + error: 'MCP OAuth authentication is not pending' + }), + assertCurrent + ) + assertCurrent() + return await this.getStatus(serverName, config) + } + const callbackCredentialKey = createMcpCredentialKey('interactive_oauth', binding) if ( - existing && - dynamicClient && - registeredRedirect?.href !== new URL(callbackSession.redirectUri).href + callbackCredentialKey !== + createMcpCredentialKey('interactive_oauth', flow.initialBinding) && + callbackCredentialKey !== createMcpCredentialKey('interactive_oauth', flow.binding) ) { - this.store.clearEntryScope(existing.key, 'client') - this.store.clearEntryScope(existing.key, 'tokens') - } - provider = this.createInteractiveProvider(completeConfig, binding, { - redirectUrl: callbackSession.redirectUri, - state, - interactive: true, - initialCredentialKey: existing?.key - }) - } catch (error) { - callbackSession.close() - this.setStatus( - this.buildStatus(serverName, binding, mode, { - state: 'error', - authenticated: false, - error: sanitizeError(error) - }) - ) - return this.getStatus(serverName, config) - } - const flow: PendingMcpOAuthFlow = { - serverId: binding.serverId, - serverName, - serverUrl: config.baseUrl, - initialBinding: binding, - binding, - provider, - callbackSession - } - this.pendingFlows.set(binding.serverId, flow) - this.setStatus( - this.buildStatus(serverName, binding, mode, { - state: 'authenticating', - authenticated: false - }) - ) - - try { - const result = await auth(provider, { - serverUrl: config.baseUrl, - scope: completeConfig.authorization?.scopes?.join(' ') - }) - const discovery = provider.discoveryState() - if (!discovery) { - throw new Error('MCP OAuth discovery state is unavailable') + await this.failAuthFlow( + flow, + new Error('MCP OAuth server binding changed during authentication') + ) + assertCurrent() + return await this.getStatus(serverName, config) } - flow.binding = await this.finalizeInteractiveBinding(completeConfig, provider, discovery) - if (result === 'AUTHORIZED') { - this.finishAuthenticatedFlow(flow) - return this.getStatus(serverName, await this.getCurrentConfig(serverName, completeConfig)) + const resolution = flow.callbackSession.resolveCallbackUrl(callbackUrl) + if (resolution.kind === 'not-found') { + await this.failAuthFlow(flow, new Error('MCP OAuth callback URL is invalid')) + assertCurrent() + return await this.getStatus(serverName, config) } - - flow.flowPromise = callbackSession - .waitForCallback() - .then((callback) => this.finishAuthFlow(flow, callback.code, callback.iss)) - .catch((error) => this.failAuthFlow(flow, error)) - return this.getStatus(serverName, await this.getCurrentConfig(serverName, completeConfig)) - } catch (error) { - this.failAuthFlow(flow, error) - return this.getStatus(serverName, await this.getCurrentConfig(serverName, completeConfig)) + await flow.flowPromise + assertCurrent() + return await this.getStatus(serverName, config) + } finally { + assertCurrent() } } - - async completeAuthFromCallbackUrl( + async logout( serverName: string, - config: Partial, - callbackUrl: string + config?: Partial | null ): Promise { - const binding = requireServerBinding(config) - const flow = this.pendingFlows.get(binding.serverId) - if (!flow) { - const status = this.getStatus(serverName, config) - if (status.authenticated) { - return status + this.invalidate(config?.serverId) + const assertCurrent = this.captureOperation(config?.serverId) + try { + if (!config) { + return { + serverName, + state: 'unsupported', + authenticated: false, + ...(await this.getStorageSnapshot()) + } + } + const binding = requireServerBinding(config) + this.cancelPendingFlow(binding.serverId) + const interactive = await this.findInteractiveCredential(serverName, config, binding) + assertCurrent() + if (interactive) { + assertCurrent() + await this.store.clearEntry(interactive.key) + assertCurrent() } this.setStatus( - this.buildStatus(serverName, binding, getAuthorizationMode(config), { - state: 'error', - authenticated: false, - error: 'MCP OAuth authentication is not pending' - }) + await this.buildStatus(serverName, binding, getAuthorizationMode(config), { + state: 'none', + authenticated: false + }), + assertCurrent ) - return this.getStatus(serverName, config) - } - const callbackCredentialKey = createMcpCredentialKey('interactive_oauth', binding) - if ( - callbackCredentialKey !== createMcpCredentialKey('interactive_oauth', flow.initialBinding) && - callbackCredentialKey !== createMcpCredentialKey('interactive_oauth', flow.binding) - ) { - this.failAuthFlow(flow, new Error('MCP OAuth server binding changed during authentication')) - return this.getStatus(serverName, config) + assertCurrent() + const status = await this.getStatus(serverName, config) + await this.applyRuntimeChange(binding.serverId, 'stop', assertCurrent) + return status + } finally { + assertCurrent() } - - const resolution = flow.callbackSession.resolveCallbackUrl(callbackUrl) - if (resolution.kind === 'not-found') { - this.failAuthFlow(flow, new Error('MCP OAuth callback URL is invalid')) - return this.getStatus(serverName, config) - } - - await flow.flowPromise - return this.getStatus(serverName, config) } - - logout(serverName: string, config?: Partial | null): McpServerAuthStatus { - if (!config) { - return { - serverName, - state: 'unsupported', - authenticated: false, - storage: this.store.getStorageState(), - persistent: this.store.isPersistent() - } - } - const binding = requireServerBinding(config) - this.cancelPendingFlow(binding.serverId) - const interactive = this.findInteractiveCredential(serverName, config, binding) - if (interactive) { - this.store.clearEntry(interactive.key) + async getCredentialStatuses(config: MCPServerConfig): Promise { + const assertCurrent = this.captureOperation(config.serverId) + try { + const binding = requireServerBinding(config) + return await Promise.all( + (['client_secret', 'private_key', 'enterprise_resource_secret'] as const).map((kind) => + this.getCredentialStatus(binding, kind) + ) + ) + } finally { + assertCurrent() } - this.setStatus( - this.buildStatus(serverName, binding, getAuthorizationMode(config), { - state: 'none', - authenticated: false - }) - ) - return this.getStatus(serverName, config) - } - - getCredentialStatuses(config: MCPServerConfig): McpCredentialStatus[] { - const binding = requireServerBinding(config) - return (['client_secret', 'private_key', 'enterprise_resource_secret'] as const).map((kind) => - this.getCredentialStatus(binding, kind) - ) } - - setCredential( + async setCredential( binding: McpCredentialBinding, credential: McpCredentialInput - ): McpCredentialStatus { - if (credential.kind === 'client_secret') { - if (!credential.secret || credential.secret.length > 8192) { - throw new Error('MCP client secret is invalid') - } - this.store.saveClientSecret( - createMcpCredentialKey('client_secret', binding), - credential.secret, - binding - ) - } else if (credential.kind === 'enterprise_resource_secret') { - if (!credential.secret || credential.secret.length > 8192) { - throw new Error('MCP enterprise resource secret is invalid') - } - this.store.saveEnterpriseResourceSecret( - createMcpCredentialKey('enterprise_resource_secret', binding), - credential.secret, - binding - ) - } else { - if (!credential.privateKey || credential.privateKey.length > 64 * 1024) { - throw new Error('MCP private key is invalid') + ): Promise { + this.invalidate(binding.serverId) + const assertCurrent = this.captureOperation(binding.serverId) + try { + if (credential.kind === 'client_secret') { + if (!credential.secret || credential.secret.length > 8192) { + throw new Error('MCP client secret is invalid') + } + assertCurrent() + await this.store.saveClientSecret( + createMcpCredentialKey('client_secret', binding), + credential.secret, + binding + ) + assertCurrent() + } else if (credential.kind === 'enterprise_resource_secret') { + if (!credential.secret || credential.secret.length > 8192) { + throw new Error('MCP enterprise resource secret is invalid') + } + assertCurrent() + await this.store.saveEnterpriseResourceSecret( + createMcpCredentialKey('enterprise_resource_secret', binding), + credential.secret, + binding + ) + assertCurrent() + } else { + if (!credential.privateKey || credential.privateKey.length > 64 * 1024) { + throw new Error('MCP private key is invalid') + } + const fingerprint = createFingerprint(credential.privateKey, credential.algorithm) + assertCurrent() + await this.store.savePrivateKey(createMcpCredentialKey('private_key', binding), { + privateKey: credential.privateKey, + algorithm: credential.algorithm, + fingerprint, + binding + }) + assertCurrent() } - const fingerprint = createFingerprint(credential.privateKey, credential.algorithm) - this.store.savePrivateKey(createMcpCredentialKey('private_key', binding), { - privateKey: credential.privateKey, - algorithm: credential.algorithm, - fingerprint, - binding - }) + const status = await this.getCredentialStatus(binding, credential.kind) + await this.applyRuntimeChange(binding.serverId, 'restart', assertCurrent) + return status + } finally { + assertCurrent() } - return this.getCredentialStatus(binding, credential.kind) } - - removeCredential(binding: McpCredentialBinding, kind: McpCredentialKind): McpCredentialStatus { - this.store.clearEntry(createMcpCredentialKey(kind, binding)) - return this.getCredentialStatus(binding, kind) + async removeCredential( + binding: McpCredentialBinding, + kind: McpCredentialKind + ): Promise { + this.invalidate(binding.serverId) + const assertCurrent = this.captureOperation(binding.serverId) + try { + assertCurrent() + await this.store.clearEntry(createMcpCredentialKey(kind, binding)) + assertCurrent() + const status = await this.getCredentialStatus(binding, kind) + await this.applyRuntimeChange(binding.serverId, 'stop', assertCurrent) + return status + } finally { + assertCurrent() + } } - - clearServerCredentials(serverId: string): void { - this.cancelPendingFlow(serverId) - this.store.clearServerCredentials(serverId) - this.statuses.delete(serverId) + async clearServerCredentials(serverId: string): Promise { + this.invalidate(serverId) + const assertCurrent = this.captureOperation(serverId) + try { + this.cancelPendingFlow(serverId) + assertCurrent() + await this.store.clearServerCredentials(serverId) + assertCurrent() + this.statuses.delete(serverId) + } finally { + assertCurrent() + } } - listEnterpriseProfiles(): McpEnterpriseIdentityProfile[] { return this.requireEnterpriseIdentity().listProfiles() } - - saveEnterpriseProfile(profile: McpEnterpriseIdentityProfile): McpEnterpriseIdentityProfile { - return this.requireEnterpriseIdentity().saveProfile(profile) + async saveEnterpriseProfile( + profile: McpEnterpriseIdentityProfile + ): Promise { + return await this.requireEnterpriseIdentity().saveProfile(profile) } - - removeEnterpriseProfile(profileId: string): void { - this.requireEnterpriseIdentity().removeProfile(profileId) + async removeEnterpriseProfile(profileId: string): Promise { + await this.requireEnterpriseIdentity().removeProfile(profileId) } - - setEnterpriseProfileClientSecret(profileId: string, secret: string): McpEnterpriseIdentityStatus { - return this.requireEnterpriseIdentity().setClientSecret(profileId, secret) + async setEnterpriseProfileClientSecret( + profileId: string, + secret: string + ): Promise { + return await this.requireEnterpriseIdentity().setClientSecret(profileId, secret) } - - getEnterpriseProfileStatus(profileId: string): McpEnterpriseIdentityStatus { - return this.requireEnterpriseIdentity().getStatus(profileId) + async getEnterpriseProfileStatus(profileId: string): Promise { + return await this.requireEnterpriseIdentity().getStatus(profileId) } - - startEnterpriseProfileAuth(profileId: string): Promise { - return this.requireEnterpriseIdentity().startAuth(profileId) + async startEnterpriseProfileAuth(profileId: string): Promise { + return await this.requireEnterpriseIdentity().startAuth(profileId) } - - completeEnterpriseProfileAuthFromCallbackUrl( + async completeEnterpriseProfileAuthFromCallbackUrl( profileId: string, callbackUrl: string ): Promise { - return this.requireEnterpriseIdentity().completeAuthFromCallbackUrl(profileId, callbackUrl) + return await this.requireEnterpriseIdentity().completeAuthFromCallbackUrl( + profileId, + callbackUrl + ) } - - logoutEnterpriseProfile(profileId: string): McpEnterpriseIdentityStatus { - return this.requireEnterpriseIdentity().logout(profileId) + async logoutEnterpriseProfile(profileId: string): Promise { + return await this.requireEnterpriseIdentity().logout(profileId) } - - getUsableAuthorizationExtensions(config: Partial): string[] { - const mode = getAuthorizationMode(config) - if ( - !isRemoteOAuthCapable(config) || - (mode !== 'client_credentials' && mode !== 'private_key_jwt' && mode !== 'cross_app_access') - ) { - return [] - } - - const binding = requireServerBinding(config) - if ( - (mode === 'client_credentials' || mode === 'private_key_jwt') && - this.getSelectedCredentialStatus(binding, mode).configured - ) { - return [AUTH_EXTENSION_CLIENT_CREDENTIALS] - } - if (mode === 'cross_app_access' && this.getSelectedCredentialStatus(binding, mode).configured) { - const profileId = config.authorization?.identityProfileId - if (profileId) { - try { - if (this.enterpriseIdentity?.getStatus(profileId).authenticated) { - return [AUTH_EXTENSION_ENTERPRISE] + async getUsableAuthorizationExtensions(config: Partial): Promise { + const assertCurrent = this.captureOperation(config.serverId) + try { + const mode = getAuthorizationMode(config) + if ( + !isRemoteOAuthCapable(config) || + (mode !== 'client_credentials' && mode !== 'private_key_jwt' && mode !== 'cross_app_access') + ) { + return [] + } + const binding = requireServerBinding(config) + if ( + (mode === 'client_credentials' || mode === 'private_key_jwt') && + (await this.getSelectedCredentialStatus(binding, mode)).configured + ) { + return [AUTH_EXTENSION_CLIENT_CREDENTIALS] + } + if ( + mode === 'cross_app_access' && + (await this.getSelectedCredentialStatus(binding, mode)).configured + ) { + const profileId = config.authorization?.identityProfileId + if (profileId) { + try { + if ((await this.enterpriseIdentity?.getStatus(profileId))?.authenticated) { + return [AUTH_EXTENSION_ENTERPRISE] + } + } catch { + return [] } - } catch { - return [] } } + return [] + } finally { + assertCurrent() } - return [] } - private async getCurrentConfig( serverName: string, fallback: MCPServerConfig @@ -803,7 +988,6 @@ export class McpOAuthManager { fallback ) } - private isInteractiveCredentialCurrent( entry: McpOAuthCredentialEntry, info: OAuthServerInfo @@ -819,7 +1003,6 @@ export class McpOAuthManager { if (!storedIssuer || normalizeUrlIdentifier(storedIssuer) !== liveIssuer) { return false } - const liveResource = info.resourceMetadata?.resource const storedResource = entry.binding?.protectedResourceUrl || entry.discoveryState?.resourceMetadata?.resource @@ -832,83 +1015,58 @@ export class McpOAuthManager { return false } } - private async finalizeInteractiveBinding( config: MCPServerConfig, provider: DeepChatMcpOAuthProvider, info: OAuthServerInfo, clientIdHint?: string ): Promise { - const startingBinding = requireServerBinding(config) - const issuer = assertConfiguredDiscovery(config, info) - const providerBinding = provider.getBinding() - const resourceValue = - info.resourceMetadata?.resource || - providerBinding.protectedResourceUrl || - config.authorization?.protectedResourceUrl - const protectedResourceUrl = resourceValue ? normalizeUrlIdentifier(resourceValue) : undefined - const clientId = - clientIdHint || providerBinding.clientId || config.authorization?.clientId || undefined - - let finalBinding: McpCredentialBinding = { - ...startingBinding, - authorizationServerIssuer: issuer, - protectedResourceUrl, - clientId - } - if (this.settings) { - const servers = await this.settings.getMcpServers() - const currentMatch = Object.entries(servers).find( - ([, current]) => current.serverId === startingBinding.serverId - ) - if (!currentMatch) { - throw new Error('MCP server was removed during OAuth discovery') - } - const [currentServerName, currentConfig] = currentMatch - const currentBinding = requireServerBinding(currentConfig) - if ( - currentBinding.configGeneration !== startingBinding.configGeneration || - currentBinding.bindingHash !== startingBinding.bindingHash || - normalizeUrlIdentifier(currentBinding.endpoint) !== - normalizeUrlIdentifier(startingBinding.endpoint) - ) { - throw new Error('MCP server binding changed during OAuth discovery') - } - - const nextAuthorization = { - ...(currentConfig.authorization || { mode: 'interactive' as const }), + const assertCurrent = this.captureOperation(config.serverId) + try { + const startingBinding = requireServerBinding(config) + const issuer = assertConfiguredDiscovery(config, info) + const providerBinding = provider.getBinding() + const resourceValue = + info.resourceMetadata?.resource || + providerBinding.protectedResourceUrl || + config.authorization?.protectedResourceUrl + const protectedResourceUrl = resourceValue ? normalizeUrlIdentifier(resourceValue) : undefined + const clientId = + clientIdHint || providerBinding.clientId || config.authorization?.clientId || undefined + let finalBinding: McpCredentialBinding = { + ...startingBinding, authorizationServerIssuer: issuer, protectedResourceUrl, clientId } - const needsUpdate = - currentConfig.authorization?.authorizationServerIssuer !== issuer || - currentConfig.authorization?.protectedResourceUrl !== protectedResourceUrl || - currentConfig.authorization?.clientId !== clientId - if (needsUpdate) { - await this.settings.updateMcpServer(currentServerName, { - authorization: nextAuthorization - }) - const updatedConfig = (await this.settings.getMcpServers())[currentServerName] - if (!updatedConfig || updatedConfig.serverId !== startingBinding.serverId) { - throw new Error('MCP server binding could not be finalized after OAuth discovery') - } - finalBinding = requireServerBinding(updatedConfig) - this.onServerBindingChanged?.(startingBinding.serverId) - } else { - finalBinding = currentBinding + if (this.settings) { + assertCurrent() + finalBinding = requireServerBinding( + this.settings.finalizeOAuthBinding(startingBinding, { + ...(config.authorization || { mode: 'interactive' as const }), + authorizationServerIssuer: issuer, + protectedResourceUrl, + clientId + }) + ) + if ( + finalBinding.configGeneration !== startingBinding.configGeneration || + finalBinding.bindingHash !== startingBinding.bindingHash + ) + this.onServerBindingChanged?.(startingBinding.serverId) } + await provider.rebind({ + ...finalBinding, + authorizationServerIssuer: issuer, + protectedResourceUrl, + clientId + }) + assertCurrent() + return provider.getBinding() + } finally { + assertCurrent() } - - provider.rebind({ - ...finalBinding, - authorizationServerIssuer: issuer, - protectedResourceUrl, - clientId - }) - return provider.getBinding() } - private createInteractiveProvider( config: MCPServerConfig, binding: McpCredentialBinding, @@ -917,10 +1075,13 @@ export class McpOAuthManager { state?: string interactive: boolean initialCredentialKey?: string + assertActive(): void } ): DeepChatMcpOAuthProvider { return new DeepChatMcpOAuthProvider({ store: this.store, + openExternal: this.openExternal, + assertActive: options.assertActive, binding, credentialKey: (nextBinding) => createMcpCredentialKey('interactive_oauth', nextBinding), initialCredentialKey: options.initialCredentialKey, @@ -931,167 +1092,186 @@ export class McpOAuthManager { scopes: config.authorization?.scopes }) } - - private findInteractiveCredential( + private async findInteractiveCredential( serverName: string, config: Partial, binding: McpCredentialBinding ) { - const current = this.store.findInteractiveCredential(binding) - if (current) { - return current - } - - const legacyKey = createHash('sha256') - .update(`${serverName}\n${config.type || ''}\n${config.baseUrl || ''}`) - .digest('hex') - const legacy = this.store.load(legacyKey) - if (!legacy) { - return null - } - const issuer = - legacy.discoveryState?.authorizationServerMetadata?.issuer || - legacy.discoveryState?.authorizationServerUrl - if ( - !issuer || - (binding.authorizationServerIssuer && - normalizeMcpOAuthIssuer(binding.authorizationServerIssuer) !== - normalizeMcpOAuthIssuer(issuer)) - ) { - this.store.clearEntry(legacyKey) - return null - } - const migratedBinding: McpCredentialBinding = { - ...binding, - authorizationServerIssuer: normalizeMcpOAuthIssuer(issuer), - protectedResourceUrl: - legacy.discoveryState?.resourceMetadata?.resource || binding.protectedResourceUrl + const assertCurrent = this.captureOperation(binding.serverId) + try { + const current = await this.store.findInteractiveCredential(binding) + assertCurrent() + if (current) { + return current + } + const legacyKey = createHash('sha256') + .update(`${serverName}\n${config.type || ''}\n${config.baseUrl || ''}`) + .digest('hex') + const legacy = await this.store.load(legacyKey) + assertCurrent() + if (!legacy) { + return null + } + const issuer = + legacy.discoveryState?.authorizationServerMetadata?.issuer || + legacy.discoveryState?.authorizationServerUrl + if ( + !issuer || + (binding.authorizationServerIssuer && + normalizeMcpOAuthIssuer(binding.authorizationServerIssuer) !== + normalizeMcpOAuthIssuer(issuer)) + ) { + assertCurrent() + await this.store.clearEntry(legacyKey) + assertCurrent() + return null + } + const migratedBinding: McpCredentialBinding = { + ...binding, + authorizationServerIssuer: normalizeMcpOAuthIssuer(issuer), + protectedResourceUrl: + legacy.discoveryState?.resourceMetadata?.resource || binding.protectedResourceUrl + } + const nextKey = createMcpCredentialKey('interactive_oauth', migratedBinding) + assertCurrent() + return await this.store.moveInteractiveEntry(legacyKey, nextKey, migratedBinding) + } finally { + assertCurrent() } - const nextKey = createMcpCredentialKey('interactive_oauth', migratedBinding) - this.store.saveEntry(nextKey, { - ...legacy, - binding: migratedBinding - }) - this.store.clearEntry(legacyKey) - return { key: nextKey, entry: this.store.load(nextKey)! } } - private async createMachineProvider( config: MCPServerConfig, binding: McpCredentialBinding, info: OAuthServerInfo ): Promise { - const mode = getAuthorizationMode(config) - const clientId = config.authorization?.clientId - if (!clientId) { - throw new Error('MCP machine authorization client ID is required') - } - const methods = supportedTokenAuthMethods(info.authorizationServerMetadata) - const issuer = discoveryIssuer(info) - const scope = config.authorization?.scopes?.join(' ') - - if (mode === 'client_credentials') { - if (!methods.includes('client_secret_basic')) { - throw new Error('MCP authorization server does not support client_secret_basic') - } - const credential = this.store.loadClientSecret( - createMcpCredentialKey('client_secret', binding) - ) - if (!credential) { - throw new Error('MCP client secret is not configured') - } - return bindProviderToProtectedResource( - new ClientCredentialsProvider({ - clientId, - clientSecret: credential.secret, - clientName: 'DeepChat', - scope, - expectedIssuer: issuer - }), - binding - ) - } - - if (mode === 'private_key_jwt') { - if (!methods.includes('private_key_jwt')) { - throw new Error('MCP authorization server does not support private_key_jwt') - } - const credential = this.store.loadPrivateKey(createMcpCredentialKey('private_key', binding)) - if (!credential) { - throw new Error('MCP private key is not configured') + const assertCurrent = this.captureOperation(binding.serverId) + try { + const mode = getAuthorizationMode(config) + const clientId = config.authorization?.clientId + if (!clientId) { + throw new Error('MCP machine authorization client ID is required') } - return bindProviderToProtectedResource( - new PrivateKeyJwtProvider({ - clientId, - privateKey: credential.privateKey, - algorithm: credential.algorithm, - clientName: 'DeepChat', - scope, - expectedIssuer: issuer - }), - binding - ) - } - - if (mode === 'cross_app_access') { - if (!methods.includes('client_secret_basic')) { - throw new Error('MCP authorization server does not support client_secret_basic') + const methods = supportedTokenAuthMethods(info.authorizationServerMetadata) + const issuer = discoveryIssuer(info) + const scope = config.authorization?.scopes?.join(' ') + if (mode === 'client_credentials') { + if (!methods.includes('client_secret_basic')) { + throw new Error('MCP authorization server does not support client_secret_basic') + } + const credential = await this.store.loadClientSecret( + createMcpCredentialKey('client_secret', binding) + ) + assertCurrent() + if (!credential) { + throw new Error('MCP client secret is not configured') + } + return bindProviderToProtectedResource( + new ClientCredentialsProvider({ + clientId, + clientSecret: credential.secret, + clientName: 'DeepChat', + scope, + expectedIssuer: issuer + }), + binding + ) } - const profiles = ( - info.authorizationServerMetadata as AuthorizationServerMetadata & { - authorization_grant_profiles_supported?: string[] + if (mode === 'private_key_jwt') { + if (!methods.includes('private_key_jwt')) { + throw new Error('MCP authorization server does not support private_key_jwt') + } + const credential = await this.store.loadPrivateKey( + createMcpCredentialKey('private_key', binding) + ) + assertCurrent() + if (!credential) { + throw new Error('MCP private key is not configured') } - ).authorization_grant_profiles_supported - if (!profiles?.includes('urn:ietf:params:oauth:grant-profile:id-jag')) { - throw new Error('MCP authorization server does not support the ID-JAG grant profile') + return bindProviderToProtectedResource( + new PrivateKeyJwtProvider({ + clientId, + privateKey: credential.privateKey, + algorithm: credential.algorithm, + clientName: 'DeepChat', + scope, + expectedIssuer: issuer + }), + binding + ) } - const credential = this.store.loadEnterpriseResourceSecret( - createMcpCredentialKey('enterprise_resource_secret', binding) - ) - if (!credential) { - throw new Error('MCP enterprise resource client secret is not configured') + if (mode === 'cross_app_access') { + if (!methods.includes('client_secret_basic')) { + throw new Error('MCP authorization server does not support client_secret_basic') + } + const profiles = ( + info.authorizationServerMetadata as AuthorizationServerMetadata & { + authorization_grant_profiles_supported?: string[] + } + ).authorization_grant_profiles_supported + if (!profiles?.includes('urn:ietf:params:oauth:grant-profile:id-jag')) { + throw new Error('MCP authorization server does not support the ID-JAG grant profile') + } + const credential = await this.store.loadEnterpriseResourceSecret( + createMcpCredentialKey('enterprise_resource_secret', binding) + ) + assertCurrent() + if (!credential) { + throw new Error('MCP enterprise resource client secret is not configured') + } + return bindProviderToProtectedResource( + await this.requireEnterpriseIdentity().createCrossAppProvider( + config, + credential.secret, + issuer + ), + binding + ) } - return bindProviderToProtectedResource( - await this.requireEnterpriseIdentity().createCrossAppProvider( - config, - credential.secret, - issuer - ), - binding - ) + throw new Error(`Unsupported MCP authorization mode: ${mode}`) + } finally { + assertCurrent() } - - throw new Error(`Unsupported MCP authorization mode: ${mode}`) } - - private getCredentialStatus( + private async getCredentialStatus( binding: McpCredentialBinding, kind: McpCredentialKind - ): McpCredentialStatus { - const status = this.store.getCredentialRecordStatus(createMcpCredentialKey(kind, binding), kind) - return { - serverId: binding.serverId, - kind, - configured: status.configured, - persistent: this.store.isPersistent(), - updatedAt: status.updatedAt, - fingerprint: status.fingerprint + ): Promise { + const assertCurrent = this.captureOperation(binding.serverId) + try { + const status = await this.store.getCredentialRecordStatus( + createMcpCredentialKey(kind, binding), + kind + ) + assertCurrent() + return { + serverId: binding.serverId, + kind, + configured: status.configured, + persistent: await this.store.isPersistent(), + updatedAt: status.updatedAt, + fingerprint: status.fingerprint + } + } finally { + assertCurrent() } } - - private getSelectedCredentialStatus( + private async getSelectedCredentialStatus( binding: McpCredentialBinding, mode: McpAuthorizationMode - ): McpCredentialStatus { - const kind: McpCredentialKind = - mode === 'private_key_jwt' - ? 'private_key' - : mode === 'cross_app_access' - ? 'enterprise_resource_secret' - : 'client_secret' - return this.getCredentialStatus(binding, kind) + ): Promise { + const assertCurrent = this.captureOperation(binding.serverId) + try { + const kind: McpCredentialKind = + mode === 'private_key_jwt' + ? 'private_key' + : mode === 'cross_app_access' + ? 'enterprise_resource_secret' + : 'client_secret' + return await this.getCredentialStatus(binding, kind) + } finally { + assertCurrent() + } } - private async finishAuthFlow( flow: PendingMcpOAuthFlow, code: string, @@ -1103,56 +1283,74 @@ export class McpOAuthManager { authorizationCode: code, iss }) - this.finishAuthenticatedFlow(flow) + await this.finishAuthenticatedFlow(flow) } catch (error) { - this.failAuthFlow(flow, error) + await this.failAuthFlow(flow, error) } } - - private finishAuthenticatedFlow(flow: PendingMcpOAuthFlow): void { - if (this.pendingFlows.get(flow.serverId) !== flow) { - return - } + private async finishAuthenticatedFlow(flow: PendingMcpOAuthFlow): Promise { + if (this.stopped || this.pendingFlows.get(flow.serverId) !== flow) return + const assertCurrent = flow.assertActive + const entry = await this.store.findInteractiveCredential(flow.binding) + assertCurrent() + const storage = await this.getStorageSnapshot() + assertCurrent() + if (this.pendingFlows.get(flow.serverId) !== flow) return this.pendingFlows.delete(flow.serverId) flow.callbackSession.close() - const entry = this.store.findInteractiveCredential(flow.binding) const current = this.statuses.get(flow.serverId) - this.setStatus({ - serverName: flow.serverName, - serverId: flow.serverId, - state: 'authenticated', - authenticated: true, - updatedAt: entry?.entry.updatedAt || Date.now(), - storage: this.store.getStorageState(), - persistent: this.store.isPersistent(), - mode: 'interactive', - ...(current?.credential ? { credential: current.credential } : {}) - }) - - void Promise.resolve(this.onAuthenticated?.(flow.serverName)).catch((error) => { - logger.warn( - '[MCP OAuth] Failed to restart server after authentication:', - sanitizeError(error) - ) - }) + this.setStatus( + { + serverName: flow.serverName, + serverId: flow.serverId, + state: 'authenticated', + authenticated: true, + updatedAt: entry?.entry.updatedAt || Date.now(), + ...storage, + mode: 'interactive', + ...(current?.credential ? { credential: current.credential } : {}) + }, + assertCurrent + ) + void Promise.resolve() + .then(() => { + assertCurrent() + return this.applyRuntimeChange(flow.serverId, 'restart', assertCurrent) + }) + .catch((error) => { + if (!this.stopped) + logger.warn( + '[MCP OAuth] Failed to restart server after authentication:', + sanitizeError(error) + ) + }) } - private failAuthFlow(flow: PendingMcpOAuthFlow, error: unknown): void { - if (this.pendingFlows.get(flow.serverId) !== flow) { - return + private async failAuthFlow(flow: PendingMcpOAuthFlow, error: unknown): Promise { + if (this.stopped || this.pendingFlows.get(flow.serverId) !== flow) return + const assertCurrent = flow.assertActive + try { + const storage = await this.getStorageSnapshot() + assertCurrent() + if (this.pendingFlows.get(flow.serverId) !== flow) return + this.pendingFlows.delete(flow.serverId) + flow.callbackSession.close() + this.setStatus( + { + serverName: flow.serverName, + serverId: flow.serverId, + state: 'error', + authenticated: false, + error: sanitizeError(error), + ...storage, + mode: 'interactive' + }, + assertCurrent + ) + } catch (failure) { + if (this.stopped || this.pendingFlows.get(flow.serverId) !== flow) return + throw failure } - this.pendingFlows.delete(flow.serverId) - flow.callbackSession.close() - this.setStatus({ - serverName: flow.serverName, - serverId: flow.serverId, - state: 'error', - authenticated: false, - error: sanitizeError(error), - storage: this.store.getStorageState(), - persistent: this.store.isPersistent(), - mode: 'interactive' - }) } private cancelPendingFlow(serverId: string): void { @@ -1163,25 +1361,38 @@ export class McpOAuthManager { pending.callbackSession.close() this.pendingFlows.delete(serverId) } - - private buildStatus( + private async buildStatus( serverName: string, binding: McpCredentialBinding, mode: McpAuthorizationMode, state: Pick & Partial> - ): McpServerAuthStatus { + ): Promise { return { serverName, serverId: binding.serverId, ...state, - storage: this.store.getStorageState(), - persistent: this.store.isPersistent(), + ...(await this.getStorageSnapshot()), mode } } + private async applyRuntimeChange( + serverId: string, + action: 'restart' | 'stop', + assertCurrent: () => void + ): Promise { + assertCurrent() + await this.onRuntimeChange?.(serverId, action, assertCurrent) + assertCurrent() + } - private setStatus(status: McpServerAuthStatus): void { + private async getStorageSnapshot() { + const storage = await this.store.getStorageState() + return { storage, persistent: storage === 'safeStorage' } + } + + private setStatus(status: McpServerAuthStatus, assertCurrent: () => void): void { + assertCurrent() if (status.serverId) { this.statuses.set(status.serverId, status) } @@ -1191,17 +1402,14 @@ export class McpOAuthManager { version: Date.now() }) } - private requireEnterpriseIdentity(): McpEnterpriseIdentityManager { if (!this.enterpriseIdentity) { throw new Error('MCP enterprise identity support is not configured') } return this.enterpriseIdentity } - private getDefaultRedirectUri(): string { return `http://localhost:${MCP_OAUTH_REDIRECT_PORT}${MCP_OAUTH_REDIRECT_PATH}` } } - export { isRemoteOAuthCapable, resolveOAuthLoopbackCallbackUrl } diff --git a/src/main/mcp/mcpOAuthProvider.ts b/src/main/mcp/mcpOAuthProvider.ts index 4307f138e3..c3788bc0fb 100644 --- a/src/main/mcp/mcpOAuthProvider.ts +++ b/src/main/mcp/mcpOAuthProvider.ts @@ -1,4 +1,3 @@ -import { shell } from 'electron' import type { OAuthClientInformationContext, OAuthClientMetadata, @@ -13,6 +12,8 @@ import { normalizeMcpOAuthIssuer, type McpOAuthCredentialStore } from './oauthCr export type DeepChatMcpOAuthProviderOptions = { store: McpOAuthCredentialStore + openExternal(url: string): Promise + assertActive(): void binding: McpCredentialBinding credentialKey(binding: McpCredentialBinding): string initialCredentialKey?: string @@ -40,6 +41,12 @@ export class DeepChatMcpOAuthProvider implements OAuthClientProvider { private readonly interactive: boolean private activeBinding: McpCredentialBinding private activeCredentialKey: string + private operations: Promise = Promise.resolve() + private pending = 0 + private pendingNormal = 0 + private callbackValidation: { issuer?: string; issParameterSupported: boolean } = { + issParameterSupported: false + } constructor(private readonly options: DeepChatMcpOAuthProviderOptions) { this.store = options.store @@ -74,158 +81,189 @@ export class DeepChatMcpOAuthProvider implements OAuthClientProvider { clientInformation( context?: OAuthClientInformationContext - ): StoredOAuthClientInformation | undefined { - return this.loadForContext(context)?.clientInformation + ): Promise { + return this.perform(async () => (await this.loadForContext(context))?.clientInformation) } saveClientInformation( clientInformation: StoredOAuthClientInformation, context?: OAuthClientInformationContext - ): void { - this.activateContext(context) - this.moveActiveEntry({ - ...this.activeBinding, - clientId: clientInformation.client_id - }) - this.store.saveEntry(this.activeCredentialKey, { - clientInformation, - binding: this.activeBinding + ): Promise { + return this.perform(async () => { + await this.activateContext(context) + await this.moveActiveEntry({ ...this.activeBinding, clientId: clientInformation.client_id }) + this.options.assertActive() + await this.store.saveEntry(this.activeCredentialKey, { + clientInformation, + binding: this.activeBinding + }) }) } - tokens(context?: OAuthClientInformationContext): StoredOAuthTokens | undefined { - return this.loadForContext(context)?.tokens + tokens(context?: OAuthClientInformationContext): Promise { + return this.perform(async () => (await this.loadForContext(context))?.tokens) } - saveTokens(tokens: StoredOAuthTokens, context?: OAuthClientInformationContext): void { - this.activateContext(context) - this.store.saveEntry(this.activeCredentialKey, { - tokens, - binding: this.activeBinding + saveTokens(tokens: StoredOAuthTokens, context?: OAuthClientInformationContext): Promise { + return this.perform(async () => { + await this.activateContext(context) + this.options.assertActive() + await this.store.saveEntry(this.activeCredentialKey, { tokens, binding: this.activeBinding }) }) } - async redirectToAuthorization(authorizationUrl: URL): Promise { - if (!this.interactive) { - throw new Error('MCP OAuth authentication is required') - } - if ( - authorizationUrl.protocol !== 'https:' && - !(authorizationUrl.protocol === 'http:' && isLoopbackHost(authorizationUrl.hostname)) - ) { - throw new Error('MCP OAuth authorization URL must use HTTPS or loopback HTTP') - } + redirectToAuthorization(authorizationUrl: URL): Promise { + return this.perform(async () => { + if (!this.interactive) throw new Error('MCP OAuth authentication is required') + if ( + authorizationUrl.protocol !== 'https:' && + !(authorizationUrl.protocol === 'http:' && isLoopbackHost(authorizationUrl.hostname)) + ) + throw new Error('MCP OAuth authorization URL must use HTTPS or loopback HTTP') + await this.options.openExternal(authorizationUrl.toString()) + }) + } - await shell.openExternal(authorizationUrl.toString()) + saveCodeVerifier(codeVerifier: string): Promise { + return this.perform(async () => { + this.options.assertActive() + await this.store.saveEntry(this.activeCredentialKey, { + codeVerifier, + binding: this.activeBinding + }) + }) } - saveCodeVerifier(codeVerifier: string): void { - this.store.saveEntry(this.activeCredentialKey, { - codeVerifier, - binding: this.activeBinding + codeVerifier(): Promise { + return this.perform(async () => { + const verifier = (await this.store.load(this.activeCredentialKey))?.codeVerifier + if (!verifier) throw new Error('MCP OAuth code verifier is unavailable') + return verifier }) } - codeVerifier(): string { - const codeVerifier = this.store.load(this.activeCredentialKey)?.codeVerifier - if (!codeVerifier) { - throw new Error('MCP OAuth code verifier is unavailable') - } - return codeVerifier + invalidateCredentials( + scope: 'all' | 'client' | 'tokens' | 'verifier' | 'discovery' + ): Promise { + return this.perform(async () => { + await this.store.clearEntryScope(this.activeCredentialKey, scope) + }, true) } - invalidateCredentials(scope: 'all' | 'client' | 'tokens' | 'verifier' | 'discovery'): void { - this.store.clearEntryScope(this.activeCredentialKey, scope) + saveDiscoveryState(state: OAuthDiscoveryState): Promise { + return this.perform(async () => { + await this.moveActiveEntry({ + ...this.activeBinding, + authorizationServerIssuer: discoveryIssuer(state), + protectedResourceUrl: discoveryResource(state, this.activeBinding.protectedResourceUrl) + }) + this.options.assertActive() + await this.store.saveEntry(this.activeCredentialKey, { + discoveryState: state, + binding: this.activeBinding + }) + this.options.assertActive() + this.rememberCallbackValidation(state) + }) } - saveDiscoveryState(state: OAuthDiscoveryState): void { - const nextBinding: McpCredentialBinding = { - ...this.activeBinding, - authorizationServerIssuer: discoveryIssuer(state), - protectedResourceUrl: discoveryResource(state, this.activeBinding.protectedResourceUrl) - } - this.moveActiveEntry(nextBinding) - this.store.saveEntry(this.activeCredentialKey, { - discoveryState: state, - binding: this.activeBinding + discoveryState(): Promise { + return this.perform(async () => { + const state = (await this.store.load(this.activeCredentialKey))?.discoveryState + this.options.assertActive() + this.rememberCallbackValidation(state) + return state }) } - discoveryState(): OAuthDiscoveryState | undefined { - return this.store.load(this.activeCredentialKey)?.discoveryState + getCallbackValidation(): { issuer?: string; issParameterSupported: boolean } { + this.options.assertActive() + return { ...this.callbackValidation } + } + + private rememberCallbackValidation(state?: OAuthDiscoveryState): void { + this.callbackValidation = { + issuer: state?.authorizationServerMetadata?.issuer || state?.authorizationServerUrl, + issParameterSupported: + state?.authorizationServerMetadata?.authorization_response_iss_parameter_supported === true + } } getBinding(): McpCredentialBinding { + this.options.assertActive() return { ...this.activeBinding } } - rebind(binding: McpCredentialBinding): void { - this.moveActiveEntry(binding) + rebind(binding: McpCredentialBinding): Promise { + return this.perform(() => this.moveActiveEntry(binding)) } - private loadForContext(context?: OAuthClientInformationContext) { - if (!context) { - return this.store.load(this.activeCredentialKey) || undefined - } + private async perform(operation: () => Promise, control = false): Promise { + this.options.assertActive() + if (this.pending >= 32 || (!control && this.pendingNormal >= 24)) + return Promise.reject(new Error('MCP OAuth provider operation queue is full')) + this.pending++ + if (!control) this.pendingNormal++ + const result = this.operations.then(async () => { + this.options.assertActive() + const value = await operation() + this.options.assertActive() + return value + }) + this.operations = result.then( + () => undefined, + () => undefined + ) + return result.finally(() => { + this.pending-- + if (!control) this.pendingNormal-- + this.options.assertActive() + }) + } + private async loadForContext(context?: OAuthClientInformationContext) { + if (!context) + return this.store.load(this.activeCredentialKey).then((value) => value || undefined) const contextIssuer = normalizeMcpOAuthIssuer(context.issuer) - const contextualBinding = { - ...this.activeBinding, - authorizationServerIssuer: contextIssuer - } - const contextualKey = this.options.credentialKey(contextualBinding) - const contextual = this.store.load(contextualKey) + const binding = { ...this.activeBinding, authorizationServerIssuer: contextIssuer } + const key = this.options.credentialKey(binding) + const contextual = await this.store.load(key) + this.options.assertActive() if (contextual) { - this.activeBinding = contextualBinding - this.activeCredentialKey = contextualKey + this.activeBinding = binding + this.activeCredentialKey = key return contextual } - - const active = this.store.load(this.activeCredentialKey) - const storedIssuer = + const active = await this.store.load(this.activeCredentialKey) + this.options.assertActive() + const issuer = active?.binding?.authorizationServerIssuer || active?.discoveryState?.authorizationServerMetadata?.issuer || active?.discoveryState?.authorizationServerUrl || active?.tokens?.issuer || active?.clientInformation?.issuer - if (active && storedIssuer && normalizeMcpOAuthIssuer(storedIssuer) === contextIssuer) { - this.moveActiveEntry(contextualBinding) - return this.store.load(this.activeCredentialKey) || undefined + if (active && issuer && normalizeMcpOAuthIssuer(issuer) === contextIssuer) { + await this.moveActiveEntry(binding) + return (await this.store.load(this.activeCredentialKey)) || undefined } - return undefined } - private activateContext(context?: OAuthClientInformationContext): void { - if (!context) { - return - } - const contextIssuer = normalizeMcpOAuthIssuer(context.issuer) - if (this.activeBinding.authorizationServerIssuer === contextIssuer) { - return - } - this.moveActiveEntry({ - ...this.activeBinding, - authorizationServerIssuer: contextIssuer - }) + private async activateContext(context?: OAuthClientInformationContext): Promise { + this.options.assertActive() + if (!context) return + const issuer = normalizeMcpOAuthIssuer(context.issuer) + if (this.activeBinding.authorizationServerIssuer !== issuer) + await this.moveActiveEntry({ ...this.activeBinding, authorizationServerIssuer: issuer }) } - private moveActiveEntry(nextBinding: McpCredentialBinding): void { - const nextKey = this.options.credentialKey(nextBinding) - if (nextKey === this.activeCredentialKey) { - this.activeBinding = nextBinding - return - } - - const current = this.store.load(this.activeCredentialKey) - if (current) { - this.store.saveEntry(nextKey, { - ...current, - binding: nextBinding - }) - this.store.clearEntry(this.activeCredentialKey) - } - this.activeBinding = nextBinding - this.activeCredentialKey = nextKey + private async moveActiveEntry(binding: McpCredentialBinding): Promise { + this.options.assertActive() + const key = this.options.credentialKey(binding) + if (key !== this.activeCredentialKey) + await this.store.moveInteractiveEntry(this.activeCredentialKey, key, binding) + this.options.assertActive() + this.activeBinding = binding + this.activeCredentialKey = key } } diff --git a/src/main/mcp/oauthCredentialStore.ts b/src/main/mcp/oauthCredentialStore.ts index b377bdfab4..b458446e2d 100644 --- a/src/main/mcp/oauthCredentialStore.ts +++ b/src/main/mcp/oauthCredentialStore.ts @@ -1,7 +1,7 @@ import * as fs from 'node:fs' import * as path from 'node:path' import { randomBytes } from 'node:crypto' -import { app, safeStorage } from 'electron' +import type { CredentialCryptoPort } from '@/config/secretStore' import type { OAuthDiscoveryState, StoredOAuthClientInformation, @@ -153,108 +153,149 @@ const isCredentialBinding = (value: unknown): value is McpCredentialBinding => { ) } -const isLinuxBasicTextBackend = (): boolean => { - if (process.platform !== 'linux') { - return false - } - - try { - return safeStorage.getSelectedStorageBackend() === 'basic_text' - } catch { - return true - } -} +const MAX_PENDING_MUTATIONS = 32 +const MAX_NORMAL_MUTATIONS = 24 export class McpOAuthCredentialStore { private readonly filePath: string + private readonly crypto: CredentialCryptoPort private loaded = false private loadFailed = false + private loading: Promise | null = null + private mutations: Promise = Promise.resolve() + private pendingMutations = 0 + private pendingNormalMutations = 0 + private generation = 0 + private stopped = false private records: McpCredentialData = {} - constructor(filePath?: string) { - this.filePath = filePath || path.join(app.getPath('userData'), 'mcp-oauth', 'credentials.json') + constructor(options: { filePath: string; crypto: CredentialCryptoPort }) { + this.filePath = options.filePath + this.crypto = options.crypto + } + + stop(): void { + this.stopped = true + this.generation++ + this.records = {} + } + + private captureOperation(): () => void { + const generation = this.generation + const check = () => { + if (this.stopped || generation !== this.generation) + throw new Error('MCP credential operation interrupted') + } + check() + return check } - getStorageState(): McpOAuthCredentialStorage { + async getStorageState(): Promise { + const check = this.captureOperation() try { - if (!safeStorage.isEncryptionAvailable() || isLinuxBasicTextBackend()) { - return 'memory' - } - return 'safeStorage' + const available = await this.crypto.isAvailable() + check() + return available ? 'safeStorage' : 'memory' } catch { + check() return 'memory' } } - isPersistent(): boolean { - return this.getStorageState() === 'safeStorage' + async isPersistent(): Promise { + return (await this.getStorageState()) === 'safeStorage' } - load(key: string): McpOAuthCredentialEntry | null { - const record = this.loadRecord(key) - return record?.credentialClass === 'interactive_oauth' ? record.value : null + load(key: string): Promise { + return this.read((records) => { + const record = records[key] + return record?.credentialClass === 'interactive_oauth' ? record.value : null + }) } - saveEntry(key: string, entry: Partial): McpOAuthCredentialEntry { - const current = this.load(key) - const next: McpOAuthCredentialEntry = { - ...(current || { updatedAt: Date.now() }), - ...entry, - updatedAt: Date.now() - } - this.saveRecord(key, { - credentialClass: 'interactive_oauth', - value: next + saveEntry( + key: string, + entry: Partial + ): Promise { + return this.write((records) => { + const record = records[key] + const current = record?.credentialClass === 'interactive_oauth' ? record.value : undefined + const next = { ...current, ...entry, updatedAt: Date.now() } + return { + records: this.withRecord(records, key, { + credentialClass: 'interactive_oauth', + value: next + }), + value: next + } }) - return next } - findInteractiveCredential( + moveInteractiveEntry( + fromKey: string, + toKey: string, binding: McpCredentialBinding - ): { key: string; entry: McpOAuthCredentialEntry } | null { - this.ensureLoaded() - const matches = Object.entries(this.records).filter(([, record]) => { - if (record.credentialClass !== 'interactive_oauth' || !record.value.binding) { - return false + ): Promise<{ key: string; entry: McpOAuthCredentialEntry } | null> { + return this.write((records) => { + const source = records[fromKey] + if (source?.credentialClass !== 'interactive_oauth') return { records, value: null } + const target = records[toKey] + const entry = { + ...(target?.credentialClass === 'interactive_oauth' ? target.value : {}), + ...source.value, + binding, + updatedAt: Date.now() } - const stored = record.value.binding - return ( - stored.serverId === binding.serverId && - stored.configGeneration === binding.configGeneration && - stored.bindingHash === binding.bindingHash && - stored.endpoint === binding.endpoint && - (binding.protectedResourceUrl === undefined || - stored.protectedResourceUrl === binding.protectedResourceUrl) && - (binding.authorizationServerIssuer === undefined || - (stored.authorizationServerIssuer !== undefined && - normalizeMcpOAuthIssuer(stored.authorizationServerIssuer) === - normalizeMcpOAuthIssuer(binding.authorizationServerIssuer))) && - (binding.clientId === undefined || stored.clientId === binding.clientId) - ) + const next = this.withRecord(records, toKey, { + credentialClass: 'interactive_oauth', + value: entry + }) + if (fromKey !== toKey) delete next[fromKey] + return { records: next, value: { key: toKey, entry } } + }) + } + + findInteractiveCredential( + binding: McpCredentialBinding + ): Promise<{ key: string; entry: McpOAuthCredentialEntry } | null> { + return this.read((records) => { + const matches = Object.entries(records).filter(([, record]) => { + if (record.credentialClass !== 'interactive_oauth' || !record.value.binding) return false + const stored = record.value.binding + return ( + stored.serverId === binding.serverId && + stored.configGeneration === binding.configGeneration && + stored.bindingHash === binding.bindingHash && + stored.endpoint === binding.endpoint && + (binding.protectedResourceUrl === undefined || + stored.protectedResourceUrl === binding.protectedResourceUrl) && + (binding.authorizationServerIssuer === undefined || + (stored.authorizationServerIssuer !== undefined && + normalizeMcpOAuthIssuer(stored.authorizationServerIssuer) === + normalizeMcpOAuthIssuer(binding.authorizationServerIssuer))) && + (binding.clientId === undefined || stored.clientId === binding.clientId) + ) + }) + if (matches.length !== 1) return null + const [key, record] = matches[0] + return { key, entry: (record as InteractiveCredentialRecord).value } }) - if (matches.length !== 1) { - return null - } - const [key, record] = matches[0] - return { - key, - entry: (record as InteractiveCredentialRecord).value - } } saveClientSecret( key: string, secret: string, binding: McpCredentialBinding - ): McpSecretCredential { + ): Promise { const value = { secret, binding, updatedAt: Date.now() } - this.saveRecord(key, { credentialClass: 'client_secret', value }) - return value + return this.saveRecord(key, { credentialClass: 'client_secret', value }) } - loadClientSecret(key: string): McpSecretCredential | null { - const record = this.loadRecord(key) - return record?.credentialClass === 'client_secret' ? record.value : null + loadClientSecret(key: string): Promise { + return this.read((records) => { + const record = records[key] + return record?.credentialClass === 'client_secret' ? record.value : null + }) } savePrivateKey( @@ -265,50 +306,47 @@ export class McpOAuthCredentialStore { fingerprint: string binding: McpCredentialBinding } - ): McpPrivateKeyCredential { + ): Promise { const value = { ...input, updatedAt: Date.now() } - this.saveRecord(key, { credentialClass: 'private_key', value }) - return value + return this.saveRecord(key, { credentialClass: 'private_key', value }) } - loadPrivateKey(key: string): McpPrivateKeyCredential | null { - const record = this.loadRecord(key) - return record?.credentialClass === 'private_key' ? record.value : null + loadPrivateKey(key: string): Promise { + return this.read((records) => { + const record = records[key] + return record?.credentialClass === 'private_key' ? record.value : null + }) } saveEnterpriseResourceSecret( key: string, secret: string, binding: McpCredentialBinding - ): McpSecretCredential { + ): Promise { const value = { secret, binding, updatedAt: Date.now() } - this.saveRecord(key, { - credentialClass: 'enterprise_resource_secret', - value - }) - return value + return this.saveRecord(key, { credentialClass: 'enterprise_resource_secret', value }) } - loadEnterpriseResourceSecret(key: string): McpSecretCredential | null { - const record = this.loadRecord(key) - return record?.credentialClass === 'enterprise_resource_secret' ? record.value : null + loadEnterpriseResourceSecret(key: string): Promise { + return this.read((records) => { + const record = records[key] + return record?.credentialClass === 'enterprise_resource_secret' ? record.value : null + }) } saveEnterpriseIdentity( key: string, - value: Omit - ): McpEnterpriseIdentityCredential { - const next = { ...value, updatedAt: Date.now() } - this.saveRecord(key, { - credentialClass: 'enterprise_identity', - value: next - }) - return next + input: Omit + ): Promise { + const value = { ...input, updatedAt: Date.now() } + return this.saveRecord(key, { credentialClass: 'enterprise_identity', value }) } - loadEnterpriseIdentity(key: string): McpEnterpriseIdentityCredential | null { - const record = this.loadRecord(key) - return record?.credentialClass === 'enterprise_identity' ? record.value : null + loadEnterpriseIdentity(key: string): Promise { + return this.read((records) => { + const record = records[key] + return record?.credentialClass === 'enterprise_identity' ? record.value : null + }) } saveEnterpriseIdentityClientSecret( @@ -319,214 +357,241 @@ export class McpOAuthCredentialStore { clientId: string secret: string } - ): void { - this.saveRecord(key, { + ): Promise { + return this.saveRecord(key, { credentialClass: 'enterprise_identity_client_secret', value: { ...value, updatedAt: Date.now() } - }) + }).then(() => undefined) } - loadEnterpriseIdentityClientSecret(key: string): string | null { - const record = this.loadRecord(key) - return record?.credentialClass === 'enterprise_identity_client_secret' - ? record.value.secret - : null + loadEnterpriseIdentityClientSecret(key: string): Promise { + return this.read((records) => { + const record = records[key] + return record?.credentialClass === 'enterprise_identity_client_secret' + ? record.value.secret + : null + }) } getCredentialRecordStatus( key: string, kind: McpCredentialKind - ): { configured: boolean; updatedAt?: number; fingerprint?: string } { - const record = this.loadRecord(key) - if (!record || record.credentialClass !== kind) { - return { configured: false } - } - - return { - configured: true, - updatedAt: record.value.updatedAt, - ...(record.credentialClass === 'private_key' ? { fingerprint: record.value.fingerprint } : {}) - } + ): Promise<{ configured: boolean; updatedAt?: number; fingerprint?: string }> { + return this.read((records) => { + const record = records[key] + if (!record || record.credentialClass !== kind) return { configured: false } + return { + configured: true, + updatedAt: record.value.updatedAt, + ...(record.credentialClass === 'private_key' + ? { fingerprint: record.value.fingerprint } + : {}) + } + }) } - clearEntry(key: string): void { - this.ensureLoaded() - this.assertWritable() - if (!this.records[key]) { - return - } - delete this.records[key] - this.persist() + clearEntry(key: string): Promise { + return this.write((records) => { + if (!records[key]) return { records, value: undefined } + const next = { ...records } + delete next[key] + return { records: next, value: undefined } + }, true) } clearEntryScope( key: string, scope: 'all' | 'client' | 'tokens' | 'verifier' | 'discovery' - ): void { - if (scope === 'all') { - this.clearEntry(key) - return - } - - const current = this.load(key) - if (!current) { - return - } - - const next: McpOAuthCredentialEntry = { ...current, updatedAt: Date.now() } - if (scope === 'client') { - delete next.clientInformation - } else if (scope === 'tokens') { - delete next.tokens - } else if (scope === 'verifier') { - delete next.codeVerifier - } else if (scope === 'discovery') { - delete next.discoveryState - } - - this.saveRecord(key, { - credentialClass: 'interactive_oauth', - value: next - }) + ): Promise { + if (scope === 'all') return this.clearEntry(key) + return this.write((records) => { + const record = records[key] + if (record?.credentialClass !== 'interactive_oauth') return { records, value: undefined } + const value = { ...record.value, updatedAt: Date.now() } + if (scope === 'client') delete value.clientInformation + else if (scope === 'tokens') delete value.tokens + else if (scope === 'verifier') delete value.codeVerifier + else if (scope === 'discovery') delete value.discoveryState + return { + records: this.withRecord(records, key, { credentialClass: 'interactive_oauth', value }), + value: undefined + } + }, true) } - clearServerCredentials(serverId: string): void { - this.ensureLoaded() - this.assertWritable() - let changed = false - for (const [key, record] of Object.entries(this.records)) { - if ( - (record.credentialClass === 'interactive_oauth' && - record.value.binding?.serverId === serverId) || - (record.credentialClass === 'client_secret' && - record.value.binding.serverId === serverId) || - (record.credentialClass === 'private_key' && record.value.binding.serverId === serverId) || - (record.credentialClass === 'enterprise_resource_secret' && - record.value.binding.serverId === serverId) - ) { - delete this.records[key] - changed = true + clearServerCredentials(serverId: string): Promise { + return this.write((records) => { + const next = { ...records } + for (const [key, record] of Object.entries(records)) { + if ( + (record.credentialClass === 'interactive_oauth' && + record.value.binding?.serverId === serverId) || + ((record.credentialClass === 'client_secret' || + record.credentialClass === 'private_key' || + record.credentialClass === 'enterprise_resource_secret') && + record.value.binding.serverId === serverId) + ) + delete next[key] } - } - if (changed) { - this.persist() - } + return { + records: Object.keys(next).length === Object.keys(records).length ? records : next, + value: undefined + } + }, true) } - clearEnterpriseProfileCredentials(profileId: string): void { - this.ensureLoaded() - this.assertWritable() - let changed = false - for (const [key, record] of Object.entries(this.records)) { - if ( - (record.credentialClass === 'enterprise_identity' || - record.credentialClass === 'enterprise_identity_client_secret') && - record.value.profileId === profileId - ) { - delete this.records[key] - changed = true + clearEnterpriseProfileCredentials(profileId: string): Promise { + return this.write((records) => { + const next = { ...records } + for (const [key, record] of Object.entries(records)) { + if ( + (record.credentialClass === 'enterprise_identity' || + record.credentialClass === 'enterprise_identity_client_secret') && + record.value.profileId === profileId + ) + delete next[key] } - } - if (changed) { - this.persist() - } + return { + records: Object.keys(next).length === Object.keys(records).length ? records : next, + value: undefined + } + }, true) + } + + private async read(select: (records: McpCredentialData) => T): Promise { + const check = this.captureOperation() + await this.ensureLoaded() + await this.mutations + check() + return select(this.records) } - private loadRecord(key: string): StoredCredentialRecord | null { - this.ensureLoaded() - return this.records[key] || null + private saveRecord( + key: string, + record: T + ): Promise { + return this.write((records) => ({ + records: this.withRecord(records, key, record), + value: record.value + })) } - private saveRecord(key: string, record: StoredCredentialRecord): void { - this.ensureLoaded() - this.assertWritable() - if (!isBoundedString(key, MAX_CREDENTIAL_KEY_BYTES)) { + private withRecord( + records: McpCredentialData, + key: string, + record: StoredCredentialRecord + ): McpCredentialData { + if (!isBoundedString(key, MAX_CREDENTIAL_KEY_BYTES)) throw new Error('MCP credential key is invalid') - } const normalized = this.normalizeRecord(record) - if (!normalized) { - throw new Error('MCP credential record is invalid') - } - const next = { ...this.records, [key]: normalized } + if (!normalized) throw new Error('MCP credential record is invalid') + return { ...records, [key]: normalized } + } + + private async write( + mutate: (records: McpCredentialData) => { records: McpCredentialData; value: T }, + control = false + ): Promise { + const check = this.captureOperation() if ( - Object.keys(next).length > MAX_CREDENTIAL_RECORDS || - Buffer.byteLength(JSON.stringify(next), 'utf8') > MAX_CREDENTIAL_PAYLOAD_BYTES - ) { - throw new Error('MCP credential store limit exceeded') - } - this.records = next - this.persist() + this.pendingMutations >= MAX_PENDING_MUTATIONS || + (!control && this.pendingNormalMutations >= MAX_NORMAL_MUTATIONS) + ) + return Promise.reject(new Error('MCP credential mutation queue is full')) + this.pendingMutations++ + if (!control) this.pendingNormalMutations++ + const result = this.mutations.then(async () => { + check() + await this.ensureLoaded() + check() + this.assertWritable() + const next = mutate(this.records) + if (next.records !== this.records) { + if ( + Object.keys(next.records).length > MAX_CREDENTIAL_RECORDS || + Buffer.byteLength(JSON.stringify(next.records), 'utf8') > MAX_CREDENTIAL_PAYLOAD_BYTES + ) + throw new Error('MCP credential store limit exceeded') + await this.persist(next.records, check) + check() + this.records = next.records + } + return next.value + }) + this.mutations = result.then( + () => undefined, + () => undefined + ) + return result.finally(() => { + this.pendingMutations-- + if (!control) this.pendingNormalMutations-- + check() + }) } - private ensureLoaded(): void { - if (this.loaded) { - return - } - this.loaded = true + private ensureLoaded(): Promise { + this.captureOperation() + if (this.loaded) return Promise.resolve() + if (this.loading) return this.loading + const loading = this.loadFile().finally(() => { + if (this.loading === loading) this.loading = null + }) + this.loading = loading + return loading + } + private async loadFile(): Promise { + const check = this.captureOperation() try { - if (!fs.existsSync(this.filePath)) { - return - } - - if (fs.statSync(this.filePath).size > MAX_CREDENTIAL_FILE_BYTES) { + if (!fs.existsSync(this.filePath)) return + if (fs.statSync(this.filePath).size > MAX_CREDENTIAL_FILE_BYTES) throw new Error('MCP credential file is oversized') - } - const serializedEnvelope = fs.readFileSync(this.filePath, 'utf-8') - if (Buffer.byteLength(serializedEnvelope, 'utf8') > MAX_CREDENTIAL_FILE_BYTES) { + const serialized = fs.readFileSync(this.filePath, 'utf8') + if (Buffer.byteLength(serialized, 'utf8') > MAX_CREDENTIAL_FILE_BYTES) throw new Error('MCP credential file is oversized') - } - const envelope = JSON.parse(serializedEnvelope) as + const envelope = JSON.parse(serialized) as | StoredCredentialEnvelopeV1 | StoredCredentialEnvelopeV2 | undefined - if (!envelope) { - return - } - + if (!envelope) return if (envelope.version === 2 && envelope.storage === 'safeStorage') { if ( !isBoundedString(envelope.wrapped, MAX_CREDENTIAL_FILE_BYTES) || !isTimestamp(envelope.updatedAt) - ) { + ) throw new Error('MCP credential envelope is invalid') - } - if (!this.isPersistent()) { + const persistent = await this.isPersistent() + check() + if (!persistent) { fs.unlinkSync(this.filePath) return } - const raw = safeStorage.decryptString(Buffer.from(envelope.wrapped, 'base64')) - if (Buffer.byteLength(raw, 'utf8') > MAX_CREDENTIAL_PAYLOAD_BYTES) { + const raw = await this.crypto.decrypt(envelope.wrapped) + check() + if (Buffer.byteLength(raw, 'utf8') > MAX_CREDENTIAL_PAYLOAD_BYTES) throw new Error('MCP credential payload is oversized') - } - this.records = this.normalizeRecords(JSON.parse(raw) as McpCredentialData) + this.records = this.normalizeRecords(JSON.parse(raw)) return } - - if (envelope.version !== 1) { - return - } - - if (envelope.storage === 'safeStorage' && !this.isPersistent()) { - fs.unlinkSync(this.filePath) - return - } - - const legacyEntries = - envelope.storage === 'safeStorage' - ? (() => { - if (!isBoundedString(envelope.wrapped, MAX_CREDENTIAL_FILE_BYTES)) { - throw new Error('Legacy MCP credential envelope is invalid') - } - const raw = safeStorage.decryptString(Buffer.from(envelope.wrapped, 'base64')) - if (Buffer.byteLength(raw, 'utf8') > MAX_CREDENTIAL_PAYLOAD_BYTES) { - throw new Error('Legacy MCP credential payload is oversized') - } - return JSON.parse(raw) as LegacyCredentialData - })() - : envelope.entries - this.records = Object.fromEntries( - Object.entries(legacyEntries) + if (envelope.version !== 1) return + const persistent = await this.isPersistent() + check() + let entries: LegacyCredentialData + if (envelope.storage === 'safeStorage') { + if (!persistent) { + fs.unlinkSync(this.filePath) + return + } + if (!isBoundedString(envelope.wrapped, MAX_CREDENTIAL_FILE_BYTES)) + throw new Error('Legacy MCP credential envelope is invalid') + const raw = await this.crypto.decrypt(envelope.wrapped) + check() + if (Buffer.byteLength(raw, 'utf8') > MAX_CREDENTIAL_PAYLOAD_BYTES) + throw new Error('Legacy MCP credential payload is oversized') + entries = JSON.parse(raw) + } else entries = envelope.entries + const records: McpCredentialData = Object.fromEntries( + Object.entries(entries) .slice(0, MAX_CREDENTIAL_RECORDS) .flatMap(([key, value]) => { const normalized = this.normalizeInteractiveEntry(value) @@ -538,56 +603,61 @@ export class McpOAuthCredentialStore { credentialClass: 'interactive_oauth', value: normalized } satisfies InteractiveCredentialRecord - ] as const + ] ] : [] }) ) - - if (this.isPersistent()) { - this.persist() - } else if (envelope.storage === 'file') { - fs.unlinkSync(this.filePath) - } + if (persistent) await this.persist(records, check) + else if (envelope.storage === 'file') fs.unlinkSync(this.filePath) + check() + this.records = records } catch { + check() this.records = {} this.loadFailed = true + } finally { + if (!this.stopped) this.loaded = true } } private assertWritable(): void { - if (this.loadFailed) { - throw new Error('MCP credential store is unavailable') - } + if (this.loadFailed) throw new Error('MCP credential store is unavailable') } - private persist(): void { - if (!this.isPersistent()) { + private async persist(records: McpCredentialData, check: () => void): Promise { + const persistent = await this.isPersistent() + check() + if (!persistent) { try { - if (fs.existsSync(this.filePath)) { - fs.unlinkSync(this.filePath) - } - } catch { - // Credentials remain memory-only when secure persistence is unavailable. - } + if (fs.existsSync(this.filePath)) fs.unlinkSync(this.filePath) + } catch {} return } - - fs.mkdirSync(path.dirname(this.filePath), { recursive: true, mode: 0o700 }) + const wrapped = await this.crypto.encrypt(JSON.stringify(this.normalizeRecords(records))) + check() + if (!isBoundedString(wrapped, MAX_CREDENTIAL_FILE_BYTES)) + throw new Error('MCP credential envelope is invalid') const envelope: StoredCredentialEnvelopeV2 = { version: 2, storage: 'safeStorage', - wrapped: safeStorage - .encryptString(JSON.stringify(this.normalizeRecords(this.records))) - .toString('base64'), + wrapped, updatedAt: Date.now() } - const temporaryPath = `${this.filePath}.tmp-${process.pid}-${randomBytes(6).toString('hex')}` - fs.writeFileSync(temporaryPath, JSON.stringify(envelope), { - encoding: 'utf-8', - mode: 0o600 - }) - fs.renameSync(temporaryPath, this.filePath) + const serialized = JSON.stringify(envelope) + if (Buffer.byteLength(serialized, 'utf8') > MAX_CREDENTIAL_FILE_BYTES) + throw new Error('MCP credential file is oversized') + fs.mkdirSync(path.dirname(this.filePath), { recursive: true, mode: 0o700 }) + const temporaryPath = + this.filePath + '.tmp-' + process.pid + '-' + randomBytes(6).toString('hex') + try { + fs.writeFileSync(temporaryPath, serialized, { encoding: 'utf8', mode: 0o600 }) + fs.renameSync(temporaryPath, this.filePath) + } finally { + try { + fs.rmSync(temporaryPath, { force: true }) + } catch {} + } } private normalizeRecords(records: unknown): McpCredentialData { diff --git a/src/main/mcp/serverManager.ts b/src/main/mcp/serverManager.ts index 1291ddf3f3..ee1f8a969f 100644 --- a/src/main/mcp/serverManager.ts +++ b/src/main/mcp/serverManager.ts @@ -7,7 +7,6 @@ import { type McpConnectResult } from './mcpClient' import axios from 'axios' -import { proxyConfig } from '@/platform/proxy' import type { DeepchatEventPublisher } from '@shared/contracts/events' import type { SemanticNotificationPublisher } from '@/notifications' import type { McpOAuthManager } from './mcpOAuthManager' @@ -52,6 +51,7 @@ export class ServerManager { onRegistryChanged: () => void, private readonly semanticNotifications: SemanticNotificationPublisher, private readonly publishEvent: DeepchatEventPublisher, + private readonly getProxyUrl: () => Promise, mcpOAuthManager?: McpOAuthManager ) { this.mcpSettings = mcpSettings @@ -133,7 +133,7 @@ export class ServerManager { const testPackage = 'tiny-runtime-injector' // Get proxy configuration - const proxyUrl = proxyConfig.getProxyUrl() + const proxyUrl = await this.getProxyUrl() const proxyOptions = (() => { if (!proxyUrl) return {} const u = new URL(proxyUrl) @@ -377,6 +377,7 @@ export class ServerManager { serverConfig, connectResult, connectionCompletion, + epoch, options ) if (connectResult === 'connected') { @@ -399,7 +400,10 @@ export class ServerManager { // user restarts or stops it. A later start replaces this client through the normal path. this.setServerLastError(name, error) const authHandled = - this.mcpOAuthManager?.handleConnectionError(name, serverConfig, error) ?? false + (await this.mcpOAuthManager + ?.handleConnectionError(name, serverConfig, error) + .catch(() => false)) ?? false + if (this.isStaleStart(name, epoch)) return 'stopped' if (!authHandled && !this.isPluginOwnedServerConfig(serverConfig)) { this.notifyConnectionFailure(name) @@ -417,6 +421,7 @@ export class ServerManager { serverConfig: MCPServerConfig, connectResult: McpConnectResult, connectionCompletion: Promise | null, + epoch: number, options: { onBackgroundConnected?: () => void } = {} ): void { if (connectResult !== 'soft-timeout-released') { @@ -435,7 +440,7 @@ export class ServerManager { options.onBackgroundConnected?.() this.onRegistryChanged() }) - .catch((error) => { + .catch(async (error) => { if (error instanceof McpConnectionCancelledError) { return } @@ -446,7 +451,10 @@ export class ServerManager { this.setServerLastError(name, error) const authHandled = - this.mcpOAuthManager?.handleConnectionError(name, serverConfig, error) ?? false + (await this.mcpOAuthManager + ?.handleConnectionError(name, serverConfig, error) + .catch(() => false)) ?? false + if (this.isStaleStart(name, epoch) || this.clients.get(name) !== client) return if (!authHandled && !this.isPluginOwnedServerConfig(serverConfig)) { this.notifyConnectionFailure(name) diff --git a/src/main/mcp/settings.ts b/src/main/mcp/settings.ts index a181bcac77..58f17002c2 100644 --- a/src/main/mcp/settings.ts +++ b/src/main/mcp/settings.ts @@ -1,9 +1,10 @@ import logger from '@shared/logger' -import type { MCPServerConfig, McpEnterpriseIdentityProfile } from '@shared/types/mcp' +import type { + MCPServerConfig, + McpCredentialBinding, + McpEnterpriseIdentityProfile +} from '@shared/types/mcp' import type { BuiltinKnowledgeConfig } from '@shared/types/knowledge' -import ElectronStore from 'electron-store' -// app is used in DEFAULT_INMEMORY_SERVERS but removed buildInFileSystem -// import { app } from 'electron' import { compare } from 'compare-versions' import { isBuiltinKnowledgeSupported } from '../knowledge/support' import type { StoreLike } from '../config/storeLike' @@ -379,39 +380,68 @@ export const SYSTEM_INMEM_MCP_SERVERS: Record = { // custom-prompts-server has been removed, now provides prompt functionality through config data source } +function cloneServerConfig(config: MCPServerConfig): MCPServerConfig { + const cloneFn = ( + globalThis as typeof globalThis & { + structuredClone?: (value: MCPServerConfig) => MCPServerConfig + } + ).structuredClone + + if (typeof cloneFn === 'function') { + return cloneFn(config) + } + + return JSON.parse(JSON.stringify(config)) as MCPServerConfig +} + +function buildDefaultServerConfigs(): Record { + const enabledServers = new Set(DEFAULT_ENABLED_SERVER_NAMES) + + return Object.fromEntries( + Object.entries(DEFAULT_MCP_SERVERS.mcpServers).map(([name, config]) => [ + name, + { + ...cloneServerConfig(config as unknown as MCPServerConfig), + enabled: enabledServers.has(name) + } + ]) + ) +} + +export function createMcpSettingsDefaults(): IMcpSettings { + return { + mcpServers: buildDefaultServerConfigs(), + mcpEnabled: DEFAULT_MCP_SERVERS.mcpEnabled, + autoDetectNpmRegistry: true, + npmRegistryCache: undefined, + customNpmRegistry: undefined, + removedBuiltInServers: [] + } +} + export class McpSettings { private mcpStore: StoreLike> private mcpDatabase?: McpDatabase private pluginBindingResolvers = new Map< string, - (config: Partial) => Record + (config: Partial) => Promise> >() setPluginBindingResolver( pluginId: string, - resolve: (config: Partial) => Record + resolve: (config: Partial) => Promise> ): void { this.pluginBindingResolvers.set(pluginId, resolve) } constructor( + store: StoreLike, private readonly variableSecrets?: Pick< SecretStore, - 'get' | 'getWrapped' | 'wrap' | 'setWrapped' | 'restoreWrapped' + 'get' | 'getWrapped' | 'wrap' | 'setWrapped' | 'restoreWrapped' | 'captureOperation' > ) { - // Initialize MCP settings storage - this.mcpStore = new ElectronStore({ - name: 'mcp-settings', - defaults: { - mcpServers: this.buildDefaultServerConfigs(), - mcpEnabled: DEFAULT_MCP_SERVERS.mcpEnabled, - autoDetectNpmRegistry: true, - npmRegistryCache: undefined, - customNpmRegistry: undefined, - removedBuiltInServers: [] - } - }) + this.mcpStore = store } getMigrationSnapshot(): Record { @@ -445,20 +475,6 @@ export class McpSettings { return [...DEFAULT_ENABLED_SERVER_NAMES] } - private buildDefaultServerConfigs(): Record { - const enabledServers = new Set(this.getDefaultEnabledServerNames()) - - return Object.fromEntries( - Object.entries(DEFAULT_MCP_SERVERS.mcpServers).map(([name, config]) => [ - name, - { - ...this.cloneServerConfig(config as unknown as MCPServerConfig), - enabled: enabledServers.has(name) - } - ]) - ) - } - private resolveLegacyEnabledServers(): Set { const enabled = new Set() const oldDefaultServer = this.mcpStore.get('defaultServer') @@ -485,7 +501,7 @@ export class McpSettings { legacyKeysPresent: boolean, defaultEnabledServers: Set ): MCPServerConfig { - const cloned = this.cloneServerConfig(config) as MCPServerConfig & { + const cloned = cloneServerConfig(config) as MCPServerConfig & { autoApprove?: unknown } delete cloned.autoApprove @@ -585,20 +601,6 @@ export class McpSettings { this.setRemovedBuiltInServers(removed) } - private cloneServerConfig(config: MCPServerConfig): MCPServerConfig { - const cloneFn = ( - globalThis as typeof globalThis & { - structuredClone?: (value: MCPServerConfig) => MCPServerConfig - } - ).structuredClone - - if (typeof cloneFn === 'function') { - return cloneFn(config) - } - - return JSON.parse(JSON.stringify(config)) as MCPServerConfig - } - private ensureUniqueServerIdentities( servers: Record ): Record { @@ -681,10 +683,7 @@ export class McpSettings { // Get MCP server configuration async getMcpServers(): Promise> { const storedServers = this.removeDeprecatedBuiltInServers( - this.mcpStore.get>( - 'mcpServers', - this.buildDefaultServerConfigs() - ) + this.mcpStore.get>('mcpServers', buildDefaultServerConfigs()) ) const legacyEnabledServers = this.resolveLegacyEnabledServers() const legacyKeysPresent = @@ -725,7 +724,7 @@ export class McpSettings { updatedServers[serverName] = this.normalizeServerConfig( serverName, { - ...this.cloneServerConfig(serverConfig as MCPServerConfig), + ...cloneServerConfig(serverConfig as MCPServerConfig), enabled: defaultEnabledServers.has(serverName) }, new Set(), @@ -940,7 +939,7 @@ export class McpSettings { // 添加MCP服务器 async addMcpServer(name: string, config: MCPServerConfig): Promise { const mcpServers = await this.getMcpServers() - const hostOwnedConfig = this.cloneServerConfig(config) + const hostOwnedConfig = cloneServerConfig(config) delete hostOwnedConfig.serverId delete hostOwnedConfig.configGeneration delete hostOwnedConfig.bindingHash @@ -1050,11 +1049,17 @@ export class McpSettings { await this.setMcpServers(mcpServers) } - getMcpVariableBindings(config: Partial): Record { + async getMcpVariableBindings(config: Partial): Promise> { + const check = this.variableSecrets?.captureOperation() const resolve = config.ownerPluginId && this.pluginBindingResolvers.get(config.ownerPluginId) - if (resolve) return resolve(config) + if (resolve) { + const bindings = await resolve(config) + check?.() + return bindings + } if (!config.serverId) return {} - const raw = this.variableSecrets?.get(`mcpVariableBindings.${config.serverId}`) + const raw = await this.variableSecrets?.get(`mcpVariableBindings.${config.serverId}`) + check?.() if (!raw) return {} try { const stored = JSON.parse(raw) @@ -1075,7 +1080,10 @@ export class McpSettings { } } - setMcpVariableBindings(config: MCPServerConfig, values: Record): void { + async setMcpVariableBindings( + config: MCPServerConfig, + values: Record + ): Promise { if (!config.serverId || !this.variableSecrets) throw new Error('MCP credential storage is unavailable') if ( @@ -1085,12 +1093,14 @@ export class McpSettings { ) ) throw new Error('Invalid MCP variable binding') - const wrapped = this.variableSecrets.wrap( + const check = this.variableSecrets.captureOperation() + const wrapped = await this.variableSecrets.wrap( JSON.stringify({ scope: mcpVariableBindingScope(config), - values: { ...this.getMcpVariableBindings(config), ...values } + values: { ...(await this.getMcpVariableBindings(config)), ...values } }) ) + check() this.variableSecrets.setWrapped(`mcpVariableBindings.${config.serverId}`, wrapped) } @@ -1116,6 +1126,33 @@ export class McpSettings { await this.setMcpServers(mcpServers) } + finalizeOAuthBinding( + expected: McpCredentialBinding, + authorization: NonNullable + ): MCPServerConfig { + const servers = this.mcpStore.get>('mcpServers') ?? {} + const match = Object.entries(servers).find( + ([, config]) => config.serverId === expected.serverId + ) + if (!match) throw new Error('MCP server was removed during OAuth discovery') + const [name, current] = match + if ( + current.configGeneration !== expected.configGeneration || + current.bindingHash !== expected.bindingHash || + current.baseUrl !== expected.endpoint + ) + throw new Error('MCP server binding changed during OAuth discovery') + const merged = { ...current, authorization: sanitizeMcpAuthorizationConfig(authorization) } + const next = { ...merged, ...normalizeMcpServerIdentity(merged, current) } + if ( + next.bindingHash === current.bindingHash && + next.configGeneration === current.configGeneration + ) + return current + this.mcpStore.set('mcpServers', { ...servers, [name]: next }) + return next + } + /** * Batch import MCP servers from external source (like ModelScope) * @param servers - Array of MCP server configs to import diff --git a/src/main/mcp/toolManager.ts b/src/main/mcp/toolManager.ts index 2c739666ad..aa14529618 100644 --- a/src/main/mcp/toolManager.ts +++ b/src/main/mcp/toolManager.ts @@ -19,7 +19,7 @@ import type { AgentSettingsPort } from '@/agent/settings' import { ServerManager } from './serverManager' import { McpClient } from './mcpClient' import { jsonrepair } from 'jsonrepair' -import { getExplicitlyDeniedPluginTools, resolvePluginToolPolicy } from '@/plugin/toolPolicyStore' +import type { PluginToolPolicyStore } from '@/plugin/toolPolicyStore' import type { DeepchatEventPublisher } from '@shared/contracts/events' import type { SemanticNotificationPublisher } from '@/notifications' import { awaitWithAbort } from '@/lib/awaitWithAbort' @@ -338,6 +338,7 @@ export class ToolManager { agentSettings: Pick, mcpSettings: McpSettings, serverManager: ServerManager, + private readonly toolPolicies: Pick, private readonly semanticNotifications: SemanticNotificationPublisher, private readonly publishEvent: DeepchatEventPublisher, private readonly pluginOwnership: PluginMcpOwnershipPort = NO_PLUGIN_OWNERSHIP, @@ -695,7 +696,7 @@ export class ToolManager { } private filterExplicitlyDeniedTools(serverName: string, tools: readonly Tool[]): readonly Tool[] { - const deniedTools = new Set(getExplicitlyDeniedPluginTools(serverName)) + const deniedTools = new Set(this.toolPolicies.deniedTools(serverName)) return deniedTools.size === 0 ? tools : tools.filter((tool) => !deniedTools.has(tool.name)) } @@ -1006,7 +1007,7 @@ export class ToolManager { access?.throwPreDispatchErrors ) } - const pluginPolicy = resolvePluginToolPolicy(toolServerName, originalName) + const pluginPolicy = this.toolPolicies.resolve(toolServerName, originalName) if ( pluginPolicy.managed && pluginPolicy.decision !== 'allow' && @@ -1333,7 +1334,7 @@ export class ToolManager { if ( input.toolName !== 'click' || input.response.isError === true || - resolvePluginToolPolicy(input.client.serverName, 'get_window_state').decision !== 'allow' || + this.toolPolicies.resolve(input.client.serverName, 'get_window_state').decision !== 'allow' || !this.computerUsePreviewObserver?.shouldCaptureAfterClick ) { return diff --git a/src/main/memory/infra/legacyV1Reader.ts b/src/main/memory/infra/legacyV1Reader.ts index 64e6a3bc28..2d6868af36 100644 --- a/src/main/memory/infra/legacyV1Reader.ts +++ b/src/main/memory/infra/legacyV1Reader.ts @@ -1,7 +1,12 @@ import { DuckDBConnection, DuckDBInstance } from '@duckdb/node-api' import type { MemoryVectorRecord } from '../types' -import { escapeDuckDbSqlPath, LegacyVssUnavailableError, loadLegacyVss } from './legacyVssLoader' +import { + escapeDuckDbSqlPath, + LegacyVssUnavailableError, + loadLegacyVss, + type MemoryVectorHost +} from './legacyVssLoader' import { readSafeMemoryVectorRowCount } from './memoryVectorStoreFormat' const LEGACY_SCHEMA = 'legacy' @@ -68,14 +73,15 @@ export class LegacyV1Reader { static async open( legacyPath: string, expectedDimensions: number, - fence: MigrationAbandonFence + fence: MigrationAbandonFence, + host: MemoryVectorHost ): Promise { const dbInstance = await DuckDBInstance.create(':memory:') fence.markProgress() const connection = await dbInstance.connect() fence.markProgress() try { - await loadLegacyVss(connection, legacyPath, fence) + await loadLegacyVss(connection, legacyPath, host, fence) } catch (error) { if (!(error instanceof LegacyVssUnavailableError)) throw error fence.assertActive() diff --git a/src/main/memory/infra/legacyVssLoader.ts b/src/main/memory/infra/legacyVssLoader.ts index 056d66284a..ef3d2047e1 100644 --- a/src/main/memory/infra/legacyVssLoader.ts +++ b/src/main/memory/infra/legacyVssLoader.ts @@ -1,4 +1,4 @@ -import logger from '@shared/logger' +import logger from 'node:console' import { createHash, randomUUID } from 'node:crypto' import fs from 'node:fs' import path from 'node:path' @@ -6,7 +6,12 @@ import { promisify } from 'node:util' import { gunzip } from 'node:zlib' import type { DuckDBConnection } from '@duckdb/node-api' -import { app } from 'electron' + +export interface MemoryVectorHost { + appPath: string + userDataPath: string + isPackaged: boolean +} const extensionSuffix = '.duckdb_extension' const VSS_EXTENSION_NAME = `vss${extensionSuffix}` @@ -88,9 +93,13 @@ async function inflatePackagedVssExtension( return targetPath } -async function materializePackagedVssExtension(assetPath: string, dbPath: string): Promise { +async function materializePackagedVssExtension( + assetPath: string, + dbPath: string, + host: MemoryVectorHost +): Promise { const resolvedAssetPath = path.resolve(assetPath) - const materializationRoot = path.resolve(app.getPath('userData') || path.dirname(dbPath)) + const materializationRoot = path.resolve(host.userDataPath || path.dirname(dbPath)) const cacheKey = materializationCacheKey(resolvedAssetPath, materializationRoot) const existing = PACKAGED_VSS_MATERIALIZATION_PROMISES.get(cacheKey) if (existing) { @@ -99,7 +108,7 @@ async function materializePackagedVssExtension(assetPath: string, dbPath: string if (PACKAGED_VSS_MATERIALIZATION_PROMISES.get(cacheKey) === existing) { PACKAGED_VSS_MATERIALIZATION_PROMISES.delete(cacheKey) } else { - return materializePackagedVssExtension(resolvedAssetPath, dbPath) + return materializePackagedVssExtension(resolvedAssetPath, dbPath, host) } } @@ -119,10 +128,11 @@ async function materializePackagedVssExtension(assetPath: string, dbPath: string async function resolveLegacyVssPath( dbPath: string, + host: MemoryVectorHost, fence?: LegacyVssLoadFence ): Promise<{ extensionPath: string; source: string } | null> { const runtimeBasePath = path - .join(app.getAppPath(), 'runtime') + .join(host.appPath, 'runtime') .replace('app.asar', 'app.asar.unpacked') const extensionDir = path.join(runtimeBasePath, 'duckdb', 'extensions') const extensionPath = path.join(extensionDir, VSS_EXTENSION_NAME) @@ -133,7 +143,7 @@ async function resolveLegacyVssPath( if (fs.existsSync(packagedAssetPath)) { let materializedPath: string try { - materializedPath = await materializePackagedVssExtension(packagedAssetPath, dbPath) + materializedPath = await materializePackagedVssExtension(packagedAssetPath, dbPath, host) } catch (error) { const message = `[MemoryVectorStore] packaged VSS extension failed to materialize from ${packagedAssetPath}: ${String(error)}` if (fence) { @@ -148,7 +158,7 @@ async function resolveLegacyVssPath( const message = `[MemoryVectorStore] bundled VSS extension missing at ${extensionPath} or ${packagedAssetPath}. Run installRuntime:duckdb:vss before packaging.` if (fence) throw new LegacyVssUnavailableError(message) - if (app.isPackaged) { + if (host.isPackaged) { logger.error(`${message} Vector recall disabled until a valid bundled extension ships.`) throw new Error(message) } @@ -159,9 +169,10 @@ async function resolveLegacyVssPath( export async function loadLegacyVss( connection: Pick, dbPath: string, + host: MemoryVectorHost, fence?: LegacyVssLoadFence ): Promise { - const resolved = await resolveLegacyVssPath(dbPath, fence) + const resolved = await resolveLegacyVssPath(dbPath, host, fence) fence?.assertActive() if (resolved) { try { @@ -169,7 +180,7 @@ export async function loadLegacyVss( return } catch (error) { const message = `[MemoryVectorStore] ${resolved.source} VSS extension failed to load from ${resolved.extensionPath}: ${String(error)}` - if (app.isPackaged || fence) { + if (host.isPackaged || fence) { logger.error(`${message}. Vector recall disabled until a valid bundled extension ships.`) throw error } diff --git a/src/main/memory/infra/memoryVectorStore.ts b/src/main/memory/infra/memoryVectorStore.ts index bbe38f2a83..e22e34314a 100644 --- a/src/main/memory/infra/memoryVectorStore.ts +++ b/src/main/memory/infra/memoryVectorStore.ts @@ -1,11 +1,25 @@ -import logger from '@shared/logger' +import logger from 'node:console' import fs from 'node:fs' import path from 'node:path' +import { endianness } from 'node:os' +import duckdb from '@duckdb/node-bindings' +import { isSafeAgentId } from '@shared/types/agent-memory' -import { DuckDBConnection, DuckDBInstance, arrayValue } from '@duckdb/node-api' +import { + ARRAY, + FLOAT, + INTEGER, + VARCHAR, + type DuckDBAppender, + DuckDBArrayType, + DuckDBConnection, + DuckDBDataChunk, + DuckDBInstance, + arrayValue +} from '@duckdb/node-api' import type { MemoryPerfObserver } from '../ports' -import { V1_PRESERVE_IDLE_TIMEOUT_MS } from '../runtimeConstants' +import { REINDEX_BATCH_SIZE, V1_PRESERVE_IDLE_TIMEOUT_MS } from '../runtimeConstants' import type { IMemoryVectorStore, MemoryVectorMatch, @@ -13,7 +27,13 @@ import type { MemoryVectorRecord } from '../types' import { LegacyV1Reader, MigrationAbandonFence } from './legacyV1Reader' -import { LegacyVssUnavailableError } from './legacyVssLoader' +import { LegacyVssUnavailableError, type MemoryVectorHost } from './legacyVssLoader' +import { + createMemoryVectorStorePaths, + persistMemoryVectorQuarantine, + type MemoryVectorStorePaths +} from './memoryVectorStorePaths' +export { createMemoryVectorStorePaths, type MemoryVectorStorePaths } from './memoryVectorStorePaths' import { assertMemoryVectorDimensions, createMemoryVectorStoreV2FormatPlan, @@ -30,6 +50,12 @@ import { const QUARANTINE_FILE_SUFFIX = '.v2.duckdb.quarantine' +export interface PackedMemoryVectors { + memoryIds: string[] + dimensions: number + bytes: Uint8Array +} + interface EmbeddingIdentity { providerId: string modelId: string @@ -59,26 +85,6 @@ type LegacyPreserveOutcome = | { status: 'failed'; error: unknown } | { status: 'timed-out' } -export interface MemoryVectorStorePaths { - current: string - staging: string - quarantine: string - legacy: string -} - -export function createMemoryVectorStorePaths( - memoryDbDir: string, - agentId: string -): MemoryVectorStorePaths { - const current = path.join(memoryDbDir, `${agentId}.v2.duckdb`) - return { - current, - staging: `${current}.migrating`, - quarantine: `${current}.quarantine`, - legacy: path.join(memoryDbDir, `${agentId}.duckdb`) - } -} - function filesWithWal(filePath: string): string[] { return [filePath, `${filePath}.wal`] } @@ -151,6 +157,7 @@ export class MemoryVectorStore implements IMemoryVectorStore { private readonly vectorTable = MEMORY_VECTOR_STORE_TABLES.vector private readonly metaTable = MEMORY_VECTOR_STORE_TABLES.meta private usable = true + private insertChunk: DuckDBDataChunk | undefined private constructor( private readonly dbPath: string, @@ -162,6 +169,7 @@ export class MemoryVectorStore implements IMemoryVectorStore { paths: MemoryVectorStorePaths, dimensions: number, embedding: EmbeddingIdentity, + host: MemoryVectorHost, metric: 'cosine' | 'l2sq' | 'ip' = 'cosine', perfObserver?: MemoryPerfObserver ): Promise { @@ -212,7 +220,14 @@ export class MemoryVectorStore implements IMemoryVectorStore { } if (fs.existsSync(paths.legacy)) { - return MemoryVectorStore.migrateLegacyV1(paths, dimensions, embedding, metric, perfObserver) + return MemoryVectorStore.migrateLegacyV1( + paths, + dimensions, + embedding, + host, + metric, + perfObserver + ) } if (fs.existsSync(`${paths.current}.wal`)) { @@ -245,7 +260,7 @@ export class MemoryVectorStore implements IMemoryVectorStore { for (const entry of entries) { if (!entry.isFile() || !entry.name.endsWith(QUARANTINE_FILE_SUFFIX)) continue const agentId = entry.name.slice(0, -QUARANTINE_FILE_SUFFIX.length) - if (!agentId) continue + if (!isSafeAgentId(agentId)) continue const paths = createMemoryVectorStorePaths(memoryDbDir, agentId) if (path.basename(paths.quarantine) !== entry.name) continue try { @@ -268,17 +283,13 @@ export class MemoryVectorStore implements IMemoryVectorStore { ...filesWithWal(paths.current), ...filesWithWal(paths.staging), ...filesWithWal(paths.legacy), + `${paths.current}.lease`, ...(includeQuarantine ? [paths.quarantine] : []) ]) } static markQuarantined(paths: MemoryVectorStorePaths): void { - fs.mkdirSync(path.dirname(paths.quarantine), { recursive: true }) - try { - fs.writeFileSync(paths.quarantine, '', { flag: 'wx' }) - } catch (error) { - if ((error as NodeJS.ErrnoException).code !== 'EEXIST') throw error - } + persistMemoryVectorQuarantine(paths) } private static async openCurrent( @@ -309,6 +320,7 @@ export class MemoryVectorStore implements IMemoryVectorStore { paths: MemoryVectorStorePaths, dimensions: number, embedding: EmbeddingIdentity, + host: MemoryVectorHost, metric: 'cosine' | 'l2sq' | 'ip', perfObserver?: MemoryPerfObserver ): Promise { @@ -334,6 +346,7 @@ export class MemoryVectorStore implements IMemoryVectorStore { paths, dimensions, embedding, + host, metric, perfObserver, fence @@ -369,13 +382,14 @@ export class MemoryVectorStore implements IMemoryVectorStore { paths: MemoryVectorStorePaths, dimensions: number, embedding: EmbeddingIdentity, + host: MemoryVectorHost, metric: 'cosine' | 'l2sq' | 'ip', perfObserver: MemoryPerfObserver | undefined, fence: MigrationAbandonFence ): Promise { let reader: LegacyV1Reader try { - reader = await LegacyV1Reader.open(paths.legacy, dimensions, fence) + reader = await LegacyV1Reader.open(paths.legacy, dimensions, fence, host) } catch (error) { if (!(error instanceof LegacyVssUnavailableError)) throw error fence.assertActive() @@ -685,6 +699,26 @@ export class MemoryVectorStore implements IMemoryVectorStore { return this.upsertRecords(records) } + // The native upload owner retains these bytes until the transaction settles. + async upsertPacked(batch: PackedMemoryVectors): Promise { + assertMemoryVectorDimensions(batch.dimensions) + const expectedBytes = batch.memoryIds.length * batch.dimensions * 4 + if ( + endianness() !== 'LE' || + !(batch.bytes instanceof Uint8Array) || + !(batch.bytes.buffer instanceof ArrayBuffer) || + !Number.isSafeInteger(expectedBytes) || + batch.bytes.byteLength !== expectedBytes + ) + throw new Error('Invalid packed memory vector shape') + const values = new DataView(batch.bytes.buffer, batch.bytes.byteOffset, batch.bytes.byteLength) + for (let offset = 0; offset < expectedBytes; offset += 4) { + if (!Number.isFinite(values.getFloat32(offset, true))) + throw new Error('Memory vector contains a non-finite value') + } + return this.upsertRecords(batch) + } + private async beginMigration(fence: MigrationAbandonFence): Promise { fence.assertActive() await this.connection.run('BEGIN TRANSACTION;') @@ -705,7 +739,8 @@ export class MemoryVectorStore implements IMemoryVectorStore { this.perfObserver?.increment('duckDbStatements') await this.connection.run( `INSERT INTO ${this.vectorTable} (memory_id, embedding) VALUES ${insertPlaceholders};`, - insertParams + insertParams, + records.flatMap((record) => [VARCHAR, ARRAY(FLOAT, record.embedding.length)]) ) fence.markProgress() } @@ -717,31 +752,73 @@ export class MemoryVectorStore implements IMemoryVectorStore { } private async upsertRecords( - records: MemoryVectorRecord[], + records: MemoryVectorRecord[] | PackedMemoryVectors, fence?: MigrationAbandonFence ): Promise { - if (!records.length) return + const memoryIds = Array.isArray(records) + ? records.map((record) => record.memoryId) + : records.memoryIds + if (!memoryIds.length) return fence?.assertActive() await this.connection.run('BEGIN TRANSACTION;') fence?.assertActive() + let appender: DuckDBAppender | undefined + let appenderClosed = false try { - const deletePlaceholders = records.map(() => '?').join(', ') + const deletePlaceholders = memoryIds.map(() => '?').join(', ') this.perfObserver?.increment('duckDbStatements') await this.connection.run( `DELETE FROM ${this.vectorTable} WHERE memory_id IN (${deletePlaceholders});`, - records.map((record) => record.memoryId) + memoryIds ) fence?.assertActive() - const insertPlaceholders = records.map(() => '(?, ?::FLOAT[])').join(', ') - const insertParams = records.flatMap((record) => [ - record.memoryId, - arrayValue(Array.from(record.embedding)) - ]) this.perfObserver?.increment('duckDbStatements') - await this.connection.run( - `INSERT INTO ${this.vectorTable} (memory_id, embedding) VALUES ${insertPlaceholders};`, - insertParams + appender = await this.connection.createAppender(this.vectorTable) + const vectorType = appender.columnType(1) as DuckDBArrayType + if ( + Array.isArray(records) + ? records.some((record) => record.embedding.length !== vectorType.length) + : !(vectorType instanceof DuckDBArrayType) || + vectorType.valueType !== FLOAT || + records.dimensions !== vectorType.length ) + throw new Error('Memory vector dimensions do not match') + // Reuse native column buffers instead of allocating one native value per vector component. + const chunk = (this.insertChunk ??= DuckDBDataChunk.create([VARCHAR, vectorType])) + for (let offset = 0; offset < memoryIds.length; offset += REINDEX_BATCH_SIZE) { + const ids = memoryIds.slice(offset, offset + REINDEX_BATCH_SIZE) + chunk.reset() + chunk.rowCount = ids.length + chunk.setColumnValues(0, ids) + if (Array.isArray(records)) { + chunk.setColumnValues( + 1, + records.slice(offset, offset + ids.length).map((record) => arrayValue(record.embedding)) + ) + } else { + const parent = duckdb.data_chunk_get_vector(chunk.chunk, 1) + const child = duckdb.array_vector_get_child(parent) + // The checked FLOAT array and chunk row count bound both native buffers. + for (const [vector, count] of [ + [parent, ids.length], + [child, ids.length * vectorType.length] + ] as const) { + duckdb.vector_ensure_validity_writable(vector) + const valid = new Uint8Array(Math.ceil(count / 64) * 8).fill(255) + duckdb.copy_data_to_vector_validity(vector, 0, valid.buffer, 0, valid.byteLength) + } + duckdb.copy_data_to_vector( + child, + 0, + records.bytes.buffer, + records.bytes.byteOffset + offset * vectorType.length * 4, + ids.length * vectorType.length * 4 + ) + } + appender.appendDataChunk(chunk) + } + appenderClosed = true + appender.closeSync() fence?.assertActive() await this.connection.run('COMMIT;') fence?.assertActive() @@ -751,6 +828,16 @@ export class MemoryVectorStore implements IMemoryVectorStore { this.usable = false throw error } + if (appender && !appenderClosed) { + try { + appender.closeSync() + } catch (closeError) { + if (isDuckDbFatalError(closeError)) { + this.usable = false + throw closeError + } + } + } await this.connection.run('ROLLBACK;').catch(() => undefined) throw error } @@ -778,10 +865,11 @@ export class MemoryVectorStore implements IMemoryVectorStore { LIMIT ?; ` this.perfObserver?.increment('duckDbStatements') - const reader = await this.connection.runAndReadAll(sql, [ - arrayValue(Array.from(embedding)), - options.topK - ]) + const reader = await this.connection.runAndReadAll( + sql, + [arrayValue(Array.from(embedding)), options.topK], + [ARRAY(FLOAT, embedding.length), INTEGER] + ) const rows = reader.getRowObjectsJson() this.perfObserver?.increment('materializedRows', rows.length) return rows.map((row: Record) => ({ @@ -883,6 +971,7 @@ export class MemoryVectorStore implements IMemoryVectorStore { this.connection.closeSync() this.connectionOpen = false } catch (error) { + if (isDuckDbFatalError(error)) throw error errors.push(error) } } @@ -900,10 +989,8 @@ export class MemoryVectorStore implements IMemoryVectorStore { } async close(): Promise { - try { - this.closeStrict() - } catch (error) { - logger.warn(String(error)) - } + this.usable = false + this.closeStrict() + this.insertChunk = undefined } } diff --git a/src/main/memory/infra/memoryVectorStorePaths.ts b/src/main/memory/infra/memoryVectorStorePaths.ts new file mode 100644 index 0000000000..8cda738475 --- /dev/null +++ b/src/main/memory/infra/memoryVectorStorePaths.ts @@ -0,0 +1,34 @@ +import path from 'node:path' +import fs from 'node:fs' + +export const MEMORY_VECTOR_OWNER_FILE = '.vector-owner.duckdb' +export const MEMORY_VECTOR_LEASE_SUFFIX = '.v2.duckdb.lease' + +export interface MemoryVectorStorePaths { + current: string + staging: string + quarantine: string + legacy: string +} + +export function persistMemoryVectorQuarantine(paths: MemoryVectorStorePaths): void { + fs.mkdirSync(path.dirname(paths.quarantine), { recursive: true }) + try { + fs.writeFileSync(paths.quarantine, '', { flag: 'wx' }) + } catch (error) { + if ((error as NodeJS.ErrnoException).code !== 'EEXIST') throw error + } +} + +export function createMemoryVectorStorePaths( + memoryDbDir: string, + agentId: string +): MemoryVectorStorePaths { + const current = path.join(memoryDbDir, `${agentId}.v2.duckdb`) + return { + current, + staging: `${current}.migrating`, + quarantine: `${current}.quarantine`, + legacy: path.join(memoryDbDir, `${agentId}.duckdb`) + } +} diff --git a/src/main/memory/infra/vectorStoreManager.ts b/src/main/memory/infra/vectorStoreManager.ts index fd98abf3db..adce986686 100644 --- a/src/main/memory/infra/vectorStoreManager.ts +++ b/src/main/memory/infra/vectorStoreManager.ts @@ -472,6 +472,10 @@ export class VectorStoreManager implements VectorStoreRetrievalPort { this.vectorMutationLocks.set(agentId, settled) try { return await run + } catch (error) { + if (error instanceof MemoryVectorStoreQuarantineRequiredError || isDuckDbFatalError(error)) + this.quarantineAgent(agentId, error) + throw error } finally { if (this.vectorMutationLocks.get(agentId) === settled) { this.vectorMutationLocks.delete(agentId) @@ -584,7 +588,7 @@ export class VectorStoreManager implements VectorStoreRetrievalPort { } return result } catch (error) { - if (isDuckDbFatalError(error)) { + if (isDuckDbFatalError(error) || error instanceof MemoryVectorStoreQuarantineRequiredError) { if (this.quarantineAgent(agentId, error, state)) { throw new VectorStoreLeaseUnavailableError( 'quarantined', diff --git a/src/main/nowledgeMem/index.ts b/src/main/nowledgeMem/index.ts index fd392b4e1e..e7a36f703a 100644 --- a/src/main/nowledgeMem/index.ts +++ b/src/main/nowledgeMem/index.ts @@ -67,7 +67,10 @@ export class NowledgeMemConnections { constructor( private readonly settings: SettingsStore, - private readonly secrets: Pick, + private readonly secrets: Pick< + SecretStore, + 'get' | 'wrap' | 'setWrapped' | 'restoreWrapped' | 'captureOperation' + >, private readonly mcpSettings: Pick ) {} @@ -92,8 +95,8 @@ export class NowledgeMemConnections { } } - private key(connection: StoredConnection): string { - const key = connection.credentialId ? this.secrets.get(connection.credentialId) : '' + private async key(connection: StoredConnection): Promise { + const key = connection.credentialId ? await this.secrets.get(connection.credentialId) : '' if (connection.credentialId && !key) throw new Error('The saved credential is unavailable; enter it again') return key @@ -172,13 +175,16 @@ export class NowledgeMemConnections { return result } - getExportConfig(): NowledgeMemConfig { + async getExportConfig(): Promise { + const check = this.secrets.captureOperation() const state = this.read() const connection = state.connection if (!connection) throw new Error('Verify a connection in the Nowledge Mem plugin') + const apiKey = await this.key(connection) + check() return { baseUrl: connection.apiBaseUrl, - apiKey: this.key(connection), + apiKey, timeout: connection.timeout } } @@ -194,6 +200,7 @@ export class NowledgeMemConnections { clear(): void { if (this.busy) throw new Error('A connection update is in progress') + this.secrets.captureOperation() for (const key of Object.keys(this.settings.store)) { if (isNowledgeMachineLocalSetting(key)) this.settings.delete(key) } @@ -209,7 +216,8 @@ export class NowledgeMemConnections { } } - getMcpBindings(config: Partial): Record { + async getMcpBindings(config: Partial): Promise> { + const check = this.secrets.captureOperation() if (config.ownerPluginId !== NOWLEDGE_PLUGIN_ID) return {} const connection = this.read().connection if ( @@ -217,13 +225,16 @@ export class NowledgeMemConnections { config.baseUrl === connection.mcpUrl && config.sourceId === NOWLEDGE_PLUGIN_ID ) { - return { [KEY_VARIABLE]: this.key(connection) } + const apiKey = await this.key(connection) + check() + return { [KEY_VARIABLE]: apiKey } } throw new Error('The Nowledge MCP destination no longer matches its saved connection') } async save(rawInput: unknown): Promise { const input = NowledgeConnectionInputSchema.parse(rawInput) + const check = this.secrets.captureOperation() if (this.busy) throw new Error('A connection update is in progress') this.busy = true try { @@ -254,7 +265,8 @@ export class NowledgeMemConnections { // Reuse only credentials bound to these exact destinations, never ambient nmem settings. const suppliedKey = apiKey const savedCredential = state.credentials?.[this.credentialId(endpoints)] - apiKey ||= savedCredential ? this.secrets.get(savedCredential) : '' + apiKey ||= savedCredential ? await this.secrets.get(savedCredential) : '' + check() try { await this.verify(endpoints, apiKey, input.timeout) } catch (error) { @@ -269,10 +281,11 @@ export class NowledgeMemConnections { endpoints = resolveMemEndpoints({ ...input, apiBaseUrl: `${endpoints.baseUrl}/remote-api` }) if (!suppliedKey) { const resolvedCredential = state.credentials?.[this.credentialId(endpoints)] - apiKey = resolvedCredential ? this.secrets.get(resolvedCredential) : '' + apiKey = resolvedCredential ? await this.secrets.get(resolvedCredential) : '' if (!apiKey && savedCredential) throw new Error('Enter a credential for the resolved API and MCP destinations') } + check() await this.verify(endpoints, apiKey, input.timeout) } if ( @@ -285,14 +298,16 @@ export class NowledgeMemConnections { const destinationKey = this.credentialId(endpoints) const previousCredentialId = state.credentials?.[destinationKey] const reuse = Boolean( - previousCredentialId && this.secrets.get(previousCredentialId) === apiKey + previousCredentialId && (await this.secrets.get(previousCredentialId)) === apiKey ) const credentialId = apiKey ? reuse ? previousCredentialId : `${destinationKey}.${randomUUID()}` : undefined - if (credentialId && !reuse) this.secrets.setWrapped(credentialId, this.secrets.wrap(apiKey)) + const wrapped = credentialId && !reuse ? await this.secrets.wrap(apiKey) : undefined + check() + if (credentialId && wrapped !== undefined) this.secrets.setWrapped(credentialId, wrapped) const connection: StoredConnection = { ...endpoints, timeout: input.timeout, @@ -357,13 +372,16 @@ export class NowledgeMemConnections { apiKey: string, timeout: number ): Promise { + const check = this.secrets.captureOperation() await this.readJson(`${endpoints.apiBaseUrl}/health`, apiKey, timeout, 'Health check') + check() await this.readJson( `${endpoints.apiBaseUrl}/memories?limit=1`, apiKey, timeout, 'REST authentication' ) + check() const client = new Client({ name: 'DeepChat', version: '1.0.0' }) const deadline = AbortSignal.timeout(timeout) const transport = new StreamableHTTPClientTransport(new URL(endpoints.mcpUrl), { @@ -377,7 +395,9 @@ export class NowledgeMemConnections { }) try { await client.connect(transport, { timeout, signal: deadline }) + check() const catalog = await client.listTools({}, { timeout, signal: deadline }) + check() const name = ['read_context_bundle', 'read_working_memory'].find((candidate) => catalog.tools.some((tool) => tool.name === candidate) ) @@ -387,6 +407,7 @@ export class NowledgeMemConnections { undefined, { timeout, signal: deadline } ) + check() if (result.isError) throw new Error('Context tool failed') } catch { throw new Error( diff --git a/src/main/ocr/ocrRuntimeService.ts b/src/main/ocr/ocrRuntimeService.ts index 04a41a5182..99556a4813 100644 --- a/src/main/ocr/ocrRuntimeService.ts +++ b/src/main/ocr/ocrRuntimeService.ts @@ -16,12 +16,13 @@ import { } from './imageTextExtractionService' import { LightOcrProcessHost, type LightOcrProcessHostStatus } from './lightOcrProcessHost' import { OcrArtifactStore, type OcrArtifactStoreStats } from './ocrArtifactStore' -import { SafeStorageOcrCacheKeyProvider } from './ocrCacheKeyProvider' +import type { OcrCacheKeyProvider } from './ocrCacheKeyProvider' import { OcrExtractionScheduler } from './ocrExtractionScheduler' import { OcrRuntimeAssetResolver, type OcrRuntimeAvailability } from './ocrRuntimeAssetResolver' import { OcrSourceSnapshotBudget } from './ocrSourceSnapshotBudget' export interface OcrRuntimeServiceOptions { + cacheKeyProvider: OcrCacheKeyProvider appPath: string isPackaged: boolean nodeRuntimePath: string | null @@ -208,7 +209,7 @@ export class OcrRuntimeService { }) store = new OcrArtifactStore({ dbPath: path.join(cacheDir, 'ocr-cache.db'), - keyProvider: new SafeStorageOcrCacheKeyProvider(path.join(cacheDir, 'cache-key.json')) + keyProvider: this.options.cacheKeyProvider }) scheduler = new OcrExtractionScheduler() const snapshotBudget = new OcrSourceSnapshotBudget() diff --git a/src/main/platform/fileWatcher/watcherService.ts b/src/main/platform/fileWatcher/watcherService.ts index 9593312c8a..cedc17634e 100644 --- a/src/main/platform/fileWatcher/watcherService.ts +++ b/src/main/platform/fileWatcher/watcherService.ts @@ -2,7 +2,6 @@ import { WatcherPool } from './watcherPool' import type { IFileWatcherService, WatchBatchListener, - WatcherHostKind, WatchHandle, WatchRequest, WatchStatusListener @@ -23,11 +22,3 @@ export class FileWatcherService implements IFileWatcherService { await this.pool.destroy() } } - -export function createWatcherRequestId( - kind: WatcherHostKind, - purpose: string, - rootPath: string -): string { - return `${kind}:${purpose}:${rootPath}` -} diff --git a/src/main/platform/fileWatcher/watcherTypes.ts b/src/main/platform/fileWatcher/watcherTypes.ts index 4fbc4d21f4..f5c6a2651d 100644 --- a/src/main/platform/fileWatcher/watcherTypes.ts +++ b/src/main/platform/fileWatcher/watcherTypes.ts @@ -1,5 +1,13 @@ export type WatcherHostKind = 'content' | 'git' +export function createWatcherRequestId( + kind: WatcherHostKind, + purpose: string, + rootPath: string +): string { + return `${kind}:${purpose}:${rootPath}` +} + export type WatchPurpose = 'workspace-content' | 'workspace-git' | 'skills' export type WatchEventType = 'create' | 'update' | 'delete' | 'overflow' | 'root-deleted' diff --git a/src/main/platform/imageCache.ts b/src/main/platform/imageCache.ts index bfcfdc254c..afb2017eb7 100644 --- a/src/main/platform/imageCache.ts +++ b/src/main/platform/imageCache.ts @@ -2,7 +2,6 @@ import fs from 'node:fs' import path from 'node:path' import dns from 'node:dns/promises' import { BlockList, isIP, type LookupFunction } from 'node:net' -import { app } from 'electron' import { nanoid } from 'nanoid' import axios, { type AxiosRequestConfig } from 'axios' @@ -35,6 +34,14 @@ const IMAGE_MIME_BY_EXTENSION: Record = { '.webp': 'image/webp' } +function getCacheDirectory(): string { + const userDataDirectory = process.env.DEEPCHAT_USER_DATA_DIR + if (!userDataDirectory || !path.isAbsolute(userDataDirectory)) { + throw new Error('Image cache requires an absolute bootstrap profile directory') + } + return path.join(userDataDirectory, 'images') +} + const IMAGE_EXTENSION_BY_MIME: Record = Object.fromEntries( Object.entries(IMAGE_MIME_BY_EXTENSION).map(([extension, mimeType]) => [ mimeType, @@ -295,7 +302,7 @@ export async function cacheImage( options.signal?.throwIfAborted() if (imageData.trim().toLowerCase().startsWith(IMGCACHE_URL_PREFIX)) return imageData.trim() - const cacheDir = path.join(app.getPath('userData'), 'images') + const cacheDir = getCacheDirectory() if (!fs.existsSync(cacheDir)) fs.mkdirSync(cacheDir, { recursive: true }) const fileName = `img_${Date.now()}_${nanoid(8)}` @@ -332,7 +339,7 @@ export async function resolveCachedImageDataUrl( throw new Error('Unsupported cached image reference') } - const cacheDir = path.join(app.getPath('userData'), 'images') + const cacheDir = getCacheDirectory() const cachePath = safeDecodePath(normalizedSource.slice(IMGCACHE_URL_PREFIX.length)) const fullPath = path.resolve(cacheDir, cachePath) if (!isPathInsideRoot(cacheDir, fullPath)) { diff --git a/src/main/plugin/index.ts b/src/main/plugin/index.ts index 510f0c94a6..7790a2da63 100644 --- a/src/main/plugin/index.ts +++ b/src/main/plugin/index.ts @@ -5,8 +5,6 @@ import { NOWLEDGE_MCP_SERVER_ID } from '@shared/types/nowledgeMemPlugin' import { normalizeMemUrl, type NowledgeMemConnections } from '@/nowledgeMem' -import { ToolchainService } from '@/toolchains' -import { createMinimalProcessEnvironment } from '@/mcp/processEnvironment' import { UserPlugins, type UserPluginRecord } from './userPlugins' import { UserPluginHooks } from './userPluginHooks' import type { @@ -20,13 +18,12 @@ import type { UserPluginInstallInput, PreparedUserPlugin } from '@shared/types/userPlugin' -import { app, shell } from 'electron' import { execFile } from 'node:child_process' import { createHash } from 'node:crypto' import fs from 'node:fs' import path from 'node:path' import { promisify } from 'node:util' -import ElectronStore from 'electron-store' +import Conf from 'conf' import { unzipSync } from 'fflate' import type { SkillServicePort } from '@shared/types/skill' import type { McpServicePort, MCPServerConfig } from '@shared/types/mcp' @@ -42,7 +39,7 @@ import type { RuntimeDependencyRecord } from '@shared/types/plugin' import { CUA_PLUGIN_ID, OFFICIAL_PLUGIN_SOURCE } from '@shared/types/plugin' -import { registerPluginToolPolicy, unregisterPluginToolPolicies } from './toolPolicyStore' +import type { PluginToolPolicyStore } from './toolPolicyStore' import type { PluginRuntimeSafetyStore, PluginRuntimeSentinel, @@ -85,12 +82,13 @@ type SkillContributionPort = Pick< export interface PluginSettingsWindowPort { open(input: { pluginId: string; title: string; entry: string }): Promise - close(pluginId: string): void - closeAll(): void + close(pluginId: string): Promise + closeAll(): Promise getPluginIdForWebContents(webContentsId: number): string | null } type PluginServiceDeps = { + toolPolicies: Pick nowledgeMem?: NowledgeMemConnections exportNowledgeSession?: (input: NowledgeExportInput) => Promise<{ threadId: string }> contextTape?: TapeAnchorWriter & TapeNonContextEntryReader & TapeIncarnationReader @@ -111,12 +109,19 @@ type PluginServiceDeps = { | 'retryRuntime' > skillService: SkillContributionPort - settingsWindow: PluginSettingsWindowPort + settingsWindow: Pick + openExternal(url: string): Promise + openPath(filePath: string): Promise + hookEnvironment(): Record + profileDirectory: string + homeDirectory: string + workingDirectory: string + appVersion: string platform?: NodeJS.Platform arch?: NodeJS.Architecture - appPath?: string - isPackaged?: boolean - resourcesPath?: string + appPath: string + isPackaged: boolean + resourcesPath: string } type ResolvedOfficialPlugin = { @@ -165,6 +170,7 @@ export interface PluginServicePort { } export class PluginService implements PluginServicePort { + private readonly toolPolicies: PluginServiceDeps['toolPolicies'] readonly contextHooks?: UserPluginHooks private readonly nowledgeMem?: NowledgeMemConnections private readonly exportNowledgeSession?: PluginServiceDeps['exportNowledgeSession'] @@ -172,25 +178,20 @@ export class PluginService implements PluginServicePort { private readonly mcpSettings: McpSettings private readonly mcpService: PluginServiceDeps['mcpService'] private readonly skillService: SkillContributionPort - private readonly settingsWindow: PluginSettingsWindowPort + private readonly settingsWindow: PluginServiceDeps['settingsWindow'] + private readonly openExternal: PluginServiceDeps['openExternal'] + private readonly openPath: PluginServiceDeps['openPath'] + private readonly profileDirectory: string + private readonly homeDirectory: string + private readonly workingDirectory: string + private readonly appVersion: string private readonly runtimeSupervisor: PluginServiceDeps['runtimeSupervisor'] private readonly platform: NodeJS.Platform private readonly arch: NodeJS.Architecture private readonly appPath: string private readonly isPackaged: boolean private readonly resourcesPath: string - private readonly store = new ElectronStore({ - name: 'plugin-settings', - defaults: { - userInstallations: [], - userPluginPending: null, - installations: [], - resources: [], - runtimes: [], - migrations: {}, - runtimeSentinels: {} - } - }) + private readonly store: Conf private readonly runtimeSafetyStore: PluginRuntimeSafetyStore = { read: (key) => this.getRuntimeSentinelMap()[key], write: (key, sentinel) => { @@ -213,25 +214,52 @@ export class PluginService implements PluginServicePort { private readonly activationErrors = new Map() constructor(deps: PluginServiceDeps) { + for (const directory of [ + deps.profileDirectory, + deps.homeDirectory, + deps.appPath, + deps.workingDirectory + ]) { + if (!path.isAbsolute(directory)) throw new Error('Plugin directories must be absolute') + } + if (deps.resourcesPath && !path.isAbsolute(deps.resourcesPath)) + throw new Error('Plugin resources directory must be absolute') + this.profileDirectory = deps.profileDirectory + this.homeDirectory = deps.homeDirectory + this.workingDirectory = deps.workingDirectory + this.appVersion = deps.appVersion + this.store = new Conf({ + configName: 'plugin-settings', + cwd: this.profileDirectory, + projectVersion: this.appVersion, + defaults: { + userInstallations: [], + userPluginPending: null, + installations: [], + resources: [], + runtimes: [], + migrations: {}, + runtimeSentinels: {} + } + }) + this.toolPolicies = deps.toolPolicies this.mcpSettings = deps.mcpSettings this.mcpService = deps.mcpService this.skillService = deps.skillService this.nowledgeMem = deps.nowledgeMem this.exportNowledgeSession = deps.exportNowledgeSession this.settingsWindow = deps.settingsWindow + this.openExternal = deps.openExternal + this.openPath = deps.openPath this.runtimeSupervisor = deps.runtimeSupervisor this.platform = deps.platform ?? process.platform this.arch = deps.arch ?? process.arch - this.appPath = deps.appPath ?? app.getAppPath() - this.isPackaged = deps.isPackaged ?? app.isPackaged - this.resourcesPath = deps.resourcesPath ?? process.resourcesPath ?? '' + this.appPath = deps.appPath + this.isPackaged = deps.isPackaged + this.resourcesPath = deps.resourcesPath this.runtimeSupervisor.attachSafetyStore(this.runtimeSafetyStore) if (deps.contextTape) { - this.contextHooks = new UserPluginHooks(deps.contextTape, () => - ToolchainService.getInstance().prependResolvedToEnv( - createMinimalProcessEnvironment(process.env, process.platform) - ) - ) + this.contextHooks = new UserPluginHooks(deps.contextTape, deps.hookEnvironment) this.userPlugins = new UserPlugins({ root: this.getPluginInstallRoot(), hooks: this.contextHooks, @@ -345,7 +373,7 @@ export class PluginService implements PluginServicePort { // A forced quit can leave the separately persisted policy behind. Clear // it before removing the legacy server; activation re-registers the // current policy later when installation intent remains enabled. - unregisterPluginToolPolicies(CUA_PLUGIN_ID) + this.toolPolicies.unregister(CUA_PLUGIN_ID) await this.mcpSettings.removeMcpServer('cua-driver') } @@ -356,13 +384,14 @@ export class PluginService implements PluginServicePort { } async shutdown(): Promise { + await this.contextHooks?.stop() this.userPlugins?.shutdown() const pluginIds = new Set(this.getInstallations().map((installation) => installation.pluginId)) for (const pluginId of pluginIds) { - unregisterPluginToolPolicies(pluginId) + this.toolPolicies.unregister(pluginId) } - this.settingsWindow.closeAll() + await this.settingsWindow.closeAll() } async listPlugins(): Promise { @@ -521,7 +550,7 @@ export class PluginService implements PluginServicePort { await this.openRuntimeGuide(pluginId) return { ok: true } case 'runtime.openProject': - await shell.openExternal('https://github.com/trycua/cua') + await this.openExternal('https://github.com/trycua/cua') return { ok: true } case 'runtime.uninstallHelper': return { @@ -651,8 +680,8 @@ export class PluginService implements PluginServicePort { } await this.skillService.unregisterPluginSkillsByOwner(pluginId) - unregisterPluginToolPolicies(pluginId) - this.settingsWindow.close(pluginId) + this.toolPolicies.unregister(pluginId) + await this.settingsWindow.close(pluginId) this.removeResourceRecordsByOwner(pluginId) if (runtimeStopError) { throw runtimeStopError @@ -907,7 +936,7 @@ export class PluginService implements PluginServicePort { private registerToolPolicies(plugin: ResolvedOfficialPlugin): void { for (const policy of plugin.manifest.toolPolicies ?? []) { - registerPluginToolPolicy({ + this.toolPolicies.register({ pluginId: plugin.manifest.id, serverId: policy.serverId, tools: policy.tools, @@ -1329,7 +1358,7 @@ export class PluginService implements PluginServicePort { permissions.accessibility === 'granted' ? MACOS_SCREEN_CAPTURE_SETTINGS : MACOS_ACCESSIBILITY_SETTINGS - await shell.openExternal(settingsUrl) + await this.openExternal(settingsUrl) return } @@ -1337,7 +1366,7 @@ export class PluginService implements PluginServicePort { try { const runtime = await this.refreshRuntime(pluginId) if (runtime.helperAppPath) { - const openError = await shell.openPath(runtime.helperAppPath) + const openError = await this.openPath(runtime.helperAppPath) if (!openError) { return } @@ -1366,7 +1395,7 @@ export class PluginService implements PluginServicePort { } throw new Error(`Plugin ${pluginId} does not declare a runtime guide URL`) } - await shell.openExternal(guideUrl) + await this.openExternal(guideUrl) } private async loadOfficialPlugins(): Promise { @@ -1430,7 +1459,7 @@ export class PluginService implements PluginServicePort { const sourceRoots = this.isPackaged ? [this.getPluginInstallRoot()] : [ - path.join(process.cwd(), 'plugins'), + path.join(this.workingDirectory, 'plugins'), path.join(this.appPath, 'plugins'), this.getPluginInstallRoot() ] @@ -1479,7 +1508,7 @@ export class PluginService implements PluginServicePort { const packageRoots = this.isPackaged ? resourceRoots : [ - path.join(process.cwd(), 'build', 'bundled-plugins'), + path.join(this.workingDirectory, 'build', 'bundled-plugins'), path.join(this.appPath, 'build', 'bundled-plugins'), path.join(this.appPath, 'plugins'), ...resourceRoots @@ -1966,7 +1995,7 @@ export class PluginService implements PluginServicePort { } private getPluginInstallRoot(): string { - return path.join(app.getPath('userData'), PLUGIN_INSTALL_DIRECTORY) + return path.join(this.profileDirectory, PLUGIN_INSTALL_DIRECTORY) } private getInstalledPluginRoot(pluginId: string): string { @@ -2263,7 +2292,7 @@ export class PluginService implements PluginServicePort { return candidate.slice('PATH:'.length) } if (candidate.startsWith('~/')) { - return path.join(app.getPath('home'), candidate.slice(2)) + return path.join(this.homeDirectory, candidate.slice(2)) } return candidate } @@ -2338,7 +2367,7 @@ export class PluginService implements PluginServicePort { private hydrateManifestPlaceholders(manifest: DeepChatPluginManifest): DeepChatPluginManifest { return JSON.parse( JSON.stringify(manifest) - .replaceAll('${app.version}', app.getVersion()) + .replaceAll('${app.version}', this.appVersion) .replaceAll('${arch}', this.arch) .replaceAll('${target.platform}', this.platform) .replaceAll( @@ -2349,7 +2378,7 @@ export class PluginService implements PluginServicePort { } private getReleaseTag(): string { - const version = app.getVersion() + const version = this.appVersion return version.startsWith('v') ? version : `v${version}` } diff --git a/src/main/plugin/runtimeSupervisor.ts b/src/main/plugin/runtimeSupervisor.ts index 1f1f1b2482..e7a58a4aa4 100644 --- a/src/main/plugin/runtimeSupervisor.ts +++ b/src/main/plugin/runtimeSupervisor.ts @@ -421,18 +421,27 @@ export class PluginRuntimeSupervisor { ) } - async ensureRunning(serverName: string, reason: PluginRuntimeStartReason): Promise { + async ensureRunning( + serverName: string, + reason: PluginRuntimeStartReason, + assertCurrent?: () => void + ): Promise { + assertCurrent?.() if (this.probePromises.has(serverName)) { await this.waitForRuntimeProbe(serverName, true) } - await this.ensureRunningAuthorized(serverName, reason, false) + assertCurrent?.() + await this.ensureRunningAuthorized(serverName, reason, false, assertCurrent) + assertCurrent?.() } private async ensureRunningAuthorized( serverName: string, reason: PluginRuntimeStartReason, - allowQuarantinedFingerprint: boolean + allowQuarantinedFingerprint: boolean, + assertCurrent?: () => void ): Promise { + assertCurrent?.() let entry = this.getStartableEntry(serverName) const processPort = this.getProcessPort() if (!processPort.isReady()) { @@ -442,11 +451,14 @@ export class PluginRuntimeSupervisor { const stopping = this.stopPromises.get(serverName) if (stopping) { await stopping + assertCurrent?.() entry = this.getStartableEntry(serverName) } const existingStart = this.startPromises.get(serverName) if (existingStart) { - return await existingStart + await existingStart + assertCurrent?.() + return } if (entry.quarantine && processPort.isActive(serverName)) { const error = new PluginRuntimeQuarantinedError(serverName, entry.quarantine) @@ -468,10 +480,11 @@ export class PluginRuntimeSupervisor { throw error } - const startPromise = this.startEntry(entry, reason, allowQuarantinedFingerprint) + const startPromise = this.startEntry(entry, reason, allowQuarantinedFingerprint, assertCurrent) this.startPromises.set(serverName, startPromise) try { await startPromise + assertCurrent?.() } finally { if (this.startPromises.get(serverName) === startPromise) { this.startPromises.delete(serverName) @@ -489,11 +502,13 @@ export class PluginRuntimeSupervisor { await this.ensureRunning(serverName, 'external') } - async requestExternalStop(serverName: string): Promise { + async requestExternalStop(serverName: string, assertCurrent?: () => void): Promise { + assertCurrent?.() if (!this.entries.has(serverName)) { throw new Error(`Plugin runtime server "${serverName}" is not registered`) } - await this.stopServer(serverName) + await this.stopServer(serverName, 'normal', assertCurrent) + assertCurrent?.() } async testRuntime(pluginId: string, serverName: string): Promise { @@ -540,8 +555,10 @@ export class PluginRuntimeSupervisor { async restartIfRunning( serverName: string, - reason: Extract + reason: Extract, + assertCurrent?: () => void ): Promise { + assertCurrent?.() const processPort = this.processPort const entry = this.entries.get(serverName) if (!entry) { @@ -555,12 +572,14 @@ export class PluginRuntimeSupervisor { (!processPort.isActive(serverName) && !this.startPromises.has(serverName)) ) { if (entry.registration.startMode === 'eager') { - await this.ensureRunning(serverName, reason) + await this.ensureRunning(serverName, reason, assertCurrent) } return true } - await this.stopServer(serverName) - await this.ensureRunning(serverName, reason) + await this.stopServer(serverName, 'normal', assertCurrent) + assertCurrent?.() + await this.ensureRunning(serverName, reason, assertCurrent) + assertCurrent?.() return true } @@ -617,8 +636,10 @@ export class PluginRuntimeSupervisor { private async startEntry( entry: RuntimeEntry, reason: PluginRuntimeStartReason, - allowQuarantinedFingerprint: boolean + allowQuarantinedFingerprint: boolean, + assertCurrent?: () => void ): Promise { + assertCurrent?.() const processPort = this.getProcessPort() const { registration } = entry entry.state = 'starting' @@ -628,9 +649,16 @@ export class PluginRuntimeSupervisor { const initialFingerprint = registration.adapter ? await this.verifyLaunchArtifacts(entry) : undefined + assertCurrent?.() if (initialFingerprint) { - await this.authorizeGuardedSpawn(entry, initialFingerprint, allowQuarantinedFingerprint) + await this.authorizeGuardedSpawn( + entry, + initialFingerprint, + allowQuarantinedFingerprint, + assertCurrent + ) } + assertCurrent?.() if (registration.adapter) { entry.adapterCleanupRequired = true } @@ -643,6 +671,7 @@ export class PluginRuntimeSupervisor { } : undefined ) + assertCurrent?.() if (entry.retiring || this.shuttingDown) { throw new Error( `Plugin runtime server "${registration.serverName}" was stopped during startup` @@ -652,9 +681,16 @@ export class PluginRuntimeSupervisor { // boundaries. Re-verify the complete launch artifact contract here so a // replacement during daemon startup cannot become the proxy executable. const proxyFingerprint = await this.verifyLaunchArtifacts(entry) + assertCurrent?.() if (proxyFingerprint && !initialFingerprint) { - await this.authorizeGuardedSpawn(entry, proxyFingerprint, allowQuarantinedFingerprint) + await this.authorizeGuardedSpawn( + entry, + proxyFingerprint, + allowQuarantinedFingerprint, + assertCurrent + ) } + assertCurrent?.() if ( initialFingerprint && proxyFingerprint && @@ -666,6 +702,7 @@ export class PluginRuntimeSupervisor { ) } await processPort.start(registration.serverName, launch?.configOverride) + assertCurrent?.() if (!processPort.isRunning(registration.serverName)) { throw new Error( `Plugin runtime server "${registration.serverName}" did not reach running state` @@ -718,8 +755,10 @@ export class PluginRuntimeSupervisor { private async stopServer( serverName: string, - mode: 'normal' | 'shutdown' = 'normal' + mode: 'normal' | 'shutdown' = 'normal', + assertCurrent?: () => void ): Promise { + assertCurrent?.() const entry = this.entries.get(serverName) if (!entry) { return @@ -730,13 +769,16 @@ export class PluginRuntimeSupervisor { await this.escalateStopForShutdown(entry, existingStop) return } - return await existingStop + await existingStop + assertCurrent?.() + return } - const stopPromise = this.stopEntry(entry, mode) + const stopPromise = this.stopEntry(entry, mode, assertCurrent) this.stopPromises.set(serverName, stopPromise) try { await stopPromise + assertCurrent?.() } finally { if (this.stopPromises.get(serverName) === stopPromise) { this.stopPromises.delete(serverName) @@ -744,12 +786,18 @@ export class PluginRuntimeSupervisor { } } - private async stopEntry(entry: RuntimeEntry, mode: 'normal' | 'shutdown'): Promise { + private async stopEntry( + entry: RuntimeEntry, + mode: 'normal' | 'shutdown', + assertCurrent?: () => void + ): Promise { + assertCurrent?.() const { registration } = entry const startPromise = this.startPromises.get(registration.serverName) if (startPromise) { await startPromise.catch(() => undefined) } + assertCurrent?.() const processPort = this.processPort const errors: unknown[] = [] @@ -794,8 +842,10 @@ export class PluginRuntimeSupervisor { private async authorizeGuardedSpawn( entry: RuntimeEntry, fingerprint: PluginRuntimeFingerprint, - allowQuarantinedFingerprint: boolean + allowQuarantinedFingerprint: boolean, + assertCurrent?: () => void ): Promise { + assertCurrent?.() const { registration } = entry const expectedRuntimeId = registration.runtimeId ?? registration.serverName if ( @@ -827,6 +877,7 @@ export class PluginRuntimeSupervisor { } await recoverStaleLaunch.call(registration.adapter, previous.launchContext) } + assertCurrent?.() const sentinel: PluginRuntimeSentinel = { schemaVersion: 1, diff --git a/src/main/plugin/toolPolicyStore.ts b/src/main/plugin/toolPolicyStore.ts index f41a163d6e..8b217f34ff 100644 --- a/src/main/plugin/toolPolicyStore.ts +++ b/src/main/plugin/toolPolicyStore.ts @@ -1,85 +1,63 @@ -import ElectronStore from 'electron-store' import type { PluginToolPolicyDecision } from '@shared/types/plugin' -type StoredToolPolicy = { +export type StoredToolPolicy = { pluginId: string serverId: string tools: Record enabled: boolean } -type ToolPolicySettings = { - policies: StoredToolPolicy[] -} - export type PluginToolPolicyLookup = { managed: boolean decision: PluginToolPolicyDecision | null } -const store = new ElectronStore({ - name: 'plugin-tool-policies', - defaults: { - policies: [] +export class PluginToolPolicyStore { + constructor( + private readonly store: { + get(key: 'policies'): StoredToolPolicy[] | undefined + set(key: 'policies', policies: StoredToolPolicy[]): void + } + ) {} + + register(policy: StoredToolPolicy): void { + const policies = this.store.get('policies') ?? [] + const filtered = policies.filter( + (item) => !(item.pluginId === policy.pluginId && item.serverId === policy.serverId) + ) + this.store.set('policies', [...filtered, policy]) } -}) - -export function registerPluginToolPolicy(policy: StoredToolPolicy): void { - const policies = store.get('policies') ?? [] - const filtered = policies.filter( - (item) => !(item.pluginId === policy.pluginId && item.serverId === policy.serverId) - ) - store.set('policies', [...filtered, policy]) -} - -export function unregisterPluginToolPolicies(pluginId: string): void { - const policies = store.get('policies') ?? [] - store.set( - 'policies', - policies.filter((policy) => policy.pluginId !== pluginId) - ) -} -export function getPluginToolPolicy( - serverId: string, - toolName: string -): PluginToolPolicyDecision | null { - return resolvePluginToolPolicy(serverId, toolName).decision -} - -function getEnabledServerPolicies(serverId: string): StoredToolPolicy[] { - const policies = store.get('policies') ?? [] - return policies.filter((policy) => policy.enabled && policy.serverId === serverId) -} - -export function getExplicitlyDeniedPluginTools(serverId: string): string[] { - const matches = getEnabledServerPolicies(serverId) - if (matches.length !== 1) { - return [] + unregister(pluginId: string): void { + const policies = this.store.get('policies') ?? [] + this.store.set( + 'policies', + policies.filter((policy) => policy.pluginId !== pluginId) + ) } - return Object.entries(matches[0].tools) - .filter(([, decision]) => decision === 'deny') - .map(([toolName]) => toolName) -} -export function resolvePluginToolPolicy( - serverId: string, - toolName: string -): PluginToolPolicyLookup { - const matches = getEnabledServerPolicies(serverId) - if (matches.length === 0) { - return { managed: false, decision: null } + deniedTools(serverId: string): string[] { + const matches = this.getEnabledServerPolicies(serverId) + if (matches.length !== 1) return [] + return Object.entries(matches[0].tools) + .filter(([, decision]) => decision === 'deny') + .map(([toolName]) => toolName) } - // More than one enabled owner for a server is ambiguous. Treat it like an - // undeclared tool so stale policy records cannot accidentally widen access. - if (matches.length !== 1) { - return { managed: true, decision: null } + resolve(serverId: string, toolName: string): PluginToolPolicyLookup { + const matches = this.getEnabledServerPolicies(serverId) + if (matches.length === 0) return { managed: false, decision: null } + // Ambiguous owners retain a closed policy, including undeclared tools. + if (matches.length !== 1) return { managed: true, decision: null } + const decision = matches[0].tools[toolName] + return { + managed: true, + decision: decision === 'allow' || decision === 'ask' || decision === 'deny' ? decision : null + } } - const decision = matches[0].tools[toolName] - return { - managed: true, - decision: decision === 'allow' || decision === 'ask' || decision === 'deny' ? decision : null + private getEnabledServerPolicies(serverId: string): StoredToolPolicy[] { + const policies = this.store.get('policies') ?? [] + return policies.filter((policy) => policy.enabled && policy.serverId === serverId) } } diff --git a/src/main/plugin/userPluginHooks.ts b/src/main/plugin/userPluginHooks.ts index b51720358e..9a1f0cebe5 100644 --- a/src/main/plugin/userPluginHooks.ts +++ b/src/main/plugin/userPluginHooks.ts @@ -52,8 +52,38 @@ export class UserPluginHooks implements PluginContextPort { private queue: Promise = Promise.resolve() private activeRuns = new Map() private updating = false + private accepting = true + private controller = new AbortController() + private draining?: Promise + + start(): void { + if (this.draining) throw new Error('Plugin hook work must drain before restarting') + if (this.accepting) return + this.controller = new AbortController() + this.accepting = true + } + + async stop(): Promise { + this.accepting = false + this.controller.abort() + const drain = (this.draining ??= this.queue) + void drain.then(() => { + if (this.draining === drain) this.draining = undefined + }) + await new Promise((resolve, reject) => { + const timeout = setTimeout( + () => reject(new Error('Plugin hook work did not drain before shutdown')), + 30_000 + ) + void drain.then(() => { + clearTimeout(timeout) + resolve() + }) + }) + } beginRun(sessionId: string): void { + if (!this.accepting) throw new Error('Plugin hook owner is stopped') if (this.updating) throw new Error('A plugin update is being applied; retry after it completes') this.activeRuns.set(sessionId, (this.activeRuns.get(sessionId) ?? 0) + 1) } @@ -65,6 +95,7 @@ export class UserPluginHooks implements PluginContextPort { } beginUpdate(): () => void { + if (!this.accepting) throw new Error('Plugin hook owner is stopped') if (this.updating || this.activeRuns.size) throw new Error('Finish or stop active DeepChat turns before updating a plugin') this.updating = true @@ -150,15 +181,19 @@ export class UserPluginHooks implements PluginContextPort { } async accept(input: PluginContextInput): Promise { + if (!this.accepting) throw new Error('Plugin hook owner is stopped') if (!this.hasHooks()) return + const lifetime = this.controller.signal const incarnationId = this.tape.getTapeIncarnationId(input.sessionId) const operation = this.queue.then(async () => { + if (lifetime.aborted) return if (this.tape.getTapeIncarnationId(input.sessionId) !== incarnationId) return const deadline = AbortSignal.timeout(10000) - const signal = input.signal ? AbortSignal.any([deadline, input.signal]) : deadline + const signal = AbortSignal.any([deadline, lifetime, ...(input.signal ? [input.signal] : [])]) const promptHash = createHash('sha256').update(input.prompt).digest('hex') const history = this.history(input.sessionId) for (const owner of this.owners.values()) { + if (lifetime.aborted) return const previous = [...history.values()].filter( (item) => item.pluginId === owner.pluginId && item.digest === owner.digest ) @@ -390,6 +425,7 @@ export class UserPluginHooks implements PluginContextPort { } async retry(pluginId: string, invocationId: string): Promise { + if (!this.accepting) throw new Error('Plugin hook owner is stopped') const invocation = [...this.sessions.keys()] .map((sessionId) => this.history(sessionId).get(invocationId)) .find(Boolean) @@ -409,7 +445,9 @@ export class UserPluginHooks implements PluginContextPort { const incarnationId = this.tape.getTapeIncarnationId(sessionId) const expectedInput = JSON.stringify(invocation.input) const expectedStatus = invocation.status + const lifetime = this.controller.signal const operation = this.queue.then(() => { + lifetime.throwIfAborted() if (this.tape.getTapeIncarnationId(sessionId) !== incarnationId) throw new Error('Hook retry is unavailable after the session was cleared') const current = this.history(sessionId).get(invocationId) @@ -431,7 +469,7 @@ export class UserPluginHooks implements PluginContextPort { current.event, `${current.boundaryId}:retry:${randomUUID()}`, current.event === 'SessionStart' ? current.boundaryId.split(':')[0] : undefined, - AbortSignal.timeout(10000), + AbortSignal.any([AbortSignal.timeout(10000), lifetime]), current.hookId ) }) @@ -469,6 +507,7 @@ async function runContextHook( DEEPCHAT_PLUGIN_ID: owner.pluginId } }) + const closed = new Promise((resolve) => child.once('close', () => resolve())) const out: Buffer[] = [] let outBytes = 0 let errBytes = 0 @@ -485,7 +524,10 @@ async function runContextHook( /* The group already exited. */ } } - if (error) void terminateProcessTree(child, { graceMs: 100 }).finally(() => reject(error)) + if (error) + void Promise.allSettled([terminateProcessTree(child, { graceMs: 100 }), closed]).then(() => + reject(error) + ) else resolve(Buffer.concat(out).toString('utf8')) } const abort = () => finish(new Error('Hook cancelled')) diff --git a/src/main/plugin/userPlugins.ts b/src/main/plugin/userPlugins.ts index 2d6e1d1032..863911be62 100644 --- a/src/main/plugin/userPlugins.ts +++ b/src/main/plugin/userPlugins.ts @@ -517,7 +517,7 @@ export class UserPlugins { record.package.mcpServers.map(async (server) => { const key = `${record.pluginId}.${server.name}` const config = configs[key] - const bindings = config ? this.deps.mcpSettings.getMcpVariableBindings(config) : {} + const bindings = config ? await this.deps.mcpSettings.getMcpVariableBindings(config) : {} setup[key] = server.requiredVariables.filter((name) => !bindings[name]) const state = this.deps.supervisor.getState(key) return { @@ -577,7 +577,7 @@ export class UserPlugins { throw new Error('MCP configuration is unavailable; enable the plugin first') if (Object.keys(values).some((name) => !declared.requiredVariables.includes(name))) throw new Error('Undeclared MCP variable') - this.deps.mcpSettings.setMcpVariableBindings(current, values) + await this.deps.mcpSettings.setMcpVariableBindings(current, values) await this.deps.supervisor.unregisterPlugin(pluginId) if (current.serverId) this.deps.mcpService.revokeMcpAppsByServer?.(current.serverId) if (record.enabled) await this.activate(record) diff --git a/src/main/project/index.ts b/src/main/project/index.ts index 7cda5664ff..5cd164f40c 100644 --- a/src/main/project/index.ts +++ b/src/main/project/index.ts @@ -1,4 +1,3 @@ -import { app, shell } from 'electron' import fs from 'fs' import path from 'path' import type { DeviceServicePort } from '@shared/types/device' @@ -14,20 +13,29 @@ import type { SettingsStore } from '@/config/settingsStore' const PROJECT_SNAPSHOT_VERSION_SETTINGS_KEY = 'projectSnapshotVersion' +export type ProjectHost = Pick & { + readonly tempDirectory: string + readonly userDataDirectory: string + readonly appDataDirectory: string + readonly documentsDirectory: string | null + readonly homeDirectory: string | null + openPath(path: string): Promise +} + export class ProjectService { private sqlitePresenter: ProjectDatabase private sessionDatabase: SessionDatabase - private deviceService: DeviceServicePort private settings: SettingsStore private readonly tempRoot: string private readonly userDataWorkspacesRoot: string private readonly appDataRoot: string + private readonly defaultWorkspaceCandidates: string[] private snapshotVersion: number constructor( sqlitePresenter: ProjectDatabase, sessionDatabase: SessionDatabase, - deviceService: DeviceServicePort, + private readonly host: ProjectHost, settings: SettingsStore, private readonly publishDefaultProjectPathChanged: ( path: string | null, @@ -41,11 +49,21 @@ export class ProjectService { ) { this.sqlitePresenter = sqlitePresenter this.sessionDatabase = sessionDatabase - this.deviceService = deviceService this.settings = settings - this.tempRoot = path.resolve(app.getPath('temp')) - this.userDataWorkspacesRoot = path.resolve(path.join(app.getPath('userData'), 'workspaces')) - this.appDataRoot = path.resolve(app.getPath('appData')) + const resolveDirectory = (directory: string): string => { + if (!path.isAbsolute(directory)) { + throw new Error('Project host directories must be absolute') + } + return path.resolve(directory) + } + this.tempRoot = resolveDirectory(host.tempDirectory) + this.userDataWorkspacesRoot = path.join(resolveDirectory(host.userDataDirectory), 'workspaces') + this.appDataRoot = resolveDirectory(host.appDataDirectory) + this.defaultWorkspaceCandidates = this.normalizeUniqueEnvironmentPaths( + [host.documentsDirectory, host.homeDirectory, this.userDataWorkspacesRoot] + .filter((directory): directory is string => directory !== null) + .map((directory) => path.join(resolveDirectory(directory), 'DeepChat')) + ) this.snapshotVersion = this.readSnapshotVersion() } @@ -226,7 +244,7 @@ export class ProjectService { return } - const errorMessage = await shell.openPath(normalizedPath) + const errorMessage = await this.host.openPath(normalizedPath) if (errorMessage) { throw new Error(errorMessage) } @@ -243,7 +261,7 @@ export class ProjectService { } async selectDirectory(): Promise<{ path: string | null; version: number }> { - const result = await this.deviceService.selectDirectory() + const result = await this.host.selectDirectory() if (result.canceled || result.filePaths.length === 0) { return { path: null, version: this.snapshotVersion } } @@ -263,7 +281,7 @@ export class ProjectService { } async ensureDefaultWorkspace(): Promise { - const candidates = this.getDefaultWorkspaceCandidates() + const candidates = this.defaultWorkspaceCandidates const currentDefault = this.getDefaultProjectPath() const currentDefaultIsBuiltin = Boolean( currentDefault && this.isDefaultWorkspaceCandidate(currentDefault, candidates) @@ -303,7 +321,7 @@ export class ProjectService { getDefaultChatWorkspacePath(): string | null { const projectPath = this.getDefaultProjectPath() - let candidates = this.getDefaultWorkspaceCandidates() + let candidates = this.defaultWorkspaceCandidates if (projectPath && this.isDefaultWorkspaceCandidate(projectPath, candidates)) { candidates = [projectPath] } @@ -319,7 +337,7 @@ export class ProjectService { } ensureChatWorkspace(): { path: string; version: number } { - const candidates = this.getDefaultWorkspaceCandidates() + const candidates = this.defaultWorkspaceCandidates const currentDefault = this.getDefaultProjectPath() const currentDefaultIsBuiltin = Boolean( currentDefault && this.isDefaultWorkspaceCandidate(currentDefault, candidates) @@ -446,28 +464,6 @@ export class ProjectService { return normalizedPaths } - private getDefaultWorkspaceCandidates(): string[] { - const candidates: string[] = [] - const addCandidate = (basePath: string) => { - candidates.push(path.resolve(path.join(basePath, 'DeepChat'))) - } - - try { - addCandidate(app.getPath('documents')) - } catch (error) { - console.warn('[ProjectService] Failed to resolve Documents path:', error) - } - - try { - addCandidate(app.getPath('home')) - } catch (error) { - console.warn('[ProjectService] Failed to resolve Home path:', error) - } - - candidates.push(path.resolve(path.join(this.userDataWorkspacesRoot, 'DeepChat'))) - return this.normalizeUniqueEnvironmentPaths(candidates) - } - private isDefaultWorkspaceCandidate(workspacePath: string, candidates: string[]): boolean { const normalizedPath = path.resolve(workspacePath) return candidates.some((candidate) => path.resolve(candidate) === normalizedPath) diff --git a/src/main/provider/auth/githubCopilotDeviceFlow.ts b/src/main/provider/auth/githubCopilotDeviceFlow.ts index 30f41ae214..b329731b00 100644 --- a/src/main/provider/auth/githubCopilotDeviceFlow.ts +++ b/src/main/provider/auth/githubCopilotDeviceFlow.ts @@ -1,12 +1,9 @@ import { BrowserWindow, clipboard, shell } from 'electron' import { exec } from 'child_process' import logger from '@shared/logger' -import { z } from 'zod' -import { createProviderHttpErrorFromResponse, type ProviderHttpError } from '../providerFailure' const GITHUB_DEVICE_URL = 'https://github.com/login/device' const GITHUB_COPILOT_DEVICE_FLOW_CLIENT_ID = 'Iv1.b507a08c87ecfe98' -const GITHUB_TOKEN_PATTERN = /^[\x21-\x7e]+$/ export interface DeviceFlowConfig { clientId: string @@ -29,99 +26,6 @@ export interface AccessTokenResponse { error_description?: string } -export interface CopilotTokenResponse { - token: string - expires_at: number - refresh_in?: number -} - -// Copilot chat uses VS Code integration metadata independently of the DeepChat app version. -export const GITHUB_COPILOT_CHAT_HEADERS = { - 'User-Agent': 'GitHubCopilotChat/0.44.0', - 'Editor-Version': 'vscode/1.115.0', - 'Editor-Plugin-Version': 'copilot-chat/0.44.0', - 'Copilot-Integration-Id': 'vscode-chat', - 'X-GitHub-Api-Version': '2026-08-01' -} - -const CopilotTokenSchema = z.object({ - token: z.string().regex(GITHUB_TOKEN_PATTERN), - expires_at: z.number().positive().finite(), - refresh_in: z.number().nonnegative().finite().optional() -}) - -export async function createGitHubCopilotHttpError( - response: Response, - phase: 'token' | 'chat', - secrets: string[] -): Promise { - const body = await response.json().catch(() => null) - const sanitize = (value: unknown): string => { - if (typeof value !== 'string') return '' - let text = value - for (const secret of secrets) { - if (secret) text = text.replaceAll(secret, '[redacted]') - } - return text - .replace(/(?:gh[opusr]_|github_pat_)[A-Za-z0-9_]+/g, '[redacted]') - .replace(/Bearer\s+[^\s"',}]+/gi, 'Bearer [redacted]') - .replace(/(?:access_token|refresh_token|api_key)["\s:=]+[^"'\s,}]+/gi, '[redacted]') - .replace(/[\r\n\0]/g, ' ') - .slice(0, 500) - } - const serverMessage = sanitize( - body?.error?.message ?? body?.error_details?.message ?? body?.message - ) - const serverCode = sanitize(body?.error?.code ?? body?.error_details?.code ?? body?.code) - const requestId = sanitize( - response.headers.get('x-github-request-id') ?? response.headers.get('x-request-id') - ) - const details = [ - serverMessage, - /^[A-Za-z0-9._:-]{1,128}$/.test(serverCode) ? `code=${serverCode}` : '', - /^[A-Za-z0-9._:-]{1,128}$/.test(requestId) ? `request_id=${requestId}` : '' - ].filter(Boolean) - const description = phase === 'token' ? 'token exchange failed' : 'API error' - return createProviderHttpErrorFromResponse( - `GitHub Copilot ${description}: ${response.status} ${sanitize(response.statusText)}` + - (details.length ? ` - ${details.join('; ')}` : ''), - response, - `github_copilot_${phase}_http_error` - ) -} - -export async function getGitHubCopilotToken( - oauthToken: string, - signal?: AbortSignal -): Promise { - signal?.throwIfAborted() - if (typeof oauthToken !== 'string' || !GITHUB_TOKEN_PATTERN.test(oauthToken)) { - throw new Error('No GitHub OAuth token available. Please sign in to GitHub Copilot.') - } - try { - const response = await fetch('https://api.github.com/copilot_internal/v2/token', { - headers: { - Authorization: `token ${oauthToken}`, - Accept: 'application/json', - 'User-Agent': GITHUB_COPILOT_CHAT_HEADERS['User-Agent'], - 'X-GitHub-Api-Version': '2025-04-01' - }, - ...(signal ? { signal } : {}) - }) - if (!response.ok) { - throw await createGitHubCopilotHttpError(response, 'token', [oauthToken]) - } - const result = CopilotTokenSchema.safeParse(await response.json().catch(() => null)) - if (!result.success) { - throw new Error('Invalid GitHub Copilot token response') - } - return result.data - } catch (error) { - signal?.throwIfAborted() - throw error - } -} - export class GitHubCopilotDeviceFlow { private config: DeviceFlowConfig private pollingInterval: NodeJS.Timeout | null = null diff --git a/src/main/provider/auth/githubCopilotToken.ts b/src/main/provider/auth/githubCopilotToken.ts new file mode 100644 index 0000000000..3568d73d49 --- /dev/null +++ b/src/main/provider/auth/githubCopilotToken.ts @@ -0,0 +1,97 @@ +import { z } from 'zod' +import { createProviderHttpErrorFromResponse, type ProviderHttpError } from '../providerFailure' + +const GITHUB_TOKEN_PATTERN = /^[\x21-\x7e]+$/ + +export interface CopilotTokenResponse { + token: string + expires_at: number + refresh_in?: number +} + +// Copilot chat uses VS Code integration metadata independently of the DeepChat app version. +export const GITHUB_COPILOT_CHAT_HEADERS = { + 'User-Agent': 'GitHubCopilotChat/0.44.0', + 'Editor-Version': 'vscode/1.115.0', + 'Editor-Plugin-Version': 'copilot-chat/0.44.0', + 'Copilot-Integration-Id': 'vscode-chat', + 'X-GitHub-Api-Version': '2026-08-01' +} + +const CopilotTokenSchema = z.object({ + token: z.string().regex(GITHUB_TOKEN_PATTERN), + expires_at: z.number().positive().finite(), + refresh_in: z.number().nonnegative().finite().optional() +}) + +export async function createGitHubCopilotHttpError( + response: Response, + phase: 'token' | 'chat', + secrets: string[] +): Promise { + const body = await response.json().catch(() => null) + const sanitize = (value: unknown): string => { + if (typeof value !== 'string') return '' + let text = value + for (const secret of secrets) { + if (secret) text = text.replaceAll(secret, '[redacted]') + } + return text + .replace(/(?:gh[opusr]_|github_pat_)[A-Za-z0-9_]+/g, '[redacted]') + .replace(/Bearer\s+[^\s"',}]+/gi, 'Bearer [redacted]') + .replace(/(?:access_token|refresh_token|api_key)["\s:=]+[^"'\s,}]+/gi, '[redacted]') + .replace(/[\r\n\0]/g, ' ') + .slice(0, 500) + } + const serverMessage = sanitize( + body?.error?.message ?? body?.error_details?.message ?? body?.message + ) + const serverCode = sanitize(body?.error?.code ?? body?.error_details?.code ?? body?.code) + const requestId = sanitize( + response.headers.get('x-github-request-id') ?? response.headers.get('x-request-id') + ) + const details = [ + serverMessage, + /^[A-Za-z0-9._:-]{1,128}$/.test(serverCode) ? `code=${serverCode}` : '', + /^[A-Za-z0-9._:-]{1,128}$/.test(requestId) ? `request_id=${requestId}` : '' + ].filter(Boolean) + const description = phase === 'token' ? 'token exchange failed' : 'API error' + return createProviderHttpErrorFromResponse( + `GitHub Copilot ${description}: ${response.status} ${sanitize(response.statusText)}` + + (details.length ? ` - ${details.join('; ')}` : ''), + response, + `github_copilot_${phase}_http_error` + ) +} + +export async function getGitHubCopilotToken( + oauthToken: string, + signal?: AbortSignal +): Promise { + signal?.throwIfAborted() + if (typeof oauthToken !== 'string' || !GITHUB_TOKEN_PATTERN.test(oauthToken)) { + throw new Error('No GitHub OAuth token available. Please sign in to GitHub Copilot.') + } + try { + const response = await fetch('https://api.github.com/copilot_internal/v2/token', { + headers: { + Authorization: `token ${oauthToken}`, + Accept: 'application/json', + 'User-Agent': GITHUB_COPILOT_CHAT_HEADERS['User-Agent'], + 'X-GitHub-Api-Version': '2025-04-01' + }, + ...(signal ? { signal } : {}) + }) + if (!response.ok) { + throw await createGitHubCopilotHttpError(response, 'token', [oauthToken]) + } + const result = CopilotTokenSchema.safeParse(await response.json().catch(() => null)) + if (!result.success) { + throw new Error('Invalid GitHub Copilot token response') + } + return result.data + } catch (error) { + signal?.throwIfAborted() + throw error + } +} diff --git a/src/main/provider/auth/index.ts b/src/main/provider/auth/index.ts index 99ba15a011..253cb303f0 100644 --- a/src/main/provider/auth/index.ts +++ b/src/main/provider/auth/index.ts @@ -1,46 +1,28 @@ -import type { ProviderSettingsPort } from '@/provider/settings' import logger from '@shared/logger' -import { BrowserWindow } from 'electron' -import * as http from 'http' -import { URL } from 'url' import { createGitHubCopilotOAuth } from './githubCopilotOAuth' -import { getGitHubCopilotToken, getGlobalGitHubCopilotDeviceFlow } from './githubCopilotDeviceFlow' -import { getGlobalOpenAICodexAuth, initializeGlobalOpenAICodexAuth } from './openaiCodex' -import { getGlobalXaiGrokAuth, initializeGlobalXaiGrokAuth } from './xaiGrok' +import { getGlobalGitHubCopilotDeviceFlow } from './githubCopilotDeviceFlow' +import { getGitHubCopilotToken } from './githubCopilotToken' import type { OpenAICodexAuthStatus } from '@shared/types/openai-codex' import type { XaiGrokAuthStatus } from '@shared/types/xai-grok' -import type { DeepchatEventPublisher } from '@shared/contracts/events' -import type { LLM_PROVIDER } from '@shared/types/provider' - -import type { OAuthConfig, OAuthServicePort } from '@shared/types/oauth' +import type { + GitHubCopilotCredentialOwner, + OAuthServicePort, + ProviderAccountAuthPort +} from '@shared/types/oauth' export class OAuthService implements OAuthServicePort { - private authWindow: BrowserWindow | null = null - private callbackServer: http.Server | null = null - private callbackPort = 3000 + private stopped = false + private readonly copilotController = new AbortController() constructor( - private readonly providerSettings: Pick< - ProviderSettingsPort, - 'getProviderById' | 'setProviderById' - >, - publishEvent: DeepchatEventPublisher - ) { - initializeGlobalOpenAICodexAuth(publishEvent) - initializeGlobalXaiGrokAuth(publishEvent) - } + private readonly providerAuth: GitHubCopilotCredentialOwner, + private readonly accounts: ProviderAccountAuthPort + ) {} - private saveGitHubCopilotCredential(provider: LLM_PROVIDER, apiKey: string): void { - const current = this.providerSettings.getProviderById(provider.id) - if ( - !current || - current.apiType !== provider.apiType || - current.apiKey !== provider.apiKey || - (current.copilotClientId?.trim() || '') !== (provider.copilotClientId?.trim() || '') - ) { - throw new Error('GitHub Copilot configuration changed during sign-in. Please try again.') - } - this.providerSettings.setProviderById(provider.id, { ...current, apiKey }) + async stop(): Promise { + this.stopped = true + this.copilotController.abort() + await Promise.all([this.accounts.stop(), this.providerAuth.invalidateGitHubCopilotSignIns()]) } /** @@ -48,15 +30,17 @@ export class OAuthService implements OAuthServicePort { */ async startGitHubCopilotDeviceFlowLogin(providerId: string): Promise { try { - const provider = this.providerSettings.getProviderById(providerId) - if (!provider) throw new Error(`Provider ${providerId} not found`) - const githubDeviceFlow = getGlobalGitHubCopilotDeviceFlow(provider.copilotClientId) + if (this.stopped) throw new Error('OAuth service is stopped') + const target = await this.providerAuth.getGitHubCopilotSignInTarget(providerId) + if (this.stopped) throw new Error('OAuth service is stopped') + const githubDeviceFlow = getGlobalGitHubCopilotDeviceFlow(target.clientId) // 开始Device Flow登录 const accessToken = await githubDeviceFlow.startDeviceFlow() - - await getGitHubCopilotToken(accessToken) - this.saveGitHubCopilotCredential(provider, accessToken) + if (this.stopped) throw new Error('OAuth service is stopped') + await getGitHubCopilotToken(accessToken, this.copilotController.signal) + if (this.stopped) throw new Error('OAuth service is stopped') + await this.providerAuth.commitGitHubCopilotCredential(target, accessToken) logger.info('[GitHub Copilot] Device Flow login completed successfully') return true @@ -67,41 +51,41 @@ export class OAuthService implements OAuthServicePort { } async getOpenAICodexStatus(): Promise { - return getGlobalOpenAICodexAuth().getStatus() + return this.accounts.getOpenAICodexStatus() } async startOpenAICodexBrowserLogin(): Promise { - return getGlobalOpenAICodexAuth().startBrowserLogin() + return this.accounts.startOpenAICodexBrowserLogin() } async completeOpenAICodexBrowserLoginFromUrl( callbackUrl: string ): Promise { - return getGlobalOpenAICodexAuth().completeBrowserLoginFromCallbackUrl(callbackUrl) + return this.accounts.completeOpenAICodexBrowserLoginFromUrl(callbackUrl) } async cancelOpenAICodexLogin(): Promise { - return getGlobalOpenAICodexAuth().cancelLogin() + return this.accounts.cancelOpenAICodexLogin() } async logoutOpenAICodex(): Promise { - return getGlobalOpenAICodexAuth().logout() + return this.accounts.logoutOpenAICodex() } async getXaiGrokStatus(): Promise { - return getGlobalXaiGrokAuth().getStatus() + return this.accounts.getXaiGrokStatus() } async startXaiGrokDeviceLogin(): Promise { - return getGlobalXaiGrokAuth().startDeviceLogin() + return this.accounts.startXaiGrokDeviceLogin() } async cancelXaiGrokLogin(): Promise { - return getGlobalXaiGrokAuth().cancelLogin() + return this.accounts.cancelXaiGrokLogin() } async logoutXaiGrok(): Promise { - return getGlobalXaiGrokAuth().logout() + return this.accounts.logoutXaiGrok() } /** @@ -116,9 +100,10 @@ export class OAuthService implements OAuthServicePort { // 使用专门的GitHub Copilot OAuth实现 logger.info('[GitHub Copilot][OAuth] Creating GitHub OAuth instance...') - const provider = this.providerSettings.getProviderById(providerId) - if (!provider) throw new Error(`Provider ${providerId} not found`) - const githubOAuth = createGitHubCopilotOAuth(provider.copilotClientId) + if (this.stopped) throw new Error('OAuth service is stopped') + const target = await this.providerAuth.getGitHubCopilotSignInTarget(providerId) + if (this.stopped) throw new Error('OAuth service is stopped') + const githubOAuth = createGitHubCopilotOAuth(target.clientId) // 开始OAuth登录 logger.info('[GitHub Copilot][OAuth] Starting OAuth login flow...') @@ -131,12 +116,14 @@ export class OAuthService implements OAuthServicePort { if (!authCode) { throw new Error('Failed to obtain authorization code') } + if (this.stopped) throw new Error('OAuth service is stopped') logger.info('[GitHub Copilot][OAuth] Auth code received successfully') // 用授权码交换访问令牌 logger.info('[GitHub Copilot][OAuth] Exchanging auth code for access token...') const accessToken = await githubOAuth.exchangeCodeForToken(authCode) + if (this.stopped) throw new Error('OAuth service is stopped') logger.info( '[GitHub Copilot][OAuth] Token exchange completed, access token received:', accessToken ? 'SUCCESS' : 'FAILED' @@ -146,8 +133,9 @@ export class OAuthService implements OAuthServicePort { logger.info('[GitHub Copilot][OAuth] Access token received successfully') } - await getGitHubCopilotToken(accessToken) - this.saveGitHubCopilotCredential(provider, accessToken) + await getGitHubCopilotToken(accessToken, this.copilotController.signal) + if (this.stopped) throw new Error('OAuth service is stopped') + await this.providerAuth.commitGitHubCopilotCredential(target, accessToken) logger.info('[GitHub Copilot][OAuth] Traditional OAuth login completed successfully') return true @@ -167,301 +155,4 @@ export class OAuthService implements OAuthServicePort { throw error } } - - /** - * Start OAuth login flow (generic method) - */ - async startOAuthLogin(providerId: string, config: OAuthConfig): Promise { - try { - // Start callback server - await this.startCallbackServer() - - // Start OAuth login - const authCode = await this.startOAuthFlow(config) - - // Stop callback server - this.stopCallbackServer() - - // 用授权码交换访问令牌 - const accessToken = await this.exchangeCodeForToken(authCode, config) - - // Save access token to provider configuration - const provider = this.providerSettings.getProviderById(providerId) - if (provider) { - provider.apiKey = accessToken - this.providerSettings.setProviderById(providerId, provider) - } - - return true - } catch (error) { - console.error('OAuth login failed:', error) - this.stopCallbackServer() - - return false - } - } - - /** - * Start callback server - */ - private async startCallbackServer(): Promise { - return new Promise((resolve, reject) => { - this.callbackServer = http.createServer((req, res) => { - const url = new URL(req.url!, `http://localhost:${this.callbackPort}`) - - logger.info('Callback server received request:', url.href) - - // Set CORS headers - res.setHeader('Access-Control-Allow-Origin', '*') - res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS') - res.setHeader('Access-Control-Allow-Headers', 'Content-Type') - - if (url.pathname === '/auth/callback') { - const code = url.searchParams.get('code') - const error = url.searchParams.get('error') - - if (code) { - // Success page - res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' }) - res.end(` - - - - - Authorization Successful - - - -

✅ Authorization Successful

-

You have successfully authorized GitHub Copilot access.

-

You can close this window now.

- - - - `) - - // Trigger callback handling - this.handleServerCallback(code, null) - } else if (error) { - // Error page - res.writeHead(400, { 'Content-Type': 'text/html; charset=utf-8' }) - res.end(` - - - - - Authorization Failed - - - -

❌ Authorization Failed

-

An error occurred during authorization: ${error}

-

You can close this window and try again.

- - - `) - - this.handleServerCallback(null, error) - } else { - res.writeHead(400, { 'Content-Type': 'text/plain' }) - res.end('Invalid callback request') - } - } else { - res.writeHead(404, { 'Content-Type': 'text/plain' }) - res.end('Not found') - } - }) - - this.callbackServer.listen(this.callbackPort, 'localhost', () => { - logger.info(`OAuth callback server started on http://localhost:${this.callbackPort}`) - resolve() - }) - - this.callbackServer.on('error', (error) => { - console.error('Callback server error:', error) - reject(error) - }) - }) - } - - /** - * Stop callback server - */ - private stopCallbackServer(): void { - if (this.callbackServer) { - this.callbackServer.close() - this.callbackServer = null - logger.info('OAuth callback server stopped') - } - } - - // Callback handling resolve and reject functions - private callbackResolve: ((value: string) => void) | null = null - private callbackReject: ((reason?: Error) => void) | null = null - - /** - * Handle server callback - */ - private handleServerCallback(code: string | null, error: string | null): void { - if (error) { - console.error('OAuth server callback error:', error) - this.callbackReject?.(new Error(`OAuth authorization failed: ${error}`)) - } else if (code) { - logger.info('OAuth server callback success, received authorization code') - this.callbackResolve?.(code) - } - - // Clean up callback functions - this.callbackResolve = null - this.callbackReject = null - } - - /** - * Start OAuth flow - */ - private async startOAuthFlow(config: OAuthConfig): Promise { - return new Promise((resolve, reject) => { - // Save callback functions - this.callbackResolve = resolve - this.callbackReject = reject - - // Create authorization window - this.authWindow = new BrowserWindow({ - width: 500, - height: 700, - show: false, - webPreferences: { - nodeIntegration: false, - contextIsolation: true - }, - autoHideMenuBar: true, - title: 'GitHub Authorization Login' - }) - - // Build authorization URL - const authUrl = this.buildAuthUrl(config) - logger.info('Opening OAuth URL:', authUrl) - - this.authWindow.webContents.setWindowOpenHandler(() => ({ action: 'deny' })) - - // Load authorization page - this.authWindow.loadURL(authUrl) - this.authWindow.show() - - // Handle window close - this.authWindow.on('closed', () => { - this.authWindow = null - if (this.callbackReject) { - this.callbackReject(new Error('User cancelled login')) - this.callbackReject = null - this.callbackResolve = null - } - }) - - // Handle loading errors - this.authWindow.webContents.on('did-fail-load', (_event, errorCode, errorDescription) => { - console.error('OAuth page load failed:', errorCode, errorDescription) - this.closeAuthWindow() - if (this.callbackReject) { - this.callbackReject(new Error(`Failed to load authorization page: ${errorDescription}`)) - this.callbackReject = null - this.callbackResolve = null - } - }) - - // Monitor page navigation to check if callback page is reached - this.authWindow.webContents.on('did-navigate', (_event, navigationUrl) => { - logger.info('OAuth window navigated to:', navigationUrl) - // If navigated to our callback page, authorization flow is complete - if (navigationUrl.includes('deepchatai.cn/auth/github/callback')) { - // Close authorization window as callback server handles remaining logic - setTimeout(() => { - this.closeAuthWindow() - }, 2000) // Close after 2 seconds to let user see success page - } - }) - }) - } - - /** - * Build authorization URL - */ - private buildAuthUrl(config: OAuthConfig): string { - const params = new URLSearchParams({ - client_id: config.clientId, - redirect_uri: config.redirectUri, - response_type: config.responseType, - scope: config.scope - }) - - return `${config.authUrl}?${params.toString()}` - } - - /** - * Exchange authorization code for access token - */ - private async exchangeCodeForToken(code: string, config: OAuthConfig): Promise { - const response = await fetch('https://github.com/login/oauth/access_token', { - method: 'POST', - headers: { - Accept: 'application/json', - 'Content-Type': 'application/json', - 'User-Agent': 'DeepChat/1.0.0' - }, - body: JSON.stringify({ - client_id: config.clientId, - client_secret: config.clientSecret || process.env.GITHUB_CLIENT_SECRET, - code: code, - redirect_uri: config.redirectUri - }) - }) - - if (!response.ok) { - throw new Error(`Token exchange failed: ${response.status} ${response.statusText}`) - } - - const data = (await response.json()) as { - access_token: string - error?: string - error_description?: string - } - - if (data.error) { - throw new Error(`Token exchange error: ${data.error_description || data.error}`) - } - - return data.access_token - } - - /** - * Close authorization window - */ - private closeAuthWindow(): void { - if (this.authWindow && !this.authWindow.isDestroyed()) { - this.authWindow.close() - this.authWindow = null - } - } -} - -// GitHub Copilot OAuth configuration -export const GITHUB_COPILOT_OAUTH_CONFIG: OAuthConfig = { - authUrl: 'https://github.com/login/oauth/authorize', - redirectUri: - import.meta.env.VITE_GITHUB_REDIRECT_URI || 'https://deepchatai.cn/auth/github/callback', - clientId: import.meta.env.VITE_GITHUB_CLIENT_ID, - clientSecret: import.meta.env.VITE_GITHUB_CLIENT_SECRET, - scope: 'read:user read:org', - responseType: 'code' } diff --git a/src/main/provider/auth/openaiCodex/credentialStore.ts b/src/main/provider/auth/openaiCodex/credentialStore.ts index ded41e6104..36f4216eec 100644 --- a/src/main/provider/auth/openaiCodex/credentialStore.ts +++ b/src/main/provider/auth/openaiCodex/credentialStore.ts @@ -1,7 +1,7 @@ import * as fs from 'fs' import * as path from 'path' import { randomBytes } from 'node:crypto' -import { app, safeStorage } from 'electron' +import type { CredentialCryptoPort } from '@/config/secretStore' export type OpenAICodexCredentialStorage = 'safeStorage' | 'file' | 'none' @@ -41,19 +41,50 @@ function toErrorMessage(error: unknown): string { return error instanceof Error ? error.message : String(error) } +const MAX_CREDENTIAL_FILE_BYTES = 16 * 1024 * 1024 +const MAX_CREDENTIAL_PAYLOAD_BYTES = 8 * 1024 * 1024 + export class OpenAICodexCredentialStore { private readonly filePath: string + private readonly crypto: CredentialCryptoPort private lastLoadError: string | null = null + private stopped = false + private generation = 0 + private revision = 0 + private operations: Promise = Promise.resolve() + private pending = 0 + private pendingNormal = 0 + private loading: { revision: number; promise: Promise } | null = null + + constructor(options: { filePath: string; crypto: CredentialCryptoPort }) { + this.filePath = options.filePath + this.crypto = options.crypto + } + + stop(): void { + this.stopped = true + this.generation++ + this.loading = null + } - constructor(filePath?: string) { - this.filePath = - filePath || path.join(app.getPath('userData'), 'openai-codex-auth', 'credentials.json') + private captureOperation(): () => void { + const generation = this.generation + const check = () => { + if (this.stopped || generation !== this.generation) + throw new Error('OpenAI Codex credential operation interrupted') + } + check() + return check } - getStorageState(): OpenAICodexCredentialStorage { + async getStorageState(): Promise { + const check = this.captureOperation() try { - return safeStorage.isEncryptionAvailable() ? 'safeStorage' : 'file' + const available = await this.crypto.isAvailable() + check() + return available ? 'safeStorage' : 'file' } catch (error) { + check() console.warn( '[OpenAICodexCredentialStore] Encryption availability check failed, using file storage:', error @@ -66,8 +97,28 @@ export class OpenAICodexCredentialStore { return this.lastLoadError } - load(): OpenAICodexTokenSet | null { - const result = this.readEnvelope() + async load(): Promise { + const check = this.captureOperation() + const revision = this.revision + await this.operations + check() + const assertReadCurrent = () => { + check() + if (revision !== this.revision) throw new Error('OpenAI Codex credential read superseded') + } + assertReadCurrent() + let loading = this.loading + if (!loading || loading.revision !== revision) { + loading = { revision, promise: this.readEnvelope(assertReadCurrent) } + this.loading = loading + void loading.promise + .finally(() => { + if (this.loading === loading) this.loading = null + }) + .catch(() => undefined) + } + const result = await loading.promise + assertReadCurrent() if (result.state === 'corrupt' || result.state === 'undecryptable') { this.lastLoadError = result.reason console.warn( @@ -75,98 +126,128 @@ export class OpenAICodexCredentialStore { ) return null } - this.lastLoadError = null return result.state === 'ok' ? result.tokens : null } - save(tokens: OpenAICodexTokenSet): void { - fs.mkdirSync(path.dirname(this.filePath), { recursive: true, mode: 0o700 }) - const normalized = this.normalizeTokens(tokens) - if (!normalized) { - throw new Error('Invalid OpenAI Codex token payload') - } - - const now = Date.now() - const envelope: StoredCredentialEnvelope = - this.getStorageState() === 'safeStorage' - ? { - version: 1, - storage: 'safeStorage', - wrapped: safeStorage.encryptString(JSON.stringify(normalized)).toString('base64'), - updatedAt: now - } - : { - version: 1, - storage: 'file', - tokens: normalized, - updatedAt: now - } - - if (this.readEnvelope().state === 'corrupt') { - try { - fs.copyFileSync(this.filePath, `${this.filePath}.corrupt`) - } catch (error) { - console.warn( - '[OpenAICodexCredentialStore] Failed to back up corrupted credential file:', - error - ) + save(tokens: OpenAICodexTokenSet): Promise { + return this.write(async (check) => { + const normalized = this.normalizeTokens(tokens) + if (!normalized) throw new Error('Invalid OpenAI Codex token payload') + const payload = JSON.stringify(normalized) + if (Buffer.byteLength(payload, 'utf8') > MAX_CREDENTIAL_PAYLOAD_BYTES) + throw new Error('OpenAI Codex token payload is oversized') + const storage = await this.getStorageState() + check() + const now = Date.now() + const envelope: StoredCredentialEnvelope = + storage === 'safeStorage' + ? { version: 1, storage, wrapped: await this.crypto.encrypt(payload), updatedAt: now } + : { version: 1, storage: 'file', tokens: normalized, updatedAt: now } + check() + if ( + envelope.storage === 'safeStorage' && + (typeof envelope.wrapped !== 'string' || !envelope.wrapped) + ) + throw new Error('Credential encryption returned an invalid envelope') + const serialized = JSON.stringify(envelope, null, 2) + if (Buffer.byteLength(serialized, 'utf8') > MAX_CREDENTIAL_FILE_BYTES) + throw new Error('OpenAI Codex credential envelope is oversized') + const previous = await this.readEnvelope(check) + check() + fs.mkdirSync(path.dirname(this.filePath), { recursive: true, mode: 0o700 }) + if (previous.state === 'corrupt') { + try { + fs.copyFileSync(this.filePath, `${this.filePath}.corrupt`) + } catch (error) { + console.warn( + '[OpenAICodexCredentialStore] Failed to back up corrupted credential file:', + error + ) + } } - } - - const temporaryPath = `${this.filePath}.tmp-${process.pid}-${randomBytes(6).toString('hex')}` - try { - const fd = fs.openSync(temporaryPath, 'w', 0o600) + const temporaryPath = `${this.filePath}.tmp-${process.pid}-${randomBytes(6).toString('hex')}` try { - fs.writeFileSync(fd, JSON.stringify(envelope, null, 2), 'utf-8') - fs.fsyncSync(fd) + const fd = fs.openSync(temporaryPath, 'w', 0o600) + try { + fs.writeFileSync(fd, serialized, 'utf-8') + fs.fsyncSync(fd) + } finally { + fs.closeSync(fd) + } + fs.renameSync(temporaryPath, this.filePath) } finally { - fs.closeSync(fd) - } - fs.renameSync(temporaryPath, this.filePath) - } finally { - try { - fs.rmSync(temporaryPath, { force: true }) - } catch (error) { - console.warn( - '[OpenAICodexCredentialStore] Failed to remove temporary credential file:', - error - ) + try { + fs.rmSync(temporaryPath, { force: true }) + } catch (error) { + console.warn( + '[OpenAICodexCredentialStore] Failed to remove temporary credential file:', + error + ) + } } - } - this.lastLoadError = null + this.lastLoadError = null + }) } - clear(): void { - const directory = path.dirname(this.filePath) - const artifacts = [this.filePath, `${this.filePath}.corrupt`, `${this.filePath}.tmp`] - try { - const prefix = `${path.basename(this.filePath)}.tmp-` - for (const entry of fs.readdirSync(directory)) { - if (entry.startsWith(prefix)) { - artifacts.push(path.join(directory, entry)) + clear(): Promise { + return this.write(async (check) => { + check() + const directory = path.dirname(this.filePath) + const artifacts = [this.filePath, `${this.filePath}.corrupt`, `${this.filePath}.tmp`] + const errors: unknown[] = [] + try { + const prefix = `${path.basename(this.filePath)}.tmp-` + for (const entry of fs.readdirSync(directory)) { + if (entry.startsWith(prefix)) artifacts.push(path.join(directory, entry)) } + } catch (error) { + if ((error as NodeJS.ErrnoException).code !== 'ENOENT') errors.push(error) } - } catch (error) { - if ((error as NodeJS.ErrnoException).code !== 'ENOENT') { - console.warn('[OpenAICodexCredentialStore] Failed to list credential directory:', error) + for (const artifact of artifacts) { + try { + fs.rmSync(artifact, { force: true }) + } catch (error) { + errors.push(error) + } } - } + if (errors.length) throw new AggregateError(errors, 'OpenAI Codex credential cleanup failed') + this.lastLoadError = null + }, true) + } - for (const artifact of artifacts) { - try { - fs.rmSync(artifact, { force: true }) - } catch (error) { - console.warn('[OpenAICodexCredentialStore] Failed to remove', artifact, error) - } - } - this.lastLoadError = null + private async write( + operation: (check: () => void) => Promise, + control = false + ): Promise { + const check = this.captureOperation() + if (this.pending >= 32 || (!control && this.pendingNormal >= 24)) + throw new Error('OpenAI Codex credential mutation queue is full') + this.pending++ + if (!control) this.pendingNormal++ + this.revision++ + const result = this.operations.then(async () => { + check() + await operation(check) + check() + }) + this.operations = result.catch(() => undefined) + return result.finally(() => { + this.pending-- + if (!control) this.pendingNormal-- + check() + }) } - private readEnvelope(): EnvelopeReadResult { + private async readEnvelope(check: () => void): Promise { let raw: string try { + check() + if (fs.statSync(this.filePath).size > MAX_CREDENTIAL_FILE_BYTES) + return { state: 'corrupt', reason: 'credential file is oversized' } raw = fs.readFileSync(this.filePath, 'utf-8') + if (Buffer.byteLength(raw, 'utf8') > MAX_CREDENTIAL_FILE_BYTES) + return { state: 'corrupt', reason: 'credential file is oversized' } } catch (error) { if ((error as NodeJS.ErrnoException).code === 'ENOENT') { return { state: 'missing' } @@ -187,6 +268,11 @@ export class OpenAICodexCredentialStore { if (envelope.storage === 'file') { const tokens = this.normalizeTokens(envelope.tokens) + if ( + tokens && + Buffer.byteLength(JSON.stringify(tokens), 'utf8') > MAX_CREDENTIAL_PAYLOAD_BYTES + ) + return { state: 'corrupt', reason: 'credential payload is oversized' } return tokens ? { state: 'ok', tokens } : { state: 'corrupt', reason: 'credential file holds an invalid token payload' } @@ -194,8 +280,14 @@ export class OpenAICodexCredentialStore { let decrypted: string try { - decrypted = safeStorage.decryptString(Buffer.from(envelope.wrapped, 'base64')) + if (typeof envelope.wrapped !== 'string' || !envelope.wrapped) + return { state: 'corrupt', reason: 'credential envelope is invalid' } + decrypted = await this.crypto.decrypt(envelope.wrapped) + check() + if (Buffer.byteLength(decrypted, 'utf8') > MAX_CREDENTIAL_PAYLOAD_BYTES) + return { state: 'corrupt', reason: 'credential payload is oversized' } } catch (error) { + check() return { state: 'undecryptable', reason: `credential decryption failed: ${toErrorMessage(error)}` diff --git a/src/main/provider/auth/openaiCodex/index.ts b/src/main/provider/auth/openaiCodex/index.ts index c14ba4973b..8c328f2715 100644 --- a/src/main/provider/auth/openaiCodex/index.ts +++ b/src/main/provider/auth/openaiCodex/index.ts @@ -1,5 +1,5 @@ import logger from '@shared/logger' -import { shell } from 'electron' +import { readAuthResponse } from '../responseBody' import { URL } from 'url' import type { DeepchatEventPublisher } from '@shared/contracts/events' import { @@ -33,6 +33,7 @@ export type OpenAICodexBackendAuth = { } type PendingBrowserFlow = { + generation: number state: string codeVerifier: string redirectUri: string @@ -148,62 +149,136 @@ export class OpenAICodexAuth { private pendingBrowserFlow: PendingBrowserFlow | null = null private refreshPromise: Promise | null = null private lastError: string | null = null + private generation = 0 + private stopped = false + private loginPending = false + private publication = 0 + private readonly requests = new Set() constructor( - store = new OpenAICodexCredentialStore(), - private readonly publishEvent: DeepchatEventPublisher + store: OpenAICodexCredentialStore, + private readonly publishEvent: DeepchatEventPublisher, + private readonly openExternal: (url: string) => Promise ) { this.store = store } - getStatus(): OpenAICodexAuthStatus { - if (isOpenAICodexDisabled()) { - return this.withStorage({ - state: 'disabled', - authenticated: false - }) - } + private assertGeneration(generation: number): void { + if (this.stopped || generation !== this.generation) + throw new DOMException('OpenAI Codex authentication operation interrupted', 'AbortError') + } - if (this.pendingBrowserFlow && !this.pendingBrowserFlow.cancelled) { - return this.withStorage({ - state: 'pending-browser', - authenticated: false, - ...(this.lastError ? { error: this.lastError } : {}) - }) + captureOperation(): () => void { + const generation = this.generation + this.assertGeneration(generation) + return () => this.assertGeneration(generation) + } + + private invalidate(): void { + this.generation++ + this.refreshPromise = null + for (const request of this.requests) request.abort() + } + + stop(): void { + this.stopped = true + this.invalidate() + this.cancelPendingFlow() + this.store.stop() + } + + private cancelPendingFlow(): void { + this.loginPending = false + if (this.pendingBrowserFlow) { + this.pendingBrowserFlow.cancelled = true + this.pendingBrowserFlow.callbackSession.close() + this.pendingBrowserFlow = null } + } - const tokens = this.store.load() - if (tokens) { - return this.statusFromTokens(tokens) + async getStatus(): Promise { + for (let attempt = 0; attempt < 2; attempt++) { + const generation = this.generation + const check = this.captureOperation() + try { + const storage = await this.store.getStorageState() + check() + let status: Omit + if (isOpenAICodexDisabled()) status = { state: 'disabled', authenticated: false } + else if (this.pendingBrowserFlow && !this.pendingBrowserFlow.cancelled) + status = { + state: 'pending-browser', + authenticated: false, + ...(this.lastError ? { error: this.lastError } : {}) + } + else { + const tokens = await this.store.load() + check() + if (tokens) + status = { + state: 'authenticated', + authenticated: true, + accountId: maskAccountId(tokens.accountId), + accountLabel: tokens.accountLabel, + planType: tokens.planType, + expiresAt: tokens.expiresAt + } + else { + const error = this.store.getLoadError() ?? this.lastError + status = { + state: error ? 'error' : 'signed-out', + authenticated: false, + ...(error ? { error } : {}) + } + } + } + check() + return { ...status, storage } + } catch (error) { + if (attempt === 0 && !this.stopped && generation !== this.generation) continue + throw error + } } + throw new DOMException('Provider auth status changed during read', 'AbortError') + } - const statusError = this.store.getLoadError() ?? this.lastError - return this.withStorage({ - state: statusError ? 'error' : 'signed-out', - authenticated: false, - ...(statusError ? { error: statusError } : {}) - }) + async cancelLogin(): Promise { + if (this.loginPending) { + this.invalidate() + this.cancelPendingFlow() + } + const check = this.captureOperation() + try { + await this.publishStatusChanged(check) + return await this.getStatus() + } finally { + check() + } } async startBrowserLogin(): Promise { this.assertEnabled() - this.cancelLogin() + this.invalidate() + this.cancelPendingFlow() + this.loginPending = true this.lastError = null - - const state = createOpenAICodexState() - const pkce = createOpenAICodexPkcePair() + const initialGeneration = this.generation + let flow: PendingBrowserFlow | null = null + const check = () => this.assertGeneration(flow?.generation ?? initialGeneration) let callbackSession: OAuthLoopbackCallbackSession | null = null - try { - const configuredRedirect = new URL(OPENAI_CODEX_REDIRECT_URI) + const state = createOpenAICodexState() + const pkce = createOpenAICodexPkcePair() + const redirect = new URL(OPENAI_CODEX_REDIRECT_URI) callbackSession = await startOAuthLoopbackCallbackSession({ expectedState: state, - path: configuredRedirect.pathname || OPENAI_CODEX_REDIRECT_PATH, - preferredPort: Number(configuredRedirect.port) || OPENAI_CODEX_REDIRECT_PORT, - redirectHost: configuredRedirect.hostname || 'localhost', + path: redirect.pathname || OPENAI_CODEX_REDIRECT_PATH, + preferredPort: Number(redirect.port) || OPENAI_CODEX_REDIRECT_PORT, + redirectHost: redirect.hostname || 'localhost', timeoutMs: OPENAI_CODEX_BROWSER_TIMEOUT_MS, invalidCallbackMessage: 'Invalid OpenAI Codex OAuth callback' }) + check() const authUrl = new URL(OPENAI_CODEX_AUTHORIZE_URL) authUrl.searchParams.set('client_id', OPENAI_CODEX_CLIENT_ID) authUrl.searchParams.set('response_type', 'code') @@ -214,8 +289,8 @@ export class OpenAICodexAuth { authUrl.searchParams.set('code_challenge_method', 'S256') authUrl.searchParams.set('codex_cli_simplified_flow', 'true') authUrl.searchParams.set('id_token_add_organizations', 'true') - - const flow: PendingBrowserFlow = { + flow = { + generation: this.generation, state, codeVerifier: pkce.codeVerifier, redirectUri: callbackSession.redirectUri, @@ -224,238 +299,263 @@ export class OpenAICodexAuth { } this.pendingBrowserFlow = flow flow.flowPromise = this.completeBrowserLogin(flow, callbackSession.waitForCallback()) - await shell.openExternal(authUrl.toString()) - this.publishStatusChanged() - return this.getStatus() + await this.openExternal(authUrl.toString()) + check() + await this.publishStatusChanged(check) + return await this.getStatus() } catch (error) { - this.lastError = sanitizeError(error) - this.pendingBrowserFlow = null callbackSession?.close() - this.publishStatusChanged() - return this.getStatus() + check() + if (this.pendingBrowserFlow === flow) this.cancelPendingFlow() + this.loginPending = false + this.lastError = sanitizeError(error) + await this.publishStatusChanged(check) + return await this.getStatus() + } finally { + check() } } async completeBrowserLoginFromCallbackUrl(callbackUrl: string): Promise { this.assertEnabled() const flow = this.pendingBrowserFlow - if (!flow || flow.cancelled) { - this.lastError = 'OpenAI Codex browser login is not pending' - this.publishStatusChanged() - return this.getStatus() - } - - const resolution = flow.callbackSession.resolveCallbackUrl(callbackUrl) - if (resolution.kind === 'not-found') { - this.lastError = 'OpenAI Codex callback URL is invalid' - this.publishStatusChanged() - return this.getStatus() - } - - await flow.flowPromise - return this.getStatus() - } - - cancelLogin(): OpenAICodexAuthStatus { - if (this.pendingBrowserFlow) { - this.pendingBrowserFlow.cancelled = true - this.pendingBrowserFlow.callbackSession.close() - this.pendingBrowserFlow = null + const initialGeneration = this.generation + const check = () => this.assertGeneration(flow?.generation ?? initialGeneration) + try { + check() + if (!flow || flow.cancelled) { + this.lastError = 'OpenAI Codex browser login is not pending' + await this.publishStatusChanged(check) + return await this.getStatus() + } + const resolution = flow.callbackSession.resolveCallbackUrl(callbackUrl) + if (resolution.kind === 'not-found') { + this.lastError = 'OpenAI Codex callback URL is invalid' + await this.publishStatusChanged(check) + return await this.getStatus() + } + await flow.flowPromise + check() + return await this.getStatus() + } finally { + check() } - this.publishStatusChanged() - return this.getStatus() } async logout(): Promise { - const tokens = this.store.load() - this.cancelLogin() - this.store.clear() - this.lastError = null - - const tokenToRevoke = tokens?.refreshToken || tokens?.accessToken - if (tokenToRevoke) { - try { - await this.postForm(OPENAI_CODEX_REVOKE_URL, { - token: tokenToRevoke, - client_id: OPENAI_CODEX_CLIENT_ID - }) - } catch (error) { - logger.warn('[OpenAI Codex] Token revoke failed:', sanitizeError(error)) + this.invalidate() + this.cancelPendingFlow() + const check = this.captureOperation() + try { + const tokens = await this.store.load() + check() + await this.store.clear() + check() + this.lastError = null + const token = tokens?.refreshToken || tokens?.accessToken + if (token) { + try { + await this.postForm( + OPENAI_CODEX_REVOKE_URL, + { token, client_id: OPENAI_CODEX_CLIENT_ID }, + check + ) + } catch (error) { + check() + logger.warn('[OpenAI Codex] Token revoke failed:', sanitizeError(error)) + } } + check() + await this.publishStatusChanged(check) + return await this.getStatus() + } finally { + check() } - - this.publishStatusChanged() - return this.getStatus() } async getAccessToken(): Promise { - const auth = await this.getBackendAuth() - return auth.accessToken + const check = this.captureOperation() + try { + return (await this.getBackendAuth()).accessToken + } finally { + check() + } } async forceRefreshAccessToken(): Promise { - const auth = await this.forceRefreshBackendAuth() - return auth.accessToken + const check = this.captureOperation() + try { + return (await this.forceRefreshBackendAuth()).accessToken + } finally { + check() + } } async getBackendAuth(): Promise { - this.assertEnabled() - - if (OPENAI_CODEX_ACCESS_TOKEN_ENV) { - return { accessToken: OPENAI_CODEX_ACCESS_TOKEN_ENV } - } - - const tokens = this.store.load() - if (!tokens) { - const loadError = this.store.getLoadError() - if (loadError) throw new Error(loadError) - throw new ProviderHttpError('OpenAI Codex sign-in is required', { - statusCode: 401, - code: 'openai_codex_sign_in_required', - retryable: false - }) - } - - const current = - tokens.expiresAt > Date.now() + OPENAI_CODEX_TOKEN_REFRESH_SKEW_MS - ? tokens - : await this.refreshAccessToken(tokens) - return { - accessToken: current.accessToken, - accountId: current.accountId + const check = this.captureOperation() + try { + this.assertEnabled() + if (OPENAI_CODEX_ACCESS_TOKEN_ENV) return { accessToken: OPENAI_CODEX_ACCESS_TOKEN_ENV } + const tokens = await this.store.load() + check() + if (!tokens) { + const error = this.store.getLoadError() + if (error) throw new Error(error) + throw new ProviderHttpError('OpenAI Codex sign-in is required', { + statusCode: 401, + code: 'openai_codex_sign_in_required', + retryable: false + }) + } + const current = + tokens.expiresAt > Date.now() + OPENAI_CODEX_TOKEN_REFRESH_SKEW_MS + ? tokens + : await this.refreshAccessToken(tokens, check) + check() + return { accessToken: current.accessToken, accountId: current.accountId } + } finally { + check() } } async forceRefreshBackendAuth(): Promise { - this.assertEnabled() - const tokens = this.store.load() - if (!tokens?.refreshToken) { - const loadError = this.store.getLoadError() - if (loadError) throw new Error(loadError) - throw new ProviderHttpError('OpenAI Codex refresh token is unavailable', { - statusCode: 401, - code: 'openai_codex_sign_in_required', - retryable: false - }) - } - - const refreshed = await this.refreshAccessToken(tokens, true) - return { - accessToken: refreshed.accessToken, - accountId: refreshed.accountId - } - } - - private withStorage(status: Omit): OpenAICodexAuthStatus { - return { - ...status, - storage: this.store.getStorageState() + const check = this.captureOperation() + try { + this.assertEnabled() + const tokens = await this.store.load() + check() + if (!tokens?.refreshToken) { + const error = this.store.getLoadError() + if (error) throw new Error(error) + throw new ProviderHttpError('OpenAI Codex refresh token is unavailable', { + statusCode: 401, + code: 'openai_codex_sign_in_required', + retryable: false + }) + } + const refreshed = await this.refreshAccessToken(tokens, check, true) + check() + return { accessToken: refreshed.accessToken, accountId: refreshed.accountId } + } finally { + check() } } - private statusFromTokens(tokens: OpenAICodexTokenSet): OpenAICodexAuthStatus { - return this.withStorage({ - state: 'authenticated', - authenticated: true, - accountId: maskAccountId(tokens.accountId), - accountLabel: tokens.accountLabel, - planType: tokens.planType, - expiresAt: tokens.expiresAt - }) - } - private assertEnabled(): void { - if (isOpenAICodexDisabled()) { - throw new Error('OpenAI Codex provider is disabled by environment') - } + if (isOpenAICodexDisabled()) throw new Error('OpenAI Codex provider is disabled by environment') } private async completeBrowserLogin( flow: PendingBrowserFlow, - callbackPromise: Promise<{ code: string }> + callback: Promise<{ code: string }> ): Promise { + const check = () => this.assertGeneration(flow.generation) try { - const { code } = await callbackPromise - if (flow.cancelled || this.pendingBrowserFlow !== flow) { - return - } - - const tokens = await this.exchangeAuthorizationCode(code, flow.codeVerifier, flow.redirectUri) - if (flow.cancelled || this.pendingBrowserFlow !== flow) { - return - } - - this.store.save(tokens) + const { code } = await callback + if (flow.cancelled || this.pendingBrowserFlow !== flow) return + check() + const tokens = await this.exchangeAuthorizationCode( + code, + flow.codeVerifier, + flow.redirectUri, + check + ) + check() + if (this.pendingBrowserFlow !== flow) return + this.invalidate() + flow.generation = this.generation + await this.store.save(tokens) + check() this.lastError = null this.pendingBrowserFlow = null + this.loginPending = false flow.callbackSession.close() - this.publishStatusChanged() + await this.publishStatusChanged(check) } catch (error) { - if (flow.cancelled || this.pendingBrowserFlow !== flow) { + if ( + this.stopped || + flow.cancelled || + this.pendingBrowserFlow !== flow || + flow.generation !== this.generation + ) return - } - this.lastError = sanitizeError(error) this.pendingBrowserFlow = null + this.loginPending = false flow.callbackSession.close() - this.publishStatusChanged() + try { + await this.publishStatusChanged(check) + } catch (publishError) { + if (!this.stopped && flow.generation === this.generation) + logger.warn('[OpenAI Codex] Failed to publish auth status:', sanitizeError(publishError)) + } } } private async exchangeAuthorizationCode( code: string, - codeVerifier: string, - redirectUri: string + verifier: string, + redirectUri: string, + check: () => void ): Promise { - const payload = await this.postForm(OPENAI_CODEX_TOKEN_URL, { - grant_type: 'authorization_code', - client_id: OPENAI_CODEX_CLIENT_ID, - code, - redirect_uri: redirectUri, - code_verifier: codeVerifier - }) - + check() + const payload = await this.postForm( + OPENAI_CODEX_TOKEN_URL, + { + grant_type: 'authorization_code', + client_id: OPENAI_CODEX_CLIENT_ID, + code, + redirect_uri: redirectUri, + code_verifier: verifier + }, + check + ) + check() return this.parseTokenResponse(payload) } private async refreshAccessToken( - currentTokens: OpenAICodexTokenSet, + tokens: OpenAICodexTokenSet, + check: () => void, force = false ): Promise { - if (!force && currentTokens.expiresAt > Date.now() + OPENAI_CODEX_TOKEN_REFRESH_SKEW_MS) { - return currentTokens - } - - if (this.refreshPromise) { - return this.refreshPromise - } - - this.refreshPromise = this.refreshAccessTokenOnce(currentTokens).finally(() => { - this.refreshPromise = null + check() + if (!force && tokens.expiresAt > Date.now() + OPENAI_CODEX_TOKEN_REFRESH_SKEW_MS) return tokens + if (this.refreshPromise) return this.refreshPromise + const pending = this.refreshAccessTokenOnce(tokens, check).finally(() => { + if (this.refreshPromise === pending) this.refreshPromise = null }) - return this.refreshPromise + this.refreshPromise = pending + return pending } private async refreshAccessTokenOnce( - currentTokens: OpenAICodexTokenSet + tokens: OpenAICodexTokenSet, + check: () => void ): Promise { - if (!currentTokens.refreshToken) { + check() + if (!tokens.refreshToken) throw new ProviderHttpError('OpenAI Codex refresh token is unavailable', { statusCode: 401, code: 'openai_codex_sign_in_required', retryable: false }) - } - - const payload = await this.postForm(OPENAI_CODEX_TOKEN_URL, { - grant_type: 'refresh_token', - client_id: OPENAI_CODEX_CLIENT_ID, - refresh_token: currentTokens.refreshToken - }) - const refreshed = this.parseTokenResponse(payload, currentTokens) - this.store.save(refreshed) + const payload = await this.postForm( + OPENAI_CODEX_TOKEN_URL, + { + grant_type: 'refresh_token', + client_id: OPENAI_CODEX_CLIENT_ID, + refresh_token: tokens.refreshToken + }, + check + ) + check() + const refreshed = this.parseTokenResponse(payload, tokens) + await this.store.save(refreshed) + check() this.lastError = null - this.publishStatusChanged() + await this.publishStatusChanged(check) + check() return refreshed } @@ -496,26 +596,21 @@ export class OpenAICodexAuth { private async postForm( url: string, - params: Record + params: Record, + check: () => void ): Promise { + check() const body = new URLSearchParams() - Object.entries(params).forEach(([key, value]) => { - if (value) { - body.set(key, value) - } - }) - + for (const [key, value] of Object.entries(params)) if (value) body.set(key, value) const response = await this.fetchWithTimeout(url, { method: 'POST', - headers: { - Accept: 'application/json', - 'Content-Type': 'application/x-www-form-urlencoded' - }, + headers: { Accept: 'application/json', 'Content-Type': 'application/x-www-form-urlencoded' }, body }) - + check() if (!response.ok) { const errorBody = await readErrorBody(response) + check() let requiresSignIn = false if (params.grant_type === 'refresh_token') { try { @@ -532,43 +627,64 @@ export class OpenAICodexAuth { } ) } - - return (await response.json()) as TokenResponse + const payload = (await response.json()) as TokenResponse + check() + return payload } - private async fetchWithTimeout(url: string, init: RequestInit): Promise { + private async fetchWithTimeout( + url: string, + init: RequestInit, + externalSignal?: AbortSignal + ): Promise { + const check = this.captureOperation() + if (this.requests.size >= 32) throw new Error('OpenAI Codex auth request limit exceeded') const controller = new AbortController() - const timeout = setTimeout(() => controller.abort(), OPENAI_CODEX_AUTH_REQUEST_TIMEOUT_MS) + this.requests.add(controller) + const timer = setTimeout(() => controller.abort(), OPENAI_CODEX_AUTH_REQUEST_TIMEOUT_MS) + const abort = () => controller.abort(externalSignal?.reason) + if (externalSignal?.aborted) abort() + else externalSignal?.addEventListener('abort', abort, { once: true }) try { - return await fetch(url, { - ...init, - signal: controller.signal - }) + controller.signal.throwIfAborted() + const response = await fetch(url, { ...init, signal: controller.signal }) + check() + const result = await readAuthResponse(response, controller.signal) + check() + return result } catch (error) { + check() if (controller.signal.aborted) { + if (externalSignal?.aborted) + throw new DOMException('OpenAI Codex OAuth login cancelled', 'AbortError') throw new Error( `OpenAI Codex auth request timed out after ${OPENAI_CODEX_AUTH_REQUEST_TIMEOUT_MS}ms` ) } throw error } finally { - clearTimeout(timeout) + clearTimeout(timer) + externalSignal?.removeEventListener('abort', abort) + this.requests.delete(controller) } } - private publishStatusChanged(): void { - this.publishEvent('oauth.openaiCodex.statusChanged', { - status: this.getStatus(), - version: Date.now() - }) + private async publishStatusChanged(check: () => void): Promise { + check() + const publication = ++this.publication + const status = await this.getStatus() + check() + if (publication !== this.publication) return + this.publishEvent('oauth.openaiCodex.statusChanged', { status, version: Date.now() }) } } - export function initializeGlobalOpenAICodexAuth( - publishEvent: DeepchatEventPublisher + publishEvent: DeepchatEventPublisher, + store: OpenAICodexCredentialStore, + openExternal: (url: string) => Promise ): OpenAICodexAuth { if (!globalOpenAICodexAuth) { - globalOpenAICodexAuth = new OpenAICodexAuth(undefined, publishEvent) + globalOpenAICodexAuth = new OpenAICodexAuth(store, publishEvent, openExternal) } return globalOpenAICodexAuth } diff --git a/src/main/provider/auth/responseBody.ts b/src/main/provider/auth/responseBody.ts new file mode 100644 index 0000000000..270257580d --- /dev/null +++ b/src/main/provider/auth/responseBody.ts @@ -0,0 +1,39 @@ +const MAX_AUTH_RESPONSE_BYTES = 8 * 1024 * 1024 + +export async function readAuthResponse(response: Response, signal: AbortSignal): Promise { + signal.throwIfAborted() + if (Number(response.headers.get('content-length')) > MAX_AUTH_RESPONSE_BYTES) { + await response.body?.cancel() + throw new Error('Provider auth response exceeds the size limit') + } + if (!response.body) return response + const reader = response.body.getReader() + const abort = () => { + void reader.cancel(signal.reason).catch(() => undefined) + } + signal.addEventListener('abort', abort, { once: true }) + const chunks: Uint8Array[] = [] + let size = 0 + try { + while (true) { + signal.throwIfAborted() + const { done, value } = await reader.read() + signal.throwIfAborted() + if (done) break + size += value.byteLength + if (size > MAX_AUTH_RESPONSE_BYTES) { + await reader.cancel() + throw new Error('Provider auth response exceeds the size limit') + } + chunks.push(value) + } + return new Response(Buffer.concat(chunks), { + status: response.status, + statusText: response.statusText, + headers: response.headers + }) + } finally { + signal.removeEventListener('abort', abort) + reader.releaseLock() + } +} diff --git a/src/main/provider/auth/xaiGrok/credentialStore.ts b/src/main/provider/auth/xaiGrok/credentialStore.ts index f7676e2ecd..70226b1f77 100644 --- a/src/main/provider/auth/xaiGrok/credentialStore.ts +++ b/src/main/provider/auth/xaiGrok/credentialStore.ts @@ -1,7 +1,7 @@ import * as fs from 'fs' import * as path from 'path' import { randomBytes } from 'node:crypto' -import { app, safeStorage } from 'electron' +import type { CredentialCryptoPort } from '@/config/secretStore' export type XaiGrokCredentialStorage = 'safeStorage' | 'file' | 'none' @@ -42,19 +42,50 @@ function toErrorMessage(error: unknown): string { return error instanceof Error ? error.message : String(error) } +const MAX_CREDENTIAL_FILE_BYTES = 16 * 1024 * 1024 +const MAX_CREDENTIAL_PAYLOAD_BYTES = 8 * 1024 * 1024 + export class XaiGrokCredentialStore { private readonly filePath: string + private readonly crypto: CredentialCryptoPort private lastLoadError: string | null = null + private stopped = false + private generation = 0 + private revision = 0 + private operations: Promise = Promise.resolve() + private pending = 0 + private pendingNormal = 0 + private loading: { revision: number; promise: Promise } | null = null + + constructor(options: { filePath: string; crypto: CredentialCryptoPort }) { + this.filePath = options.filePath + this.crypto = options.crypto + } + + stop(): void { + this.stopped = true + this.generation++ + this.loading = null + } - constructor(filePath?: string) { - this.filePath = - filePath || path.join(app.getPath('userData'), 'xai-grok-auth', 'credentials.json') + private captureOperation(): () => void { + const generation = this.generation + const check = () => { + if (this.stopped || generation !== this.generation) + throw new Error('xAI Grok credential operation interrupted') + } + check() + return check } - getStorageState(): XaiGrokCredentialStorage { + async getStorageState(): Promise { + const check = this.captureOperation() try { - return safeStorage.isEncryptionAvailable() ? 'safeStorage' : 'file' + const available = await this.crypto.isAvailable() + check() + return available ? 'safeStorage' : 'file' } catch (error) { + check() console.warn( '[XaiGrokCredentialStore] Encryption availability check failed, using file storage:', error @@ -67,99 +98,155 @@ export class XaiGrokCredentialStore { return this.lastLoadError } - load(): XaiGrokTokenSet | null { - const result = this.readEnvelope() + async load(): Promise { + const check = this.captureOperation() + const revision = this.revision + await this.operations + check() + const assertReadCurrent = () => { + check() + if (revision !== this.revision) throw new Error('xAI Grok credential read superseded') + } + assertReadCurrent() + let loading = this.loading + if (!loading || loading.revision !== revision) { + loading = { revision, promise: this.readEnvelope(assertReadCurrent) } + this.loading = loading + void loading.promise + .finally(() => { + if (this.loading === loading) this.loading = null + }) + .catch(() => undefined) + } + const result = await loading.promise + assertReadCurrent() if (result.state === 'corrupt' || result.state === 'undecryptable') { this.lastLoadError = result.reason console.warn(`[XaiGrokCredentialStore] Ignoring unreadable credential file: ${result.reason}`) return null } - this.lastLoadError = null return result.state === 'ok' ? result.tokens : null } - save(tokens: XaiGrokTokenSet): void { - fs.mkdirSync(path.dirname(this.filePath), { recursive: true, mode: 0o700 }) - const normalized = this.normalizeTokens(tokens) - if (!normalized) { - throw new Error('Invalid xAI Grok token payload') - } - - const now = Date.now() - const envelope: StoredCredentialEnvelope = - this.getStorageState() === 'safeStorage' - ? { - version: 1, - storage: 'safeStorage', - wrapped: safeStorage.encryptString(JSON.stringify(normalized)).toString('base64'), - updatedAt: now - } - : { - version: 1, - storage: 'file', - tokens: normalized, - updatedAt: now - } - - if (this.readEnvelope().state === 'corrupt') { - try { - fs.copyFileSync(this.filePath, `${this.filePath}.corrupt`) - } catch (error) { - console.warn('[XaiGrokCredentialStore] Failed to back up corrupted credential file:', error) + save(tokens: XaiGrokTokenSet): Promise { + return this.write(async (check) => { + const normalized = this.normalizeTokens(tokens) + if (!normalized) throw new Error('Invalid xAI Grok token payload') + const payload = JSON.stringify(normalized) + if (Buffer.byteLength(payload, 'utf8') > MAX_CREDENTIAL_PAYLOAD_BYTES) + throw new Error('xAI Grok token payload is oversized') + const storage = await this.getStorageState() + check() + const now = Date.now() + const envelope: StoredCredentialEnvelope = + storage === 'safeStorage' + ? { version: 1, storage, wrapped: await this.crypto.encrypt(payload), updatedAt: now } + : { version: 1, storage: 'file', tokens: normalized, updatedAt: now } + check() + if ( + envelope.storage === 'safeStorage' && + (typeof envelope.wrapped !== 'string' || !envelope.wrapped) + ) + throw new Error('Credential encryption returned an invalid envelope') + const serialized = JSON.stringify(envelope, null, 2) + if (Buffer.byteLength(serialized, 'utf8') > MAX_CREDENTIAL_FILE_BYTES) + throw new Error('xAI Grok credential envelope is oversized') + const previous = await this.readEnvelope(check) + check() + fs.mkdirSync(path.dirname(this.filePath), { recursive: true, mode: 0o700 }) + if (previous.state === 'corrupt') { + try { + fs.copyFileSync(this.filePath, `${this.filePath}.corrupt`) + } catch (error) { + console.warn( + '[XaiGrokCredentialStore] Failed to back up corrupted credential file:', + error + ) + } } - } - - const temporaryPath = `${this.filePath}.tmp-${process.pid}-${randomBytes(6).toString('hex')}` - try { - const fd = fs.openSync(temporaryPath, 'w', 0o600) + const temporaryPath = `${this.filePath}.tmp-${process.pid}-${randomBytes(6).toString('hex')}` try { - fs.writeFileSync(fd, JSON.stringify(envelope, null, 2), 'utf-8') - fs.fsyncSync(fd) + const fd = fs.openSync(temporaryPath, 'w', 0o600) + try { + fs.writeFileSync(fd, serialized, 'utf-8') + fs.fsyncSync(fd) + } finally { + fs.closeSync(fd) + } + fs.renameSync(temporaryPath, this.filePath) } finally { - fs.closeSync(fd) - } - fs.renameSync(temporaryPath, this.filePath) - } finally { - try { - fs.rmSync(temporaryPath, { force: true }) - } catch (error) { - console.warn('[XaiGrokCredentialStore] Failed to remove temporary credential file:', error) + try { + fs.rmSync(temporaryPath, { force: true }) + } catch (error) { + console.warn( + '[XaiGrokCredentialStore] Failed to remove temporary credential file:', + error + ) + } } - } - this.lastLoadError = null + this.lastLoadError = null + }) } - clear(): void { - const directory = path.dirname(this.filePath) - const artifacts = [this.filePath, `${this.filePath}.corrupt`, `${this.filePath}.tmp`] - try { - const prefix = `${path.basename(this.filePath)}.tmp-` - for (const entry of fs.readdirSync(directory)) { - if (entry.startsWith(prefix)) { - artifacts.push(path.join(directory, entry)) + clear(): Promise { + return this.write(async (check) => { + check() + const directory = path.dirname(this.filePath) + const artifacts = [this.filePath, `${this.filePath}.corrupt`, `${this.filePath}.tmp`] + const errors: unknown[] = [] + try { + const prefix = `${path.basename(this.filePath)}.tmp-` + for (const entry of fs.readdirSync(directory)) { + if (entry.startsWith(prefix)) artifacts.push(path.join(directory, entry)) } + } catch (error) { + if ((error as NodeJS.ErrnoException).code !== 'ENOENT') errors.push(error) } - } catch (error) { - if ((error as NodeJS.ErrnoException).code !== 'ENOENT') { - console.warn('[XaiGrokCredentialStore] Failed to list credential directory:', error) + for (const artifact of artifacts) { + try { + fs.rmSync(artifact, { force: true }) + } catch (error) { + errors.push(error) + } } - } + if (errors.length) throw new AggregateError(errors, 'xAI Grok credential cleanup failed') + this.lastLoadError = null + }, true) + } - for (const artifact of artifacts) { - try { - fs.rmSync(artifact, { force: true }) - } catch (error) { - console.warn('[XaiGrokCredentialStore] Failed to remove', artifact, error) - } - } - this.lastLoadError = null + private async write( + operation: (check: () => void) => Promise, + control = false + ): Promise { + const check = this.captureOperation() + if (this.pending >= 32 || (!control && this.pendingNormal >= 24)) + throw new Error('xAI Grok credential mutation queue is full') + this.pending++ + if (!control) this.pendingNormal++ + this.revision++ + const result = this.operations.then(async () => { + check() + await operation(check) + check() + }) + this.operations = result.catch(() => undefined) + return result.finally(() => { + this.pending-- + if (!control) this.pendingNormal-- + check() + }) } - private readEnvelope(): EnvelopeReadResult { + private async readEnvelope(check: () => void): Promise { let raw: string try { + check() + if (fs.statSync(this.filePath).size > MAX_CREDENTIAL_FILE_BYTES) + return { state: 'corrupt', reason: 'credential file is oversized' } raw = fs.readFileSync(this.filePath, 'utf-8') + if (Buffer.byteLength(raw, 'utf8') > MAX_CREDENTIAL_FILE_BYTES) + return { state: 'corrupt', reason: 'credential file is oversized' } } catch (error) { if ((error as NodeJS.ErrnoException).code === 'ENOENT') { return { state: 'missing' } @@ -180,6 +267,11 @@ export class XaiGrokCredentialStore { if (envelope.storage === 'file') { const tokens = this.normalizeTokens(envelope.tokens) + if ( + tokens && + Buffer.byteLength(JSON.stringify(tokens), 'utf8') > MAX_CREDENTIAL_PAYLOAD_BYTES + ) + return { state: 'corrupt', reason: 'credential payload is oversized' } return tokens ? { state: 'ok', tokens } : { state: 'corrupt', reason: 'credential file holds an invalid token payload' } @@ -187,8 +279,14 @@ export class XaiGrokCredentialStore { let decrypted: string try { - decrypted = safeStorage.decryptString(Buffer.from(envelope.wrapped, 'base64')) + if (typeof envelope.wrapped !== 'string' || !envelope.wrapped) + return { state: 'corrupt', reason: 'credential envelope is invalid' } + decrypted = await this.crypto.decrypt(envelope.wrapped) + check() + if (Buffer.byteLength(decrypted, 'utf8') > MAX_CREDENTIAL_PAYLOAD_BYTES) + return { state: 'corrupt', reason: 'credential payload is oversized' } } catch (error) { + check() return { state: 'undecryptable', reason: `credential decryption failed: ${toErrorMessage(error)}` diff --git a/src/main/provider/auth/xaiGrok/index.ts b/src/main/provider/auth/xaiGrok/index.ts index 6e1dda4fe9..e5e602f7ad 100644 --- a/src/main/provider/auth/xaiGrok/index.ts +++ b/src/main/provider/auth/xaiGrok/index.ts @@ -1,5 +1,5 @@ import logger from '@shared/logger' -import { shell } from 'electron' +import { readAuthResponse } from '../responseBody' import type { DeepchatEventPublisher } from '@shared/contracts/events' import type { XaiGrokAuthStatus } from '@shared/types/xai-grok' import { @@ -37,6 +37,7 @@ type DeviceCodeResponse = { } type PendingDeviceFlow = { + generation: number cancelled: boolean abortController: AbortController userCode: string @@ -136,220 +137,274 @@ export class XaiGrokAuth { private pendingDeviceFlow: PendingDeviceFlow | null = null private refreshPromise: Promise | null = null private lastError: string | null = null + private generation = 0 + private stopped = false + private loginPending = false + private publication = 0 + private readonly requests = new Set() private cachedDiscovery: DiscoveryEndpoints | null = null + private pendingLoginController: AbortController | null = null constructor( - store = new XaiGrokCredentialStore(), - private readonly publishEvent: DeepchatEventPublisher + store: XaiGrokCredentialStore, + private readonly publishEvent: DeepchatEventPublisher, + private readonly openExternal: (url: string) => Promise ) { this.store = store } - getStatus(): XaiGrokAuthStatus { - if (isXaiGrokOAuthDisabled()) { - return this.withStorage({ - state: 'disabled', - authenticated: false - }) - } - - if (this.pendingDeviceFlow && !this.pendingDeviceFlow.cancelled) { - return this.withStorage({ - state: 'pending-device', - authenticated: false, - userCode: this.pendingDeviceFlow.userCode, - verificationUri: this.pendingDeviceFlow.verificationUri, - verificationUriComplete: this.pendingDeviceFlow.verificationUriComplete, - ...(this.lastError ? { error: this.lastError } : {}) - }) - } + private assertGeneration(generation: number): void { + if (this.stopped || generation !== this.generation) + throw new DOMException('xAI Grok authentication operation interrupted', 'AbortError') + } - const tokens = this.store.load() - if (tokens) { - return this.statusFromTokens(tokens) - } + captureOperation(): () => void { + const generation = this.generation + this.assertGeneration(generation) + return () => this.assertGeneration(generation) + } - const statusError = this.store.getLoadError() ?? this.lastError - return this.withStorage({ - state: statusError ? 'error' : 'signed-out', - authenticated: false, - ...(statusError ? { error: statusError } : {}) - }) + private invalidate(): void { + this.generation++ + this.refreshPromise = null + for (const request of this.requests) request.abort() } - isAuthenticated(): boolean { - return this.getStatus().authenticated + stop(): void { + this.stopped = true + this.invalidate() + this.cancelPendingFlow() + this.store.stop() } - /** - * Returns a non-expired cached access token without network I/O. - * Prefer ensureAccessToken() when a network refresh is acceptable. - */ - peekAccessToken(): string | null { - if (XAI_GROK_ACCESS_TOKEN_ENV) { - return XAI_GROK_ACCESS_TOKEN_ENV + private cancelPendingFlow(): void { + this.loginPending = false + this.pendingLoginController?.abort() + this.pendingLoginController = null + if (this.pendingDeviceFlow) { + this.pendingDeviceFlow.cancelled = true + this.pendingDeviceFlow.abortController.abort() + this.pendingDeviceFlow = null } + } - const tokens = this.store.load() - if (!tokens) { - return null + async getStatus(): Promise { + for (let attempt = 0; attempt < 2; attempt++) { + const generation = this.generation + const check = this.captureOperation() + try { + const storage = await this.store.getStorageState() + check() + let status: Omit + if (isXaiGrokOAuthDisabled()) status = { state: 'disabled', authenticated: false } + else if (this.pendingDeviceFlow && !this.pendingDeviceFlow.cancelled) + status = { + state: 'pending-device', + authenticated: false, + userCode: this.pendingDeviceFlow.userCode, + verificationUri: this.pendingDeviceFlow.verificationUri, + verificationUriComplete: this.pendingDeviceFlow.verificationUriComplete, + ...(this.lastError ? { error: this.lastError } : {}) + } + else { + const tokens = await this.store.load() + check() + if (tokens) + status = { + state: 'authenticated', + authenticated: true, + accountId: maskAccountId(tokens.accountId), + accountLabel: tokens.accountLabel, + + expiresAt: tokens.expiresAt + } + else { + const error = this.store.getLoadError() ?? this.lastError + status = { + state: error ? 'error' : 'signed-out', + authenticated: false, + ...(error ? { error } : {}) + } + } + } + check() + return { ...status, storage } + } catch (error) { + if (attempt === 0 && !this.stopped && generation !== this.generation) continue + throw error + } } + throw new DOMException('Provider auth status changed during read', 'AbortError') + } - if (tokens.expiresAt > Date.now() + XAI_GROK_TOKEN_REFRESH_SKEW_MS) { - return tokens.accessToken + async cancelLogin(): Promise { + if (this.loginPending) { + this.invalidate() + this.cancelPendingFlow() + } + const check = this.captureOperation() + try { + await this.publishStatusChanged(check) + return await this.getStatus() + } finally { + check() } + } - // Still return near-expiry tokens for sync header paths; ensureAccessToken - // will refresh on the next async entry point. Never return an expired token, - // so API-key fallback remains available if refresh fails. - return tokens.expiresAt > Date.now() ? tokens.accessToken : null + async isAuthenticated(): Promise { + const check = this.captureOperation() + try { + return (await this.getStatus()).authenticated + } finally { + check() + } } async startDeviceLogin(): Promise { this.assertEnabled() - this.cancelLogin() + this.invalidate() + this.cancelPendingFlow() + this.loginPending = true this.lastError = null - - const abortController = new AbortController() - + const initialGeneration = this.generation + const controller = new AbortController() + this.pendingLoginController = controller + let flow: PendingDeviceFlow | null = null + const check = () => this.assertGeneration(flow?.generation ?? initialGeneration) try { - const discovery = await this.fetchDiscovery(abortController.signal) + const discovery = await this.fetchDiscovery(check, controller.signal) + check() const deviceCode = await this.requestDeviceCode( discovery.deviceAuthorizationEndpoint, - abortController.signal + check, + controller.signal ) - - const flow: PendingDeviceFlow = { + check() + flow = { + generation: this.generation, cancelled: false, - abortController, + abortController: controller, userCode: deviceCode.userCode, verificationUri: deviceCode.verificationUri, verificationUriComplete: deviceCode.verificationUriComplete } this.pendingDeviceFlow = flow - - const browserUrl = deviceCode.verificationUriComplete || deviceCode.verificationUri try { - await shell.openExternal(browserUrl) + await this.openExternal(deviceCode.verificationUriComplete || deviceCode.verificationUri) } catch (error) { + check() logger.warn('[xAI Grok OAuth] Failed to open browser:', sanitizeError(error)) } - + check() flow.flowPromise = this.completeDeviceLogin(flow, discovery, deviceCode) - this.publishStatusChanged() - return this.getStatus() + await this.publishStatusChanged(check) + return await this.getStatus() } catch (error) { + controller.abort() + check() + if (this.pendingLoginController === controller) this.cancelPendingFlow() this.lastError = sanitizeError(error) - this.pendingDeviceFlow = null - this.publishStatusChanged() - return this.getStatus() - } - } - - cancelLogin(): XaiGrokAuthStatus { - if (this.pendingDeviceFlow) { - this.pendingDeviceFlow.cancelled = true - this.pendingDeviceFlow.abortController.abort() - this.pendingDeviceFlow = null + await this.publishStatusChanged(check) + return await this.getStatus() + } finally { + check() } - this.publishStatusChanged() - return this.getStatus() } async logout(): Promise { - const tokens = this.store.load() - this.cancelLogin() - this.store.clear() - this.lastError = null - - if (tokens?.refreshToken || tokens?.accessToken) { - try { - const discovery = await this.fetchDiscovery() - if (discovery.revocationEndpoint) { - await this.postForm( - discovery.revocationEndpoint, - { - token: tokens.refreshToken || tokens.accessToken, - client_id: XAI_GROK_OAUTH_CLIENT_ID - }, - false - ) + this.invalidate() + this.cancelPendingFlow() + const check = this.captureOperation() + try { + const tokens = await this.store.load() + check() + await this.store.clear() + check() + this.lastError = null + const token = tokens?.refreshToken || tokens?.accessToken + if (token) { + try { + const discovery = await this.fetchDiscovery(check) + check() + if (discovery.revocationEndpoint) + await this.postForm( + discovery.revocationEndpoint, + { + token, + client_id: XAI_GROK_OAUTH_CLIENT_ID + }, + check, + false + ) + } catch (error) { + check() + logger.warn('[xAI Grok OAuth] Token revoke failed:', sanitizeError(error)) } - } catch (error) { - logger.warn('[xAI Grok OAuth] Token revoke failed:', sanitizeError(error)) } + check() + await this.publishStatusChanged(check) + return await this.getStatus() + } finally { + check() } - - this.publishStatusChanged() - return this.getStatus() } async ensureAccessToken(): Promise { - if (isXaiGrokOAuthDisabled()) { - return null - } - - if (XAI_GROK_ACCESS_TOKEN_ENV) { - return XAI_GROK_ACCESS_TOKEN_ENV - } - - const tokens = this.store.load() - if (!tokens) { - return null - } - + const check = this.captureOperation() try { - const current = - tokens.expiresAt > Date.now() + XAI_GROK_TOKEN_REFRESH_SKEW_MS - ? tokens - : await this.refreshAccessToken(tokens) - return current.accessToken - } catch (error) { - this.lastError = sanitizeError(error) - this.publishStatusChanged() - throw error + if (isXaiGrokOAuthDisabled()) return null + if (XAI_GROK_ACCESS_TOKEN_ENV) return XAI_GROK_ACCESS_TOKEN_ENV + const tokens = await this.store.load() + check() + if (!tokens) return null + try { + const current = + tokens.expiresAt > Date.now() + XAI_GROK_TOKEN_REFRESH_SKEW_MS + ? tokens + : await this.refreshAccessToken(tokens, check) + check() + return current.accessToken + } catch (error) { + check() + this.lastError = sanitizeError(error) + await this.publishStatusChanged(check) + throw error + } + } finally { + check() } } async getAccessToken(): Promise { - const token = await this.ensureAccessToken() - if (!token) { - throw new Error(this.store.getLoadError() ?? 'xAI Grok OAuth sign-in is required') + const check = this.captureOperation() + try { + const token = await this.ensureAccessToken() + check() + if (!token) throw new Error(this.store.getLoadError() ?? 'xAI Grok OAuth sign-in is required') + return token + } finally { + check() } - return token } async forceRefreshAccessToken(): Promise { - this.assertEnabled() - const tokens = this.store.load() - if (!tokens?.refreshToken) { - throw new Error(this.store.getLoadError() ?? 'xAI Grok OAuth refresh token is unavailable') - } - const refreshed = await this.refreshAccessToken(tokens, true) - return refreshed.accessToken - } - - private withStorage(status: Omit): XaiGrokAuthStatus { - return { - ...status, - storage: this.store.getStorageState() + const check = this.captureOperation() + try { + this.assertEnabled() + const tokens = await this.store.load() + check() + if (!tokens?.refreshToken) + throw new Error(this.store.getLoadError() ?? 'xAI Grok OAuth refresh token is unavailable') + const refreshed = await this.refreshAccessToken(tokens, check, true) + check() + return refreshed.accessToken + } finally { + check() } } - private statusFromTokens(tokens: XaiGrokTokenSet): XaiGrokAuthStatus { - return this.withStorage({ - state: 'authenticated', - authenticated: true, - accountId: maskAccountId(tokens.accountId), - accountLabel: tokens.accountLabel, - expiresAt: tokens.expiresAt - }) - } - private assertEnabled(): void { - if (isXaiGrokOAuthDisabled()) { - throw new Error('xAI Grok OAuth is disabled by environment') - } + if (isXaiGrokOAuthDisabled()) throw new Error('xAI Grok OAuth is disabled by environment') } private async completeDeviceLogin( @@ -357,36 +412,106 @@ export class XaiGrokAuth { discovery: DiscoveryEndpoints, deviceCode: DeviceCodeResponse ): Promise { + const check = () => this.assertGeneration(flow.generation) try { + check() const tokens = await this.pollDeviceCodeToken( discovery.tokenEndpoint, deviceCode, + check, flow.abortController.signal ) - if (flow.cancelled || this.pendingDeviceFlow !== flow) { - return - } - + if (flow.cancelled || this.pendingDeviceFlow !== flow) return + check() const tokenSet = this.parseTokenResponse(tokens, undefined, { tokenEndpoint: discovery.tokenEndpoint, deviceAuthorizationEndpoint: discovery.deviceAuthorizationEndpoint }) - this.store.save(tokenSet) + this.invalidate() + flow.generation = this.generation + await this.store.save(tokenSet) + check() this.lastError = null this.pendingDeviceFlow = null - this.publishStatusChanged() + this.pendingLoginController = null + this.loginPending = false + await this.publishStatusChanged(check) } catch (error) { - if (flow.cancelled || this.pendingDeviceFlow !== flow) { + if ( + this.stopped || + flow.cancelled || + this.pendingDeviceFlow !== flow || + flow.generation !== this.generation + ) return - } - this.lastError = sanitizeError(error) this.pendingDeviceFlow = null - this.publishStatusChanged() + this.pendingLoginController = null + this.loginPending = false + try { + await this.publishStatusChanged(check) + } catch (publishError) { + if (!this.stopped && flow.generation === this.generation) + logger.warn( + '[xAI Grok OAuth] Failed to publish auth status:', + sanitizeError(publishError) + ) + } } } - private async fetchDiscovery(signal?: AbortSignal): Promise { + private async refreshAccessToken( + tokens: XaiGrokTokenSet, + check: () => void, + force = false + ): Promise { + check() + if (!force && tokens.expiresAt > Date.now() + XAI_GROK_TOKEN_REFRESH_SKEW_MS) return tokens + if (this.refreshPromise) return this.refreshPromise + const pending = this.refreshAccessTokenOnce(tokens, check).finally(() => { + if (this.refreshPromise === pending) this.refreshPromise = null + }) + this.refreshPromise = pending + return pending + } + + private async refreshAccessTokenOnce( + tokens: XaiGrokTokenSet, + check: () => void + ): Promise { + check() + if (!tokens.refreshToken) throw new Error('xAI Grok OAuth refresh token is unavailable') + let tokenEndpoint = tokens.tokenEndpoint + if (!tokenEndpoint || !isTrustedXaiOAuthEndpoint(tokenEndpoint)) + tokenEndpoint = (await this.fetchDiscovery(check)).tokenEndpoint + check() + const payload = await this.postForm( + tokenEndpoint, + { + grant_type: 'refresh_token', + client_id: XAI_GROK_OAUTH_CLIENT_ID, + refresh_token: tokens.refreshToken + }, + check + ) + check() + const refreshed = this.parseTokenResponse(payload, tokens, { + tokenEndpoint, + deviceAuthorizationEndpoint: tokens.deviceAuthorizationEndpoint + }) + await this.store.save(refreshed) + check() + this.lastError = null + await this.publishStatusChanged(check) + check() + return refreshed + } + + private async fetchDiscovery( + check: () => void, + signal?: AbortSignal + ): Promise { + check() if (this.cachedDiscovery) { return this.cachedDiscovery } @@ -403,11 +528,13 @@ export class XaiGrokAuth { signal ) + check() if (!response.ok) { throw new Error(`xAI OAuth discovery failed: ${await readErrorBody(response)}`) } const payload = (await response.json()) as TokenResponse + check() const deviceAuthorizationEndpoint = toStringValue(payload.device_authorization_endpoint) const tokenEndpoint = toStringValue(payload.token_endpoint) if (!deviceAuthorizationEndpoint || !tokenEndpoint) { @@ -435,8 +562,10 @@ export class XaiGrokAuth { private async requestDeviceCode( deviceAuthorizationEndpoint: string, + check: () => void, signal?: AbortSignal ): Promise { + check() const response = await this.fetchWithTimeout( requireTrustedEndpoint(deviceAuthorizationEndpoint, 'device authorization endpoint'), { @@ -454,11 +583,13 @@ export class XaiGrokAuth { signal ) + check() if (!response.ok) { throw new Error(`xAI device code request failed: ${await readErrorBody(response)}`) } const payload = (await response.json()) as TokenResponse + check() const deviceCode = toStringValue(payload.device_code) const userCode = toStringValue(payload.user_code) const verificationUri = toStringValue(payload.verification_uri) @@ -490,12 +621,15 @@ export class XaiGrokAuth { private async pollDeviceCodeToken( tokenEndpoint: string, deviceCode: DeviceCodeResponse, + check: () => void, signal?: AbortSignal ): Promise { + check() const deadlineMs = Date.now() + deviceCode.expiresInMs let intervalMs = deviceCode.intervalMs while (Date.now() < deadlineMs) { + check() if (signal?.aborted) { throw new Error('xAI Grok OAuth login cancelled') } @@ -525,6 +659,7 @@ export class XaiGrokAuth { payload = {} } + check() if (response.ok) { return payload } @@ -557,50 +692,6 @@ export class XaiGrokAuth { throw new Error('xAI device authorization timed out') } - private async refreshAccessToken( - currentTokens: XaiGrokTokenSet, - force = false - ): Promise { - if (!force && currentTokens.expiresAt > Date.now() + XAI_GROK_TOKEN_REFRESH_SKEW_MS) { - return currentTokens - } - - if (this.refreshPromise) { - return this.refreshPromise - } - - this.refreshPromise = this.refreshAccessTokenOnce(currentTokens).finally(() => { - this.refreshPromise = null - }) - return this.refreshPromise - } - - private async refreshAccessTokenOnce(currentTokens: XaiGrokTokenSet): Promise { - if (!currentTokens.refreshToken) { - throw new Error('xAI Grok OAuth refresh token is unavailable') - } - - let tokenEndpoint = currentTokens.tokenEndpoint - if (!tokenEndpoint || !isTrustedXaiOAuthEndpoint(tokenEndpoint)) { - tokenEndpoint = (await this.fetchDiscovery()).tokenEndpoint - } - - const payload = await this.postForm(tokenEndpoint, { - grant_type: 'refresh_token', - client_id: XAI_GROK_OAUTH_CLIENT_ID, - refresh_token: currentTokens.refreshToken - }) - - const refreshed = this.parseTokenResponse(payload, currentTokens, { - tokenEndpoint, - deviceAuthorizationEndpoint: currentTokens.deviceAuthorizationEndpoint - }) - this.store.save(refreshed) - this.lastError = null - this.publishStatusChanged() - return refreshed - } - private parseTokenResponse( payload: TokenResponse, previous?: XaiGrokTokenSet, @@ -642,8 +733,10 @@ export class XaiGrokAuth { private async postForm( url: string, params: Record, + check: () => void, requireOk = true ): Promise { + check() const response = await this.fetchWithTimeout(url, { method: 'POST', headers: { @@ -653,53 +746,16 @@ export class XaiGrokAuth { }, body: toFormBody(params) }) - + check() if (!response.ok) { - if (!requireOk) { - return {} - } - throw new Error(await readErrorBody(response)) - } - - return (await response.json()) as TokenResponse - } - - private async fetchWithTimeout( - url: string, - init: RequestInit, - externalSignal?: AbortSignal - ): Promise { - const controller = new AbortController() - const timeout = setTimeout(() => controller.abort(), XAI_GROK_AUTH_REQUEST_TIMEOUT_MS) - const onExternalAbort = () => controller.abort(externalSignal?.reason) - - if (externalSignal) { - if (externalSignal.aborted) { - controller.abort(externalSignal.reason) - } else { - externalSignal.addEventListener('abort', onExternalAbort, { once: true }) - } - } - - try { - return await fetch(url, { - ...init, - signal: controller.signal - }) - } catch (error) { - if (controller.signal.aborted) { - if (externalSignal?.aborted) { - throw new Error('xAI Grok OAuth login cancelled') - } - throw new Error( - `xAI Grok OAuth request timed out after ${XAI_GROK_AUTH_REQUEST_TIMEOUT_MS}ms` - ) - } - throw error - } finally { - clearTimeout(timeout) - externalSignal?.removeEventListener('abort', onExternalAbort) + if (!requireOk) return {} + const error = await readErrorBody(response) + check() + throw new Error(error) } + const payload = (await response.json()) as TokenResponse + check() + return payload } private async sleep(ms: number, signal?: AbortSignal): Promise { @@ -726,17 +782,59 @@ export class XaiGrokAuth { }) } - private publishStatusChanged(): void { - this.publishEvent('oauth.xaiGrok.statusChanged', { - status: this.getStatus(), - version: Date.now() - }) + private async fetchWithTimeout( + url: string, + init: RequestInit, + externalSignal?: AbortSignal + ): Promise { + const check = this.captureOperation() + if (this.requests.size >= 32) throw new Error('xAI Grok auth request limit exceeded') + const controller = new AbortController() + this.requests.add(controller) + const timer = setTimeout(() => controller.abort(), XAI_GROK_AUTH_REQUEST_TIMEOUT_MS) + const abort = () => controller.abort(externalSignal?.reason) + if (externalSignal?.aborted) abort() + else externalSignal?.addEventListener('abort', abort, { once: true }) + try { + controller.signal.throwIfAborted() + const response = await fetch(url, { ...init, signal: controller.signal }) + check() + const result = await readAuthResponse(response, controller.signal) + check() + return result + } catch (error) { + check() + if (controller.signal.aborted) { + if (externalSignal?.aborted) + throw new DOMException('xAI Grok OAuth login cancelled', 'AbortError') + throw new Error( + `xAI Grok auth request timed out after ${XAI_GROK_AUTH_REQUEST_TIMEOUT_MS}ms` + ) + } + throw error + } finally { + clearTimeout(timer) + externalSignal?.removeEventListener('abort', abort) + this.requests.delete(controller) + } } -} -export function initializeGlobalXaiGrokAuth(publishEvent: DeepchatEventPublisher): XaiGrokAuth { + private async publishStatusChanged(check: () => void): Promise { + check() + const publication = ++this.publication + const status = await this.getStatus() + check() + if (publication !== this.publication) return + this.publishEvent('oauth.xaiGrok.statusChanged', { status, version: Date.now() }) + } +} +export function initializeGlobalXaiGrokAuth( + publishEvent: DeepchatEventPublisher, + store: XaiGrokCredentialStore, + openExternal: (url: string) => Promise +): XaiGrokAuth { if (!globalXaiGrokAuth) { - globalXaiGrokAuth = new XaiGrokAuth(undefined, publishEvent) + globalXaiGrokAuth = new XaiGrokAuth(store, publishEvent, openExternal) } return globalXaiGrokAuth } @@ -749,6 +847,7 @@ export function getGlobalXaiGrokAuth(): XaiGrokAuth { } export function resetGlobalXaiGrokAuthForTests(): void { + globalXaiGrokAuth?.stop() globalXaiGrokAuth = null } diff --git a/src/main/provider/baseProvider.ts b/src/main/provider/baseProvider.ts index 3e6c0be14f..ca09f98fd2 100644 --- a/src/main/provider/baseProvider.ts +++ b/src/main/provider/baseProvider.ts @@ -10,12 +10,11 @@ import type { KeyStatus, LLM_EMBEDDING_ATTRS } from '@shared/types/provider' -import { DeviceService } from '../device' import { jsonrepair } from 'jsonrepair' import logger from '@shared/logger' import { resolveRequestTraceContext, type ProviderRequestTracePayload } from './requestTrace' import { normalizeToolInputSchema } from './aiSdk/toolMapper' -import type { ProviderLocalePort } from './ports' +import type { ProviderEnvironmentPort } from './ports' import { buildProviderTraceHeaders, fetchWithProviderHeaders } from './providerHeaders' export const AUDIO_TRANSCRIPTION_NOT_SUPPORTED_ERROR = 'audio-transcription-not-supported' @@ -50,23 +49,20 @@ export abstract class BaseLLMProvider { protected customModels: MODEL_META[] = [] protected isInitialized: boolean = false protected providerSettings: ProviderSettingsPort - private readonly locale: ProviderLocalePort + protected readonly environment: ProviderEnvironmentPort private modelFetchPromise: Promise | null = null - protected defaultHeaders: Record = { - 'HTTP-Referer': 'https://deepchatai.cn', - 'X-Title': 'DeepChat' - } + protected defaultHeaders: Record constructor( provider: LLM_PROVIDER, providerSettings: ProviderSettingsPort, - locale: ProviderLocalePort + locale: ProviderEnvironmentPort ) { this.provider = provider this.providerSettings = providerSettings - this.locale = locale - this.defaultHeaders = DeviceService.getDefaultHeaders() + this.environment = locale + this.defaultHeaders = { ...locale.defaultHeaders } // Initialize models and customModels from cached config data this.loadCachedModels() @@ -423,7 +419,7 @@ export abstract class BaseLLMProvider { * @returns 格式化的提示词 */ protected getFunctionCallWrapPrompt(tools: MCPToolDefinition[]): string { - const locale = this.locale.getLanguage() || 'zh-CN' + const locale = this.environment.getLanguage() || 'zh-CN' return `你具备调用外部工具的能力来协助解决用户的问题 ==== diff --git a/src/main/provider/index.ts b/src/main/provider/index.ts index 07143b9dd6..43f8977c7b 100644 --- a/src/main/provider/index.ts +++ b/src/main/provider/index.ts @@ -1,4 +1,6 @@ import type { ProviderSettingsPort } from '@/provider/settings' +import { createHmac, randomBytes } from 'node:crypto' +import type { GitHubCopilotSignInTarget } from '@shared/types/oauth' import logger from '@shared/logger' import type { LLMResponse } from '@shared/types/provider' import type { ChatMessage } from '@shared/types/core/chat-message' @@ -39,7 +41,7 @@ import type { AcpAsLlmProviderPermissionPort, AcpAsLlmProviderSessionControlPort, AcpProviderAdminPort, - ProviderLocalePort + ProviderEnvironmentPort } from './ports' import { BaseLLMProvider, @@ -148,10 +150,11 @@ export class ProviderRuntime private readonly acpRuntimeOwner: AcpRuntimeOwner private readonly acpSessionPersistence: AcpSessionPersistence private shutdownPromise?: Promise + private copilotSignInKey = randomBytes(32) constructor( providerSettings: ProviderSettingsPort, - locale: ProviderLocalePort, + locale: ProviderEnvironmentPort, agentSettings: Pick, mcpSettings: McpSettings, acpRuntimeOwner: AcpRuntimeOwner, @@ -219,6 +222,53 @@ export class ProviderRuntime this.replaceProviders(this.providerSettings.getProviders()) } + private copilotConfigurationIdentity(provider: LLM_PROVIDER): string { + return createHmac('sha256', this.copilotSignInKey) + .update( + JSON.stringify([ + provider.id, + provider.apiType, + provider.apiKey, + provider.copilotClientId?.trim() || '' + ]) + ) + .digest('hex') + } + + async getGitHubCopilotSignInTarget(providerId: string): Promise { + if (this.shutdownPromise) throw new Error('Provider runtime is stopped') + const provider = this.providerSettings.getProviderById(providerId) + if (!provider) throw new Error(`Provider ${providerId} not found`) + if (provider.apiType !== 'github-copilot') + throw new Error('Provider is not configured for GitHub Copilot') + return { + providerId, + clientId: provider.copilotClientId, + configurationId: this.copilotConfigurationIdentity(provider) + } + } + + async commitGitHubCopilotCredential( + target: GitHubCopilotSignInTarget, + apiKey: string + ): Promise { + if (this.shutdownPromise) throw new Error('Provider runtime is stopped') + if (typeof apiKey !== 'string' || !/^[\x21-\x7e]+$/.test(apiKey)) + throw new Error('Invalid GitHub OAuth token') + const provider = this.providerSettings.getProviderById(target.providerId) + if ( + !provider || + provider.apiType !== 'github-copilot' || + this.copilotConfigurationIdentity(provider) !== target.configurationId + ) + throw new Error('GitHub Copilot configuration changed during sign-in. Please try again.') + this.setProviderById(target.providerId, { ...provider, apiKey }) + } + + async invalidateGitHubCopilotSignIns(): Promise { + this.copilotSignInKey = randomBytes(32) + } + updateProviderAtomic(providerId: string, updates: Partial): boolean { if (!this.providerSettings.getProviderById(providerId)) { return false diff --git a/src/main/provider/managers/providerInstanceManager.ts b/src/main/provider/managers/providerInstanceManager.ts index bf82fbb6be..20164da9fe 100644 --- a/src/main/provider/managers/providerInstanceManager.ts +++ b/src/main/provider/managers/providerInstanceManager.ts @@ -14,14 +14,14 @@ import { RateLimitManager } from './rateLimitManager' import { StreamState } from '../types' import type { AcpRuntimeOwner } from '@/agent/acp/client' import { resolveAiSdkProviderDefinition } from '../providerRegistry' -import type { ProviderLocalePort } from '../ports' +import type { ProviderEnvironmentPort } from '../ports' import type { AgentSettingsPort } from '@/agent/settings' import type { ProviderSettingsPort } from '@/provider/settings' import type { DeepchatEventPublisher } from '@shared/contracts/events' interface ProviderInstanceManagerOptions { providerSettings: ProviderSettingsPort - locale: ProviderLocalePort + locale: ProviderEnvironmentPort agentSettings: Pick activeStreams: Map rateLimitManager: RateLimitManager diff --git a/src/main/provider/modelConfig.ts b/src/main/provider/modelConfig.ts index 423da79d59..bfe08ee7fe 100644 --- a/src/main/provider/modelConfig.ts +++ b/src/main/provider/modelConfig.ts @@ -14,7 +14,6 @@ import { } from '@shared/modelConfigDefaults' import { applyMoonshotKimiReasoningTemperaturePolicy } from '@shared/modelRequestPolicy' import { resolveVideoGenerationCompatType } from '@shared/videoGenerationSettings' -import ElectronStore from 'electron-store' import { hasAnthropicReasoningToggle, getReasoningEffortDefault, @@ -90,17 +89,10 @@ const normalizeVerbosityValue = ( } export class ModelConfigHelper { - private modelConfigStore: StoreLike> private memoryCache: Map = new Map() private cacheInitialized: boolean = false - constructor( - store: StoreLike> = new ElectronStore>({ - name: 'model-config' - }) - ) { - this.modelConfigStore = store - } + constructor(private readonly modelConfigStore: StoreLike>) {} /** * Infer model type from provider model data diff --git a/src/main/provider/openaiCodexAdapter.ts b/src/main/provider/openaiCodexAdapter.ts index 93d1e4b448..6ca77ad020 100644 --- a/src/main/provider/openaiCodexAdapter.ts +++ b/src/main/provider/openaiCodexAdapter.ts @@ -198,8 +198,13 @@ export function createOpenAICodexFetch( throw new Error('OpenAI Codex provider is disabled by environment') } + const signal = init?.signal ?? (url instanceof Request ? url.signal : undefined) + signal?.throwIfAborted() const auth = getGlobalOpenAICodexAuth() + const check = auth.captureOperation() const backendAuth = await auth.getBackendAuth() + check() + signal?.throwIfAborted() const responsesRequest = isResponsesRequest(url) const accept = responsesRequest ? 'text/event-stream' : 'application/json' const nextInit: RequestInit = { @@ -209,11 +214,16 @@ export function createOpenAICodexFetch( } let response = await baseFetch(url, nextInit) + signal?.throwIfAborted() if (response.status !== 401) { return normalizeOpenAICodexErrorResponse(response) } + check() + signal?.throwIfAborted() const refreshedAuth = await auth.forceRefreshBackendAuth() + check() + signal?.throwIfAborted() response = await baseFetch(url, { ...nextInit, headers: applyCodexHeaders(init?.headers, defaultHeaders, refreshedAuth, accept) diff --git a/src/main/provider/ports.ts b/src/main/provider/ports.ts index 4725100968..3b8e33928e 100644 --- a/src/main/provider/ports.ts +++ b/src/main/provider/ports.ts @@ -11,8 +11,10 @@ export interface ProviderCatalogPort { getAgentType(agentId: string): Promise<'deepchat' | 'acp' | null> } -export interface ProviderLocalePort { +export interface ProviderEnvironmentPort { getLanguage(): string + defaultHeaders: Readonly> + readonly allowInsecureTls: boolean } export interface AcpAsLlmProviderSessionControlPort { diff --git a/src/main/provider/providerDbLoader.ts b/src/main/provider/providerDbLoader.ts index d94bc2d50c..ddb2b536f9 100644 --- a/src/main/provider/providerDbLoader.ts +++ b/src/main/provider/providerDbLoader.ts @@ -1,6 +1,5 @@ import fs from 'fs' import path from 'path' -import { app } from 'electron' import { ProviderAggregate, ProviderEntry, @@ -76,19 +75,42 @@ export type ProviderDbCatalogChange = export type ProviderDbCatalogListener = (change: ProviderDbCatalogChange) => void +export type ProviderDbBootstrap = { + userDataDirectory: string + builtInCatalogPath: string +} + export class ProviderDbLoader { private cache: ProviderAggregate | null = null - private userDataDir: string - private cacheDir: string - private cacheFilePath: string - private metaFilePath: string + private bootstrap: ProviderDbBootstrap | null = null + private cacheDir = '' + private cacheFilePath = '' + private metaFilePath = '' + private stopped = false + private refreshController: AbortController | null = null private refreshPromise: Promise | null = null private privacyModeResolver: () => boolean = () => false private readonly catalogListeners = new Set() - constructor() { - this.userDataDir = process.env.DEEPCHAT_E2E_USER_DATA_DIR?.trim() || app.getPath('userData') - this.cacheDir = path.join(this.userDataDir, 'provider-db') + configure(bootstrap: ProviderDbBootstrap): void { + if (this.stopped) throw new Error('Provider catalog is stopping') + if ( + !path.isAbsolute(bootstrap.userDataDirectory) || + !path.isAbsolute(bootstrap.builtInCatalogPath) + ) { + throw new Error('Provider catalog paths must be absolute') + } + if (this.bootstrap) { + if ( + this.bootstrap.userDataDirectory !== bootstrap.userDataDirectory || + this.bootstrap.builtInCatalogPath !== bootstrap.builtInCatalogPath + ) { + throw new Error('Provider catalog is already configured for another profile') + } + return + } + this.bootstrap = { ...bootstrap } + this.cacheDir = path.join(bootstrap.userDataDirectory, 'provider-db') this.cacheFilePath = path.join(this.cacheDir, 'providers.json') this.metaFilePath = path.join(this.cacheDir, 'meta.json') @@ -97,6 +119,15 @@ export class ProviderDbLoader { } catch {} } + stop(): void { + this.stopped = true + this.refreshController?.abort() + } + + async drain(): Promise { + await this.refreshPromise + } + setPrivacyModeResolver(resolver?: () => boolean): void { this.privacyModeResolver = resolver ?? (() => false) } @@ -106,8 +137,10 @@ export class ProviderDbLoader { return () => this.catalogListeners.delete(listener) } - // Public: initialize on app start (non-blocking refresh) + // Load the initial catalog; the startup task owner schedules automatic refresh. async initialize(): Promise { + if (!this.bootstrap) throw new Error('Provider catalog paths are required') + if (this.stopped) return // Load from cache or built-in this.cache = this.loadFromCache() ?? this.loadFromBuiltIn() if (this.cache) { @@ -116,25 +149,11 @@ export class ProviderDbLoader { providersCount: Object.keys(this.cache.providers || {}).length }) } - - if (this.isAutomaticRefreshBlocked()) { - return - } - - // Always refresh once in the background on startup to pick up upstream updates. - void this.refreshIfNeeded(true, { automatic: true }) - .then((result) => { - if (result.status === 'error') { - console.warn('[ProviderDbLoader] Startup refresh failed:', result.message) - } - }) - .catch((error) => { - console.warn('[ProviderDbLoader] Startup refresh failed:', error) - }) } getDb(): ProviderAggregate | null { if (this.cache) return this.cache + if (!this.bootstrap || this.stopped) return null // Lazy try again if not initialized yet this.cache = this.loadFromCache() ?? this.loadFromBuiltIn() return this.cache @@ -172,7 +191,8 @@ export class ProviderDbLoader { private loadFromBuiltIn(): ProviderAggregate | null { try { - const helperPath = path.join(app.getAppPath(), 'resources', 'model-db', 'providers.json') + const helperPath = this.bootstrap?.builtInCatalogPath + if (!helperPath) return null if (!fs.existsSync(helperPath)) return null const raw = fs.readFileSync(helperPath, 'utf-8') const parsed = JSON.parse(raw) @@ -184,6 +204,7 @@ export class ProviderDbLoader { } private readMeta(): MetaFile | null { + if (!this.bootstrap || this.stopped) return null try { if (!fs.existsSync(this.metaFilePath)) return null const raw = fs.readFileSync(this.metaFilePath, 'utf-8') @@ -223,8 +244,11 @@ export class ProviderDbLoader { force = false, options: { automatic?: boolean + signal?: AbortSignal } = {} ): Promise { + if (!this.bootstrap) throw new Error('Provider catalog paths are required') + if (this.stopped || options.signal?.aborted) return this.createResult('skipped') const meta = this.readMeta() if (options.automatic && this.isAutomaticRefreshBlocked()) { return this.createResult('skipped', meta) @@ -244,9 +268,11 @@ export class ProviderDbLoader { return this.createResult('skipped', meta) } - this.refreshPromise = this.fetchAndUpdate(url, meta || undefined).finally(() => { - this.refreshPromise = null - }) + this.refreshPromise = this.fetchAndUpdate(url, meta || undefined, options.signal).finally( + () => { + this.refreshPromise = null + } + ) return this.refreshPromise } @@ -288,8 +314,14 @@ export class ProviderDbLoader { } } - private async fetchAndUpdate(url: string, prevMeta?: MetaFile): Promise { + private async fetchAndUpdate( + url: string, + prevMeta?: MetaFile, + signal?: AbortSignal + ): Promise { const controller = new AbortController() + this.refreshController = controller + const requestSignal = signal ? AbortSignal.any([signal, controller.signal]) : controller.signal const timeout = setTimeout(() => controller.abort(), 15000) try { const headers: Record = {} @@ -298,7 +330,8 @@ export class ProviderDbLoader { headers['If-None-Match'] = prevMeta.etag } - const res = await fetch(url, { headers, signal: controller.signal }) + const res = await fetch(url, { headers, signal: requestSignal }) + if (this.stopped || signal?.aborted) return this.createResult('skipped', prevMeta) const now = this.now() if (res.status === 304 && prevMeta) { @@ -319,6 +352,7 @@ export class ProviderDbLoader { } const text = await readResponseTextWithLimit(res, MAX_PROVIDER_DB_PAYLOAD_BYTES) + if (this.stopped || signal?.aborted) return this.createResult('skipped', prevMeta) if (text === null) { const meta = this.createAttemptMeta(prevMeta, url, now) if (meta) this.writeMeta(meta) @@ -362,12 +396,14 @@ export class ProviderDbLoader { }) return this.createResult('updated', meta) } catch (error) { + if (this.stopped || signal?.aborted) return this.createResult('skipped', prevMeta) const meta = this.createAttemptMeta(prevMeta, url, this.now()) if (meta) this.writeMeta(meta) const message = error instanceof Error ? error.message : 'Unknown provider DB refresh error' return this.createResult('error', meta, message) } finally { clearTimeout(timeout) + if (this.refreshController === controller) this.refreshController = null } } diff --git a/src/main/provider/providerHeaders.ts b/src/main/provider/providerHeaders.ts index 1f9acbcb8c..1bf9d25a1b 100644 --- a/src/main/provider/providerHeaders.ts +++ b/src/main/provider/providerHeaders.ts @@ -18,6 +18,14 @@ const CROSS_ORIGIN_SENSITIVE_HEADERS = [ export const MASKED_PROVIDER_CUSTOM_HEADER_VALUE = '***MASKED***' +export function buildDefaultProviderHeaders(appVersion: string): Record { + return { + 'HTTP-Referer': 'https://deepchatai.cn', + 'X-Title': 'DeepChat', + 'User-Agent': `DeepChat/${appVersion}` + } +} + type ProviderFetch = (input: string | URL | Request, init?: RequestInit) => Promise const getRequestUrl = (input: string | URL | Request): URL | null => { diff --git a/src/main/provider/providerModelHelper.ts b/src/main/provider/providerModelHelper.ts index 74d16f0e90..134c81521e 100644 --- a/src/main/provider/providerModelHelper.ts +++ b/src/main/provider/providerModelHelper.ts @@ -2,8 +2,6 @@ import logger from '@shared/logger' import type { MODEL_META, ModelRouteConfig } from '@shared/types/provider' import { isNewApiEndpointType, ModelType, resolveNewApiModelTypeFromMetadata } from '@shared/model' import { resolveVideoGenerationCompatType } from '@shared/videoGenerationSettings' -import ElectronStore from 'electron-store' -import path from 'path' import type { StoreLike } from '@/config/storeLike' import type { DeepchatEventPublisher } from '@shared/contracts/events' import { emitModelsChanged } from './eventPublishers' @@ -14,7 +12,6 @@ export interface IModelStore { custom_models: MODEL_META[] } -export const PROVIDER_MODELS_DIR = 'provider_models' const PROVIDER_MODEL_CACHE_TTL_MS = 250 type ProviderModelRouteSource = Pick< @@ -27,7 +24,7 @@ type ModelStatusUpdater = (providerId: string, modelId: string, enabled: boolean type ModelStatusRemover = (providerId: string, modelId: string) => void interface ProviderModelHelperOptions { - userDataPath: string + createStore: (providerId: string) => ProviderModelStore setModelStatus: ModelStatusUpdater deleteModelStatus: ModelStatusRemover publishEvent: DeepchatEventPublisher @@ -53,12 +50,11 @@ function isNonChatModelType(type: ModelType | undefined): type is ModelType { } export class ProviderModelHelper { - private readonly userDataPath: string + private readonly createStore: (providerId: string) => ProviderModelStore private readonly setModelStatus: ModelStatusUpdater private readonly deleteModelStatus: ModelStatusRemover private readonly publishEvent: DeepchatEventPublisher private readonly stores: Map = new Map() - private storeFactory: ((providerId: string) => ProviderModelStore) | null = null private readonly providerModelsCache = new Map< string, { @@ -69,47 +65,15 @@ export class ProviderModelHelper { >() constructor(options: ProviderModelHelperOptions) { - this.userDataPath = options.userDataPath + this.createStore = options.createStore this.setModelStatus = options.setModelStatus this.deleteModelStatus = options.deleteModelStatus this.publishEvent = options.publishEvent } - private getStoreName(providerId: string): string { - const safeProviderId = encodeURIComponent(providerId).replace(/\*/g, '%2A') - return `models_${safeProviderId}` - } - - setStoreFactory(factory: (providerId: string) => ProviderModelStore): void { - this.storeFactory = factory - this.stores.clear() - this.invalidateAllProviderModelsCache() - } - getProviderModelStore(providerId: string): ProviderModelStore { if (!this.stores.has(providerId)) { - if (this.storeFactory) { - this.stores.set(providerId, this.storeFactory(providerId)) - return this.stores.get(providerId)! - } - - const storeName = this.getStoreName(providerId) - const storePath = path.join(this.userDataPath, PROVIDER_MODELS_DIR) - logger.info( - `[ProviderModelHelper] getProviderModelStore: creating isolated store "${storeName}" at "${storePath}" for provider "${providerId}"` - ) - const store = new ElectronStore({ - name: storeName, - cwd: storePath, - defaults: { - models: [], - custom_models: [] - } - }) - this.stores.set(providerId, store as unknown as ProviderModelStore) - logger.info( - `[ProviderModelHelper] getProviderModelStore: store "${storeName}" created and cached for provider "${providerId}"` - ) + this.stores.set(providerId, this.createStore(providerId)) } return this.stores.get(providerId)! } diff --git a/src/main/provider/providers/acpProvider.ts b/src/main/provider/providers/acpProvider.ts index f0cc515fd3..98c950de5d 100644 --- a/src/main/provider/providers/acpProvider.ts +++ b/src/main/provider/providers/acpProvider.ts @@ -11,7 +11,7 @@ import { SUMMARY_TITLES_PROMPT, type ProviderGenerateTextOptions } from '../baseProvider' -import type { ProviderLocalePort } from '../ports' +import type { ProviderEnvironmentPort } from '../ports' import type { AgentSettingsPort } from '@/agent/settings' import type { ChatMessage } from '@shared/types/core/chat-message' import type { LLMResponse } from '@shared/types/provider' @@ -157,7 +157,7 @@ export class AcpProvider extends BaseLLMProvider { constructor( provider: LLM_PROVIDER, providerSettings: ProviderSettingsPort, - locale: ProviderLocalePort, + locale: ProviderEnvironmentPort, agentSettings: Pick, runtimeOwner: AcpRuntimeOwner, private readonly publishEvent: DeepchatEventPublisher diff --git a/src/main/provider/providers/aiSdkProvider.ts b/src/main/provider/providers/aiSdkProvider.ts index 0eabc02848..da202d8b9c 100644 --- a/src/main/provider/providers/aiSdkProvider.ts +++ b/src/main/provider/providers/aiSdkProvider.ts @@ -33,7 +33,7 @@ import { SUMMARY_TITLES_PROMPT, type ProviderGenerateTextOptions } from '../baseProvider' -import type { ProviderLocalePort } from '../ports' +import type { ProviderEnvironmentPort } from '../ports' import { runAiSdkCoreStream, runAiSdkDimensions, @@ -43,7 +43,7 @@ import { } from '../aiSdk' import type { AiSdkProviderKind } from '../aiSdk/providerFactory' import { normalizeAzureBaseUrl, normalizeGeminiBaseUrl } from '../aiSdk/providerFactory' -import { shouldUseXaiGrokOAuthFetch } from '../xaiGrokAuthAdapter' +import { createXaiGrokFetch, shouldUseXaiGrokOAuthFetch } from '../xaiGrokAuthAdapter' import { getGlobalXaiGrokAuth } from '../../provider/auth/xaiGrok' import { isTrustedXaiApiEndpoint } from '../../provider/auth/xaiGrok/constants' import { @@ -228,7 +228,7 @@ export class AiSdkProvider extends BaseLLMProvider { constructor( provider: LLM_PROVIDER, providerSettings: ProviderSettingsPort, - locale: ProviderLocalePort + locale: ProviderEnvironmentPort ) { super(provider, providerSettings, locale) const definition = resolveAiSdkProviderDefinition(provider) @@ -579,16 +579,6 @@ export class AiSdkProvider extends BaseLLMProvider { base.baseUrl = 'https://api.fireworks.ai/inference/v1' } - if (shouldUseXaiGrokOAuthFetch(base)) { - const oauthToken = getGlobalXaiGrokAuth().peekAccessToken() - if (oauthToken) { - return { - ...base, - oauthToken - } - } - } - return base } @@ -896,19 +886,10 @@ export class AiSdkProvider extends BaseLLMProvider { } try { - // Refresh Grok OAuth tokens before model/list requests that use sync headers. const runtimeProvider = this.getRuntimeProvider(resolvedDecision) const useGrokOAuth = shouldUseXaiGrokOAuthFetch(runtimeProvider) && isTrustedXaiApiEndpoint(url) - if (useGrokOAuth) { - await getGlobalXaiGrokAuth() - .ensureAccessToken() - .catch(() => null) - } - const refreshedRuntimeProvider = this.getRuntimeProvider(resolvedDecision) - const requestRuntimeProvider = useGrokOAuth - ? refreshedRuntimeProvider - : { ...refreshedRuntimeProvider, oauthToken: undefined } + const requestRuntimeProvider = { ...runtimeProvider, oauthToken: undefined } const requestHeaders = this.getRequestHeaders( resolvedDecision, requestRuntimeProvider, @@ -923,7 +904,14 @@ export class AiSdkProvider extends BaseLLMProvider { } requestHeaders[name] = value }) - const response = await this.fetchProvider(url, { + controller.signal.throwIfAborted() + const request = useGrokOAuth + ? createXaiGrokFetch(runtimeProvider, {}, (input, options) => + this.fetchProvider(input, options) + ) + : (input: string | URL | Request, options?: RequestInit) => + this.fetchProvider(input, options) + const response = await request(url, { ...init, headers: requestHeaders, signal: controller.signal @@ -2628,11 +2616,11 @@ export class AiSdkProvider extends BaseLLMProvider { } } - private validateCredentials(strategy: AiSdkCredentialStrategy): string | null { + private async validateCredentials(strategy: AiSdkCredentialStrategy): Promise { switch (strategy) { case 'api-key': if (shouldUseXaiGrokOAuthFetch(this.provider)) { - if (this.provider.apiKey || getGlobalXaiGrokAuth().isAuthenticated()) { + if (this.provider.apiKey || (await getGlobalXaiGrokAuth().isAuthenticated())) { return null } return 'Missing API key or xAI Grok OAuth sign-in' @@ -2686,7 +2674,7 @@ export class AiSdkProvider extends BaseLLMProvider { } } case 'generate-text': { - const credentialError = this.validateCredentials( + const credentialError = await this.validateCredentials( this.definition.credentialStrategy ?? 'none' ) if (credentialError) { diff --git a/src/main/provider/providers/githubCopilotProvider.ts b/src/main/provider/providers/githubCopilotProvider.ts index 137a716da4..9b429496a6 100644 --- a/src/main/provider/providers/githubCopilotProvider.ts +++ b/src/main/provider/providers/githubCopilotProvider.ts @@ -16,12 +16,12 @@ import { type ProviderGenerateTextOptions } from '../baseProvider' import { normalizeToolInputSchema } from '../aiSdk/toolMapper' -import type { ProviderLocalePort } from '../ports' +import type { ProviderEnvironmentPort } from '../ports' import { createGitHubCopilotHttpError, getGitHubCopilotToken, GITHUB_COPILOT_CHAT_HEADERS -} from '../../provider/auth/githubCopilotDeviceFlow' +} from '../../provider/auth/githubCopilotToken' export class GithubCopilotProvider extends BaseLLMProvider { private copilotToken: string | null = null @@ -31,7 +31,7 @@ export class GithubCopilotProvider extends BaseLLMProvider { constructor( provider: LLM_PROVIDER, providerSettings: ProviderSettingsPort, - locale: ProviderLocalePort + locale: ProviderEnvironmentPort ) { super(provider, providerSettings, locale) this.init() diff --git a/src/main/provider/providers/jevProvider.ts b/src/main/provider/providers/jevProvider.ts index a2075b04dd..b8a12472f8 100644 --- a/src/main/provider/providers/jevProvider.ts +++ b/src/main/provider/providers/jevProvider.ts @@ -12,7 +12,7 @@ import type { ProviderStreamOptions } from '@shared/types/provider' import { BaseLLMProvider, type ProviderGenerateTextOptions } from '../baseProvider' -import type { ProviderLocalePort } from '../ports' +import type { ProviderEnvironmentPort } from '../ports' import { createProviderHttpErrorFromResponse, ProviderHttpError } from '../providerFailure' /** @@ -164,7 +164,7 @@ export class JevProvider extends BaseLLMProvider { constructor( provider: LLM_PROVIDER, providerSettings: ProviderSettingsPort, - locale: ProviderLocalePort + locale: ProviderEnvironmentPort ) { super(provider, providerSettings, locale) this.init() diff --git a/src/main/provider/providers/ollamaProvider.ts b/src/main/provider/providers/ollamaProvider.ts index 530762034b..f7bb6d1436 100644 --- a/src/main/provider/providers/ollamaProvider.ts +++ b/src/main/provider/providers/ollamaProvider.ts @@ -19,7 +19,7 @@ import { SUMMARY_TITLES_PROMPT, type ProviderGenerateTextOptions } from '../baseProvider' -import type { ProviderLocalePort } from '../ports' +import type { ProviderEnvironmentPort } from '../ports' import { execFile } from 'node:child_process' import { Ollama, ShowResponse } from 'ollama' import { @@ -30,7 +30,6 @@ import { type AiSdkRuntimeContext } from '../aiSdk' import { normalizeOllamaOpenAIBaseUrl, normalizeOllamaSdkHost } from '../aiSdk/providerFactory' -import { isInsecureTlsAllowed } from '@/lib/insecureTls' import { buildResolvedCapabilitySnapshot, resolveCapabilityIdentity } from '../capabilityIdentity' const OLLAMA_LIST_TIMEOUT_MS = 5000 @@ -48,7 +47,7 @@ export class OllamaProvider extends BaseLLMProvider { constructor( provider: LLM_PROVIDER, providerSettings: ProviderSettingsPort, - locale: ProviderLocalePort + locale: ProviderEnvironmentPort ) { super(provider, providerSettings, locale) this.ollama = this.createOllamaClient() @@ -768,7 +767,7 @@ export class OllamaProvider extends BaseLLMProvider { try { const stream = await this.ollama.pull({ model: modelName, - insecure: isInsecureTlsAllowed(), + insecure: this.environment.allowInsecureTls, stream: true }) diff --git a/src/main/provider/providers/voiceAIProvider.ts b/src/main/provider/providers/voiceAIProvider.ts index b275ce61f9..8ac4035330 100644 --- a/src/main/provider/providers/voiceAIProvider.ts +++ b/src/main/provider/providers/voiceAIProvider.ts @@ -15,7 +15,7 @@ import { createProviderHttpErrorFromResponse, extractProviderFailureMetadata } from '../providerFailure' -import type { ProviderLocalePort } from '../ports' +import type { ProviderEnvironmentPort } from '../ports' const DEFAULT_BASE_URL = 'https://dev.voice.ai' const DEFAULT_AUDIO_FORMAT = 'mp3' @@ -62,7 +62,7 @@ export class VoiceAIProvider extends BaseLLMProvider { constructor( provider: LLM_PROVIDER, providerSettings: ProviderSettingsPort, - locale: ProviderLocalePort + locale: ProviderEnvironmentPort ) { super(provider, providerSettings, locale) this.init() diff --git a/src/main/provider/settings.ts b/src/main/provider/settings.ts index eb512d9273..80c790a904 100644 --- a/src/main/provider/settings.ts +++ b/src/main/provider/settings.ts @@ -23,19 +23,19 @@ import { resolveModelVision } from '@shared/modelConfigDefaults' import { DEFAULT_PROVIDERS } from '@/provider/defaults' -import path from 'path' -import { app } from 'electron' -import fs from 'fs' import { compare } from 'compare-versions' import { ModelConfigHelper } from '@/provider/modelConfig' -import { providerDbLoader, type ProviderDbRefreshResult } from '@/provider/providerDbLoader' +import { + providerDbLoader, + type ProviderDbRefreshResult, + type ProviderDbBootstrap +} from '@/provider/providerDbLoader' import { ProviderAggregate, type ProviderModel } from '@shared/types/model-db' import { modelCapabilities } from '@/provider/modelCapabilities' import { ProviderHelper } from '@/provider/providerHelper' import { ModelStatusHelper } from '@/provider/modelStatusHelper' import { ProviderModelHelper, - PROVIDER_MODELS_DIR, type ProviderModelRouteMetadata } from '@/provider/providerModelHelper' import { stripDerivedProviderModelFields } from '@/provider/providerModelFacts' @@ -337,8 +337,6 @@ export type ProviderModelResolutionPort = Pick< > export class ProviderSettings implements ProviderSettingsPort { - private userDataPath: string - private currentAppVersion: string private modelConfigHelper: ModelConfigHelper // Model configuration helper private providerHelper: ProviderHelper private modelStatusHelper: ModelStatusHelper @@ -351,12 +349,12 @@ export class ProviderSettings implements ProviderSettingsPort { private readonly privacy: PrivacySettingsPort, private readonly database: ProviderDatabase, private readonly publishEvent: DeepchatEventPublisher, + currentAppVersion: string, + catalogBootstrap: ProviderDbBootstrap, previousAppVersion?: string ) { this.appSettings = settings this.store = new ProviderDbStore(settings, () => this.database.settingsTable) - this.userDataPath = app.getPath('userData') - this.currentAppVersion = app.getVersion() this.providerHelper = new ProviderHelper({ store: this.store, setSetting: this.setSetting.bind(this), @@ -376,14 +374,12 @@ export class ProviderSettings implements ProviderSettingsPort { ) this.providerModelHelper = new ProviderModelHelper({ - userDataPath: this.userDataPath, + createStore: (providerId) => + new ProviderModelDbStore(providerId, () => this.database.settingsTable), setModelStatus: this.modelStatusHelper.setModelStatus.bind(this.modelStatusHelper), deleteModelStatus: this.modelStatusHelper.deleteModelStatus.bind(this.modelStatusHelper), publishEvent: this.publishEvent }) - this.providerModelHelper.setStoreFactory( - (providerId) => new ProviderModelDbStore(providerId, () => this.database.settingsTable) - ) this.providerHelper.setCleanupHooks({ deleteProviderModelStatuses: this.modelStatusHelper.deleteProviderModelStatuses.bind( this.modelStatusHelper @@ -393,10 +389,6 @@ export class ProviderSettings implements ProviderSettingsPort { ) }) - // Initialize built-in ACP agents on first run or version upgrade - // Initialize provider models directory - this.initProviderModelsDir() - // 初始化 Provider DB(外部聚合 JSON,本地内置为兜底) providerDbLoader.subscribeCatalogChanges((change) => { const reason = change.reason === 'loaded' ? 'provider-db-loaded' : 'provider-db-updated' @@ -404,11 +396,12 @@ export class ProviderSettings implements ProviderSettingsPort { this.publishEvent('models.changed', { reason, version: Date.now() }) }) providerDbLoader.setPrivacyModeResolver(() => this.privacy.isEnabled()) + providerDbLoader.configure(catalogBootstrap) providerDbLoader.initialize().catch((error) => { console.warn('[ProviderSettings] Failed to initialize provider DB:', error) }) - if (previousAppVersion !== this.currentAppVersion) { + if (previousAppVersion !== currentAppVersion) { this.migrateConfigData(previousAppVersion) } @@ -444,13 +437,6 @@ export class ProviderSettings implements ProviderSettingsPort { return legacyProviders.length } - private initProviderModelsDir(): void { - const modelsDir = path.join(this.userDataPath, PROVIDER_MODELS_DIR) - if (!fs.existsSync(modelsDir)) { - fs.mkdirSync(modelsDir, { recursive: true }) - } - } - // 提供聚合 Provider DB(只读)给渲染层/其他模块 getProviderDb(): ProviderAggregate | null { return providerDbLoader.getDb() diff --git a/src/main/provider/xaiGrokAuthAdapter.ts b/src/main/provider/xaiGrokAuthAdapter.ts index 847e1aec72..2ebb43ef0c 100644 --- a/src/main/provider/xaiGrokAuthAdapter.ts +++ b/src/main/provider/xaiGrokAuthAdapter.ts @@ -34,8 +34,17 @@ export function createXaiGrokFetch( throw new Error('Refusing to send xAI credentials to an untrusted API endpoint') } + const signal = init?.signal ?? (url instanceof Request ? url.signal : undefined) + signal?.throwIfAborted() const auth = getGlobalXaiGrokAuth() - const oauthToken = await auth.ensureAccessToken().catch(() => null) + const check = auth.captureOperation() + const oauthToken = await auth.ensureAccessToken().catch((error) => { + signal?.throwIfAborted() + if (error instanceof Error && error.name === 'AbortError') throw error + return null + }) + check() + signal?.throwIfAborted() const accessToken = oauthToken || provider.apiKey?.trim() || '' if (!accessToken) { throw new Error('Grok requires xAI OAuth sign-in or an API key') @@ -47,13 +56,18 @@ export function createXaiGrokFetch( } let response = await underlyingFetch(url, nextInit) + signal?.throwIfAborted() if (response.status !== 401 || !oauthToken) { return response } // OAuth token may have been revoked mid-session; force refresh once. try { + check() + signal?.throwIfAborted() const refreshed = await auth.forceRefreshAccessToken() + check() + signal?.throwIfAborted() if (!refreshed || refreshed === accessToken) { return response } @@ -61,7 +75,10 @@ export function createXaiGrokFetch( ...nextInit, headers: applyBearerHeaders(init?.headers, defaultHeaders, refreshed) }) - } catch { + } catch (error) { + check() + signal?.throwIfAborted() + if (error instanceof Error && error.name === 'AbortError') throw error return response } } diff --git a/src/main/remote/channels/weixinIlink/weixinIlinkClient.ts b/src/main/remote/channels/weixinIlink/weixinIlinkClient.ts index 326a09812f..ac45686a67 100644 --- a/src/main/remote/channels/weixinIlink/weixinIlinkClient.ts +++ b/src/main/remote/channels/weixinIlink/weixinIlinkClient.ts @@ -1,5 +1,6 @@ import { createCipheriv, createHash, randomBytes, randomUUID } from 'node:crypto' import fs from 'node:fs/promises' +import { setTimeout as delay } from 'node:timers/promises' type WeixinIlinkQrCodeResponse = { qrcode?: string @@ -247,18 +248,21 @@ const normalizeHttpError = async (response: Response): Promise => { const withTimeout = async ( timeoutMs: number | undefined, - operation: (signal?: AbortSignal) => Promise + operation: (signal?: AbortSignal) => Promise, + parentSignal?: AbortSignal ): Promise => { const normalizedTimeoutMs = typeof timeoutMs === 'number' && Number.isFinite(timeoutMs) && timeoutMs > 0 ? timeoutMs : 0 if (!normalizedTimeoutMs) { - return await operation() + return await operation(parentSignal) } const controller = new AbortController() const timer = setTimeout(() => controller.abort(), normalizedTimeoutMs) try { - return await operation(controller.signal) + return await operation( + parentSignal ? AbortSignal.any([parentSignal, controller.signal]) : controller.signal + ) } finally { clearTimeout(timer) } @@ -267,20 +271,25 @@ const withTimeout = async ( const fetchGetJson = async ( baseUrl: string, endpoint: string, - timeoutMs?: number + timeoutMs?: number, + parentSignal?: AbortSignal ): Promise => { - return await withTimeout(timeoutMs, async (signal) => { - const response = await fetch(new URL(endpoint, ensureTrailingSlash(baseUrl)).toString(), { - method: 'GET', - ...(signal ? { signal } : {}) - }) + return await withTimeout( + timeoutMs, + async (signal) => { + const response = await fetch(new URL(endpoint, ensureTrailingSlash(baseUrl)).toString(), { + method: 'GET', + ...(signal ? { signal } : {}) + }) - if (!response.ok) { - throw new WeixinIlinkApiError(await normalizeHttpError(response), response.status) - } + if (!response.ok) { + throw new WeixinIlinkApiError(await normalizeHttpError(response), response.status) + } - return (await response.json()) as T - }) + return (await response.json()) as T + }, + parentSignal + ) } const fetchPostJson = async (params: { @@ -334,7 +343,9 @@ export class WeixinIlinkClient { static async startLogin(input?: { sessionKey?: string force?: boolean + signal?: AbortSignal }): Promise { + input?.signal?.throwIfAborted() const sessionKey = input?.sessionKey?.trim() || randomUUID() purgeExpiredLogins() @@ -350,8 +361,10 @@ export class WeixinIlinkClient { const response = await fetchGetJson( WEIXIN_ILINK_FIXED_BASE_URL, `ilink/bot/get_bot_qrcode?bot_type=${encodeURIComponent(WEIXIN_ILINK_DEFAULT_BOT_TYPE)}`, - WEIXIN_ILINK_REQUEST_TIMEOUT_MS + WEIXIN_ILINK_REQUEST_TIMEOUT_MS, + input?.signal ) + input?.signal?.throwIfAborted() const qrcode = response.qrcode?.trim() || '' const loginUrl = response.qrcode_img_content?.trim() || '' if (!qrcode || !loginUrl) { @@ -376,7 +389,25 @@ export class WeixinIlinkClient { static async waitForLogin(input: { sessionKey: string timeoutMs?: number + signal?: AbortSignal + }): Promise { + try { + return await this.pollForLogin(input) + } finally { + if (input.signal?.aborted) activeLogins.delete(input.sessionKey) + } + } + + static cancelLogin(sessionKey: string): void { + activeLogins.delete(sessionKey) + } + + private static async pollForLogin(input: { + sessionKey: string + timeoutMs?: number + signal?: AbortSignal }): Promise { + input.signal?.throwIfAborted() purgeExpiredLogins() const login = activeLogins.get(input.sessionKey) if (!login || !isFreshLogin(login)) { @@ -394,14 +425,17 @@ export class WeixinIlinkClient { const deadline = Date.now() + timeoutMs while (Date.now() < deadline) { + input.signal?.throwIfAborted() let response: WeixinIlinkQrStatusResponse try { response = await fetchGetJson( login.currentBaseUrl, `ilink/bot/get_qrcode_status?qrcode=${encodeURIComponent(login.qrcode)}`, - WEIXIN_ILINK_QR_POLL_TIMEOUT_MS + WEIXIN_ILINK_QR_POLL_TIMEOUT_MS, + input.signal ) } catch (error) { + input.signal?.throwIfAborted() if (error instanceof Error && error.name === 'AbortError') { response = { status: 'wait' @@ -411,6 +445,7 @@ export class WeixinIlinkClient { } } + input.signal?.throwIfAborted() switch (response.status) { case 'wait': case 'scaned': @@ -453,7 +488,7 @@ export class WeixinIlinkClient { break } - await new Promise((resolve) => setTimeout(resolve, 1_000)) + await delay(1_000, undefined, { signal: input.signal }) } activeLogins.delete(input.sessionKey) diff --git a/src/main/remote/conversation/runner.ts b/src/main/remote/conversation/runner.ts index 044f60119b..6e8c07e55d 100644 --- a/src/main/remote/conversation/runner.ts +++ b/src/main/remote/conversation/runner.ts @@ -1,4 +1,3 @@ -import { app } from 'electron' import crypto from 'node:crypto' import fs from 'node:fs/promises' import path from 'node:path' @@ -149,8 +148,7 @@ const safeDecodePath = (value: string): string => { } } -const resolveCachedImagePath = (source: string): string => { - const cacheDir = path.join(app.getPath('userData'), 'images') +const resolveCachedImagePath = (source: string, cacheDir: string): string => { const cachePath = safeDecodePath(source.slice(IMGCACHE_URL_PREFIX.length)) const fullPath = path.resolve(cacheDir, cachePath) const relativePath = path.relative(cacheDir, fullPath) @@ -172,7 +170,8 @@ const decodeBase64Image = (value: string, label: string): Buffer => { const resolveGeneratedImageContent = async ( source: string, - fallbackMimeType: string + fallbackMimeType: string, + cacheDirectory: string ): Promise<{ data: Buffer mimeType: string @@ -191,7 +190,7 @@ const resolveGeneratedImageContent = async ( } if (normalizedSource.startsWith(IMGCACHE_URL_PREFIX)) { - const imagePath = resolveCachedImagePath(normalizedSource) + const imagePath = resolveCachedImagePath(normalizedSource, cacheDirectory) return { data: await fs.readFile(imagePath), mimeType: @@ -424,6 +423,7 @@ export type RemoteOpenSessionResult = } type RemoteConversationRunnerDeps = { + profileDirectory: string catalog: RemoteCatalogPort workspace: RemoteWorkspacePort lifecycle: RemoteSessionLifecyclePort @@ -442,7 +442,10 @@ export class RemoteConversationRunner { constructor( private readonly deps: RemoteConversationRunnerDeps, private readonly bindingStore: RemoteBindingStore - ) {} + ) { + if (!path.isAbsolute(deps.profileDirectory)) + throw new Error('Remote profile directory must be absolute') + } async createNewSession( endpointKey: string, @@ -805,8 +808,8 @@ export class RemoteConversationRunner { return currentSession?.agentId ?? (await this.deps.resolveDefaultAgentId()) } - private getGlobalDefaultWorkdir(): string | null { - const projectDir = this.deps.workspace.getDefaultProjectPath() + private async getGlobalDefaultWorkdir(): Promise { + const projectDir = await this.deps.workspace.getDefaultProjectPath() const normalized = projectDir?.trim() return normalized ? normalized : null } @@ -882,7 +885,7 @@ export class RemoteConversationRunner { return path.join(workspace, REMOTE_ASSET_ROOT) } - return path.join(app.getPath('userData'), REMOTE_GENERATED_ASSET_ROOT) + return path.join(this.deps.profileDirectory, REMOTE_GENERATED_ASSET_ROOT) } private async prepareRemoteAttachments( @@ -1221,7 +1224,11 @@ export class RemoteConversationRunner { const assets: RemoteGeneratedImageAsset[] = [] for (const [candidateIndex, candidate] of imageCandidates.entries()) { try { - const imageContent = await resolveGeneratedImageContent(candidate.data, candidate.mimeType) + const imageContent = await resolveGeneratedImageContent( + candidate.data, + candidate.mimeType, + path.join(this.deps.profileDirectory, 'images') + ) const filenameBase = sanitizePathSegment( candidate.filenameBase, `generated-${candidateIndex + 1}` diff --git a/src/main/remote/index.ts b/src/main/remote/index.ts index 9161a7f520..a113c276c3 100644 --- a/src/main/remote/index.ts +++ b/src/main/remote/index.ts @@ -1,6 +1,7 @@ -import { BrowserWindow } from 'electron' import { randomBytes } from 'node:crypto' import * as http from 'node:http' +import { setTimeout as delay } from 'node:timers/promises' +import { finished } from 'node:stream/promises' import logger from '@shared/logger' import type { ChannelSettingsMap, @@ -57,7 +58,7 @@ import { import type { ChannelAdapterConfig } from './runtime/types' import { resolveAcpAgentAlias } from '@shared/utils/acpAgentAlias' import { REMOTE_CONTROL_ERROR_MESSAGES } from '@shared/contracts/remoteControlErrors' -import type { RemoteServiceDeps } from './ports' +import type { RemoteAuthWindowEvent, RemoteServiceDeps } from './ports' import { RemoteBindingStore } from './binding/store' import { RemoteConversationRunner } from './conversation/runner' import { TelegramClient } from './channels/telegram/telegramClient' @@ -75,7 +76,6 @@ import { fetchFeishuOAuthUserInfo, pollFeishuPersonalAgentRegistration, readFeishuRegistrationString, - resolveFeishuAuthDomains, startFeishuPersonalAgentRegistration } from './channels/feishu/feishuAuth' import { WeixinIlinkClient } from './channels/weixinIlink/weixinIlinkClient' @@ -129,7 +129,9 @@ type FeishuAuthSessionState = { authUrl: string expiresAt: number server: http.Server | null - window: BrowserWindow | null + startup: Promise | null + cleanup: Promise | null + callbacks: Set> cleanupTimer: NodeJS.Timeout | null abortController: AbortController resolve: (result: FeishuAuthResult) => void @@ -220,8 +222,11 @@ export class RemoteService { private runtimeOperation: Promise = Promise.resolve() private readonly feishuAuthSessions = new Map() private readonly feishuInstallSessions = new Map() - private weixinIlinkLoginWindow: BrowserWindow | null = null - private weixinIlinkLoginWindowUrl: string | null = null + private weixinIlinkLoginWindowId: string | null = null + private authController = new AbortController() + private readonly authTasks = new Set>() + private stopping: Promise | null = null + private readonly weixinLoginSessions = new Set() private readonly weixinIlinkLoginWaits = new Map>() private readonly deliveryErrorNotifiedAt = new Map() private readonly deliveryErrorNotificationInFlight = new Set() @@ -236,6 +241,12 @@ export class RemoteService { } async initialize(): Promise { + await this.stopping + if (this.authController.signal.aborted) { + if (this.authTasks.size) throw new Error('Remote authorization is still draining') + this.authController = new AbortController() + } + this.stopping = null await this.enqueueRuntimeOperation(async () => { await Promise.all([ this.rebuildTelegramRuntime(), @@ -248,17 +259,48 @@ export class RemoteService { } async destroy(): Promise { - await this.enqueueRuntimeOperation(async () => { - await this.channelManager.unregisterAll() - }) - for (const sessionKey of Array.from(this.feishuAuthSessions.keys())) { - await this.cancelFeishuAuth(sessionKey) + if (this.stopping) return await this.stopping + this.authController.abort() + this.stopping = this.stopRuntime() + await this.stopping + } + + private async stopRuntime(): Promise { + for (const session of this.feishuAuthSessions.values()) { + this.completeFeishuAuthSession( + session, + createFeishuAuthResult({ + authorized: false, + messageKey: 'settings.remote.feishu.authCancelled' + }) + ) } - for (const sessionKey of Array.from(this.feishuInstallSessions.keys())) { - await this.cancelFeishuInstall(sessionKey) + for (const session of this.feishuInstallSessions.values()) { + this.completeFeishuInstallSession( + session, + createFeishuInstallResult({ + installed: false, + messageKey: 'settings.remote.feishu.installCancelled' + }) + ) + } + try { + await this.enqueueRuntimeOperation(async () => { + await this.channelManager.unregisterAll() + }) + } finally { + const closed = await Promise.allSettled([ + ...Array.from(this.feishuAuthSessions.keys(), (key) => this.cancelFeishuAuth(key)), + ...Array.from(this.feishuInstallSessions.keys(), (key) => this.cancelFeishuInstall(key)), + this.closeWeixinIlinkLoginWindow() + ]) + while (this.authTasks.size) await Promise.allSettled(Array.from(this.authTasks)) + for (const sessionKey of this.weixinLoginSessions) WeixinIlinkClient.cancelLogin(sessionKey) + this.weixinLoginSessions.clear() + this.weixinIlinkLoginWaits.clear() + const failure = closed.find((result) => result.status === 'rejected') + if (failure?.status === 'rejected') throw failure.reason } - this.weixinIlinkLoginWaits.clear() - this.closeWeixinIlinkLoginWindow() } buildTelegramSettingsSnapshot(): TelegramRemoteSettings { @@ -666,10 +708,22 @@ export class RemoteService { } async startFeishuAuth(input: FeishuAuthStartInput = {}): Promise { + const signal = this.authController.signal + signal.throwIfAborted() + return await this.retainAuthTask( + this.enqueueRuntimeOperation(() => this.beginFeishuAuth(input, signal)) + ) + } + + private async beginFeishuAuth( + input: FeishuAuthStartInput, + signal: AbortSignal + ): Promise { this.pruneExpiredFeishuAuthSessions() for (const existingSessionKey of Array.from(this.feishuAuthSessions.keys())) { await this.cancelFeishuAuth(existingSessionKey) } + signal.throwIfAborted() const currentConfig = this.bindingStore.getFeishuConfig() const brand = input.brand === 'lark' ? 'lark' : currentConfig.brand @@ -709,7 +763,9 @@ export class RemoteService { authUrl, expiresAt, server: null, - window: null, + startup: null, + cleanup: null, + callbacks: new Set(), cleanupTimer: null, abortController: new AbortController(), resolve: resolveResult, @@ -720,21 +776,40 @@ export class RemoteService { this.feishuAuthSessions.set(sessionKey, session) try { - session.server = await this.startFeishuAuthCallbackServer(session) - session.cleanupTimer = setTimeout(() => { - this.completeFeishuAuthSession( - session, - createFeishuAuthResult({ - authorized: false, - messageKey: 'settings.remote.feishu.authTimeout' - }) - ) - this.feishuAuthSessions.delete(session.sessionKey) - }, FEISHU_AUTH_SESSION_TTL_MS) - this.openFeishuAuthWindow(session) + session.startup = (async () => { + session.server = await this.startFeishuAuthCallbackServer(session) + if (session.completed || signal.aborted) return + session.cleanupTimer = setTimeout(() => { + this.completeFeishuAuthSession( + session, + createFeishuAuthResult({ + authorized: false, + messageKey: 'settings.remote.feishu.authTimeout' + }) + ) + this.feishuAuthSessions.delete(session.sessionKey) + }, FEISHU_AUTH_SESSION_TTL_MS) + await this.deps.authWindows.open({ + id: `feishu:${session.sessionKey}`, + kind: 'feishu', + url: session.authUrl, + brand: session.brand, + redirectUri: session.redirectUri + }) + })() + await session.startup + signal.throwIfAborted() + if (session.completed) throw new Error('Feishu authorization was cancelled') } catch (error) { this.feishuAuthSessions.delete(sessionKey) - this.cleanupFeishuAuthSession(session) + this.completeFeishuAuthSession( + session, + createFeishuAuthResult({ + authorized: false, + messageKey: 'settings.remote.feishu.authFailed' + }) + ) + await this.cleanupFeishuAuthSession(session) throw error } @@ -802,9 +877,22 @@ export class RemoteService { }) ) this.feishuAuthSessions.delete(session.sessionKey) + await this.cleanupFeishuAuthSession(session) } async startFeishuInstall(input: FeishuInstallStartInput = {}): Promise { + const signal = this.authController.signal + signal.throwIfAborted() + return await this.retainAuthTask( + this.enqueueRuntimeOperation(() => this.beginFeishuInstall(input, signal)) + ) + } + + private async beginFeishuInstall( + input: FeishuInstallStartInput, + signal: AbortSignal + ): Promise { + signal.throwIfAborted() this.pruneExpiredFeishuInstallSessions() for (const existingSessionKey of Array.from(this.feishuInstallSessions.keys())) { await this.cancelFeishuInstall(existingSessionKey) @@ -813,7 +901,10 @@ export class RemoteService { const requestedBrand = input.brand === 'lark' ? 'lark' : this.bindingStore.getFeishuConfig().brand const abortController = new AbortController() - const registration = await startFeishuPersonalAgentRegistration(abortController.signal) + const registration = await startFeishuPersonalAgentRegistration( + AbortSignal.any([signal, abortController.signal]) + ) + signal.throwIfAborted() const sessionKey = randomBytes(16).toString('hex') const expiresAt = Date.now() + registration.expireInSec * 1000 const intervalMs = Math.max(registration.intervalSec * 1000, 3_000) @@ -882,7 +973,7 @@ export class RemoteService { if (!session.polling) { session.polling = true - void this.pollFeishuInstallUntilComplete(session) + void this.retainAuthTask(this.pollFeishuInstallUntilComplete(session)).catch(() => undefined) } const timeoutMs = Math.min( input.timeoutMs ?? FEISHU_INSTALL_DEFAULT_WAIT_TIMEOUT_MS, @@ -1125,10 +1216,26 @@ export class RemoteService { } async startWeixinIlinkLogin(input?: { force?: boolean }): Promise { + const signal = this.authController.signal + signal.throwIfAborted() + return await this.retainAuthTask( + this.enqueueRuntimeOperation(() => this.beginWeixinIlinkLogin(input, signal)) + ) + } + + private async beginWeixinIlinkLogin( + input: { force?: boolean } | undefined, + signal: AbortSignal + ): Promise { + signal.throwIfAborted() const result = await WeixinIlinkClient.startLogin({ - force: input?.force + force: input?.force, + signal }) - this.openWeixinIlinkLoginWindow(result.loginUrl) + this.weixinLoginSessions.add(result.sessionKey) + if (signal.aborted) WeixinIlinkClient.cancelLogin(result.sessionKey) + signal.throwIfAborted() + await this.openWeixinIlinkLoginWindow(result.sessionKey, result.loginUrl, signal) return { sessionKey: result.sessionKey, loginUrl: result.loginUrl, @@ -1141,6 +1248,8 @@ export class RemoteService { sessionKey: string timeoutMs?: number }): Promise { + const signal = this.authController.signal + signal.throwIfAborted() const sessionKey = input.sessionKey.trim() if (!sessionKey) { return { @@ -1156,11 +1265,15 @@ export class RemoteService { } const waitPromise = (async () => { + const windowId = this.weixinIlinkLoginWindowId const result = await WeixinIlinkClient.waitForLogin({ ...input, - sessionKey + sessionKey, + signal }) - this.closeWeixinIlinkLoginWindow() + signal.throwIfAborted() + if (windowId === this.weixinIlinkLoginWindowId) await this.closeWeixinIlinkLoginWindow() + signal.throwIfAborted() if (!result.connected || !result.accountId || !result.ownerUserId || !result.botToken) { return { connected: false, @@ -1195,12 +1308,14 @@ export class RemoteService { messageKey: result.messageKey } })().finally(() => { + this.weixinLoginSessions.delete(sessionKey) if (this.weixinIlinkLoginWaits.get(sessionKey) === waitPromise) { this.weixinIlinkLoginWaits.delete(sessionKey) } }) this.weixinIlinkLoginWaits.set(sessionKey, waitPromise) + this.retainAuthTask(waitPromise) return await waitPromise } @@ -2048,7 +2163,7 @@ export class RemoteService { const error = readFeishuRegistrationString(data, 'error') if (error) { if (error === 'authorization_pending' || error === 'slow_down') { - await this.delayFeishuInstallPoll(session.intervalMs) + await this.delayFeishuInstallPoll(session.intervalMs, session.abortController.signal) continue } @@ -2137,7 +2252,7 @@ export class RemoteService { return } - await this.delayFeishuInstallPoll(session.intervalMs) + await this.delayFeishuInstallPoll(session.intervalMs, session.abortController.signal) } if (!session.completed) { @@ -2151,8 +2266,12 @@ export class RemoteService { } } - private delayFeishuInstallPoll(ms: number): Promise { - return new Promise((resolve) => setTimeout(resolve, ms)) + private async delayFeishuInstallPoll(ms: number, signal: AbortSignal): Promise { + try { + await delay(ms, undefined, { signal }) + } catch (error) { + if (!signal.aborted) throw error + } } private completeFeishuInstallSession( @@ -2221,8 +2340,22 @@ export class RemoteService { } const server = http.createServer((request, response) => { - void this.handleFeishuAuthCallback(session, request, response) + const pending = (async () => { + try { + await this.handleFeishuAuthCallback(session, request, response) + } finally { + if (!response.writableEnded) response.end() + await finished(response, { cleanup: true }).catch(() => undefined) + } + })() + session.callbacks.add(pending) + const remove = () => session.callbacks.delete(pending) + void pending.then(remove, remove) + void this.retainAuthTask(pending).catch(() => { + if (!response.writableEnded) response.end() + }) }) + session.server = server await new Promise((resolve, reject) => { server.once('error', reject) @@ -2383,11 +2516,17 @@ export class RemoteService { } session.completed = true - this.cleanupFeishuAuthSession(session) - session.resolve(result) + void this.cleanupFeishuAuthSession(session).then( + () => session.resolve(result), + (error) => { + logger.warn('[RemoteService] Failed to close Feishu authorization.', { error }) + session.resolve(result) + } + ) } - private cleanupFeishuAuthSession(session: FeishuAuthSessionState): void { + private cleanupFeishuAuthSession(session: FeishuAuthSessionState): Promise { + if (session.cleanup) return session.cleanup if (session.cleanupTimer) { clearTimeout(session.cleanupTimer) session.cleanupTimer = null @@ -2397,15 +2536,33 @@ export class RemoteService { session.abortController.abort() } - if (session.server) { - session.server.close() - session.server = null - } - - if (session.window && !session.window.isDestroyed()) { - session.window.close() - } - session.window = null + session.cleanup = this.retainAuthTask( + (async () => { + await session.startup?.catch(() => undefined) + const server = session.server + session.server = null + const closed = server + ? new Promise((resolve, reject) => { + server.close((error) => { + if (error && (error as NodeJS.ErrnoException).code !== 'ERR_SERVER_NOT_RUNNING') + reject(error) + else resolve() + }) + }) + : Promise.resolve() + const callbacks = (async () => { + while (session.callbacks.size) await Promise.allSettled(Array.from(session.callbacks)) + // Partial HTTP headers are not active callbacks and must not retain the loopback server. + server?.closeAllConnections() + })() + await Promise.all([ + closed, + callbacks, + this.deps.authWindows.close(`feishu:${session.sessionKey}`) + ]) + })() + ) + return session.cleanup } private pruneExpiredFeishuAuthSessions(): void { @@ -2426,140 +2583,54 @@ export class RemoteService { } } - private isAllowedFeishuAuthNavigation( - url: string, - brand: 'feishu' | 'lark', - redirectUri: string - ): boolean { - try { - const parsed = new URL(url) - const redirect = new URL(redirectUri) - const domains = resolveFeishuAuthDomains(brand) - const accountsHost = new URL(domains.accountsBaseUrl).host - const openHost = new URL(domains.openBaseUrl).host - const isAuthHost = - parsed.protocol === 'https:' && (parsed.host === accountsHost || parsed.host === openHost) - const isRedirectHost = - parsed.protocol === redirect.protocol && - parsed.host === redirect.host && - parsed.pathname === redirect.pathname - return isAuthHost || isRedirectHost - } catch { - return false - } - } - - private openFeishuAuthWindow(session: FeishuAuthSessionState): void { - const parentWindow = BrowserWindow.getFocusedWindow() ?? BrowserWindow.getAllWindows()[0] - const loginWindow = new BrowserWindow({ - width: 480, - height: 760, - minWidth: 420, - minHeight: 680, - autoHideMenuBar: true, - title: 'Feishu / Lark Authorization', - ...(parentWindow ? { parent: parentWindow } : {}), - webPreferences: { - nodeIntegration: false, - contextIsolation: true, - webSecurity: true - } - }) - - loginWindow.webContents.on('will-navigate', (event, url) => { - if (!this.isAllowedFeishuAuthNavigation(url, session.brand, session.redirectUri)) { - event.preventDefault() - } - }) - loginWindow.webContents.setWindowOpenHandler(({ url }) => { - if (this.isAllowedFeishuAuthNavigation(url, session.brand, session.redirectUri)) { - void loginWindow.loadURL(url) - } - return { action: 'deny' } - }) - loginWindow.on('closed', () => { - if (session.window === loginWindow && !session.completed) { - this.completeFeishuAuthSession( - session, - createFeishuAuthResult({ - authorized: false, - messageKey: 'settings.remote.feishu.authCancelled' - }) - ) - } - if (session.window === loginWindow) { - session.window = null - } - }) - - void loginWindow.loadURL(session.authUrl) - loginWindow.show() - loginWindow.focus() - session.window = loginWindow - } - - private openWeixinIlinkLoginWindow(loginUrl: string | null | undefined): void { - const normalizedLoginUrl = loginUrl?.trim() - if (!normalizedLoginUrl) { - return + handleAuthWindowEvent(event: RemoteAuthWindowEvent): void { + if (event.id.startsWith('feishu:')) { + const session = this.feishuAuthSessions.get(event.id.slice('feishu:'.length)) + if (!session || session.completed) return + this.completeFeishuAuthSession( + session, + createFeishuAuthResult({ + authorized: false, + messageKey: + event.type === 'closed' + ? 'settings.remote.feishu.authCancelled' + : 'settings.remote.feishu.authFailed' + }) + ) + } else if (event.id === this.weixinIlinkLoginWindowId && event.type === 'closed') { + this.weixinIlinkLoginWindowId = null } + } - if ( - this.weixinIlinkLoginWindow && - !this.weixinIlinkLoginWindow.isDestroyed() && - this.weixinIlinkLoginWindowUrl === normalizedLoginUrl - ) { - this.weixinIlinkLoginWindow.show() - this.weixinIlinkLoginWindow.focus() - return + private async openWeixinIlinkLoginWindow( + sessionKey: string, + loginUrl: string | null | undefined, + signal: AbortSignal + ): Promise { + const url = loginUrl?.trim() + if (!url) return + const id = `weixin-ilink:${sessionKey}` + if (this.weixinIlinkLoginWindowId !== id) await this.closeWeixinIlinkLoginWindow() + this.weixinIlinkLoginWindowId = id + await this.deps.authWindows.open({ id, kind: 'weixin-ilink', url }) + if (signal.aborted || this.weixinIlinkLoginWindowId !== id) { + await this.deps.authWindows.close(id) + signal.throwIfAborted() + throw new Error('Weixin authorization was superseded') } - - this.closeWeixinIlinkLoginWindow() - - const parentWindow = BrowserWindow.getFocusedWindow() ?? BrowserWindow.getAllWindows()[0] - const loginWindow = new BrowserWindow({ - width: 420, - height: 760, - minWidth: 380, - minHeight: 680, - autoHideMenuBar: true, - title: 'WeChat iLink Login', - ...(parentWindow ? { parent: parentWindow } : {}), - webPreferences: { - nodeIntegration: false, - contextIsolation: true, - webSecurity: true - } - }) - - loginWindow.webContents.setWindowOpenHandler(({ url }) => { - void loginWindow.loadURL(url) - return { action: 'deny' } - }) - loginWindow.on('closed', () => { - if (this.weixinIlinkLoginWindow === loginWindow) { - this.weixinIlinkLoginWindow = null - this.weixinIlinkLoginWindowUrl = null - } - }) - - void loginWindow.loadURL(normalizedLoginUrl) - loginWindow.show() - loginWindow.focus() - this.weixinIlinkLoginWindow = loginWindow - this.weixinIlinkLoginWindowUrl = normalizedLoginUrl } - private closeWeixinIlinkLoginWindow(): void { - if (!this.weixinIlinkLoginWindow || this.weixinIlinkLoginWindow.isDestroyed()) { - this.weixinIlinkLoginWindow = null - this.weixinIlinkLoginWindowUrl = null - return - } + private async closeWeixinIlinkLoginWindow(): Promise { + const id = this.weixinIlinkLoginWindowId + this.weixinIlinkLoginWindowId = null + if (id) await this.deps.authWindows.close(id) + } - this.weixinIlinkLoginWindow.close() - this.weixinIlinkLoginWindow = null - this.weixinIlinkLoginWindowUrl = null + private retainAuthTask(pending: Promise): Promise { + this.authTasks.add(pending) + const remove = () => this.authTasks.delete(pending) + void pending.then(remove, remove) + return pending } private notifyChannelDeliveryError( @@ -2605,6 +2676,7 @@ export class RemoteService { private createConversationRunner(channel: RemoteChannel): RemoteConversationRunner { return new RemoteConversationRunner( { + profileDirectory: this.deps.profileDirectory, catalog: this.deps.catalog, workspace: this.deps.workspace, lifecycle: this.deps.lifecycle, diff --git a/src/main/remote/ports.ts b/src/main/remote/ports.ts index 1b551fedd5..56c9303e73 100644 --- a/src/main/remote/ports.ts +++ b/src/main/remote/ports.ts @@ -56,7 +56,7 @@ export interface RemoteCatalogPort { } export interface RemoteWorkspacePort { - getDefaultProjectPath(): string | null + getDefaultProjectPath(): Promise prepareFile(filePath: string, type?: string): Promise } @@ -73,7 +73,20 @@ export interface RemoteNotificationPort { }): Promise } +export type RemoteAuthWindowInput = + | { id: string; kind: 'feishu'; url: string; brand: 'feishu' | 'lark'; redirectUri: string } + | { id: string; kind: 'weixin-ilink'; url: string } + +export type RemoteAuthWindowEvent = { id: string; type: 'closed' | 'error' } + +export interface RemoteAuthWindowPort { + open(input: RemoteAuthWindowInput): Promise + close(id: string): Promise +} + export interface RemoteServiceDeps { + profileDirectory: string + authWindows: RemoteAuthWindowPort settings: Pick catalog: RemoteCatalogPort workspace: RemoteWorkspacePort @@ -91,6 +104,7 @@ export interface RemoteRuntimeLifecycle { } export interface RemoteServiceLike extends RemoteServicePort, RemoteRuntimeLifecycle { + handleAuthWindowEvent(event: RemoteAuthWindowEvent): void deliverCronJobResult(input: { job: CronJob run: CronJobRun diff --git a/src/main/remote/runtime/adapter.ts b/src/main/remote/runtime/adapter.ts index 4b2e26a498..d89902b88d 100644 --- a/src/main/remote/runtime/adapter.ts +++ b/src/main/remote/runtime/adapter.ts @@ -1,16 +1,11 @@ -import path from 'node:path' import { EventEmitter } from 'node:events' -import { net } from 'electron' import logger from '@shared/logger' import { - CHANNEL_MAX_FILE_SIZE_BYTES, type ChannelAdapterConfig, type ChannelLogEntry, type ChannelLogLevel, type ChannelStatusSnapshot, - type FileAttachment, type IChannelAdapter, - type ImageAttachment, type SendMessageOptions } from './types' @@ -196,79 +191,4 @@ export abstract class ChannelAdapter extends EventEmitter implements IChannelAda this.emit('log', entry) } - protected async downloadImageAsBase64(url: string): Promise { - const response = await this.fetchBinaryAttachment(url) - if (!response) { - return null - } - - return { - data: response.data, - media_type: response.mediaType - } - } - - protected async downloadFileAsBase64( - url: string, - filename: string - ): Promise { - const response = await this.fetchBinaryAttachment(url) - if (!response) { - return null - } - - return { - filename: filename.trim() || path.basename(new URL(url).pathname) || 'attachment', - data: response.data, - media_type: response.mediaType, - size: response.size - } - } - - private async fetchBinaryAttachment(url: string): Promise<{ - data: string - mediaType: string - size: number - } | null> { - const response = await net.fetch(url) - if (!response.ok) { - this.emitLog('warn', 'Failed to download channel attachment.', { - url, - status: response.status - }) - return null - } - - const contentLength = response.headers.get('content-length') - const declaredSize = - typeof contentLength === 'string' && contentLength.trim() - ? Number.parseInt(contentLength, 10) - : Number.NaN - - if (Number.isFinite(declaredSize) && declaredSize > CHANNEL_MAX_FILE_SIZE_BYTES) { - this.emitLog('warn', 'Skipped oversized channel attachment.', { - url, - size: declaredSize, - limit: CHANNEL_MAX_FILE_SIZE_BYTES - }) - return null - } - - const arrayBuffer = await response.arrayBuffer() - const buffer = Buffer.from(arrayBuffer) - if (buffer.byteLength > CHANNEL_MAX_FILE_SIZE_BYTES) { - this.emitLog('warn', 'Skipped oversized channel attachment.', { - url, - size: buffer.byteLength, - limit: CHANNEL_MAX_FILE_SIZE_BYTES - }) - return null - } - - return { - data: buffer.toString('base64'), - mediaType: response.headers.get('content-type')?.trim() || 'application/octet-stream', - size: buffer.byteLength - } - } } diff --git a/src/main/remote/runtime/types.ts b/src/main/remote/runtime/types.ts index 2f388ec65e..29f4428a8d 100644 --- a/src/main/remote/runtime/types.ts +++ b/src/main/remote/runtime/types.ts @@ -2,7 +2,6 @@ import { EventEmitter } from 'node:events' import { z } from 'zod' import type { RemoteRuntimeState } from '@shared/types/remote' -export const CHANNEL_MAX_FILE_SIZE_BYTES = 20 * 1024 * 1024 export const CHANNEL_PLUGIN_SCHEMA_VERSION = 1 export const CHANNEL_PLUGIN_API_VERSION = 1 diff --git a/src/main/routes/index.ts b/src/main/routes/index.ts index 8ecdd8cea9..d91f72daca 100644 --- a/src/main/routes/index.ts +++ b/src/main/routes/index.ts @@ -32,6 +32,7 @@ export type RouteDispatcher = { export interface MainKernelAppDatabaseMaintenancePort { assertRouteAllowed(routeName: string): void + runRequest(routeName: string, run: () => Promise): Promise } export function createRouteDispatcher(deps: { @@ -193,8 +194,9 @@ async function runTrackedRouteTask( visibleId: trackedTask.visibleId, dedupeKey: trackedTask.dedupeKey, runId: coordinator.getRunId(trackedTask.target), - run: async () => { - return await action() + run: async ({ signal }) => { + signal.throwIfAborted() + return await dispatcher.appDatabaseMaintenance.runRequest(routeName, action) } }) } @@ -205,16 +207,20 @@ export async function dispatchDeepchatRoute( rawInput: unknown, context: RouteContext ): Promise { - dispatcher.appDatabaseMaintenance.assertRouteAllowed(routeName) if (!hasDeepchatRouteContract(routeName)) { throw new Error(`Unknown deepchat route: ${routeName}`) } const registeredRoute = dispatcher.routeRegistry.get(routeName) if (registeredRoute) { - return await runTrackedRouteTask(dispatcher, routeName, context, async () => { - return await registeredRoute(rawInput, context) - }) + return await dispatcher.appDatabaseMaintenance.runRequest(routeName, () => + runTrackedRouteTask( + dispatcher, + routeName, + context, + async () => await registeredRoute(rawInput, context) + ) + ) } throw new Error(`Unhandled deepchat route: ${routeName}`) diff --git a/src/main/scheduler/data/database.ts b/src/main/scheduler/data/database.ts index 8988f73749..113d29018c 100644 --- a/src/main/scheduler/data/database.ts +++ b/src/main/scheduler/data/database.ts @@ -3,26 +3,13 @@ import { CronJobDeliveriesTable } from './tables/cronJobDeliveries' import { CronJobsTable } from './tables/cronJobs' import { CronJobRunsTable } from './tables/cronJobRuns' -interface SchedulerDatabaseConnectionProvider extends DatabaseConnectionProvider { - getDatabasePath(): string - getDatabasePassword(): string | undefined -} - export class SchedulerDatabase { - constructor(private readonly connection: SchedulerDatabaseConnectionProvider) {} + constructor(private readonly connection: DatabaseConnectionProvider) {} getDatabase() { return this.connection.getDatabase() } - getDatabasePath(): string { - return this.connection.getDatabasePath() - } - - getDatabasePassword(): string | undefined { - return this.connection.getDatabasePassword() - } - get cronJobsTable(): CronJobsTable { return new CronJobsTable(this.getDatabase()) } diff --git a/src/main/scheduler/index.ts b/src/main/scheduler/index.ts index 4d330d8912..09753829b0 100644 --- a/src/main/scheduler/index.ts +++ b/src/main/scheduler/index.ts @@ -1,4 +1,3 @@ -import type { PowerMonitor } from 'electron' import { CRON_JOBS_DEFAULT_DELIVERY as DEFAULT_DELIVERY, CRON_JOBS_DEFAULT_RUNTIME as DEFAULT_RUNTIME, @@ -21,10 +20,10 @@ import { CronJobDeliveryRouter, type CronJobRemoteDeliveryPort } from './deliver import { CronJobsRepository } from './repository' import { CronJobRunExecutor, type CronJobRunSessionStarter } from './runExecutor' import { CronJobRuntimeResolver } from './runtimeResolver' -import { +import type { SchedulerProcessManager, - type SchedulerProcessManagerDeps, - type SchedulerRunDueEvent + SchedulerProcessManagerDeps, + SchedulerRunDueEvent } from './schedulerProcessManager' export type CronJobsUpsertInput = z.input @@ -38,14 +37,12 @@ export interface SchedulerServiceDeps { remoteDeliveryPort: CronJobRemoteDeliveryPort sessionEvents: SessionRuntimeEventPort agentSettings: Pick - schedulerManager?: SchedulerProcessManager scheduleService?: CronExpressionService runtimeResolver?: CronJobRuntimeResolver deliveryRouter?: CronJobDeliveryRouter - createSchedulerManager?: ( + createSchedulerManager: ( deps: Omit ) => SchedulerProcessManager - powerMonitor?: Pick } export class SchedulerService { @@ -56,10 +53,7 @@ export class SchedulerService { private readonly runtimeResolver: CronJobRuntimeResolver private readonly runExecutor: CronJobRunExecutor private started = false - private powerMonitor: Pick | null = null - private readonly resumeHandler = () => { - void this.reconcileScheduler('system-resume') - } + private lifecycleGeneration = 0 constructor(deps: SchedulerServiceDeps) { this.repository = new CronJobsRepository(deps.database) @@ -74,18 +68,13 @@ export class SchedulerService { deps.sessionEvents ) const managerDeps: Omit = { - dbPath: deps.database.getDatabasePath(), - dbPassword: deps.database.getDatabasePassword(), getSnapshot: () => this.repository.getSchedulerSnapshot(), + queueDueRuns: () => this.repository.queueDueRuns(), onRunDue: async (event) => { await this.processDueRun(event) } } - this.schedulerManager = - deps.schedulerManager ?? - deps.createSchedulerManager?.(managerDeps) ?? - new SchedulerProcessManager(managerDeps) - this.powerMonitor = deps.powerMonitor ?? null + this.schedulerManager = deps.createSchedulerManager(managerDeps) } start(): void { @@ -93,20 +82,25 @@ export class SchedulerService { return } this.started = true + this.lifecycleGeneration++ this.failStaleRunningRuns() - void this.attachPowerMonitor() void this.reconcileScheduler('startup') } async stop(): Promise { this.started = false - if (this.powerMonitor) { - this.powerMonitor.off('resume', this.resumeHandler) - this.powerMonitor = null - } + this.lifecycleGeneration++ await this.schedulerManager.stop('app-quit') } + async handleSystemResume(): Promise { + if (!this.started) return + const generation = this.lifecycleGeneration + await this.reconcileStoredSchedules(Date.now(), generation) + if (!this.started || generation !== this.lifecycleGeneration) return + await this.schedulerManager.reconcile('system-resume') + } + async destroy(): Promise { await this.stop() this.runExecutor.dispose() @@ -250,23 +244,6 @@ export class SchedulerService { return this.scheduleService.preview(input.cronExpr, input.timezone, input.count, input.from) } - private async attachPowerMonitor(): Promise { - if (this.powerMonitor) { - this.powerMonitor.off('resume', this.resumeHandler) - this.powerMonitor.on('resume', this.resumeHandler) - return - } - - try { - const { powerMonitor } = await import('electron') - this.powerMonitor = powerMonitor - powerMonitor.off('resume', this.resumeHandler) - powerMonitor.on('resume', this.resumeHandler) - } catch (error) { - console.warn('[CronJobs] Failed to attach power monitor resume handler:', error) - } - } - private failStaleRunningRuns(): void { const failedCount = this.repository.markRunningRunsFailed( 'Cron job runner stopped before completion.' @@ -406,9 +383,14 @@ export class SchedulerService { } } - private async reconcileStoredSchedules(now: number): Promise { + private async reconcileStoredSchedules(now: number, resumeGeneration?: number): Promise { for (const job of this.repository.listJobs()) { const state = await this.computeJobState(job, now, false) + if ( + resumeGeneration !== undefined && + (!this.started || resumeGeneration !== this.lifecycleGeneration) + ) + return if ( job.enabled === state.enabled && job.status === state.status && diff --git a/src/main/scheduler/repository.ts b/src/main/scheduler/repository.ts index 99626dc7e5..dd92fd6d2a 100644 --- a/src/main/scheduler/repository.ts +++ b/src/main/scheduler/repository.ts @@ -16,6 +16,8 @@ import type { SchedulerDatabase } from './data/database' import type { CronJobDeliveryRow } from './data/tables/cronJobDeliveries' import type { CronJobRow } from './data/tables/cronJobs' import type { CronJobRunRow } from './data/tables/cronJobRuns' +import { randomUUID } from 'node:crypto' +import { CronExpressionService } from './cronExpressionService' export type CronJobUpsertInput = z.input & { now?: number @@ -26,7 +28,16 @@ export interface CronJobsSchedulerSnapshot { nextRunAt: number | null } +export interface SchedulerRunDueEvent { + jobId: string + runId: string + scheduledAt: number + reason: CronJobRunReason +} + export class CronJobsRepository { + private readonly scheduleService = new CronExpressionService() + constructor(private readonly database: SchedulerDatabase) {} listJobs(): CronJob[] { @@ -108,6 +119,59 @@ export class CronJobsRepository { } } + queueDueRuns(now = Date.now()): SchedulerRunDueEvent[] { + const db = this.database.getDatabase() + return db.transaction(() => { + const rows = db + .prepare( + `SELECT id, cron_expr, timezone, next_run_at, misfire_policy, max_catch_up_runs + FROM cron_jobs + WHERE enabled = 1 AND status = 'ready' AND agent_id IS NOT NULL + AND task_prompt != '' AND next_run_at IS NOT NULL AND next_run_at <= ? + ORDER BY next_run_at ASC, id ASC + LIMIT 100` + ) + .all(now) as Pick< + CronJobRow, + 'id' | 'cron_expr' | 'timezone' | 'next_run_at' | 'misfire_policy' | 'max_catch_up_runs' + >[] + return rows.flatMap((row) => { + const reconciliation = this.scheduleService.reconcileDueRun( + { + cronExpr: row.cron_expr, + timezone: row.timezone, + misfirePolicy: row.misfire_policy, + maxCatchUpRuns: row.max_catch_up_runs + }, + row.next_run_at!, + now + ) + const events: SchedulerRunDueEvent[] = [] + for (const scheduledAt of reconciliation.scheduledAts) { + const runId = randomUUID() + const result = db + .prepare( + `INSERT OR IGNORE INTO cron_job_runs ( + id, job_id, scheduled_at, queued_at, started_at, completed_at, + status, reason, error, created_at, updated_at + ) VALUES (?, ?, ?, ?, NULL, NULL, 'queued', 'scheduled', NULL, ?, ?)` + ) + .run(runId, row.id, scheduledAt, now, now, now) + if (result.changes > 0) + events.push({ jobId: row.id, runId, scheduledAt, reason: 'scheduled' }) + } + const updated = db + .prepare( + `UPDATE cron_jobs SET next_run_at = ?, schedule_error = ?, updated_at = ? + WHERE id = ? AND next_run_at = ?` + ) + .run(reconciliation.nextRunAt, reconciliation.error, now, row.id, row.next_run_at) + if (updated.changes !== 1) throw new Error('Cron schedule changed during due-run claim.') + return events + }) + })() + } + queueRun(input: { jobId: string scheduledAt: number diff --git a/src/main/scheduler/schedulerProcessManager.ts b/src/main/scheduler/schedulerProcessManager.ts index 79ef4663fb..fa7a672ec6 100644 --- a/src/main/scheduler/schedulerProcessManager.ts +++ b/src/main/scheduler/schedulerProcessManager.ts @@ -1,36 +1,24 @@ -import fs from 'fs' -import path from 'path' -import { fileURLToPath } from 'url' -import type { UtilityProcess } from 'electron' import type { CronJobsSchedulerStatus, SchedulerCommand, SchedulerEvent } from '@shared/cronJobs' -import type { CronJobsSchedulerSnapshot } from './repository' - -type SchedulerUtilityProcess = Pick & { - on(event: 'message', listener: (message: unknown) => void): SchedulerUtilityProcess - on(event: 'exit', listener: (code: number) => void): SchedulerUtilityProcess - on(event: 'error', listener: (type: string, location: string) => void): SchedulerUtilityProcess - once(event: 'spawn', listener: () => void): SchedulerUtilityProcess - once(event: 'exit', listener: (code: number) => void): SchedulerUtilityProcess - off(event: 'spawn', listener: () => void): SchedulerUtilityProcess - off(event: 'exit', listener: (code: number) => void): SchedulerUtilityProcess -} - -export interface SchedulerRunDueEvent { - jobId: string - runId: string - scheduledAt: number - reason: 'scheduled' | 'manual' +import type { CronJobsSchedulerSnapshot, SchedulerRunDueEvent } from './repository' +export type { SchedulerRunDueEvent } from './repository' + +export interface SchedulerHost { + readonly pid: number | undefined + postMessage(command: SchedulerCommand): void + kill(): void + onMessage(listener: (message: unknown) => void): void + onExit(listener: (code: number) => void): void + onError(listener: (type: string, location: string) => void): void } export interface SchedulerProcessManagerDeps { - dbPath: string - dbPassword?: string getSnapshot: () => CronJobsSchedulerSnapshot + queueDueRuns: () => SchedulerRunDueEvent[] onRunDue: (event: SchedulerRunDueEvent) => Promise | void idleShutdownMs?: number maxRestartAttempts?: number restartDelayMs?: number - spawnHost?: () => Promise + spawnHost: (signal: AbortSignal) => Promise } const DEFAULT_IDLE_SHUTDOWN_MS = 30_000 @@ -38,14 +26,17 @@ const DEFAULT_RESTART_DELAY_MS = 1_000 const DEFAULT_MAX_RESTART_ATTEMPTS = 5 export class SchedulerProcessManager { - private host: SchedulerUtilityProcess | null = null - private hostReady: Promise | null = null + private host: SchedulerHost | null = null + private hostReady: Promise | null = null + private pendingSpawn: AbortController | null = null private readonly idleShutdownMs: number private readonly restartDelayMs: number private readonly maxRestartAttempts: number private idleStopTimer: NodeJS.Timeout | null = null private restartTimer: NodeJS.Timeout | null = null private shuttingDown = false + private lastScanRequestId = 0 + private hostEpoch = 0 private status: CronJobsSchedulerStatus = { state: 'stopped', pid: null, @@ -94,6 +85,8 @@ export class SchedulerProcessManager { this.cancelIdleStop() const host = await this.ensureHost() + if (this.host !== host || this.shuttingDown) + throw new Error('Scheduler utility spawn was superseded.') host.postMessage({ type: 'RECONCILE', reason, @@ -111,8 +104,11 @@ export class SchedulerProcessManager { async stop(reason = 'manual'): Promise { this.shuttingDown = true + this.hostEpoch++ this.cancelIdleStop() this.cancelRestart() + this.pendingSpawn?.abort() + this.pendingSpawn = null const host = this.host this.host = null @@ -138,7 +134,7 @@ export class SchedulerProcessManager { return this.getStatus() } - private async ensureHost(): Promise { + private async ensureHost(): Promise { if (this.host) { return this.host } @@ -148,23 +144,33 @@ export class SchedulerProcessManager { this.shuttingDown = false this.updateStatus({ state: 'starting', lastError: null }) - this.hostReady = this.spawnHost() + const epoch = ++this.hostEpoch + const pendingSpawn = new AbortController() + this.pendingSpawn = pendingSpawn + const ready = this.spawnHost(epoch, pendingSpawn.signal) + this.hostReady = ready try { - return await this.hostReady + return await ready } catch (error) { const message = error instanceof Error ? error.message : String(error) - this.updateStatus({ state: 'error', pid: null, lastError: message }) + if (this.hostEpoch === epoch) + this.updateStatus({ state: 'error', pid: null, lastError: message }) throw error } finally { - this.hostReady = null + if (this.hostReady === ready) this.hostReady = null + if (this.pendingSpawn === pendingSpawn) this.pendingSpawn = null } } - private async spawnHost(): Promise { - const host = this.deps.spawnHost ? await this.deps.spawnHost() : await this.spawnDefaultHost() - host.on('message', (message) => this.handleHostMessage(host, message)) - host.on('exit', (code) => this.handleHostExit(host, code)) - host.on('error', (type, location) => { + private async spawnHost(epoch: number, signal: AbortSignal): Promise { + const host = await this.deps.spawnHost(signal) + if (this.hostEpoch !== epoch || this.shuttingDown) { + host.kill() + throw new Error('Scheduler utility spawn was superseded.') + } + host.onMessage((message) => this.handleHostMessage(host, message)) + host.onExit((code) => this.handleHostExit(host, code)) + host.onError((type, location) => { if (this.host !== host) { return } @@ -174,6 +180,7 @@ export class SchedulerProcessManager { }) this.host = host + this.lastScanRequestId = 0 this.updateStatus({ state: 'running', pid: host.pid ?? null, @@ -186,64 +193,8 @@ export class SchedulerProcessManager { return host } - private async spawnDefaultHost(): Promise { - const { app, utilityProcess } = await import('electron') - const modulePath = this.resolveUtilityHostEntryPoint(app.getAppPath()) - const host = utilityProcess.fork(modulePath, ['--deepchat-cron-scheduler-host'], { - serviceName: 'DeepChat Cron Jobs Scheduler', - stdio: 'ignore', - env: { - ...process.env, - DEEPCHAT_CRON_SCHEDULER_HOST: '1', - DEEPCHAT_CRON_SCHEDULER_DB_PATH: this.deps.dbPath, - ...(this.deps.dbPassword - ? { DEEPCHAT_CRON_SCHEDULER_DB_PASSWORD: this.deps.dbPassword } - : {}) - } - }) as SchedulerUtilityProcess - - return await new Promise((resolve, reject) => { - let settled = false - const settle = (callback: () => void) => { - if (settled) { - return - } - settled = true - host.off('spawn', onSpawn) - host.off('exit', onExit) - callback() - } - const onSpawn = () => { - settle(() => resolve(host)) - } - const onExit = (code: number) => { - settle(() => reject(new Error(`Cron scheduler utility exited before spawn: ${code}`))) - } - - host.once('spawn', onSpawn) - host.once('exit', onExit) - }) - } - - private resolveUtilityHostEntryPoint(appPath?: string): string { - const modulePath = fileURLToPath(import.meta.url) - const candidates = [ - ...(appPath - ? [ - path.join(appPath, 'out/main/schedulerUtilityHost.js'), - path.join(appPath, 'schedulerUtilityHost.js') - ] - : []), - path.resolve(path.dirname(modulePath), 'schedulerUtilityHost.js'), - path.resolve(path.dirname(modulePath), '../schedulerUtilityHost.js'), - path.resolve(process.cwd(), 'out/main/schedulerUtilityHost.js') - ] - - return candidates.find((candidate) => fs.existsSync(candidate)) ?? candidates[0] - } - - private handleHostMessage(host: SchedulerUtilityProcess, message: unknown): void { - if (this.host !== host) { + private handleHostMessage(host: SchedulerHost, message: unknown): void { + if (this.host !== host || this.shuttingDown) { return } const event = unwrapSchedulerEvent(message) @@ -260,44 +211,38 @@ export class SchedulerProcessManager { lastError: null }) return - case 'HEARTBEAT': + case 'HEARTBEAT': { + const snapshot = this.deps.getSnapshot() this.updateStatus({ state: 'running', - enabledJobCount: event.enabledJobCount, - nextRunAt: event.nextRunAt, + ...snapshot, lastHeartbeatAt: event.now, lastError: null }) - if (event.enabledJobCount === 0) { + if (snapshot.enabledJobCount === 0) { this.scheduleIdleStop() - } + } else this.cancelIdleStop() return - case 'IDLE': + } + case 'IDLE': { + const snapshot = this.deps.getSnapshot() this.updateStatus({ - state: 'idle', - enabledJobCount: event.enabledJobCount, - nextRunAt: event.nextRunAt, + state: snapshot.enabledJobCount === 0 ? 'idle' : 'running', + ...snapshot, lastHeartbeatAt: event.now }) - this.scheduleIdleStop() + if (snapshot.enabledJobCount === 0) this.scheduleIdleStop() + else this.cancelIdleStop() return - case 'RUN_DUE': - console.info('[CronJobs] Scheduler reported due run:', { - jobId: event.jobId, - runId: event.runId, - scheduledAt: event.scheduledAt, - reason: event.reason - }) - void Promise.resolve( - this.deps.onRunDue({ - jobId: event.jobId, - runId: event.runId, - scheduledAt: event.scheduledAt, - reason: event.reason - }) - ).catch((error) => { - console.error('[CronJobs] Failed to process due run:', error) - }) + } + case 'SCAN_DUE': + if (event.requestId !== this.lastScanRequestId + 1) { + this.updateStatus({ state: 'error', lastError: 'Invalid scheduler scan sequence.' }) + host.kill() + return + } + this.lastScanRequestId = event.requestId + this.scanDueRuns(host, event.requestId) return case 'ERROR': console.error('[CronJobs] Scheduler utility error:', event.message) @@ -306,11 +251,45 @@ export class SchedulerProcessManager { lastError: event.message, lastHeartbeatAt: event.now }) + if (event.fatal) host.kill() return } } - private handleHostExit(host: SchedulerUtilityProcess, code: number): void { + private scanDueRuns(host: SchedulerHost, requestId: number): void { + let error: string | undefined + try { + const events = this.deps.queueDueRuns() + for (const event of events) { + // Dispatch committed runs at the owner even if the timer reply is lost. + try { + void Promise.resolve(this.deps.onRunDue(event)).catch((error) => { + console.error('[CronJobs] Failed to process due run:', error) + }) + } catch (error) { + console.error('[CronJobs] Failed to process due run:', error) + } + } + } catch (cause) { + error = (cause instanceof Error ? cause.message : String(cause)).slice(0, 4096) + this.updateStatus({ state: 'error', lastError: error }) + } + if (this.host !== host || this.shuttingDown) return + try { + host.postMessage({ + type: 'SCAN_RESULT', + requestId, + ...this.deps.getSnapshot(), + ...(error !== undefined ? { error } : {}), + now: Date.now() + } satisfies SchedulerCommand) + } catch (cause) { + console.error('[CronJobs] Failed to reply to scheduler scan:', cause) + host.kill() + } + } + + private handleHostExit(host: SchedulerHost, code: number): void { if (this.host !== host) { return } @@ -403,16 +382,36 @@ function unwrapSchedulerEvent(message: unknown): SchedulerEvent | null { return null } - const type = (payload as { type?: unknown }).type - if ( - type === 'READY' || - type === 'HEARTBEAT' || - type === 'RUN_DUE' || - type === 'IDLE' || - type === 'ERROR' - ) { - return payload as SchedulerEvent + const event = payload as Record + const nonnegativeInteger = (value: unknown): value is number => + typeof value === 'number' && Number.isSafeInteger(value) && value >= 0 + if (!nonnegativeInteger(event.now)) return null + switch (event.type) { + case 'READY': + if (event.pid !== null && (!nonnegativeInteger(event.pid) || event.pid === 0)) return null + break + case 'HEARTBEAT': + case 'IDLE': + if ( + !nonnegativeInteger(event.enabledJobCount) || + (event.nextRunAt !== null && !nonnegativeInteger(event.nextRunAt)) + ) + return null + break + case 'SCAN_DUE': + if (!nonnegativeInteger(event.requestId) || event.requestId === 0) return null + break + case 'ERROR': + if ( + typeof event.message !== 'string' || + event.message.length > 4096 || + (event.fatal !== undefined && typeof event.fatal !== 'boolean') || + (event.stack !== undefined && typeof event.stack !== 'string') + ) + return null + break + default: + return null } - - return null + return event as unknown as SchedulerEvent } diff --git a/src/main/scheduler/schedulerUtilityHost.ts b/src/main/scheduler/schedulerUtilityHost.ts index a14f2a88ce..def72beb22 100644 --- a/src/main/scheduler/schedulerUtilityHost.ts +++ b/src/main/scheduler/schedulerUtilityHost.ts @@ -1,18 +1,8 @@ -import { randomUUID } from 'node:crypto' -import type Database from 'better-sqlite3-multiple-ciphers' -import { openSQLiteDatabase } from '@/data/databaseConnection' -import type { - CronJobMisfirePolicy, - CronJobRunReason, - SchedulerCommand, - SchedulerEvent -} from '@shared/cronJobs' -import { CronExpressionService } from './cronExpressionService' +import type { SchedulerCommand, SchedulerEvent } from '@shared/cronJobs' const SCHEDULER_HOST_ARG = '--deepchat-cron-scheduler-host' const HEARTBEAT_INTERVAL_MS = 5_000 const MAX_SCAN_DELAY_MS = 30_000 -const DUE_SCAN_LIMIT = 100 type ParentPort = { postMessage(message: unknown): void @@ -20,430 +10,145 @@ type ParentPort = { start?(): void } -type ParentPortMessageEvent = { - data?: unknown -} - -interface DueCronJobRow { - id: string - cron_expr: string - timezone: string - next_run_at: number - misfire_policy: CronJobMisfirePolicy - max_catch_up_runs: number | null -} - -interface SchedulerSnapshot { - enabledJobCount: number - nextRunAt: number | null -} - -function getParentPort(): ParentPort | null { - const maybeProcess = process as NodeJS.Process & { - parentPort?: ParentPort - } - return maybeProcess.parentPort ?? null -} +type SchedulerSnapshot = { enabledJobCount: number; nextRunAt: number | null } -function isSchedulerHostRequest(): boolean { +function isSchedulerCommand(message: unknown): message is SchedulerCommand { + if (!message || typeof message !== 'object' || !('type' in message)) return false + if (message.type === 'START' || message.type === 'STOP' || message.type === 'RECONCILE') + return true + if (message.type !== 'SCAN_RESULT') return false + const result = message as Extract return ( - process.env.DEEPCHAT_CRON_SCHEDULER_HOST === '1' || process.argv.includes(SCHEDULER_HOST_ARG) + Number.isSafeInteger(result.requestId) && + result.requestId > 0 && + Number.isSafeInteger(result.enabledJobCount) && + result.enabledJobCount >= 0 && + (result.nextRunAt === null || + (Number.isSafeInteger(result.nextRunAt) && result.nextRunAt >= 0)) && + (result.error === undefined || typeof result.error === 'string') ) } -function getParentPortMessagePayload(message: unknown): unknown { - if (isSchedulerCommand(message)) { - return message - } - - if (message && typeof message === 'object' && 'data' in message) { - return (message as ParentPortMessageEvent).data - } - - return message -} - -function isSchedulerCommand(message: unknown): message is SchedulerCommand { - if (!message || typeof message !== 'object') { - return false - } - - const type = (message as { type?: unknown }).type - return type === 'START' || type === 'RECONCILE' || type === 'RUN_NOW' || type === 'STOP' -} - -function serializeError(error: unknown): { message: string; stack?: string } { - if (error instanceof Error) { - return { - message: error.message, - stack: error.stack - } - } - return { message: String(error) } -} - export class CronJobsSchedulerUtilityHost { - private db: Database.Database | null = null private heartbeatTimer: NodeJS.Timeout | null = null private scanTimer: NodeJS.Timeout | null = null + private replyTimer: NodeJS.Timeout | null = null private shuttingDown = false - private readonly scheduleService = new CronExpressionService() + private requestId = 0 + private pendingRequestId: number | null = null + private reconcileRequested = false + private snapshot: SchedulerSnapshot = { enabledJobCount: 0, nextRunAt: null } - constructor( - private readonly options: { - dbPath: string - dbPassword?: string - postMessage: (message: SchedulerEvent) => void - } - ) {} + constructor(private readonly options: { postMessage: (message: SchedulerEvent) => void }) {} start(): void { - if (this.shuttingDown) { - return - } - try { - this.openDatabase() - this.send({ - type: 'READY', - pid: process.pid || null, - now: Date.now() - }) - this.startHeartbeat() - this.scanDueRuns() - } catch (error) { - this.reportError(error) - } + if (this.shuttingDown || this.heartbeatTimer) return + this.send({ type: 'READY', pid: process.pid || null, now: Date.now() }) + this.heartbeatTimer = setInterval(() => this.sendHeartbeat(), HEARTBEAT_INTERVAL_MS) + this.reconcile() } reconcile(): void { - try { - this.openDatabase() - this.scanDueRuns() - } catch (error) { - this.reportError(error) + if (this.shuttingDown) return + this.clearScanTimer() + if (this.pendingRequestId !== null) { + this.reconcileRequested = true + return } - } - - runNow(jobId: string, now = Date.now()): void { - try { - this.openDatabase() - const db = this.requireDatabase() - const job = db.prepare('SELECT id FROM cron_jobs WHERE id = ?').get(jobId) as - | { id: string } - | undefined - if (!job) { - return - } - - const run = this.queueRun(job.id, now, 'manual') - if (!run) { - return - } + const requestId = ++this.requestId + this.pendingRequestId = requestId + this.replyTimer = setTimeout(() => { + this.shutdown() this.send({ - type: 'RUN_DUE', - jobId: job.id, - runId: run.runId, - scheduledAt: now, - reason: 'manual', + type: 'ERROR', + message: 'Scheduler Store scan timed out.', + fatal: true, now: Date.now() }) - this.scheduleNextScan() - } catch (error) { - this.reportError(error) - } + }, MAX_SCAN_DELAY_MS) + this.send({ type: 'SCAN_DUE', requestId, now: Date.now() }) } - shutdown(): void { - this.shuttingDown = true - this.clearHeartbeat() - this.clearScanTimer() - if (this.db) { - try { - this.db.close() - } catch {} - this.db = null - } - } - - private openDatabase(): void { - if (this.db) { - return - } - this.db = openSQLiteDatabase(this.options.dbPath, this.options.dbPassword) - } - - private requireDatabase(): Database.Database { - if (!this.db) { - throw new Error('Cron scheduler database is not open.') - } - return this.db - } - - private startHeartbeat(): void { - this.clearHeartbeat() + applyScanResult(result: Extract): void { + if (this.shuttingDown || result.requestId !== this.pendingRequestId) return + if (this.replyTimer) clearTimeout(this.replyTimer) + this.replyTimer = null + this.pendingRequestId = null + this.snapshot = { enabledJobCount: result.enabledJobCount, nextRunAt: result.nextRunAt } this.sendHeartbeat() - this.heartbeatTimer = setInterval(() => { - this.sendHeartbeat() - }, HEARTBEAT_INTERVAL_MS) - } - - private clearHeartbeat(): void { - if (!this.heartbeatTimer) { + if (result.error !== undefined) { + this.reconcileRequested = false + this.send({ type: 'ERROR', message: result.error, now: Date.now() }) + this.scheduleScan(MAX_SCAN_DELAY_MS) return } - clearInterval(this.heartbeatTimer) - this.heartbeatTimer = null - } - - private scanDueRuns(): void { - if (this.shuttingDown) { + if (this.reconcileRequested) { + this.reconcileRequested = false + this.reconcile() return } - - try { - const db = this.requireDatabase() - const now = Date.now() - const dueRows = db - .prepare( - `SELECT id, - cron_expr, - timezone, - next_run_at, - misfire_policy, - max_catch_up_runs - FROM cron_jobs - WHERE enabled = 1 - AND status = 'ready' - AND agent_id IS NOT NULL - AND task_prompt != '' - AND next_run_at IS NOT NULL - AND next_run_at <= ? - ORDER BY next_run_at ASC, id ASC - LIMIT ?` - ) - .all(now, DUE_SCAN_LIMIT) as DueCronJobRow[] - - const dueEvents = db.transaction((rows: DueCronJobRow[]) => - rows.flatMap((row) => { - const reconciliation = this.scheduleService.reconcileDueRun( - { - cronExpr: row.cron_expr, - timezone: row.timezone, - misfirePolicy: row.misfire_policy, - maxCatchUpRuns: row.max_catch_up_runs - }, - row.next_run_at, - now - ) - - if (reconciliation.error) { - db.prepare( - `UPDATE cron_jobs - SET next_run_at = NULL, - schedule_error = ?, - updated_at = ? - WHERE id = ?` - ).run(reconciliation.error, now, row.id) - return [] - } - - const events = reconciliation.scheduledAts.flatMap((scheduledAt) => { - const run = this.queueRun(row.id, scheduledAt, 'scheduled', true) - return run - ? [ - { - type: 'RUN_DUE' as const, - jobId: row.id, - runId: run.runId, - scheduledAt, - reason: 'scheduled' as const, - now: Date.now() - } - ] - : [] - }) - - db.prepare( - `UPDATE cron_jobs - SET next_run_at = ?, - schedule_error = NULL, - updated_at = ? - WHERE id = ? - AND next_run_at = ?` - ).run(reconciliation.nextRunAt, now, row.id, row.next_run_at) - - return events - }) - )(dueRows) - - for (const event of dueEvents) { - this.send(event) - } - this.sendHeartbeat() - } catch (error) { - this.reportError(error) - } finally { - this.scheduleNextScan() + if (this.snapshot.enabledJobCount === 0) { + this.send({ type: 'IDLE', ...this.snapshot, now: Date.now() }) + return } + this.scheduleScan( + this.snapshot.nextRunAt === null + ? MAX_SCAN_DELAY_MS + : Math.min(Math.max(this.snapshot.nextRunAt - Date.now(), 0), MAX_SCAN_DELAY_MS) + ) } - private queueRun( - jobId: string, - scheduledAt: number, - reason: CronJobRunReason, - ignoreDuplicate = false - ): { runId: string } | null { - const db = this.requireDatabase() - const now = Date.now() - const runId = randomUUID() - const statement = ignoreDuplicate - ? `INSERT OR IGNORE INTO cron_job_runs ( - id, - job_id, - scheduled_at, - queued_at, - started_at, - completed_at, - status, - reason, - error, - created_at, - updated_at - ) - VALUES (?, ?, ?, ?, NULL, NULL, 'queued', ?, NULL, ?, ?)` - : `INSERT INTO cron_job_runs ( - id, - job_id, - scheduled_at, - queued_at, - started_at, - completed_at, - status, - reason, - error, - created_at, - updated_at - ) - VALUES (?, ?, ?, ?, NULL, NULL, 'queued', ?, NULL, ?, ?)` - - const result = db.prepare(statement).run(runId, jobId, scheduledAt, now, reason, now, now) - - return result.changes > 0 ? { runId } : null + shutdown(): void { + this.shuttingDown = true + if (this.heartbeatTimer) clearInterval(this.heartbeatTimer) + if (this.replyTimer) clearTimeout(this.replyTimer) + this.heartbeatTimer = null + this.replyTimer = null + this.pendingRequestId = null + this.clearScanTimer() } - private scheduleNextScan(): void { - if (this.shuttingDown) { - return - } - + private scheduleScan(delay: number): void { this.clearScanTimer() - const snapshot = this.readSnapshot() - if (snapshot.enabledJobCount === 0) { - this.send({ - type: 'IDLE', - enabledJobCount: snapshot.enabledJobCount, - nextRunAt: snapshot.nextRunAt, - now: Date.now() - }) - return - } - - const delay = - snapshot.nextRunAt === null - ? MAX_SCAN_DELAY_MS - : Math.min(Math.max(snapshot.nextRunAt - Date.now(), 0), MAX_SCAN_DELAY_MS) this.scanTimer = setTimeout(() => { this.scanTimer = null - this.scanDueRuns() + this.reconcile() }, delay) } private clearScanTimer(): void { - if (!this.scanTimer) { - return - } - clearTimeout(this.scanTimer) + if (this.scanTimer) clearTimeout(this.scanTimer) this.scanTimer = null } private sendHeartbeat(): void { - try { - const snapshot = this.readSnapshot() - this.send({ - type: 'HEARTBEAT', - enabledJobCount: snapshot.enabledJobCount, - nextRunAt: snapshot.nextRunAt, - now: Date.now() - }) - } catch (error) { - this.reportError(error) - } - } - - private readSnapshot(): SchedulerSnapshot { - const db = this.requireDatabase() - const countRow = db - .prepare('SELECT COUNT(*) AS count FROM cron_jobs WHERE enabled = 1') - .get() as { count: number } | undefined - const nextRow = db - .prepare( - `SELECT MIN(next_run_at) AS next_run_at - FROM cron_jobs - WHERE enabled = 1 - AND next_run_at IS NOT NULL` - ) - .get() as { next_run_at: number | null } | undefined - - return { - enabledJobCount: countRow?.count ?? 0, - nextRunAt: nextRow?.next_run_at ?? null - } + this.send({ type: 'HEARTBEAT', ...this.snapshot, now: Date.now() }) } private send(message: SchedulerEvent): void { this.options.postMessage(message) } - - private reportError(error: unknown): void { - const serialized = serializeError(error) - this.send({ - type: 'ERROR', - message: serialized.message, - stack: serialized.stack, - now: Date.now() - }) - } } export function runSchedulerUtilityHostIfRequested(): boolean { - if (!isSchedulerHostRequest()) { + if ( + process.env.DEEPCHAT_CRON_SCHEDULER_HOST !== '1' && + !process.argv.includes(SCHEDULER_HOST_ARG) + ) return false - } - - const parentPort = getParentPort() - if (!parentPort) { - throw new Error('Cron scheduler utility host started without a parent port.') - } - - const dbPath = process.env.DEEPCHAT_CRON_SCHEDULER_DB_PATH - if (!dbPath) { - throw new Error('Cron scheduler utility host started without a database path.') - } - + const parentPort = (process as NodeJS.Process & { parentPort?: ParentPort }).parentPort + if (!parentPort) throw new Error('Cron scheduler utility host started without a parent port.') const host = new CronJobsSchedulerUtilityHost({ - dbPath, - dbPassword: process.env.DEEPCHAT_CRON_SCHEDULER_DB_PASSWORD, postMessage: (message) => parentPort.postMessage(message) }) const keepAliveIntervalId = setInterval(() => {}, 2 ** 31 - 1) parentPort.start?.() - parentPort.on('message', (message) => { - const command = getParentPortMessagePayload(message) - if (!isSchedulerCommand(command)) { - return - } - + const command = + message && typeof message === 'object' && 'data' in message + ? (message as { data: unknown }).data + : message + if (!isSchedulerCommand(command)) return switch (command.type) { case 'START': host.start() @@ -451,8 +156,8 @@ export function runSchedulerUtilityHostIfRequested(): boolean { case 'RECONCILE': host.reconcile() return - case 'RUN_NOW': - host.runNow(command.jobId, command.now) + case 'SCAN_RESULT': + host.applyScanResult(command) return case 'STOP': clearInterval(keepAliveIntervalId) @@ -460,11 +165,9 @@ export function runSchedulerUtilityHostIfRequested(): boolean { process.exit(0) } }) - process.once('beforeExit', () => { clearInterval(keepAliveIntervalId) host.shutdown() }) - return true } diff --git a/src/main/session/data/index.ts b/src/main/session/data/index.ts index d7c75ce380..4060cf329e 100644 --- a/src/main/session/data/index.ts +++ b/src/main/session/data/index.ts @@ -53,6 +53,8 @@ export function createSessionDataFromDatabase( }) const transcript = new SessionTranscript(database, tapeStore, tapeStore, tapeStore) const pendingInputStore = new SessionPendingInputStore(database) + const settings = new SessionSettingsStore(database, tapeStore) + const pendingInputs = new SessionPendingInputs(pendingInputStore, transcript, events) const ensureTape = (sessionId: string) => sessionTape.ensureSessionTapeReady(sessionId, transcript) const toTapeAnchor = (row: DeepChatTapeEntryRow) => ({ @@ -119,7 +121,7 @@ export function createSessionDataFromDatabase( return { database, - settings: new SessionSettingsStore(database, tapeStore), + settings, transcript, tape, tapeStore, @@ -127,7 +129,14 @@ export function createSessionDataFromDatabase( tape.getTapeInfo(sessionId) ), programmaticExecutionJournal, - pendingInputs: new SessionPendingInputs(pendingInputStore, transcript, events) + pendingInputs, + clearTranscript(sessionId: string): void { + database.getDatabase().transaction(() => { + pendingInputs.deleteBySession(sessionId) + transcript.deleteBySession(sessionId) + settings.resetTape(sessionId) + })() + } } } diff --git a/src/main/session/transcriptMutations.ts b/src/main/session/transcriptMutations.ts index 678430a04e..56591461f3 100644 --- a/src/main/session/transcriptMutations.ts +++ b/src/main/session/transcriptMutations.ts @@ -4,8 +4,6 @@ import type { UserMessageInlineItem } from '@shared/types/agent-interface' import { isSendMessageInputEmpty } from '@/agent/shared/agentSessionNormalization' -import type { SessionPendingInputs } from './data/pendingInputs' -import type { SessionSettingsStore } from './data/settings' import type { SessionTranscript } from './data/transcript' import { buildEditedUserContent, extractUserMessageInput } from './data/userMessageContent' import { parseMessageMetadata } from './usageStats' @@ -26,10 +24,8 @@ export interface SessionTranscriptRuntimePort { export interface SessionTranscriptMutationDependencies { transcript: SessionTranscript - settings: SessionSettingsStore - pendingInputs: SessionPendingInputs runtime: SessionTranscriptRuntimePort - runInTransaction(operation: () => T): T + clearTranscript(sessionId: string): void } export class SessionTranscriptMutations { @@ -37,11 +33,7 @@ export class SessionTranscriptMutations { async clearMessages(sessionId: string): Promise { await this.dependencies.runtime.prepareClearMessages(sessionId) - this.dependencies.runInTransaction(() => { - this.dependencies.pendingInputs.deleteBySession(sessionId) - this.dependencies.transcript.deleteBySession(sessionId) - this.dependencies.settings.resetTape(sessionId) - }) + this.dependencies.clearTranscript(sessionId) this.dependencies.runtime.finishClearMessages(sessionId) } @@ -96,9 +88,7 @@ export class SessionTranscriptMutations { } commitRetryMessage(sessionId: string, orderSeq: number): void { - this.dependencies.runInTransaction(() => { - this.dependencies.transcript.deleteFromOrderSeq(sessionId, orderSeq) - }) + this.dependencies.transcript.deleteFromOrderSeq(sessionId, orderSeq) this.dependencies.runtime.invalidateTranscriptFrom(sessionId, orderSeq) } diff --git a/src/main/skill/agentSkillImportService.ts b/src/main/skill/agentSkillImportService.ts index 692bd768cf..d3a3ad86dd 100644 --- a/src/main/skill/agentSkillImportService.ts +++ b/src/main/skill/agentSkillImportService.ts @@ -1,7 +1,6 @@ import * as fs from 'node:fs' import * as path from 'node:path' import { createHash, randomUUID } from 'node:crypto' -import { app } from 'electron' import type { AgentSkillImportPreview, AgentSkillImportPreviewItem, @@ -23,6 +22,7 @@ import { isFilenameSafe } from './sync/security' const IMPORTABLE_SKILL_NAME_PATTERN = /^[a-z0-9][a-z0-9._-]*$/ export interface AgentSkillImportServiceDependencies { + tempDirectory: string skills: Pick external: Pick } @@ -313,7 +313,7 @@ export class AgentSkillImportService { private async materializeCanonicalSkill(item: ResolvedImportItem): Promise { if (!item.canonicalSkill) throw new Error('External Skill could not be converted.') const root = await fs.promises.mkdtemp( - path.join(app.getPath('temp'), `deepchat-agent-skill-import-${randomUUID()}-`) + path.join(this.dependencies.tempDirectory, `deepchat-agent-skill-import-${randomUUID()}-`) ) try { await fs.promises.writeFile( diff --git a/src/main/skill/index.ts b/src/main/skill/index.ts index 7761317be0..6a72028b03 100644 --- a/src/main/skill/index.ts +++ b/src/main/skill/index.ts @@ -1,4 +1,3 @@ -import { app, shell } from 'electron' import path from 'path' import fs from 'fs' import { execFile } from 'node:child_process' @@ -15,7 +14,7 @@ import { type WatcherEventBatch, type WatcherStatus, type WatchHandle -} from '@/platform/fileWatcher' +} from '@/platform/fileWatcher/watcherTypes' import { SkillServicePort, SkillMetadata, @@ -354,6 +353,14 @@ function sanitizeSkillExtensionConfig(input: unknown): SkillExtensionConfig { } } +export interface SkillHostPort { + homeDirectory: string + tempDirectory: string + userDataDirectory: string + builtinSkillsDirectories: readonly string[] + openSkillsDirectory(directory: string): Promise +} + /** * SkillService manages the skills system. * @@ -397,19 +404,20 @@ export class SkillService implements SkillServicePort { private readonly sessionStatePort: SkillSessionStatePort, private readonly watcherService: IFileWatcherService, private readonly publishEvent: DeepchatEventPublisher, + private readonly host: SkillHostPort, private readonly agentScopePort?: SkillAgentScopePort ) { // Skills directory: ~/.deepchat/skills/ this.skillsDir = this.resolveSkillsDir() this.sidecarDir = path.join(this.skillsDir, SKILL_CONFIG.SIDECAR_DIR) - this.draftsRoot = path.join(app.getPath('temp'), SKILL_CONFIG.DRAFT_ROOT_DIR) + this.draftsRoot = path.join(this.host.tempDirectory, SKILL_CONFIG.DRAFT_ROOT_DIR) this.ensureSkillsDir() } private resolveSkillsDir(): string { const configuredPath = this.settings.getPath() const normalized = configuredPath?.trim() - const homePath = app.getPath('home') + const homePath = this.host.homeDirectory const homeDir = homePath ? path.resolve(homePath) : path.resolve('.') const fallbackDir = path.join(homeDir, '.deepchat', 'skills') const resolved = normalized ? path.resolve(normalized) : fallbackDir @@ -3307,7 +3315,7 @@ export class SkillService implements SkillServicePort { } private resolveBuiltinSkillsDir(): string | null { - const candidates = this.getBuiltinSkillsDirCandidates() + const candidates = this.host.builtinSkillsDirectories for (const candidate of candidates) { if (fs.existsSync(candidate)) { return candidate @@ -3316,17 +3324,6 @@ export class SkillService implements SkillServicePort { return null } - private getBuiltinSkillsDirCandidates(): string[] { - if (!app.isPackaged) { - return [path.join(app.getAppPath(), 'resources', 'skills')] - } - return [ - path.join(process.resourcesPath, 'app.asar.unpacked', 'resources', 'skills'), - path.join(process.resourcesPath, 'resources', 'skills'), - path.join(process.resourcesPath, 'skills') - ] - } - /** * Install a skill from a folder path */ @@ -3413,7 +3410,7 @@ export class SkillService implements SkillServicePort { return { success: false, error: 'Zip file not found', errorCode: 'not_found' } } - const tempDir = fs.mkdtempSync(path.join(app.getPath('temp'), 'deepchat-skill-')) + const tempDir = fs.mkdtempSync(path.join(this.host.tempDirectory, 'deepchat-skill-')) try { await extractSkillArchive(zipPath, tempDir, { maxArchiveBytes: SKILL_CONFIG.ZIP_MAX_SIZE @@ -3459,7 +3456,7 @@ export class SkillService implements SkillServicePort { ): Promise { const normalizedAgentId = await this.requireAgentScope(agentId) const finishOperation = this.beginAgentScopeOperation(normalizedAgentId) - const tempZipPath = path.join(app.getPath('temp'), `deepchat-skill-${randomUUID()}.zip`) + const tempZipPath = path.join(this.host.tempDirectory, `deepchat-skill-${randomUUID()}.zip`) try { await downloadSkillArchive(url, tempZipPath, { maxBytes: SKILL_CONFIG.ZIP_MAX_SIZE, @@ -4268,7 +4265,7 @@ export class SkillService implements SkillServicePort { private backupExistingSkill(skillName: string): string { const sourceDir = path.join(this.skillsDir, skillName) const timestamp = new Date().toISOString().replace(/[:.]/g, '-') - const backupRoot = path.join(app.getPath('home'), '.deepchat', 'backups', 'skill-installs') + const backupRoot = path.join(this.host.homeDirectory, '.deepchat', 'backups', 'skill-installs') fs.mkdirSync(backupRoot, { recursive: true }) const backupDir = path.join(backupRoot, `${skillName}-${timestamp}-${randomUUID()}`) fs.renameSync(sourceDir, backupDir) @@ -4347,7 +4344,7 @@ export class SkillService implements SkillServicePort { } private async cloneGitSkillRepo(repoUrl: string): Promise { - const operationRoot = path.join(app.getPath('home'), '.deepchat', 'tmp', 'skill-installs') + const operationRoot = path.join(this.host.homeDirectory, '.deepchat', 'tmp', 'skill-installs') fs.mkdirSync(operationRoot, { recursive: true }) const cloneDir = path.join(operationRoot, `${Date.now()}-${randomUUID()}`) try { @@ -4857,7 +4854,7 @@ export class SkillService implements SkillServicePort { } const skillDir = path.resolve(metadata.skillRoot) - const backupRoot = path.join(app.getPath('home'), '.deepchat', 'backups', 'skill-deletes') + const backupRoot = path.join(this.host.homeDirectory, '.deepchat', 'backups', 'skill-deletes') fs.mkdirSync(backupRoot, { recursive: true }) const backupDir = path.join(backupRoot, `${name}-${Date.now()}-${randomUUID()}`) const sessions = this.agentScopePort ? await this.agentScopePort.listSessions() : [] @@ -5343,7 +5340,7 @@ export class SkillService implements SkillServicePort { const normalizedAgentId = await this.requireAgentScope(agentId) const finishOperation = this.beginAgentScopeOperation(normalizedAgentId) try { - await shell.openPath(this.skillsDir) + await this.host.openSkillsDirectory(this.skillsDir) } finally { finishOperation() } @@ -5379,7 +5376,7 @@ export class SkillService implements SkillServicePort { } const ownerPluginId = this.getStoredManagementState().skills[name]?.ownerPluginId const userPluginRoot = path.join( - app.getPath('userData'), + this.host.userDataDirectory, PLUGIN_INSTALL_DIRECTORY, USER_PLUGIN_INSTALL_DIRECTORY ) diff --git a/src/main/skill/routes.ts b/src/main/skill/routes.ts index 2157705fb7..07b9c0a4cc 100644 --- a/src/main/skill/routes.ts +++ b/src/main/skill/routes.ts @@ -47,6 +47,7 @@ import { import { createRouteMap, type DeepchatRouteMap } from '@/routes/routeRegistry' export function createSkillRoutes(deps: { + tempDirectory: string skillService: SkillServicePort skillSyncService: SkillSyncServicePort skillSettings: SkillSettingsPort @@ -56,6 +57,7 @@ export function createSkillRoutes(deps: { }): DeepchatRouteMap { const { skillService, skillSyncService } = deps const agentSkillImportService = new AgentSkillImportService({ + tempDirectory: deps.tempDirectory, skills: skillService, external: skillSyncService }) diff --git a/src/main/skill/settings.ts b/src/main/skill/settings.ts index 3e4d1bbfaa..9a8253a1e0 100644 --- a/src/main/skill/settings.ts +++ b/src/main/skill/settings.ts @@ -1,4 +1,3 @@ -import { app } from 'electron' import path from 'path' import type { SettingsStore } from '@/config/settingsStore' import type { ScanCache } from '@shared/types/skillSync' @@ -27,7 +26,10 @@ export interface SkillSettingsPort { } export class SkillSettings implements SkillSettingsPort { - constructor(private readonly store: SettingsStore) {} + constructor( + private readonly store: SettingsStore, + private readonly homeDirectory: string + ) {} isEnabled(): boolean { return this.store.get('enableSkills') ?? true @@ -43,7 +45,7 @@ export class SkillSettings implements SkillSettingsPort { getPath(): string { return ( - this.store.get('skillsPath') || path.join(app.getPath('home'), '.deepchat', 'skills') + this.store.get('skillsPath') || path.join(this.homeDirectory, '.deepchat', 'skills') ) } diff --git a/src/main/skill/skillExecutionService.ts b/src/main/skill/skillExecutionService.ts index 93c289b3bb..82f2e26d82 100644 --- a/src/main/skill/skillExecutionService.ts +++ b/src/main/skill/skillExecutionService.ts @@ -12,7 +12,7 @@ import { type SkillRuntimePolicy, type SkillScriptRuntime } from '@shared/types/skill' -import { backgroundExecSessionManager } from '@/agent/shared/process/backgroundExecSessionManager' +import type { BackgroundExecPort } from '@/agent/shared/process/backgroundExecSessionManager' import { mergeCommandEnvironment } from '@/agent/shared/process/shellEnvHelper' import { createUtf8OutputDecoderPair, @@ -56,6 +56,7 @@ export interface SkillRunOptions { } interface SkillExecutionServiceOptions { + backgroundExec: BackgroundExecPort resolveConversationWorkdir?: (conversationId: string) => Promise } @@ -98,9 +99,11 @@ interface ForegroundExecutionResult { } export class SkillExecutionService { + private readonly backgroundExec: BackgroundExecPort private readonly resolveConversationWorkdir?: (conversationId: string) => Promise - constructor(options: SkillExecutionServiceOptions = {}) { + constructor(options: SkillExecutionServiceOptions) { + this.backgroundExec = options.backgroundExec this.resolveConversationWorkdir = options.resolveConversationWorkdir } @@ -153,7 +156,7 @@ export class SkillExecutionService { const displayCommand = plan.shellCommand ?? this.formatDirectInvocation(plan.command, plan.args) ownershipTransferred = true - const result = await backgroundExecSessionManager.start( + const result = await this.backgroundExec.start( options.conversationId, displayCommand, plan.cwd, @@ -182,14 +185,14 @@ export class SkillExecutionService { if (input.stdin !== undefined) { try { - await backgroundExecSessionManager.write( + await this.backgroundExec.write( options.conversationId, result.sessionId, input.stdin, true ) } catch (error) { - await backgroundExecSessionManager + await this.backgroundExec .remove(options.conversationId, result.sessionId) .catch((cleanupError) => { logger.warn('[SkillExecutionService] Failed to remove background session', { diff --git a/src/main/sync/host/index.ts b/src/main/sync/host/index.ts index befdaa7cd9..d2b2b43058 100644 --- a/src/main/sync/host/index.ts +++ b/src/main/sync/host/index.ts @@ -40,8 +40,8 @@ export interface SyncHostServiceDeps { changed?: () => void replica?: SyncReplicaEndpoint resolveCloudflared?: () => string - protectToken?: (token: string) => string - revealToken?: (wrapped: string) => string + protectToken?: (token: string) => Promise + revealToken?: (wrapped: string) => Promise createBackup: () => Promise getFolderPath: () => string getUserDataPath: () => string @@ -73,6 +73,7 @@ export class SyncHostService { private preparationError: string | null = null private lastPreparedAt = 0 private lifecycle: Promise = Promise.resolve() + private generation = 0 /** Identity minted before the first load, so every caller sees the same value. */ private pendingHostId: string | null = null @@ -164,9 +165,11 @@ export class SyncHostService { tunnel?: SyncTunnelConfig & { token?: string } } = {} ): Promise { + const generation = this.generation await this.serialize(async () => { await this.state.load() if (enabled) { + this.assertGeneration(generation) if (!options.consent) throw new Error('sync.tunnel.error.consentRequired') const port = options.port ?? this.state.snapshot().port if (!Number.isInteger(port) || port < 1 || port > 65535) { @@ -198,7 +201,8 @@ export class SyncHostService { } if (options.tunnel?.token?.trim()) { if (!this.deps.protectToken) throw new Error('sync.tunnel.error.credentialsUnavailable') - wrappedToken = this.deps.protectToken(options.tunnel.token.trim()) + wrappedToken = await this.deps.protectToken(options.tunnel.token.trim()) + this.assertGeneration(generation) } if (config.mode === 'named' && !wrappedToken) throw new Error('sync.tunnel.error.tokenRequired') @@ -209,8 +213,9 @@ export class SyncHostService { }) // Start before persisting so a failed bind never leaves host mode marked enabled without a // listener, and roll the listener back if the flag itself cannot be written. - await this.startInternal(port) + await this.startInternal(port, generation) try { + this.assertGeneration(generation) await this.state.update((state) => { state.allowWrites = options.bidirectional === true if (!state.allowWrites) for (const device of state.devices) device.writable = false @@ -235,15 +240,18 @@ export class SyncHostService { } async start(): Promise { - await this.serialize(() => this.startInternal()) + const generation = this.generation + await this.serialize(() => this.startInternal(undefined, generation)) } async stop(): Promise { + this.generation++ await this.serialize(() => this.stopInternal()) } /** Starts the endpoint only when host mode is enabled; safe to call unconditionally at boot. */ async startIfEnabled(): Promise { + const generation = this.generation await this.tunnel?.initialize() await this.initialize() await this.serialize(async () => { @@ -255,7 +263,7 @@ export class SyncHostService { }) return } - await this.startInternal(state.port) + await this.startInternal(state.port, generation) }) } @@ -382,25 +390,36 @@ export class SyncHostService { return this.endpoint.getAuditEntries() } - private async startInternal(port = this.state.snapshot().port): Promise { + private assertGeneration(generation: number): void { + if (generation !== this.generation) throw new Error('sync.tunnel.error.busy') + } + + private async startInternal( + port = this.state.snapshot().port, + generation = this.generation + ): Promise { + this.assertGeneration(generation) if (this.endpoint.isRunning()) { return } this.startError = null try { await this.endpoint.start({ port }) + this.assertGeneration(generation) const state = this.state.snapshot() if (state.tunnel.mode !== 'external') { if (!this.tunnel) throw new Error('sync.tunnel.error.tunnelUnavailable') let token: string | undefined if (state.tunnel.mode === 'named' && state.wrappedTunnelToken) { try { - token = this.deps.revealToken?.(state.wrappedTunnelToken) + token = await this.deps.revealToken?.(state.wrappedTunnelToken) } catch { throw new Error('sync.tunnel.error.credentialsUnavailable') } } + this.assertGeneration(generation) await this.tunnel.start(state.tunnel, port, token) + this.assertGeneration(generation) } } catch (error) { this.startError = diff --git a/src/main/sync/index.ts b/src/main/sync/index.ts index d3828b56af..89cf48171b 100644 --- a/src/main/sync/index.ts +++ b/src/main/sync/index.ts @@ -1,5 +1,4 @@ import { SYNC_PORTABLE_SETTINGS } from '@shared/types/syncPortableSettings' -import { app, shell } from 'electron' import { isNowledgeMachineLocalSetting } from '@shared/types/nowledgeMemPlugin' import path from 'path' import fs from 'fs' @@ -122,22 +121,38 @@ export interface SyncImportResult { importedSessions?: number } +export interface SyncHost { + profileDirectory: string + temporaryDirectory: string + openPath(directory: string): Promise +} + export class SyncService { private isBackingUp = false private currentBackupStatus: BackupStatus = 'idle' - private readonly APP_SETTINGS_PATH = path.join(app.getPath('userData'), 'app-settings.json') - private readonly CUSTOM_PROMPTS_PATH = path.join(app.getPath('userData'), 'custom_prompts.json') - private readonly SYSTEM_PROMPTS_PATH = path.join(app.getPath('userData'), 'system_prompts.json') - private readonly MCP_SETTINGS_PATH = path.join(app.getPath('userData'), 'mcp-settings.json') - private readonly DB_PATH = path.join(app.getPath('userData'), 'app_db', 'agent.db') + private readonly APP_SETTINGS_PATH: string + private readonly CUSTOM_PROMPTS_PATH: string + private readonly SYSTEM_PROMPTS_PATH: string + private readonly MCP_SETTINGS_PATH: string + private readonly DB_PATH: string constructor( private readonly settings: SyncSettings, private readonly database: SyncDatabasePort, private readonly settingsDatabase: SettingsDatabase, private readonly providerDatabase: ProviderDatabase, - private readonly publishEvent: DeepchatEventPublisher - ) {} + private readonly publishEvent: DeepchatEventPublisher, + private readonly host: SyncHost + ) { + if (!path.isAbsolute(host.profileDirectory) || !path.isAbsolute(host.temporaryDirectory)) { + throw new Error('Sync runtime directories must be absolute') + } + this.APP_SETTINGS_PATH = path.join(host.profileDirectory, 'app-settings.json') + this.CUSTOM_PROMPTS_PATH = path.join(host.profileDirectory, 'custom_prompts.json') + this.SYSTEM_PROMPTS_PATH = path.join(host.profileDirectory, 'system_prompts.json') + this.MCP_SETTINGS_PATH = path.join(host.profileDirectory, 'mcp-settings.json') + this.DB_PATH = path.join(host.profileDirectory, 'app_db', 'agent.db') + } public async checkSyncFolder(): Promise<{ exists: boolean; path: string }> { const syncFolderPath = this.settings.getFolderPath() @@ -150,7 +165,8 @@ export class SyncService { if (!exists) { fs.mkdirSync(syncFolderPath, { recursive: true }) } - shell.openPath(syncFolderPath) + const error = await this.host.openPath(syncFolderPath) + if (error) throw new Error(error) } public isBackupInProgress(): boolean { @@ -164,8 +180,8 @@ export class SyncService { // === Cloud sync (S3-compatible) === - private buildCloudService(): CloudStorageService { - const resolved = this.settings.getResolvedCloudConfig() + private async buildCloudService(): Promise { + const resolved = await this.settings.getResolvedCloudConfig() if (!resolved) { throw new Error('sync.error.cloudNotConfigured') } @@ -206,7 +222,7 @@ export class SyncService { public async testCloudConnection(): Promise { try { - const service = this.buildCloudService() + const service = await this.buildCloudService() await service.testConnection() return { success: true, message: 'sync.success.cloudConnected' } } catch (error) { @@ -217,7 +233,7 @@ export class SyncService { public async uploadLatestBackupToCloud(): Promise { try { - const service = this.buildCloudService() + const service = await this.buildCloudService() const backups = (await this.listBackups()).filter(({ fileName }) => BACKUP_FILE_NAME_REGEX.test(fileName) ) @@ -251,7 +267,7 @@ export class SyncService { public async downloadLatestBackupFromCloud(): Promise { try { - const service = this.buildCloudService() + const service = await this.buildCloudService() const { path: syncFolderPath } = await this.checkSyncFolder() const backupsDir = this.getBackupsDirectory(syncFolderPath) const fileName = await service.downloadLatest(backupsDir) @@ -356,7 +372,7 @@ export class SyncService { version: Date.now() }) - const extractionDir = path.join(app.getPath('temp'), `deepchat-backup-${Date.now()}`) + const extractionDir = path.join(this.host.temporaryDirectory, `deepchat-backup-${Date.now()}`) fs.mkdirSync(extractionDir, { recursive: true }) const tempCurrentFiles: Record = { @@ -577,7 +593,7 @@ export class SyncService { const active = this.database.getDatabase() if (!active.prepare("SELECT 1 FROM sqlite_master WHERE name='_sync_state'").get()) return const temporary = await fs.promises.mkdtemp( - path.join(app.getPath('temp'), 'deepchat-sync-backup-') + path.join(this.host.temporaryDirectory, 'deepchat-sync-backup-') ) const file = path.join(temporary, 'agent.db') try { @@ -1069,7 +1085,10 @@ export class SyncService { } private async validateBackupArchive(backupZipPath: string): Promise { - const extractionDir = path.join(app.getPath('temp'), `deepchat-backup-validate-${Date.now()}`) + const extractionDir = path.join( + this.host.temporaryDirectory, + `deepchat-backup-validate-${Date.now()}` + ) fs.mkdirSync(extractionDir, { recursive: true }) try { @@ -1168,7 +1187,7 @@ export class SyncService { } private createTempBackup(originalPath: string, name: string): string | null { - const tempPath = path.join(app.getPath('temp'), `${name}.${Date.now()}.bak`) + const tempPath = path.join(this.host.temporaryDirectory, `${name}.${Date.now()}.bak`) try { this.copyFile(originalPath, tempPath) } catch (error) { diff --git a/src/main/sync/peer/index.ts b/src/main/sync/peer/index.ts index 293155e026..bcfa73a204 100644 --- a/src/main/sync/peer/index.ts +++ b/src/main/sync/peer/index.ts @@ -36,8 +36,8 @@ type Pairing = z.infer export interface SyncPeerDeps { directory: string replicaId?(): string - protectToken(token: string): string - revealToken(wrapped: string): string + protectToken(token: string): Promise + revealToken(wrapped: string): Promise isLocalDatabaseEncrypted(): boolean importSnapshot(filePath: string, mode: 'increment' | 'overwrite'): Promise fetch?: typeof fetch @@ -57,6 +57,7 @@ export class SyncPeerService { private pairingBusy = false private stopping = false private cancelled = false + private credentialGeneration = 0 private progress: Pick = { phase: 'idle', received: 0, @@ -81,7 +82,8 @@ export class SyncPeerService { } } - private async writePrivate(name: string, value: unknown): Promise { + private async writePrivate(name: string, value: unknown, signal?: AbortSignal): Promise { + signal?.throwIfAborted() await mkdir(this.deps.directory, { recursive: true, mode: 0o700 }) const temporary = this.file(`${name}.${randomBytes(6).toString('hex')}.tmp`) try { @@ -92,6 +94,7 @@ export class SyncPeerService { } finally { await file.close() } + signal?.throwIfAborted() await rename(temporary, this.file(name)) } finally { await rm(temporary, { force: true }) @@ -99,13 +102,22 @@ export class SyncPeerService { } async connection(): Promise { + const generation = this.credentialGeneration + const check = () => { + if (this.stopping || this.pairingBusy || generation !== this.credentialGeneration) + fail('credentialsUnavailable') + } + check() const pairing = await this.readPairing() + check() if (!pairing) return null if (!pairing.bidirectional) throw new Error('sync.tunnel.error.writeConsentRequired') + const token = await this.deps.revealToken(pairing.wrappedToken) + check() return { hostUrl: pairing.hostUrl, hostId: pairing.hostId, - token: this.deps.revealToken(pairing.wrappedToken) + token } } @@ -163,10 +175,13 @@ export class SyncPeerService { bidirectional?: boolean }): Promise { this.pairingBusy = true + this.credentialGeneration++ this.controller = new AbortController() + const signal = this.controller.signal this.progress = { phase: 'pairing', received: 0, total: 0, error: null } try { await this.automatic?.setEnabled(false) + signal.throwIfAborted() let url: URL try { url = new URL(input.hostUrl) @@ -186,8 +201,9 @@ export class SyncPeerService { const replicaId = input.bidirectional ? this.deps.replicaId?.() : undefined if (input.bidirectional && !replicaId) fail('automaticUnsupported') // Fail before consuming a one-time code when the OS cannot protect a token. - this.deps.protectToken('availability-check') - await this.checkHost(hostUrl, input.hostId, this.controller.signal) + await this.deps.protectToken('availability-check') + signal.throwIfAborted() + await this.checkHost(hostUrl, input.hostId, signal) const response = SyncHostPairResponseSchema.parse( await this.json(hostUrl + SYNC_HOST_PAIR_PATH, { method: 'POST', @@ -198,18 +214,25 @@ export class SyncPeerService { bidirectional: input.bidirectional, replicaId }), - signal: this.controller.signal + signal }) ) - await this.writePrivate('pairing.json', { - hostUrl, - hostId: input.hostId, - deviceId: response.deviceId, - deviceName: response.deviceName, - wrappedToken: this.deps.protectToken(response.token), - lastSuccessAt: null, - bidirectional: input.bidirectional === true - } satisfies Pairing) + signal.throwIfAborted() + const wrappedToken = await this.deps.protectToken(response.token) + signal.throwIfAborted() + await this.writePrivate( + 'pairing.json', + { + hostUrl, + hostId: input.hostId, + deviceId: response.deviceId, + deviceName: response.deviceName, + wrappedToken, + lastSuccessAt: null, + bidirectional: input.bidirectional === true + } satisfies Pairing, + signal + ) await this.clearPartial() this.progress.phase = 'idle' } catch (error) { @@ -227,6 +250,7 @@ export class SyncPeerService { await this.automatic?.setEnabled(false) this.assertIdle() this.pairingBusy = true + this.credentialGeneration++ try { await rm(this.file('pairing.json'), { force: true }) await this.clearPartial() @@ -242,6 +266,7 @@ export class SyncPeerService { if ((await this.readPairing())?.bidirectional) fail('fullBackupIncompatible') if (this.automatic?.status().enabled) fail('busy') if (mode === 'overwrite' && !confirmOverwrite) fail('overwriteConfirmation') + this.assertIdle() this.cancelled = false this.controller = new AbortController() this.progress = { phase: 'downloading', received: 0, total: 0, error: null } @@ -267,6 +292,7 @@ export class SyncPeerService { async stop(): Promise { this.stopping = true + this.credentialGeneration++ if (this.progress.phase !== 'importing') { this.cancelled = true this.controller?.abort() @@ -348,11 +374,12 @@ export class SyncPeerService { await this.checkHost(pairing.hostUrl, pairing.hostId, signal) let token: string try { - token = this.deps.revealToken(pairing.wrappedToken) + token = await this.deps.revealToken(pairing.wrappedToken) } catch { fail('credentialsUnavailable') } if (!token) fail('credentialsUnavailable') + signal.throwIfAborted() const headers = { authorization: `Bearer ${token}` } let status = SyncHostStatusSchema.parse( await this.json(pairing.hostUrl + SYNC_HOST_STATUS_PATH, { headers, signal }) diff --git a/src/main/sync/routes.ts b/src/main/sync/routes.ts index 6c362100b6..c986f9debe 100644 --- a/src/main/sync/routes.ts +++ b/src/main/sync/routes.ts @@ -125,7 +125,9 @@ export function createSyncRoutes(deps: { syncGetCloudConfigRoute.name, async (rawInput) => { syncGetCloudConfigRoute.input.parse(rawInput) - return syncGetCloudConfigRoute.output.parse({ config: deps.settings.getCloudConfig() }) + return syncGetCloudConfigRoute.output.parse({ + config: await deps.settings.getCloudConfig() + }) } ], [ @@ -133,7 +135,7 @@ export function createSyncRoutes(deps: { async (rawInput) => { const input = syncSetCloudConfigRoute.input.parse(rawInput) return syncSetCloudConfigRoute.output.parse({ - config: deps.settings.setCloudConfig(input.config) + config: await deps.settings.setCloudConfig(input.config) }) } ], diff --git a/src/main/sync/settings.ts b/src/main/sync/settings.ts index 649b13df8b..706e5963a4 100644 --- a/src/main/sync/settings.ts +++ b/src/main/sync/settings.ts @@ -1,4 +1,3 @@ -import { app } from 'electron' import path from 'node:path' import type { SecretStore } from '@/config/secretStore' import type { SettingsStore } from '@/config/settingsStore' @@ -14,11 +13,18 @@ const CLOUD_SYNC_BASE_KEY = 'cloudSyncConfig' const CLOUD_SYNC_SECRET_KEY = 'cloudSyncSecret' export class SyncSettings { + private cloudMutation: Promise = Promise.resolve() + private readonly defaultFolderPath: string + constructor( private readonly settings: SettingsStore, private readonly secrets: SecretStore, - private readonly publishEvent: DeepchatEventPublisher - ) {} + private readonly publishEvent: DeepchatEventPublisher, + homeDirectory: string + ) { + if (!path.isAbsolute(homeDirectory)) throw new Error('Sync home directory must be absolute') + this.defaultFolderPath = path.join(homeDirectory, 'DeepchatSync') + } getEnabled(): boolean { return this.settings.get('syncEnabled') ?? false @@ -30,9 +36,7 @@ export class SyncSettings { } getFolderPath(): string { - return ( - this.settings.get('syncFolderPath') || path.join(app.getPath('home'), 'DeepchatSync') - ) + return this.settings.get('syncFolderPath') || this.defaultFolderPath } setFolderPath(folderPath: string): void { @@ -48,16 +52,36 @@ export class SyncSettings { this.settings.set('lastSyncTime', time) } - getCloudConfig(): CloudSyncConfigView { + async getCloudConfig(): Promise { + const check = this.secrets.captureOperation() const base = this.getCloudBase() + const [secret, safeStorageAvailable] = await Promise.all([ + this.secrets.get(CLOUD_SYNC_SECRET_KEY), + this.secrets.isAvailable() + ]) + check() return { ...base, - hasSecret: Boolean(this.secrets.get(CLOUD_SYNC_SECRET_KEY)), - safeStorageAvailable: this.secrets.isAvailable() + hasSecret: Boolean(secret), + safeStorageAvailable } } - setCloudConfig(config: CloudSyncConfigInput): CloudSyncConfigView { + setCloudConfig(config: CloudSyncConfigInput): Promise { + const check = this.secrets.captureOperation() + const operation = this.cloudMutation.then(() => this.writeCloudConfig(config, check)) + this.cloudMutation = operation.then( + () => undefined, + () => undefined + ) + return operation + } + + private async writeCloudConfig( + config: CloudSyncConfigInput, + check: () => void + ): Promise { + check() const current = this.getCloudBase() const next: CloudSyncConfigBase = { enabled: config.enabled ?? current.enabled, @@ -69,9 +93,14 @@ export class SyncSettings { } const currentWrappedSecret = this.secrets.getWrapped(CLOUD_SYNC_SECRET_KEY) const nextWrappedSecret = config.secretAccessKey?.length - ? this.secrets.wrap(config.secretAccessKey) + ? await this.secrets.wrap(config.secretAccessKey) : undefined + const hasSecret = + nextWrappedSecret !== undefined || Boolean(await this.secrets.get(CLOUD_SYNC_SECRET_KEY)) + const safeStorageAvailable = + nextWrappedSecret !== undefined || (await this.secrets.isAvailable()) + check() let secretWritten = false try { if (nextWrappedSecret !== undefined) { @@ -86,12 +115,14 @@ export class SyncSettings { throw error } - return this.getCloudConfig() + return { ...next, hasSecret, safeStorageAvailable } } - getResolvedCloudConfig(): ResolvedCloudSyncConfig | null { + async getResolvedCloudConfig(): Promise { + const check = this.secrets.captureOperation() const base = this.getCloudBase() - const secretAccessKey = this.secrets.get(CLOUD_SYNC_SECRET_KEY) + const secretAccessKey = await this.secrets.get(CLOUD_SYNC_SECRET_KEY) + check() if (!base.endpoint || !base.bucket || !base.accessKeyId || !secretAccessKey) { return null } diff --git a/src/main/tool/agentTools/agentBashHandler.ts b/src/main/tool/agentTools/agentBashHandler.ts index 993b878976..656bac57c1 100644 --- a/src/main/tool/agentTools/agentBashHandler.ts +++ b/src/main/tool/agentTools/agentBashHandler.ts @@ -5,7 +5,7 @@ import os from 'os' import { z } from 'zod' import logger from '@shared/logger' import { - backgroundExecSessionManager, + type BackgroundExecPort, getBackgroundExecConfig } from '@/agent/shared/process/backgroundExecSessionManager' import { terminateProcessTree } from '@/agent/shared/process/processTree' @@ -126,6 +126,7 @@ export class AgentBashHandler { constructor( allowedDirectories: string[], commandPermissionHandler: CommandPermissionService, + private readonly backgroundExec: BackgroundExecPort, private readonly commandEnvironment?: AgentCommandEnvironmentPort ) { if (allowedDirectories.length === 0) { @@ -358,7 +359,7 @@ export class AgentBashHandler { options.signal?.throwIfAborted() } - const session = await backgroundExecSessionManager.start(conversationId, command, cwd, { + const session = await this.backgroundExec.start(conversationId, command, cwd, { commandShell: options.commandShell, timeout, env: options.env, @@ -372,7 +373,7 @@ export class AgentBashHandler { let removal: Promise | undefined const removeSession = (): Promise => { - removal ??= backgroundExecSessionManager.remove(conversationId, session.sessionId) + removal ??= this.backgroundExec.remove(conversationId, session.sessionId) return removal } const signal = options.programmatic === true ? options.signal : undefined @@ -405,12 +406,7 @@ export class AgentBashHandler { } try { - await backgroundExecSessionManager.write( - conversationId, - session.sessionId, - options.stdin ?? '', - true - ) + await this.backgroundExec.write(conversationId, session.sessionId, options.stdin ?? '', true) } catch (error) { await removeSession().catch((cause) => { logger.warn('[AgentBashHandler] Failed to cleanup a session after stdin delivery failed', { @@ -427,7 +423,7 @@ export class AgentBashHandler { try { const yielded = options.stdin === undefined && options.programmatic !== true - ? await backgroundExecSessionManager.waitForCompletionOrYield( + ? await this.backgroundExec.waitForCompletionOrYield( conversationId, session.sessionId, options.yieldMs ?? getBackgroundExecConfig().backgroundMs, @@ -437,7 +433,7 @@ export class AgentBashHandler { kind: 'completed' as const, result: await (abortObserved && signal ? Promise.race([ - backgroundExecSessionManager.getCompletionResult( + this.backgroundExec.getCompletionResult( conversationId, session.sessionId, options.outputPreviewChars ?? COMMAND_PREVIEW_CHARS @@ -448,7 +444,7 @@ export class AgentBashHandler { throw new DOMException('Aborted', 'AbortError') }) ]) - : backgroundExecSessionManager.getCompletionResult( + : this.backgroundExec.getCompletionResult( conversationId, session.sessionId, options.outputPreviewChars ?? COMMAND_PREVIEW_CHARS @@ -756,22 +752,17 @@ export class AgentBashHandler { timeoutMs: timeout ?? COMMAND_DEFAULT_TIMEOUT_MS, background: true }) - const result = await backgroundExecSessionManager.start( - conversationId, - prepared.command, - spawnCwd, - { - commandShell: options.commandShell, - timeout: timeout ?? COMMAND_DEFAULT_TIMEOUT_MS, - env: prepared.env, - outputPrefix: options.outputPrefix, - previewChars: options.outputPreviewChars ?? COMMAND_PREVIEW_CHARS, - offloadThresholdChars: Math.min( - COMMAND_OFFLOAD_THRESHOLD, - options.outputPreviewChars ?? COMMAND_PREVIEW_CHARS - ) - } - ) + const result = await this.backgroundExec.start(conversationId, prepared.command, spawnCwd, { + commandShell: options.commandShell, + timeout: timeout ?? COMMAND_DEFAULT_TIMEOUT_MS, + env: prepared.env, + outputPrefix: options.outputPrefix, + previewChars: options.outputPreviewChars ?? COMMAND_PREVIEW_CHARS, + offloadThresholdChars: Math.min( + COMMAND_OFFLOAD_THRESHOLD, + options.outputPreviewChars ?? COMMAND_PREVIEW_CHARS + ) + }) return { output: { status: 'running', sessionId: result.sessionId } diff --git a/src/main/tool/agentTools/agentToolManager.ts b/src/main/tool/agentTools/agentToolManager.ts index 35dd819e57..3d23626c6a 100644 --- a/src/main/tool/agentTools/agentToolManager.ts +++ b/src/main/tool/agentTools/agentToolManager.ts @@ -12,7 +12,6 @@ import { toDeepChatJsonSchema } from '@shared/lib/zodJsonSchema' import { z } from 'zod' import fs from 'fs' import path from 'path' -import { app, nativeImage } from 'electron' import logger from '@shared/logger' import { awaitWithAbort } from '@/lib/awaitWithAbort' import type { ChatMessage } from '@shared/types/core/chat-message' @@ -532,6 +531,13 @@ export class AgentToolManager { this.commandPermissionHandler = options.commandPermissionHandler this.commandEnvironment = options.commandEnvironment this.dependencies = options.dependencies + for (const directory of [ + this.dependencies.desktop.tempDirectory, + this.dependencies.desktop.profileTempDirectory + ]) { + if (!path.isAbsolute(directory)) + throw new Error('Agent Tool host directories must be absolute') + } this.liveDelegationTool = this.dependencies.liveDelegation ? new LiveDelegationAgentTool(this.dependencies.liveDelegation) : null @@ -556,6 +562,7 @@ export class AgentToolManager { this.bashHandler = new AgentBashHandler( [this.agentWorkspacePath], this.commandPermissionHandler, + this.dependencies.backgroundExec, this.commandEnvironment ) } @@ -579,6 +586,7 @@ export class AgentToolManager { this.bashHandler = new AgentBashHandler( [effectiveWorkspacePath], this.commandPermissionHandler, + this.dependencies.backgroundExec, this.commandEnvironment ) } else { @@ -1333,8 +1341,7 @@ export class AgentToolManager { throw new Error('process tool requires a conversation ID') } - const { backgroundExecSessionManager } = - await import('@/agent/shared/process/backgroundExecSessionManager') + const backgroundExec = this.dependencies.backgroundExec const validationResult = this.fileSystemSchemas.process.safeParse(args) if (!validationResult.success) { @@ -1351,7 +1358,7 @@ export class AgentToolManager { switch (action) { case 'list': { - const sessions = await backgroundExecSessionManager.list(conversationId) + const sessions = await backgroundExec.list(conversationId) return { content: JSON.stringify({ status: 'ok', sessions }, null, 2) } @@ -1362,7 +1369,7 @@ export class AgentToolManager { throw new Error('sessionId is required for poll action') } const outputLimits = await this.resolveOutputLimitsForConversation(conversationId) - const result = await backgroundExecSessionManager.poll( + const result = await backgroundExec.poll( conversationId, sessionId, outputLimits.commandOutputInlineChars @@ -1376,12 +1383,7 @@ export class AgentToolManager { if (!sessionId) { throw new Error('sessionId is required for log action') } - const result = await backgroundExecSessionManager.log( - conversationId, - sessionId, - offset, - limit - ) + const result = await backgroundExec.log(conversationId, sessionId, offset, limit) return { content: JSON.stringify(result, null, 2) } @@ -1391,13 +1393,7 @@ export class AgentToolManager { if (!sessionId) { throw new Error('sessionId is required for write action') } - await backgroundExecSessionManager.write( - conversationId, - sessionId, - data ?? '', - eof, - commitMutation - ) + await backgroundExec.write(conversationId, sessionId, data ?? '', eof, commitMutation) return { content: JSON.stringify({ status: 'ok', sessionId }) } @@ -1407,7 +1403,7 @@ export class AgentToolManager { if (!sessionId) { throw new Error('sessionId is required for kill action') } - await backgroundExecSessionManager.kill(conversationId, sessionId, commitMutation) + await backgroundExec.kill(conversationId, sessionId, commitMutation) return { content: JSON.stringify({ status: 'ok', sessionId }) } @@ -1417,7 +1413,7 @@ export class AgentToolManager { if (!sessionId) { throw new Error('sessionId is required for clear action') } - await backgroundExecSessionManager.clear(conversationId, sessionId, commitMutation) + await backgroundExec.clear(conversationId, sessionId, commitMutation) return { content: JSON.stringify({ status: 'ok', sessionId }) } @@ -1427,7 +1423,7 @@ export class AgentToolManager { if (!sessionId) { throw new Error('sessionId is required for remove action') } - await backgroundExecSessionManager.remove(conversationId, sessionId, commitMutation) + await backgroundExec.remove(conversationId, sessionId, commitMutation) return { content: JSON.stringify({ status: 'ok', sessionId }) } @@ -1493,6 +1489,7 @@ export class AgentToolManager { const bashHandler = new AgentBashHandler( allowedDirectories, this.commandPermissionHandler, + this.dependencies.backgroundExec, this.commandEnvironment ) const execArgs = parsedArgs as { @@ -2288,8 +2285,8 @@ export class AgentToolManager { if (includeRuntimeRoots) { addPath(conversationId ? resolveSessionDir(conversationId) : null) - addPath(app.getPath('temp')) - addPath(path.join(app.getPath('userData'), 'temp')) + addPath(this.dependencies.desktop.tempDirectory) + addPath(this.dependencies.desktop.profileTempDirectory) } if (conversationId) { @@ -2472,17 +2469,24 @@ export class AgentToolManager { return mimeType.startsWith('image/') } - private buildImageMetadataBlock(filePath: string, mimeType: string, fileSize: number): string { + private async buildImageMetadataBlock( + filePath: string, + mimeType: string, + fileSize: number, + signal?: AbortSignal + ): Promise { + throwIfAbortRequested(signal) let width: number | null = null let height: number | null = null try { - const image = nativeImage.createFromPath(filePath) - const size = image.getSize() + const size = await this.dependencies.desktop.readImageSize(filePath, signal) + throwIfAbortRequested(signal) if (size.width > 0 && size.height > 0) { width = size.width height = size.height } } catch (error) { + throwIfAbortRequested(signal) logger.warn('[AgentToolManager] Failed to read image dimensions', { filePath, error }) } @@ -2506,7 +2510,13 @@ export class AgentToolManager { throwIfAbortRequested(signal) const fileBuffer = await fs.promises.readFile(filePath) throwIfAbortRequested(signal) - const metadata = this.buildImageMetadataBlock(filePath, mimeType, fileBuffer.length) + const metadata = await this.buildImageMetadataBlock( + filePath, + mimeType, + fileBuffer.length, + signal + ) + throwIfAbortRequested(signal) const dataUrl = `data:${mimeType};base64,${fileBuffer.toString('base64')}` let previewData: string | undefined let dispatchCommitFailed = false @@ -2801,7 +2811,11 @@ export class AgentToolManager { } private getDefaultAgentWorkspacePath(): string { - const tempDir = path.join(app.getPath('temp'), 'deepchat-agent', 'workspaces') + const tempDir = path.join( + this.dependencies.desktop.tempDirectory, + 'deepchat-agent', + 'workspaces' + ) try { fs.mkdirSync(tempDir, { recursive: true }) } catch (error) { @@ -2809,7 +2823,7 @@ export class AgentToolManager { '[AgentToolManager] Failed to create default workspace, using system temp:', error ) - return app.getPath('temp') + return this.dependencies.desktop.tempDirectory } return tempDir } @@ -2880,6 +2894,7 @@ export class AgentToolManager { private getSkillExecutionService(): SkillExecutionService { if (!this.skillExecutionService) { this.skillExecutionService = new SkillExecutionService({ + backgroundExec: this.dependencies.backgroundExec, resolveConversationWorkdir: (conversationId) => this.getWorkdirForConversation(conversationId) }) diff --git a/src/main/tool/agentTools/chatSettingsTools.ts b/src/main/tool/agentTools/chatSettingsTools.ts index fef7ce8186..4aaa14024e 100644 --- a/src/main/tool/agentTools/chatSettingsTools.ts +++ b/src/main/tool/agentTools/chatSettingsTools.ts @@ -2,8 +2,6 @@ import { z } from 'zod' import { toDeepChatJsonSchema } from '@shared/lib/zodJsonSchema' import type { ApplyChatSettingResult, - ChatSettingValue, - ChatLanguage, OpenChatSettingsResult, OpenChatSettingsSection } from '@shared/types/chatSettings' @@ -144,7 +142,10 @@ export class ChatSettingsToolHandler { desktopSettings: AgentDisplaySettingsPort skillSettings: SkillSettingsPort skillService: SkillServicePort - windowRuntime: AgentDesktopToolPort + windowRuntime: Pick< + AgentDesktopToolPort, + 'createSettingsWindow' | 'sendToWindow' | 'sendSettingsNavigation' + > } ) {} @@ -166,21 +167,6 @@ export class ChatSettingsToolHandler { return null } - private getCurrentValue(key: string): ChatSettingValue | undefined { - switch (key) { - case 'copyWithCotEnabled': - return this.options.desktopSettings.getCopyWithCotEnabled() - case 'language': - return this.options.desktopSettings.getRequestedLanguage() as ChatLanguage - case 'theme': - return this.options.desktopSettings.getTheme() - case 'fontSizeLevel': - return this.options.desktopSettings.getFontSizeLevel() - default: - return undefined - } - } - async toggle( raw: unknown, conversationId?: string, @@ -198,16 +184,9 @@ export class ChatSettingsToolHandler { } const { setting, enabled } = parsed.data - const previousValue = this.getCurrentValue(setting) beforeMutation?.(parsed.data) try { - switch (setting) { - case 'copyWithCotEnabled': - this.options.desktopSettings.setCopyWithCotEnabled(enabled) - break - default: - return buildError('unknown_setting', `Unsupported toggle: ${setting}`) - } + return await this.options.desktopSettings.applyDisplayChange({ id: setting, value: enabled }) } catch (error) { return buildError( 'apply_failed', @@ -215,14 +194,6 @@ export class ChatSettingsToolHandler { error instanceof Error ? error.message : String(error) ) } - - return { - ok: true, - id: setting, - value: enabled, - previousValue, - appliedAt: Date.now() - } } async setLanguage( @@ -246,10 +217,12 @@ export class ChatSettingsToolHandler { } const { language } = parsed.data - const previousValue = this.getCurrentValue('language') beforeMutation?.(parsed.data) try { - this.options.desktopSettings.setLanguage(language) + return await this.options.desktopSettings.applyDisplayChange({ + id: 'language', + value: language + }) } catch (error) { return buildError( 'apply_failed', @@ -257,14 +230,6 @@ export class ChatSettingsToolHandler { error instanceof Error ? error.message : String(error) ) } - - return { - ok: true, - id: 'language', - value: language, - previousValue, - appliedAt: Date.now() - } } async setTheme( @@ -284,10 +249,9 @@ export class ChatSettingsToolHandler { } const { theme } = parsed.data - const previousValue = this.getCurrentValue('theme') beforeMutation?.(parsed.data) try { - this.options.desktopSettings.setTheme(theme) + return await this.options.desktopSettings.applyDisplayChange({ id: 'theme', value: theme }) } catch (error) { return buildError( 'apply_failed', @@ -295,14 +259,6 @@ export class ChatSettingsToolHandler { error instanceof Error ? error.message : String(error) ) } - - return { - ok: true, - id: 'theme', - value: theme, - previousValue, - appliedAt: Date.now() - } } async setFontSize( @@ -326,10 +282,12 @@ export class ChatSettingsToolHandler { } const { level } = parsed.data - const previousValue = this.getCurrentValue('fontSizeLevel') beforeMutation?.(parsed.data) try { - this.options.desktopSettings.setFontSizeLevel(level) + return await this.options.desktopSettings.applyDisplayChange({ + id: 'fontSizeLevel', + value: level + }) } catch (error) { return buildError( 'apply_failed', @@ -337,14 +295,6 @@ export class ChatSettingsToolHandler { error instanceof Error ? error.message : String(error) ) } - - return { - ok: true, - id: 'fontSizeLevel', - value: level, - previousValue, - appliedAt: Date.now() - } } async open( diff --git a/src/main/tool/codeMode/runCodeRuntimeManager.ts b/src/main/tool/codeMode/runCodeRuntimeManager.ts index ecc527fd83..35304e5821 100644 --- a/src/main/tool/codeMode/runCodeRuntimeManager.ts +++ b/src/main/tool/codeMode/runCodeRuntimeManager.ts @@ -1,8 +1,4 @@ -import fs from 'node:fs' -import path from 'node:path' -import { fileURLToPath } from 'node:url' import { randomUUID } from 'node:crypto' -import type { UtilityProcess } from 'electron' import type { MCPToolDefinition, MCPToolResponse, ToolDispatchCommitInput } from '@shared/types/mcp' import type { ToolCallOptions } from '@shared/types/tool' import { @@ -20,13 +16,25 @@ import { MAX_EXECUTION_JOURNAL_NESTED_CHILDREN } from '@/tape/domain/executionJo import { awaitWithAbort } from '@/lib/awaitWithAbort' import { normalizeCodexToolName } from './toolModeTools' -type CodeModeUtilityProcess = Pick & { - on(event: 'message', listener: (message: unknown) => void): CodeModeUtilityProcess - on(event: 'exit', listener: (code: number) => void): CodeModeUtilityProcess - on(event: 'error', listener: (type: string, location: string) => void): CodeModeUtilityProcess - off(event: 'message', listener: (message: unknown) => void): CodeModeUtilityProcess - off(event: 'exit', listener: (code: number) => void): CodeModeUtilityProcess - off(event: 'error', listener: (type: string, location: string) => void): CodeModeUtilityProcess +type CodeModeHostEvents = { + message: [message: unknown] + exit: [code: number] + error: [type: string, location: string] +} + +export interface CodeModeHost { + readonly pid: number | undefined + postMessage(message: RunCodeParentMessage): void + kill(): void + on( + event: T, + listener: (...args: CodeModeHostEvents[T]) => void + ): void + off( + event: T, + listener: (...args: CodeModeHostEvents[T]) => void + ): void + getRssBytes(signal: AbortSignal): Promise } export interface RunCodeNestedExecutionInput { @@ -42,7 +50,7 @@ export interface RunCodeRuntimeManagerOptions { executeNested( input: RunCodeNestedExecutionInput ): Promise<{ content: unknown; rawData: MCPToolResponse }> - spawnHost?: () => Promise + spawnHost(signal: AbortSignal): Promise } export interface RunCodeExecutionInput { @@ -107,7 +115,7 @@ type ActiveCell = { runId?: string outerToolCallId: string frontend: RunCodeFrontend - host: CodeModeUtilityProcess + host: CodeModeHost state: CellState bindings: Map< string, @@ -136,6 +144,7 @@ type ActiveCell = { startupRssBytes: number | null heartbeatTimer: NodeJS.Timeout | null rssTimer: NodeJS.Timeout | null + rssInspection: Promise | null executionDeadlineTimer: NodeJS.Timeout | null yieldLeaseTimer: NodeJS.Timeout | null forceKillTimer: NodeJS.Timeout | null @@ -252,12 +261,22 @@ export class RunCodeRuntimeManager { private readonly cellsById = new Map() private readonly cellsBySession = new Map() private readonly storesBySession = new Map>() - private shuttingDown = false + private readonly lifetime = new AbortController() + private readonly physicalCells = new Set() + private readonly operations = new Set>() + private readonly pendingStarts = new Map< + string, + { + controller: AbortController + completion: Promise<{ result: Promise }> + } + >() + private shutdownPromise: Promise | null = null constructor(private readonly managerOptions: RunCodeRuntimeManagerOptions) {} async execute(input: RunCodeExecutionInput): Promise { - if (this.shuttingDown) throw new Error('Code mode runtime is shutting down.') + if (this.lifetime.signal.aborted) throw new Error('Code mode runtime is shutting down.') input.options.signal?.throwIfAborted() assertCompleteJournalCapabilities(input.options) if (Buffer.byteLength(input.source, 'utf8') > RUN_CODE_SOURCE_MAX_BYTES) { @@ -277,11 +296,14 @@ export class RunCodeRuntimeManager { this.clearCellLease(existing) this.bindAbortSignal(existing, input.options.signal) existing.waiter = createDeferred() - void this.retryPermissionCall(existing) + void this.trackOperation(this.retryPermissionCall(existing)) return await existing.waiter.promise } throw new Error(`Session ${input.sessionId} already has an active code cell.`) } + if (this.pendingStarts.has(input.sessionId)) { + throw new Error(`Session ${input.sessionId} already has a code cell starting.`) + } const cellId = randomUUID() @@ -318,50 +340,74 @@ export class RunCodeRuntimeManager { }) } - input.options.commitDispatch?.(input.outerDispatch) - const host = await this.spawnReadyHost(input.options.signal) - if (input.options.signal?.aborted) { - try { - host.kill() - } catch {} - input.options.signal.throwIfAborted() - } - - const cell = this.createCell({ - id: cellId, - sessionId: input.sessionId, - runId: input.runId, - outerToolCallId: input.toolCallId, - frontend: input.frontend, - host, - bindings, - capabilityHash: canonicalCatalog.fullCatalogHash, - yieldTimeMs: input.yieldTimeMs ?? 10_000, - maxOutputTokens: input.maxOutputTokens ?? 10_000, - timeoutMs: input.timeoutMs ?? RUN_CODE_DEFAULT_TIMEOUT_MS, - options: input.options, - committedDispatchToolCallId: input.toolCallId - }) - this.cellsById.set(cell.id, cell) - this.cellsBySession.set(cell.sessionId, cell) - this.attachCell(cell) - cell.state = 'running' - this.post(cell, { - type: 'START', - version: RUN_CODE_PROTOCOL_VERSION, - cellId, - frontend: input.frontend, - source: input.source, - bindings: [...bindings.values()].map(({ binding }) => binding), - store: structuredClone(this.storesBySession.get(input.sessionId) ?? {}) + const controller = new AbortController() + const signal = AbortSignal.any([ + this.lifetime.signal, + controller.signal, + ...(input.options.signal ? [input.options.signal] : []) + ]) + const completion = this.trackOperation( + Promise.resolve().then(async () => { + signal.throwIfAborted() + input.options.commitDispatch?.(input.outerDispatch) + const host = await this.spawnReadyHost(signal) + if (signal.aborted) { + host.kill() + signal.throwIfAborted() + } + const cell = this.createCell({ + id: cellId, + sessionId: input.sessionId, + runId: input.runId, + outerToolCallId: input.toolCallId, + frontend: input.frontend, + host, + bindings, + capabilityHash: canonicalCatalog.fullCatalogHash, + yieldTimeMs: input.yieldTimeMs ?? 10_000, + maxOutputTokens: input.maxOutputTokens ?? 10_000, + timeoutMs: input.timeoutMs ?? RUN_CODE_DEFAULT_TIMEOUT_MS, + options: input.options, + committedDispatchToolCallId: input.toolCallId + }) + const waiter = cell.waiter + if (!waiter) throw new Error('Code cell lost its initial result waiter.') + void waiter.promise.catch(() => undefined) + this.physicalCells.add(cell) + this.cellsById.set(cell.id, cell) + this.cellsBySession.set(cell.sessionId, cell) + try { + signal.throwIfAborted() + this.attachCell(cell) + signal.throwIfAborted() + cell.state = 'running' + this.post(cell, { + type: 'START', + version: RUN_CODE_PROTOCOL_VERSION, + cellId, + frontend: input.frontend, + source: input.source, + bindings: [...bindings.values()].map(({ binding }) => binding), + store: structuredClone(this.storesBySession.get(input.sessionId) ?? {}) + }) + this.scheduleYield(cell) + } catch (error) { + this.failAndCleanup(cell, toError(error)) + throw error + } + return { result: waiter.promise } + }) + ).finally(() => { + if (this.pendingStarts.get(input.sessionId)?.completion === completion) + this.pendingStarts.delete(input.sessionId) }) - this.scheduleYield(cell) - const waiter = cell.waiter - if (!waiter) throw new Error('Code cell lost its initial result waiter.') - return await waiter.promise + this.pendingStarts.set(input.sessionId, { controller, completion }) + const prepared = await awaitWithAbort(completion, signal) + return await prepared.result } async wait(input: RunCodeWaitInput): Promise { + this.lifetime.signal.throwIfAborted() input.options.signal?.throwIfAborted() assertCompleteJournalCapabilities(input.options) const cell = this.cellsById.get(input.cellId) @@ -388,7 +434,7 @@ export class RunCodeRuntimeManager { this.clearCellLease(cell) this.bindAbortSignal(cell, input.options.signal) cell.waiter = createDeferred() - void this.retryPermissionCall(cell) + void this.trackOperation(this.retryPermissionCall(cell)) return await cell.waiter.promise } @@ -442,32 +488,51 @@ export class RunCodeRuntimeManager { } cancelSession(sessionId: string, reason = 'Session closed.'): void { + this.pendingStarts.get(sessionId)?.controller.abort(new Error(reason)) const cell = this.cellsBySession.get(sessionId) if (cell) this.failAndCleanup(cell, new Error(reason)) this.storesBySession.delete(sessionId) } - async shutdown(): Promise { - this.shuttingDown = true - const cells = [...this.cellsById.values()] + stop(): void { + if (this.lifetime.signal.aborted) return + this.lifetime.abort(new DOMException('Code mode runtime shut down.', 'AbortError')) + for (const cell of this.cellsById.values()) + this.failAndCleanup(cell, new Error('Code mode runtime shut down.')) + } + + shutdown(): Promise { + if (this.shutdownPromise) return this.shutdownPromise + this.stop() + this.shutdownPromise = this.performShutdown() + return this.shutdownPromise + } + + private async performShutdown(): Promise { await Promise.all( - cells.map(async (cell) => { - this.failAndCleanup(cell, new Error('Code mode runtime shut down.')) - await this.waitForExit(cell, STOP_GRACE_MS + 100) - }) + [...this.physicalCells].map((cell) => this.waitForExit(cell, STOP_GRACE_MS + 100)) ) + while (this.operations.size) await Promise.allSettled(this.operations) this.cellsById.clear() this.cellsBySession.clear() this.storesBySession.clear() } + private trackOperation(promise: Promise): Promise { + const tracked = promise.finally(() => { + this.operations.delete(tracked) + }) + this.operations.add(tracked) + return tracked + } + private createCell(input: { id: string sessionId: string runId?: string outerToolCallId: string frontend: RunCodeFrontend - host: CodeModeUtilityProcess + host: CodeModeHost bindings: ActiveCell['bindings'] yieldTimeMs: number maxOutputTokens: number @@ -496,6 +561,7 @@ export class RunCodeRuntimeManager { startupRssBytes: null, heartbeatTimer: null, rssTimer: null, + rssInspection: null, executionDeadlineTimer: null, yieldLeaseTimer: null, forceKillTimer: null, @@ -620,7 +686,7 @@ export class RunCodeRuntimeManager { private drainPendingNestedCalls(cell: ActiveCell): void { const pending = cell.pendingNestedMessages.splice(0) - for (const message of pending) void this.handleNestedCall(cell, message) + for (const message of pending) void this.trackOperation(this.handleNestedCall(cell, message)) } private flushPendingHostSettlement(cell: ActiveCell): void { @@ -793,7 +859,7 @@ export class RunCodeRuntimeManager { cell.lastHeartbeatAt = Date.now() return case 'NESTED_CALL': - void this.handleNestedCall(cell, message) + void this.trackOperation(this.handleNestedCall(cell, message)) return case 'YIELDED': if (cell.frontend !== 'codex') { @@ -963,6 +1029,7 @@ export class RunCodeRuntimeManager { } private detachCell(cell: ActiveCell): void { + this.physicalCells.delete(cell) if (cell.forceKillTimer) clearTimeout(cell.forceKillTimer) cell.forceKillTimer = null cell.host.off('message', cell.onMessage) @@ -1045,45 +1112,49 @@ export class RunCodeRuntimeManager { } private inspectRss(cell: ActiveCell): void { - if (!cell.host.pid) return - void import('electron') - .then(({ app }) => { - if (cell.state === 'stopping') return - const metric = app.getAppMetrics().find((entry) => entry.pid === cell.host.pid) - const rssBytes = metric ? metric.memory.workingSetSize * 1024 : null - if (rssBytes === null) return - cell.startupRssBytes ??= rssBytes - const softLimit = Math.max(RSS_SOFT_MIN_BYTES, cell.startupRssBytes + RSS_SOFT_DELTA_BYTES) - if (rssBytes > RSS_HARD_BYTES) { - this.failAndCleanup(cell, new Error('Code cell exceeded the 512 MiB RSS limit.')) - } else if (rssBytes > softLimit) { - console.warn('[RunCodeRuntime] Code cell exceeded the RSS soft ceiling.', { - cellId: cell.id, - rssBytes, - softLimit - }) - } - }) - .catch((error) => { - if (cell.state !== 'stopping') { - console.warn('[RunCodeRuntime] Failed to inspect utility process RSS.', error) - } - }) + const signal = cell.runtimeAbortController.signal + if (signal.aborted || cell.rssInspection) return + const inspection = this.trackOperation( + Promise.resolve() + .then(async () => { + signal.throwIfAborted() + const rssBytes = await cell.host.getRssBytes(signal) + if (signal.aborted || rssBytes === null) return + if (!Number.isFinite(rssBytes) || rssBytes < 0) + throw new Error('Invalid Code Mode RSS sample') + cell.startupRssBytes ??= rssBytes + const softLimit = Math.max( + RSS_SOFT_MIN_BYTES, + cell.startupRssBytes + RSS_SOFT_DELTA_BYTES + ) + if (rssBytes > RSS_HARD_BYTES) { + this.failAndCleanup(cell, new Error('Code cell exceeded the 512 MiB RSS limit.')) + } else if (rssBytes > softLimit) { + console.warn('[RunCodeRuntime] Code cell exceeded the RSS soft ceiling.', { + cellId: cell.id, + rssBytes, + softLimit + }) + } + }) + .catch((error) => { + if (!signal.aborted) + console.warn('[RunCodeRuntime] Failed to inspect utility process RSS.', error) + }) + ).finally(() => { + if (cell.rssInspection === inspection) cell.rssInspection = null + }) + cell.rssInspection = inspection } - private async spawnReadyHost(signal?: AbortSignal): Promise { - signal?.throwIfAborted() - const spawning = this.managerOptions.spawnHost - ? this.managerOptions.spawnHost() - : this.spawnDefaultHost() - let host: CodeModeUtilityProcess - try { - host = await awaitWithAbort(spawning, signal) - } catch (error) { - void spawning.then((abandonedHost) => abandonedHost.kill()).catch(() => undefined) - throw error + private async spawnReadyHost(signal: AbortSignal): Promise { + signal.throwIfAborted() + const host = await this.managerOptions.spawnHost(signal) + if (signal.aborted) { + host.kill() + signal.throwIfAborted() } - return await new Promise((resolve, reject) => { + return await new Promise((resolve, reject) => { let settled = false const settle = (callback: () => void) => { if (settled) return @@ -1108,9 +1179,12 @@ export class RunCodeRuntimeManager { const onExit = (code: number) => settle(() => reject(new Error(`Code mode utility exited before ready: ${code}`))) const onError = (type: string, location: string) => - settle(() => + settle(() => { + try { + host.kill() + } catch {} reject(new Error(`Code mode utility failed before ready: ${type} at ${location}`)) - ) + }) const onAbort = () => settle(() => { try { @@ -1134,41 +1208,6 @@ export class RunCodeRuntimeManager { }) } - private async spawnDefaultHost(): Promise { - const { app, utilityProcess } = await import('electron') - const modulePath = this.resolveUtilityHostEntryPoint(app.getAppPath()) - const env: Record = { - DEEPCHAT_CODE_MODE_HOST: '1' - } - for (const name of ['LANG', 'LC_ALL', 'TMPDIR', 'TEMP', 'TMP', 'SystemRoot']) { - const value = process.env[name] - if (value) env[name] = value - } - return utilityProcess.fork(modulePath, ['--deepchat-code-mode-host'], { - serviceName: 'DeepChat Code Mode Cell', - stdio: 'ignore', - env, - execArgv: ['--max-old-space-size=64'], - allowLoadingUnsignedLibraries: false - }) as CodeModeUtilityProcess - } - - private resolveUtilityHostEntryPoint(appPath?: string): string { - const modulePath = fileURLToPath(import.meta.url) - const candidates = [ - ...(appPath - ? [ - path.join(appPath, 'out/main/codeModeUtilityHost.js'), - path.join(appPath, 'codeModeUtilityHost.js') - ] - : []), - path.resolve(path.dirname(modulePath), 'codeModeUtilityHost.js'), - path.resolve(path.dirname(modulePath), '../../codeModeUtilityHost.js'), - path.resolve(process.cwd(), 'out/main/codeModeUtilityHost.js') - ] - return candidates.find((candidate) => fs.existsSync(candidate)) ?? candidates[0] - } - private async waitForExit(cell: ActiveCell, timeoutMs: number): Promise { if (cell.exited) return await new Promise((resolve) => { diff --git a/src/main/tool/index.ts b/src/main/tool/index.ts index f0629b81db..c12f64163d 100644 --- a/src/main/tool/index.ts +++ b/src/main/tool/index.ts @@ -114,7 +114,7 @@ type MainProcessToolPreCheckOptions = Pick< > import type { AgentCommandEnvironmentPort } from './agentTools/agentBashHandler' import type { ToolEffectObserver } from './effectObserver' -import { resolvePluginToolPolicy } from '@/plugin/toolPolicyStore' +import type { PluginToolPolicyStore } from '@/plugin/toolPolicyStore' import { composeSubagentAuthority } from '@/session/subagentAuthority' import type { LiveDelegationConsentIssuer } from '@/orchestration/liveDelegationConsent' import { parseChildAgentResultEnvelopeText } from '@shared/orchestration/resultSafety' @@ -122,7 +122,10 @@ import { ExecutionContractDispatchError, assertExecutionContractAllowsDispatch } from '@/tape/domain/executionContract' -import { RunCodeRuntimeManager } from './codeMode/runCodeRuntimeManager' +import { + RunCodeRuntimeManager, + type RunCodeRuntimeManagerOptions +} from './codeMode/runCodeRuntimeManager' import { APPLY_PATCH_TOOL_NAME, CODE_MODE_EXEC_TOOL_NAME, @@ -151,6 +154,8 @@ type McpToolPort = Pick< > interface ToolServiceOptions { + pluginToolPolicies: Pick + spawnCodeModeHost: RunCodeRuntimeManagerOptions['spawnHost'] mcpService: McpToolPort providerSettings: Pick settings: Pick @@ -279,6 +284,7 @@ export class ToolService implements ToolServicePort { this.mapper = new ToolMapper() this.conversationMappers = new Map() this.runCodeRuntime = new RunCodeRuntimeManager({ + spawnHost: options.spawnCodeModeHost, executeNested: async (input) => await this.callTool( { @@ -650,6 +656,10 @@ export class ToolService implements ToolServicePort { return [...codeEntryTools, ...codeModeDirectTools] } + stopCodeRuntime(): void { + this.runCodeRuntime.stop() + } + async shutdownCodeRuntime(): Promise { await this.runCodeRuntime.shutdown() } @@ -2066,7 +2076,7 @@ export class ToolService implements ToolServicePort { if (!serverName) { return true } - const policy = resolvePluginToolPolicy( + const policy = this.options.pluginToolPolicies.resolve( serverName, definition.raw?.name ?? definition.function.name ) @@ -2096,7 +2106,7 @@ export class ToolService implements ToolServicePort { } const policy = definition - ? resolvePluginToolPolicy( + ? this.options.pluginToolPolicies.resolve( definition.server.name, definition.raw?.name ?? definition.function.name ) diff --git a/src/main/tool/runtimePorts.ts b/src/main/tool/runtimePorts.ts index 68a329c73f..36f2870b39 100644 --- a/src/main/tool/runtimePorts.ts +++ b/src/main/tool/runtimePorts.ts @@ -2,6 +2,7 @@ import type { FileServicePort } from '@shared/types/file' import type { ProviderRuntimePort } from '@shared/types/provider' import type { MCPToolDefinition } from '@shared/types/mcp' import type { SettingsNavigationPayload } from '@shared/settingsNavigation' +import type { ApplyChatSettingSuccess, ChatSettingMutation } from '@shared/types/chatSettings' import type { DeepChatSubagentMeta, DeepChatSubagentCapability, @@ -44,6 +45,7 @@ import type { cronJobsUpsertInputSchema } from '@shared/contracts/routes/cronJob import type { z } from 'zod' import type { LiveDelegationConsentReceipt } from '@/orchestration/liveDelegationConsent' import type { ReadSessionInput } from '@shared/sessionReferences' +import type { BackgroundExecPort } from '@/agent/shared/process/backgroundExecSessionManager' export type AgentToolCronJobUpsertInput = z.input @@ -233,20 +235,16 @@ export type AgentProviderToolPort = Pick< > export interface AgentDesktopToolPort { + readonly tempDirectory: string + readonly profileTempDirectory: string + readImageSize(filePath: string, signal?: AbortSignal): Promise<{ width: number; height: number }> createSettingsWindow(): Promise sendToWindow(windowId: number, channel: string, ...args: unknown[]): boolean sendSettingsNavigation(windowId: number, navigation: SettingsNavigationPayload): boolean } export interface AgentDisplaySettingsPort { - getCopyWithCotEnabled(): boolean - setCopyWithCotEnabled(enabled: boolean): void - getRequestedLanguage(): string - setLanguage(language: string): void - getTheme(): 'system' | 'light' | 'dark' - setTheme(theme: 'system' | 'light' | 'dark'): void - getFontSizeLevel(): number - setFontSizeLevel(level: number): void + applyDisplayChange(change: ChatSettingMutation): Promise } export interface AgentToolPermissionPort { @@ -263,6 +261,7 @@ export interface AgentToolPermissionPort { } export interface AgentToolDependencies { + backgroundExec: BackgroundExecPort sessions: AgentToolSessionPort tape: AgentTapeToolPort memory: AgentMemoryToolPort diff --git a/src/main/upgrade/index.ts b/src/main/upgrade/index.ts index 8fbf101c67..663fb8889c 100644 --- a/src/main/upgrade/index.ts +++ b/src/main/upgrade/index.ts @@ -169,7 +169,7 @@ export class UpgradeService { } constructor( - private readonly settings: UpdateSettings, + private readonly settings: Pick, private readonly isPrivacyModeEnabled: () => boolean, requestUpdateInstall: (installAction: () => void) => Promise, private readonly publishEvent: DeepchatEventPublisher, diff --git a/src/main/upgrade/routes.ts b/src/main/upgrade/routes.ts index b0651be599..b3cbbaa42c 100644 --- a/src/main/upgrade/routes.ts +++ b/src/main/upgrade/routes.ts @@ -1,6 +1,6 @@ import { app } from 'electron' import type { UpgradeService } from './index' -import type { UpdateSettings } from './settings' +import type { AppSettingsService } from '@/app/settingsService' import { configGetUpdateChannelRoute, configSetUpdateChannelRoute, @@ -25,7 +25,7 @@ export function createUpgradeRoutes(deps: { | 'clearMockUpdate' | 'restartToUpdate' > - settings: UpdateSettings + settings: Pick }): DeepchatRouteMap { const { upgrade } = deps return createRouteMap([ @@ -33,15 +33,18 @@ export function createUpgradeRoutes(deps: { configGetUpdateChannelRoute.name, async (rawInput) => { configGetUpdateChannelRoute.input.parse(rawInput) - return configGetUpdateChannelRoute.output.parse({ channel: deps.settings.getChannel() }) + return configGetUpdateChannelRoute.output.parse({ + channel: await deps.settings.getUpdateChannel() + }) } ], [ configSetUpdateChannelRoute.name, async (rawInput) => { const input = configSetUpdateChannelRoute.input.parse(rawInput) - deps.settings.setChannel(input.channel) - return configSetUpdateChannelRoute.output.parse({ channel: deps.settings.getChannel() }) + return configSetUpdateChannelRoute.output.parse({ + channel: await deps.settings.setUpdateChannel(input.channel) + }) } ], [ diff --git a/src/main/upgrade/settings.ts b/src/main/upgrade/settings.ts index 0f88c236ae..18533f2aab 100644 --- a/src/main/upgrade/settings.ts +++ b/src/main/upgrade/settings.ts @@ -1,15 +1,17 @@ -import { app } from 'electron' import type { SettingsStore } from '@/config/settingsStore' export class UpdateSettings { - constructor(private readonly settings: SettingsStore) {} + constructor( + private readonly settings: SettingsStore, + private readonly appVersion: string + ) {} getChannel(): 'stable' | 'beta' { const raw = this.settings.get('updateChannel') if (raw === 'stable' || raw === 'beta') { return raw } - const channel = /-(?:alpha|beta|rc|canary)(?:[.-]\d+)?$/i.test(app.getVersion()) + const channel = /-(?:alpha|beta|rc|canary)(?:[.-]\d+)?$/i.test(this.appVersion) ? 'beta' : 'stable' this.settings.set('updateChannel', channel) diff --git a/src/renderer/api/SettingsClient.ts b/src/renderer/api/SettingsClient.ts index a2237bf249..adf8105fcf 100644 --- a/src/renderer/api/SettingsClient.ts +++ b/src/renderer/api/SettingsClient.ts @@ -1,8 +1,10 @@ import type { DeepchatBridge } from '@shared/contracts/bridge' +import { RevisionSchema } from '@shared/contracts/common' import type { AgentCommandShellConfig } from '@shared/commandShell' import { settingsChangedEvent, settingsCommandShellChangedEvent } from '@shared/contracts/events' import type { SettingsNavigationPayload } from '@shared/settingsNavigation' import { + SETTINGS_KEYS, configGetEntriesRoute, configUpdateEntriesRoute, settingsCheckCommandShellRoute, @@ -16,6 +18,7 @@ import { type ConfigEntryChange, type ConfigEntryKey, type ConfigEntryValues, + type DeepchatRouteOutput, type SettingsChange, type SettingsKey, type SettingsSnapshotValues @@ -46,9 +49,27 @@ const normalizeSettingsNavigationPayload = ( } export function createSettingsClient(bridge: DeepchatBridge = getDeepchatBridge()) { - async function getSnapshot(keys?: SettingsKey[]): Promise> { - const result = await bridge.invoke(settingsGetSnapshotRoute.name, { keys }) - return result.values + const observedVersions = new Map() + + function acceptSnapshot(snapshot: { + version: number + values: Partial + }): Partial { + const version = RevisionSchema.parse(snapshot.version) + const accepted: Partial = {} + for (const key of SETTINGS_KEYS) { + if (!Object.hasOwn(snapshot.values, key)) continue + if (version < (observedVersions.get(key) ?? -1)) continue + observedVersions.set(key, version) + Object.assign(accepted, { [key]: snapshot.values[key] }) + } + return accepted + } + + async function getSnapshot( + keys?: SettingsKey[] + ): Promise> { + return await bridge.invoke(settingsGetSnapshotRoute.name, { keys }) } async function getSystemFonts(): Promise { @@ -115,7 +136,9 @@ export function createSettingsClient(bridge: DeepchatBridge = getDeepchatBridge( values: Partial }) => void ) { - return bridge.on(settingsChangedEvent.name, listener) + return bridge.on(settingsChangedEvent.name, (payload) => + listener({ ...payload, values: acceptSnapshot(payload) }) + ) } function onCommandShellChanged( @@ -126,6 +149,7 @@ export function createSettingsClient(bridge: DeepchatBridge = getDeepchatBridge( return { getSnapshot, + acceptSnapshot, getSystemFonts, getCommandShell, updateCommandShell, diff --git a/src/renderer/settings/components/OcrSettings.vue b/src/renderer/settings/components/OcrSettings.vue index b20037149f..63e02dd6fb 100644 --- a/src/renderer/settings/components/OcrSettings.vue +++ b/src/renderer/settings/components/OcrSettings.vue @@ -295,6 +295,7 @@ import { Switch } from '@shadcn/components/ui/switch' import SettingsPageShell from './control-center/SettingsPageShell.vue' import SettingsSectionCard from './control-center/SettingsSectionCard.vue' import { notifyRenderer } from '@renderer-notifications/rendererNotificationPort' +import type { SettingsSnapshotValues } from '@shared/contracts/routes' type OcrBackend = 'auto' | 'cpu' @@ -402,9 +403,20 @@ onMounted(() => { onBeforeUnmount(() => { disposed = true + unsubscribeSettings() pausePolling() }) +const unsubscribeSettings = settingsClient.onChanged(({ values }) => { + if (!disposed) applySettingsValues(values) +}) + +function applySettingsValues(values: Partial): void { + if (typeof values.ocrAutoExtractForNonVisionModels === 'boolean') + automaticExtractionEnabled.value = values.ocrAutoExtractForNonVisionModels + if (values.ocrBackend !== undefined) backend.value = values.ocrBackend +} + watch(pollingAllowed, (allowed) => { pausePolling() if (allowed) activatePolling() @@ -415,12 +427,12 @@ async function loadSettings(): Promise { settingsOperationPending.value = true try { - const values = await settingsClient.getSnapshot([ + const snapshot = await settingsClient.getSnapshot([ 'ocrAutoExtractForNonVisionModels', 'ocrBackend' ]) - automaticExtractionEnabled.value = values.ocrAutoExtractForNonVisionModels ?? true - backend.value = values.ocrBackend ?? 'auto' + if (disposed) return + applySettingsValues(settingsClient.acceptSnapshot(snapshot)) settingsReady.value = true notifyRenderer({ kind: 'success', @@ -428,6 +440,7 @@ async function loadSettings(): Promise { title: t('common.saved') }) } catch (error) { + if (disposed) return settingsReady.value = false console.error('[OcrSettings] Failed to load settings', error) notifyRenderer({ @@ -445,13 +458,15 @@ async function updateAutomaticExtraction(value: boolean): Promise { settingsOperationPending.value = true try { const result = await settingsClient.update([{ key: 'ocrAutoExtractForNonVisionModels', value }]) - automaticExtractionEnabled.value = result.values.ocrAutoExtractForNonVisionModels ?? value + if (disposed) return + applySettingsValues(settingsClient.acceptSnapshot(result)) notifyRenderer({ kind: 'success', code: 'settings.ocr.autoExtractUpdated', title: t('common.saved') }) } catch (error) { + if (disposed) return console.error('[OcrSettings] Failed to update automatic extraction', error) notifyRenderer({ kind: 'error', @@ -468,13 +483,15 @@ async function updateBackend(value: AcceptableValue): Promise { settingsOperationPending.value = true try { const result = await settingsClient.update([{ key: 'ocrBackend', value }]) - backend.value = result.values.ocrBackend ?? value + if (disposed) return + applySettingsValues(settingsClient.acceptSnapshot(result)) notifyRenderer({ kind: 'success', code: 'settings.ocr.backendUpdated', title: t('common.saved') }) } catch (error) { + if (disposed) return console.error('[OcrSettings] Failed to update backend', error) notifyRenderer({ kind: 'error', diff --git a/src/renderer/src/stores/uiSettingsStore.ts b/src/renderer/src/stores/uiSettingsStore.ts index fd6be9d70c..e663c3e247 100644 --- a/src/renderer/src/stores/uiSettingsStore.ts +++ b/src/renderer/src/stores/uiSettingsStore.ts @@ -114,7 +114,7 @@ export const useUiSettingsStore = defineStore('uiSettings', () => { } const result = await settingsClient.update(changes) - applySettingsValues(result.values) + applySettingsValues(settingsClient.acceptSnapshot(result)) } const loadSettings = async () => { @@ -125,7 +125,7 @@ export const useUiSettingsStore = defineStore('uiSettings', () => { const nextLoadPromise = (async () => { const snapshot = await settingsClient.getSnapshot() - applySettingsValues(snapshot) + applySettingsValues(settingsClient.acceptSnapshot(snapshot)) })() settingsLoadPromise = nextLoadPromise @@ -328,8 +328,6 @@ export const useUiSettingsStore = defineStore('uiSettings', () => { value: nextValue } ]) - - launchAtLoginEnabled.value = nextValue } const setLoggingEnabled = async (enabled: boolean) => { diff --git a/src/shared/contracts/events/settings.events.ts b/src/shared/contracts/events/settings.events.ts index 4b78644a02..ca06912c89 100644 --- a/src/shared/contracts/events/settings.events.ts +++ b/src/shared/contracts/events/settings.events.ts @@ -1,6 +1,6 @@ import { z } from 'zod' import { AgentCommandShellConfigSchema } from '../../commandShell' -import { TimestampMsSchema, defineEventContract } from '../common' +import { RevisionSchema, TimestampMsSchema, defineEventContract } from '../common' import { SettingsKeySchema, SettingsSnapshotValuesSchema } from '../routes/settings.routes' const SettingsRouteNameSchema = z.enum([ @@ -38,7 +38,7 @@ export const settingsChangedEvent = defineEventContract({ name: 'settings.changed', payload: z.object({ changedKeys: z.array(SettingsKeySchema).min(1), - version: TimestampMsSchema, + version: RevisionSchema, values: SettingsSnapshotValuesSchema.partial() }) }) diff --git a/src/shared/contracts/routes/settings.routes.ts b/src/shared/contracts/routes/settings.routes.ts index 0cd4f6a304..1ff318c3ad 100644 --- a/src/shared/contracts/routes/settings.routes.ts +++ b/src/shared/contracts/routes/settings.routes.ts @@ -1,6 +1,6 @@ import { z } from 'zod' import { AgentCommandShellConfigSchema, GitBashAvailabilitySchema } from '../../commandShell' -import { TimestampMsSchema, defineRouteContract } from '../common' +import { RevisionSchema, TimestampMsSchema, defineRouteContract } from '../common' export const SETTINGS_KEYS = [ 'fontSizeLevel', @@ -117,7 +117,7 @@ export const settingsGetSnapshotRoute = defineRouteContract({ }) .default({}), output: z.object({ - version: TimestampMsSchema, + version: RevisionSchema, values: SettingsSnapshotValuesSchema.partial() }) }) @@ -166,7 +166,7 @@ export const settingsUpdateRoute = defineRouteContract({ changes: z.array(SettingsChangeSchema).min(1) }), output: z.object({ - version: TimestampMsSchema, + version: RevisionSchema, changedKeys: z.array(SettingsKeySchema).min(1), values: SettingsSnapshotValuesSchema.partial() }) diff --git a/src/shared/cronJobs.ts b/src/shared/cronJobs.ts index 5d6827caa6..50d29170e9 100644 --- a/src/shared/cronJobs.ts +++ b/src/shared/cronJobs.ts @@ -187,8 +187,11 @@ export type SchedulerCommand = now: number } | { - type: 'RUN_NOW' - jobId: string + type: 'SCAN_RESULT' + requestId: number + enabledJobCount: number + nextRunAt: number | null + error?: string now: number } | { @@ -210,11 +213,8 @@ export type SchedulerEvent = now: number } | { - type: 'RUN_DUE' - jobId: string - runId: string - scheduledAt: number - reason: CronJobRunReason + type: 'SCAN_DUE' + requestId: number now: number } | { @@ -227,5 +227,6 @@ export type SchedulerEvent = type: 'ERROR' message: string stack?: string + fatal?: boolean now: number } diff --git a/src/shared/harness/admission.ts b/src/shared/harness/admission.ts new file mode 100644 index 0000000000..32141fc0b5 --- /dev/null +++ b/src/shared/harness/admission.ts @@ -0,0 +1,258 @@ +import { z } from 'zod' +import { types as utilTypes } from 'node:util' +import type { NumberDistribution } from '../../main/lib/boundedNumberRing' + +export const DEFAULT_AGENT_INVOCATION_CAPACITY = 6 +export const DEFAULT_AGENT_INVOCATION_MAX_PENDING = 256 +const MAX_AGENT_INVOCATION_IDENTIFIER_LENGTH = 256 + +export interface AgentInvocationPermit { + release(): void +} + +export type AgentInvocationLeaseState = 'suspended' | 'acquiring' | 'active' | 'released' + +export interface AgentInvocationLease { + readonly state: AgentInvocationLeaseState + resume(options?: { signal?: AbortSignal }): Promise + suspend(): void + release(): void +} + +export interface AgentInvocationAdmissionOptions { + ownerId: string + maxActiveForOwner?: number + signal?: AbortSignal + correlation?: AgentInvocationAdmissionCorrelation +} + +export interface AgentInvocationAdmissionCorrelation { + kind: 'live_delegation' + parentSessionId: string + delegationId: string + turnId: string +} + +export interface AgentInvocationAdmissionSnapshot { + capacity: number + active: number + pending: number + pendingOwners: number + closed: boolean + activeHighWater: number + pendingHighWater: number + granted: number + rejected: number + observationsDropped: number + waitMs: NumberDistribution + holdMs: NumberDistribution +} + +type AgentInvocationAdmissionState = Pick< + AgentInvocationAdmissionSnapshot, + 'capacity' | 'active' | 'pending' +> + +export type AgentInvocationAdmissionObservation = + | ({ + type: 'queued' + acquisitionSeq: number + } & AgentInvocationAdmissionCorrelation & + AgentInvocationAdmissionState) + | ({ + type: 'granted' + acquisitionSeq: number + waitMs?: number + } & AgentInvocationAdmissionCorrelation & + AgentInvocationAdmissionState) + | ({ + type: 'released' + acquisitionSeq: number + holdMs?: number + reason: 'permit_released' | 'lease_suspended' | 'lease_released' + active: number + pending: number + } & AgentInvocationAdmissionCorrelation) + | ({ + type: 'rejected' + acquisitionSeq: number + waitMs?: number + reason: 'queue_full' | 'aborted' | 'closed' + } & AgentInvocationAdmissionCorrelation & + AgentInvocationAdmissionState) + | ({ + type: 'closed' + } & Omit) + +export interface AgentInvocationAdmissionDiagnosticsOptions { + observe?: (observation: AgentInvocationAdmissionObservation) => void | Promise + observationsEnabled?: () => boolean +} + +export interface AgentInvocationAdmissionPort { + acquire(options: AgentInvocationAdmissionOptions): Promise + createLease(options: AgentInvocationAdmissionOptions): AgentInvocationLease + run(options: AgentInvocationAdmissionOptions, task: () => Promise): Promise +} + +export class AgentInvocationAdmissionClosedError extends Error { + constructor(message = 'Agent invocation admission is closed.') { + super(message) + this.name = 'AgentInvocationAdmissionClosedError' + } +} + +export class AgentInvocationAdmissionAbortedError extends Error { + constructor() { + super('Agent invocation admission was cancelled while queued.') + this.name = 'AgentInvocationAdmissionAbortedError' + } +} + +export class AgentInvocationAdmissionQueueFullError extends Error { + constructor(maxPending: number) { + super(`Agent invocation admission queue is full (${maxPending} pending).`) + this.name = 'AgentInvocationAdmissionQueueFullError' + } +} + +export interface InternalAgentInvocationPermit extends AgentInvocationPermit { + releaseWithReason(reason: 'permit_released' | 'lease_suspended' | 'lease_released'): void +} + +export function snapshotAdmissionCorrelation( + correlation: AgentInvocationAdmissionCorrelation | undefined +): AgentInvocationAdmissionCorrelation | undefined { + if (!correlation) return undefined + try { + if (typeof correlation !== 'object' || utilTypes.isProxy(correlation)) return undefined + const prototype = Object.getPrototypeOf(correlation) + if (prototype !== Object.prototype && prototype !== null) return undefined + const kind = Object.getOwnPropertyDescriptor(correlation, 'kind') + const parentSessionId = Object.getOwnPropertyDescriptor(correlation, 'parentSessionId') + const delegationId = Object.getOwnPropertyDescriptor(correlation, 'delegationId') + const turnId = Object.getOwnPropertyDescriptor(correlation, 'turnId') + if ( + !kind || + !('value' in kind) || + kind.value !== 'live_delegation' || + !parentSessionId || + !('value' in parentSessionId) || + !isBoundedAdmissionIdentifier(parentSessionId.value) || + !delegationId || + !('value' in delegationId) || + !isBoundedAdmissionIdentifier(delegationId.value) || + !turnId || + !('value' in turnId) || + !isBoundedAdmissionIdentifier(turnId.value) + ) { + return undefined + } + return { + kind: kind.value, + parentSessionId: parentSessionId.value, + delegationId: delegationId.value, + turnId: turnId.value + } + } catch { + return undefined + } +} + +export function normalizeAdmissionOwnerId(ownerId: string): string { + const normalized = ownerId.trim() + if (!normalized || normalized.length > MAX_AGENT_INVOCATION_IDENTIFIER_LENGTH) { + throw new Error( + `Agent invocation ownerId must contain 1 to ${MAX_AGENT_INVOCATION_IDENTIFIER_LENGTH} characters.` + ) + } + return normalized +} + +function isBoundedAdmissionIdentifier(value: unknown): value is string { + return ( + typeof value === 'string' && + value.length > 0 && + value.length <= MAX_AGENT_INVOCATION_IDENTIFIER_LENGTH + ) +} + +export function normalizeAdmissionOwnerLimit( + requested: number | undefined, + capacity: number +): number { + if (requested === undefined) { + return capacity + } + if (!Number.isSafeInteger(requested) || requested < 1) { + throw new Error('Agent invocation owner limit must be a positive safe integer.') + } + return Math.min(requested, capacity) +} + +const CountSchema = z.number().int().nonnegative().max(Number.MAX_SAFE_INTEGER) +const DurationSchema = z.number().finite().nonnegative() +const DistributionSchema = z + .object({ + samples: CountSchema, + p50: DurationSchema.nullable(), + p95: DurationSchema.nullable(), + max: DurationSchema.nullable() + }) + .strict() +const stateShape = { capacity: CountSchema, active: CountSchema, pending: CountSchema } +const correlationShape = { + kind: z.literal('live_delegation'), + parentSessionId: z.string().min(1).max(256), + delegationId: z.string().min(1).max(256), + turnId: z.string().min(1).max(256), + acquisitionSeq: CountSchema +} +const diagnosticShape = { + activeHighWater: CountSchema, + pendingHighWater: CountSchema, + granted: CountSchema, + rejected: CountSchema, + observationsDropped: CountSchema, + waitMs: DistributionSchema, + holdMs: DistributionSchema +} +export const AdmissionSnapshotSchema = z + .object({ + ...stateShape, + ...diagnosticShape, + pendingOwners: CountSchema, + closed: z.boolean() + }) + .strict() +export const AdmissionObservationSchema = z.discriminatedUnion('type', [ + z.object({ type: z.literal('queued'), ...correlationShape, ...stateShape }).strict(), + z + .object({ + type: z.literal('granted'), + ...correlationShape, + ...stateShape, + waitMs: DurationSchema.optional() + }) + .strict(), + z + .object({ + type: z.literal('released'), + ...correlationShape, + active: CountSchema, + pending: CountSchema, + holdMs: DurationSchema.optional(), + reason: z.enum(['permit_released', 'lease_suspended', 'lease_released']) + }) + .strict(), + z + .object({ + type: z.literal('rejected'), + ...correlationShape, + ...stateShape, + waitMs: DurationSchema.optional(), + reason: z.enum(['queue_full', 'aborted', 'closed']) + }) + .strict(), + z.object({ type: z.literal('closed'), ...stateShape, ...diagnosticShape }).strict() +]) diff --git a/src/shared/harness/lease.ts b/src/shared/harness/lease.ts new file mode 100644 index 0000000000..9379b12b40 --- /dev/null +++ b/src/shared/harness/lease.ts @@ -0,0 +1,123 @@ +import { + AgentInvocationAdmissionAbortedError, + type AgentInvocationAdmissionPort, + type AgentInvocationAdmissionOptions, + type AgentInvocationLease, + type AgentInvocationLeaseState, + type InternalAgentInvocationPermit +} from '@shared/harness/admission' + +export class StatefulAgentInvocationLease implements AgentInvocationLease { + private currentState: AgentInvocationLeaseState = 'suspended' + private permit: InternalAgentInvocationPermit | null = null + private acquisition: + | { + controller: AbortController + promise: Promise + cleanupSignals: () => void + } + | undefined + + constructor( + private readonly admission: Pick, + private readonly options: AgentInvocationAdmissionOptions + ) {} + + get state(): AgentInvocationLeaseState { + return this.currentState + } + + resume(options?: { signal?: AbortSignal }): Promise { + if (this.currentState === 'released') { + return Promise.reject(new AgentInvocationAdmissionAbortedError()) + } + if (this.currentState === 'active') return Promise.resolve() + if (this.acquisition) { + if (this.currentState === 'acquiring') return this.acquisition.promise + return this.acquisition.promise + .catch(() => undefined) + .then(async () => await this.resume(options)) + } + + const controller = new AbortController() + const cleanupSignals = forwardAbortSignals([this.options.signal, options?.signal], controller) + this.currentState = 'acquiring' + const promise = this.admission + .acquire({ ...this.options, signal: controller.signal }) + .then((permit) => { + const internalPermit = permit as InternalAgentInvocationPermit + if ( + controller.signal.aborted || + this.currentState !== 'acquiring' || + this.acquisition?.controller !== controller + ) { + internalPermit.releaseWithReason( + this.currentState === 'released' ? 'lease_released' : 'lease_suspended' + ) + throw new AgentInvocationAdmissionAbortedError() + } + this.permit = internalPermit + this.currentState = 'active' + }) + .finally(() => { + if (this.acquisition?.controller !== controller) return + this.acquisition.cleanupSignals() + this.acquisition = undefined + if (this.currentState === 'acquiring') this.currentState = 'suspended' + }) + this.acquisition = { controller, promise, cleanupSignals } + return promise + } + + suspend(): void { + if (this.currentState === 'released' || this.currentState === 'suspended') return + if (this.currentState === 'active') { + this.releaseActivePermit('lease_suspended', 'suspended') + return + } + this.currentState = 'suspended' + this.acquisition?.controller.abort('Agent invocation lease suspended.') + } + + release(): void { + if (this.currentState === 'released') return + if (this.currentState === 'active') { + this.releaseActivePermit('lease_released', 'released') + return + } + this.currentState = 'released' + this.acquisition?.controller.abort('Agent invocation lease released.') + } + + private releaseActivePermit( + reason: 'lease_suspended' | 'lease_released', + nextState: 'suspended' | 'released' + ): void { + if (!this.permit) throw new Error('Active Agent invocation lease has no permit.') + this.permit.releaseWithReason(reason) + this.permit = null + this.currentState = nextState + } +} + +function forwardAbortSignals( + signals: Array, + target: AbortController +): () => void { + const listeners: Array<{ signal: AbortSignal; listener: () => void }> = [] + for (const signal of signals) { + if (!signal) continue + const listener = () => target.abort(signal.reason) + if (signal.aborted) { + listener() + break + } + signal.addEventListener('abort', listener, { once: true }) + listeners.push({ signal, listener }) + } + return () => { + for (const { signal, listener } of listeners) { + signal.removeEventListener('abort', listener) + } + } +} diff --git a/src/shared/harness/memory-vector.ts b/src/shared/harness/memory-vector.ts new file mode 100644 index 0000000000..c7c28bc196 --- /dev/null +++ b/src/shared/harness/memory-vector.ts @@ -0,0 +1,177 @@ +import { z } from 'zod' +import { AGENT_MEMORY_AGENT_ID_PATTERN } from '../types/agent-memory' + +export const MEMORY_VECTOR_FRAME_BYTES = 256 * 1024 +export const MEMORY_VECTOR_FRAME_FLAG = 0x80000000 +export const MEMORY_VECTOR_BINARY_FLAG = 0x40000000 +export const MEMORY_VECTOR_UPLOAD_BYTES = 16 * 1024 * 1024 +export const MEMORY_VECTOR_INITIAL_CHUNK_BYTES = 64 * 1024 +export const MEMORY_VECTOR_CHUNK_BYTES = 240 * 1024 +export const MEMORY_VECTOR_PENDING = 32 +export const MEMORY_VECTOR_NATIVE_PART_BYTES = 8 * 1024 * 1024 + +const identity = z.string().uuid() +const memoryId = z.string().min(1).max(1024) +const agentId = z.string().regex(AGENT_MEMORY_AGENT_ID_PATTERN) +const dimensions = z + .number() + .int() + .positive() + .max(MEMORY_VECTOR_UPLOAD_BYTES / 4) +const topK = z.number().int().min(1).max(800) +const base64 = z + .string() + .refine( + (value) => + value.length <= 240 * 1024 && + value.length % 4 === 0 && + Buffer.from(value, 'base64').toString('base64') === value, + 'Expected canonical base64' + ) +const resource = { generation: identity, operation: identity, resource: identity } +const chunk = z + .custom((value) => value instanceof Uint8Array) + .refine((value) => value.byteLength > 0 && value.byteLength <= MEMORY_VECTOR_CHUNK_BYTES) + +export const MemoryVectorConfigSchema = z + .object({ + generation: identity, + memoryDbDir: z.string().min(1).max(32768), + host: z + .object({ + appPath: z.string().min(1).max(32768), + userDataPath: z.string().min(1).max(32768), + isPackaged: z.boolean() + }) + .strict() + }) + .strict() + +const commands = [ + z + .object({ + ...resource, + method: z.literal('open'), + agentId, + dimensions, + embedding: z + .object({ providerId: z.string().min(1).max(1024), modelId: z.string().min(1).max(1024) }) + .strict() + }) + .strict(), + z + .object({ ...resource, method: z.literal('close'), preserveLease: z.boolean().optional() }) + .strict(), + z + .object({ ...resource, method: z.literal('query'), vector: base64.max(240 * 1024), topK }) + .strict(), + z.object({ ...resource, method: z.literal('queryByMemoryId'), memoryId, topK }).strict(), + z + .object({ ...resource, method: z.literal('delete'), memoryIds: z.array(memoryId).max(512) }) + .strict(), + z + .object({ + ...resource, + method: z.literal('list'), + afterId: memoryId.nullable(), + limit: z.number().int().min(1).max(512) + }) + .strict(), + z + .object({ generation: identity, operation: identity, method: z.literal('reset'), agentId }) + .strict(), + z + .object({ generation: identity, operation: identity, method: z.literal('quarantine'), agentId }) + .strict() +] as const + +export const MemoryVectorCommandSchema = z.discriminatedUnion('method', [ + ...commands, + z + .object({ + ...resource, + method: z.literal('begin'), + upload: identity, + memoryIds: z.array(memoryId).min(1).max(50), + bytes: z.number().int().positive().max(MEMORY_VECTOR_UPLOAD_BYTES), + data: chunk + .refine((value) => value.byteLength <= MEMORY_VECTOR_INITIAL_CHUNK_BYTES) + .optional() + }) + .strict(), + z + .object({ + ...resource, + method: z.literal('chunk'), + upload: identity, + offset: z.number().int().nonnegative(), + data: chunk + }) + .strict(), + z + .object({ + ...resource, + method: z.literal('commit'), + upload: identity, + offset: z.number().int().nonnegative().optional(), + data: chunk.optional() + }) + .strict(), + z.object({ ...resource, method: z.literal('abort'), upload: identity }).strict() +]) + +export const MemoryVectorNativeCommandSchema = z.discriminatedUnion('method', [ + ...commands, + z.object({ ...resource, method: z.literal('abort'), upload: identity }).strict(), + z + .object({ + ...resource, + method: z.literal('upsert'), + upload: identity, + bytes: z.number().int().positive().max(MEMORY_VECTOR_UPLOAD_BYTES), + offset: z.number().int().nonnegative().max(MEMORY_VECTOR_UPLOAD_BYTES), + memoryIds: z.array(memoryId).min(1).max(50), + data: z + .custom((value) => value instanceof Uint8Array) + .refine( + (value) => value.byteLength > 0 && value.byteLength <= MEMORY_VECTOR_NATIVE_PART_BYTES + ) + }) + .strict() +]) +export type MemoryVectorNativeCommand = z.infer + +export type MemoryVectorConfig = z.infer +export type MemoryVectorCommand = z.infer +export const isMemoryVectorControl = ( + method: MemoryVectorCommand['method'] | MemoryVectorNativeCommand['method'] +) => ['close', 'abort', 'reset', 'quarantine'].includes(method) + +export function encodeMemoryVector(values: readonly number[], dimensions: number): Buffer { + if (values.length !== dimensions) throw new Error('Memory vector dimensions do not match') + const bytes = Buffer.allocUnsafe(dimensions * 4) + for (let index = 0; index < dimensions; index++) { + const value = values[index] + if (!Number.isFinite(value) || !Number.isFinite(Math.fround(value))) { + throw new Error('Memory vector contains a non-finite Float32 value') + } + bytes.writeFloatLE(value, index * 4) + } + return bytes +} + +export function decodeMemoryVector(bytes: Buffer, dimensions: number): number[] { + if (bytes.length !== dimensions * 4) throw new Error('Memory vector byte length does not match') + const data = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength) + const vector: number[] = [] + for (let index = 0; index < dimensions; index++) { + const value = data.getFloat32(index * 4, true) + if (!Number.isFinite(value)) + throw new Error('Memory vector contains a non-finite Float32 value') + const integer = value | 0 + // Keep integer-only vectors compact through the native binding's element conversion. + if (value === integer && !Object.is(value, -0)) vector.push(integer) + else vector.push(value) + } + return vector +} diff --git a/src/shared/logger.ts b/src/shared/logger.ts index 3dc6e7fe65..abf59fa2fe 100644 --- a/src/shared/logger.ts +++ b/src/shared/logger.ts @@ -1,5 +1,3 @@ -import { is } from '@electron-toolkit/utils' - // Legacy Main diagnostics remain console-only until their owners are migrated or removed. Persisted // diagnostics must go through the typed Main logger; arbitrary values must never reach a file sink. export const originalConsole = { @@ -11,8 +9,14 @@ export const originalConsole = { trace: console.trace.bind(console) } +let debugEnabled = false + +export function setLegacyConsoleDebugEnabled(enabled: boolean): void { + debugEnabled = enabled +} + const debug = (...params: unknown[]): void => { - if (is.dev) originalConsole.debug(...params) + if (debugEnabled) originalConsole.debug(...params) } const logger = { diff --git a/src/shared/types/chatSettings.ts b/src/shared/types/chatSettings.ts index a878067301..67e70a9c91 100644 --- a/src/shared/types/chatSettings.ts +++ b/src/shared/types/chatSettings.ts @@ -1,4 +1,14 @@ -import type { RequestedLocale } from '../locales' +import { z } from 'zod' +import { REQUESTED_LOCALES, type RequestedLocale } from '../locales' + +export const ChatSettingMutationSchema = z.discriminatedUnion('id', [ + z.strictObject({ id: z.literal('copyWithCotEnabled'), value: z.boolean() }), + z.strictObject({ id: z.literal('fontSizeLevel'), value: z.number().int().min(0).max(4) }), + z.strictObject({ id: z.literal('language'), value: z.enum(REQUESTED_LOCALES) }), + z.strictObject({ id: z.literal('theme'), value: z.enum(['dark', 'light', 'system']) }) +]) + +export type ChatSettingMutation = z.infer export type ChatLanguage = RequestedLocale diff --git a/src/shared/types/file.ts b/src/shared/types/file.ts index e2261f6c0d..eecdc91c67 100644 --- a/src/shared/types/file.ts +++ b/src/shared/types/file.ts @@ -1,11 +1,6 @@ import type { MessageFile } from '@shared/chat' import type { FileValidationResult } from './knowledge' -export type FileOperation = { - path: string - content?: string -} - export interface FileMetaData { fileName: string fileSize: number @@ -34,9 +29,6 @@ export interface FileItem { export interface FileServicePort { readFile(relativePath: string): Promise - writeFile(operation: FileOperation): Promise - deleteFile(relativePath: string): Promise - createFileAdapter(filePath: string, typeInfo?: string): Promise prepareFile(absPath: string, typeInfo?: string): Promise prepareFileCompletely( absPath: string, @@ -44,20 +36,9 @@ export interface FileServicePort { contentType?: null | 'origin' | 'llm-friendly' ): Promise prepareDirectory(absPath: string): Promise - writeTemp(file: { name: string; content: string | Buffer | ArrayBuffer }): Promise isDirectory(absPath: string): Promise getMimeType(filePath: string): Promise writeImageBase64(file: { name: string; content: string }): Promise - saveImage(file: { - source: string - mimeType?: string - suggestedName?: string - }): Promise<{ canceled: boolean; path?: string }> - copyImage(file: { - source: string - mimeType?: string - suggestedName?: string - }): Promise<{ copied: boolean }> validateFileForKnowledgeBase(filePath: string): Promise getSupportedExtensions(): string[] } diff --git a/src/shared/types/nativeConfiguration.ts b/src/shared/types/nativeConfiguration.ts new file mode 100644 index 0000000000..dff02b9de2 --- /dev/null +++ b/src/shared/types/nativeConfiguration.ts @@ -0,0 +1,18 @@ +import type { SupportedLocale } from '@shared/locales' +import type { ShortcutKeySetting } from './desktop' +import type { FloatingButtonBounds } from './floating-widget' + +export type NativeConfigurationSnapshot = { + ownerId: string + version: number + language: SupportedLocale + notificationsEnabled: boolean + closeToQuit: boolean + contentProtectionEnabled: boolean + shortcutKeys: ShortcutKeySetting + floatingButtonEnabled: boolean + floatingButtonBounds: FloatingButtonBounds | null + loggingEnabled: boolean + privacyModeEnabled: boolean + updateChannel: 'stable' | 'beta' +} diff --git a/src/shared/types/oauth.ts b/src/shared/types/oauth.ts index 21258436c8..e84241da98 100644 --- a/src/shared/types/oauth.ts +++ b/src/shared/types/oauth.ts @@ -1,17 +1,19 @@ import type { OpenAICodexAuthStatus } from './openai-codex' import type { XaiGrokAuthStatus } from './xai-grok' -export interface OAuthConfig { - authUrl: string - redirectUri: string - clientId: string - clientSecret?: string - scope: string - responseType: string +export interface GitHubCopilotSignInTarget { + providerId: string + clientId?: string + configurationId: string +} + +export interface GitHubCopilotCredentialOwner { + getGitHubCopilotSignInTarget(providerId: string): Promise + commitGitHubCopilotCredential(target: GitHubCopilotSignInTarget, apiKey: string): Promise + invalidateGitHubCopilotSignIns(): Promise } export interface OAuthServicePort { - startOAuthLogin(providerId: string, config: OAuthConfig): Promise startGitHubCopilotLogin(providerId: string): Promise startGitHubCopilotDeviceFlowLogin(providerId: string): Promise getOpenAICodexStatus(): Promise @@ -24,3 +26,10 @@ export interface OAuthServicePort { cancelXaiGrokLogin(): Promise logoutXaiGrok(): Promise } + +export type ProviderAccountAuthPort = Omit< + OAuthServicePort, + 'startGitHubCopilotLogin' | 'startGitHubCopilotDeviceFlowLogin' +> & { + stop(): Promise +} diff --git a/test/e2e/fixtures/electronApp.ts b/test/e2e/fixtures/electronApp.ts index 17d327a07b..c21f085ff1 100644 --- a/test/e2e/fixtures/electronApp.ts +++ b/test/e2e/fixtures/electronApp.ts @@ -17,6 +17,8 @@ import { import { arch, homedir, tmpdir } from 'node:os' import { dirname, join, resolve } from 'node:path' import { fileURLToPath } from 'node:url' +import { performance } from 'node:perf_hooks' +import { measureResources } from '../helpers/resources' import { GUIDED_ONBOARDING_REQUIRED_STEP_IDS, GUIDED_ONBOARDING_STEP_IDS, @@ -90,8 +92,11 @@ export type ElectronAppInstance = { } type ElectronFixtures = { + privacyModeEnabled: boolean app: ElectronAppInstance - launchApp: () => Promise + launchApp: (options?: { + prepareUserData?: (userDataDir: string) => void + }) => Promise } const resolvePackagedExecutable = (): string => { @@ -180,7 +185,7 @@ const readMainProcessLogs = (): string => { return files.map((filePath) => `== ${filePath} ==\n${readTextFileTail(filePath)}`).join('\n\n') } -const seedE2eUserDataDir = (userDataDir: string): void => { +const seedE2eUserDataDir = (userDataDir: string, privacyModeEnabled: boolean): void => { mkdirSync(userDataDir, { recursive: true }) const appSettingsPath = join(userDataDir, 'app-settings.json') @@ -196,6 +201,8 @@ const seedE2eUserDataDir = (userDataDir: string): void => { { init_complete: true, loggingEnabled: true, + privacyModeEnabled, + skillsPath: join(userDataDir, 'skills'), guidedOnboardingState: { version: GUIDED_ONBOARDING_VERSION, status: 'completed', @@ -243,7 +250,8 @@ const ensureLaunchTargetExists = (): void => { } export const test = base.extend({ - launchApp: async ({}, use, testInfo) => { + privacyModeEnabled: [false, { option: true }], + launchApp: async ({ privacyModeEnabled }, use, testInfo) => { ensureLaunchTargetExists() const consoleLogs: string[] = [] @@ -255,7 +263,7 @@ export const test = base.extend({ const userDataDir = originalE2eUserDataDir ?? mkdtempSync(join(tmpdir(), 'deepchat-e2e-user-data-')) const ownsUserDataDir = !originalE2eUserDataDir - seedE2eUserDataDir(userDataDir) + seedE2eUserDataDir(userDataDir, privacyModeEnabled) process.env.DEEPCHAT_E2E_USER_DATA_DIR = userDataDir const attachPageListeners = (page: Page, label: string) => { @@ -274,11 +282,18 @@ export const test = base.extend({ }) } - const launchApp = async (): Promise => { + const launchApp: ElectronFixtures['launchApp'] = async (options) => { + if (options?.prepareUserData) { + if (!ownsUserDataDir || launchCount !== 0) { + throw new Error('Profile preparation requires an owned profile before its first launch') + } + options.prepareUserData(userDataDir) + } launchCount += 1 const currentLaunch = launchCount const packaged = process.env.DEEPCHAT_E2E_APP_MODE === 'packaged' + const startedAt = performance.now() const electronApp = await electron.launch({ ...(packaged ? { @@ -295,8 +310,10 @@ export const test = base.extend({ }, timeout: 120_000 }) + const appProcess = electronApp.process() let closeOutcomePromise: Promise<'graceful' | 'forced'> | undefined + let resources: Awaited> const app: ElectronAppInstance = { electronApp, page: undefined as unknown as Page, @@ -308,6 +325,16 @@ export const test = base.extend({ if (closeOutcomePromise) return closeOutcomePromise launchedApps.delete(app) closeOutcomePromise = (async () => { + let measurementFailure: unknown + try { + await resources?.finish(testInfo, currentLaunch) + } catch (error) { + measurementFailure = error + } + if (appProcess.exitCode === 0) { + if (measurementFailure) throw measurementFailure + return 'graceful' + } const closePromise = electronApp.close() const closedGracefully = await Promise.race([ closePromise.then( @@ -317,9 +344,13 @@ export const test = base.extend({ delay(APP_CLOSE_TIMEOUT_MS).then(() => false) ]) - if (closedGracefully) return 'graceful' - electronApp.process().kill('SIGKILL') + if (closedGracefully) { + if (measurementFailure) throw measurementFailure + return 'graceful' + } + appProcess.kill('SIGKILL') await Promise.race([closePromise.catch(() => undefined), delay(1_000)]) + if (measurementFailure) throw measurementFailure return 'forced' })() return closeOutcomePromise @@ -333,10 +364,12 @@ export const test = base.extend({ }) try { + resources = await measureResources(electronApp, startedAt) const page = await waitForMainAppWindow(electronApp) attachPageListeners(page, `main-${currentLaunch}`) await page.waitForLoadState('domcontentloaded') app.page = page + await resources?.ready(page) return app } catch (error) { await app.close() @@ -348,8 +381,13 @@ export const test = base.extend({ await use(launchApp) } finally { const pendingApps = [...launchedApps].reverse() + let closeFailure: unknown for (const app of pendingApps) { - await app.close() + try { + await app.close() + } catch (error) { + closeFailure ??= error + } } await attachDiagnostics(testInfo, consoleLogs, pageErrors) @@ -363,6 +401,7 @@ export const test = base.extend({ if (ownsUserDataDir) { rmSync(userDataDir, { recursive: true, force: true }) } + if (closeFailure) throw closeFailure } }, diff --git a/test/e2e/helpers/resources.ts b/test/e2e/helpers/resources.ts new file mode 100644 index 0000000000..48c52b2132 --- /dev/null +++ b/test/e2e/helpers/resources.ts @@ -0,0 +1,138 @@ +import { execFile } from 'node:child_process' +import { writeFile } from 'node:fs/promises' +import { performance } from 'node:perf_hooks' +import { promisify } from 'node:util' +import type { ElectronApplication, Page, TestInfo } from '@playwright/test' + +const execute = promisify(execFile) +const SAMPLE_INTERVAL_MS = 500 +const MAX_SAMPLES = 1200 + +// Use the public rusage_info_v0 layout from the macOS SDK; RSS alone double-counts shared pages. +const MAC_PROCESS_SNAPSHOT = String.raw` +import ctypes, json, os, subprocess, sys +class Usage(ctypes.Structure): + _fields_ = [('uuid', ctypes.c_uint8 * 16)] + [(name, ctypes.c_uint64) for name in + ['user', 'system', 'idle', 'interrupt', 'pageins', 'wired', 'resident', 'footprint', 'start', 'exit']] +assert ctypes.sizeof(Usage) == 96 +class Timebase(ctypes.Structure): + _fields_ = [('numer', ctypes.c_uint32), ('denom', ctypes.c_uint32)] +timebase = Timebase() +system = ctypes.CDLL('/usr/lib/libSystem.B.dylib') +assert system.mach_timebase_info(ctypes.byref(timebase)) == 0 and timebase.denom > 0 +seconds_per_tick = timebase.numer / timebase.denom / 1e9 +lib = ctypes.CDLL('/usr/lib/libproc.dylib', use_errno=True) +lib.proc_pid_rusage.argtypes = [ctypes.c_int, ctypes.c_int, ctypes.c_void_p] +lib.proc_pid_rusage.restype = ctypes.c_int +probe = Usage() +assert lib.proc_pid_rusage(os.getpid(), 0, ctypes.byref(probe)) == 0 and probe.footprint > 0 +root = int(sys.argv[1]) +rows = {} +for line in subprocess.check_output(['ps', '-axo', 'pid=,ppid=,comm='], text=True).splitlines(): + fields = line.split(None, 2) + if len(fields) == 3: + rows[int(fields[0])] = (int(fields[1]), os.path.basename(fields[2])) +owned = {root} +while True: + expanded = owned | {pid for pid, (parent, _) in rows.items() if parent in owned} + if expanded == owned: break + owned = expanded +result = [] +for pid in sorted(owned): + usage = Usage() + if pid in rows and lib.proc_pid_rusage(pid, 0, ctypes.byref(usage)) == 0: + result.append(dict(pid=pid, parent=rows[pid][0], name=rows[pid][1], + identity=str(usage.start), rssBytes=usage.resident, + footprintBytes=usage.footprint, cpuSeconds=(usage.user + usage.system) * seconds_per_tick)) +assert any(row['pid'] == root for row in result), 'Application process is unavailable' +print(json.dumps(result)) +` + +type ProcessSample = { + pid: number + parent: number + name: string + identity: string + rssBytes: number + footprintBytes: number + cpuSeconds: number +} + +export async function measureResources(app: ElectronApplication, startedAt: number) { + if (process.env.DEEPCHAT_E2E_MEASURE_RESOURCES !== '1') return undefined + if (process.platform !== 'darwin') { + throw new Error('E2E resource measurement currently requires macOS and Python 3') + } + const pid = app.process().pid + if (!pid) throw new Error('Application process has no PID') + const histogram = await app.evaluateHandle(() => { + const { monitorEventLoopDelay } = process.getBuiltinModule( + 'node:perf_hooks' + ) as typeof import('node:perf_hooks') + const histogram = monitorEventLoopDelay({ resolution: 10 }) + histogram.enable() + return histogram + }) + const samples: Array<{ elapsedMs: number; processes: ProcessSample[] }> = [] + let failure: unknown + let uiReadyMs: number | undefined + let stopped = false + let pending: Promise | undefined + const takeSample = () => { + if (pending || stopped) return pending + pending = (async () => { + if (samples.length >= MAX_SAMPLES) throw new Error('Resource sample limit exceeded') + const { stdout } = await execute('python3', ['-c', MAC_PROCESS_SNAPSHOT, String(pid)], { + timeout: 5000, + maxBuffer: 1024 * 1024 + }) + samples.push({ elapsedMs: performance.now() - startedAt, processes: JSON.parse(stdout) }) + })() + .catch((error) => { + failure = error + }) + .finally(() => { + pending = undefined + }) + return pending + } + await takeSample() + const timer = setInterval(takeSample, SAMPLE_INTERVAL_MS) + timer.unref() + return { + async ready(page: Page) { + await page.getByTestId('app-root').waitFor({ state: 'visible', timeout: 60_000 }) + await page.getByTestId('window-sidebar').waitFor({ state: 'visible', timeout: 30_000 }) + uiReadyMs = performance.now() - startedAt + }, + async finish(testInfo: TestInfo, launch: number) { + clearInterval(timer) + await pending + await takeSample() + stopped = true + const eventLoop = await histogram.evaluate(async (histogram) => { + // Keep a Node task alive while the inspector settles its awaited result. + await new Promise((resolve) => setImmediate(resolve)) + histogram.disable() + return { p95Ms: histogram.percentile(95) / 1e6, p99Ms: histogram.percentile(99) / 1e6 } + }) + await histogram.dispose() + if (failure) throw failure + const report = { + schema: 1, + platform: process.platform, + architecture: process.arch, + sampleIntervalMs: SAMPLE_INTERVAL_MS, + uiReadyMs, + eventLoop, + samples + } + const output = testInfo.outputPath(`resources-${launch}.json`) + await writeFile(output, JSON.stringify(report, null, 2)) + await testInfo.attach(`resources-${launch}`, { + path: output, + contentType: 'application/json' + }) + } + } +} diff --git a/test/e2e/specs/16-skills-readonly-route.smoke.spec.ts b/test/e2e/specs/16-skills-readonly-route.smoke.spec.ts index 72bc826f6f..dad6462fe3 100644 --- a/test/e2e/specs/16-skills-readonly-route.smoke.spec.ts +++ b/test/e2e/specs/16-skills-readonly-route.smoke.spec.ts @@ -1,4 +1,5 @@ import { test, expect } from '../fixtures/electronApp' +import { join } from 'node:path' import { waitForAppReady } from '../helpers/wait' test('Plugins Skills exposes read-only skill routes through typed bridge @smoke', async ({ @@ -109,7 +110,8 @@ test('Plugins Skills exposes read-only skill routes through typed bridge @smoke' }) expect(typeof snapshot.directoryPath).toBe('string') - expect(snapshot.skillCount).toBeGreaterThanOrEqual(0) + if (app.ownsUserDataDir) expect(snapshot.directoryPath).toBe(join(app.userDataDir, 'skills')) + expect(snapshot.skillCount).toBeGreaterThan(0) expect(snapshot.allSkillCount).toBeGreaterThanOrEqual(snapshot.skillCount) expect(snapshot.allSkillShapeValid).toBe(true) diff --git a/test/e2e/specs/25-window-provider-deeplink-preview.smoke.spec.ts b/test/e2e/specs/25-window-provider-deeplink-preview.smoke.spec.ts index c03022c5a2..c1e68d553d 100644 --- a/test/e2e/specs/25-window-provider-deeplink-preview.smoke.spec.ts +++ b/test/e2e/specs/25-window-provider-deeplink-preview.smoke.spec.ts @@ -8,7 +8,7 @@ test('settings consumes pending provider install preview without applying it @sm await waitForAppReady(app.page) const preview = { - kind: 'custom', + kind: 'custom' as const, name: 'DeepChat E2E Provider Preview', type: 'openai-compatible', baseUrl: 'https://e2e-provider.example.com/v1', diff --git a/test/e2e/specs/27-hooks-notification-command.smoke.spec.ts b/test/e2e/specs/27-hooks-notification-command.smoke.spec.ts index 5c1ca2b8fe..a063e8a732 100644 --- a/test/e2e/specs/27-hooks-notification-command.smoke.spec.ts +++ b/test/e2e/specs/27-hooks-notification-command.smoke.spec.ts @@ -1,40 +1,53 @@ +import { createServer } from 'node:http' +import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs' +import { join } from 'node:path' +import type { + HookEventPayload, + HooksNotificationsSettings +} from '../../../src/shared/hooksNotifications' import { test, expect } from '../fixtures/electronApp' import { openSettings, openSettingsTab } from '../helpers/settings' import { waitForAppReady } from '../helpers/wait' -type HookConfig = { - hooks: Array<{ - id: string - name: string - enabled: boolean - command: string - events: string[] - }> +test.use({ privacyModeEnabled: true }) + +const prepareHookProfile = (profile: string): void => { + const workspace = join(profile, 'hook-workspace') + mkdirSync(workspace) + const file = join(profile, 'app-settings.json') + const settings = JSON.parse(readFileSync(file, 'utf8')) + settings.defaultProjectPath = workspace + writeFileSync(file, JSON.stringify(settings)) } -test('notification hooks can save test command and restore config @smoke', async ({ app }) => { +test('notification hooks can save test command and restore config @smoke', async ({ + launchApp +}) => { + let app = await launchApp({ prepareUserData: prepareHookProfile }) await waitForAppReady(app.page) + const expectedVersion = await app.electronApp.evaluate(({ app }) => app.getVersion()) - const settingsPage = await openSettings(app) + let settingsPage = await openSettings(app) const hookId = `deepchat-e2e-hook-${Date.now()}` - let originalConfig: HookConfig | null = null + let originalConfig: HooksNotificationsSettings | null = null try { originalConfig = await settingsPage.evaluate(async () => { const result = (await window.deepchat.invoke('config.getHooksNotifications', {})) as { - config: HookConfig + config: HooksNotificationsSettings } return result.config }) - const tempConfig: HookConfig = { + const tempConfig: HooksNotificationsSettings = { hooks: [ ...(originalConfig?.hooks ?? []).filter((hook) => hook.id !== hookId), { id: hookId, name: 'DeepChat E2E Hook', enabled: true, - command: 'node -e "console.log(\'deepchat-hook-e2e-ok\')"', + command: + "node -e \"let raw='';process.stdin.on('data',c=>raw+=c);process.stdin.on('end',()=>console.log('deepchat-hook-e2e-ok '+JSON.parse(raw).app.version))\"", events: ['SessionStart'] } ] @@ -46,7 +59,7 @@ test('notification hooks can save test command and restore config @smoke', async }, { config: tempConfig } )) as { - config?: HookConfig + config?: HooksNotificationsSettings } expect(savedConfig.config?.hooks.some((hook) => hook.id === hookId)).toBe(true) @@ -75,7 +88,16 @@ test('notification hooks can save test command and restore config @smoke', async expect(testResult.result?.success).toBe(true) expect(testResult.result?.exitCode).toBe(0) expect(typeof testResult.result?.durationMs).toBe('number') - expect(String(testResult.result?.stdout ?? '')).toContain('deepchat-hook-e2e-ok') + expect(String(testResult.result?.stdout ?? '')).toContain( + `deepchat-hook-e2e-ok ${expectedVersion}` + ) + expect(await app.close()).toBe('graceful') + app = await launchApp() + await waitForAppReady(app.page) + expect( + await app.page.evaluate(() => window.deepchat.invoke('config.getHooksNotifications', {})) + ).toEqual({ config: tempConfig }) + settingsPage = await openSettings(app) } finally { if (originalConfig) { await settingsPage @@ -89,3 +111,207 @@ test('notification hooks can save test command and restore config @smoke', async } } }) + +const processIsAlive = (pid: number): boolean => { + try { + process.kill(pid, 0) + return true + } catch (error) { + if ((error as NodeJS.ErrnoException).code === 'ESRCH') return false + throw error + } +} + +test('hook shutdown retains native child lifetime until stdio closes @smoke', async ({ + launchApp +}) => { + let active = await launchApp({ prepareUserData: prepareHookProfile }) + await waitForAppReady(active.page) + const profile = active.userDataDir + const releaseFile = join(profile, 'hook-release') + const pidFile = join(profile, 'hook-child.json') + const payloadFile = join(profile, 'hook-payload.json') + writeFileSync( + join(profile, 'hook-lifecycle.cjs'), + ` +const fs = require('node:fs') +const path = require('node:path') +let raw = '' +process.stdin.on('data', chunk => { raw += chunk }) +process.stdin.on('end', () => { + fs.writeFileSync(path.join(__dirname, 'hook-payload.json'), raw) + fs.writeFileSync(path.join(__dirname, 'hook-child.json'), JSON.stringify({ pid: process.pid, parent: process.ppid })) + setInterval(() => { + if (fs.existsSync(path.join(__dirname, 'hook-release'))) process.exit(0) + }, 25) +}) +` + ) + const server = createServer(async (request, response) => { + if (request.url !== '/v1/chat/completions') { + response.writeHead(404).end() + return + } + let body = '' + for await (const chunk of request) body += chunk + const result = { id: 'hook-fixture', model: 'hook-fixture', created: 1 } + if (!JSON.parse(body).stream) { + response.writeHead(200, { 'Content-Type': 'application/json' }).end( + JSON.stringify({ + ...result, + object: 'chat.completion', + choices: [ + { + index: 0, + message: { role: 'assistant', content: 'Hook fixture' }, + finish_reason: 'stop' + } + ] + }) + ) + return + } + response + .writeHead(200, { 'Content-Type': 'text/event-stream' }) + .end( + `data: ${JSON.stringify({ ...result, object: 'chat.completion.chunk', choices: [{ index: 0, delta: { role: 'assistant', content: 'HOOK_COMPLETE' }, finish_reason: 'stop' }] })}\n\ndata: [DONE]\n\n` + ) + }) + await new Promise((resolve) => server.listen(0, '127.0.0.1', resolve)) + const { port } = server.address() as { port: number } + let childPid: number | undefined + let closing: Promise<'graceful' | 'forced'> | undefined + try { + const sessionId = await active.page.evaluate( + async ({ baseUrl, projectDir }) => { + const providerId = `custom-${crypto.randomUUID()}` + await window.deepchat.invoke('providers.add', { + provider: { + id: providerId, + name: 'Hook fixture', + apiType: 'openai-completions', + baseUrl, + apiKey: 'fixture-key', + enable: true, + custom: true + } + }) + await window.deepchat.invoke('models.addCustom', { + providerId, + model: { + id: 'hook-fixture', + name: 'Hook fixture', + enabled: true, + vision: false, + functionCall: false, + reasoning: false, + contextLength: 32000, + maxTokens: 8000 + } + }) + await window.deepchat.invoke('models.setStatus', { + providerId, + modelId: 'hook-fixture', + enabled: true + }) + const { config } = await window.deepchat.invoke('config.resolveDeepChatAgentConfig', { + agentId: 'deepchat' + }) + await window.deepchat.invoke('config.updateDeepChatAgent', { + agentId: 'deepchat', + updates: { + config: { + ...config, + memoryEnabled: false, + enabledMcpServerIds: [], + enabledSkillNames: [] + } + } + }) + await window.deepchat.invoke('config.setHooksNotifications', { + config: { + hooks: [ + { + id: 'held-hook', + name: 'Held hook', + enabled: true, + command: 'node hook-lifecycle.cjs && node -e "process.exit(0)"', + events: ['SessionStart'] + } + ] + } + }) + const { session } = await window.deepchat.invoke('sessions.create', { + agentId: 'deepchat', + providerId, + modelId: 'hook-fixture', + message: 'Run the owned hook.', + projectDir + }) + return session.id + }, + { baseUrl: `http://127.0.0.1:${port}/v1`, projectDir: profile } + ) + await expect.poll(() => existsSync(pidFile)).toBe(true) + const child = JSON.parse(readFileSync(pidFile, 'utf8')) as { pid: number; parent: number } + childPid = child.pid + expect(child.pid).toBeGreaterThan(0) + expect(child.parent).toBeGreaterThan(0) + await expect + .poll(async () => + JSON.stringify( + await active.page.evaluate( + (sessionId) => + window.deepchat.invoke('sessions.listMessagesPage', { sessionId, limit: 100 }), + sessionId + ) + ) + ) + .toContain('HOOK_COMPLETE') + const savedPayload = readFileSync(payloadFile, 'utf8') + const payload = JSON.parse(savedPayload) as HookEventPayload + const version = await active.electronApp.evaluate(({ app }) => app.getVersion()) + expect(payload).toMatchObject({ + payloadVersion: 1, + event: 'SessionStart', + isTest: false, + app: { version, platform: process.platform }, + session: { conversationId: sessionId, workdir: profile } + }) + + let closed = false + closing = active.close().then((outcome) => { + closed = true + return outcome + }) + await expect + .poll(() => processIsAlive(child.parent), { timeout: 5000, intervals: [25, 50, 100] }) + .toBe(false) + expect(processIsAlive(child.pid)).toBe(true) + expect(closed).toBe(false) + expect(active.electronApp.process().exitCode).toBeNull() + writeFileSync(releaseFile, 'release') + expect(await closing).toBe('graceful') + await expect.poll(() => processIsAlive(child.pid)).toBe(false) + + active = await launchApp() + await waitForAppReady(active.page) + expect(readFileSync(payloadFile, 'utf8')).toBe(savedPayload) + expect(await active.close()).toBe('graceful') + } finally { + writeFileSync(releaseFile, 'release') + let cleanupError: unknown + if (childPid !== undefined && processIsAlive(childPid)) { + try { + await expect.poll(() => processIsAlive(childPid!), { timeout: 5000 }).toBe(false) + } catch (error) { + process.kill(childPid, 'SIGKILL') + cleanupError = error + } + } + if (closing) await closing + server.closeAllConnections() + await new Promise((resolve) => server.close(() => resolve())) + if (cleanupError) throw cleanupError + } +}) diff --git a/test/e2e/specs/34-user-plugin-install.smoke.spec.ts b/test/e2e/specs/34-user-plugin-install.smoke.spec.ts index c2bac4f47d..244761c557 100644 --- a/test/e2e/specs/34-user-plugin-install.smoke.spec.ts +++ b/test/e2e/specs/34-user-plugin-install.smoke.spec.ts @@ -7,6 +7,61 @@ import { waitForAppReady } from '../helpers/wait' const require = createRequire(import.meta.url) +test('official settings windows close on disable and shutdown despite beforeunload @smoke', async ({ + launchApp +}) => { + let active = await launchApp() + await waitForAppReady(active.page) + const pluginId = 'com.deepchat.plugins.feishu' + const openSettings = async () => { + const { result } = await active.page.evaluate( + (pluginId) => + window.deepchat.invoke('plugins.invokeAction', { pluginId, actionId: 'settings.open' }), + pluginId + ) + expect(result.ok, result.error).toBe(true) + const settings = active.electronApp + .windows() + .find((page) => page.url().includes('/settings/index.html?pluginId=')) + expect(settings).toBeDefined() + expect( + await settings!.evaluate(() => ({ node: typeof process, require: typeof require })) + ).toEqual({ node: 'undefined', require: 'undefined' }) + await settings!.evaluate(() => { + window.addEventListener('beforeunload', (event) => { + event.preventDefault() + event.returnValue = '' + }) + }) + return settings! + } + const settings = await openSettings() + const { result } = await active.page.evaluate( + (pluginId) => window.deepchat.invoke('plugins.disable', { pluginId }), + pluginId + ) + expect(result.ok, result.error).toBe(true) + await expect.poll(() => settings.isClosed()).toBe(true) + expect( + await active.electronApp.evaluate( + ({ BrowserWindow }) => + BrowserWindow.getAllWindows().filter((window) => + window.webContents.getURL().includes('/settings/index.html?pluginId=') + ).length + ) + ).toBe(0) + expect(await active.close()).toBe('graceful') + active = await launchApp() + await waitForAppReady(active.page) + const { plugin } = await active.page.evaluate( + (pluginId) => window.deepchat.invoke('plugins.get', { pluginId }), + pluginId + ) + expect(plugin?.enabled).toBe(false) + await openSettings() + expect(await active.close()).toBe('graceful') +}) + test('ZIP review installs a disabled user plugin and imports a working MCP server @smoke', async ({ app }, testInfo) => { diff --git a/test/e2e/specs/36-chat-streaming.smoke.spec.ts b/test/e2e/specs/36-chat-streaming.smoke.spec.ts index d79c471983..439916764d 100644 --- a/test/e2e/specs/36-chat-streaming.smoke.spec.ts +++ b/test/e2e/specs/36-chat-streaming.smoke.spec.ts @@ -2,12 +2,14 @@ import { createServer } from 'node:http' import { writeFileSync } from 'node:fs' import { join } from 'node:path' import { test, expect } from '../fixtures/electronApp' -import { selectAgent, selectModel, sendMessage } from '../helpers/chat' +import { getActiveSessionId, selectAgent, selectModel, sendMessage } from '../helpers/chat' import { waitForAppReady, waitForGenerationDone } from '../helpers/wait' test('local streaming preserves an editable composer and completes the response @smoke', async ({ - app + app, + launchApp }) => { + expect(app.ownsUserDataDir).toBe(true) let releaseResponse = () => {} const released = new Promise((resolve) => { releaseResponse = resolve @@ -157,6 +159,37 @@ test('local streaming preserves an editable composer and completes the response await expect(app.page.getByTestId('chat-message-user')).toHaveCount(1) } expect(app.pageErrors).toEqual([]) + const sessionId = await getActiveSessionId(app.page) + const beforeClear = await app.page.evaluate( + (sessionId) => window.deepchat.invoke('sessions.listMessagesPage', { sessionId, limit: 10 }), + sessionId + ) + expect(beforeClear.messages).toHaveLength(2) + await shell.getByRole('button', { name: 'More', exact: true }).click() + await app.page.getByRole('menuitem', { name: 'Clear Messages', exact: true }).click() + await app.page.getByRole('button', { name: 'Clear', exact: true }).click() + await expect(app.page.getByTestId('chat-message-assistant')).toHaveCount(0) + expect( + ( + await app.page.evaluate( + (sessionId) => window.deepchat.invoke('sessions.listPendingInputs', { sessionId }), + sessionId + ) + ).items + ).toEqual([]) + expect(await app.close()).toBe('graceful') + const reopened = await launchApp() + await waitForAppReady(reopened.page) + expect( + ( + await reopened.page.evaluate( + (sessionId) => + window.deepchat.invoke('sessions.listMessagesPage', { sessionId, limit: 10 }), + sessionId + ) + ).messages + ).toEqual([]) + expect(await reopened.close()).toBe('graceful') } finally { releaseResponse() server.closeAllConnections() diff --git a/test/e2e/specs/44-admission-delegation.smoke.spec.ts b/test/e2e/specs/44-admission-delegation.smoke.spec.ts new file mode 100644 index 0000000000..67109f1e49 --- /dev/null +++ b/test/e2e/specs/44-admission-delegation.smoke.spec.ts @@ -0,0 +1,340 @@ +import { createServer } from 'node:http' +import { readFileSync } from 'node:fs' +import { join } from 'node:path' +import Database from 'better-sqlite3-multiple-ciphers' +import { test, expect } from '../fixtures/electronApp' +import { waitForAppReady } from '../helpers/wait' +import type { LiveDelegationSummary } from '../../../src/shared/orchestration/liveDelegation' +import type { ModelType } from '../../../src/shared/model' + +test.use({ privacyModeEnabled: true }) + +test('delegation admission queues, cancels and releases execution slots @smoke', async ({ + launchApp +}, testInfo) => { + const memoryRows = Number(process.env.DEEPCHAT_E2E_MEMORY_LOAD_ROWS ?? 0) + expect([0, 1000, 10000, 50000]).toContain(memoryRows) + let embeddingBatches = 0 + const started = new Set() + const releases = new Map void>() + const server = createServer(async (request, response) => { + if (request.url === '/v1/models') { + response + .writeHead(200, { 'Content-Type': 'application/json' }) + .end(JSON.stringify({ data: [{ id: 'admission-fixture' }] })) + return + } + if (!['/v1/chat/completions', '/v1/embeddings'].includes(request.url ?? '')) { + response.writeHead(404).end() + return + } + let source = '' + for await (const chunk of request) source += chunk + const body = JSON.parse(source) + if (request.url === '/v1/embeddings') { + const inputs = Array.isArray(body.input) ? body.input : [body.input] + embeddingBatches++ + response.writeHead(200, { 'Content-Type': 'application/json' }).end( + JSON.stringify({ + object: 'list', + model: body.model, + data: inputs.map((_: string, index: number) => ({ + object: 'embedding', + index, + embedding: Array.from({ length: 1536 }, (_, component) => (component === 0 ? 1 : 0)) + })), + usage: { prompt_tokens: inputs.length, total_tokens: inputs.length } + }) + ) + return + } + if (!body.stream) { + response.writeHead(200, { 'Content-Type': 'application/json' }).end( + JSON.stringify({ + id: 'title', + object: 'chat.completion', + created: 1, + model: 'admission-fixture', + choices: [ + { + index: 0, + message: { role: 'assistant', content: 'Admission verification' }, + finish_reason: 'stop' + } + ] + }) + ) + return + } + response.writeHead(200, { 'Content-Type': 'text/event-stream' }) + const emit = (delta: unknown, finishReason: string | null = null) => + response.write( + `data: ${JSON.stringify({ + id: 'admission-fixture', + object: 'chat.completion.chunk', + created: 1, + model: 'admission-fixture', + choices: [{ index: 0, delta, finish_reason: finishReason }] + })}\n\n` + ) + const userText = body.messages + .filter((message: { role: string }) => message.role === 'user') + .map((message: { content: unknown }) => JSON.stringify(message.content)) + .join('\n') + const child = /CHILD_ADMISSION_(\d)/.exec(userText) + if (child) { + const index = Number(child[1]) + started.add(index) + await new Promise((resolve) => { + releases.set(index, resolve) + response.once('close', resolve) + }) + if (response.destroyed) return + emit({ content: `CHILD_${index}_DONE` }, 'stop') + } else if (!body.messages.some((message: { role: string }) => message.role === 'tool')) { + emit( + { + role: 'assistant', + tool_calls: Array.from({ length: 4 }, (_, slot) => { + const index = slot + (userText.includes('PARENT_ADMISSION_B') ? 4 : 0) + return { + index, + id: `spawn-${index}`, + type: 'function', + function: { + name: 'deepchat_subagents', + arguments: JSON.stringify({ + operation: 'spawn', + slotId: 'explorer', + title: `Admission verification ${index}`, + prompt: `CHILD_ADMISSION_${index}: Reply with CHILD_${index}_DONE without using tools.` + }) + } + } + }) + }, + 'tool_calls' + ) + } else emit({ content: 'Delegation requests accepted.' }, 'stop') + response.end('data: [DONE]\n\n') + }) + await new Promise((resolve) => server.listen(0, '127.0.0.1', resolve)) + const { port } = server.address() as { port: number } + try { + let app = await launchApp() + await waitForAppReady(app.page) + const providerId = await app.page.evaluate( + async ({ baseUrl, memoryRows }) => { + const providerId = `custom-${crypto.randomUUID()}` + await window.deepchat.invoke('providers.add', { + provider: { + id: providerId, + name: 'Admission fixture', + apiType: 'openai-completions', + baseUrl, + apiKey: 'fixture-key', + enable: true, + custom: true + } + }) + await window.deepchat.invoke('models.addCustom', { + providerId, + model: { + id: 'admission-fixture', + name: 'Admission fixture', + enabled: true, + vision: false, + functionCall: true, + reasoning: false, + contextLength: 32000, + maxTokens: 8000 + } + }) + await window.deepchat.invoke('models.setStatus', { + providerId, + modelId: 'admission-fixture', + enabled: true + }) + if (memoryRows) + await window.deepchat.invoke('models.addCustom', { + providerId, + model: { + id: 'load-embedding', + name: 'Load embedding', + type: 'embedding' as ModelType, + enabled: true, + vision: false, + functionCall: false, + reasoning: false, + contextLength: 8192, + maxTokens: 8192 + } + }) + const { config } = await window.deepchat.invoke('config.resolveDeepChatAgentConfig', { + agentId: 'deepchat' + }) + await window.deepchat.invoke('config.updateDeepChatAgent', { + agentId: 'deepchat', + updates: { + config: { + ...config, + ...(memoryRows + ? { + memoryEnabled: true, + memoryEmbedding: { providerId, modelId: 'load-embedding' } + } + : {}), + subagentEnabled: true, + permissionMode: 'full_access', + enabledSkillNames: [], + disabledAgentTools: [] + } + } + }) + return providerId + }, + { baseUrl: `http://127.0.0.1:${port}/v1`, memoryRows } + ) + if (memoryRows) { + expect(app.ownsUserDataDir).toBe(true) + expect(await app.close()).toBe('graceful') + const database = new Database(join(app.userDataDir, 'app_db', 'agent.db')) + try { + const insert = database.prepare(`INSERT INTO agent_memory + (id, agent_id, kind, content, created_at, status, embedding_state, lifecycle_state) + VALUES (?, 'deepchat', 'semantic', ?, ?, 'fts_only', 'fts_only', 'active')`) + database.transaction(() => { + const now = Date.now() + for (let index = 0; index < memoryRows; index++) + insert.run(`load-${index}`, `Concurrent native indexing fact ${index}.`, now) + })() + } finally { + database.close() + } + app = await launchApp() + await waitForAppReady(app.page) + await app.page.evaluate(() => + window.deepchat.invoke('memory.reindex', { agentId: 'deepchat' }) + ) + } + const firstParent = await app.page.evaluate( + async ({ providerId, projectDir }) => { + const { session } = await window.deepchat.invoke('sessions.create', { + agentId: 'deepchat', + message: 'PARENT_ADMISSION_A: Delegate four isolated admission verification tasks.', + providerId, + modelId: 'admission-fixture', + projectDir, + permissionMode: 'full_access', + orchestrationPolicy: 'proactive' + }) + return { parentSessionId: session.id, providerId } + }, + { providerId, projectDir: app.userDataDir } + ) + await expect.poll(() => started.size).toBe(4) + if (memoryRows) { + expect(embeddingBatches).toBeGreaterThan(0) + const { status } = await app.page.evaluate(() => + window.deepchat.invoke('memory.getStatus', { agentId: 'deepchat' }) + ) + expect(status.pendingEmbedding).toBeGreaterThan(0) + } + const secondParentId = await app.page.evaluate( + async ({ providerId, projectDir }) => { + const { session } = await window.deepchat.invoke('sessions.create', { + agentId: 'deepchat', + message: 'PARENT_ADMISSION_B: Delegate four isolated admission verification tasks.', + providerId, + modelId: 'admission-fixture', + projectDir, + permissionMode: 'full_access', + orchestrationPolicy: 'proactive' + }) + return session.id + }, + { providerId: firstParent.providerId, projectDir: app.userDataDir } + ) + const list = (parentSessionId: string) => + app.page.evaluate(async (parentSessionId) => { + const { delegations } = await window.deepchat.invoke('orchestration.liveDelegation.list', { + parentSessionId, + limit: 100 + }) + return delegations + }, parentSessionId) as Promise + const listAll = async () => [ + ...(await list(firstParent.parentSessionId)), + ...(await list(secondParentId)) + ] + await expect.poll(async () => (await listAll()).length).toBe(8) + await expect.poll(() => started.size).toBe(6) + const queued = (await listAll()).find( + (delegation) => delegation.title === 'Admission verification 7' + )! + expect(queued.status).toBe('queued') + await app.page.evaluate( + async ({ parentSessionId, delegationId }) => { + await window.deepchat.invoke('orchestration.liveDelegation.interrupt', { + parentSessionId, + delegationId + }) + }, + { parentSessionId: secondParentId, delegationId: queued.id } + ) + expect(started.has(7)).toBe(false) + releases.get(0)!() + await expect.poll(() => started.has(6)).toBe(true) + for (const release of releases.values()) release() + await expect + .poll(async () => (await listAll()).map((delegation) => delegation.status).sort()) + .toEqual(['idle', 'idle', 'idle', 'idle', 'idle', 'idle', 'idle', 'interrupted']) + const final = await listAll() + expect(final.find((delegation) => delegation.id === queued.id)?.status).toBe('interrupted') + expect([...started].sort()).toEqual([0, 1, 2, 3, 4, 5, 6]) + if (memoryRows) + await expect + .poll( + async () => + ( + await app.page.evaluate(() => + window.deepchat.invoke('memory.getStatus', { agentId: 'deepchat' }) + ) + ).status.lastReindex?.outcome, + { timeout: 180_000 } + ) + .toBe('completed') + expect(app.pageErrors).toEqual([]) + expect(await app.close()).toBe('graceful') + const records = readFileSync(join(app.userDataDir, 'logs', 'main.jsonl'), 'utf8') + .trim() + .split('\n') + .map((line) => JSON.parse(line)) + const admission = records.filter((record) => record.event.startsWith('agent.admission.')) + expect(admission.some((record) => record.event === 'agent.admission.queued')).toBe(true) + expect(admission.some((record) => record.event === 'agent.admission.rejected')).toBe(true) + expect(admission.at(-1)).toMatchObject({ event: 'agent.admission.closed' }) + await testInfo.attach('admission-comparison.json', { + body: Buffer.from( + JSON.stringify( + { + completed: 7, + interrupted: 1, + peakStartedBeforeRelease: 6, + started: [...started].sort(), + memoryRows, + embeddingBatches, + events: admission.map((record) => record.event) + }, + null, + 2 + ) + ), + contentType: 'application/json' + }) + } finally { + for (const release of releases.values()) release() + server.closeAllConnections() + await new Promise((resolve) => server.close(() => resolve())) + } +}) diff --git a/test/e2e/specs/45-memory-vector-runtime.smoke.spec.ts b/test/e2e/specs/45-memory-vector-runtime.smoke.spec.ts new file mode 100644 index 0000000000..b1044fea5d --- /dev/null +++ b/test/e2e/specs/45-memory-vector-runtime.smoke.spec.ts @@ -0,0 +1,248 @@ +import { createServer } from 'node:http' +import { existsSync, readFileSync, writeFileSync } from 'node:fs' +import { join } from 'node:path' +import Database from 'better-sqlite3-multiple-ciphers' +import { DuckDBInstance } from '@duckdb/node-api' +import { test, expect } from '../fixtures/electronApp' +import { waitForAppReady } from '../helpers/wait' +import type { ModelType } from '../../../src/shared/model' + +test.use({ privacyModeEnabled: true }) + +test('native Memory indexing, vector-only recall, deletion and clear survive relaunch @smoke', async ({ + launchApp +}, testInfo) => { + const rows = Number(process.env.DEEPCHAT_E2E_MEMORY_ROWS ?? 1000) + expect([1000, 10000, 50000]).toContain(rows) + const embeddingRequests: number[] = [] + const server = createServer(async (request, response) => { + if (request.url === '/v1/models') { + response + .writeHead(200, { 'Content-Type': 'application/json' }) + .end(JSON.stringify({ data: [{ id: 'fixture-embedding' }] })) + return + } + if (request.url !== '/v1/embeddings') { + response.writeHead(404).end() + return + } + let source = '' + for await (const chunk of request) source += chunk + const body = JSON.parse(source) + const inputs: string[] = Array.isArray(body.input) ? body.input : [body.input] + embeddingRequests.push(inputs.length) + response.writeHead(200, { 'Content-Type': 'application/json' }).end( + JSON.stringify({ + object: 'list', + model: body.model, + data: inputs.map((input, index) => ({ + object: 'embedding', + index, + embedding: Array.from({ length: 1536 }, (_, component) => + component === (input.includes('cobalt-lark') || input === 'quartzneedle' ? 0 : 1) + ? 1 + : Math.fround(Math.sin(component + 1) * 0.001) + ) + })), + usage: { prompt_tokens: inputs.length * 4, total_tokens: inputs.length * 4 } + }) + ) + }) + await new Promise((resolve) => server.listen(0, '127.0.0.1', resolve)) + const address = server.address() as { port: number } + try { + const initial = await launchApp() + expect(initial.ownsUserDataDir).toBe(true) + await waitForAppReady(initial.page) + await initial.page.evaluate(async (baseUrl) => { + const providerId = `custom-${crypto.randomUUID()}` + await window.deepchat.invoke('providers.add', { + provider: { + id: providerId, + name: 'Memory vector fixture', + apiType: 'openai-completions', + baseUrl, + apiKey: 'fixture-key', + enable: true, + custom: true + } + }) + await window.deepchat.invoke('models.addCustom', { + providerId, + model: { + id: 'fixture-embedding', + name: 'Fixture Embedding', + type: 'embedding' as ModelType, + enabled: true, + vision: false, + functionCall: false, + reasoning: false, + contextLength: 8192, + maxTokens: 8192 + } + }) + await window.deepchat.invoke('config.updateDeepChatAgent', { + agentId: 'deepchat', + updates: { + config: { + memoryEnabled: true, + memoryEmbedding: { providerId, modelId: 'fixture-embedding' } + } + } + }) + }, `http://127.0.0.1:${address.port}/v1`) + expect(await initial.close()).toBe('graceful') + + const securityPath = join(initial.userDataDir, 'database-security.json') + if (existsSync(securityPath)) { + expect(JSON.parse(readFileSync(securityPath, 'utf8')).metadata?.enabled).not.toBe(true) + } + // Seed canonical rows only while the disposable application's writer is closed. + const db = new Database(join(initial.userDataDir, 'app_db', 'agent.db')) + try { + const insert = db.prepare(`INSERT INTO agent_memory + (id, agent_id, kind, content, created_at, status, embedding_state, lifecycle_state) + VALUES (?, 'deepchat', 'semantic', ?, ?, 'fts_only', 'fts_only', 'active')`) + db.transaction(() => { + const now = Date.now() + insert.run('native-anchor', 'The project codename is cobalt-lark.', now) + for (let index = 1; index < rows; index++) { + insert.run(`native-filler-${index}`, `Baseline fact ${index} about slow rivers.`, now) + } + })() + } finally { + db.close() + } + + const app = await launchApp() + await waitForAppReady(app.page) + await app.page.evaluate(() => window.deepchat.invoke('memory.reindex', { agentId: 'deepchat' })) + await expect + .poll( + async () => { + const { status } = await app.page.evaluate(() => + window.deepchat.invoke('memory.getStatus', { agentId: 'deepchat' }) + ) + return { pending: status.pendingEmbedding, outcome: status.lastReindex?.outcome } + }, + // Reserve a minute for recall, the fixed idle window and relaunch within the test limit. + { timeout: rows === 50000 ? testInfo.timeout - 60_000 : 120_000 } + ) + .toEqual({ pending: 0, outcome: 'completed' }) + + const timings: number[] = [] + for (let sample = 0; sample < 12; sample++) { + const startedAt = performance.now() + const result = await app.page.evaluate(() => + window.deepchat.invoke('memory.search', { + agentId: 'deepchat', + query: 'quartzneedle', + limit: 20 + }) + ) + timings.push(performance.now() - startedAt) + expect(result.results).toEqual([ + expect.objectContaining({ + id: 'native-anchor', + sources: expect.objectContaining({ vec: true }) + }) + ]) + } + const { health } = await app.page.evaluate(() => + window.deepchat.invoke('memory.getHealth', { agentId: 'deepchat' }) + ) + expect(health.runtime.agent.retrieval.search.vectorCandidates).toBeGreaterThan(0) + expect(health.runtime.process.vector.openStores).toBeGreaterThan(0) + expect(embeddingRequests.some((count) => count > 1)).toBe(true) + + const deletion = await app.page.evaluate(() => + window.deepchat.invoke('memory.delete', { agentId: 'deepchat', memoryId: 'native-anchor' }) + ) + expect(deletion.action).toBe('applied') + expect( + await app.page.evaluate(() => + window.deepchat.invoke('memory.search', { + agentId: 'deepchat', + query: 'quartzneedle', + limit: 20 + }) + ) + ).toEqual({ results: [] }) + // Measure settled footprint without forcing GC or slowing normal E2E runs. + if (process.env.DEEPCHAT_E2E_MEASURE_RESOURCES === '1') + await new Promise((resolve) => setTimeout(resolve, 30_000)) + expect(await app.close()).toBe('graceful') + + const instance = await DuckDBInstance.create( + join(app.userDataDir, 'app_db', 'AgentMemory', 'deepchat.v2.duckdb') + ) + const connection = await instance.connect() + try { + const result = await connection.runAndReadAll( + 'SELECT count(*)::INTEGER AS total FROM memory_vector' + ) + expect(result.getRowObjectsJson()).toEqual([{ total: rows - 1 }]) + } finally { + connection.closeSync() + instance.closeSync() + } + + const reopened = await launchApp() + await waitForAppReady(reopened.page) + expect( + await reopened.page.evaluate(() => + window.deepchat.invoke('memory.search', { + agentId: 'deepchat', + query: 'quartzneedle', + limit: 20 + }) + ) + ).toEqual({ results: [] }) + const { status: beforeClear } = await reopened.page.evaluate(() => + window.deepchat.invoke('memory.getStatus', { agentId: 'deepchat' }) + ) + expect(beforeClear.total).toBeGreaterThanOrEqual(rows - 1) + const cleared = await reopened.page.evaluate(() => + window.deepchat.invoke('memory.clear', { agentId: 'deepchat' }) + ) + expect(cleared.cleanupPendingRestart).toBe(false) + expect(cleared.removed).toBeGreaterThanOrEqual(beforeClear.total) + expect( + await reopened.page.evaluate(() => + window.deepchat.invoke('memory.getStatus', { agentId: 'deepchat' }) + ) + ).toMatchObject({ status: { total: 0, pendingEmbedding: 0 } }) + expect(await reopened.close()).toBe('graceful') + const clearedDb = new Database(join(reopened.userDataDir, 'app_db', 'agent.db'), { + readonly: true + }) + try { + expect( + clearedDb + .prepare("SELECT count(*) AS total FROM agent_memory WHERE agent_id = 'deepchat'") + .get() + ).toEqual({ total: 0 }) + } finally { + clearedDb.close() + } + const evidence = testInfo.outputPath('native-memory-baseline.json') + writeFileSync( + evidence, + JSON.stringify({ + rows, + dimensions: 1536, + embeddingShape: 'dense-f32-sine-noise', + timingsMs: timings, + embeddingRequests, + beforeClear + }) + ) + await testInfo.attach('native-memory-baseline.json', { + path: evidence, + contentType: 'application/json' + }) + } finally { + server.closeAllConnections() + await new Promise((resolve) => server.close(() => resolve())) + } +}) diff --git a/test/e2e/specs/46-memory-runtime-lifecycle.smoke.spec.ts b/test/e2e/specs/46-memory-runtime-lifecycle.smoke.spec.ts new file mode 100644 index 0000000000..3f8c3cfa28 --- /dev/null +++ b/test/e2e/specs/46-memory-runtime-lifecycle.smoke.spec.ts @@ -0,0 +1,330 @@ +import { execFileSync } from 'node:child_process' +import { createServer } from 'node:http' +import { test, expect } from '../fixtures/electronApp' +import type { ModelType } from '../../../src/shared/model' +import { waitForAppReady } from '../helpers/wait' + +test.use({ privacyModeEnabled: true }) + +function processes(): Array<{ pid: number; parent: number; command: string }> { + if (process.platform === 'win32') { + const rows = JSON.parse( + execFileSync( + 'powershell.exe', + [ + '-NoProfile', + '-NonInteractive', + '-Command', + 'Get-CimInstance Win32_Process | Select-Object ProcessId,ParentProcessId,Name | ConvertTo-Json -Compress' + ], + { encoding: 'utf8' } + ) + ) + return rows.map((row: { ProcessId: number; ParentProcessId: number; Name: string }) => ({ + pid: row.ProcessId, + parent: row.ParentProcessId, + command: row.Name + })) + } + return execFileSync('ps', ['-axo', 'pid=,ppid=,command='], { encoding: 'utf8' }) + .split('\n') + .flatMap((line) => { + const match = /^\s*(\d+)\s+(\d+)\s+(.+)$/.exec(line) + return match ? [{ pid: Number(match[1]), parent: Number(match[2]), command: match[3] }] : [] + }) +} + +test('Memory evicts idle stores, changes models and survives native worker loss @smoke', async ({ + launchApp +}) => { + const server = createServer(async (request, response) => { + if (request.url === '/v1/models') { + response.writeHead(200, { 'Content-Type': 'application/json' }).end( + JSON.stringify({ + data: ['fixture-embedding-16', 'fixture-embedding-32', 'fixture-chat'].map((id) => ({ + id + })) + }) + ) + return + } + let source = '' + for await (const chunk of request) source += chunk + const body = source ? JSON.parse(source) : {} + if (request.url === '/v1/embeddings') { + const inputs: string[] = Array.isArray(body.input) ? body.input : [body.input] + response.writeHead(200, { 'Content-Type': 'application/json' }).end( + JSON.stringify({ + object: 'list', + model: body.model, + data: inputs.map((input, index) => ({ + object: 'embedding', + index, + embedding: Array.from( + { length: body.model.endsWith('-32') ? 32 : 16 }, + (_, component) => + component === (input.includes('cobalt-lark') || input === 'quartzneedle' ? 0 : 1) + ? 1 + : 0 + ) + })), + usage: { prompt_tokens: inputs.length * 4, total_tokens: inputs.length * 4 } + }) + ) + return + } + if (request.url !== '/v1/chat/completions') { + response.writeHead(404).end() + return + } + if (!body.stream) { + response.writeHead(200, { 'Content-Type': 'application/json' }).end( + JSON.stringify({ + id: 'fixture', + object: 'chat.completion', + created: 1, + model: body.model, + choices: [ + { + index: 0, + message: { role: 'assistant', content: 'Memory fixture' }, + finish_reason: 'stop' + } + ] + }) + ) + return + } + response.writeHead(200, { 'Content-Type': 'text/event-stream' }) + response.write( + `data: ${JSON.stringify({ + id: 'fixture', + object: 'chat.completion.chunk', + created: 1, + model: body.model, + choices: [ + { + index: 0, + delta: { role: 'assistant', content: 'MEMORY_RUNTIME_STILL_READY' }, + finish_reason: 'stop' + } + ] + })}\n\n` + ) + response.end('data: [DONE]\n\n') + }) + await new Promise((resolve) => server.listen(0, '127.0.0.1', resolve)) + const { port } = server.address() as { port: number } + try { + const initial = await launchApp() + expect(initial.ownsUserDataDir).toBe(true) + await waitForAppReady(initial.page) + const setup = await initial.page.evaluate(async (baseUrl) => { + const providerId = `custom-${crypto.randomUUID()}` + await window.deepchat.invoke('providers.add', { + provider: { + id: providerId, + name: 'Memory lifecycle fixture', + apiType: 'openai-completions', + baseUrl, + apiKey: 'fixture-key', + enable: true, + custom: true + } + }) + for (const modelId of ['fixture-embedding-16', 'fixture-embedding-32', 'fixture-chat']) { + await window.deepchat.invoke('models.addCustom', { + providerId, + model: { + id: modelId, + name: modelId, + type: (modelId === 'fixture-chat' ? 'chat' : 'embedding') as ModelType, + enabled: true, + vision: false, + functionCall: false, + reasoning: false, + contextLength: 8192, + maxTokens: 8192 + } + }) + await window.deepchat.invoke('models.setStatus', { providerId, modelId, enabled: true }) + } + const agents: string[] = [] + const memories: Record = {} + for (let index = 0; index < 9; index++) { + const { agent } = await window.deepchat.invoke('config.createDeepChatAgent', { + name: `Memory lifecycle ${index}` + }) + agents.push(agent.id) + await window.deepchat.invoke('config.updateDeepChatAgent', { + agentId: agent.id, + updates: { + config: { + memoryEnabled: true + } + } + }) + const { result } = await window.deepchat.invoke('memory.add', { + agentId: agent.id, + kind: 'semantic', + content: 'The project codename is cobalt-lark.' + }) + if (result.action !== 'created' || !result.memoryId) + throw new Error(`Memory fixture was not created: ${JSON.stringify(result)}`) + memories[agent.id] = result.memoryId + await window.deepchat.invoke('config.updateDeepChatAgent', { + agentId: agent.id, + updates: { + config: { + memoryEnabled: false, + memoryEmbedding: { providerId, modelId: 'fixture-embedding-16' } + } + } + }) + } + return { providerId, agents, memories } + }, `http://127.0.0.1:${port}/v1`) + expect(await initial.close()).toBe('graceful') + + const app = await launchApp() + await waitForAppReady(app.page) + const host = processes().find( + (row) => + row.parent === app.electronApp.process().pid && row.command.includes('deepchat-harness-') + )! + expect(host).toBeDefined() + const before = processes() + .filter((row) => row.parent === host.pid) + .map((row) => row.pid) + expect(before).toHaveLength(1) + const recall = (agentId: string, query = 'quartzneedle') => + app.page.evaluate( + ({ agentId, query }) => + window.deepchat.invoke('memory.search', { agentId, query, limit: 5 }), + { agentId, query } + ) + for (const agentId of setup.agents) { + await app.page.evaluate(async (agentId) => { + await window.deepchat.invoke('config.updateDeepChatAgent', { + agentId, + updates: { config: { memoryEnabled: true } } + }) + await window.deepchat.invoke('memory.reindex', { agentId }) + }, agentId) + await expect + .poll(async () => + (await recall(agentId)).results.some( + (row) => row.id === setup.memories[agentId] && row.sources?.vec + ) + ) + .toBe(true) + } + const lastAgent = setup.agents.at(-1)! + await expect + .poll( + async () => + ( + await app.page.evaluate( + (agentId) => window.deepchat.invoke('memory.getHealth', { agentId }), + lastAgent + ) + ).health.runtime.process.vector.openStores + ) + .toBeLessThanOrEqual(8) + await app.page.evaluate( + async ({ agentId, providerId }) => { + await window.deepchat.invoke('config.updateDeepChatAgent', { + agentId, + updates: { + config: { + memoryEmbedding: { providerId, modelId: 'fixture-embedding-32' } + } + } + }) + await window.deepchat.invoke('memory.reindex', { agentId }) + }, + { agentId: lastAgent, providerId: setup.providerId } + ) + await expect + .poll(async () => (await recall(lastAgent)).results.some((row) => row.sources?.vec)) + .toBe(true) + const worker = processes().filter((row) => row.parent === host.pid && !before.includes(row.pid)) + expect(worker).toHaveLength(1) + expect((await recall(lastAgent, 'cobalt')).results.some((row) => row.sources?.fts)).toBe(true) + process.kill(worker[0].pid, 'SIGKILL') + await expect + .poll(async () => (await recall(lastAgent, 'cobalt')).results.some((row) => row.sources?.fts)) + .toBe(true) + expect(() => process.kill(host.pid, 0)).not.toThrow() + expect(() => process.kill(before[0], 0)).not.toThrow() + expect( + processes() + .filter((row) => row.parent === host.pid) + .map((row) => row.pid) + ).toEqual(before) + const clearedAgent = setup.agents[0] + const cleared = await app.page.evaluate( + (agentId) => window.deepchat.invoke('memory.clear', { agentId }), + clearedAgent + ) + expect(cleared.removed).toBeGreaterThanOrEqual(1) + expect(cleared.cleanupPendingRestart).toBe(true) + expect((await recall(clearedAgent, 'cobalt')).results).toEqual([]) + const { session } = await app.page.evaluate( + ({ providerId, projectDir }) => + window.deepchat.invoke('sessions.create', { + agentId: 'deepchat', + providerId, + modelId: 'fixture-chat', + projectDir, + message: 'Reply after the vector worker stops.' + }), + { providerId: setup.providerId, projectDir: app.userDataDir } + ) + await expect + .poll(async () => + JSON.stringify( + await app.page.evaluate( + (sessionId) => window.deepchat.invoke('sessions.restore', { sessionId, limit: 30 }), + session.id + ) + ) + ) + .toContain('MEMORY_RUNTIME_STILL_READY') + expect(await app.close()).toBe('graceful') + const reopened = await launchApp() + await waitForAppReady(reopened.page) + expect( + ( + await reopened.page.evaluate( + (agentId) => + window.deepchat.invoke('memory.search', { agentId, query: 'cobalt', limit: 5 }), + clearedAgent + ) + ).results + ).toEqual([]) + await reopened.page.evaluate( + (agentId) => window.deepchat.invoke('memory.reindex', { agentId }), + lastAgent + ) + await expect + .poll(async () => + ( + await reopened.page.evaluate( + (agentId) => + window.deepchat.invoke('memory.search', { + agentId, + query: 'quartzneedle', + limit: 5 + }), + lastAgent + ) + ).results.some((row) => row.id === setup.memories[lastAgent] && row.sources?.vec) + ) + .toBe(true) + expect(await reopened.close()).toBe('graceful') + } finally { + server.closeAllConnections() + await new Promise((resolve) => server.close(() => resolve())) + } +}) diff --git a/test/e2e/specs/47-scheduler-store.smoke.spec.ts b/test/e2e/specs/47-scheduler-store.smoke.spec.ts new file mode 100644 index 0000000000..106b611f17 --- /dev/null +++ b/test/e2e/specs/47-scheduler-store.smoke.spec.ts @@ -0,0 +1,213 @@ +import { createServer } from 'node:http' +import { test, expect } from '../fixtures/electronApp' +import { waitForAppReady } from '../helpers/wait' + +test.use({ privacyModeEnabled: true }) + +test('scheduler manual and timed runs settle once and survive restart @smoke', async ({ + launchApp +}, testInfo) => { + let streamedRequests = 0 + const server = createServer(async (request, response) => { + if (request.url === '/v1/models') { + response + .writeHead(200, { 'Content-Type': 'application/json' }) + .end(JSON.stringify({ data: [{ id: 'scheduler-fixture' }] })) + return + } + if (request.url !== '/v1/chat/completions') { + response.writeHead(404).end() + return + } + let source = '' + for await (const chunk of request) source += chunk + const body = JSON.parse(source) + const message = 'SCHEDULER_FIXTURE_DONE' + if (!body.stream) { + response.writeHead(200, { 'Content-Type': 'application/json' }).end( + JSON.stringify({ + id: 'scheduler-fixture', + object: 'chat.completion', + created: 1, + model: 'scheduler-fixture', + choices: [ + { index: 0, message: { role: 'assistant', content: message }, finish_reason: 'stop' } + ] + }) + ) + return + } + streamedRequests++ + response.writeHead(200, { 'Content-Type': 'text/event-stream' }).end( + `data: ${JSON.stringify({ + id: 'scheduler-fixture', + object: 'chat.completion.chunk', + created: 1, + model: 'scheduler-fixture', + choices: [ + { index: 0, delta: { role: 'assistant', content: message }, finish_reason: 'stop' } + ] + })}\n\ndata: [DONE]\n\n` + ) + }) + await new Promise((resolve) => server.listen(0, '127.0.0.1', resolve)) + const { port } = server.address() as { port: number } + try { + const initial = await launchApp() + expect(initial.ownsUserDataDir).toBe(true) + await waitForAppReady(initial.page) + const { schedulerStatus: unused } = await initial.page.evaluate(() => + window.deepchat.invoke('cronJobs.getSchedulerStatus', {}) + ) + expect(unused.pid).toBeNull() + await initial.page.evaluate(async (baseUrl) => { + const providerId = `custom-${crypto.randomUUID()}` + await window.deepchat.invoke('providers.add', { + provider: { + id: providerId, + name: 'Scheduler fixture', + apiType: 'openai-completions', + baseUrl, + apiKey: 'fixture-key', + enable: true, + custom: true + } + }) + await window.deepchat.invoke('models.addCustom', { + providerId, + model: { + id: 'scheduler-fixture', + name: 'Scheduler fixture', + enabled: true, + vision: false, + functionCall: false, + reasoning: false, + contextLength: 32000, + maxTokens: 8000 + } + }) + await window.deepchat.invoke('models.setStatus', { + providerId, + modelId: 'scheduler-fixture', + enabled: true + }) + await window.deepchat.invoke('config.updateDeepChatAgent', { + agentId: 'deepchat', + updates: { + config: { + defaultModelPreset: { providerId, modelId: 'scheduler-fixture' }, + memoryEnabled: false, + subagentEnabled: false, + permissionMode: 'full_access', + disabledAgentTools: [], + enabledSkillNames: [] + } + } + }) + }, `http://127.0.0.1:${port}/v1`) + expect(await initial.close()).toBe('graceful') + + const active = await launchApp() + await waitForAppReady(active.page) + const { job } = await active.page.evaluate(() => + window.deepchat.invoke('cronJobs.upsert', { + name: 'Scheduler ownership fixture', + enabled: true, + cronExpr: '0 0 1 1 *', + timezone: 'UTC', + agentId: 'deepchat', + taskPrompt: 'Reply with SCHEDULER_FIXTURE_DONE without using tools.', + runtime: { maxDurationMs: 30_000, maxTurns: 2, concurrencyPolicy: 'queue' } + }) + ) + expect( + await active.electronApp.evaluate(({ powerMonitor }) => ({ + listeners: powerMonitor.listenerCount('resume'), + delivered: [powerMonitor.emit('resume'), powerMonitor.emit('resume')] + })) + ).toEqual({ listeners: 1, delivered: [true, true] }) + const { run: manual } = await active.page.evaluate( + (id) => window.deepchat.invoke('cronJobs.runNow', { id }), + job.id + ) + await expect + .poll( + async () => + ( + await active.page.evaluate( + (runId) => window.deepchat.invoke('cronJobs.getRun', { runId }), + manual.id + ) + ).run.status + ) + .toBe('completed') + await active.page.evaluate( + (job) => window.deepchat.invoke('cronJobs.upsert', { ...job, cronExpr: '*/2 * * * * *' }), + job + ) + await expect + .poll(async () => { + const { runs } = await active.page.evaluate( + (jobId) => window.deepchat.invoke('cronJobs.listRuns', { jobId, limit: 20 }), + job.id + ) + return runs.some((run) => run.reason === 'scheduled' && run.status === 'completed') + }) + .toBe(true) + await active.page.evaluate( + (job) => window.deepchat.invoke('cronJobs.upsert', { ...job, cronExpr: '0 0 1 1 *' }), + job + ) + await expect + .poll(async () => { + const { runs } = await active.page.evaluate( + (jobId) => window.deepchat.invoke('cronJobs.listRuns', { jobId, limit: 20 }), + job.id + ) + return runs.every((run) => run.status === 'completed') + }) + .toBe(true) + const { runs } = await active.page.evaluate( + (jobId) => window.deepchat.invoke('cronJobs.listRuns', { jobId, limit: 20 }), + job.id + ) + expect(runs.find((run) => run.id === manual.id)?.reason).toBe('manual') + const scheduled = runs.filter((run) => run.reason === 'scheduled') + expect(new Set(scheduled.map((run) => run.scheduledAt)).size).toBe(scheduled.length) + expect(runs.every((run) => run.sessionId && run.outputMessageId)).toBe(true) + expect(streamedRequests).toBe(runs.length) + if (process.env.DEEPCHAT_E2E_MEASURE_RESOURCES === '1') + await new Promise((resolve) => setTimeout(resolve, 30_000)) + expect(await active.close()).toBe('graceful') + + const reopened = await launchApp() + await waitForAppReady(reopened.page) + const persisted = await reopened.page.evaluate( + (jobId) => window.deepchat.invoke('cronJobs.listRuns', { jobId, limit: 20 }), + job.id + ) + expect(persisted.runs).toEqual(runs) + expect(streamedRequests).toBe(runs.length) + await reopened.page.evaluate( + (id) => window.deepchat.invoke('cronJobs.toggle', { id, enabled: false }), + job.id + ) + const { schedulerStatus: stopped } = await reopened.page.evaluate(() => + window.deepchat.invoke('cronJobs.restartScheduler', {}) + ) + expect(stopped.pid).toBeNull() + expect(stopped.enabledJobCount).toBe(0) + await reopened.page.evaluate((id) => window.deepchat.invoke('cronJobs.delete', { id }), job.id) + expect( + (await reopened.page.evaluate(() => window.deepchat.invoke('cronJobs.list', {}))).jobs + ).toEqual([]) + expect(await reopened.close()).toBe('graceful') + await testInfo.attach('scheduler-outcomes.json', { + body: Buffer.from(JSON.stringify({ runs, streamedRequests })), + contentType: 'application/json' + }) + } finally { + server.closeAllConnections() + await new Promise((resolve) => server.close(() => resolve())) + } +}) diff --git a/test/e2e/specs/48-credential-crypto.smoke.spec.ts b/test/e2e/specs/48-credential-crypto.smoke.spec.ts new file mode 100644 index 0000000000..dcc179a9a0 --- /dev/null +++ b/test/e2e/specs/48-credential-crypto.smoke.spec.ts @@ -0,0 +1,88 @@ +import { readFileSync } from 'node:fs' +import { join } from 'node:path' +import { test, expect } from '../fixtures/electronApp' +import { waitForAppReady } from '../helpers/wait' + +test.use({ privacyModeEnabled: true }) + +test('native async crypto reads legacy ciphertext @smoke', async ({ app }, testInfo) => { + expect(app.ownsUserDataDir).toBe(true) + await waitForAppReady(app.page) + const compatibility = await app.electronApp.evaluate(async ({ safeStorage }) => { + const plaintext = 'credential-compatibility-fixture' + const legacy = safeStorage.encryptString(plaintext) + const available = await safeStorage.isAsyncEncryptionAvailable() + const legacyRead = await safeStorage.decryptStringAsync(legacy) + const current = await safeStorage.encryptStringAsync(plaintext) + const currentRead = await safeStorage.decryptStringAsync(current) + return { + available, + legacyMatches: legacyRead.result === plaintext, + currentMatches: currentRead.result === plaintext, + shouldReEncrypt: legacyRead.shouldReEncrypt, + electron: process.versions.electron + } + }) + expect(compatibility.available).toBe(true) + expect(compatibility.legacyMatches).toBe(true) + expect(compatibility.currentMatches).toBe(true) + expect(typeof compatibility.shouldReEncrypt).toBe('boolean') + await testInfo.attach('native-crypto-compatibility.json', { + body: Buffer.from(JSON.stringify(compatibility)), + contentType: 'application/json' + }) +}) + +test('cloud credentials stay wrapped across acknowledged updates and relaunch @smoke', async ({ + launchApp +}) => { + const secret = 'disposable-cloud-credential-fixture' + const initial = await launchApp() + expect(initial.ownsUserDataDir).toBe(true) + await waitForAppReady(initial.page) + const { config: empty } = await initial.page.evaluate(() => + window.deepchat.invoke('sync.getCloudConfig', {}) + ) + expect(empty.safeStorageAvailable).toBe(true) + expect(empty.hasSecret).toBe(false) + expect(await initial.close()).toBe('graceful') + + const active = await launchApp() + await waitForAppReady(active.page) + const { config: configured } = await active.page.evaluate( + (secret) => + window.deepchat.invoke('sync.setCloudConfig', { + config: { + enabled: false, + endpoint: 'http://127.0.0.1:1', + bucket: 'credential-fixture', + accessKeyId: 'fixture-access-key', + secretAccessKey: secret + } + }), + secret + ) + expect(configured).toMatchObject({ hasSecret: true, safeStorageAvailable: true }) + expect(JSON.stringify(configured)).not.toContain(secret) + const settingsPath = join(active.userDataDir, 'app-settings.json') + const raw = readFileSync(settingsPath, 'utf8') + expect(raw).not.toContain(secret) + const wrapped = JSON.parse(raw).cloudSyncSecret + expect(typeof wrapped).toBe('string') + expect(wrapped.length).toBeGreaterThan(0) + const { config: updated } = await active.page.evaluate(() => + window.deepchat.invoke('sync.setCloudConfig', { config: { region: 'us-west-2' } }) + ) + expect(updated).toMatchObject({ hasSecret: true, region: 'us-west-2' }) + expect(JSON.parse(readFileSync(settingsPath, 'utf8')).cloudSyncSecret).toBe(wrapped) + expect(await active.close()).toBe('graceful') + + const reopened = await launchApp() + await waitForAppReady(reopened.page) + const { config: persisted } = await reopened.page.evaluate(() => + window.deepchat.invoke('sync.getCloudConfig', {}) + ) + expect(persisted).toEqual(updated) + expect(JSON.parse(readFileSync(settingsPath, 'utf8')).cloudSyncSecret).toBe(wrapped) + expect(await reopened.close()).toBe('graceful') +}) diff --git a/test/e2e/specs/49-settings-snapshot.smoke.spec.ts b/test/e2e/specs/49-settings-snapshot.smoke.spec.ts new file mode 100644 index 0000000000..43cacf92c8 --- /dev/null +++ b/test/e2e/specs/49-settings-snapshot.smoke.spec.ts @@ -0,0 +1,109 @@ +import type { Page } from '@playwright/test' +import { test, expect } from '../fixtures/electronApp' +import { openSettings, openSettingsTab } from '../helpers/settings' +import { waitForAppReady } from '../helpers/wait' + +async function changeSettings(page: Page, enabled: boolean) { + return await page.evaluate(async (enabled) => { + const events: Array<{ version: number; values: { autoScrollEnabled?: boolean } }> = [] + let received!: () => void + const changed = new Promise((resolve) => { + received = resolve + }) + const unsubscribe = window.deepchat.on('settings.changed', (payload) => { + if (!payload.changedKeys.includes('autoScrollEnabled')) return + events.push(payload) + if (events.length === 2) received() + }) + try { + const first = await window.deepchat.invoke('settings.getSnapshot', { + keys: ['autoScrollEnabled'] + }) + const second = await window.deepchat.invoke('settings.getSnapshot', { + keys: ['autoScrollEnabled'] + }) + const initial = await window.deepchat.invoke('settings.update', { + changes: [{ key: 'autoScrollEnabled', value: !enabled }] + }) + const final = await window.deepchat.invoke('settings.update', { + changes: [{ key: 'autoScrollEnabled', value: enabled }] + }) + await changed + return { first, second, initial, final, events } + } finally { + unsubscribe() + } + }, enabled) +} + +test.use({ privacyModeEnabled: true }) + +test('settings revisions survive clock rollback and persist across relaunch @smoke', async ({ + launchApp +}) => { + const active = await launchApp() + expect(active.ownsUserDataDir).toBe(true) + await waitForAppReady(active.page) + const settingsPage = await openSettings(active) + await openSettingsTab(settingsPage, 'settings-tab-general') + const autoScroll = settingsPage.locator('#auto-scroll-switch') + await expect(autoScroll).toHaveAttribute('aria-checked', 'true') + + // Control only the disposable Main process clock; restore it before shutdown. + const fixedNow = await active.electronApp.evaluate(() => { + const original = Date.now + const state = globalThis as typeof globalThis & { restoreSettingsSmokeClock?: () => void } + state.restoreSettingsSmokeClock = () => { + Date.now = original + delete state.restoreSettingsSmokeClock + } + const now = original() + Date.now = () => now + return now + }) + try { + const frozen = await changeSettings(active.page, true) + const revisions = [ + frozen.first.version, + frozen.second.version, + frozen.events[0].version, + frozen.initial.version, + frozen.events[1].version, + frozen.final.version + ] + for (let i = 1; i < revisions.length; i++) + expect(revisions[i]).toBeGreaterThan(revisions[i - 1]) + expect(frozen.initial.values.autoScrollEnabled).toBe(false) + expect(frozen.final.values.autoScrollEnabled).toBe(true) + + await active.electronApp.evaluate((_electron, now) => { + Date.now = () => now - 30_000 + }, fixedNow) + const rolledBack = await changeSettings(active.page, false) + expect(rolledBack.first.version).toBeGreaterThan(frozen.final.version) + expect(rolledBack.final.version).toBeGreaterThan(rolledBack.events[1].version) + expect(rolledBack.final.values.autoScrollEnabled).toBe(false) + await expect(autoScroll).toHaveAttribute('aria-checked', 'false') + } finally { + await active.electronApp.evaluate(() => { + ;( + globalThis as typeof globalThis & { restoreSettingsSmokeClock?: () => void } + ).restoreSettingsSmokeClock?.() + }) + } + expect(await active.close()).toBe('graceful') + + const reopened = await launchApp() + await waitForAppReady(reopened.page) + const { values } = await reopened.page.evaluate(() => + window.deepchat.invoke('settings.getSnapshot', { keys: ['autoScrollEnabled'] }) + ) + expect(values.autoScrollEnabled).toBe(false) + const reopenedSettings = await openSettings(reopened) + await openSettingsTab(reopenedSettings, 'settings-tab-general') + await expect(reopenedSettings.locator('#auto-scroll-switch')).toHaveAttribute( + 'aria-checked', + 'false' + ) + expect(await reopened.close()).toBe('graceful') +}) diff --git a/test/e2e/specs/50-sync-token.smoke.spec.ts b/test/e2e/specs/50-sync-token.smoke.spec.ts new file mode 100644 index 0000000000..7e923efda0 --- /dev/null +++ b/test/e2e/specs/50-sync-token.smoke.spec.ts @@ -0,0 +1,152 @@ +import type { ElectronApplication } from '@playwright/test' +import { readFileSync, writeFileSync } from 'node:fs' +import { join } from 'node:path' +import { test, expect } from '../fixtures/electronApp' +import { waitForAppReady } from '../helpers/wait' +import { + SYNC_HOST_PROTOCOL_NAME, + SYNC_HOST_PROTOCOL_VERSION +} from '../../../src/shared/contracts/syncHost' + +const hostUrl = 'https://sync-token-fixture.invalid' +const hostId = 'sync-token-fixture' +const token = 'disposable-sync-token-credential-fixture' + +async function interceptHost(app: ElectronApplication) { + await app.evaluate( + ({ app }, fixture) => { + const require = process + .getBuiltinModule('module') + .createRequire(joinPath(app.getAppPath(), 'package.json')) + const { MockAgent, getGlobalDispatcher, setGlobalDispatcher } = + require('undici') as typeof import('undici') + const previous = getGlobalDispatcher() + const agent = new MockAgent() + agent.disableNetConnect() + const host = agent.get(fixture.hostUrl) + const json = { headers: { 'content-type': 'application/json' } } + host + .intercept({ path: '/sync/v1/handshake', method: 'GET' }) + .reply( + 200, + { + protocol: fixture.protocol, + protocolVersion: fixture.version, + hostId: fixture.hostId, + appVersion: 'fixture', + capabilities: ['snapshot'], + encryption: { payload: 'none', transport: 'tls' } + }, + json + ) + .persist() + host.intercept({ path: '/sync/v1/pair', method: 'POST' }).reply( + 200, + { + deviceId: 'fixture-device', + deviceName: 'Fixture device', + token: fixture.token + }, + json + ) + const headers = { authorization: `Bearer ${fixture.token}` } + host.intercept({ path: '/sync/v1/status', method: 'GET', headers }).reply( + 200, + { + serverTime: Date.now(), + snapshot: null + }, + json + ) + host.intercept({ path: '/sync/v1/prepare', method: 'POST', headers }).reply(404, {}, json) + const state = globalThis as typeof globalThis & { + restoreSyncTokenFixture?: () => Promise + } + state.restoreSyncTokenFixture = async () => { + setGlobalDispatcher(previous) + delete state.restoreSyncTokenFixture + await agent.close() + } + setGlobalDispatcher(agent) + function joinPath(directory: string, file: string) { + return process.getBuiltinModule('path').join(directory, file) + } + }, + { + hostUrl, + hostId, + token, + protocol: SYNC_HOST_PROTOCOL_NAME, + version: SYNC_HOST_PROTOCOL_VERSION + } + ) +} + +async function restoreHost(app: ElectronApplication) { + await app.evaluate(async () => { + await ( + globalThis as typeof globalThis & { restoreSyncTokenFixture?: () => Promise } + ).restoreSyncTokenFixture?.() + }) +} + +test.use({ privacyModeEnabled: true }) + +test('peer credentials stay wrapped and read legacy ciphertext after relaunch @smoke', async ({ + launchApp +}) => { + const active = await launchApp() + expect(active.ownsUserDataDir).toBe(true) + await waitForAppReady(active.page) + await interceptHost(active.electronApp) + const file = join(active.userDataDir, 'sync-peer', 'pairing.json') + try { + const status = await active.page.evaluate( + (input) => window.deepchat.invoke('syncPeer.pair', input), + { + hostUrl, + hostId, + code: 'fixture-code', + deviceName: 'Fixture device' + } + ) + expect(status.paired).toBe(true) + expect(JSON.stringify(status)).not.toContain(token) + const current = readFileSync(file, 'utf8') + expect(current).not.toContain(token) + expect(typeof JSON.parse(current).wrappedToken).toBe('string') + } finally { + await restoreHost(active.electronApp) + } + const legacy = await active.electronApp.evaluate( + ({ safeStorage }, value) => safeStorage.encryptString(value).toString('base64'), + token + ) + const pairing = JSON.parse(readFileSync(file, 'utf8')) + writeFileSync(file, JSON.stringify({ ...pairing, wrappedToken: legacy })) + expect(await active.close()).toBe('graceful') + + const reopened = await launchApp() + await waitForAppReady(reopened.page) + await interceptHost(reopened.electronApp) + try { + await reopened.page.evaluate(() => + window.deepchat.invoke('syncPeer.pull', { mode: 'increment' }) + ) + await expect + .poll(() => reopened.page.evaluate(() => window.deepchat.invoke('syncPeer.getStatus', {}))) + .toMatchObject({ + paired: true, + phase: 'failed', + error: 'sync.tunnel.error.noSnapshot' + }) + expect(JSON.parse(readFileSync(file, 'utf8')).wrappedToken).toBe(legacy) + const forgotten = await reopened.page.evaluate(() => + window.deepchat.invoke('syncPeer.forget', {}) + ) + expect(forgotten.paired).toBe(false) + } finally { + await restoreHost(reopened.electronApp) + } + expect(await reopened.close()).toBe('graceful') +}) diff --git a/test/e2e/specs/51-database-security.smoke.spec.ts b/test/e2e/specs/51-database-security.smoke.spec.ts new file mode 100644 index 0000000000..483606403c --- /dev/null +++ b/test/e2e/specs/51-database-security.smoke.spec.ts @@ -0,0 +1,102 @@ +import { readFileSync, writeFileSync } from 'node:fs' +import { join } from 'node:path' +import { test, expect } from '../fixtures/electronApp' +import { waitForAppReady } from '../helpers/wait' + +test.use({ privacyModeEnabled: true }) + +test('database encryption preserves settings through legacy unlock rekey and disable @smoke', async ({ + launchApp +}) => { + const firstPassword = 'disposable-database-password-one' + const nextPassword = 'disposable-database-password-two' + const active = await launchApp() + expect(active.ownsUserDataDir).toBe(true) + await waitForAppReady(active.page) + await active.page.evaluate(() => + window.deepchat.invoke('settings.update', { + changes: [{ key: 'copyWithCotEnabled', value: false }] + }) + ) + const { status: enabled } = await active.page.evaluate( + (password) => window.deepchat.invoke('databaseSecurity.enable', { password }), + firstPassword + ) + expect(enabled).toMatchObject({ + enabled: true, + passwordStorage: 'safeStorage', + manualUnlockRequired: false + }) + const file = join(active.userDataDir, 'database-security.json') + const databaseFile = join(active.userDataDir, 'app_db', 'agent.db') + const raw = readFileSync(file, 'utf8') + expect(raw).not.toContain(firstPassword) + expect(readFileSync(databaseFile).subarray(0, 16).toString()).not.toBe('SQLite format 3\u0000') + const legacy = await active.electronApp.evaluate( + ({ safeStorage }, value) => safeStorage.encryptString(value).toString('base64'), + firstPassword + ) + const state = JSON.parse(raw) + writeFileSync( + file, + JSON.stringify({ ...state, metadata: { ...state.metadata, wrappedPassword: legacy } }) + ) + expect(await active.close()).toBe('graceful') + + const reopened = await launchApp() + await waitForAppReady(reopened.page) + expect( + ( + await reopened.page.evaluate(() => + window.deepchat.invoke('settings.getSnapshot', { keys: ['copyWithCotEnabled'] }) + ) + ).values.copyWithCotEnabled + ).toBe(false) + expect(JSON.parse(readFileSync(file, 'utf8')).metadata.wrappedPassword).toBe(legacy) + await expect( + reopened.page.evaluate( + (newPassword) => + window.deepchat.invoke('databaseSecurity.changePassword', { + currentPassword: 'wrong-fixture-password', + newPassword + }), + nextPassword + ) + ).rejects.toThrow() + const { status: changed } = await reopened.page.evaluate( + ({ currentPassword, newPassword }) => + window.deepchat.invoke('databaseSecurity.changePassword', { currentPassword, newPassword }), + { currentPassword: firstPassword, newPassword: nextPassword } + ) + expect(changed.enabled).toBe(true) + expect(readFileSync(file, 'utf8')).not.toContain(nextPassword) + expect(await reopened.close()).toBe('graceful') + + const changedApp = await launchApp() + await waitForAppReady(changedApp.page) + expect( + ( + await changedApp.page.evaluate(() => + window.deepchat.invoke('settings.getSnapshot', { keys: ['copyWithCotEnabled'] }) + ) + ).values.copyWithCotEnabled + ).toBe(false) + const { status: disabled } = await changedApp.page.evaluate( + (currentPassword) => window.deepchat.invoke('databaseSecurity.disable', { currentPassword }), + nextPassword + ) + expect(disabled).toMatchObject({ enabled: false, passwordStorage: 'none' }) + expect(readFileSync(databaseFile).subarray(0, 16).toString()).toBe('SQLite format 3\u0000') + expect(await changedApp.close()).toBe('graceful') + + const plain = await launchApp() + await waitForAppReady(plain.page) + expect( + ( + await plain.page.evaluate(() => + window.deepchat.invoke('settings.getSnapshot', { keys: ['copyWithCotEnabled'] }) + ) + ).values.copyWithCotEnabled + ).toBe(false) + expect(await plain.close()).toBe('graceful') +}) diff --git a/test/e2e/specs/52-mcp-oauth-credentials.smoke.spec.ts b/test/e2e/specs/52-mcp-oauth-credentials.smoke.spec.ts new file mode 100644 index 0000000000..6ed3794be5 --- /dev/null +++ b/test/e2e/specs/52-mcp-oauth-credentials.smoke.spec.ts @@ -0,0 +1,118 @@ +import { existsSync, readFileSync, writeFileSync } from 'node:fs' +import { join } from 'node:path' +import { test, expect } from '../fixtures/electronApp' +import { openSettings } from '../helpers/settings' +import { waitForAppReady } from '../helpers/wait' + +test.use({ privacyModeEnabled: true }) + +test('MCP machine credentials preserve native ciphertext and settings-window ownership @smoke', async ({ + launchApp +}) => { + const active = await launchApp() + expect(active.ownsUserDataDir).toBe(true) + await waitForAppReady(active.page) + const settings = await openSettings(active) + const binding = await settings.evaluate(async () => { + await window.deepchat.invoke('mcp.addServer', { + serverName: 'native-credential-fixture', + config: { + type: 'http', + baseUrl: 'http://127.0.0.1:1/mcp', + enabled: false, + command: '', + args: [], + env: {}, + descriptions: 'Disposable credential fixture', + icons: '', + authorization: { + mode: 'client_credentials', + clientId: 'fixture-client', + authorizationServerIssuer: 'https://auth.example', + protectedResourceUrl: 'https://resource.example/mcp' + } + } + }) + const { servers } = await window.deepchat.invoke('mcp.getServers', {}) + const config = servers['native-credential-fixture'] + if (!config?.serverId || !config.configGeneration || !config.bindingHash) + throw new Error('Missing fixture server identity') + return { + serverId: config.serverId, + configGeneration: config.configGeneration, + bindingHash: config.bindingHash, + endpoint: config.baseUrl!, + clientId: config.authorization!.clientId, + authorizationServerIssuer: config.authorization!.authorizationServerIssuer, + protectedResourceUrl: config.authorization!.protectedResourceUrl + } + }) + const secret = 'disposable-mcp-client-secret' + await expect( + active.page.evaluate( + ({ binding, secret }) => + window.deepchat.invoke('mcp.credentials.set', { + binding, + credential: { kind: 'client_secret', secret } + }), + { binding, secret } + ) + ).rejects.toThrow('settings window') + const { status } = await settings.evaluate( + ({ binding, secret }) => + window.deepchat.invoke('mcp.credentials.set', { + binding, + credential: { kind: 'client_secret', secret } + }), + { binding, secret } + ) + expect(status).toMatchObject({ configured: true, persistent: true, kind: 'client_secret' }) + const file = join(active.userDataDir, 'mcp-oauth', 'credentials.json') + expect(existsSync(file)).toBe(true) + const raw = readFileSync(file, 'utf8') + expect(raw).not.toContain(secret) + const envelope = JSON.parse(raw) + expect(envelope).toMatchObject({ version: 2, storage: 'safeStorage' }) + const legacy = await active.electronApp.evaluate( + ({ safeStorage }, wrapped) => + safeStorage + .encryptString(safeStorage.decryptString(Buffer.from(wrapped, 'base64'))) + .toString('base64'), + envelope.wrapped + ) + expect(await active.close()).toBe('graceful') + const legacyFile = JSON.stringify({ ...envelope, wrapped: legacy }) + writeFileSync(file, legacyFile) + + const reopened = await launchApp() + await waitForAppReady(reopened.page) + const reopenedSettings = await openSettings(reopened) + const saved = await reopenedSettings.evaluate( + (serverId) => window.deepchat.invoke('mcp.credentials.getStatus', { serverId }), + binding.serverId + ) + expect(saved.credentials.find((credential) => credential.kind === 'client_secret')).toMatchObject( + { configured: true, persistent: true } + ) + expect(JSON.stringify(saved)).not.toContain(secret) + expect(readFileSync(file, 'utf8')).toBe(legacyFile) + const removed = await reopenedSettings.evaluate( + (binding) => + window.deepchat.invoke('mcp.credentials.remove', { binding, kind: 'client_secret' }), + binding + ) + expect(removed.status).toMatchObject({ configured: false, persistent: true }) + expect(await reopened.close()).toBe('graceful') + + const final = await launchApp() + await waitForAppReady(final.page) + const finalSettings = await openSettings(final) + const after = await finalSettings.evaluate( + (serverId) => window.deepchat.invoke('mcp.credentials.getStatus', { serverId }), + binding.serverId + ) + expect( + after.credentials.find((credential) => credential.kind === 'client_secret')?.configured + ).toBe(false) + expect(await final.close()).toBe('graceful') +}) diff --git a/test/e2e/specs/53-provider-oauth-credentials.smoke.spec.ts b/test/e2e/specs/53-provider-oauth-credentials.smoke.spec.ts new file mode 100644 index 0000000000..9ee0660b71 --- /dev/null +++ b/test/e2e/specs/53-provider-oauth-credentials.smoke.spec.ts @@ -0,0 +1,119 @@ +import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs' +import { dirname, join } from 'node:path' +import { test, expect } from '../fixtures/electronApp' +import { openSettings } from '../helpers/settings' +import { waitForAppReady } from '../helpers/wait' + +test.use({ privacyModeEnabled: true }) + +test('Provider OAuth preserves legacy private files and durable logout @smoke', async ({ + launchApp +}) => { + const first = await launchApp() + expect(first.ownsUserDataDir).toBe(true) + await waitForAppReady(first.page) + const fixtures = ['openai-codex-auth', 'xai-grok-auth'].map((directory) => ({ + file: join(first.userDataDir, directory, 'credentials.json'), + tokens: { + accessToken: `disposable-${directory}-access`, + refreshToken: `disposable-${directory}-refresh`, + tokenType: 'Bearer', + expiresAt: Date.now() + 24 * 60 * 60 * 1000, + accountId: 'fixture-account-12345678', + accountLabel: 'Fixture account', + updatedAt: 42 + } + })) + const wrapped = await first.electronApp.evaluate( + ({ safeStorage }, tokens) => + tokens.map((value) => safeStorage.encryptString(JSON.stringify(value)).toString('base64')), + fixtures.map((fixture) => fixture.tokens) + ) + expect(await first.close()).toBe('graceful') + for (const fixture of fixtures) { + mkdirSync(dirname(fixture.file), { recursive: true, mode: 0o700 }) + writeFileSync( + fixture.file, + JSON.stringify({ version: 1, storage: 'file', tokens: fixture.tokens, updatedAt: 42 }), + { mode: 0o600 } + ) + } + + for (const storage of ['file', 'safeStorage'] as const) { + if (storage === 'safeStorage') + fixtures.forEach((fixture, index) => { + writeFileSync( + fixture.file, + JSON.stringify({ version: 1, storage, wrapped: wrapped[index], updatedAt: 42 }), + { mode: 0o600 } + ) + }) + const before = fixtures.map((fixture) => readFileSync(fixture.file, 'utf8')) + const active = await launchApp() + await waitForAppReady(active.page) + const settings = await openSettings(active) + const statuses = await settings.evaluate(async () => [ + (await window.deepchat.invoke('oauth.openaiCodex.getStatus', {})).status, + (await window.deepchat.invoke('oauth.xaiGrok.getStatus', {})).status + ]) + for (const status of statuses) { + expect(status).toMatchObject({ + state: 'authenticated', + authenticated: true, + accountLabel: 'Fixture account' + }) + expect(JSON.stringify(status)).not.toContain('disposable-') + } + await settings.evaluate(async () => { + await window.deepchat.invoke('oauth.openaiCodex.cancelLogin', {}) + await window.deepchat.invoke('oauth.xaiGrok.cancelLogin', {}) + }) + expect(fixtures.map((fixture) => readFileSync(fixture.file, 'utf8'))).toEqual(before) + if (storage === 'safeStorage') { + await active.electronApp.evaluate(() => { + const paths: string[] = [] + Object.assign(globalThis, { __oauthFixtureRequests: paths }) + globalThis.fetch = async (input) => { + const url = new URL(input instanceof Request ? input.url : String(input)) + paths.push(url.pathname) + if (url.pathname.endsWith('/.well-known/openid-configuration')) + return Response.json({ + device_authorization_endpoint: 'https://auth.x.ai/device', + token_endpoint: 'https://auth.x.ai/token', + revocation_endpoint: 'https://auth.x.ai/oauth/revoke' + }) + if (url.pathname.endsWith('/oauth/revoke')) return new Response(null, { status: 200 }) + throw new Error(`Unexpected fixture request: ${url.origin}${url.pathname}`) + } + }) + const loggedOut = await settings.evaluate(async () => [ + (await window.deepchat.invoke('oauth.openaiCodex.logout', {})).status, + (await window.deepchat.invoke('oauth.xaiGrok.logout', {})).status + ]) + expect( + loggedOut.every((status) => status.state === 'signed-out' && !status.authenticated) + ).toBe(true) + expect( + await active.electronApp.evaluate( + () => + ( + globalThis as unknown as { __oauthFixtureRequests: string[] } + ).__oauthFixtureRequests.filter((path) => path.endsWith('/oauth/revoke')).length + ) + ).toBe(2) + expect(fixtures.every((fixture) => !existsSync(fixture.file))).toBe(true) + } + expect(await active.close()).toBe('graceful') + } + const final = await launchApp() + await waitForAppReady(final.page) + const settings = await openSettings(final) + const statuses = await settings.evaluate(async () => [ + (await window.deepchat.invoke('oauth.openaiCodex.getStatus', {})).status, + (await window.deepchat.invoke('oauth.xaiGrok.getStatus', {})).status + ]) + expect(statuses.every((status) => status.state === 'signed-out' && !status.authenticated)).toBe( + true + ) + expect(await final.close()).toBe('graceful') +}) diff --git a/test/e2e/specs/54-database-maintenance.smoke.spec.ts b/test/e2e/specs/54-database-maintenance.smoke.spec.ts new file mode 100644 index 0000000000..af07db1fab --- /dev/null +++ b/test/e2e/specs/54-database-maintenance.smoke.spec.ts @@ -0,0 +1,384 @@ +import { join, resolve } from 'node:path' +import { execFile } from 'node:child_process' +import { promisify } from 'node:util' +import type { ElectronApplication } from '@playwright/test' +import { test, expect } from '../fixtures/electronApp' +import { waitForAppReady } from '../helpers/wait' + +test.use({ privacyModeEnabled: true }) + +async function runCli(userDataDir: string, args: string[]) { + const env: NodeJS.ProcessEnv = { ...process.env, DEEPCHAT_E2E_USER_DATA_DIR: userDataDir } + delete env.DEEPCHAT_CLI_AGENT_TOKEN + return await promisify(execFile)( + process.execPath, + [resolve('out/cli/deepchat.mjs'), ...args, '--json'], + { env, timeout: 30_000 } + ) +} + +async function holdEncryption( + app: ElectronApplication, + heldValue: string, + maintenancePassword: string +) { + await app.evaluate( + ({ safeStorage }, { heldValue, maintenancePassword }) => { + const encrypt = safeStorage.encryptStringAsync + let release!: () => void + const gate = new Promise((resolve) => { + release = resolve + }) + const fixture = { + entered: false, + events: [] as string[], + release, + restore: () => { + safeStorage.encryptStringAsync = encrypt + } + } + Object.assign(globalThis, { __maintenanceFixture: fixture }) + safeStorage.encryptStringAsync = async (value) => { + if (value === heldValue) { + fixture.entered = true + await gate + fixture.events.push('pending-request-released') + } else if (value === maintenancePassword) fixture.events.push('maintenance-dispatched') + return encrypt.call(safeStorage, value) + } + }, + { heldValue, maintenancePassword } + ) +} + +async function releaseEncryption(app: ElectronApplication) { + await app.evaluate(() => { + const fixture = ( + globalThis as unknown as { + __maintenanceFixture: { release(): void; restore(): void } + } + ).__maintenanceFixture + fixture.restore() + fixture.release() + }) +} + +test('database maintenance restores sessions through incremental and overwrite imports @smoke', async ({ + launchApp +}) => { + const active = await launchApp() + expect(active.ownsUserDataDir).toBe(true) + await waitForAppReady(active.page) + const listProviders = async () => { + const { stdout } = await runCli(active.userDataDir, ['provider', 'list']) + const response = JSON.parse(stdout) + expect(response).toMatchObject({ ok: true, result: { providers: expect.any(Array) } }) + return response.result.providers.map((provider: { id: string }) => provider.id) + } + const providers = await listProviders() + await active.page.evaluate( + (folderPath) => + window.deepchat.invoke('config.updateSyncSettings', { enabled: true, folderPath }), + join(active.userDataDir, 'maintenance-backups') + ) + const created = await active.page.evaluate(() => + window.deepchat.invoke('sessions.create', { + agentId: 'deepchat', + providerId: 'openai', + modelId: 'gpt-5.6-luna', + message: '', + projectDir: null + }) + ) + const sessionId = created.session.id + const before = await active.page.evaluate( + (sessionId) => window.deepchat.invoke('sessions.restore', { sessionId, limit: 30 }), + sessionId + ) + expect(before.session?.id).toBe(sessionId) + const { backup } = await active.page.evaluate(() => + window.deepchat.invoke('sync.startBackup', {}) + ) + expect(backup).not.toBeNull() + await active.page.evaluate( + (sessionId) => window.deepchat.invoke('sessions.delete', { sessionId }), + sessionId + ) + const missing = await active.page.evaluate( + (sessionId) => window.deepchat.invoke('sessions.restore', { sessionId, limit: 30 }), + sessionId + ) + expect(missing.session).toBeNull() + const invalid = await active.page.evaluate(() => + window.deepchat.invoke('sync.import', { backupFile: '../not-a-backup.zip', mode: 'increment' }) + ) + expect(invalid.result.success).toBe(false) + const restored = await active.page.evaluate( + (backupFile) => window.deepchat.invoke('sync.import', { backupFile, mode: 'increment' }), + backup!.fileName + ) + expect(restored.result.success).toBe(true) + const increment = await active.page.evaluate( + (sessionId) => window.deepchat.invoke('sessions.restore', { sessionId, limit: 30 }), + sessionId + ) + expect(increment.session?.id).toBe(sessionId) + expect(increment.session?.providerId).toBe(before.session?.providerId) + const extra = await active.page.evaluate(() => + window.deepchat.invoke('sessions.create', { + agentId: 'deepchat', + providerId: 'openai', + modelId: 'gpt-5.6-luna', + message: '', + projectDir: null + }) + ) + const overwritten = await active.page.evaluate( + (backupFile) => window.deepchat.invoke('sync.import', { backupFile, mode: 'overwrite' }), + backup!.fileName + ) + expect(overwritten.result.success).toBe(true) + const removed = await active.page.evaluate( + (sessionId) => window.deepchat.invoke('sessions.restore', { sessionId, limit: 30 }), + extra.session.id + ) + expect(removed.session).toBeNull() + const { report } = await active.page.evaluate(() => + window.deepchat.invoke('databaseSecurity.repairSchema', {}) + ) + expect(report.remainingIssues).toEqual([]) + expect(await active.close()).toBe('graceful') + + const reopened = await launchApp() + await waitForAppReady(reopened.page) + const persisted = await reopened.page.evaluate( + (sessionId) => window.deepchat.invoke('sessions.restore', { sessionId, limit: 30 }), + sessionId + ) + expect(persisted.session?.id).toBe(sessionId) + expect(persisted.session?.providerId).toBe(before.session?.providerId) + expect(await listProviders()).toEqual(providers) + expect(await reopened.close()).toBe('graceful') +}) + +test('database repair and import cannot enter while encryption is preparing @smoke', async ({ + launchApp +}) => { + const active = await launchApp() + expect(active.ownsUserDataDir).toBe(true) + await waitForAppReady(active.page) + const password = 'disposable-maintenance-password' + await holdEncryption(active.electronApp, password, password) + const enabled = active.page.evaluate( + (password) => window.deepchat.invoke('databaseSecurity.enable', { password }), + password + ) + void enabled.catch(() => undefined) + try { + await expect + .poll(() => + active.electronApp.evaluate( + () => + (globalThis as unknown as { __maintenanceFixture: { entered: boolean } }) + .__maintenanceFixture.entered + ) + ) + .toBe(true) + await expect( + active.page.evaluate(() => window.deepchat.invoke('databaseSecurity.repairSchema', {})) + ).rejects.toThrow('App database maintenance is maintenance') + await expect( + active.page.evaluate(() => + window.deepchat.invoke('sync.import', { backupFile: 'unavailable.zip', mode: 'increment' }) + ) + ).rejects.toThrow('App database maintenance is maintenance') + await expect( + active.page.evaluate(() => window.deepchat.invoke('config.setCustomPrompts', { prompts: [] })) + ).rejects.toThrow('App database maintenance is maintenance') + await expect( + active.page.evaluate(() => + window.deepchat.invoke('providers.add', { + provider: { + id: 'custom-maintenance-blocked', + name: 'Blocked', + apiType: 'openai-completions', + apiKey: 'must-not-persist', + baseUrl: 'http://127.0.0.1:1/v1', + enable: false, + custom: true + } + }) + ) + ).rejects.toThrow('App database maintenance is maintenance') + expect( + (await active.page.evaluate(() => window.deepchat.invoke('window.getCurrentState', {}))).state + .exists + ).toBe(true) + expect( + (await active.page.evaluate(() => window.deepchat.invoke('databaseSecurity.getStatus', {}))) + .status.migrationInProgress + ).toBe(true) + expect( + JSON.parse((await runCli(active.userDataDir, ['system', 'status'])).stdout) + ).toMatchObject({ ok: true, result: { running: true } }) + await expect(runCli(active.userDataDir, ['provider', 'list'])).rejects.toMatchObject({ + stdout: expect.stringMatching(/"ok"\s*:\s*false/) + }) + } finally { + await releaseEncryption(active.electronApp) + } + expect((await enabled).status.enabled).toBe(true) + expect( + (await active.page.evaluate(() => window.deepchat.invoke('databaseSecurity.repairSchema', {}))) + .report.remainingIssues + ).toEqual([]) + expect(await active.close()).toBe('graceful') +}) + +test('maintenance drains a credential request delayed in native encryption @smoke', async ({ + launchApp +}) => { + const active = await launchApp() + expect(active.ownsUserDataDir).toBe(true) + await waitForAppReady(active.page) + const secret = 'disposable-pending-cloud-secret' + const password = 'disposable-request-drain-password' + await holdEncryption(active.electronApp, secret, password) + const saving = active.page.evaluate( + (secretAccessKey) => + window.deepchat.invoke('sync.setCloudConfig', { + config: { + enabled: false, + endpoint: 'http://127.0.0.1:1', + bucket: 'fixture', + accessKeyId: 'fixture', + secretAccessKey + } + }), + secret + ) + const rejected = expect(saving).rejects.toThrow() + await expect + .poll(() => + active.electronApp.evaluate( + () => + (globalThis as unknown as { __maintenanceFixture: { entered: boolean } }) + .__maintenanceFixture.entered + ) + ) + .toBe(true) + const enabled = active.page.evaluate( + (password) => window.deepchat.invoke('databaseSecurity.enable', { password }), + password + ) + void enabled.catch(() => undefined) + try { + await expect + .poll(async () => + active.page.evaluate(async () => { + try { + await window.deepchat.invoke('config.listCustomPrompts', {}) + return false + } catch (error) { + return String(error).includes('App database maintenance is maintenance') + } + }) + ) + .toBe(true) + } finally { + // Release the request first; keep the observer installed until maintenance dispatches. + await active.electronApp.evaluate(() => + ( + globalThis as unknown as { __maintenanceFixture: { release(): void } } + ).__maintenanceFixture.release() + ) + } + await rejected + try { + expect((await enabled).status.enabled).toBe(true) + expect( + await active.electronApp.evaluate( + () => + (globalThis as unknown as { __maintenanceFixture: { events: string[] } }) + .__maintenanceFixture.events + ) + ).toEqual(['pending-request-released', 'maintenance-dispatched']) + expect( + (await active.page.evaluate(() => window.deepchat.invoke('sync.getCloudConfig', {}))).config + .hasSecret + ).toBe(false) + } finally { + await releaseEncryption(active.electronApp) + } + expect(await active.close()).toBe('graceful') +}) + +for (const kind of ['credential', 'maintenance'] as const) { + test(`shutdown drains pending native ${kind} work before closing the database @smoke`, async ({ + launchApp + }) => { + const active = await launchApp() + const appProcess = active.electronApp.process() + expect(active.ownsUserDataDir).toBe(true) + await waitForAppReady(active.page) + const value = `disposable-shutdown-${kind}` + await holdEncryption(active.electronApp, value, value) + const pending = active.page + .evaluate( + async ({ kind, value }) => { + if (kind === 'maintenance') { + await window.deepchat.invoke('databaseSecurity.enable', { password: value }) + } else { + await window.deepchat.invoke('sync.setCloudConfig', { + config: { + enabled: false, + endpoint: 'http://127.0.0.1:1', + bucket: 'fixture', + accessKeyId: 'fixture', + secretAccessKey: value + } + }) + } + }, + { kind, value } + ) + .then( + () => true, + () => false + ) + try { + await expect + .poll(() => + active.electronApp.evaluate( + () => + (globalThis as unknown as { __maintenanceFixture: { entered: boolean } }) + .__maintenanceFixture.entered + ) + ) + .toBe(true) + const windowClosed = active.page.waitForEvent('close') + await active.electronApp.evaluate(({ app }) => { + setImmediate(() => app.quit()) + }) + await windowClosed + await releaseEncryption(active.electronApp) + await expect.poll(() => appProcess.exitCode).toBe(0) + expect(await active.close()).toBe('graceful') + expect(await pending).toBe(false) + } finally { + await releaseEncryption(active.electronApp).catch(() => undefined) + } + + const reopened = await launchApp() + await waitForAppReady(reopened.page) + expect( + (await reopened.page.evaluate(() => window.deepchat.invoke('databaseSecurity.getStatus', {}))) + .status.enabled + ).toBe(false) + expect( + (await reopened.page.evaluate(() => window.deepchat.invoke('sync.getCloudConfig', {}))).config + .hasSecret + ).toBe(false) + expect(await reopened.close()).toBe('graceful') + }) +} diff --git a/test/e2e/specs/55-provider-model-store.smoke.spec.ts b/test/e2e/specs/55-provider-model-store.smoke.spec.ts new file mode 100644 index 0000000000..17304ab224 --- /dev/null +++ b/test/e2e/specs/55-provider-model-store.smoke.spec.ts @@ -0,0 +1,81 @@ +import { existsSync, readFileSync } from 'node:fs' +import { join } from 'node:path' +import { test, expect } from '../fixtures/electronApp' +import { waitForAppReady } from '../helpers/wait' +import type { ModelType } from '../../../src/shared/model' + +test.use({ privacyModeEnabled: true }) + +test('model facts and user overrides persist without rewriting legacy JSON @smoke', async ({ + launchApp +}) => { + const active = await launchApp() + expect(active.ownsUserDataDir).toBe(true) + await waitForAppReady(active.page) + const legacyFiles = [ + join(active.userDataDir, 'model-config.json'), + join(active.userDataDir, 'provider_models', 'models_openai.json') + ] + const readLegacyFiles = () => + legacyFiles.map((file) => (existsSync(file) ? readFileSync(file, 'utf8') : null)) + const legacyContents = readLegacyFiles() + const selection = { providerId: 'openai', modelId: 'store-fixture-model' } + await active.page.evaluate(async ({ providerId, modelId }) => { + await window.deepchat.invoke('models.saveCustom', { + providerId, + model: { id: modelId, name: 'Store fixture model', type: 'chat' as ModelType, enabled: true }, + config: { + maxTokens: 12000, + contextLength: 64000, + temperature: 0.4, + vision: false, + functionCall: true, + reasoning: false, + type: 'chat' as ModelType, + isUserDefined: true + } + }) + }, selection) + expect(await active.close()).toBe('graceful') + expect(readLegacyFiles()).toEqual(legacyContents) + + const reopened = await launchApp() + await waitForAppReady(reopened.page) + const persisted = await reopened.page.evaluate( + async (selection) => ({ + ...(await window.deepchat.invoke('models.getConfig', selection)), + ...(await window.deepchat.invoke('models.hasUserConfig', selection)), + ...(await window.deepchat.invoke('models.getProviderCatalog', { + providerId: selection.providerId + })) + }), + selection + ) + expect(persisted).toMatchObject({ + hasConfig: true, + config: { maxTokens: 12000, contextLength: 64000, temperature: 0.4, isUserDefined: true }, + catalog: { customModels: [expect.objectContaining({ id: selection.modelId })] } + }) + await reopened.page.evaluate(async (selection) => { + await window.deepchat.invoke('models.resetConfig', selection) + await window.deepchat.invoke('models.removeCustom', selection) + }, selection) + expect(await reopened.close()).toBe('graceful') + + const removed = await launchApp() + await waitForAppReady(removed.page) + const final = await removed.page.evaluate( + async (selection) => ({ + ...(await window.deepchat.invoke('models.hasUserConfig', selection)), + ...(await window.deepchat.invoke('models.getProviderCatalog', { + providerId: selection.providerId + })) + }), + selection + ) + expect(final.hasConfig).toBe(false) + expect(final.catalog.customModels).not.toContainEqual( + expect.objectContaining({ id: selection.modelId }) + ) + expect(readLegacyFiles()).toEqual(legacyContents) +}) diff --git a/test/e2e/specs/56-mcp-acp-settings-store.smoke.spec.ts b/test/e2e/specs/56-mcp-acp-settings-store.smoke.spec.ts new file mode 100644 index 0000000000..7c6e5c5e99 --- /dev/null +++ b/test/e2e/specs/56-mcp-acp-settings-store.smoke.spec.ts @@ -0,0 +1,99 @@ +import { readFileSync } from 'node:fs' +import { join } from 'node:path' +import { test, expect } from '../fixtures/electronApp' +import { waitForAppReady } from '../helpers/wait' + +test.use({ privacyModeEnabled: true }) + +test('MCP and ACP settings persist through their database owners across reopen @smoke', async ({ + launchApp +}) => { + const active = await launchApp() + expect(active.ownsUserDataDir).toBe(true) + await waitForAppReady(active.page) + const legacyFiles = ['mcp-settings.json', 'acp_agents.json'].map((file) => + join(active.userDataDir, file) + ) + const readLegacy = () => legacyFiles.map((file) => readFileSync(file, 'utf8')) + const legacy = readLegacy() + const serverName = 'settings-store-fixture' + const agentId = 'settings-store-agent' + await active.page.evaluate( + async ({ serverName, agentId }) => { + await window.deepchat.invoke('mcp.addServer', { + serverName, + config: { + command: 'unused-settings-fixture', + args: [], + env: {}, + descriptions: 'Settings store fixture', + icons: '', + disable: false, + enabled: false, + type: 'stdio' + } + }) + await window.deepchat.invoke('config.addManualAcpAgent', { + id: agentId, + name: 'Settings fixture', + command: 'unused-agent-fixture', + enabled: false + }) + await window.deepchat.invoke('config.updateManualAcpAgent', { + agentId, + updates: { name: 'Updated settings fixture', env: { FIXTURE_VALUE: 'persisted' } } + }) + await window.deepchat.invoke('config.setAcpSharedMcpSelections', { + selections: [serverName] + }) + await window.deepchat.invoke('config.setAcpEnabled', { enabled: true }) + }, + { serverName, agentId } + ) + expect(await active.close()).toBe('graceful') + expect(readLegacy()).toEqual(legacy) + + const reopened = await launchApp() + await waitForAppReady(reopened.page) + const persisted = await reopened.page.evaluate(async () => ({ + ...(await window.deepchat.invoke('mcp.getServers', {})), + ...(await window.deepchat.invoke('config.listManualAcpAgents', {})), + ...(await window.deepchat.invoke('config.getAcpSharedMcpSelections', {})), + enabled: (await window.deepchat.invoke('config.getAcpState', {})).enabled + })) + expect(persisted.enabled).toBe(true) + expect(persisted.servers[serverName]).toMatchObject({ enabled: false, type: 'stdio' }) + expect(persisted.selections).toEqual([serverName]) + expect(persisted.agents).toContainEqual( + expect.objectContaining({ + id: agentId, + name: 'Updated settings fixture', + env: { FIXTURE_VALUE: 'persisted' }, + enabled: false + }) + ) + await reopened.page.evaluate( + async ({ serverName, agentId }) => { + await window.deepchat.invoke('config.setAcpSharedMcpSelections', { selections: [] }) + await window.deepchat.invoke('config.removeManualAcpAgent', { agentId }) + await window.deepchat.invoke('mcp.removeServer', { serverName }) + await window.deepchat.invoke('config.setAcpEnabled', { enabled: false }) + }, + { serverName, agentId } + ) + expect(await reopened.close()).toBe('graceful') + + const removed = await launchApp() + await waitForAppReady(removed.page) + const final = await removed.page.evaluate(async () => ({ + ...(await window.deepchat.invoke('mcp.getServers', {})), + ...(await window.deepchat.invoke('config.listManualAcpAgents', {})), + ...(await window.deepchat.invoke('config.getAcpSharedMcpSelections', {})), + enabled: (await window.deepchat.invoke('config.getAcpState', {})).enabled + })) + expect(final.enabled).toBe(false) + expect(final.servers).not.toHaveProperty(serverName) + expect(final.agents).not.toContainEqual(expect.objectContaining({ id: agentId })) + expect(final.selections).toEqual([]) + expect(readLegacy()).toEqual(legacy) +}) diff --git a/test/e2e/specs/57-provider-bootstrap.smoke.spec.ts b/test/e2e/specs/57-provider-bootstrap.smoke.spec.ts new file mode 100644 index 0000000000..ff086a7824 --- /dev/null +++ b/test/e2e/specs/57-provider-bootstrap.smoke.spec.ts @@ -0,0 +1,163 @@ +import { createServer } from 'node:http' +import { existsSync, readFileSync } from 'node:fs' +import { join } from 'node:path' +import { test, expect } from '../fixtures/electronApp' +import { waitForAppReady } from '../helpers/wait' + +test.use({ privacyModeEnabled: true }) + +test('Provider catalog and request metadata are ready from bootstrap @smoke', async ({ app }) => { + const requests: Array<{ userAgent?: string; title?: string; referer?: string }> = [] + const server = createServer(async (request, response) => { + requests.push({ + userAgent: request.headers['user-agent'], + title: request.headers['x-title']?.toString(), + referer: request.headers['http-referer']?.toString() + }) + let body = '' + for await (const chunk of request) body += chunk + response.writeHead(200, { 'Content-Type': 'application/json' }) + if (request.url?.endsWith('/models')) { + response.end(JSON.stringify({ data: [{ id: 'fixture-model', object: 'model' }] })) + } else { + response.end( + JSON.stringify({ + id: 'bootstrap-fixture', + object: 'chat.completion', + created: 1, + model: JSON.parse(body).model, + choices: [ + { index: 0, message: { role: 'assistant', content: 'OK' }, finish_reason: 'stop' } + ] + }) + ) + } + }) + await new Promise((resolve) => server.listen(0, '127.0.0.1', resolve)) + const { port } = server.address() as { port: number } + try { + await waitForAppReady(app.page) + const { catalog } = await app.page.evaluate(() => + window.deepchat.invoke('models.getProviderCatalog', { providerId: 'openai' }) + ) + expect(catalog.dbProviderModels.length).toBeGreaterThan(0) + const result = await app.page.evaluate( + (baseUrl) => + window.deepchat.invoke('providers.validateDraft', { + provider: { + id: 'bootstrap-fixture', + name: 'Bootstrap fixture', + apiType: 'openai-compatible', + apiKey: 'disposable-bootstrap-key', + baseUrl, + enable: false, + custom: true + }, + loadModels: false + }), + `http://127.0.0.1:${port}/v1` + ) + expect(result.isOk).toBe(true) + const version = await app.electronApp.evaluate(({ app }) => app.getVersion()) + expect(requests.length).toBeGreaterThan(0) + for (const request of requests) { + expect(request).toEqual({ + userAgent: `DeepChat/${version}`, + title: 'DeepChat', + referer: 'https://deepchatai.cn' + }) + } + } finally { + server.closeAllConnections() + await new Promise((resolve) => server.close(() => resolve())) + } +}) + +test('shutdown cancels and drains catalog refresh without accepting a late response @smoke', async ({ + launchApp +}) => { + const active = await launchApp() + expect(active.ownsUserDataDir).toBe(true) + const appProcess = active.electronApp.process() + await waitForAppReady(active.page) + const files = ['providers.json', 'meta.json'].map((name) => + join(active.userDataDir, 'provider-db', name) + ) + const readCache = () => + files.map((file) => (existsSync(file) ? readFileSync(file, 'utf8') : null)) + const original = readCache() + await active.electronApp.evaluate(() => { + const originalFetch = globalThis.fetch + const fixture = { + entered: false, + signal: undefined as AbortSignal | undefined, + release: () => {} + } + globalThis.fetch = async (input, init) => { + if (input.toString().includes('/PublicProviderConf/')) { + fixture.entered = true + fixture.signal = init?.signal ?? undefined + return new Promise((resolve) => { + fixture.release = () => { + globalThis.fetch = originalFetch + resolve( + new Response( + JSON.stringify({ + providers: { late: { id: 'late', name: 'Late', models: [{ id: 'late-model' }] } } + }) + ) + ) + } + }) + } + return originalFetch(input, init) + } + Object.assign(globalThis, { __providerCatalogFixture: fixture }) + }) + const refresh = active.page + .evaluate(() => window.deepchat.invoke('config.refreshProviderDb', { force: true })) + .catch(() => null) + const release = () => + active.electronApp.evaluate(() => { + const fixture = globalThis as unknown as { __providerCatalogFixture: { release(): void } } + fixture.__providerCatalogFixture.release() + }) + try { + await expect + .poll(() => + active.electronApp.evaluate( + () => + (globalThis as unknown as { __providerCatalogFixture: { entered: boolean } }) + .__providerCatalogFixture.entered + ) + ) + .toBe(true) + await active.electronApp.evaluate(({ app }) => { + setImmediate(() => app.quit()) + }) + await expect + .poll(() => + active.electronApp.evaluate( + () => + (globalThis as unknown as { __providerCatalogFixture: { signal?: AbortSignal } }) + .__providerCatalogFixture.signal?.aborted + ) + ) + .toBe(true) + expect(appProcess.exitCode).toBeNull() + await release() + await expect.poll(() => appProcess.exitCode).toBe(0) + } finally { + await release().catch(() => undefined) + } + await refresh + expect(await active.close()).toBe('graceful') + expect(readCache()).toEqual(original) + const reopened = await launchApp() + await waitForAppReady(reopened.page) + const { catalog } = await reopened.page.evaluate(() => + window.deepchat.invoke('models.getProviderCatalog', { providerId: 'openai' }) + ) + expect(catalog.dbProviderModels.length).toBeGreaterThan(0) + expect(await reopened.close()).toBe('graceful') +}) diff --git a/test/e2e/specs/58-acp-registry-bootstrap.smoke.spec.ts b/test/e2e/specs/58-acp-registry-bootstrap.smoke.spec.ts new file mode 100644 index 0000000000..594b3887a9 --- /dev/null +++ b/test/e2e/specs/58-acp-registry-bootstrap.smoke.spec.ts @@ -0,0 +1,208 @@ +import { existsSync, readFileSync } from 'node:fs' +import { join } from 'node:path' +import { test, expect } from '../fixtures/electronApp' +import { waitForAppReady } from '../helpers/wait' + +test.use({ privacyModeEnabled: true }) + +test('ACP registry refresh persists catalog and sanitized icons without legacy writes @smoke', async ({ + launchApp +}) => { + const active = await launchApp() + expect(active.ownsUserDataDir).toBe(true) + await waitForAppReady(active.page) + const legacyFile = join(active.userDataDir, 'acp_agents.json') + const readLegacy = () => (existsSync(legacyFile) ? readFileSync(legacyFile, 'utf8') : null) + const legacy = readLegacy() + const agentId = 'rutis-registry-fixture' + const iconUrl = `https://cdn.agentclientprotocol.com/registry/v1/latest/${agentId}.svg` + await active.electronApp.evaluate( + ({ net }, { agentId, iconUrl }) => { + const originalFetch = globalThis.fetch + const originalIconFetch = net.fetch + globalThis.fetch = async (input, init) => { + if ( + input.toString() === + 'https://cdn.agentclientprotocol.com/registry/v1/latest/registry.json' + ) { + return new Response( + JSON.stringify({ + version: 'rutis-registry-fixture-v1', + agents: [ + { + id: agentId, + name: 'Registry fixture', + version: '1.0.0', + icon: iconUrl, + distribution: { npx: { package: '@deepchat/registry-fixture@1.0.0' } } + } + ] + }) + ) + } + return originalFetch(input, init) + } + net.fetch = async (input, init) => { + if (input.toString() === iconUrl) { + return new Response( + '' + ) + } + return originalIconFetch.call(net, input, init) + } + Object.assign(globalThis, { + __acpRegistryRestore: () => { + globalThis.fetch = originalFetch + net.fetch = originalIconFetch + } + }) + }, + { agentId, iconUrl } + ) + try { + const { agents } = await active.page.evaluate(() => + window.deepchat.invoke('config.refreshAcpRegistry', { force: true }) + ) + expect(agents).toEqual([ + expect.objectContaining({ id: agentId, version: '1.0.0', enabled: false }) + ]) + const { markup } = await active.page.evaluate( + ({ agentId, iconUrl }) => + window.deepchat.invoke('config.getAcpRegistryIconMarkup', { agentId, iconUrl }), + { agentId, iconUrl } + ) + expect(markup).toContain(' { + ;(globalThis as unknown as { __acpRegistryRestore(): void }).__acpRegistryRestore() + }) + } + expect(await active.close()).toBe('graceful') + const reopened = await launchApp() + await waitForAppReady(reopened.page) + const { agents } = await reopened.page.evaluate(() => + window.deepchat.invoke('config.listAcpRegistryAgents', {}) + ) + expect(agents).toEqual([ + expect.objectContaining({ id: agentId, version: '1.0.0', enabled: false }) + ]) + const { markup } = await reopened.page.evaluate( + ({ agentId, iconUrl }) => + window.deepchat.invoke('config.getAcpRegistryIconMarkup', { agentId, iconUrl }), + { agentId, iconUrl } + ) + expect(markup).toContain(' { + const active = await launchApp() + expect(active.ownsUserDataDir).toBe(true) + await waitForAppReady(active.page) + const appProcess = active.electronApp.process() + const files = ['registry.json', 'meta.json'].map((file) => + join(active.userDataDir, 'acp-registry', file) + ) + const readCache = () => + files.map((file) => (existsSync(file) ? readFileSync(file, 'utf8') : null)) + const original = readCache() + await active.electronApp.evaluate(() => { + const originalFetch = globalThis.fetch + const fixture = { + entered: false, + signal: undefined as AbortSignal | undefined, + release: () => {} + } + globalThis.fetch = async (input, init) => { + if ( + input.toString() === 'https://cdn.agentclientprotocol.com/registry/v1/latest/registry.json' + ) { + fixture.entered = true + fixture.signal = init?.signal ?? undefined + return new Promise((resolve) => { + fixture.release = () => { + globalThis.fetch = originalFetch + resolve( + new Response( + JSON.stringify({ + version: 'late-registry-fixture', + agents: [ + { + id: 'late-registry-fixture', + name: 'Late registry fixture', + version: '1.0.0', + distribution: { npx: { package: '@deepchat/late-registry-fixture@1.0.0' } } + } + ] + }) + ) + ) + } + }) + } + return originalFetch(input, init) + } + Object.assign(globalThis, { __acpRegistryFixture: fixture }) + }) + const refresh = active.page + .evaluate(() => window.deepchat.invoke('config.refreshAcpRegistry', { force: true })) + .catch(() => null) + const release = () => + active.electronApp.evaluate(() => { + ;( + globalThis as unknown as { __acpRegistryFixture: { release(): void } } + ).__acpRegistryFixture.release() + }) + try { + await expect + .poll(() => + active.electronApp.evaluate( + () => + (globalThis as unknown as { __acpRegistryFixture: { entered: boolean } }) + .__acpRegistryFixture.entered + ) + ) + .toBe(true) + await active.electronApp.evaluate(({ app }) => { + setImmediate(() => app.quit()) + }) + await expect + .poll(() => + active.electronApp.evaluate( + () => + (globalThis as unknown as { __acpRegistryFixture: { signal?: AbortSignal } }) + .__acpRegistryFixture.signal?.aborted + ) + ) + .toBe(true) + expect(appProcess.exitCode).toBeNull() + await release() + await expect.poll(() => appProcess.exitCode).toBe(0) + } finally { + await release().catch(() => undefined) + } + await refresh + expect(await active.close()).toBe('graceful') + expect(readCache()).toEqual(original) + const reopened = await launchApp() + await waitForAppReady(reopened.page) + const { agents } = await reopened.page.evaluate(() => + window.deepchat.invoke('config.listAgents', { agentType: 'acp' }) + ) + expect(agents.some((agent) => agent.id === 'late-registry-fixture')).toBe(false) + expect(await reopened.close()).toBe('graceful') +}) diff --git a/test/e2e/specs/59-acp-installation.smoke.spec.ts b/test/e2e/specs/59-acp-installation.smoke.spec.ts new file mode 100644 index 0000000000..92d287bee9 --- /dev/null +++ b/test/e2e/specs/59-acp-installation.smoke.spec.ts @@ -0,0 +1,292 @@ +import { createServer } from 'node:http' +import { existsSync, readFileSync, readdirSync } from 'node:fs' +import { dirname } from 'node:path' +import { zipSync } from 'fflate' +import { test, expect } from '../fixtures/electronApp' +import { waitForAppReady } from '../helpers/wait' + +test.use({ privacyModeEnabled: true }) + +test('ACP binary installation and repair persist through the owned cache across reopen @smoke', async ({ + launchApp +}) => { + let downloads = 0 + const archive = zipSync({ 'fixture-agent': Buffer.from('owned-installation-fixture') }) + const server = createServer((_request, response) => { + downloads++ + response.writeHead(200, { 'Content-Type': 'application/zip' }) + response.end(archive) + }) + await new Promise((resolve) => server.listen(0, '127.0.0.1', resolve)) + const archiveUrl = `http://127.0.0.1:${(server.address() as { port: number }).port}/fixture.zip` + const agentId = 'owned-installation-fixture' + const platform = process.platform === 'win32' ? 'windows' : process.platform + const platformKey = `${platform}-${process.arch === 'arm64' ? 'aarch64' : 'x86_64'}` + try { + const active = await launchApp() + expect(active.ownsUserDataDir).toBe(true) + await waitForAppReady(active.page) + await active.electronApp.evaluate( + (_electron, data) => { + const originalFetch = globalThis.fetch + globalThis.fetch = async (input, init) => { + if ( + input.toString() === + 'https://cdn.agentclientprotocol.com/registry/v1/latest/registry.json' + ) { + return new Response( + JSON.stringify({ + version: 'owned-installation-fixture', + agents: [ + { + id: data.agentId, + name: 'Owned installation fixture', + version: '1.0.0', + distribution: { + binary: { + [data.platformKey]: { archive: data.archiveUrl, cmd: './fixture-agent' } + } + } + } + ] + }) + ) + } + return originalFetch(input, init) + } + }, + { agentId, platformKey, archiveUrl } + ) + await active.page.evaluate(() => + window.deepchat.invoke('config.refreshAcpRegistry', { force: true }) + ) + const { installState } = await active.page.evaluate( + (agentId) => window.deepchat.invoke('config.ensureAcpAgentInstalled', { agentId }), + agentId + ) + expect(installState).toMatchObject({ + status: 'installed', + version: '1.0.0', + distributionType: 'binary' + }) + const binary = `${installState.installDir}/fixture-agent` + expect(readFileSync(binary, 'utf8')).toBe('owned-installation-fixture') + const { installState: repaired } = await active.page.evaluate( + (agentId) => window.deepchat.invoke('config.repairAcpAgent', { agentId }), + agentId + ) + expect(repaired.status).toBe('installed') + expect(readFileSync(binary, 'utf8')).toBe('owned-installation-fixture') + expect(downloads).toBe(2) + expect(await active.close()).toBe('graceful') + + const reopened = await launchApp() + await waitForAppReady(reopened.page) + const { agents } = await reopened.page.evaluate(() => + window.deepchat.invoke('config.listAcpRegistryAgents', {}) + ) + expect(agents.find((agent) => agent.id === agentId)?.installState?.status).toBe('installed') + const { installState: existing } = await reopened.page.evaluate( + (agentId) => window.deepchat.invoke('config.ensureAcpAgentInstalled', { agentId }), + agentId + ) + expect(existing.installDir).toBe(installState.installDir) + expect(existing.status).toBe('installed') + expect(downloads).toBe(2) + expect(await reopened.close()).toBe('graceful') + } finally { + server.closeAllConnections() + await new Promise((resolve) => server.close(() => resolve())) + } +}) + +for (const action of ['shutdown', 'maintenance'] as const) { + test(`${action} drains a held ACP repair without replacing the acknowledged binary @smoke`, async ({ + launchApp + }) => { + const active = await launchApp() + expect(active.ownsUserDataDir).toBe(true) + await waitForAppReady(active.page) + const appProcess = active.electronApp.process() + const agentId = 'held-installation-fixture' + const platform = process.platform === 'win32' ? 'windows' : process.platform + const platformKey = `${platform}-${process.arch === 'arm64' ? 'aarch64' : 'x86_64'}` + const archive = Array.from(zipSync({ 'fixture-agent': Buffer.from('acknowledged-binary') })) + const badArchive = Array.from(zipSync({ 'wrong-agent': Buffer.from('invalid-replacement') })) + await active.electronApp.evaluate( + (_electron, data) => { + const originalFetch = globalThis.fetch + const fixture = { + mode: 'install', + entered: false, + signal: undefined as AbortSignal | undefined, + release: () => {} + } + globalThis.fetch = async (input, init) => { + if ( + input.toString() === + 'https://cdn.agentclientprotocol.com/registry/v1/latest/registry.json' + ) { + return new Response( + JSON.stringify({ + version: 'held-installation-fixture', + agents: [ + { + id: data.agentId, + name: 'Held installation fixture', + version: '1.0.0', + distribution: { + binary: { + [data.platformKey]: { + archive: 'https://installer.invalid/fixture.zip', + cmd: './fixture-agent' + } + } + } + } + ] + }) + ) + } + if (input.toString() === 'https://installer.invalid/fixture.zip') { + if (fixture.mode === 'hold') { + fixture.signal = init?.signal ?? undefined + const response = new Response() + Object.defineProperty(response, 'arrayBuffer', { + value: () => { + fixture.entered = true + return new Promise((resolve) => { + fixture.release = () => resolve(new Uint8Array(data.archive).buffer) + }) + } + }) + return response + } + return new Response( + new Uint8Array(fixture.mode === 'bad' ? data.badArchive : data.archive) + ) + } + return originalFetch(input, init) + } + Object.assign(globalThis, { __acpInstallationFixture: fixture }) + }, + { agentId, platformKey, archive, badArchive } + ) + await active.page.evaluate(() => + window.deepchat.invoke('config.refreshAcpRegistry', { force: true }) + ) + const { installState: original } = await active.page.evaluate( + (agentId) => window.deepchat.invoke('config.ensureAcpAgentInstalled', { agentId }), + agentId + ) + expect(original.status).toBe('installed') + let acknowledged = original + const binary = `${original.installDir}/fixture-agent` + await active.electronApp.evaluate(() => { + ;( + globalThis as unknown as { __acpInstallationFixture: { mode: string } } + ).__acpInstallationFixture.mode = 'hold' + }) + const repair = active.page + .evaluate((agentId) => window.deepchat.invoke('config.repairAcpAgent', { agentId }), agentId) + .then( + () => 'resolved', + () => 'rejected' + ) + const release = () => + active.electronApp.evaluate(() => { + ;( + globalThis as unknown as { __acpInstallationFixture: { release(): void } } + ).__acpInstallationFixture.release() + }) + let maintenance: Promise | undefined + try { + await expect + .poll(() => + active.electronApp.evaluate( + () => + (globalThis as unknown as { __acpInstallationFixture: { entered: boolean } }) + .__acpInstallationFixture.entered + ) + ) + .toBe(true) + expect(readFileSync(binary, 'utf8')).toBe('acknowledged-binary') + if (action === 'shutdown') { + await active.electronApp.evaluate(({ app }) => { + setImmediate(() => app.quit()) + }) + } else { + maintenance = active.page.evaluate(() => + window.deepchat.invoke('databaseSecurity.enable', { + password: 'owned-installation-maintenance-password' + }) + ) + } + await expect + .poll(() => + active.electronApp.evaluate( + () => + (globalThis as unknown as { __acpInstallationFixture: { signal?: AbortSignal } }) + .__acpInstallationFixture.signal?.aborted + ) + ) + .toBe(true) + expect(appProcess.exitCode).toBeNull() + expect(readFileSync(binary, 'utf8')).toBe('acknowledged-binary') + await release() + if (action === 'shutdown') await expect.poll(() => appProcess.exitCode).toBe(0) + else await expect(maintenance).resolves.toMatchObject({ status: { enabled: true } }) + } finally { + await release().catch(() => undefined) + } + expect(await repair).toBe('rejected') + expect(readFileSync(binary, 'utf8')).toBe('acknowledged-binary') + expect(readdirSync(dirname(original.installDir!))).toEqual(['1.0.0']) + if (action === 'maintenance') { + await active.electronApp.evaluate(() => { + ;( + globalThis as unknown as { __acpInstallationFixture: { mode: string } } + ).__acpInstallationFixture.mode = 'bad' + }) + const { installState: failed } = await active.page.evaluate( + (agentId) => window.deepchat.invoke('config.repairAcpAgent', { agentId }), + agentId + ) + expect(failed.status).toBe('error') + expect(readFileSync(binary, 'utf8')).toBe('acknowledged-binary') + await active.electronApp.evaluate(() => { + ;( + globalThis as unknown as { __acpInstallationFixture: { mode: string } } + ).__acpInstallationFixture.mode = 'install' + }) + const { installState: recovered } = await active.page.evaluate( + (agentId) => window.deepchat.invoke('config.repairAcpAgent', { agentId }), + agentId + ) + expect(recovered.status).toBe('installed') + acknowledged = recovered + } + expect(await active.close()).toBe('graceful') + const reopened = await launchApp() + await waitForAppReady(reopened.page) + const { agents } = await reopened.page.evaluate(() => + window.deepchat.invoke('config.listAcpRegistryAgents', {}) + ) + expect(agents.find((agent) => agent.id === agentId)?.installState).toEqual(acknowledged) + expect(readFileSync(binary, 'utf8')).toBe('acknowledged-binary') + if (action === 'maintenance') { + await reopened.page.evaluate( + (agentId) => window.deepchat.invoke('config.uninstallAcpRegistryAgent', { agentId }), + agentId + ) + expect(existsSync(original.installDir!)).toBe(false) + const { agents: uninstalled } = await reopened.page.evaluate(() => + window.deepchat.invoke('config.listAcpRegistryAgents', {}) + ) + expect(uninstalled.find((agent) => agent.id === agentId)?.installState?.status).toBe( + 'not_installed' + ) + } + expect(await reopened.close()).toBe('graceful') + }) +} diff --git a/test/e2e/specs/60-background-execution.smoke.spec.ts b/test/e2e/specs/60-background-execution.smoke.spec.ts new file mode 100644 index 0000000000..1cd877f140 --- /dev/null +++ b/test/e2e/specs/60-background-execution.smoke.spec.ts @@ -0,0 +1,284 @@ +import { createServer } from 'node:http' +import { existsSync, readFileSync, writeFileSync } from 'node:fs' +import { join } from 'node:path' +import { test, expect } from '../fixtures/electronApp' +import { waitForAppReady } from '../helpers/wait' + +test.use({ privacyModeEnabled: true }) + +for (const action of ['complete', 'shutdown', 'held-start'] as const) { + test(`background exec retains process feedback and ${action} ownership @smoke`, async ({ + launchApp + }) => { + let command = '' + let firstResult = '' + let processResult = '' + let releasePoll!: () => void + const pollReady = new Promise((resolve) => { + releasePoll = resolve + }) + const finalText = `BACKGROUND_${action.toUpperCase()}_VERIFIED` + const server = createServer(async (request, response) => { + if (request.url === '/v1/models') { + response + .writeHead(200, { 'Content-Type': 'application/json' }) + .end(JSON.stringify({ data: [{ id: 'exec-fixture' }] })) + return + } + if (request.url !== '/v1/chat/completions') { + response.writeHead(404).end() + return + } + let source = '' + for await (const chunk of request) source += chunk + const body = JSON.parse(source) + if (!body.stream) { + response.writeHead(200, { 'Content-Type': 'application/json' }).end( + JSON.stringify({ + id: 'title', + object: 'chat.completion', + created: 1, + model: 'exec-fixture', + choices: [ + { + index: 0, + message: { role: 'assistant', content: 'Execution verification' }, + finish_reason: 'stop' + } + ] + }) + ) + return + } + const results = body.messages.filter((message: { role: string }) => message.role === 'tool') + const toolCall = (name: string, args: unknown) => ({ + role: 'assistant', + tool_calls: [ + { + index: 0, + id: `owned-${name}`, + type: 'function', + function: { name, arguments: JSON.stringify(args) } + } + ] + }) + let delta: unknown + let finishReason = 'tool_calls' + if (!results.length) { + delta = toolCall('exec', { + command, + description: 'Verify owned background execution', + background: true + }) + } else if (action === 'complete' && results.length === 1) { + firstResult = JSON.stringify(results) + await pollReady + const sessionId = /bg_[A-Za-z0-9_-]{12}/.exec(firstResult)?.[0] + delta = toolCall('process', { action: 'poll', sessionId }) + } else { + if (!firstResult) firstResult = JSON.stringify(results) + processResult = JSON.stringify(results) + delta = { content: finalText } + finishReason = 'stop' + } + if (response.destroyed) return + response.writeHead(200, { 'Content-Type': 'text/event-stream' }) + response.write( + `data: ${JSON.stringify({ + id: 'exec-fixture', + object: 'chat.completion.chunk', + created: 1, + model: 'exec-fixture', + choices: [{ index: 0, delta, finish_reason: finishReason }] + })}\n\n` + ) + response.end('data: [DONE]\n\n') + }) + await new Promise((resolve) => server.listen(0, '127.0.0.1', resolve)) + const { port } = server.address() as { port: number } + try { + const active = await launchApp() + expect(active.ownsUserDataDir).toBe(true) + await waitForAppReady(active.page) + if (action === 'held-start') { + await active.electronApp.evaluate(({ utilityProcess }) => { + const originalFork = utilityProcess.fork + const fixture = { entered: false, pid: undefined as number | undefined } + utilityProcess.fork = (entry, args, options) => { + const host = originalFork.call(utilityProcess, entry, args, options) + if (entry.endsWith('backgroundExecUtilityHost.js')) { + const once = host.once.bind(host) as ( + event: string, + listener: (...values: unknown[]) => void + ) => typeof host + host.once = ((event: string, listener: (...values: unknown[]) => void) => { + if (event === 'spawn') + return once(event, () => { + fixture.entered = true + fixture.pid = host.pid + }) + return once(event, listener) + }) as typeof host.once + } + return host + } + Object.assign(globalThis, { __backgroundSpawnFixture: fixture }) + }) + } + const startedFile = join(active.userDataDir, 'owned-command.pid') + const releaseFile = join(active.userDataDir, 'owned-command.release') + const doneFile = join(active.userDataDir, 'owned-command.done') + const script = `const fs = require('node:fs'); fs.writeFileSync(${JSON.stringify(startedFile)}, String(process.pid)); const timer = setInterval(() => { if (fs.existsSync(${JSON.stringify(releaseFile)})) { clearInterval(timer); process.stdout.write('BACKGROUND_EXEC_DONE'); fs.writeFileSync(${JSON.stringify(doneFile)}, 'done') } }, 20)` + const executable = + process.platform === 'win32' + ? `"${process.execPath}"` + : `'${process.execPath.replaceAll("'", "'\\''")}'` + command = `${executable} -e "eval(Buffer.from('${Buffer.from(script).toString('base64')}', 'base64').toString())"` + const sessionId = await active.page.evaluate( + async ({ baseUrl, projectDir }) => { + const providerId = `custom-${crypto.randomUUID()}` + await window.deepchat.invoke('providers.add', { + provider: { + id: providerId, + name: 'Execution fixture', + apiType: 'openai-completions', + baseUrl, + apiKey: 'fixture-key', + enable: true, + custom: true + } + }) + await window.deepchat.invoke('models.addCustom', { + providerId, + model: { + id: 'exec-fixture', + name: 'Execution fixture', + enabled: true, + vision: false, + functionCall: true, + reasoning: false, + contextLength: 32000, + maxTokens: 8000 + } + }) + await window.deepchat.invoke('models.setStatus', { + providerId, + modelId: 'exec-fixture', + enabled: true + }) + const { config } = await window.deepchat.invoke('config.resolveDeepChatAgentConfig', { + agentId: 'deepchat' + }) + await window.deepchat.invoke('config.updateDeepChatAgent', { + agentId: 'deepchat', + updates: { + config: { + ...config, + permissionMode: 'full_access', + disabledAgentTools: [], + enabledSkillNames: [], + memoryEnabled: false + } + } + }) + const { session } = await window.deepchat.invoke('sessions.create', { + agentId: 'deepchat', + message: 'Verify the owned background command and its process feedback.', + providerId, + modelId: 'exec-fixture', + projectDir, + permissionMode: 'full_access', + toolModeOverride: 'agent' + }) + return session.id + }, + { baseUrl: `http://127.0.0.1:${port}/v1`, projectDir: active.userDataDir } + ) + if (action === 'held-start') { + await expect + .poll(() => + active.electronApp.evaluate( + () => + (globalThis as unknown as { __backgroundSpawnFixture: { entered: boolean } }) + .__backgroundSpawnFixture.entered + ) + ) + .toBe(true) + const helperPid = await active.electronApp.evaluate( + () => + (globalThis as unknown as { __backgroundSpawnFixture: { pid?: number } }) + .__backgroundSpawnFixture.pid + ) + expect(helperPid).toBeGreaterThan(0) + expect(existsSync(startedFile)).toBe(false) + expect(await active.close()).toBe('graceful') + await expect + .poll(() => { + try { + process.kill(helperPid!, 0) + return true + } catch (error) { + if ((error as NodeJS.ErrnoException).code === 'ESRCH') return false + throw error + } + }) + .toBe(false) + expect(existsSync(startedFile)).toBe(false) + const reopened = await launchApp() + await waitForAppReady(reopened.page) + const { messages } = await reopened.page.evaluate( + (sessionId) => + window.deepchat.invoke('sessions.listMessagesPage', { sessionId, limit: 100 }), + sessionId + ) + expect(JSON.stringify(messages)).toContain('Verify the owned background command') + expect(JSON.stringify(messages)).not.toContain(finalText) + expect(await reopened.close()).toBe('graceful') + return + } + await expect.poll(() => existsSync(startedFile)).toBe(true) + const pid = Number(readFileSync(startedFile, 'utf8')) + const alive = () => { + try { + process.kill(pid, 0) + return true + } catch (error) { + if ((error as NodeJS.ErrnoException).code === 'ESRCH') return false + throw error + } + } + expect(alive()).toBe(true) + await expect.poll(() => firstResult).toMatch(/bg_[A-Za-z0-9_-]{12}/) + if (action === 'complete') { + writeFileSync(releaseFile, 'release') + await expect.poll(() => existsSync(doneFile)).toBe(true) + await expect.poll(alive).toBe(false) + releasePoll() + await expect.poll(() => processResult).toContain('BACKGROUND_EXEC_DONE') + } + const messages = () => + active.page.evaluate( + (sessionId) => + window.deepchat.invoke('sessions.listMessagesPage', { sessionId, limit: 100 }), + sessionId + ) + await expect.poll(async () => JSON.stringify(await messages())).toContain(finalText) + expect(await active.close()).toBe('graceful') + await expect.poll(alive).toBe(false) + if (action === 'shutdown') expect(existsSync(doneFile)).toBe(false) + const reopened = await launchApp() + await waitForAppReady(reopened.page) + const persisted = await reopened.page.evaluate( + (sessionId) => + window.deepchat.invoke('sessions.listMessagesPage', { sessionId, limit: 100 }), + sessionId + ) + expect(JSON.stringify(persisted)).toContain(finalText) + expect(await reopened.close()).toBe('graceful') + } finally { + releasePoll() + server.closeAllConnections() + await new Promise((resolve) => server.close(() => resolve())) + } + }) +} diff --git a/test/e2e/specs/61-code-mode-runtime.smoke.spec.ts b/test/e2e/specs/61-code-mode-runtime.smoke.spec.ts new file mode 100644 index 0000000000..10cf644142 --- /dev/null +++ b/test/e2e/specs/61-code-mode-runtime.smoke.spec.ts @@ -0,0 +1,244 @@ +import { createServer } from 'node:http' +import { test, expect } from '../fixtures/electronApp' +import { waitForAppReady } from '../helpers/wait' + +test.use({ privacyModeEnabled: true }) + +for (const action of ['complete', 'held-ready'] as const) { + test(`Code Mode preserves nested execution and ${action} ownership @smoke`, async ({ + launchApp + }) => { + const executable = + process.platform === 'win32' + ? `"${process.execPath}"` + : `'${process.execPath.replaceAll("'", "'\\''")}'` + const command = `${executable} -e "process.stdout.write('NESTED_CODE_DONE')"` + const firstCode = `const result = await tools.exec({ command: ${JSON.stringify(command)}, description: 'Verify nested command execution' }); const earlierLocal = 'cell-local'; console.log('CODE_MODE_ONE'); return result` + const secondCode = `return { earlierLocalType: typeof earlierLocal, processType: typeof process, requireType: typeof require }` + let toolResults: string[] = [] + const server = createServer(async (request, response) => { + if (request.url === '/v1/models') { + response + .writeHead(200, { 'Content-Type': 'application/json' }) + .end(JSON.stringify({ data: [{ id: 'code-fixture' }] })) + return + } + if (request.url !== '/v1/chat/completions') { + response.writeHead(404).end() + return + } + let source = '' + for await (const chunk of request) source += chunk + const body = JSON.parse(source) + if (!body.stream) { + response.writeHead(200, { 'Content-Type': 'application/json' }).end( + JSON.stringify({ + id: 'title', + object: 'chat.completion', + created: 1, + model: 'code-fixture', + choices: [ + { + index: 0, + message: { role: 'assistant', content: 'Code Mode verification' }, + finish_reason: 'stop' + } + ] + }) + ) + return + } + const results = body.messages.filter((message: { role: string }) => message.role === 'tool') + toolResults = results.map((message: { content: unknown }) => JSON.stringify(message.content)) + const complete = results.length >= 2 + const delta = complete + ? { content: 'CODE_MODE_VERIFIED' } + : { + role: 'assistant', + tool_calls: [ + { + index: 0, + id: `owned-code-${results.length}`, + type: 'function', + function: { + name: 'run_code', + arguments: JSON.stringify({ + code: results.length ? secondCode : firstCode, + description: 'Verify isolated code execution' + }) + } + } + ] + } + response.writeHead(200, { 'Content-Type': 'text/event-stream' }) + response.write( + `data: ${JSON.stringify({ + id: 'code-fixture', + object: 'chat.completion.chunk', + created: 1, + model: 'code-fixture', + choices: [{ index: 0, delta, finish_reason: complete ? 'stop' : 'tool_calls' }] + })}\n\n` + ) + response.end('data: [DONE]\n\n') + }) + await new Promise((resolve) => server.listen(0, '127.0.0.1', resolve)) + const { port } = server.address() as { port: number } + try { + const active = await launchApp() + expect(active.ownsUserDataDir).toBe(true) + await waitForAppReady(active.page) + if (action === 'held-ready') { + await active.electronApp.evaluate(({ utilityProcess }) => { + const fork = utilityProcess.fork + const fixture = { entered: false, pid: undefined as number | undefined } + utilityProcess.fork = (entry, args, options) => { + const host = fork.call(utilityProcess, entry, args, options) + if (entry.endsWith('codeModeUtilityHost.js')) { + const on = host.on.bind(host) as ( + event: string, + listener: (...values: unknown[]) => void + ) => typeof host + host.on = ((event: string, listener: (...values: unknown[]) => void) => { + if (event === 'message') + return on(event, (message) => { + if ((message as { type?: string })?.type === 'READY') { + fixture.entered = true + fixture.pid = host.pid + } else listener(message) + }) + return on(event, listener) + }) as typeof host.on + } + return host + } + Object.assign(globalThis, { __codeModeReadyFixture: fixture }) + }) + } + const sessionId = await active.page.evaluate( + async ({ baseUrl, projectDir }) => { + const providerId = `custom-${crypto.randomUUID()}` + await window.deepchat.invoke('providers.add', { + provider: { + id: providerId, + name: 'Code fixture', + apiType: 'openai-completions', + baseUrl, + apiKey: 'fixture-key', + enable: true, + custom: true + } + }) + await window.deepchat.invoke('models.addCustom', { + providerId, + model: { + id: 'code-fixture', + name: 'Code fixture', + enabled: true, + vision: false, + functionCall: true, + reasoning: false, + contextLength: 32000, + maxTokens: 8000 + } + }) + await window.deepchat.invoke('models.setStatus', { + providerId, + modelId: 'code-fixture', + enabled: true + }) + const { config } = await window.deepchat.invoke('config.resolveDeepChatAgentConfig', { + agentId: 'deepchat' + }) + await window.deepchat.invoke('config.updateDeepChatAgent', { + agentId: 'deepchat', + updates: { + config: { + ...config, + permissionMode: 'full_access', + disabledAgentTools: [], + enabledSkillNames: [], + memoryEnabled: false + } + } + }) + const { session } = await window.deepchat.invoke('sessions.create', { + agentId: 'deepchat', + message: 'Verify Code Mode nested execution and isolated session state.', + providerId, + modelId: 'code-fixture', + projectDir, + permissionMode: 'full_access', + toolModeOverride: 'code' + }) + return session.id + }, + { baseUrl: `http://127.0.0.1:${port}/v1`, projectDir: active.userDataDir } + ) + if (action === 'held-ready') { + await expect + .poll(() => + active.electronApp.evaluate( + () => + (globalThis as unknown as { __codeModeReadyFixture: { entered: boolean } }) + .__codeModeReadyFixture.entered + ) + ) + .toBe(true) + const pid = await active.electronApp.evaluate( + () => + (globalThis as unknown as { __codeModeReadyFixture: { pid?: number } }) + .__codeModeReadyFixture.pid + ) + expect(pid).toBeGreaterThan(0) + expect(await active.close()).toBe('graceful') + await expect + .poll(() => { + try { + process.kill(pid!, 0) + return true + } catch (error) { + if ((error as NodeJS.ErrnoException).code === 'ESRCH') return false + throw error + } + }) + .toBe(false) + expect(toolResults).toHaveLength(0) + } else { + await expect.poll(() => toolResults.length).toBe(2) + expect(toolResults[0]).toContain('NESTED_CODE_DONE') + expect(JSON.parse(JSON.parse(toolResults[1]))).toEqual({ + earlierLocalType: 'undefined', + processType: 'undefined', + requireType: 'undefined' + }) + await expect + .poll(async () => + JSON.stringify( + await active.page.evaluate( + (sessionId) => + window.deepchat.invoke('sessions.listMessagesPage', { sessionId, limit: 100 }), + sessionId + ) + ) + ) + .toContain('CODE_MODE_VERIFIED') + expect(await active.close()).toBe('graceful') + } + const reopened = await launchApp() + await waitForAppReady(reopened.page) + const { messages } = await reopened.page.evaluate( + (sessionId) => + window.deepchat.invoke('sessions.listMessagesPage', { sessionId, limit: 100 }), + sessionId + ) + expect(JSON.stringify(messages)).toContain( + action === 'complete' ? 'CODE_MODE_VERIFIED' : 'Verify Code Mode nested execution' + ) + expect(await reopened.close()).toBe('graceful') + } finally { + server.closeAllConnections() + await new Promise((resolve) => server.close(() => resolve())) + } + }) +} diff --git a/test/e2e/specs/62-agent-tool-host.smoke.spec.ts b/test/e2e/specs/62-agent-tool-host.smoke.spec.ts new file mode 100644 index 0000000000..6f926105a3 --- /dev/null +++ b/test/e2e/specs/62-agent-tool-host.smoke.spec.ts @@ -0,0 +1,182 @@ +import { createServer } from 'node:http' +import { mkdirSync, readFileSync, writeFileSync } from 'node:fs' +import { join } from 'node:path' +import { test, expect } from '../fixtures/electronApp' +import { waitForAppReady } from '../helpers/wait' + +test.use({ privacyModeEnabled: true }) + +test('Agent tools preserve image metadata, workspace access and reopen @smoke', async ({ + launchApp +}) => { + const image = readFileSync(new URL('../../../resources/icon.png', import.meta.url)) + const resolution = `${image.readUInt32BE(16)}x${image.readUInt32BE(20)}` + let imagePath = '' + let toolResults: string[] = [] + const server = createServer(async (request, response) => { + if (request.url === '/v1/models') { + response + .writeHead(200, { 'Content-Type': 'application/json' }) + .end(JSON.stringify({ data: [{ id: 'host-fixture' }] })) + return + } + if (request.url !== '/v1/chat/completions') { + response.writeHead(404).end() + return + } + let source = '' + for await (const chunk of request) source += chunk + const body = JSON.parse(source) + if (!body.stream) { + response.writeHead(200, { 'Content-Type': 'application/json' }).end( + JSON.stringify({ + id: 'title', + object: 'chat.completion', + created: 1, + model: 'host-fixture', + choices: [ + { + index: 0, + message: { role: 'assistant', content: 'Agent host verification' }, + finish_reason: 'stop' + } + ] + }) + ) + return + } + const results = body.messages.filter((message: { role: string }) => message.role === 'tool') + toolResults = results.map((message: { content: unknown }) => JSON.stringify(message.content)) + const complete = results.length >= 2 + const delta = complete + ? { content: 'AGENT_HOST_VERIFIED' } + : { + role: 'assistant', + tool_calls: [ + { + index: 0, + id: `host-read-${results.length}`, + type: 'function', + function: { + name: 'read', + arguments: JSON.stringify({ path: results.length ? 'workspace.txt' : imagePath }) + } + } + ] + } + response.writeHead(200, { 'Content-Type': 'text/event-stream' }) + response.write( + `data: ${JSON.stringify({ + id: 'host-fixture', + object: 'chat.completion.chunk', + created: 1, + model: 'host-fixture', + choices: [{ index: 0, delta, finish_reason: complete ? 'stop' : 'tool_calls' }] + })}\n\n` + ) + response.end('data: [DONE]\n\n') + }) + await new Promise((resolve) => server.listen(0, '127.0.0.1', resolve)) + const { port } = server.address() as { port: number } + try { + const active = await launchApp() + expect(active.ownsUserDataDir).toBe(true) + await waitForAppReady(active.page) + const projectDir = join(active.userDataDir, 'workspace') + const temporary = join(active.userDataDir, 'temp') + mkdirSync(projectDir, { recursive: true }) + mkdirSync(temporary, { recursive: true }) + imagePath = join(temporary, 'host-image.png') + writeFileSync(imagePath, image) + writeFileSync(join(projectDir, 'workspace.txt'), 'WORKSPACE_HOST_READ_VERIFIED') + const sessionId = await active.page.evaluate( + async ({ baseUrl, projectDir }) => { + const providerId = `custom-${crypto.randomUUID()}` + await window.deepchat.invoke('providers.add', { + provider: { + id: providerId, + name: 'Agent host fixture', + apiType: 'openai-completions', + baseUrl, + apiKey: 'fixture-key', + enable: true, + custom: true + } + }) + await window.deepchat.invoke('models.addCustom', { + providerId, + model: { + id: 'host-fixture', + name: 'Agent host fixture', + enabled: true, + vision: false, + functionCall: true, + reasoning: false, + contextLength: 32000, + maxTokens: 8000 + } + }) + await window.deepchat.invoke('models.setStatus', { + providerId, + modelId: 'host-fixture', + enabled: true + }) + const { config } = await window.deepchat.invoke('config.resolveDeepChatAgentConfig', { + agentId: 'deepchat' + }) + await window.deepchat.invoke('config.updateDeepChatAgent', { + agentId: 'deepchat', + updates: { + config: { + ...config, + permissionMode: 'full_access', + disabledAgentTools: [], + enabledSkillNames: [], + memoryEnabled: false + } + } + }) + const { session } = await window.deepchat.invoke('sessions.create', { + agentId: 'deepchat', + message: 'Verify image metadata and workspace file access.', + providerId, + modelId: 'host-fixture', + projectDir, + permissionMode: 'full_access', + toolModeOverride: 'agent' + }) + return session.id + }, + { baseUrl: `http://127.0.0.1:${port}/v1`, projectDir } + ) + await expect.poll(() => toolResults.length).toBe(2) + expect(toolResults[0]).toContain('[Image Metadata]') + expect(toolResults[0]).toContain(`resolution: ${resolution}`) + expect(toolResults[0]).toContain('neither the current session model nor the agent vision model') + expect(toolResults[1]).toContain('WORKSPACE_HOST_READ_VERIFIED') + await expect + .poll(async () => + JSON.stringify( + await active.page.evaluate( + (sessionId) => + window.deepchat.invoke('sessions.listMessagesPage', { sessionId, limit: 100 }), + sessionId + ) + ) + ) + .toContain('AGENT_HOST_VERIFIED') + expect(await active.close()).toBe('graceful') + const reopened = await launchApp() + await waitForAppReady(reopened.page) + const { messages } = await reopened.page.evaluate( + (sessionId) => window.deepchat.invoke('sessions.listMessagesPage', { sessionId, limit: 100 }), + sessionId + ) + expect(JSON.stringify(messages)).toContain('AGENT_HOST_VERIFIED') + expect(JSON.stringify(messages)).toContain('WORKSPACE_HOST_READ_VERIFIED') + expect(await reopened.close()).toBe('graceful') + } finally { + server.closeAllConnections() + await new Promise((resolve) => server.close(() => resolve())) + } +}) diff --git a/test/e2e/specs/63-plugin-tool-policy.smoke.spec.ts b/test/e2e/specs/63-plugin-tool-policy.smoke.spec.ts new file mode 100644 index 0000000000..a57ef6be87 --- /dev/null +++ b/test/e2e/specs/63-plugin-tool-policy.smoke.spec.ts @@ -0,0 +1,141 @@ +import { createServer } from 'node:http' +import { existsSync, readFileSync, writeFileSync } from 'node:fs' +import { join } from 'node:path' +import { test, expect } from '../fixtures/electronApp' +import { openSettings } from '../helpers/settings' +import { waitForAppReady } from '../helpers/wait' + +test.use({ privacyModeEnabled: true }) + +test('plugin policy preserves persisted decisions, ambiguity and disabled policies @smoke', async ({ + launchApp +}) => { + const calls: string[] = [] + const server = createServer(async (request, response) => { + if (request.method !== 'POST') { + response.writeHead(405).end() + return + } + let body = '' + for await (const chunk of request) body += chunk + const message = JSON.parse(body) + if (message.id === undefined) { + response.writeHead(202).end() + return + } + let result: unknown = {} + if (message.method === 'initialize') { + result = { + protocolVersion: message.params.protocolVersion, + capabilities: { tools: {} }, + serverInfo: { name: 'policy-fixture', version: '1.0.0' } + } + } else if (message.method === 'tools/list') { + result = { + tools: ['allowed', 'ask', 'blocked'].map((name) => ({ + name, + description: `Policy fixture ${name}`, + inputSchema: { type: 'object', properties: {} } + })) + } + } else if (message.method === 'tools/call') { + calls.push(message.params.name) + result = { content: [{ type: 'text', text: `POLICY_EXECUTED_${message.params.name}` }] } + } + response + .writeHead(200, { 'Content-Type': 'application/json' }) + .end(JSON.stringify({ jsonrpc: '2.0', id: message.id, result })) + }) + await new Promise((resolve) => server.listen(0, '127.0.0.1', resolve)) + const { port } = server.address() as { port: number } + const serverName = 'policy-owner-fixture' + const policy = { + pluginId: 'com.deepchat.policy-e2e', + serverId: serverName, + tools: { allowed: 'allow', ask: 'ask', blocked: 'deny' }, + enabled: true + } + try { + const bootstrap = await launchApp() + expect(bootstrap.ownsUserDataDir).toBe(true) + await waitForAppReady(bootstrap.page) + const settings = await openSettings(bootstrap) + await settings.evaluate( + async ({ serverName, baseUrl }) => { + await window.deepchat.invoke('mcp.setEnabled', { enabled: true }) + await window.deepchat.invoke('mcp.addServer', { + serverName, + config: { + type: 'http', + baseUrl, + enabled: true, + command: '', + args: [], + env: {}, + descriptions: 'Disposable policy fixture', + icons: '' + } + }) + }, + { serverName, baseUrl: `http://127.0.0.1:${port}/mcp` } + ) + const file = join(bootstrap.userDataDir, 'plugin-tool-policies.json') + expect(await bootstrap.close()).toBe('graceful') + for (const phase of ['single', 'ambiguous', 'disabled'] as const) { + const policies = + phase === 'ambiguous' + ? [policy, { ...policy, pluginId: 'com.deepchat.policy-e2e-other' }] + : [{ ...policy, enabled: phase !== 'disabled' }] + const previous = existsSync(file) ? JSON.parse(readFileSync(file, 'utf8')) : {} + writeFileSync(file, JSON.stringify({ ...previous, policies }, null, 2)) + const active = await launchApp() + await waitForAppReady(active.page) + const controls = await openSettings(active) + await controls.evaluate( + (serverName) => window.deepchat.invoke('mcp.startServer', { serverName }), + serverName + ) + await expect + .poll(async () => + controls.evaluate(async (serverName) => { + const { tools } = await window.deepchat.invoke('mcp.listToolDefinitions', {}) + return tools.filter((tool) => tool.server.name === serverName).length + }, serverName) + ) + .toBe(phase === 'single' ? 2 : 3) + const { tools } = await controls.evaluate(() => + window.deepchat.invoke('mcp.listToolDefinitions', {}) + ) + const definitions = tools.filter((tool) => tool.server.name === serverName) + const allowed = definitions.find((tool) => tool.raw?.name === 'allowed')! + expect(allowed).toBeTruthy() + const name = + phase === 'disabled' + ? definitions.find((tool) => tool.raw?.name === 'blocked')!.function.name + : allowed.function.name + const result = await controls.evaluate( + ({ name, id }) => + window.deepchat.invoke('mcp.callTool', { + request: { id, type: 'function', function: { name, arguments: '{}' } } + }), + { name, id: `policy-${phase}` } + ) + if (phase === 'ambiguous') { + expect(result.rawData.isError).toBe(true) + expect(result.content).toContain('not declared') + expect(calls).toEqual(['allowed']) + } else { + expect(result.rawData.isError).not.toBe(true) + expect(result.content).toContain( + phase === 'single' ? 'POLICY_EXECUTED_allowed' : 'POLICY_EXECUTED_blocked' + ) + } + expect(JSON.parse(readFileSync(file, 'utf8')).policies).toEqual(policies) + expect(await active.close()).toBe('graceful') + } + expect(calls).toEqual(['allowed', 'blocked']) + } finally { + server.closeAllConnections() + await new Promise((resolve) => server.close(() => resolve())) + } +}) diff --git a/test/e2e/specs/64-mcp-runtime.smoke.spec.ts b/test/e2e/specs/64-mcp-runtime.smoke.spec.ts new file mode 100644 index 0000000000..d5cb054e3e --- /dev/null +++ b/test/e2e/specs/64-mcp-runtime.smoke.spec.ts @@ -0,0 +1,175 @@ +import { mkdirSync, readFileSync, realpathSync, writeFileSync } from 'node:fs' +import { dirname, join } from 'node:path' +import { test, expect } from '../fixtures/electronApp' +import { openSettings } from '../helpers/settings' +import { waitForAppReady } from '../helpers/wait' + +test.use({ privacyModeEnabled: true }) + +test('MCP stdio preserves host identity, toolchain, environment and child cleanup @smoke', async ({ + launchApp +}) => { + const first = await launchApp() + expect(first.ownsUserDataDir).toBe(true) + await waitForAppReady(first.page) + const workspace = join(first.userDataDir, 'mcp-workspace') + const firstPath = join(workspace, 'first-path') + mkdirSync(firstPath, { recursive: true }) + const script = join(workspace, 'server.cjs') + const journal = join(workspace, 'journal.jsonl') + writeFileSync( + script, + `const fs = require('node:fs') +const readline = require('node:readline') +const record = (entry) => fs.appendFileSync(process.argv[2], JSON.stringify(entry) + '\\n') +const snapshot = () => ({ pid: process.pid, cwd: process.cwd(), executable: process.execPath, + homeArgument: process.argv[3], declared: process.env.MCP_DECLARED, + hostSecret: process.env.DEEPCHAT_MCP_HOST_SECRET ?? null, + path: process.env.PATH ?? process.env.Path ?? process.env.path }) +readline.createInterface({ input: process.stdin }).on('line', (line) => { + const message = JSON.parse(line) + if (message.id === undefined) return + let result = {} + if (message.method === 'initialize') { + record({ event: 'initialize', client: message.params.clientInfo, ...snapshot() }) + result = { protocolVersion: message.params.protocolVersion, capabilities: { tools: {} }, + serverInfo: { name: 'runtime-fixture', version: '1.0.0' } } + } else if (message.method === 'tools/list') { + result = { tools: [{ name: 'inspect_runtime', description: 'Inspect the owned runtime', + inputSchema: { type: 'object', properties: {} } }] } + } else if (message.method === 'tools/call') { + record({ event: 'call', ...snapshot() }) + result = { content: [{ type: 'text', text: JSON.stringify(snapshot()) }] } + } else if (message.method === 'prompts/list') result = { prompts: [] } + else if (message.method === 'resources/list') result = { resources: [] } + else if (message.method === 'resources/templates/list') result = { resourceTemplates: [] } + process.stdout.write(JSON.stringify({ jsonrpc: '2.0', id: message.id, result }) + '\\n') +}) +process.stdin.on('end', () => process.exit(0)) +` + ) + const expectedHost = await first.electronApp.evaluate(({ app }) => ({ + home: app.getPath('home'), + version: app.getVersion() + })) + await first.electronApp.evaluate(() => { + process.env.DEEPCHAT_MCP_HOST_SECRET = 'fixture-host-only' + }) + const serverName = 'runtime-host-fixture' + const controls = await openSettings(first) + await controls.evaluate( + async ({ node, serverName, script, journal, workspace, firstPath }) => { + await window.deepchat.invoke('toolchains.setSource', { + kind: 'node', + selection: { source: 'custom', customPath: node } + }) + await window.deepchat.invoke('mcp.setEnabled', { enabled: true }) + await window.deepchat.invoke('mcp.addServer', { + serverName, + config: { + type: 'stdio', + enabled: true, + command: 'node', + args: [script, journal, '~/mcp-runtime-marker'], + cwd: workspace, + inheritEnv: 'minimal', + env: { MCP_DECLARED: 'owned-value', PATH: firstPath }, + descriptions: 'Disposable runtime fixture', + icons: '' + } + }) + }, + { node: process.execPath, serverName, script, journal, workspace, firstPath } + ) + const alive = (pid: number) => { + try { + process.kill(pid, 0) + return true + } catch (error) { + if ((error as NodeJS.ErrnoException).code === 'ESRCH') return false + throw error + } + } + const records = () => + readFileSync(journal, 'utf8') + .trim() + .split('\n') + .map((line) => JSON.parse(line)) as Array<{ + event: string + pid: number + client: { name: string; version: string } + executable: string + homeArgument: string + cwd: string + declared: string + hostSecret: string | null + path: string + }> + for (const phase of ['first', 'reopen'] as const) { + const active = phase === 'first' ? first : await launchApp() + await waitForAppReady(active.page) + await active.electronApp.evaluate(() => { + process.env.DEEPCHAT_MCP_HOST_SECRET = 'fixture-host-only' + }) + const settings = phase === 'first' ? controls : await openSettings(active) + await settings.evaluate( + (serverName) => window.deepchat.invoke('mcp.startServer', { serverName }), + serverName + ) + const { tools } = await settings.evaluate(() => + window.deepchat.invoke('mcp.listToolDefinitions', {}) + ) + const tool = tools.find((entry) => entry.server.name === serverName)! + expect(tool).toBeTruthy() + const result = await settings.evaluate( + (name) => + window.deepchat.invoke('mcp.callTool', { + request: { + id: 'inspect-runtime', + type: 'function', + function: { name, arguments: '{}' } + } + }), + tool.function.name + ) + expect(result.rawData.isError).not.toBe(true) + const current = records() + .filter((entry) => entry.event === 'call') + .at(-1)! + expect(current).toMatchObject({ + executable: realpathSync(process.execPath), + homeArgument: `${expectedHost.home}/mcp-runtime-marker`, + cwd: realpathSync(workspace), + declared: 'owned-value', + hostSecret: null + }) + expect(current.path.startsWith(firstPath)).toBe(true) + expect(current.path).toContain(dirname(process.execPath)) + expect(result.content).toContain('mcp-runtime-marker') + expect( + records() + .filter((entry) => entry.event === 'initialize') + .at(-1)?.client + ).toEqual({ + name: 'DeepChat', + version: expectedHost.version + }) + expect(records().every((entry) => entry.hostSecret === null)).toBe(true) + if (phase === 'first') { + await settings.evaluate( + (serverName) => window.deepchat.invoke('mcp.stopServer', { serverName }), + serverName + ) + await expect.poll(() => alive(current.pid)).toBe(false) + await settings.evaluate( + (serverName) => window.deepchat.invoke('mcp.startServer', { serverName }), + serverName + ) + } + const pids = records().map((entry) => entry.pid) + expect(await active.close()).toBe('graceful') + for (const pid of new Set(pids)) await expect.poll(() => alive(pid)).toBe(false) + expect(active.pageErrors).toEqual([]) + } + expect(records().filter((entry) => entry.event === 'call')).toHaveLength(2) +}) diff --git a/test/e2e/specs/65-mcp-app-host.smoke.spec.ts b/test/e2e/specs/65-mcp-app-host.smoke.spec.ts new file mode 100644 index 0000000000..f369536825 --- /dev/null +++ b/test/e2e/specs/65-mcp-app-host.smoke.spec.ts @@ -0,0 +1,370 @@ +import { createServer } from 'node:http' +import type { McpAppDescriptor } from '../../../src/shared/types/mcp' +import type { AssistantMessageBlock } from '../../../src/shared/types/agent-interface' +import { test, expect } from '../fixtures/electronApp' +import { openSettings } from '../helpers/settings' +import { waitForAppReady } from '../helpers/wait' + +test.use({ privacyModeEnabled: true }) + +test('MCP Apps preserve saved sources, native sandbox policy, consent and reopen @smoke', async ({ + launchApp +}) => { + const serverName = 'app-host-fixture' + const resourceUri = 'ui://fixture/index.html' + let renderName = '' + const calls: string[] = [] + const server = createServer(async (request, response) => { + let source = '' + for await (const chunk of request) source += chunk + const body = source ? JSON.parse(source) : {} + if (request.url === '/mcp') { + if (body.id === undefined) { + response.writeHead(202).end() + return + } + let result: unknown = {} + if (body.method === 'initialize') + result = { + protocolVersion: body.params.protocolVersion, + capabilities: { tools: {}, resources: {} }, + serverInfo: { name: serverName, version: '1.0.0' } + } + else if (body.method === 'tools/list') + result = { + tools: ['render_app', 'app_action'].map((name) => ({ + name, + description: `App fixture ${name}`, + inputSchema: { type: 'object', properties: {} }, + annotations: { readOnlyHint: true }, + _meta: { + ui: { + ...(name === 'render_app' ? { resourceUri } : {}), + visibility: name === 'render_app' ? ['model', 'app'] : ['app'] + } + } + })) + } + else if (body.method === 'tools/call') { + calls.push(body.params.name) + result = { + content: [{ type: 'text', text: `APP_RESULT_${body.params.name}` }], + structuredContent: { value: 42 } + } + } else if (body.method === 'resources/read') + result = { + contents: [ + { + uri: resourceUri, + mimeType: 'text/html;profile=mcp-app', + text: '
APP_HOST_CONTENT
', + _meta: { + ui: { + permissions: { clipboardWrite: {} }, + csp: { connectDomains: ['https://api.example.com'] } + } + } + } + ] + } + else if (body.method === 'resources/list') result = { resources: [] } + else if (body.method === 'resources/templates/list') result = { resourceTemplates: [] } + response + .writeHead(200, { 'Content-Type': 'application/json' }) + .end(JSON.stringify({ jsonrpc: '2.0', id: body.id, result })) + return + } + if (request.url === '/v1/models') { + response + .writeHead(200, { 'Content-Type': 'application/json' }) + .end(JSON.stringify({ data: [{ id: 'app-fixture' }] })) + return + } + if (request.url !== '/v1/chat/completions') { + response.writeHead(404).end() + return + } + if (!body.stream) { + response.writeHead(200, { 'Content-Type': 'application/json' }).end( + JSON.stringify({ + id: 'title', + object: 'chat.completion', + created: 1, + model: 'app-fixture', + choices: [ + { + index: 0, + message: { role: 'assistant', content: 'App fixture' }, + finish_reason: 'stop' + } + ] + }) + ) + return + } + const complete = body.messages.some((entry: { role: string }) => entry.role === 'tool') + const delta = complete + ? { content: 'APP_HOST_COMPLETE' } + : { + role: 'assistant', + tool_calls: [ + { + index: 0, + id: 'render-app', + type: 'function', + function: { name: renderName, arguments: '{}' } + } + ] + } + response.writeHead(200, { 'Content-Type': 'text/event-stream' }) + response.write( + `data: ${JSON.stringify({ id: 'app-fixture', object: 'chat.completion.chunk', created: 1, model: 'app-fixture', choices: [{ index: 0, delta, finish_reason: complete ? 'stop' : 'tool_calls' }] })}\n\n` + ) + response.end('data: [DONE]\n\n') + }) + await new Promise((resolve) => server.listen(0, '127.0.0.1', resolve)) + const { port } = server.address() as { port: number } + try { + const first = await launchApp() + expect(first.ownsUserDataDir).toBe(true) + await waitForAppReady(first.page) + const settings = await openSettings(first) + const configured = await settings.evaluate( + async ({ baseUrl, serverName }) => { + await window.deepchat.invoke('mcp.setEnabled', { enabled: true }) + await window.deepchat.invoke('mcp.addServer', { + serverName, + config: { + type: 'http', + baseUrl: `${baseUrl}/mcp`, + enabled: true, + command: '', + args: [], + env: {}, + descriptions: 'Owned App fixture', + icons: '' + } + }) + await window.deepchat.invoke('mcp.startServer', { serverName }) + const { servers } = await window.deepchat.invoke('mcp.getServers', {}) + const { tools } = await window.deepchat.invoke('mcp.listToolDefinitions', {}) + return { + serverId: servers[serverName].serverId!, + name: tools.find( + (tool) => tool.server.name === serverName && tool.raw?.name === 'render_app' + )!.function.name + } + }, + { baseUrl: `http://127.0.0.1:${port}`, serverName } + ) + renderName = configured.name + const sessionId = await first.page.evaluate( + async ({ baseUrl, serverName }) => { + const providerId = `custom-${crypto.randomUUID()}` + await window.deepchat.invoke('providers.add', { + provider: { + id: providerId, + name: 'App fixture', + apiType: 'openai-completions', + baseUrl, + apiKey: 'fixture-key', + enable: true, + custom: true + } + }) + await window.deepchat.invoke('models.addCustom', { + providerId, + model: { + id: 'app-fixture', + name: 'App fixture', + enabled: true, + vision: false, + functionCall: true, + reasoning: false, + contextLength: 32000, + maxTokens: 8000 + } + }) + await window.deepchat.invoke('models.setStatus', { + providerId, + modelId: 'app-fixture', + enabled: true + }) + const { config } = await window.deepchat.invoke('config.resolveDeepChatAgentConfig', { + agentId: 'deepchat' + }) + await window.deepchat.invoke('config.updateDeepChatAgent', { + agentId: 'deepchat', + updates: { + config: { + ...config, + permissionMode: 'full_access', + disabledAgentTools: [], + enabledSkillNames: [], + enabledMcpServerIds: [serverName], + memoryEnabled: false + } + } + }) + const { session } = await window.deepchat.invoke('sessions.create', { + agentId: 'deepchat', + message: 'Render the App fixture.', + providerId, + modelId: 'app-fixture', + permissionMode: 'full_access', + toolModeOverride: 'agent' + }) + return session.id + }, + { baseUrl: `http://127.0.0.1:${port}/v1`, serverName } + ) + await expect + .poll(async () => + JSON.stringify( + await first.page.evaluate( + (sessionId) => + window.deepchat.invoke('sessions.listMessagesPage', { sessionId, limit: 100 }), + sessionId + ) + ) + ) + .toContain('APP_HOST_COMPLETE') + const saved = await first.page.evaluate(async (sessionId) => { + const { messages } = await window.deepchat.invoke('sessions.listMessagesPage', { + sessionId, + limit: 100 + }) + for (const message of messages) { + if (message.role !== 'assistant') continue + const blocks = JSON.parse(message.content) as AssistantMessageBlock[] + const block = blocks.find((block) => block.tool_call?.mcpResult?.app) + if (block) + return { + messageId: message.id, + blockId: block.id || block.tool_call?.id || '', + descriptor: block.tool_call!.mcpResult!.app!, + toolInput: JSON.parse(block.tool_call!.params ?? '{}') as Record + } + } + throw new Error(`Persisted App result missing: ${JSON.stringify(messages).slice(0, 16384)}`) + }, sessionId) + const sourceInput = { + ...saved, + conversationId: sessionId, + descriptor: saved.descriptor as McpAppDescriptor + } + for (const phase of ['first', 'reopen'] as const) { + const active = phase === 'first' ? first : await launchApp() + await waitForAppReady(active.page) + await active.electronApp.evaluate(({ shell }) => { + const links: string[] = [] + shell.openExternal = async (url) => { + links.push(url) + } + Object.assign(globalThis, { __appHostLinks: links }) + }) + const { view } = await active.page.evaluate( + (input) => window.deepchat.invoke('mcp.apps.prepareView', input), + sourceInput + ) + expect(view.html).toContain('APP_HOST_CONTENT') + const policy = await active.electronApp.evaluate(async ({ net }, url) => { + const response = await net.fetch(url) + return { + status: response.status, + csp: response.headers.get('content-security-policy'), + permissions: response.headers.get('permissions-policy') + } + }, view.sandboxUrl) + expect(policy.status).toBe(200) + expect(policy.csp).toContain("default-src 'none'") + expect(policy.csp).toContain('connect-src https://api.example.com') + expect(policy.permissions).toContain('camera=()') + expect(policy.permissions).toContain('clipboard-write=(self)') + const { call } = await active.page.evaluate( + (instanceId) => + window.deepchat.invoke('mcp.apps.callTool', { + instanceId, + name: 'app_action', + arguments: {} + }), + view.instanceId + ) + expect(call.result.content).toEqual([{ type: 'text', text: 'APP_RESULT_app_action' }]) + if (phase === 'first') { + await expect( + settings.evaluate( + (input) => window.deepchat.invoke('mcp.apps.prepareView', input), + sourceInput + ) + ).rejects.toThrow('conversation windows') + for (const approved of [false, true]) { + await active.page.evaluate((instanceId) => { + Object.assign(window, { + __appHostPending: window.deepchat.invoke('mcp.apps.openLink', { + instanceId, + url: 'https://example.com/fixture' + }) + }) + }, view.instanceId) + const dialog = active.page.getByRole('dialog') + await expect(dialog).toBeVisible() + await dialog + .getByRole('button', { + name: approved ? /Allow once|允许一次|允許一次|仅此一次|僅此一次/ : /Deny|拒绝|拒絕/ + }) + .click() + expect( + await active.page.evaluate( + async () => + await (window as unknown as { __appHostPending: Promise }).__appHostPending + ) + ).toEqual({ opened: approved }) + } + expect( + await active.electronApp.evaluate( + () => (globalThis as unknown as { __appHostLinks: string[] }).__appHostLinks + ) + ).toEqual(['https://example.com/fixture']) + await active.page.evaluate((instanceId) => { + Object.assign(window, { + __appHostPending: window.deepchat + .invoke('mcp.apps.authorizeMessage', { instanceId, text: 'Owned pending consent' }) + .catch(() => undefined) + }) + }, view.instanceId) + await expect(active.page.getByRole('dialog')).toBeVisible() + } else { + await active.page.evaluate( + ({ sessionId, messageId }) => + window.deepchat.invoke('sessions.deleteMessage', { sessionId, messageId }), + { sessionId, messageId: saved.messageId } + ) + await expect( + active.page.evaluate( + (instanceId) => window.deepchat.invoke('mcp.apps.listTools', { instanceId }), + view.instanceId + ) + ).rejects.toThrow('unavailable') + expect( + await active.electronApp.evaluate( + async ({ net }, url) => (await net.fetch(url)).status, + view.sandboxUrl + ) + ).toBe(410) + await expect( + active.page.evaluate( + (input) => window.deepchat.invoke('mcp.apps.prepareView', input), + sourceInput + ) + ).rejects.toThrow('source no longer matches') + } + expect(await active.close()).toBe('graceful') + expect(active.pageErrors).toEqual([]) + } + expect(calls).toEqual(['render_app', 'app_action', 'app_action']) + } finally { + server.closeAllConnections() + await new Promise((resolve) => server.close(() => resolve())) + } +}) diff --git a/test/e2e/specs/66-project-host.smoke.spec.ts b/test/e2e/specs/66-project-host.smoke.spec.ts new file mode 100644 index 0000000000..98ab618bbe --- /dev/null +++ b/test/e2e/specs/66-project-host.smoke.spec.ts @@ -0,0 +1,165 @@ +import { existsSync, mkdirSync, readFileSync, statSync, writeFileSync } from 'node:fs' +import { join } from 'node:path' +import { test, expect } from '../fixtures/electronApp' +import { waitForAppReady } from '../helpers/wait' + +test.use({ privacyModeEnabled: true }) + +test('project host preserves workspace, native operations and durable versions @smoke', async ({ + launchApp +}) => { + let initialWorkspace = '' + let active = await launchApp({ + prepareUserData: (profile) => { + initialWorkspace = join(profile, 'initial-workspace') + mkdirSync(initialWorkspace) + const settingsFile = join(profile, 'app-settings.json') + const settings = JSON.parse(readFileSync(settingsFile, 'utf8')) + settings.defaultProjectPath = initialWorkspace + writeFileSync(settingsFile, JSON.stringify(settings)) + } + }) + await waitForAppReady(active.page) + const profile = active.userDataDir + const snapshot = () => + active.page.evaluate(() => window.deepchat.invoke('project.getSnapshot', {})) + expect((await snapshot()).defaultProjectPath).toBe(initialWorkspace) + + const managedWorkspace = join(profile, 'workspaces', 'DeepChat') + expect(existsSync(managedWorkspace)).toBe(false) + await active.page.evaluate( + (path) => window.deepchat.invoke('config.setDefaultProjectPath', { path }), + managedWorkspace + ) + expect((await snapshot()).defaultChatWorkspacePath).toBeNull() + const prepared = await active.page.evaluate(() => + window.deepchat.invoke('project.ensureChatWorkspace', {}) + ) + expect(prepared.path).toBe(managedWorkspace) + expect(statSync(managedWorkspace).isDirectory()).toBe(true) + expect(await snapshot()).toMatchObject({ + version: prepared.version, + defaultProjectPath: managedWorkspace, + defaultChatWorkspacePath: managedWorkspace + }) + + const firstPath = join(profile, 'selected-first') + const secondPath = join(profile, 'selected-second') + mkdirSync(firstPath) + mkdirSync(secondPath) + await active.electronApp.evaluate( + ({ dialog, shell }, paths) => { + const selections = [ + { canceled: true, filePaths: [] }, + { canceled: false, filePaths: [paths.firstPath] }, + { canceled: false, filePaths: [paths.secondPath] } + ] + const calls: { kind: string; path?: string }[] = [] + Reflect.set(globalThis, '__projectHostCalls', calls) + dialog.showOpenDialog = (async () => { + calls.push({ kind: 'selectDirectory' }) + const result = selections.shift() + if (!result) throw new Error('Unexpected native directory selection') + return result + }) as typeof dialog.showOpenDialog + shell.openPath = async (path) => { + calls.push({ kind: 'openPath', path }) + return path === paths.secondPath ? 'Fixture native open failed' : '' + } + }, + { firstPath, secondPath } + ) + + const canceled = await active.page.evaluate(() => + window.deepchat.invoke('project.selectDirectory', {}) + ) + expect(canceled).toEqual({ path: null, version: prepared.version }) + expect((await snapshot()).version).toBe(prepared.version) + for (const path of [firstPath, secondPath]) { + const selected = await active.page.evaluate(() => + window.deepchat.invoke('project.selectDirectory', {}) + ) + expect(selected.path).toBe(path) + expect((await snapshot()).version).toBe(selected.version) + } + await active.page.evaluate( + (path) => window.deepchat.invoke('project.openDirectory', { path: ` ${path} ` }), + firstPath + ) + await expect( + active.page.evaluate( + (path) => window.deepchat.invoke('project.openDirectory', { path }), + secondPath + ) + ).rejects.toThrow('Fixture native open failed') + expect( + await active.electronApp.evaluate(() => Reflect.get(globalThis, '__projectHostCalls')) + ).toEqual([ + { kind: 'selectDirectory' }, + { kind: 'selectDirectory' }, + { kind: 'selectDirectory' }, + { kind: 'openPath', path: firstPath }, + { kind: 'openPath', path: secondPath } + ]) + + await active.page.evaluate( + (paths) => window.deepchat.invoke('project.reorderEnvironments', { paths }), + [firstPath, secondPath] + ) + expect((await snapshot()).environments.slice(0, 2).map((item) => item.path)).toEqual([ + firstPath, + secondPath + ]) + await active.page.evaluate( + (path) => window.deepchat.invoke('project.archiveEnvironment', { path }), + secondPath + ) + expect((await snapshot()).archivedEnvironments.map((item) => item.path)).toContain(secondPath) + await active.page.evaluate( + (path) => window.deepchat.invoke('project.restoreEnvironment', { path }), + secondPath + ) + + const { session } = await active.page.evaluate( + (projectDir) => + window.deepchat.invoke('sessions.create', { + agentId: 'deepchat', + providerId: 'openai', + modelId: 'gpt-5.6-luna', + message: '', + projectDir + }), + firstPath + ) + await active.page.evaluate( + (path) => window.deepchat.invoke('config.setDefaultProjectPath', { path }), + firstPath + ) + const removed = await active.page.evaluate( + (path) => window.deepchat.invoke('project.removeEnvironment', { path }), + firstPath + ) + expect(removed.clearedSessionIds).toContain(session.id) + const expected = await snapshot() + expect(expected.defaultProjectPath).toBeNull() + expect(expected.removedEnvironments.map((item) => item.path)).toContain(firstPath) + expect(expected.environments.map((item) => item.path)).not.toContain(firstPath) + expect(existsSync(firstPath)).toBe(true) + const restored = await active.page.evaluate( + (sessionId) => window.deepchat.invoke('sessions.restore', { sessionId, limit: 30 }), + session.id + ) + expect(restored.session?.projectDir).toBeNull() + + expect(await active.close()).toBe('graceful') + active = await launchApp() + await waitForAppReady(active.page) + expect(active.userDataDir).toBe(profile) + expect(await snapshot()).toEqual(expected) + const afterRestart = await active.page.evaluate( + (sessionId) => window.deepchat.invoke('sessions.restore', { sessionId, limit: 30 }), + session.id + ) + expect(afterRestart.session?.projectDir).toBeNull() + expect(await active.close()).toBe('graceful') +}) diff --git a/test/e2e/specs/67-settings-file-owner.smoke.spec.ts b/test/e2e/specs/67-settings-file-owner.smoke.spec.ts new file mode 100644 index 0000000000..ec17e7972b --- /dev/null +++ b/test/e2e/specs/67-settings-file-owner.smoke.spec.ts @@ -0,0 +1,102 @@ +import { mkdirSync, readFileSync, writeFileSync } from 'node:fs' +import { join } from 'node:path' +import { test, expect } from '../fixtures/electronApp' +import { waitForAppReady } from '../helpers/wait' + +test.use({ privacyModeEnabled: true }) + +test('legacy settings file and database values survive owner bootstrap and relaunch @smoke', async ({ + launchApp +}) => { + const extension = { source: 'legacy-fixture', nested: { retained: [1, 2, 3] } } + let active = await launchApp({ + prepareUserData: (profile) => { + const file = join(profile, 'app-settings.json') + const settings = JSON.parse(readFileSync(file, 'utf8')) + const workspace = join(profile, 'workspace') + mkdirSync(workspace) + Object.assign(settings, { + defaultProjectPath: workspace, + appVersion: '0.9.0', + language: 'en-US', + copyWithCotEnabled: true, + extensionFixture: extension + }) + writeFileSync(file, JSON.stringify(settings)) + } + }) + await waitForAppReady(active.page) + const profile = active.userDataDir + const file = join(profile, 'app-settings.json') + const readSettings = () => JSON.parse(readFileSync(file, 'utf8')) + expect(readSettings().extensionFixture).toEqual(extension) + expect( + await active.page.evaluate(() => window.deepchat.invoke('config.getLanguage', {})) + ).toMatchObject({ requestedLanguage: 'en-US', locale: 'en-US' }) + const version = await active.electronApp.evaluate(({ app }) => app.getVersion()) + expect(readSettings().appVersion).toBe(version) + + const changed = await active.page.evaluate(async () => { + const settings = await window.deepchat.invoke('settings.update', { + changes: [ + { key: 'autoScrollEnabled', value: false }, + { key: 'fontSizeLevel', value: 2 }, + { key: 'copyWithCotEnabled', value: false } + ] + }) + const entries = await window.deepchat.invoke('config.updateEntries', { + changes: [{ key: 'maxFileSize', value: 20 * 1024 * 1024 }] + }) + const language = await window.deepchat.invoke('config.setLanguage', { language: 'zh-CN' }) + const cloud = await window.deepchat.invoke('sync.setCloudConfig', { + config: { + enabled: false, + endpoint: 'http://127.0.0.1:1', + bucket: 'settings-owner-fixture', + accessKeyId: 'fixture-key', + secretAccessKey: 'owned-profile-cloud-fixture' + } + }) + return { settings, entries, language, cloud } + }) + expect(changed.settings.values).toEqual({ + autoScrollEnabled: false, + fontSizeLevel: 2, + copyWithCotEnabled: false + }) + expect(changed.entries.values).toEqual({ maxFileSize: 20 * 1024 * 1024 }) + expect(changed.language).toMatchObject({ requestedLanguage: 'zh-CN', locale: 'zh-CN' }) + expect(changed.cloud.config).toMatchObject({ hasSecret: true, safeStorageAvailable: true }) + expect(readFileSync(file, 'utf8')).not.toContain('owned-profile-cloud-fixture') + const wrappedSecret = readSettings().cloudSyncSecret + expect(typeof wrappedSecret).toBe('string') + expect(readSettings()).toMatchObject({ + extensionFixture: extension, + autoScrollEnabled: false, + fontSizeLevel: 2, + language: 'zh-CN', + maxFileSize: 20 * 1024 * 1024, + copyWithCotEnabled: true + }) + + expect(await active.close()).toBe('graceful') + active = await launchApp() + await waitForAppReady(active.page) + expect(active.userDataDir).toBe(profile) + const restored = await active.page.evaluate(async () => ({ + settings: await window.deepchat.invoke('settings.getSnapshot', { + keys: ['autoScrollEnabled', 'fontSizeLevel', 'copyWithCotEnabled'] + }), + entries: await window.deepchat.invoke('config.getEntries', { keys: ['maxFileSize'] }), + language: await window.deepchat.invoke('config.getLanguage', {}), + cloud: await window.deepchat.invoke('sync.getCloudConfig', {}) + })) + expect(restored.settings.values).toEqual(changed.settings.values) + expect(restored.entries.values).toEqual(changed.entries.values) + expect(restored.language).toEqual(changed.language) + expect(restored.cloud.config).toMatchObject({ hasSecret: true, safeStorageAvailable: true }) + expect(readSettings().cloudSyncSecret).toBe(wrappedSecret) + expect(readSettings().extensionFixture).toEqual(extension) + expect(readSettings().copyWithCotEnabled).toBe(true) + expect(await active.close()).toBe('graceful') +}) diff --git a/test/e2e/specs/68-desktop-settings-host.smoke.spec.ts b/test/e2e/specs/68-desktop-settings-host.smoke.spec.ts new file mode 100644 index 0000000000..d0a36cc399 --- /dev/null +++ b/test/e2e/specs/68-desktop-settings-host.smoke.spec.ts @@ -0,0 +1,109 @@ +import { readFileSync, writeFileSync } from 'node:fs' +import { join } from 'node:path' +import { test, expect } from '../fixtures/electronApp' +import { openSettings } from '../helpers/settings' +import { waitForAppReady } from '../helpers/wait' + +test.use({ privacyModeEnabled: true }) + +test('desktop appearance and native login observations survive settings owner relaunch @smoke', async ({ + launchApp +}) => { + let active = await launchApp({ + prepareUserData: (profile) => { + const file = join(profile, 'app-settings.json') + const stored = JSON.parse(readFileSync(file, 'utf8')) + writeFileSync(file, JSON.stringify({ ...stored, launchAtLoginEnabled: true })) + } + }) + await waitForAppReady(active.page) + expect(active.ownsUserDataDir).toBe(true) + const settingsPage = await openSettings(active) + + // Keep OS login writes inside this disposable process fixture. + await active.electronApp.evaluate(({ app }) => { + const get = app.getLoginItemSettings + const set = app.setLoginItemSettings + const observed = get.call(app) + const writes: boolean[] = [] + app.getLoginItemSettings = () => ({ ...observed, openAtLogin: false }) + app.setLoginItemSettings = (options) => { + writes.push(Boolean(options.openAtLogin)) + } + const state = globalThis as typeof globalThis & { + restoreDesktopSettingsFixture?: () => boolean[] + } + state.restoreDesktopSettingsFixture = () => { + app.getLoginItemSettings = get + app.setLoginItemSettings = set + delete state.restoreDesktopSettingsFixture + return writes + } + }) + try { + const login = await active.page.evaluate(async () => ({ + before: await window.deepchat.invoke('settings.getSnapshot', { + keys: ['launchAtLoginEnabled'] + }), + changed: await window.deepchat.invoke('settings.update', { + changes: [{ key: 'launchAtLoginEnabled', value: true }] + }) + })) + expect(login.before.values).toEqual({ launchAtLoginEnabled: false }) + expect(login.changed.values).toEqual({ launchAtLoginEnabled: false }) + + expect( + await active.page.evaluate(() => window.deepchat.invoke('config.setTheme', { theme: 'dark' })) + ).toEqual({ theme: 'dark', isDark: true }) + await expect(active.page.locator('html')).toHaveClass(/dark/) + await expect(settingsPage.locator('html')).toHaveClass(/dark/) + expect( + await active.page.evaluate(() => + window.deepchat.invoke('config.setLanguage', { language: 'fa' }) + ) + ).toEqual({ requestedLanguage: 'fa-IR', locale: 'fa-IR', direction: 'rtl' }) + await expect(active.page.locator('html')).toHaveAttribute('dir', 'rtl') + await expect(settingsPage.locator('html')).toHaveAttribute('dir', 'rtl') + + const restored = await settingsPage.evaluate(async () => ({ + theme: await window.deepchat.invoke('config.setTheme', { theme: 'light' }), + language: await window.deepchat.invoke('config.setLanguage', { language: 'en-US' }) + })) + expect(restored.theme).toEqual({ theme: 'light', isDark: false }) + expect(restored.language).toEqual({ + requestedLanguage: 'en-US', + locale: 'en-US', + direction: 'auto' + }) + await expect(active.page.locator('html')).not.toHaveClass(/dark/) + await expect(settingsPage.locator('html')).not.toHaveClass(/dark/) + await expect(active.page.locator('html')).toHaveAttribute('dir', 'auto') + await expect(settingsPage.locator('html')).toHaveAttribute('dir', 'auto') + } finally { + const writes = await active.electronApp.evaluate(() => + ( + globalThis as typeof globalThis & { + restoreDesktopSettingsFixture?: () => boolean[] + } + ).restoreDesktopSettingsFixture?.() + ) + expect(writes).toEqual([true]) + } + const stored = JSON.parse(readFileSync(join(active.userDataDir, 'app-settings.json'), 'utf8')) + expect(stored).toMatchObject({ language: 'en-US', appTheme: 'light', launchAtLoginEnabled: true }) + expect(await active.close()).toBe('graceful') + + active = await launchApp() + await waitForAppReady(active.page) + const reopened = await active.page.evaluate(async () => ({ + theme: await window.deepchat.invoke('config.getTheme', {}), + language: await window.deepchat.invoke('config.getLanguage', {}) + })) + expect(reopened.theme).toEqual({ theme: 'light', isDark: false }) + expect(reopened.language).toEqual({ + requestedLanguage: 'en-US', + locale: 'en-US', + direction: 'auto' + }) + expect(await active.close()).toBe('graceful') +}) diff --git a/test/e2e/specs/69-font-logging-host.smoke.spec.ts b/test/e2e/specs/69-font-logging-host.smoke.spec.ts new file mode 100644 index 0000000000..c71a49d4e8 --- /dev/null +++ b/test/e2e/specs/69-font-logging-host.smoke.spec.ts @@ -0,0 +1,182 @@ +import { existsSync, readFileSync } from 'node:fs' +import { join } from 'node:path' +import { test, expect } from '../fixtures/electronApp' +import { waitForAppReady } from '../helpers/wait' + +type NativeConfigurationFixture = { + opened: string[] + protectedValues: boolean[] + relaunches: number + exits: number + finish(): void +} + +test.use({ privacyModeEnabled: true }) + +test('native font, folder and configuration restart capabilities preserve the profile @smoke', async ({ + launchApp +}) => { + let active = await launchApp() + await waitForAppReady(active.page) + expect(active.ownsUserDataDir).toBe(true) + const profile = active.userDataDir + const restartProcess = active.electronApp.process() + const catalogs = await active.page.evaluate(() => + Promise.all([ + window.deepchat.invoke('settings.listSystemFonts', {}), + window.deepchat.invoke('settings.listSystemFonts', {}) + ]) + ) + expect(catalogs[0].fonts.length).toBeGreaterThan(0) + expect(catalogs[1]).toEqual(catalogs[0]) + const family = catalogs[0].fonts.find((name) => /^[A-Za-z][A-Za-z0-9-]*$/.test(name)) + expect(family).toBeTruthy() + const selected = await active.page.evaluate( + (family) => + window.deepchat.invoke('settings.update', { + changes: [ + { key: 'fontFamily', value: ` ${family.toLowerCase()}; ` }, + { key: 'codeFontFamily', value: family } + ] + }), + family! + ) + expect(selected.values).toEqual({ fontFamily: family, codeFontFamily: family }) + + // Observe the real shutdown at the native relaunch/exit boundary without spawning another app. + await active.electronApp.evaluate(({ app, shell, BrowserWindow }) => { + const relaunch = app.relaunch + const exit = app.exit + const quit = app.quit + const openPath = shell.openPath + const windows = BrowserWindow.getAllWindows().map((window) => ({ + window, + protect: window.setContentProtection + })) + const fixture = { + opened: [] as string[], + protectedValues: [] as boolean[], + relaunches: 0, + exits: 0, + finish: () => { + app.relaunch = relaunch + app.exit = exit + app.quit = quit + shell.openPath = openPath + for (const { window, protect } of windows) window.setContentProtection = protect + exit.call(app, 0) + } + } + app.relaunch = () => { + fixture.relaunches++ + } + app.exit = () => { + fixture.exits++ + } + app.quit = () => {} + shell.openPath = async (path) => { + fixture.opened.push(path) + return '' + } + for (const { window, protect } of windows) { + window.setContentProtection = function ( + this: InstanceType, + enabled: boolean + ) { + protect.call(this, enabled) + fixture.protectedValues.push(this.isContentProtected()) + } + } + ;( + globalThis as typeof globalThis & { nativeConfigurationFixture?: NativeConfigurationFixture } + ).nativeConfigurationFixture = fixture + }) + expect( + await active.page.evaluate(() => window.deepchat.invoke('config.openLoggingFolder', {})) + ).toEqual({ opened: true }) + expect(existsSync(join(profile, 'logs'))).toBe(true) + expect( + await active.page.evaluate(() => + window.deepchat.invoke('settings.update', { + changes: [ + { key: 'contentProtectionEnabled', value: true }, + { key: 'loggingEnabled', value: true } + ] + }) + ) + ).toMatchObject({ values: { contentProtectionEnabled: true, loggingEnabled: true } }) + + await expect + .poll(() => + active.electronApp.evaluate( + () => + ( + globalThis as typeof globalThis & { + nativeConfigurationFixture: NativeConfigurationFixture + } + ).nativeConfigurationFixture.exits + ) + ) + .toBe(1) + const native = await active.electronApp.evaluate(() => { + const fixture = ( + globalThis as typeof globalThis & { nativeConfigurationFixture: NativeConfigurationFixture } + ).nativeConfigurationFixture + return { + opened: fixture.opened, + protectedValues: fixture.protectedValues, + relaunches: fixture.relaunches + } + }) + expect(native.opened).toEqual([join(profile, 'logs')]) + expect(native.protectedValues.length).toBeGreaterThan(0) + expect(native.protectedValues.every(Boolean)).toBe(true) + expect(native.relaunches).toBe(1) + expect(JSON.parse(readFileSync(join(profile, 'app-settings.json'), 'utf8'))).toMatchObject({ + fontFamily: family, + codeFontFamily: family, + contentProtectionEnabled: true, + loggingEnabled: true + }) + expect(readFileSync(join(profile, 'logs', 'main.jsonl'), 'utf8')).toContain( + 'app.shutdown.terminal' + ) + await active.electronApp + .evaluate(() => + ( + globalThis as typeof globalThis & { nativeConfigurationFixture: NativeConfigurationFixture } + ).nativeConfigurationFixture.finish() + ) + .catch((error) => { + if (!(error instanceof Error) || !error.message.includes('closed')) throw error + }) + await expect.poll(() => restartProcess.exitCode).toBe(0) + expect(await active.close()).toBe('graceful') + + active = await launchApp() + await waitForAppReady(active.page) + expect( + ( + await active.page.evaluate(() => + window.deepchat.invoke('settings.getSnapshot', { + keys: ['fontFamily', 'codeFontFamily', 'contentProtectionEnabled', 'loggingEnabled'] + }) + ) + ).values + ).toEqual({ + fontFamily: family, + codeFontFamily: family, + contentProtectionEnabled: true, + loggingEnabled: true + }) + const identity = await active.page.evaluate(() => + window.deepchat.invoke('window.getRuntimeIdentity', {}) + ) + expect( + await active.electronApp.evaluate( + ({ BrowserWindow }, id) => BrowserWindow.fromId(id)!.isContentProtected(), + identity.windowId! + ) + ).toBe(true) + expect(await active.close()).toBe('graceful') +}) diff --git a/test/e2e/specs/70-file-image-host.smoke.spec.ts b/test/e2e/specs/70-file-image-host.smoke.spec.ts new file mode 100644 index 0000000000..57525782b7 --- /dev/null +++ b/test/e2e/specs/70-file-image-host.smoke.spec.ts @@ -0,0 +1,180 @@ +import { mkdirSync, readFileSync, writeFileSync } from 'node:fs' +import { createServer } from 'node:http' +import { dirname, join } from 'node:path' +import sharp from 'sharp' +import { test, expect } from '../fixtures/electronApp' +import { waitForAppReady } from '../helpers/wait' + +type ImageActionFixture = { + target?: string + dialogs: string[] + copied: { width: number; height: number }[] + restore(): void +} + +test.use({ privacyModeEnabled: true }) + +test('file preparation and native image actions preserve bytes and profile bounds @smoke', async ({ + launchApp +}) => { + const png = await sharp({ + create: { width: 32, height: 24, channels: 4, background: '#2c8651' } + }) + .png() + .toBuffer() + const dataUrl = `data:image/png;base64,${png.toString('base64')}` + const server = createServer((_request, response) => { + response.writeHead(200, { 'content-type': 'image/png' }) + response.end(png) + }) + await new Promise((resolve) => server.listen(0, '127.0.0.1', resolve)) + const address = server.address() + if (!address || typeof address === 'string') throw new Error('Image fixture did not listen') + let active: Awaited> | undefined + try { + active = await launchApp({ + prepareUserData(profile) { + mkdirSync(join(profile, 'images'), { recursive: true }) + writeFileSync(join(profile, 'images', 'cached image.png'), png) + writeFileSync(join(profile, 'note.txt'), 'file preparation fixture') + } + }) + await waitForAppReady(active.page) + expect(active.ownsUserDataDir).toBe(true) + const profile = active.userDataDir + const prepared = await active.page.evaluate( + ({ textPath, imagePath, dataUrl }) => + Promise.all([ + window.deepchat.invoke('file.prepareFile', { path: textPath }), + window.deepchat.invoke('file.prepareFile', { path: imagePath }), + window.deepchat.invoke('file.readFile', { path: 'note.txt' }), + window.deepchat.invoke('file.writeImageBase64', { + name: '../../outside.png', + content: dataUrl + }) + ]), + { + textPath: join(profile, 'note.txt'), + imagePath: join(profile, 'images', 'cached image.png'), + dataUrl + } + ) + expect(prepared[0].file.content).toContain('file preparation fixture') + expect(prepared[1].file.mimeType).toBe('image/png') + expect(prepared[1].file.thumbnail).toMatch(/^data:image\/jpeg;base64,/) + expect(prepared[2]).toEqual({ content: 'file preparation fixture' }) + expect(dirname(prepared[3].path)).toBe(join(profile, 'temp')) + expect(readFileSync(prepared[3].path)).toEqual(png) + await expect( + active.page.evaluate(() => + window.deepchat.invoke('file.readFile', { path: '../outside.txt' }) + ) + ).rejects.toThrow('File path escapes user data directory') + + // Keep real native decoding and filesystem writes while owning dialog and clipboard effects. + await active.electronApp.evaluate(({ clipboard, dialog }) => { + const save = dialog.showSaveDialog + const copy = clipboard.writeImage + const fixture: ImageActionFixture = { + dialogs: [], + copied: [], + restore() { + dialog.showSaveDialog = save + clipboard.writeImage = copy + } + } + dialog.showSaveDialog = async (...args: unknown[]) => { + const options = args.at(-1) as Electron.SaveDialogOptions + fixture.dialogs.push(options.defaultPath ?? '') + return { canceled: !fixture.target, filePath: fixture.target ?? '' } + } + clipboard.writeImage = (image) => { + fixture.copied.push(image.getSize()) + } + ;( + globalThis as typeof globalThis & { imageActionFixture: ImageActionFixture } + ).imageActionFixture = fixture + }) + const sources = [ + { source: dataUrl }, + { source: png.toString('base64'), mimeType: 'image/png' }, + { source: 'imgcache://cached%20image.png' }, + { source: `http://127.0.0.1:${address.port}/remote.png` } + ] + for (const [index, source] of sources.entries()) { + const target = join(profile, `saved-${index}.png`) + await active.electronApp.evaluate((_, target) => { + ;( + globalThis as typeof globalThis & { imageActionFixture: ImageActionFixture } + ).imageActionFixture.target = target + }, target) + expect( + await active.page.evaluate((input) => window.deepchat.invoke('file.saveImage', input), { + ...source, + suggestedName: 'saved:image' + }) + ).toEqual({ canceled: false, path: target }) + expect(readFileSync(target)).toEqual(png) + expect( + await active.page.evaluate( + (input) => window.deepchat.invoke('file.copyImage', input), + source + ) + ).toEqual({ copied: true }) + } + await active.electronApp.evaluate(() => { + ;( + globalThis as typeof globalThis & { imageActionFixture: ImageActionFixture } + ).imageActionFixture.target = undefined + }) + expect( + await active.page.evaluate( + (source) => window.deepchat.invoke('file.saveImage', { source }), + dataUrl + ) + ).toEqual({ canceled: true }) + await expect( + active.page.evaluate(() => + window.deepchat.invoke('file.copyImage', { + source: 'bm90IGFuIGltYWdl', + mimeType: 'image/png' + }) + ) + ).rejects.toThrow('Image data cannot be copied to clipboard') + const observed = await active.electronApp.evaluate(() => { + const fixture = (globalThis as typeof globalThis & { imageActionFixture: ImageActionFixture }) + .imageActionFixture + return { dialogs: fixture.dialogs, copied: fixture.copied } + }) + expect(observed.dialogs.slice(0, 4)).toEqual(Array(4).fill('saved_image.png')) + expect(observed.copied).toEqual(Array(4).fill({ width: 32, height: 24 })) + await active.electronApp.evaluate(() => { + ;( + globalThis as typeof globalThis & { imageActionFixture: ImageActionFixture } + ).imageActionFixture.restore() + }) + expect(await active.close()).toBe('graceful') + active = await launchApp() + await waitForAppReady(active.page) + expect( + await active.page.evaluate(() => + window.deepchat.invoke('file.readFile', { path: 'note.txt' }) + ) + ).toEqual({ content: 'file preparation fixture' }) + expect(await active.close()).toBe('graceful') + } finally { + if (active) { + await active.electronApp + .evaluate(() => { + ;( + globalThis as typeof globalThis & { imageActionFixture?: ImageActionFixture } + ).imageActionFixture?.restore() + }) + .catch(() => {}) + await active.close() + } + await new Promise((resolve, reject) => + server.close((error) => (error ? reject(error) : resolve())) + ) + } +}) diff --git a/test/e2e/specs/71-storage-host-roots.smoke.spec.ts b/test/e2e/specs/71-storage-host-roots.smoke.spec.ts new file mode 100644 index 0000000000..a9062784c2 --- /dev/null +++ b/test/e2e/specs/71-storage-host-roots.smoke.spec.ts @@ -0,0 +1,154 @@ +import { execFileSync } from 'node:child_process' +import { existsSync, mkdirSync, readFileSync } from 'node:fs' +import { createRequire } from 'node:module' +import { join } from 'node:path' +import { test, expect } from '../fixtures/electronApp' +import { waitForAppReady } from '../helpers/wait' + +test.use({ privacyModeEnabled: true }) + +test('sync folders and Knowledge databases retain their owned paths across relaunch @smoke', async ({ + launchApp +}) => { + const require = createRequire(import.meta.url) + let sourceBytes!: Buffer + let active = await launchApp({ + prepareUserData(profile) { + mkdirSync(join(profile, 'app_db'), { recursive: true }) + const source = join(profile, 'app_db', 'chat.db') + execFileSync( + require('electron'), + [ + '-e', + ` + const Database = require(process.argv[1]) + const db = new Database(process.argv[2]) + db.exec("CREATE TABLE conversations (conv_id TEXT PRIMARY KEY, title TEXT); INSERT INTO conversations VALUES ('storage-root-fixture', 'Imported storage fixture')") + db.close() + `, + require.resolve('better-sqlite3-multiple-ciphers'), + source + ], + { + env: { ...process.env, ELECTRON_RUN_AS_NODE: '1' }, + timeout: 30_000 + } + ) + sourceBytes = readFileSync(source) + } + }) + expect(active.ownsUserDataDir).toBe(true) + await waitForAppReady(active.page) + const profile = active.userDataDir + const legacySessionId = 'legacy-session-storage-root-fixture' + await expect + .poll( + async () => + ( + await active.page.evaluate( + (sessionId) => window.deepchat.invoke('sessions.restore', { sessionId, limit: 30 }), + legacySessionId + ) + ).session?.title + ) + .toBe('Imported storage fixture') + const backupDirectory = join(profile, 'storage-backups') + await active.page.evaluate( + (folderPath) => + window.deepchat.invoke('config.updateSyncSettings', { enabled: true, folderPath }), + backupDirectory + ) + await active.electronApp.evaluate(({ shell }) => { + const openPath = shell.openPath + Object.assign(globalThis, { + storageFolderFixture: { + opened: [] as string[], + restore: () => { + shell.openPath = openPath + } + } + }) + shell.openPath = async (path) => { + ;( + globalThis as typeof globalThis & { storageFolderFixture: { opened: string[] } } + ).storageFolderFixture.opened.push(path) + return '' + } + }) + try { + expect(await active.page.evaluate(() => window.deepchat.invoke('sync.openFolder', {}))).toEqual( + { + opened: true + } + ) + expect(existsSync(backupDirectory)).toBe(true) + expect( + await active.electronApp.evaluate( + () => + (globalThis as typeof globalThis & { storageFolderFixture: { opened: string[] } }) + .storageFolderFixture.opened + ) + ).toEqual([backupDirectory]) + } finally { + await active.electronApp.evaluate(() => { + ;( + globalThis as typeof globalThis & { storageFolderFixture: { restore(): void } } + ).storageFolderFixture.restore() + }) + } + + const supported = await active.page.evaluate(() => + window.deepchat.invoke('knowledge.isSupported', {}) + ) + const knowledgeBaseId = 'storage-root-fixture' + if (supported.supported) { + await active.page.evaluate( + (id) => + window.deepchat.invoke('config.setKnowledgeConfigs', { + configs: [ + { + id, + description: 'Storage root fixture', + embedding: { providerId: 'openai', modelId: 'text-embedding-3-small' }, + dimensions: 3, + normalized: false, + fragmentsNumber: 2, + enabled: true + } + ] + }), + knowledgeBaseId + ) + expect( + await active.page.evaluate( + (knowledgeBaseId) => window.deepchat.invoke('knowledge.listFiles', { knowledgeBaseId }), + knowledgeBaseId + ) + ).toEqual({ files: [] }) + expect(existsSync(join(profile, 'app_db', 'KnowledgeBase', knowledgeBaseId))).toBe(true) + } + expect(await active.close()).toBe('graceful') + expect(readFileSync(join(profile, 'app_db', 'chat.db'))).toEqual(sourceBytes) + active = await launchApp() + await waitForAppReady(active.page) + expect( + ( + await active.page.evaluate( + (sessionId) => window.deepchat.invoke('sessions.restore', { sessionId, limit: 30 }), + legacySessionId + ) + ).session?.title + ).toBe('Imported storage fixture') + expect( + await active.page.evaluate(() => window.deepchat.invoke('config.getSyncSettings', {})) + ).toMatchObject({ enabled: true, folderPath: backupDirectory }) + if (supported.supported) { + expect( + await active.page.evaluate( + (knowledgeBaseId) => window.deepchat.invoke('knowledge.listFiles', { knowledgeBaseId }), + knowledgeBaseId + ) + ).toEqual({ files: [] }) + } + expect(await active.close()).toBe('graceful') +}) diff --git a/test/e2e/specs/72-native-configuration-projection.smoke.spec.ts b/test/e2e/specs/72-native-configuration-projection.smoke.spec.ts new file mode 100644 index 0000000000..d2771d2749 --- /dev/null +++ b/test/e2e/specs/72-native-configuration-projection.smoke.spec.ts @@ -0,0 +1,145 @@ +import { readFileSync } from 'node:fs' +import { join, resolve } from 'node:path' +import { test, expect } from '../fixtures/electronApp' +import { waitForAppReady } from '../helpers/wait' + +type NativeReadFixture = { + shortcuts: string[] + channels: (string | null)[] + restore(): void +} + +test.use({ privacyModeEnabled: true }) + +test('native settings readers observe acknowledged changes and persisted floating bounds @smoke', async ({ + launchApp +}) => { + let active = await launchApp() + await waitForAppReady(active.page) + expect(active.ownsUserDataDir).toBe(true) + const profile = active.userDataDir + await active.electronApp.evaluate(({ globalShortcut }, packageJson) => { + const require = process.getBuiltinModule('node:module').createRequire(packageJson) + const { autoUpdater } = require('electron-updater') as typeof import('electron-updater') + const register = globalShortcut.register + const check = autoUpdater.checkForUpdates + const fixture: NativeReadFixture = { + shortcuts: [], + channels: [], + restore() { + globalShortcut.register = register + autoUpdater.checkForUpdates = check + } + } + globalShortcut.register = (accelerator) => { + fixture.shortcuts.push(accelerator) + return true + } + autoUpdater.checkForUpdates = async () => { + fixture.channels.push(autoUpdater.channel) + return null + } + ;( + globalThis as typeof globalThis & { nativeReadFixture: NativeReadFixture } + ).nativeReadFixture = fixture + }, resolve('package.json')) + try { + const shortcuts = ( + await active.page.evaluate(() => window.deepchat.invoke('config.getShortcutKeys', {})) + ).shortcuts + const accelerator = 'CommandOrControl+Shift+F12' + await active.page.evaluate( + (shortcuts) => window.deepchat.invoke('config.setShortcutKeys', { shortcuts }), + { ...shortcuts, ShowHideWindow: accelerator } + ) + await active.page.evaluate(() => window.deepchat.invoke('shortcut.register', {})) + for (const channel of ['stable', 'beta'] as const) { + expect( + await active.page.evaluate( + (channel) => window.deepchat.invoke('config.setUpdateChannel', { channel }), + channel + ) + ).toEqual({ channel }) + await active.page.evaluate(() => + window.deepchat.invoke('upgrade.check', { type: 'manualCheck' }) + ) + } + const reads = await active.electronApp.evaluate(() => { + const fixture = (globalThis as typeof globalThis & { nativeReadFixture: NativeReadFixture }) + .nativeReadFixture + return { shortcuts: fixture.shortcuts, channels: fixture.channels } + }) + expect(reads.shortcuts).toContain(accelerator) + expect(reads.channels).toEqual(['latest', 'beta']) + + await active.page.evaluate(() => + window.deepchat.invoke('config.setFloatingButton', { enabled: true }) + ) + await expect + .poll(() => active!.electronApp.windows().some((page) => page.url().includes('/floating/'))) + .toBe(true) + const widget = active.electronApp.windows().find((page) => page.url().includes('/floating/'))! + await widget.waitForFunction(() => + Boolean((window as unknown as { floatingButtonAPI?: unknown }).floatingButtonAPI) + ) + await widget.evaluate(() => { + const api = ( + window as unknown as { + floatingButtonAPI: { + onDragStart(x: number, y: number): void + onDragMove(x: number, y: number): void + onDragEnd(x: number, y: number): void + } + } + ).floatingButtonAPI + api.onDragStart(100, 100) + api.onDragMove(140, 170) + api.onDragEnd(140, 170) + }) + const readSettings = () => JSON.parse(readFileSync(join(profile, 'app-settings.json'), 'utf8')) + await expect.poll(() => readSettings().floatingButtonBounds?.y).toEqual(expect.any(Number)) + const bounds = readSettings().floatingButtonBounds + expect(Number.isFinite(bounds.x)).toBe(true) + expect(['left', 'right']).toContain(bounds.dockSide) + await active.page.evaluate(() => + window.deepchat.invoke('config.setFloatingButton', { enabled: false }) + ) + await active.page.evaluate(() => + window.deepchat.invoke('config.setFloatingButton', { enabled: true }) + ) + await expect + .poll(() => active!.electronApp.windows().some((page) => page.url().includes('/floating/'))) + .toBe(true) + // The reopened native window reads the committed resting position from the private projection. + await expect + .poll(() => + active!.electronApp.evaluate( + ({ BrowserWindow }) => + BrowserWindow.getAllWindows() + .find((window) => window.webContents.getURL().includes('/floating/')) + ?.getBounds().y + ) + ) + .toBe(bounds.y) + await active.page.evaluate(() => + window.deepchat.invoke('config.setFloatingButton', { enabled: false }) + ) + } finally { + await active.electronApp.evaluate(() => + ( + globalThis as typeof globalThis & { nativeReadFixture: NativeReadFixture } + ).nativeReadFixture.restore() + ) + } + expect(await active.close()).toBe('graceful') + active = await launchApp() + await waitForAppReady(active.page) + expect( + await active.page.evaluate(() => window.deepchat.invoke('config.getUpdateChannel', {})) + ).toEqual({ channel: 'beta' }) + expect( + (await active.page.evaluate(() => window.deepchat.invoke('config.getShortcutKeys', {}))) + .shortcuts.ShowHideWindow + ).toBe('CommandOrControl+Shift+F12') + expect(await active.close()).toBe('graceful') +}) diff --git a/test/e2e/specs/73-remote-native-auth.smoke.spec.ts b/test/e2e/specs/73-remote-native-auth.smoke.spec.ts new file mode 100644 index 0000000000..9acb72ebe3 --- /dev/null +++ b/test/e2e/specs/73-remote-native-auth.smoke.spec.ts @@ -0,0 +1,152 @@ +import { createServer } from 'node:net' +import { test, expect } from '../fixtures/electronApp' +import { waitForAppReady } from '../helpers/wait' + +type AuthFixture = { windows: number[]; restore(): void } + +test.use({ privacyModeEnabled: true }) + +test('remote login windows preserve nonce checks, native close and account relaunch @smoke', async ({ + launchApp +}) => { + let active = await launchApp() + expect(active.ownsUserDataDir).toBe(true) + await waitForAppReady(active.page) + const server = createServer() + await new Promise((resolve) => server.listen(0, '127.0.0.1', resolve)) + const address = server.address() + if (!address || typeof address === 'string') throw new Error('No callback port') + await new Promise((resolve) => server.close(() => resolve())) + const redirectUri = `http://127.0.0.1:${address.port}/remote/feishu/auth/callback` + + await active.electronApp.evaluate(({ BrowserWindow }) => { + const originalFetch = globalThis.fetch + const originalLoad = BrowserWindow.prototype.loadURL + const fixture: AuthFixture = { + windows: [], + restore() { + globalThis.fetch = originalFetch + BrowserWindow.prototype.loadURL = originalLoad + } + } + BrowserWindow.prototype.loadURL = function (url, options) { + if ( + url.startsWith('https://accounts.feishu.cn/') || + url.startsWith('https://liteapp.weixin.qq.com/') + ) { + fixture.windows.push(this.id) + return originalLoad.call(this, 'data:text/html,Remote auth fixture') + } + return originalLoad.call(this, url, options) + } + globalThis.fetch = async (input, init) => { + const url = String(input) + if (url.includes('/ilink/bot/get_bot_qrcode')) { + return Response.json({ + qrcode: 'fixture-qr', + qrcode_img_content: 'https://liteapp.weixin.qq.com/fixture' + }) + } + if (url.includes('/ilink/bot/get_qrcode_status')) { + return Response.json({ + status: 'confirmed', + ilink_bot_id: 'native-fixture-bot', + ilink_user_id: 'native-fixture-owner', + bot_token: 'disposable-native-token' + }) + } + return await originalFetch(input, init) + } + ;(globalThis as typeof globalThis & { remoteAuthFixture: AuthFixture }).remoteAuthFixture = + fixture + }) + try { + const startFeishu = () => + active.page.evaluate( + (redirectUri) => + window.deepchat.invoke('remoteControl.startFeishuAuth', { + appId: 'native-fixture', + appSecret: 'disposable-native-secret', + redirectUri + }), + redirectUri + ) + const first = await startFeishu() + const nodeAvailable = await active.electronApp.evaluate(({ BrowserWindow }) => { + const fixture = (globalThis as typeof globalThis & { remoteAuthFixture: AuthFixture }) + .remoteAuthFixture + return BrowserWindow.fromId(fixture.windows.at(-1)!)!.webContents.executeJavaScript( + "typeof require !== 'undefined' || typeof process !== 'undefined'" + ) + }) + expect(nodeAvailable).toBe(false) + const waiting = active.page.evaluate( + (sessionKey) => window.deepchat.invoke('remoteControl.waitForFeishuAuth', { sessionKey }), + first.session.sessionKey + ) + const callback = await fetch(`${redirectUri}?code=fixture-code&state=incorrect-nonce`) + expect(callback.status).toBe(400) + await callback.text() + expect((await waiting).result).toMatchObject({ + authorized: false, + messageKey: 'settings.remote.feishu.authStateMismatch' + }) + + const second = await startFeishu() + await active.electronApp.evaluate(({ BrowserWindow }) => { + const fixture = (globalThis as typeof globalThis & { remoteAuthFixture: AuthFixture }) + .remoteAuthFixture + BrowserWindow.fromId(fixture.windows.at(-1)!)!.close() + }) + expect( + ( + await active.page.evaluate( + (sessionKey) => window.deepchat.invoke('remoteControl.waitForFeishuAuth', { sessionKey }), + second.session.sessionKey + ) + ).result + ).toMatchObject({ authorized: false, messageKey: 'settings.remote.feishu.authCancelled' }) + + const login = await active.page.evaluate(() => + window.deepchat.invoke('remoteControl.startWeixinIlinkLogin', {}) + ) + expect( + ( + await active.page.evaluate( + (sessionKey) => + window.deepchat.invoke('remoteControl.waitForWeixinIlinkLogin', { sessionKey }), + login.session.sessionKey + ) + ).result + ).toMatchObject({ + connected: true, + account: { accountId: 'native-fixture-bot', ownerUserId: 'native-fixture-owner' } + }) + await expect + .poll(() => + active.electronApp.evaluate(({ BrowserWindow }) => { + const fixture = (globalThis as typeof globalThis & { remoteAuthFixture: AuthFixture }) + .remoteAuthFixture + return fixture.windows.some((id) => BrowserWindow.fromId(id) !== null) + }) + ) + .toBe(false) + } finally { + await active.electronApp.evaluate(() => + ( + globalThis as typeof globalThis & { remoteAuthFixture: AuthFixture } + ).remoteAuthFixture.restore() + ) + } + expect(await active.close()).toBe('graceful') + active = await launchApp() + await waitForAppReady(active.page) + const settings = await active.page.evaluate(() => + window.deepchat.invoke('remoteControl.getChannelSettings', { channel: 'weixin-ilink' }) + ) + expect(settings.settings).toMatchObject({ + remoteEnabled: false, + accounts: [{ accountId: 'native-fixture-bot', ownerUserId: 'native-fixture-owner' }] + }) + expect(await active.close()).toBe('graceful') +}) diff --git a/test/e2e/specs/74-provider-oauth-owner.smoke.spec.ts b/test/e2e/specs/74-provider-oauth-owner.smoke.spec.ts new file mode 100644 index 0000000000..38dc7be3e7 --- /dev/null +++ b/test/e2e/specs/74-provider-oauth-owner.smoke.spec.ts @@ -0,0 +1,142 @@ +import { test, expect } from '../fixtures/electronApp' +import { waitForAppReady } from '../helpers/wait' + +type CopilotFixture = { + mode: 'accept' | 'hold' + entered: boolean + release(): void +} + +test.use({ privacyModeEnabled: true }) + +test('Copilot sign-in acknowledges current credentials and rejects stale configuration @smoke', async ({ + launchApp +}) => { + let active = await launchApp() + expect(active.ownsUserDataDir).toBe(true) + await waitForAppReady(active.page) + const provider = ( + await active.page.evaluate(() => window.deepchat.invoke('providers.list', {})) + ).providers.find((entry) => entry.apiType === 'github-copilot') + if (!provider) throw new Error('Missing built-in GitHub Copilot provider') + await active.page.evaluate( + (provider) => + window.deepchat.invoke('providers.setById', { providerId: provider.id, provider }), + { ...provider, apiKey: 'saved-disposable-token', enable: false } + ) + + await active.electronApp.evaluate(({ BrowserWindow, clipboard, shell }) => { + const originalFetch = globalThis.fetch + const originalLoad = BrowserWindow.prototype.loadURL + let release: (() => void) | undefined + const fixture: CopilotFixture = { + mode: 'accept', + entered: false, + release() { + release?.() + } + } + BrowserWindow.prototype.loadURL = function (url, options) { + const loading = originalLoad.call(this, url, options) + if (url.startsWith('data:') && url.includes('GitHub%20Copilot%20Device%20Authentication')) { + void loading.then(() => { + if (!this.isDestroyed()) this.close() + }) + } + return loading + } + clipboard.writeText = () => {} + shell.openExternal = async () => {} + globalThis.fetch = async (input, init) => { + const url = String(input) + if (url === 'https://github.com/login/device/code') + return Response.json({ + device_code: 'disposable-device', + user_code: 'TEST-CODE', + verification_uri: 'https://github.com/login/device', + expires_in: 900, + interval: 1 + }) + if (url === 'https://github.com/login/oauth/access_token') + return Response.json({ access_token: 'new-disposable-token' }) + if (url === 'https://api.github.com/copilot_internal/v2/token') { + fixture.entered = true + if (fixture.mode === 'hold') + await new Promise((resolve) => { + release = resolve + }) + return Response.json({ token: 'disposable-copilot-session', expires_at: 2_000_000_000 }) + } + return await originalFetch(input, init) + } + ;(globalThis as typeof globalThis & { copilotFixture: CopilotFixture }).copilotFixture = fixture + }) + try { + expect( + await active.page.evaluate( + (providerId) => + window.deepchat.invoke('oauth.githubCopilot.startDeviceFlowLogin', { providerId }), + provider.id + ) + ).toEqual({ success: true }) + const readProvider = async () => + ( + await active.page.evaluate(() => window.deepchat.invoke('providers.list', {})) + ).providers.find((entry) => entry.id === provider.id)! + expect((await readProvider()).apiKey).toBe('new-disposable-token') + + await active.electronApp.evaluate(() => { + const fixture = (globalThis as typeof globalThis & { copilotFixture: CopilotFixture }) + .copilotFixture + fixture.mode = 'hold' + fixture.entered = false + }) + const login = active.page.evaluate( + (providerId) => + window.deepchat.invoke('oauth.githubCopilot.startDeviceFlowLogin', { providerId }), + provider.id + ) + const stale = expect(login).rejects.toThrow('configuration changed') + await expect + .poll(() => + active.electronApp.evaluate( + () => + (globalThis as typeof globalThis & { copilotFixture: CopilotFixture }).copilotFixture + .entered + ) + ) + .toBe(true) + const current = await readProvider() + await active.page.evaluate( + (provider) => + window.deepchat.invoke('providers.setById', { providerId: provider.id, provider }), + { ...current, name: 'Current Copilot', apiKey: 'newer-disposable-token' } + ) + await active.electronApp.evaluate(() => + ( + globalThis as typeof globalThis & { copilotFixture: CopilotFixture } + ).copilotFixture.release() + ) + await stale + expect(await readProvider()).toMatchObject({ + name: 'Current Copilot', + apiKey: 'newer-disposable-token', + enable: false + }) + } finally { + await active.electronApp.evaluate(() => + ( + globalThis as typeof globalThis & { copilotFixture: CopilotFixture } + ).copilotFixture.release() + ) + expect(await active.close()).toBe('graceful') + } + active = await launchApp() + await waitForAppReady(active.page) + expect( + (await active.page.evaluate(() => window.deepchat.invoke('providers.list', {}))).providers.find( + (entry) => entry.id === provider.id + ) + ).toMatchObject({ name: 'Current Copilot', apiKey: 'newer-disposable-token', enable: false }) + expect(await active.close()).toBe('graceful') +}) diff --git a/test/e2e/specs/75-ocr-cache-key.smoke.spec.ts b/test/e2e/specs/75-ocr-cache-key.smoke.spec.ts new file mode 100644 index 0000000000..ffbe5cfd9a --- /dev/null +++ b/test/e2e/specs/75-ocr-cache-key.smoke.spec.ts @@ -0,0 +1,64 @@ +import { existsSync, readFileSync } from 'node:fs' +import { join } from 'node:path' +import { test, expect } from '../fixtures/electronApp' +import { openSettings } from '../helpers/settings' +import { waitForAppReady } from '../helpers/wait' + +test.use({ privacyModeEnabled: true }) + +test('OCR cache keeps native key ownership and encryption across relaunch @smoke', async ({ + launchApp +}, testInfo) => { + let active = await launchApp() + expect(active.ownsUserDataDir).toBe(true) + const clearCache = async () => { + await waitForAppReady(active.page) + const settings = await openSettings(active) + return settings.evaluate(async (node) => { + await window.deepchat.invoke('toolchains.setSource', { + kind: 'node', + selection: { source: 'custom', customPath: node } + }) + const status = await window.deepchat.invoke('ocr.getRuntimeStatus', {}) + if (status.availability.status !== 'available') + throw new Error(`OCR runtime is unavailable: ${status.availability.reason}`) + const { cache } = await window.deepchat.invoke('ocr.clearCache', {}) + return cache + }, process.execPath) + } + const first = await clearCache() + const nativeEncryptionAvailable = await active.electronApp.evaluate(({ safeStorage }) => + safeStorage.isEncryptionAvailable() + ) + if (process.platform !== 'linux' && nativeEncryptionAvailable) + expect(first.mode).toBe('persistent') + expect(first.entryCount).toBe(0) + const keyPath = join(active.userDataDir, 'ocr', 'cache-key.json') + const databasePath = join(active.userDataDir, 'ocr', 'ocr-cache.db') + let wrappedKey: Buffer | null = null + if (first.mode === 'persistent') { + expect(existsSync(keyPath)).toBe(true) + expect( + readFileSync(databasePath).subarray(0, 16).equals(Buffer.from('SQLite format 3\0')) + ).toBe(false) + wrappedKey = readFileSync(keyPath) + } else { + expect(first.persistenceUnavailableReason).toBe('safe_storage_unavailable') + expect(existsSync(databasePath)).toBe(false) + } + expect(await active.close()).toBe('graceful') + active = await launchApp() + const second = await clearCache() + expect(second.mode).toBe(first.mode) + expect(second.entryCount).toBe(0) + if (wrappedKey) expect(readFileSync(keyPath).equals(wrappedKey)).toBe(true) + expect(await active.close()).toBe('graceful') + await testInfo.attach('ocr-cache-ownership.json', { + body: JSON.stringify({ + mode: first.mode, + relaunchMode: second.mode, + nativeEncryptionAvailable + }), + contentType: 'application/json' + }) +}) diff --git a/test/e2e/specs/76-deeplink-owner.smoke.spec.ts b/test/e2e/specs/76-deeplink-owner.smoke.spec.ts new file mode 100644 index 0000000000..2702650dfe --- /dev/null +++ b/test/e2e/specs/76-deeplink-owner.smoke.spec.ts @@ -0,0 +1,51 @@ +import { test, expect } from '../fixtures/electronApp' +import { waitForAppReady } from '../helpers/wait' + +test.use({ privacyModeEnabled: true }) + +test('OS provider deeplinks observe existing providers and preserve saved credentials @smoke', async ({ + app +}) => { + await waitForAppReady(app.page) + const provider = await app.page.evaluate(async () => { + const id = `custom-${crypto.randomUUID()}` + return ( + await window.deepchat.invoke('providers.add', { + provider: { + id, + name: 'Deep link owner fixture', + apiType: 'openai-completions', + baseUrl: 'https://saved.example.com/v1', + apiKey: 'saved-only-fixture-key', + enable: false, + custom: true, + customModels: [] + } + }) + ).provider + }) + const baseUrl = 'https://incoming.example.com/v1' + const payload = Buffer.from( + JSON.stringify({ id: provider.id, baseUrl, apiKey: 'incoming-only-fixture-key' }) + ).toString('base64') + const link = `deepchat://provider/install?v=1&data=${encodeURIComponent(payload)}` + await app.electronApp.evaluate(({ app }, link) => { + app.emit('open-url', { preventDefault() {}, defaultPrevented: false }, link) + }, link) + await expect + .poll(() => + app.electronApp.windows().some((page) => page.url().includes('/settings/index.html')) + ) + .toBe(true) + const settings = app.electronApp + .windows() + .find((page) => page.url().includes('/settings/index.html'))! + await expect(settings.getByTestId('settings-provider-page')).toBeVisible() + await expect(settings.getByText(baseUrl, { exact: true })).toBeVisible() + const saved = ( + await app.page.evaluate(() => window.deepchat.invoke('providers.list', {})) + ).providers.find((item) => item.id === provider.id) + expect(saved?.apiKey).toBe('saved-only-fixture-key') + expect(saved?.baseUrl).toBe('https://saved.example.com/v1') + expect(app.pageErrors).toEqual([]) +}) diff --git a/test/helpers/memoryStore.ts b/test/helpers/memoryStore.ts new file mode 100644 index 0000000000..1d41038ce1 --- /dev/null +++ b/test/helpers/memoryStore.ts @@ -0,0 +1,26 @@ +import type { StoreLike } from '../../src/main/config/storeLike' + +export function createMemoryStore = Record>( + initial: TStore = {} as TStore +): StoreLike { + const data: Record = structuredClone(initial) + return { + get store() { + return { ...data } as TStore + }, + get(key: string, defaultValue?: TValue): TValue { + return (data[key] === undefined ? defaultValue : data[key]) as TValue + }, + set(keyOrValues: string | Record, value?: unknown) { + if (typeof keyOrValues === 'string') data[keyOrValues] = value + else Object.assign(data, keyOrValues) + }, + delete(key: string) { + delete data[key] + }, + has: (key) => Object.hasOwn(data, key), + clear() { + for (const key of Object.keys(data)) delete data[key] + } + } +} diff --git a/test/helpers/pluginToolPolicies.ts b/test/helpers/pluginToolPolicies.ts new file mode 100644 index 0000000000..dce14400d3 --- /dev/null +++ b/test/helpers/pluginToolPolicies.ts @@ -0,0 +1,11 @@ +import { PluginToolPolicyStore, type StoredToolPolicy } from '../../src/main/plugin/toolPolicyStore' + +export function createPluginToolPolicies(): PluginToolPolicyStore { + let policies: StoredToolPolicy[] = [] + return new PluginToolPolicyStore({ + get: () => structuredClone(policies), + set: (_key, next) => { + policies = structuredClone(next) + } + }) +} diff --git a/test/helpers/providerEnvironment.ts b/test/helpers/providerEnvironment.ts new file mode 100644 index 0000000000..fd1e9c1a1c --- /dev/null +++ b/test/helpers/providerEnvironment.ts @@ -0,0 +1,8 @@ +import { buildDefaultProviderHeaders } from '../../src/main/provider/providerHeaders' +import type { ProviderEnvironmentPort } from '../../src/main/provider/ports' + +export const providerTestEnvironment: ProviderEnvironmentPort = { + getLanguage: () => 'en-US', + defaultHeaders: Object.freeze(buildDefaultProviderHeaders('0.0.0-test')), + allowInsecureTls: false +} diff --git a/test/main/agent/acp/catalog/acpRegistryService.test.ts b/test/main/agent/acp/catalog/acpRegistryService.test.ts index 9b408ae3a6..64b4e2f15c 100644 --- a/test/main/agent/acp/catalog/acpRegistryService.test.ts +++ b/test/main/agent/acp/catalog/acpRegistryService.test.ts @@ -2,10 +2,12 @@ import * as fs from 'node:fs' import * as os from 'node:os' import * as path from 'node:path' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' +import { + AcpRegistryService, + type AcpRegistryServiceOptions +} from '@/agent/acp/catalog/acpRegistryService' -const mockGetPath = vi.fn() -const mockGetAppPath = vi.fn() -const mockNetFetch = vi.fn() +const mockFetchIcon = vi.fn() vi.mock('fs', async () => { const actual = await vi.importActual('node:fs') @@ -16,16 +18,6 @@ vi.mock('fs', async () => { } }) -vi.mock('electron', () => ({ - app: { - getPath: mockGetPath, - getAppPath: mockGetAppPath - }, - net: { - fetch: mockNetFetch - } -})) - type RegistryManifestFixture = { version: string agents: Array<{ @@ -54,10 +46,13 @@ describe('AcpRegistryService', () => { let appRoot: string let userDataRoot: string - const importService = async () => { - const mod = await import('@/agent/acp/catalog/acpRegistryService') - return mod.AcpRegistryService - } + const createService = (options: Partial = {}) => + new AcpRegistryService({ + userDataDirectory: userDataRoot, + builtInDirectory: path.join(appRoot, 'resources', 'acp-registry'), + fetchIcon: mockFetchIcon, + ...options + }) const writeBuiltInIcon = (agentId: string, markup: string) => { const iconDir = path.join(appRoot, 'resources', 'acp-registry', 'icons') @@ -95,14 +90,7 @@ describe('AcpRegistryService', () => { fs.mkdirSync(appRoot, { recursive: true }) fs.mkdirSync(userDataRoot, { recursive: true }) - mockGetPath.mockImplementation((name: string) => { - if (name === 'userData') { - return userDataRoot - } - return userDataRoot - }) - mockGetAppPath.mockReturnValue(appRoot) - mockNetFetch.mockReset() + mockFetchIcon.mockReset() vi.unstubAllGlobals() }) @@ -118,8 +106,7 @@ describe('AcpRegistryService', () => { '' ) - const AcpRegistryService = await importService() - const service = new AcpRegistryService() + const service = createService() const markup = await service.getIconMarkup( 'claude-acp', @@ -128,7 +115,7 @@ describe('AcpRegistryService', () => { expect(markup).toContain('focusable="false"') expect(markup).toContain('color="currentColor"') - expect(mockNetFetch).not.toHaveBeenCalled() + expect(mockFetchIcon).not.toHaveBeenCalled() }) it('skips the automatic registry refresh when privacy mode is enabled', async () => { @@ -138,12 +125,12 @@ describe('AcpRegistryService', () => { const globalFetch = vi.fn() vi.stubGlobal('fetch', globalFetch) - const AcpRegistryService = await importService() - const service = new AcpRegistryService({ + const service = createService({ isPrivacyModeEnabled: () => true }) - await service.initialize() + service.initialize() + await service.refresh(false, { automatic: true }) expect(globalFetch).not.toHaveBeenCalled() expect(service.listAgents()).toHaveLength(1) @@ -171,8 +158,7 @@ describe('AcpRegistryService', () => { ] }) - const AcpRegistryService = await importService() - const service = new AcpRegistryService({ + const service = createService({ isPrivacyModeEnabled: () => true }) @@ -207,8 +193,7 @@ describe('AcpRegistryService', () => { ] }) - const AcpRegistryService = await importService() - const service = new AcpRegistryService({ + const service = createService({ isPrivacyModeEnabled: () => true }) @@ -229,21 +214,15 @@ describe('AcpRegistryService', () => { }) vi.stubGlobal('fetch', globalFetch) - mockNetFetch.mockResolvedValue({ - ok: true, - text: vi - .fn() - .mockResolvedValue( - '' - ) - }) + mockFetchIcon.mockResolvedValue( + '' + ) const staleIconDir = path.join(userDataRoot, 'acp-registry', 'icons') fs.mkdirSync(staleIconDir, { recursive: true }) fs.writeFileSync(path.join(staleIconDir, 'obsolete.svg'), '', 'utf-8') - const AcpRegistryService = await importService() - const service = new AcpRegistryService() + const service = createService() await service.refresh(true) @@ -252,7 +231,7 @@ describe('AcpRegistryService', () => { const markup = await service.getIconMarkup('claude-acp', manifest.agents[0].icon) expect(markup).toContain('currentColor') - expect(mockNetFetch).toHaveBeenCalledTimes(1) + expect(mockFetchIcon).toHaveBeenCalledTimes(1) }) it('keeps manual refresh available while privacy mode is enabled', async () => { @@ -265,24 +244,18 @@ describe('AcpRegistryService', () => { }) vi.stubGlobal('fetch', globalFetch) - mockNetFetch.mockResolvedValue({ - ok: true, - text: vi - .fn() - .mockResolvedValue( - '' - ) - }) + mockFetchIcon.mockResolvedValue( + '' + ) - const AcpRegistryService = await importService() - const service = new AcpRegistryService({ + const service = createService({ isPrivacyModeEnabled: () => true }) await service.refresh(true) expect(globalFetch).toHaveBeenCalledTimes(1) - expect(mockNetFetch).toHaveBeenCalledTimes(1) + expect(mockFetchIcon).toHaveBeenCalledTimes(1) }) it('preserves existing cached icon when refreshing a new icon fails', async () => { @@ -298,14 +271,9 @@ describe('AcpRegistryService', () => { const oldMarkup = '' fs.writeFileSync(path.join(iconDir, 'claude-acp.svg'), oldMarkup, 'utf-8') - mockNetFetch.mockResolvedValue({ - ok: false, - status: 503, - statusText: 'Service Unavailable' - }) + mockFetchIcon.mockRejectedValue(new Error('Service Unavailable')) - const AcpRegistryService = await importService() - const service = new AcpRegistryService() + const service = createService() await service.refresh(true) @@ -320,23 +288,125 @@ describe('AcpRegistryService', () => { version: '1', agents: [createManifest('claude-acp').agents[0], createManifest('claude-acp').agents[0]] } - const emptyAppRoot = path.join(tempRoot, 'empty-app-root') - const emptyCwd = path.join(tempRoot, 'empty-cwd') - fs.mkdirSync(emptyAppRoot, { recursive: true }) - fs.mkdirSync(emptyCwd, { recursive: true }) - mockGetAppPath.mockReturnValue(emptyAppRoot) - vi.spyOn(process, 'cwd').mockReturnValue(emptyCwd) const globalFetch = vi.fn().mockResolvedValue({ ok: true, text: vi.fn().mockResolvedValue(JSON.stringify(duplicateManifest)) }) vi.stubGlobal('fetch', globalFetch) - const AcpRegistryService = await importService() - const service = new AcpRegistryService() + const service = createService() await expect(service.refresh(true)).rejects.toThrow( '[ACP Registry] No registry snapshot is available.' ) }) + + it('loads the local catalog without starting detached network work', async () => { + const manifest = createManifest() + delete manifest.agents[0].icon + writeBuiltInManifest(manifest) + const fetch = vi.fn().mockResolvedValue(new Response(JSON.stringify(manifest))) + vi.stubGlobal('fetch', fetch) + const service = createService() + + service.initialize() + expect(service.listAgents()[0].id).toBe('claude-acp') + expect(fetch).not.toHaveBeenCalled() + await service.refresh(false, { automatic: true }) + expect(fetch).toHaveBeenCalledOnce() + }) + + it.each(['shutdown', 'task cancellation'])( + 'drains a held refresh and rejects late writes after %s', + async (reason) => { + const initial = createManifest('initial') + writeBuiltInManifest(initial) + const service = createService() + service.initialize() + const cache = path.join(userDataRoot, 'acp-registry', 'registry.json') + const meta = path.join(userDataRoot, 'acp-registry', 'meta.json') + fs.writeFileSync(cache, JSON.stringify(initial)) + fs.writeFileSync(meta, JSON.stringify({ version: '1', lastUpdated: 1 })) + const original = [cache, meta].map((file) => fs.readFileSync(file, 'utf8')) + let release!: (response: Response) => void + let requestSignal!: AbortSignal + const fetch = vi.fn((_url: string, options: { signal: AbortSignal }) => { + requestSignal = options.signal + return new Promise((resolve) => { + release = resolve + }) + }) + vi.stubGlobal('fetch', fetch) + const caller = new AbortController() + const refresh = service.refresh(true, { signal: caller.signal }) + const rejected = expect(refresh).rejects.toMatchObject({ name: 'AbortError' }) + const joined = expect(service.refresh(true)).rejects.toMatchObject({ name: 'AbortError' }) + expect(fetch).toHaveBeenCalledOnce() + if (reason === 'shutdown') service.stop() + else caller.abort() + expect(requestSignal.aborted).toBe(true) + let drained = false + const drain = service.drain().then(() => { + drained = true + }) + await Promise.resolve() + expect(drained).toBe(false) + release(new Response(JSON.stringify(createManifest('late')))) + await Promise.all([rejected, joined, drain]) + expect([cache, meta].map((file) => fs.readFileSync(file, 'utf8'))).toEqual(original) + expect(service.listAgents()[0].id).toBe('initial') + + if (reason === 'task cancellation') { + const next = createManifest('fresh') + delete next.agents[0].icon + fetch.mockResolvedValue(new Response(JSON.stringify(next))) + expect((await service.refresh(true))[0].id).toBe('fresh') + } else { + await expect(service.refresh(true)).rejects.toMatchObject({ name: 'AbortError' }) + expect(fetch).toHaveBeenCalledOnce() + } + } + ) + + it.each(['manifest body', 'icon body'])( + 'fences a late %s and preserves the committed catalog on shutdown', + async (phase) => { + const initial = createManifest('initial') + writeBuiltInManifest(initial) + const service = createService() + service.initialize() + const cache = path.join(userDataRoot, 'acp-registry', 'registry.json') + fs.writeFileSync(cache, JSON.stringify(initial)) + const original = fs.readFileSync(cache, 'utf8') + let release!: (text: string) => void + let entered!: () => void + const started = new Promise((resolve) => { + entered = resolve + }) + const held = () => { + entered() + return new Promise((resolve) => { + release = resolve + }) + } + const next = createManifest('late') + vi.stubGlobal( + 'fetch', + vi.fn().mockResolvedValue({ + ok: true, + text: phase === 'manifest body' ? held : async () => JSON.stringify(next) + }) + ) + mockFetchIcon.mockImplementation(held) + const rejected = expect(service.refresh(true)).rejects.toMatchObject({ name: 'AbortError' }) + await started + service.stop() + release(phase === 'manifest body' ? JSON.stringify(next) : '') + await Promise.all([rejected, service.drain()]) + expect(fs.readFileSync(cache, 'utf8')).toBe(original) + expect(fs.existsSync(path.join(userDataRoot, 'acp-registry', 'icons', 'late.svg'))).toBe( + false + ) + } + ) }) diff --git a/test/main/agent/acp/catalog/settings.test.ts b/test/main/agent/acp/catalog/settings.test.ts index 97f8da6d64..5e1a1180f6 100644 --- a/test/main/agent/acp/catalog/settings.test.ts +++ b/test/main/agent/acp/catalog/settings.test.ts @@ -1,44 +1,21 @@ import { beforeEach, describe, expect, it, vi } from 'vitest' -const mockStores = vi.hoisted(() => new Map>()) - -const clone = (value: T): T => JSON.parse(JSON.stringify(value)) as T - -vi.mock('electron-store', () => ({ - default: class MockElectronStore { - private readonly data: Record - - constructor(options: { name: string; defaults?: Record }) { - if (!mockStores.has(options.name)) { - mockStores.set(options.name, clone(options.defaults ?? {})) - } - this.data = mockStores.get(options.name)! - } - - get(key: string) { - return this.data[key] - } - - set(key: string, value: any) { - this.data[key] = value - } - - delete(key: string) { - delete this.data[key] - } - } -})) - -vi.mock('@/mcp/settings', () => ({ - McpSettings: class MockMcpSettings { - async getMcpServers() { - return { - github: { type: 'stdio' }, - memory: { type: 'inmemory' } - } - } - } -})) +import { createMemoryStore } from '../../../../helpers/memoryStore' + +const mockStores = new Map>() +const github = { + command: 'fixture', + args: [], + env: {}, + descriptions: '', + icons: '', + disable: false, + enabled: true, + type: 'stdio' as const +} +const mcpSettings = { + getMcpServers: async () => ({ github, memory: { ...github, type: 'inmemory' as const } }) +} describe('AcpCatalogSettings registry-first migration', () => { beforeEach(() => { @@ -88,9 +65,12 @@ describe('AcpCatalogSettings registry-first migration', () => { ] }) - const { AcpCatalogSettings } = await import('@/agent/acp/catalog/settings') - const { McpSettings } = await import('@/mcp/settings') - const helper = new AcpCatalogSettings({ mcpSettings: new McpSettings() }) + const { AcpCatalogSettings, createAcpCatalogDefaults } = + await import('@/agent/acp/catalog/settings') + const helper = new AcpCatalogSettings({ + mcpSettings, + store: createMemoryStore(mockStores.get('acp_agents') ?? createAcpCatalogDefaults()) + }) expect(helper.getAgentState('kimi')).toEqual( expect.objectContaining({ @@ -113,15 +93,23 @@ describe('AcpCatalogSettings registry-first migration', () => { expect(helper.getSharedMcpSelections()).toEqual(['github']) }) - it('persists registry env overrides and validates shared MCP selections', async () => { - const { AcpCatalogSettings } = await import('@/agent/acp/catalog/settings') - const { McpSettings } = await import('@/mcp/settings') - const helper = new AcpCatalogSettings({ mcpSettings: new McpSettings() }) - - helper.setAgentEnvOverride('claude-code-acp', { - ANTHROPIC_AUTH_TOKEN: 'token', - EMPTY_LINE: '' + it('normalizes legacy registry env overrides and validates shared MCP selections', async () => { + mockStores.set('acp_agents', { + version: '4', + registryStates: { + 'claude-code-acp': { + agentId: 'claude-code-acp', + envOverride: { ANTHROPIC_AUTH_TOKEN: 'token', EMPTY_LINE: '' } + } + } + }) + const { AcpCatalogSettings, createAcpCatalogDefaults } = + await import('@/agent/acp/catalog/settings') + const helper = new AcpCatalogSettings({ + mcpSettings, + store: createMemoryStore(mockStores.get('acp_agents') ?? createAcpCatalogDefaults()) }) + await helper.setAgentMcpSelections('claude-code-acp', true, ['github', 'memory']) expect(helper.getAgentState('claude-acp')).toEqual( @@ -167,9 +155,12 @@ describe('AcpCatalogSettings registry-first migration', () => { } }) - const { AcpCatalogSettings } = await import('@/agent/acp/catalog/settings') - const { McpSettings } = await import('@/mcp/settings') - const helper = new AcpCatalogSettings({ mcpSettings: new McpSettings() }) + const { AcpCatalogSettings, createAcpCatalogDefaults } = + await import('@/agent/acp/catalog/settings') + const helper = new AcpCatalogSettings({ + mcpSettings, + store: createMemoryStore(mockStores.get('acp_agents') ?? createAcpCatalogDefaults()) + }) expect(helper.getSharedMcpSelections()).toEqual(['github', 'legacy-extra']) expect(helper.getAgentState('claude-acp')).toEqual( diff --git a/test/main/agent/acp/launch/acpLaunchSpecService.test.ts b/test/main/agent/acp/launch/acpLaunchSpecService.test.ts index a27a048b94..0b849e9831 100644 --- a/test/main/agent/acp/launch/acpLaunchSpecService.test.ts +++ b/test/main/agent/acp/launch/acpLaunchSpecService.test.ts @@ -42,6 +42,200 @@ describe('AcpLaunchSpecService', () => { return new AcpLaunchSpecService(dir) } + const binaryAgent = () => ({ + id: 'owned-agent', + name: 'Owned agent', + version: '1.0.0', + distribution: { + binary: { + [getCurrentPlatformKey()]: { + archive: 'https://example.com/owned-agent.zip', + cmd: './owned-agent' + } + } + }, + source: 'registry' as const, + enabled: false + }) + + const deferred = () => { + let resolve!: (value: T) => void + const promise = new Promise((settle) => { + resolve = settle + }) + return { promise, resolve } + } + + it('coalesces explicit and implicit installs and serializes a queued repair', async () => { + const service = createService() + const agent = binaryAgent() + const body = deferred() + const entered = deferred() + const archive = zipSync({ 'owned-agent': Buffer.from('binary') }) + const fetchMock = vi + .fn() + .mockImplementationOnce(async () => ({ + ok: true, + arrayBuffer: () => { + entered.resolve() + return body.promise + } + })) + .mockImplementation(async () => new Response(archive)) + vi.stubGlobal('fetch', fetchMock) + + const first = service.ensureRegistryAgentInstalled(agent, null) + await entered.promise + const second = service.ensureRegistryAgentInstalled(agent, null) + const launch = service.resolveRegistryLaunchSpec(agent, null) + const repair = service.ensureRegistryAgentInstalled(agent, null, { repair: true }) + expect(fetchMock).toHaveBeenCalledTimes(1) + body.resolve(archive) + const [installed, shared, resolved, repaired] = await Promise.all([ + first, + second, + launch, + repair + ]) + expect(shared).toEqual(installed) + expect(resolved.command).toBe(path.join(installed.installDir!, 'owned-agent')) + expect(repaired.status).toBe('installed') + expect(fetchMock).toHaveBeenCalledTimes(2) + }) + + it.each(['headers', 'body'])( + 'drains actual canceled %s and permits a fresh owner operation', + async (phase) => { + const service = createService() + const agent = binaryAgent() + const entered = deferred() + const release = deferred() + const archive = zipSync({ 'owned-agent': Buffer.from('binary') }) + vi.stubGlobal( + 'fetch', + vi.fn(async () => { + if (phase === 'headers') { + entered.resolve() + await release.promise + } + return { + ok: true, + arrayBuffer: async () => { + if (phase === 'body') { + entered.resolve() + await release.promise + } + return archive + } + } + }) + ) + const rejected = expect( + service.ensureRegistryAgentInstalled(agent, null) + ).rejects.toMatchObject({ name: 'AbortError' }) + await entered.promise + service.cancelPendingInstallations() + let drained = false + const drain = service.drain().then(() => { + drained = true + }) + await Promise.resolve() + expect(drained).toBe(false) + release.resolve() + await Promise.all([rejected, drain]) + expect(fs.existsSync(path.join(tempDirs[0], 'agents', agent.id, agent.version))).toBe(false) + expect(fs.readdirSync(path.join(tempDirs[0], 'agents', agent.id))).toEqual([]) + const state = await service.ensureRegistryAgentInstalled(agent, null) + expect(state.status).toBe('installed') + } + ) + + it('rejects new work after stop and waits for an uncancelable body before cleanup', async () => { + const service = createService() + const agent = binaryAgent() + const entered = deferred() + const body = deferred() + vi.stubGlobal( + 'fetch', + vi.fn(async () => ({ + ok: true, + arrayBuffer: () => { + entered.resolve() + return body.promise + } + })) + ) + const rejected = expect( + service.ensureRegistryAgentInstalled(agent, null) + ).rejects.toMatchObject({ name: 'AbortError' }) + await entered.promise + service.stop() + let drained = false + const drain = service.drain().then(() => { + drained = true + }) + await expect(service.ensureRegistryAgentInstalled(agent, null)).rejects.toMatchObject({ + name: 'AbortError' + }) + expect(drained).toBe(false) + body.resolve(zipSync({ 'owned-agent': Buffer.from('late') })) + await Promise.all([rejected, drain]) + expect(fs.readdirSync(path.join(tempDirs[0], 'agents', agent.id))).toEqual([]) + }) + + it('keeps the acknowledged binary when a staged repair fails validation', async () => { + const service = createService() + const agent = binaryAgent() + vi.stubGlobal( + 'fetch', + vi.fn(async () => new Response(zipSync({ 'owned-agent': Buffer.from('original') }))) + ) + const original = await service.ensureRegistryAgentInstalled(agent, null) + vi.stubGlobal( + 'fetch', + vi.fn(async () => new Response(zipSync({ 'wrong-agent': Buffer.from('bad') }))) + ) + const repaired = await service.ensureRegistryAgentInstalled(agent, original, { repair: true }) + expect(repaired.status).toBe('error') + expect(fs.readFileSync(path.join(original.installDir!, 'owned-agent'), 'utf8')).toBe('original') + expect(fs.readdirSync(path.dirname(original.installDir!))).toEqual([agent.version]) + fs.renameSync(original.installDir!, `${original.installDir}.prev`) + const restored = await service.ensureRegistryAgentInstalled(agent, original) + expect(restored.status).toBe('installed') + expect(fs.readFileSync(path.join(restored.installDir!, 'owned-agent'), 'utf8')).toBe('original') + }) + + it('prevents canceled installs and queued repairs from recreating an uninstalled binary', async () => { + const service = createService() + const agent = binaryAgent() + const entered = deferred() + const body = deferred() + vi.stubGlobal( + 'fetch', + vi.fn(async () => ({ + ok: true, + arrayBuffer: () => { + entered.resolve() + return body.promise + } + })) + ) + const install = expect(service.ensureRegistryAgentInstalled(agent, null)).rejects.toMatchObject( + { name: 'AbortError' } + ) + await entered.promise + const repair = expect( + service.ensureRegistryAgentInstalled(agent, null, { repair: true }) + ).rejects.toMatchObject({ name: 'AbortError' }) + const uninstall = service.uninstallRegistryAgent(agent, null) + await expect(service.ensureRegistryAgentInstalled(agent, null)).rejects.toThrow( + 'uninstall is in progress' + ) + body.resolve(zipSync({ 'owned-agent': Buffer.from('late') })) + await Promise.all([install, repair, uninstall, service.drain()]) + expect(fs.existsSync(path.join(tempDirs[0], 'agents', agent.id))).toBe(false) + }) + it('prefers binary over npx and uvx for preview generation', () => { const service = createService() const platformKey = getCurrentPlatformKey() @@ -230,8 +424,9 @@ describe('AcpLaunchSpecService', () => { }) expect(timeoutSpy).toHaveBeenCalledWith(120_000) expect(fetchMock).toHaveBeenCalledWith('https://example.com/codex.zip', { - signal: timeoutSignal + signal: expect.any(AbortSignal) }) + expect(fetchMock.mock.calls[0][1]?.signal?.aborted).toBe(true) }) it('uninstalls binary registry agents by removing the install directory', async () => { diff --git a/test/main/agent/acp/runtime/acpProcessManager.test.ts b/test/main/agent/acp/runtime/acpProcessManager.test.ts index 57d971b84a..a1cd71f1d8 100644 --- a/test/main/agent/acp/runtime/acpProcessManager.test.ts +++ b/test/main/agent/acp/runtime/acpProcessManager.test.ts @@ -19,13 +19,6 @@ const childProcessRegistryMock = vi.hoisted(() => ({ reapStaleOnce: vi.fn().mockResolvedValue(null) })) -vi.mock('electron', () => ({ - app: { - getVersion: vi.fn(() => '0.0.0-test'), - getPath: vi.fn(() => '/tmp') - } -})) - vi.mock('cross-spawn', () => ({ default: vi.fn() })) @@ -80,8 +73,29 @@ describe('parseLoadSessionCapability', () => { describe('AcpProcessManager config cache fallback', () => { const normalizePathValue = (value: string) => value.replace(/\\/g, '/') + it.each(['homeDirectory', 'temporaryDirectory'])( + 'rejects a relative bootstrap %s before acquiring process resources', + (key) => { + expect( + () => + new AcpProcessManager({ + bootstrap: { + appVersion: '0.0.0-test', + homeDirectory: '/tmp', + temporaryDirectory: '/tmp', + [key]: 'relative-profile' + }, + publishEvent: publishDeepchatEventMock, + providerId: 'acp', + resolveLaunchSpec: vi.fn() + }) + ).toThrow('ACP bootstrap directories must be absolute') + } + ) + const createManager = () => new AcpProcessManager({ + bootstrap: { appVersion: '0.0.0-test', homeDirectory: '/tmp', temporaryDirectory: '/tmp' }, publishEvent: publishDeepchatEventMock, providerId: 'acp', resolveLaunchSpec: vi.fn().mockResolvedValue({ @@ -123,10 +137,7 @@ describe('AcpProcessManager config cache fallback', () => { ] }) - const createProcessHandle = ( - child: MockSpawnedChild, - state: 'warmup' | 'bound' = 'warmup' - ) => { + const createProcessHandle = (child: MockSpawnedChild, state: 'warmup' | 'bound' = 'warmup') => { Object.defineProperty(child, 'pid', { value: undefined }) return { providerId: 'acp', @@ -224,9 +235,9 @@ describe('AcpProcessManager config cache fallback', () => { const second = manager.createAuthChallenge(handle as any, { origin: 'settings_probe' }) await manager.prepareTerminalAuthentication(first.id, 'browser-login') - await expect( - manager.prepareTerminalAuthentication(second.id, 'browser-login') - ).rejects.toThrow('already running for this agent and workdir') + await expect(manager.prepareTerminalAuthentication(second.id, 'browser-login')).rejects.toThrow( + 'already running for this agent and workdir' + ) manager.abandonAuthentication(first.id) await expect( @@ -338,6 +349,7 @@ describe('AcpProcessManager config cache fallback', () => { it('does not expose terminal methods as supported when the capability is disabled', () => { const manager = new AcpProcessManager({ + bootstrap: { appVersion: '0.0.0-test', homeDirectory: '/tmp', temporaryDirectory: '/tmp' }, publishEvent: publishDeepchatEventMock, providerId: 'acp', resolveLaunchSpec: vi.fn().mockResolvedValue({ @@ -364,6 +376,7 @@ describe('AcpProcessManager config cache fallback', () => { it('rejects terminal authentication when the capability is disabled', async () => { const manager = new AcpProcessManager({ + bootstrap: { appVersion: '0.0.0-test', homeDirectory: '/tmp', temporaryDirectory: '/tmp' }, publishEvent: publishDeepchatEventMock, providerId: 'acp', resolveLaunchSpec: vi.fn(), @@ -699,6 +712,7 @@ describe('AcpProcessManager config cache fallback', () => { cwd: '/tmp/workspace' } const manager = new AcpProcessManager({ + bootstrap: { appVersion: '0.0.0-test', homeDirectory: '/tmp', temporaryDirectory: '/tmp' }, publishEvent: publishDeepchatEventMock, providerId: 'acp', resolveLaunchSpec: vi.fn().mockResolvedValue(launchSpec), @@ -713,14 +727,6 @@ describe('AcpProcessManager config cache fallback', () => { vi.spyOn(shellEnvHelper, 'getShellEnvironment').mockResolvedValue({ PATH: '/shell/bin' }) - vi.spyOn((manager as any).runtimeHelper, 'expandPath').mockImplementation( - (value: string) => value - ) - vi.spyOn((manager as any).runtimeHelper, 'getDefaultPaths').mockReturnValue(['/default/bin']) - vi.spyOn((manager as any).runtimeHelper, 'isInstalledInSystemDirectory').mockReturnValue( - false - ) - vi.spyOn((manager as any).runtimeHelper, 'getUserNpmPrefix').mockReturnValue(null) existsSpy = vi.spyOn(fs, 'existsSync').mockReturnValue(true) statSpy = vi.spyOn(fs, 'statSync').mockReturnValue({ isDirectory: () => true @@ -780,9 +786,6 @@ describe('AcpProcessManager config cache fallback', () => { vi.spyOn(shellEnvHelper, 'getShellEnvironment').mockResolvedValue({ PATH: '/shell/bin' }) - vi.spyOn((manager as any).runtimeHelper, 'expandPath').mockImplementation( - (value: string) => value - ) try { await expect( @@ -1091,6 +1094,7 @@ describe('AcpProcessManager child process launch records', () => { const createManager = () => new AcpProcessManager({ + bootstrap: { appVersion: '0.0.0-test', homeDirectory: '/tmp', temporaryDirectory: '/tmp' }, publishEvent: publishDeepchatEventMock, providerId: 'acp', resolveLaunchSpec: vi.fn() @@ -1113,9 +1117,12 @@ describe('AcpProcessManager child process launch records', () => { it('waits for orphan recovery before spawning an agent', async () => { let finishRecovery!: () => void - childProcessRegistryMock.reapStaleOnce.mockImplementationOnce(() => new Promise((resolve) => { - finishRecovery = resolve - })) + childProcessRegistryMock.reapStaleOnce.mockImplementationOnce( + () => + new Promise((resolve) => { + finishRecovery = resolve + }) + ) const manager = createManager() const child = new MockSpawnedChild() vi.mocked(spawn).mockReturnValue(child as never) diff --git a/test/main/agent/acp/runtime/acpProcessManagerCapabilities.test.ts b/test/main/agent/acp/runtime/acpProcessManagerCapabilities.test.ts index bbc3409737..72b30d8c24 100644 --- a/test/main/agent/acp/runtime/acpProcessManagerCapabilities.test.ts +++ b/test/main/agent/acp/runtime/acpProcessManagerCapabilities.test.ts @@ -29,13 +29,6 @@ const sdkMock = vi.hoisted(() => ({ } })) -vi.mock('electron', () => ({ - app: { - getVersion: vi.fn(() => '0.0.0-test'), - getPath: vi.fn(() => '/tmp') - } -})) - const childProcessRegistryMock = vi.hoisted(() => ({ record: vi.fn(), clear: vi.fn(), @@ -64,6 +57,7 @@ describe('AcpProcessManager initialized capabilities', () => { sdkMock.initialize.mockClear() const { AcpProcessManager } = await import('@/agent/acp/runtime/acpProcessManager') const manager = new AcpProcessManager({ + bootstrap: { appVersion: '0.0.0-test', homeDirectory: '/tmp', temporaryDirectory: '/tmp' }, publishEvent: vi.fn(), providerId: 'acp', resolveLaunchSpec: vi.fn(), @@ -122,7 +116,9 @@ describe('AcpProcessManager initialized capabilities', () => { expect(handle.supportsSessionClose).toBe(true) expect(handle.supportsSessionFork).toBe(true) expect(handle.authMethods).toEqual([{ id: 'terminal', name: 'Terminal', type: 'terminal' }]) - const clientCapabilities = sdkMock.initialize.mock.calls.at(-1)?.[0].clientCapabilities + const initialize = sdkMock.initialize.mock.calls.at(-1)?.[0] + expect(initialize.clientInfo).toEqual({ name: 'DeepChat', version: '0.0.0-test' }) + const clientCapabilities = initialize.clientCapabilities if (terminalAuthAvailable) expect(clientCapabilities.auth).toEqual({ terminal: true }) else expect(clientCapabilities.auth).toBeUndefined() const received = vi.fn() diff --git a/test/main/agent/acp/runtime/acpSessionPersistence.test.ts b/test/main/agent/acp/runtime/acpSessionPersistence.test.ts index d9a1297dec..9c38dfaf8a 100644 --- a/test/main/agent/acp/runtime/acpSessionPersistence.test.ts +++ b/test/main/agent/acp/runtime/acpSessionPersistence.test.ts @@ -1,6 +1,5 @@ import * as path from 'path' import * as fs from 'fs' -import { app } from 'electron' import { beforeEach, describe, expect, it, vi } from 'vitest' import { AcpSessionPersistence } from '@/agent/acp/runtime' import type { AcpSessionEntity } from '@shared/types/acp' @@ -13,12 +12,6 @@ const createProjectDatabase = () => ({ } }) -vi.mock('electron', () => ({ - app: { - getPath: vi.fn(() => '/home/tester') - } -})) - describe('AcpSessionPersistence remote session sync', () => { beforeEach(() => { const usableDirectories = new Set([process.cwd(), path.dirname(process.cwd()), '/home/tester']) @@ -42,10 +35,18 @@ describe('AcpSessionPersistence remote session sync', () => { database as never, database as never, projectDatabase as never, + '/home/tester', notifyEnvironmentProjectionChanged ) - await persistence.saveSessionData('conversation-1', 'agent-1', 'remote-1' as never, null, 'idle', null) + await persistence.saveSessionData( + 'conversation-1', + 'agent-1', + 'remote-1' as never, + null, + 'idle', + null + ) expect(projectDatabase.newEnvironmentsTable.syncPath).toHaveBeenCalledWith('/work/project') expect(notifyEnvironmentProjectionChanged).toHaveBeenCalledTimes(1) @@ -54,19 +55,17 @@ describe('AcpSessionPersistence remote session sync', () => { it('falls back from missing persisted workdirs to the default workdir', () => { const homeDir = process.cwd() const missingDir = path.join(homeDir, 'missing-workdir-for-acp-test') - vi.mocked(app.getPath).mockReturnValue(homeDir) const database = {} as MainDatabase const persistence = new AcpSessionPersistence( database as never, database as never, - createProjectDatabase() as never + createProjectDatabase() as never, + homeDir ) expect(persistence.isWorkdirUsable(missingDir)).toBe(false) expect(persistence.resolveWorkdir(missingDir)).toBe(homeDir) - - vi.mocked(app.getPath).mockReturnValue('/home/tester') }) it('imports remote sessions once and updates the existing link on later syncs', async () => { @@ -112,7 +111,8 @@ describe('AcpSessionPersistence remote session sync', () => { const persistence = new AcpSessionPersistence( sqlitePresenter as never, sqlitePresenter as never, - createProjectDatabase() as never + createProjectDatabase() as never, + '/home/tester' ) const input = { agentId: 'agent-1', @@ -226,7 +226,8 @@ describe('AcpSessionPersistence remote session sync', () => { const persistence = new AcpSessionPersistence( sqlitePresenter as never, sqlitePresenter as never, - createProjectDatabase() as never + createProjectDatabase() as never, + '/home/tester' ) const input = { agentId: 'agent-1', @@ -296,7 +297,8 @@ describe('AcpSessionPersistence remote session sync', () => { const persistence = new AcpSessionPersistence( sqlitePresenter as never, sqlitePresenter as never, - createProjectDatabase() as never + createProjectDatabase() as never, + '/home/tester' ) const result = await persistence.syncRemoteSessions({ @@ -348,7 +350,8 @@ describe('AcpSessionPersistence remote session sync', () => { const persistence = new AcpSessionPersistence( sqlitePresenter as never, sqlitePresenter as never, - createProjectDatabase() as never + createProjectDatabase() as never, + '/home/tester' ) await expect( @@ -435,7 +438,8 @@ describe('AcpSessionPersistence remote session sync', () => { const persistence = new AcpSessionPersistence( sqlitePresenter as never, sqlitePresenter as never, - createProjectDatabase() as never + createProjectDatabase() as never, + '/home/tester' ) const firstMerge = persistence.mergeMetadata('conv-1', 'agent-1', { first: true }) @@ -455,7 +459,6 @@ describe('AcpSessionPersistence remote session sync', () => { it('keeps remote cwd metadata while using a local fallback for missing imported workdirs', async () => { const fallbackDir = process.cwd() const remoteMissingDir = path.join(fallbackDir, 'remote-missing') - vi.mocked(app.getPath).mockReturnValue(fallbackDir) const sqlitePresenter = { getAcpSessionByAgentAndSessionId: vi.fn(async () => null), @@ -465,45 +468,42 @@ describe('AcpSessionPersistence remote session sync', () => { const persistence = new AcpSessionPersistence( sqlitePresenter as never, sqlitePresenter as never, - createProjectDatabase() as never + createProjectDatabase() as never, + fallbackDir ) - try { - await persistence.syncRemoteSessions({ - agentId: 'agent-1', - agentName: 'Agent One', - providerId: 'acp', - workdir: remoteMissingDir, - sessions: [ - { - sessionId: 'remote-1', - cwd: remoteMissingDir, - title: 'Remote title' - } - ] - }) + await persistence.syncRemoteSessions({ + agentId: 'agent-1', + agentName: 'Agent One', + providerId: 'acp', + workdir: remoteMissingDir, + sessions: [ + { + sessionId: 'remote-1', + cwd: remoteMissingDir, + title: 'Remote title' + } + ] + }) - expect(sqlitePresenter.createConversation).toHaveBeenCalledWith( - 'Remote title', - expect.objectContaining({ - agentWorkspacePath: fallbackDir, - acpWorkdirMap: { 'agent-1': fallbackDir } - }) - ) - expect(sqlitePresenter.upsertAcpSession).toHaveBeenCalledWith( - 'conv-imported', - 'agent-1', - expect.objectContaining({ - workdir: fallbackDir, - metadata: expect.objectContaining({ - remoteSession: expect.objectContaining({ - cwd: remoteMissingDir - }) + expect(sqlitePresenter.createConversation).toHaveBeenCalledWith( + 'Remote title', + expect.objectContaining({ + agentWorkspacePath: fallbackDir, + acpWorkdirMap: { 'agent-1': fallbackDir } + }) + ) + expect(sqlitePresenter.upsertAcpSession).toHaveBeenCalledWith( + 'conv-imported', + 'agent-1', + expect.objectContaining({ + workdir: fallbackDir, + metadata: expect.objectContaining({ + remoteSession: expect.objectContaining({ + cwd: remoteMissingDir }) }) - ) - } finally { - vi.mocked(app.getPath).mockReturnValue('/home/tester') - } + }) + ) }) }) diff --git a/test/main/agent/acp/runtime/acpTerminalManager.test.ts b/test/main/agent/acp/runtime/acpTerminalManager.test.ts index e415623a14..f5746b63b6 100644 --- a/test/main/agent/acp/runtime/acpTerminalManager.test.ts +++ b/test/main/agent/acp/runtime/acpTerminalManager.test.ts @@ -8,12 +8,6 @@ vi.mock('node-pty', () => ({ spawn: vi.fn() })) -vi.mock('electron', () => ({ - app: { - getPath: vi.fn((name: string) => (name === 'temp' ? '/tmp' : '/tmp')) - } -})) - describe('AcpTerminalManager', () => { const createPty = () => ({ onData: vi.fn(), @@ -28,7 +22,7 @@ describe('AcpTerminalManager', () => { }) it('uses the provided cwd when one is supplied', async () => { - const manager = new AcpTerminalManager() + const manager = new AcpTerminalManager('/tmp') await manager.createTerminal({ sessionId: 'session-1', @@ -46,27 +40,30 @@ describe('AcpTerminalManager', () => { }) it('falls back to a controlled temp directory when cwd is missing', async () => { - const manager = new AcpTerminalManager() + const manager = new AcpTerminalManager('/tmp/acp-owned-temp') await manager.createTerminal({ sessionId: 'session-1', command: 'pwd' }) - expect(fs.mkdirSync).toHaveBeenCalledWith(path.normalize('/tmp/deepchat-acp/terminals'), { - recursive: true - }) + expect(fs.mkdirSync).toHaveBeenCalledWith( + path.normalize('/tmp/acp-owned-temp/deepchat-acp/terminals'), + { + recursive: true + } + ) expect(spawn).toHaveBeenCalledWith( 'pwd', [], expect.objectContaining({ - cwd: expect.stringContaining(path.normalize('/tmp/deepchat-acp/terminals')) + cwd: expect.stringContaining(path.normalize('/tmp/acp-owned-temp/deepchat-acp/terminals')) }) ) }) it('passes command arguments directly without shell concatenation', async () => { - const manager = new AcpTerminalManager() + const manager = new AcpTerminalManager('/tmp') await manager.createTerminal({ sessionId: 'session-1', @@ -87,7 +84,7 @@ describe('AcpTerminalManager', () => { it('retains the latest terminal output when outputByteLimit is exceeded', async () => { const pty = createPty() vi.mocked(spawn).mockReturnValue(pty as never) - const manager = new AcpTerminalManager() + const manager = new AcpTerminalManager('/tmp') const response = await manager.createTerminal({ sessionId: 'session-1', diff --git a/test/main/agent/deepchat/harness/deepChatAgentHarness.test.ts b/test/main/agent/deepchat/harness/deepChatAgentHarness.test.ts index 28b974fe4f..2d67fe5972 100644 --- a/test/main/agent/deepchat/harness/deepChatAgentHarness.test.ts +++ b/test/main/agent/deepchat/harness/deepChatAgentHarness.test.ts @@ -1724,10 +1724,8 @@ describe('DeepChatAgentHarness', () => { }) transcriptMutations = new SessionTranscriptMutations({ transcript: sessionData.transcript, - settings: sessionData.settings, - pendingInputs: sessionData.pendingInputs, runtime: agent, - runInTransaction: (operation) => sessionData.database.getDatabase().transaction(operation)() + clearTranscript: sessionData.clearTranscript }) }) diff --git a/test/main/agent/deepchat/instance/deepChatAgentRuntime.test.ts b/test/main/agent/deepchat/instance/deepChatAgentRuntime.test.ts index af685166eb..d055be4135 100644 --- a/test/main/agent/deepchat/instance/deepChatAgentRuntime.test.ts +++ b/test/main/agent/deepchat/instance/deepChatAgentRuntime.test.ts @@ -43,6 +43,22 @@ function createRun( } describe('DeepChatAgentRuntime', () => { + it('aborts hydrated generations and deferred work without evicting or hydrating sessions', () => { + const runtime = new DeepChatAgentRuntime() + const sessionId = toAppSessionId('running') + const instance = runtime.getOrHydrate(sessionId) + const controller = new AbortController() + const run = createRun(sessionId, 'run', 'message', controller) + instance.registerActiveGeneration(run) + const deferred = instance.registerDeferredToolAbortController('tool') + runtime.abortGenerations() + expect(controller.signal.aborted).toBe(true) + expect(deferred.signal.aborted).toBe(true) + expect(runtime.getHydrated(sessionId)).toBe(instance) + expect(instance.getActiveGeneration()).toBe(run) + expect(runtime.getHydrated(toAppSessionId('missing'))).toBeUndefined() + }) + it('hydrates one stable instance per app session', () => { const runtime = new DeepChatAgentRuntime() const sessionId = toAppSessionId('session') diff --git a/test/main/agent/invocationAdmission.test.ts b/test/main/agent/invocationAdmission.test.ts index 8576939ed7..b4e69e5cda 100644 --- a/test/main/agent/invocationAdmission.test.ts +++ b/test/main/agent/invocationAdmission.test.ts @@ -5,7 +5,7 @@ import { AgentInvocationAdmissionClosedError, AgentInvocationAdmissionQueueFullError, type AgentInvocationAdmissionObservation -} from '@/agent/invocationAdmission' +} from '../../../src/harness/admission' import { BoundedNumberRing } from '@/lib/boundedNumberRing' const CORRELATION = { diff --git a/test/main/agent/settings.test.ts b/test/main/agent/settings.test.ts index 403e0cb701..ac0152af1f 100644 --- a/test/main/agent/settings.test.ts +++ b/test/main/agent/settings.test.ts @@ -4,6 +4,7 @@ import { AgentLifecycleGate } from '@/agent/lifecycleGate' import { BUILTIN_DEEPCHAT_AGENT_ID } from '@/agent/repository' import { CRON_JOB_AGENT_TOOL_NAME } from '@shared/agentTools' import type { CreateDeepChatAgentInput } from '@shared/types/agent-interface' +import type { AcpAgentInstallState } from '@shared/types/acp' const createModelSelection = (providerId: string, modelId: string) => ({ providerId, modelId }) @@ -18,6 +19,68 @@ const createDeferred = () => { } describe('AgentSettings ACP availability', () => { + it.each(['registry', 'provider'])( + 'drains the pending %s operation and fences database/events after registry stop', + async (phase) => { + const entered = createDeferred() + const previous = [{ id: 'agent-1', name: 'Agent', version: '1' }] + const updated = [{ ...previous[0], version: '2' }] + const pending = createDeferred() + const syncRegistryAgentsToRepository = vi.fn() + const notifyAcpAgentsChanged = vi.fn() + const listAcpRegistryAgents = vi.fn(async () => updated) + const registry = { + isStopped: false, + listAgents: () => previous, + refresh: vi.fn(async () => { + if (phase === 'registry') { + entered.resolve() + return pending.promise + } + return updated + }), + stop: () => { + registry.isStopped = true + }, + drain: vi.fn(async () => undefined) + } + const settings = Object.assign(Object.create(AgentSettings.prototype), { + registry, + launchSpecs: { + stop: vi.fn(), + cancelPendingInstallations: vi.fn(), + drain: vi.fn(async () => undefined) + }, + provider: { + refreshAcpProviderAgents: vi.fn(async () => { + entered.resolve() + await pending.promise + }) + }, + syncRegistryAgentsToRepository, + listAcpRegistryAgents, + notifyAcpAgentsChanged + }) as AgentSettings + const rejected = expect(settings.refreshAcpRegistry(true)).rejects.toMatchObject({ + name: 'AbortError' + }) + await entered.promise + const writes = syncRegistryAgentsToRepository.mock.calls.length + settings.stop() + let drained = false + const drain = settings.drain().then(() => { + drained = true + }) + await Promise.resolve() + expect(drained).toBe(false) + pending.resolve(updated) + await Promise.all([rejected, drain]) + expect(syncRegistryAgentsToRepository).toHaveBeenCalledTimes(writes) + expect(listAcpRegistryAgents).not.toHaveBeenCalled() + expect(notifyAcpAgentsChanged).not.toHaveBeenCalled() + } + ) + it('restores the previous state when disabling cannot stop active runtimes', async () => { const runtimeError = new Error('runtime busy') const setGlobalEnabled = vi.fn().mockReturnValue(true) @@ -113,6 +176,260 @@ describe('AgentSettings ACP registry uninstall', () => { }) }) +describe('AgentSettings ACP installation ownership', () => { + const createOwner = () => { + const agent = { id: 'owned-agent', name: 'Owned agent', version: '1', distribution: {} } + const previous: AcpAgentInstallState = { + status: 'installed', + version: '1', + distributionType: 'binary', + installDir: '/managed/agent', + installedAt: 1, + lastCheckedAt: 1, + error: null + } + let state: AcpAgentInstallState | null = structuredClone(previous) + let allowed = true + const registry = { + isStopped: false, + getAgent: () => agent, + stop: () => { + registry.isStopped = true + }, + drain: async () => undefined + } + const launchSpecs = { + selectRegistryDistribution: () => ({ type: 'binary' }), + ensureRegistryAgentInstalled: vi.fn(async () => structuredClone(previous)), + cancelPendingInstallations: vi.fn(), + stop: vi.fn(), + drain: async () => undefined + } + const provider = { + refreshAcpProviderAgents: vi.fn(async () => undefined), + clearAcpProviderModelStatus: vi.fn() + } + const repository = { + getAgentInstallState: () => (state === null ? null : structuredClone(state)), + setAgentInstallState: vi.fn((_id: string, value: AcpAgentInstallState | null) => { + state = structuredClone(value) + return true + }), + setAgentEnabled: vi.fn(), + hasAgentSessions: () => false, + clearRegistryAcpAgentInstallation: vi.fn((_id: string, value: AcpAgentInstallState) => { + state = value + return true + }) + } + const settings = Object.assign(Object.create(AgentSettings.prototype), { + registry, + repository, + provider, + launchSpecs, + assertAcpOperationAllowed: () => { + if (!allowed) throw new Error('maintenance') + }, + getRegistryAgentOrThrow: () => structuredClone(agent), + notifyAcpAgentsChanged: vi.fn() + }) as AgentSettings + return { + settings, + registry, + repository, + provider, + launchSpecs, + agent, + previous, + readState: () => state, + setAllowed: (value: boolean) => { + allowed = value + } + } + } + + it.each(['installer', 'provider'])( + 'drains a canceled %s continuation and restores acknowledged state', + async (phase) => { + const owner = createOwner() + const entered = createDeferred() + const release = createDeferred() + if (phase === 'installer') { + owner.launchSpecs.ensureRegistryAgentInstalled.mockImplementation(async () => { + entered.resolve() + await release.promise + return { ...owner.previous, installedAt: 2 } + }) + } else { + owner.provider.refreshAcpProviderAgents.mockImplementation(async () => { + entered.resolve() + await release.promise + }) + } + const rejected = expect(owner.settings.repairAcpAgent(owner.agent.id)).rejects.toMatchObject({ + name: 'AbortError' + }) + await entered.promise + expect(owner.readState()?.status).toBe('installing') + owner.settings.stop() + let drained = false + const drain = owner.settings.drain().then(() => { + drained = true + }) + await Promise.resolve() + expect(drained).toBe(false) + release.resolve() + await Promise.all([rejected, drain]) + expect(owner.readState()).toEqual(owner.previous) + await expect(owner.settings.ensureAcpAgentInstalled(owner.agent.id)).rejects.toMatchObject({ + name: 'AbortError' + }) + expect(owner.readState()).toEqual(owner.previous) + } + ) + + it('coalesces installation and recovers after maintenance without publishing late state', async () => { + const owner = createOwner() + const entered = createDeferred() + const release = createDeferred() + owner.launchSpecs.ensureRegistryAgentInstalled.mockImplementation(async () => { + entered.resolve() + await release.promise + return { ...owner.previous, installedAt: 2 } + }) + const first = expect( + owner.settings.ensureAcpAgentInstalled(owner.agent.id) + ).rejects.toMatchObject({ name: 'AbortError' }) + const second = expect( + owner.settings.ensureAcpAgentInstalled(owner.agent.id) + ).rejects.toMatchObject({ name: 'AbortError' }) + await entered.promise + expect(owner.launchSpecs.ensureRegistryAgentInstalled).toHaveBeenCalledOnce() + owner.setAllowed(false) + const drain = owner.settings.cancelAndDrainAcpWork() + release.resolve() + await Promise.all([first, second, drain]) + expect(owner.readState()).toEqual(owner.previous) + await expect(owner.settings.ensureAcpAgentInstalled(owner.agent.id)).rejects.toThrow( + 'maintenance' + ) + owner.setAllowed(true) + await expect(owner.settings.ensureAcpAgentInstalled(owner.agent.id)).resolves.toMatchObject({ + status: 'installed', + installedAt: 2 + }) + await owner.settings.drain() + }) + + it('holds uninstall admission while canceled installation continuations are settling', async () => { + const owner = createOwner() + const entered = createDeferred() + const release = createDeferred() + owner.launchSpecs.ensureRegistryAgentInstalled.mockImplementation(async () => { + entered.resolve() + await release.promise + return owner.previous + }) + Object.assign(owner.launchSpecs, { uninstallRegistryAgent: vi.fn(async () => undefined) }) + const canceled = expect( + owner.settings.ensureAcpAgentInstalled(owner.agent.id) + ).rejects.toMatchObject({ name: 'AbortError' }) + await entered.promise + const uninstall = owner.settings.uninstallAcpRegistryAgent(owner.agent.id) + await expect(owner.settings.ensureAcpAgentInstalled(owner.agent.id)).rejects.toThrow( + 'uninstall is in progress' + ) + let drained = false + const drain = owner.settings.drain().then(() => { + drained = true + }) + expect(drained).toBe(false) + release.resolve() + await Promise.all([canceled, uninstall, drain]) + expect(owner.readState()?.status).toBe('not_installed') + }) + + it('acknowledges enable promptly while retaining background install and process ownership', async () => { + const owner = createOwner() + const entered = createDeferred() + const installed = createDeferred() + const refreshed = createDeferred() + owner.launchSpecs.ensureRegistryAgentInstalled.mockImplementation(async () => { + entered.resolve() + await installed.promise + return owner.previous + }) + owner.provider.refreshAcpProviderAgents.mockImplementation(async () => { + await refreshed.promise + }) + await owner.settings.setAcpAgentEnabled(owner.agent.id, true) + await entered.promise + owner.settings.stop() + let drained = false + const drain = owner.settings.drain().then(() => { + drained = true + }) + installed.resolve() + await Promise.resolve() + expect(drained).toBe(false) + refreshed.resolve() + await drain + expect(owner.readState()).toEqual(owner.previous) + }) + + it('rejects an obsolete descriptor without acknowledging its installation result', async () => { + const owner = createOwner() + const entered = createDeferred() + const release = createDeferred() + owner.launchSpecs.ensureRegistryAgentInstalled.mockImplementation(async () => { + entered.resolve() + await release.promise + return { ...owner.previous, installedAt: 2 } + }) + const rejected = expect( + owner.settings.ensureAcpAgentInstalled(owner.agent.id) + ).rejects.toMatchObject({ name: 'AbortError' }) + await entered.promise + owner.agent.version = '2' + release.resolve() + await rejected + expect(owner.readState()).toEqual(owner.previous) + await owner.settings.drain() + }) + + it('fences the repository continuation of implicit binary launch preparation', async () => { + const owner = createOwner() + const entered = createDeferred() + const release = createDeferred() + Object.assign(owner.repository, { getManualAcpAgent: () => null }) + Object.assign(owner.launchSpecs, { + resolveRegistryLaunchSpec: async () => { + entered.resolve() + await release.promise + return { + agentId: owner.agent.id, + source: 'registry', + distributionType: 'binary', + command: '/managed/agent/binary', + args: [], + env: {}, + installDir: '/managed/agent' + } + } + }) + const rejected = expect( + owner.settings.resolveAcpLaunchSpec(owner.agent.id) + ).rejects.toMatchObject({ name: 'AbortError' }) + await entered.promise + owner.settings.stop() + const drain = owner.settings.drain() + release.resolve() + await Promise.all([rejected, drain]) + expect(owner.repository.setAgentInstallState).not.toHaveBeenCalled() + expect(owner.readState()).toEqual(owner.previous) + }) +}) + describe('AgentSettings migrations', () => { it('repairs legacy selections before materializing version 3 configs', () => { const sequence: string[] = [] @@ -713,6 +1030,8 @@ describe('AgentSettings ACP notifications', () => { it('publishes catalog, model, and session changes before refreshing processes', async () => { const sequence: string[] = [] const settings = Object.assign(Object.create(AgentSettings.prototype), { + registry: { isStopped: false }, + assertAcpOperationAllowed: () => undefined, provider: { clearAcpProviderModelStatus: vi.fn(() => sequence.push('cache-clear')), refreshAcpProviderAgents: vi.fn(async () => sequence.push('process-refresh')) @@ -773,6 +1092,7 @@ describe('AgentSettings ACP notifications', () => { const refreshed = [{ ...previous[0], description: 'After' }, previous[1]] const refreshAcpProviderAgents = vi.fn(async () => undefined) const settings = Object.assign(Object.create(AgentSettings.prototype), { + launchSpecs: { cancelPendingInstallations: vi.fn() }, registry: { listAgents: vi.fn(() => previous), refresh: vi.fn(async () => refreshed) diff --git a/test/main/agent/shared/process/backgroundExecService.test.ts b/test/main/agent/shared/process/backgroundExecService.test.ts new file mode 100644 index 0000000000..53b8b50daa --- /dev/null +++ b/test/main/agent/shared/process/backgroundExecService.test.ts @@ -0,0 +1,166 @@ +import { EventEmitter } from 'node:events' +import { describe, expect, it, vi } from 'vitest' +import { + BackgroundExecService, + type BackgroundExecRpcRequest +} from '@/agent/shared/process/backgroundExecSessionManager' +import { ResolvedCommandShellSchema } from '@shared/commandShell' + +const cleanup = vi.hoisted(() => vi.fn(async () => undefined)) +vi.mock('@/skill/skillExecutionPackageTree', () => ({ + cleanupOwnedSkillExecutionPackageTree: cleanup +})) + +const deferred = () => { + let resolve!: (value: T) => void + const promise = new Promise((settle) => { + resolve = settle + }) + return { promise, resolve } +} + +function helper() { + const host = Object.assign(new EventEmitter(), { + pid: 123, + kill: vi.fn(), + postMessage: vi.fn<(request: BackgroundExecRpcRequest) => void>(), + onMessage(listener: (message: unknown) => void) { + host.on('message', listener) + }, + onExit(listener: (code: number) => void) { + host.on('exit', listener) + }, + onError(listener: (type: string, location: string) => void) { + host.on('error', listener) + } + }) + host.postMessage.mockImplementation((request) => + queueMicrotask(() => + host.emit('message', { + type: 'background-exec:response', + id: request.id, + ok: true, + data: request.method === 'start' ? { sessionId: request.id, status: 'running' } : undefined + }) + ) + ) + return host +} + +const options = { + commandShell: ResolvedCommandShellSchema.parse({ + profile: 'posix', + dialect: 'posix', + pathStyle: 'native', + executable: '/bin/sh', + args: ['-c'], + displayName: 'sh' + }) +} +const ownedTree = { + schemaVersion: 1 as const, + rootPath: '/managed/package', + ownershipToken: 'owned', + packageHash: 'hash', + files: [] +} + +describe('Background execution ownership', () => { + it('shares pending helper startup and rejects terminal restart', async () => { + const ready = deferred>() + const spawn = vi.fn(() => ready.promise) + const owner = new BackgroundExecService(spawn) + const first = owner.start('a', 'first', '/workspace', options) + const second = owner.start('b', 'second', '/workspace', options) + await vi.waitFor(() => expect(spawn).toHaveBeenCalledOnce()) + ready.resolve(helper()) + const sessions = await Promise.all([first, second]) + expect(sessions[0].sessionId).not.toBe(sessions[1].sessionId) + await owner.shutdown() + await expect(owner.start('c', 'late', '/workspace', options)).rejects.toMatchObject({ + name: 'AbortError' + }) + await expect(owner.list('a')).rejects.toMatchObject({ name: 'AbortError' }) + expect(spawn).toHaveBeenCalledOnce() + }) + + it('waits for a late uncancelable spawn and package cleanup without posting ownership', async () => { + const ready = deferred>() + const cleaned = deferred() + cleanup.mockImplementationOnce(async () => { + await cleaned.promise + }) + let signal: AbortSignal | undefined + const owner = new BackgroundExecService(async (value) => { + signal = value + return ready.promise + }) + const rejected = expect( + owner.start('a', 'late', '/workspace', { + ...options, + ownedSkillExecutionPackageTree: ownedTree + }) + ).rejects.toMatchObject({ name: 'AbortError' }) + await vi.waitFor(() => expect(signal).toBeDefined()) + let stopped = false + const stop = owner.shutdown().then(() => { + stopped = true + }) + expect(signal?.aborted).toBe(true) + expect(stopped).toBe(false) + const host = helper() + ready.resolve(host) + await vi.waitFor(() => expect(cleanup).toHaveBeenCalled()) + expect(stopped).toBe(false) + expect(host.kill).toHaveBeenCalledOnce() + expect(host.postMessage).not.toHaveBeenCalled() + cleaned.resolve() + await Promise.all([rejected, stop]) + }) + + it('drains a held authority callback and fences dispatch after shutdown', async () => { + const host = helper() + const entered = deferred(), + release = deferred() + const owner = new BackgroundExecService(async () => host) + const rejected = expect( + owner.start('a', 'guarded', '/workspace', options, async () => { + entered.resolve() + await release.promise + }) + ).rejects.toMatchObject({ name: 'AbortError' }) + await entered.promise + let stopped = false + const stop = owner.shutdown().then(() => { + stopped = true + }) + await vi.waitFor(() => expect(host.kill).toHaveBeenCalledOnce()) + expect(stopped).toBe(false) + expect(host.postMessage.mock.calls.map(([request]) => request.method)).toEqual(['shutdown']) + release.resolve() + await Promise.all([rejected, stop]) + }) + + it('ignores an obsolete host exit after recovery starts a replacement', async () => { + const old = helper(), + current = helper() + const spawn = vi.fn().mockResolvedValueOnce(old).mockResolvedValueOnce(current) + const owner = new BackgroundExecService(spawn) + await owner.start('a', 'first', '/workspace', options) + old.emit('exit', 1) + const next = await owner.start('a', 'second', '/workspace', options) + old.emit('exit', 2) + old.emit('message', { + type: 'background-exec:response', + id: next.sessionId, + ok: true, + data: 'obsolete' + }) + await owner.kill('a', next.sessionId) + expect(current.postMessage.mock.calls.map(([request]) => request.method)).toEqual([ + 'start', + 'kill' + ]) + await owner.shutdown() + }) +}) diff --git a/test/main/agent/shared/process/backgroundExecSessionManager.test.ts b/test/main/agent/shared/process/backgroundExecSessionManager.test.ts index aa4aaead6e..311ebf3fb5 100644 --- a/test/main/agent/shared/process/backgroundExecSessionManager.test.ts +++ b/test/main/agent/shared/process/backgroundExecSessionManager.test.ts @@ -5,13 +5,13 @@ import fs from 'fs' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' const { - mockUtilityProcessFork, + mockSpawnHost, mockAssertPackageTree, mockCleanupPackageTree, mockTerminateProcessTree, registryMock } = vi.hoisted(() => ({ - mockUtilityProcessFork: vi.fn(), + mockSpawnHost: vi.fn(), mockAssertPackageTree: vi.fn(), mockCleanupPackageTree: vi.fn(), mockTerminateProcessTree: vi.fn(), @@ -26,22 +26,6 @@ vi.mock('child_process', () => ({ spawn: vi.fn() })) -vi.mock('electron', () => ({ - app: { - getAppPath: vi.fn(() => '/mock/app'), - getPath: vi.fn((name: string) => (name === 'userData' ? '/mock/userData' : '/mock/home')) - }, - utilityProcess: { - fork: mockUtilityProcessFork - } -})) - -vi.mock('@electron-toolkit/utils', () => ({ - is: { - dev: false - } -})) - vi.mock('@shared/logger', () => ({ default: { info: vi.fn(), @@ -65,7 +49,7 @@ vi.mock('@/agent/shared/process/childProcessRegistry', () => ({ import { BackgroundExecSessionManager, - backgroundExecSessionManager + BackgroundExecService } from '@/agent/shared/process/backgroundExecSessionManager' import { CMD_COMMAND_SHELL, @@ -91,6 +75,15 @@ class MockChildProcess extends EventEmitter { } class MockUtilityProcess extends EventEmitter { + onMessage(listener: (message: unknown) => void): void { + this.on('message', listener) + } + onExit(listener: (code: number) => void): void { + this.on('exit', listener) + } + onError(listener: (type: string, location: string) => void): void { + this.on('error', listener) + } postMessage = vi.fn() kill = vi.fn() } @@ -132,7 +125,7 @@ describe('BackgroundExecSessionManager', () => { beforeEach(() => { manager = new BackgroundExecSessionManager() clearInterval((manager as never).cleanupIntervalId) - mockUtilityProcessFork.mockReset() + mockSpawnHost.mockReset() mockAssertPackageTree.mockResolvedValue(undefined) mockCleanupPackageTree.mockResolvedValue(undefined) mockTerminateProcessTree.mockResolvedValue(true) @@ -883,57 +876,22 @@ describe('BackgroundExecSessionManager', () => { }) describe('backgroundExecSessionManager utility proxy', () => { - const resetProxyState = () => { - const proxy = backgroundExecSessionManager as any - proxy.stopCompletedSessionReconciliation() - proxy.host = null - proxy.hostReady = null - proxy.shuttingDown = false - proxy.activeSessions.clear() - proxy.completedSessions.clear() - proxy.crashedSessions.clear() - proxy.pendingRequests.clear() - } + let backgroundExecSessionManager: BackgroundExecService beforeEach(() => { - mockUtilityProcessFork.mockReset() + mockSpawnHost.mockReset() mockAssertPackageTree.mockResolvedValue(undefined) mockCleanupPackageTree.mockResolvedValue(undefined) mockTerminateProcessTree.mockResolvedValue(true) - resetProxyState() + backgroundExecSessionManager = new BackgroundExecService(mockSpawnHost) }) afterEach(() => { - resetProxyState() + ;(backgroundExecSessionManager as any).stopCompletedSessionReconciliation() vi.useRealTimers() vi.restoreAllMocks() }) - it('forks the dedicated entrypoint for the utility host', async () => { - const host = new MockUtilityProcess() - mockUtilityProcessFork.mockReturnValue(host) - - const startPromise = (backgroundExecSessionManager as any).startHost() - await vi.waitFor(() => { - expect(mockUtilityProcessFork).toHaveBeenCalled() - }) - host.emit('spawn') - - await expect(startPromise).resolves.toBe(host) - expect(mockUtilityProcessFork).toHaveBeenCalledWith( - expect.stringMatching( - /[\\/]mock[\\/]app[\\/]out[\\/]main[\\/]backgroundExecUtilityHost\.js$/ - ), - ['--deepchat-exec-utility-host'], - expect.objectContaining({ - serviceName: 'DeepChat Exec Utility', - env: expect.objectContaining({ - DEEPCHAT_EXEC_UTILITY_HOST: '1' - }) - }) - ) - }) - it('cleans an owned tree when utility ownership was never posted', async () => { const proxy = backgroundExecSessionManager as any const descriptor = ownedPackageTree() @@ -1056,7 +1014,7 @@ describe('backgroundExecSessionManager utility proxy', () => { timedOut: false } }) - expect(mockUtilityProcessFork).not.toHaveBeenCalled() + expect(mockSpawnHost).not.toHaveBeenCalled() }) it('keeps completed sessions visible when the utility host cannot list them', async () => { @@ -1093,7 +1051,7 @@ describe('backgroundExecSessionManager utility proxy', () => { ]) expect(request).toHaveBeenCalledOnce() expect(request).toHaveBeenCalledWith('poll', ['conv-1', 'bg_completed']) - expect(mockUtilityProcessFork).not.toHaveBeenCalled() + expect(mockSpawnHost).not.toHaveBeenCalled() }) it('refreshes completed-session fallback metadata after clearing output', async () => { @@ -1174,7 +1132,7 @@ describe('backgroundExecSessionManager utility proxy', () => { await backgroundExecSessionManager.remove('conv-1', 'bg_crashed') expect(proxy.crashedSessions.has('bg_crashed')).toBe(false) - expect(mockUtilityProcessFork).not.toHaveBeenCalled() + expect(mockSpawnHost).not.toHaveBeenCalled() }) it('rejects unknown proxy mutations before committing dispatch', async () => { @@ -1185,7 +1143,7 @@ describe('backgroundExecSessionManager utility proxy', () => { ).rejects.toThrow('Session missing not found') expect(beforeMutation).not.toHaveBeenCalled() - expect(mockUtilityProcessFork).not.toHaveBeenCalled() + expect(mockSpawnHost).not.toHaveBeenCalled() }) it('commits tracked proxy writes before the utility-host request', async () => { @@ -1331,10 +1289,10 @@ describe('backgroundExecSessionManager utility proxy', () => { }) const firstHost = new MockUtilityProcess() const secondHost = new MockUtilityProcess() - mockUtilityProcessFork.mockReturnValueOnce(firstHost).mockReturnValueOnce(secondHost) + mockSpawnHost.mockReturnValueOnce(firstHost).mockReturnValueOnce(secondHost) const firstStart = proxy.startHost() - await vi.waitFor(() => expect(mockUtilityProcessFork).toHaveBeenCalledTimes(1)) + await vi.waitFor(() => expect(mockSpawnHost).toHaveBeenCalledTimes(1)) firstHost.emit('spawn') await firstStart expect(proxy.completedSessionReconciliationTimer).not.toBeNull() @@ -1344,7 +1302,7 @@ describe('backgroundExecSessionManager utility proxy', () => { expect(proxy.completedSessionReconciliationTimer).toBeNull() const secondStart = proxy.startHost() - await vi.waitFor(() => expect(mockUtilityProcessFork).toHaveBeenCalledTimes(2)) + await vi.waitFor(() => expect(mockSpawnHost).toHaveBeenCalledTimes(2)) secondHost.emit('spawn') await secondStart diff --git a/test/main/app/backgroundExecHost.test.ts b/test/main/app/backgroundExecHost.test.ts new file mode 100644 index 0000000000..ce8a13a150 --- /dev/null +++ b/test/main/app/backgroundExecHost.test.ts @@ -0,0 +1,121 @@ +import { EventEmitter } from 'node:events' +import path from 'node:path' +import { beforeEach, describe, expect, it, vi } from 'vitest' +import { spawnBackgroundExecHost } from '@/app/backgroundExecHost' +import type { BackgroundExecRpcRequest } from '@/agent/shared/process/backgroundExecSessionManager' + +const mocks = vi.hoisted(() => ({ fork: vi.fn() })) +vi.mock('electron', () => ({ utilityProcess: { fork: mocks.fork } })) + +describe('Background exec native launch', () => { + const entry = path.resolve('out/main/backgroundExecUtilityHost.js') + beforeEach(() => { + mocks.fork.mockReset() + }) + + function nativeHost() { + const host = Object.assign(new EventEmitter(), { + pid: 123, + postMessage: vi.fn(), + kill: vi.fn() + }) + host.kill.mockImplementation(() => { + host.emit('exit', 0) + return true + }) + mocks.fork.mockReturnValue(host) + return host + } + + it('launches the approved entry and exposes a plain command/event/lifecycle channel', async () => { + const host = nativeHost() + const pending = spawnBackgroundExecHost(entry, new AbortController().signal) + host.emit('spawn') + const channel = await pending + expect(channel).not.toBe(host) + expect(channel.pid).toBe(123) + expect(mocks.fork).toHaveBeenCalledWith( + entry, + ['--deepchat-exec-utility-host'], + expect.objectContaining({ + serviceName: 'DeepChat Exec Utility', + env: expect.objectContaining({ DEEPCHAT_EXEC_UTILITY_HOST: '1' }) + }) + ) + const message = vi.fn(), + exit = vi.fn(), + error = vi.fn() + channel.onMessage(message) + channel.onExit(exit) + channel.onError(error) + const request: BackgroundExecRpcRequest = { + type: 'background-exec:request', + id: '1', + method: 'list', + args: ['conversation'] + } + channel.postMessage(request) + host.emit('message', { type: 'background-exec:response', id: '1', ok: true, data: [] }) + host.emit('error', 'crash', 'helper') + expect(host.postMessage).toHaveBeenCalledWith(request) + expect(message).toHaveBeenCalledWith({ + type: 'background-exec:response', + id: '1', + ok: true, + data: [] + }) + expect(error).toHaveBeenCalledWith('crash', 'helper') + expect(channel.kill()).toBeUndefined() + expect(exit).toHaveBeenCalledWith(0) + }) + + it('rejects relative paths and already canceled launches before forking', async () => { + const canceled = AbortSignal.abort() + await expect(spawnBackgroundExecHost(entry, canceled)).rejects.toMatchObject({ + name: 'AbortError' + }) + await expect( + spawnBackgroundExecHost('relative.js', new AbortController().signal) + ).rejects.toThrow('must be absolute') + expect(mocks.fork).not.toHaveBeenCalled() + }) + + it.each(['pending', 'during-fork'])( + 'kills a %s canceled launch and detaches startup listeners', + async (phase) => { + const host = nativeHost() + const owner = new AbortController() + if (phase === 'during-fork') + mocks.fork.mockImplementationOnce(() => { + owner.abort() + return host + }) + const rejected = expect(spawnBackgroundExecHost(entry, owner.signal)).rejects.toMatchObject({ + name: 'AbortError' + }) + owner.abort() + await rejected + expect(host.kill).toHaveBeenCalledOnce() + for (const event of ['spawn', 'exit', 'error']) expect(host.listenerCount(event)).toBe(0) + host.emit('spawn') + expect(host.postMessage).not.toHaveBeenCalled() + } + ) + + it.each(['exit', 'error'])( + 'rejects a native %s before readiness and releases startup listeners', + async (event) => { + const host = nativeHost() + const rejected = expect( + spawnBackgroundExecHost(entry, new AbortController().signal) + ).rejects.toThrow( + event === 'exit' ? 'exited before spawn: 1' : 'helper error: crash at startup' + ) + if (event === 'exit') host.emit('exit', 1) + else host.emit('error', 'crash', 'startup') + await rejected + expect(host.kill).toHaveBeenCalledOnce() + for (const name of ['spawn', 'exit', 'error']) expect(host.listenerCount(name)).toBe(0) + } + ) +}) diff --git a/test/main/app/codeModeHost.test.ts b/test/main/app/codeModeHost.test.ts new file mode 100644 index 0000000000..c0951e5c78 --- /dev/null +++ b/test/main/app/codeModeHost.test.ts @@ -0,0 +1,131 @@ +import { EventEmitter } from 'node:events' +import path from 'node:path' +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' +import { spawnCodeModeHost } from '@/app/codeModeHost' +import { RUN_CODE_PROTOCOL_VERSION, type RunCodeParentMessage } from '@shared/codeModeProtocol' + +const mocks = vi.hoisted(() => ({ fork: vi.fn(), metrics: vi.fn() })) +vi.mock('electron', () => ({ + utilityProcess: { fork: mocks.fork }, + app: { getAppMetrics: mocks.metrics } +})) + +describe('Code Mode native capability', () => { + const entry = path.resolve('out/main/codeModeUtilityHost.js') + beforeEach(() => { + mocks.fork.mockReset() + mocks.metrics.mockReset() + }) + afterEach(() => vi.unstubAllEnvs()) + const nativeHost = () => { + const host = Object.assign(new EventEmitter(), { + pid: 123 as number | undefined, + postMessage: vi.fn(), + kill: vi.fn() + }) + mocks.fork.mockReturnValue(host) + return host + } + + it('preserves restricted environment, heap and library policy behind a plain channel', async () => { + vi.stubEnv('DEEPCHAT_CODE_MODE_SECRET', 'fixture-secret') + const native = nativeHost() + const host = await spawnCodeModeHost(entry, new AbortController().signal) + expect(host).not.toBe(native) + const [actualEntry, args, options] = mocks.fork.mock.calls[0] + expect(actualEntry).toBe(entry) + expect(args).toEqual(['--deepchat-code-mode-host']) + expect(options.serviceName).toBe('DeepChat Code Mode Cell') + expect(options.execArgv).toEqual(['--max-old-space-size=64']) + expect(options.allowLoadingUnsignedLibraries).toBe(false) + expect(options.stdio).toBe('ignore') + const allowed = [ + 'DEEPCHAT_CODE_MODE_HOST', + 'LANG', + 'LC_ALL', + 'TMPDIR', + 'TEMP', + 'TMP', + 'SystemRoot' + ] + expect(Object.keys(options.env).every((name) => allowed.includes(name))).toBe(true) + expect(options.env.DEEPCHAT_CODE_MODE_HOST).toBe('1') + expect(host.pid).toBe(123) + const message = vi.fn(), + exit = vi.fn(), + error = vi.fn() + expect(host.on('message', message)).toBeUndefined() + host.on('exit', exit) + host.on('error', error) + const stop: RunCodeParentMessage = { + type: 'STOP', + version: RUN_CODE_PROTOCOL_VERSION, + cellId: 'cell', + reason: 'done' + } + host.postMessage(stop) + expect(native.postMessage).toHaveBeenCalledWith(stop) + native.emit('message', { type: 'READY' }) + native.emit('exit', 0) + native.emit('error', 'crash', 'cell') + expect(message).toHaveBeenCalledWith({ type: 'READY' }) + expect(exit).toHaveBeenCalledWith(0) + expect(error).toHaveBeenCalledWith('crash', 'cell') + expect(host.off('message', message)).toBeUndefined() + expect(native.listenerCount('message')).toBe(0) + expect(host.kill()).toBeUndefined() + expect(native.kill).toHaveBeenCalledOnce() + }) + + it('rejects canceled and relative launch requests before creating a process', async () => { + await expect(spawnCodeModeHost(entry, AbortSignal.abort())).rejects.toMatchObject({ + name: 'AbortError' + }) + await expect(spawnCodeModeHost('relative.js', new AbortController().signal)).rejects.toThrow( + 'must be absolute' + ) + expect(mocks.fork).not.toHaveBeenCalled() + }) + + it('compensates cancellation during native fork', async () => { + const native = nativeHost(), + owner = new AbortController() + mocks.fork.mockImplementation(() => { + owner.abort() + return native + }) + await expect(spawnCodeModeHost(entry, owner.signal)).rejects.toMatchObject({ + name: 'AbortError' + }) + expect(native.kill).toHaveBeenCalledOnce() + }) + + it('returns only the owned helper RSS in bytes and respects canceled reads', async () => { + const native = nativeHost() + const host = await spawnCodeModeHost(entry, new AbortController().signal) + mocks.metrics.mockReturnValue([ + { pid: 999, memory: { workingSetSize: 999999 } }, + { pid: 123, memory: { workingSetSize: 1024 } } + ]) + await expect(host.getRssBytes(new AbortController().signal)).resolves.toBe(1024 * 1024) + mocks.metrics.mockClear() + await expect(host.getRssBytes(AbortSignal.abort())).rejects.toMatchObject({ + name: 'AbortError' + }) + expect(mocks.metrics).not.toHaveBeenCalled() + native.pid = undefined + await expect(host.getRssBytes(new AbortController().signal)).resolves.toBeNull() + expect(mocks.metrics).not.toHaveBeenCalled() + }) + + it('rejects a read canceled during native sampling without returning a stale metric', async () => { + nativeHost() + const host = await spawnCodeModeHost(entry, new AbortController().signal) + const owner = new AbortController() + mocks.metrics.mockImplementation(() => { + owner.abort() + return [{ pid: 123, memory: { workingSetSize: 1024 } }] + }) + await expect(host.getRssBytes(owner.signal)).rejects.toMatchObject({ name: 'AbortError' }) + }) +}) diff --git a/test/main/app/compositionBoundaries.test.ts b/test/main/app/compositionBoundaries.test.ts index fcd611bb09..bc76b19302 100644 --- a/test/main/app/compositionBoundaries.test.ts +++ b/test/main/app/compositionBoundaries.test.ts @@ -24,9 +24,6 @@ describe('session boundary composition', () => { expect(compositionSource).toMatch( /new LegacyChatImportService\([^)]*memoryDatabase,\s*sessionData\.tapeStore/ ) - expect(compositionSource).toMatch( - /sessionData\.tapeStore,\s*undefined,\s*\(\) => projectService\.notifyEnvironmentProjectionChanged\(\)/ - ) expect(compositionSource).toContain( 'legacyChatImportService.repairImportedLegacySessionSkills(conversationId)' ) @@ -184,7 +181,24 @@ describe('session boundary composition', () => { ) expect(destroySource).toContain("'yoBrowserPresenter.shutdown'") expect(destroySource).toContain("'tabPresenter.destroy'") - expect(destroySource).toContain("'backgroundExecSessionManager.shutdown'") + const backgroundDrain = destroySource.indexOf('await backgroundExec.shutdown()') + expect(backgroundDrain).toBeGreaterThan(destroyStepIndex('sessionRuntimes.suspend')) + expect(backgroundDrain).toBeLessThan(destroyStepIndex('skillService.destroy')) + expect(backgroundDrain).toBeLessThan(destroyStepIndex('mainDatabase.close')) + const codeDrain = destroySource.indexOf('await toolService.shutdownCodeRuntime()') + expect(codeDrain).toBeGreaterThan(backgroundDrain) + expect(codeDrain).toBeLessThan(destroyStepIndex('skillService.destroy')) + expect(codeDrain).toBeLessThan(destroyStepIndex('mainDatabase.close')) + expect(compositionSource).toContain('backgroundExec.stop()') + const shutdownSource = compositionSource.slice( + compositionSource.indexOf('const shutdownCoordinator =') + ) + expect(shutdownSource.indexOf('deepChatAgentHarness.abortGenerations()')).toBeLessThan( + shutdownSource.indexOf('backgroundExec.stop()') + ) + expect(shutdownSource.indexOf('toolService.stopCodeRuntime()')).toBeGreaterThan( + shutdownSource.indexOf('deepChatAgentHarness.abortGenerations()') + ) expect(destroyStepIndex('windowPresenter.destroyWindows')).toBeLessThan( destroyStepIndex('mainDatabase.close') ) diff --git a/test/main/app/credentialCrypto.test.ts b/test/main/app/credentialCrypto.test.ts new file mode 100644 index 0000000000..bfa72f1656 --- /dev/null +++ b/test/main/app/credentialCrypto.test.ts @@ -0,0 +1,38 @@ +import { afterEach, expect, it, vi } from 'vitest' +import { credentialCrypto, secureCredentialCrypto } from '@/app/credentialCrypto' + +const native = vi.hoisted(() => ({ + isAsyncEncryptionAvailable: vi.fn(async () => true), + encryptStringAsync: vi.fn(async (value: string) => Buffer.from(`wrapped:${value}`)), + decryptStringAsync: vi.fn(async (value: Buffer) => ({ + result: value.toString().slice(8), + shouldReEncrypt: false + })), + getSelectedStorageBackend: vi.fn(() => 'basic_text') +})) +vi.mock('electron', () => ({ safeStorage: native })) +const platform = Object.getOwnPropertyDescriptor(process, 'platform')! + +afterEach(() => { + Object.defineProperty(process, 'platform', platform) + vi.restoreAllMocks() +}) + +it('uses acknowledged native ciphertext without changing its encoding', async () => { + const wrapped = await credentialCrypto.encrypt('fixture') + expect(wrapped).toBe(Buffer.from('wrapped:fixture').toString('base64')) + expect(await credentialCrypto.decrypt(wrapped)).toBe('fixture') +}) + +it.each(['basic_text', 'kwallet5', 'unavailable', 'error'])( + 'enforces the Linux secure backend policy for %s', + async (backend) => { + Object.defineProperty(process, 'platform', { configurable: true, value: 'linux' }) + native.isAsyncEncryptionAvailable.mockResolvedValue(backend !== 'unavailable') + native.getSelectedStorageBackend.mockImplementation(() => { + if (backend === 'error') throw new Error('backend unavailable') + return backend + }) + expect(await secureCredentialCrypto.isAvailable()).toBe(backend === 'kwallet5') + } +) diff --git a/test/main/app/databaseRequestGate.test.ts b/test/main/app/databaseRequestGate.test.ts new file mode 100644 index 0000000000..cdcdcf81b5 --- /dev/null +++ b/test/main/app/databaseRequestGate.test.ts @@ -0,0 +1,215 @@ +import { afterEach, describe, expect, it, vi } from 'vitest' +import { DatabaseRequestGate } from '@/app/databaseRequestGate' + +const deferred = () => { + let resolve!: (value: T) => void + let reject!: (error: unknown) => void + const promise = new Promise((done, fail) => { + resolve = done + reject = fail + }) + return { promise, resolve, reject } +} + +afterEach(() => vi.useRealTimers()) + +describe('database request ownership', () => { + it('drains an admitted request while rejecting new ordinary work', async () => { + const gate = new DatabaseRequestGate(() => undefined) + const result = deferred() + const request = gate.runRequest('providers.add', () => result.promise) + gate.beginMaintenance() + let drained = false + const drain = gate.drain().then(() => { + drained = true + }) + await Promise.resolve() + expect(drained).toBe(false) + for (const method of [ + 'config.setCustomPrompts', + 'mcp.getServers', + 'models.invoke', + 'ocr.extractUpload', + 'future.write' + ]) { + const action = vi.fn(async () => undefined) + await expect(gate.runRequest(method, action)).rejects.toThrow('maintenance is maintenance') + expect(action).not.toHaveBeenCalled() + } + result.resolve('committed') + expect(await request).toBe('committed') + await drain + gate.resume() + expect(await gate.runRequest('providers.add', async () => 'next')).toBe('next') + }) + + it('releases failed requests without hiding the original error', async () => { + const gate = new DatabaseRequestGate(() => undefined) + const error = new Error('owner failure') + await expect( + gate.runRequest('config.setCustomPrompts', async () => { + throw error + }) + ).rejects.toBe(error) + gate.beginMaintenance() + await gate.drain() + gate.resume() + }) + + it('does not include the maintenance command or native presentation in its own drain', async () => { + const gate = new DatabaseRequestGate(() => undefined) + await expect( + gate.runRequest('databaseSecurity.enable', async () => { + gate.beginMaintenance() + const native = deferred() + const presentation = gate.runRequest('window.getCurrentState', () => native.promise) + await gate.drain() + await expect( + gate.runRequest('databaseSecurity.repairSchema', async () => undefined) + ).rejects.toThrow('maintenance is maintenance') + expect(await gate.runRequest('approvals.resolve', async () => 'resolved')).toBe('resolved') + native.resolve() + await presentation + gate.resume() + return 'acknowledged' + }) + ).resolves.toBe('acknowledged') + }) + + it('bounds drain waiting and includes an old pending request in a later attempt', async () => { + vi.useFakeTimers() + const gate = new DatabaseRequestGate(() => undefined) + const result = deferred() + const request = gate.runRequest('providers.add', () => result.promise) + gate.beginMaintenance() + const timeout = expect(gate.drain()).rejects.toThrow('30000ms') + await vi.advanceTimersByTimeAsync(30_000) + await timeout + expect(vi.getTimerCount()).toBe(0) + gate.resume() + gate.beginMaintenance() + let drained = false + const next = gate.drain().then(() => { + drained = true + }) + await Promise.resolve() + expect(drained).toBe(false) + result.resolve() + await request + await next + expect(vi.getTimerCount()).toBe(0) + gate.resume() + }) + + it('keeps failed maintenance closed and still honors the application lifecycle', async () => { + let active = true + const gate = new DatabaseRequestGate(() => { + if (!active) throw new Error('Application stopped') + }) + gate.beginMaintenance() + gate.fail() + await expect(gate.runRequest('providers.add', async () => undefined)).rejects.toThrow( + 'maintenance is failed' + ) + expect(await gate.runRequest('databaseSecurity.getStatus', async () => 'failed')).toBe('failed') + expect(() => gate.resume()).toThrow('cannot resume') + active = false + await expect(gate.runRequest('window.getCurrentState', async () => undefined)).rejects.toThrow( + 'Application stopped' + ) + }) + + it('drains requests and actual maintenance completion during shutdown', async () => { + const gate = new DatabaseRequestGate(() => undefined) + const normal = deferred() + const owner = deferred() + const request = gate.runRequest('providers.add', () => normal.promise) + const maintenance = gate.runMaintenance(() => owner.promise) + await Promise.resolve() + gate.beginShutdown() + let drained = false + const drain = gate.drainForShutdown().then(() => { + drained = true + }) + for (const method of ['providers.add', 'window.getCurrentState', 'device.restartApp']) { + await expect(gate.runRequest(method, async () => undefined)).rejects.toThrow('stopping') + } + normal.resolve() + await request + await new Promise((resolve) => setImmediate(resolve)) + expect(drained).toBe(false) + const error = new Error('interrupted maintenance') + const rejected = expect(maintenance).rejects.toBe(error) + owner.reject(error) + await rejected + await drain + expect(gate.state).toBe('stopping') + }) + + it.each(['device.restartApp', 'device.resetDataByType'])( + 'does not wait for the %s request that owns shutdown', + async (method) => { + const gate = new DatabaseRequestGate(() => undefined) + await gate.runRequest(method, async () => { + gate.beginShutdown() + await gate.drainForShutdown() + }) + } + ) + + it('includes lifecycle authorization before its shutdown dispatch', async () => { + const gate = new DatabaseRequestGate(() => undefined) + const release = deferred() + const authorization = gate.runAuthorization('device.resetDataByType', () => release.promise) + gate.beginShutdown() + let drained = false + const drain = gate.drainForShutdown().then(() => { + drained = true + }) + await Promise.resolve() + expect(drained).toBe(false) + release.resolve() + await authorization + await drain + }) + + it('bounds shutdown waiting without losing an unfinished maintenance owner', async () => { + vi.useFakeTimers() + const gate = new DatabaseRequestGate(() => undefined) + const release = deferred() + const maintenance = gate.runMaintenance(() => release.promise) + gate.beginShutdown() + const timeout = expect(gate.drainForShutdown()).rejects.toThrow('30000ms') + await vi.advanceTimersByTimeAsync(30_000) + await timeout + expect(vi.getTimerCount()).toBe(0) + let drained = false + const retry = gate.drainForShutdown().then(() => { + drained = true + }) + await vi.advanceTimersByTimeAsync(0) + expect(drained).toBe(false) + release.resolve() + await maintenance + await retry + expect(vi.getTimerCount()).toBe(0) + expect(() => gate.resume()).toThrow('cannot resume') + }) + + it('retains exclusive maintenance ownership after ordinary admission resumes', async () => { + const gate = new DatabaseRequestGate(() => undefined) + const entered = deferred() + const release = deferred() + const maintenance = gate.runMaintenance(async () => { + gate.resume() + entered.resolve() + await release.promise + }) + await entered.promise + await expect(gate.runMaintenance(async () => undefined)).rejects.toThrow('still completing') + expect(await gate.runRequest('providers.add', async () => 'ready')).toBe('ready') + release.resolve() + await maintenance + await gate.runMaintenance(async () => gate.resume()) + }) +}) diff --git a/test/main/app/databaseSecurity.test.ts b/test/main/app/databaseSecurity.test.ts index 4f988cb8a6..793a3610cf 100644 --- a/test/main/app/databaseSecurity.test.ts +++ b/test/main/app/databaseSecurity.test.ts @@ -1,5 +1,6 @@ import { beforeEach, describe, expect, it, vi } from 'vitest' import { shouldExcludeFromSqliteCopy } from '@/data/sqliteCopyExclusions' +import type { DatabaseSecurityMetadata } from '@/app/databaseSecurity' const mocks = vi.hoisted(() => { const stores = new Map>() @@ -9,10 +10,6 @@ const mocks = vi.hoisted(() => { decryptString: vi.fn((value: Buffer) => value.toString('utf8').replace(/^wrapped:/, '')), getSelectedStorageBackend: vi.fn(() => 'basic_text') } - const app = { - getPath: vi.fn(() => '/tmp/deepchat-test'), - quit: vi.fn() - } const openSQLiteDatabase = vi.fn(() => ({ prepare: vi.fn(() => ({ get: vi.fn(() => ({ name: 'schema_versions' })) @@ -23,42 +20,34 @@ const mocks = vi.hoisted(() => { return { stores, safeStorage, - app, openSQLiteDatabase } }) -vi.mock('electron', () => ({ - app: mocks.app, - safeStorage: mocks.safeStorage +vi.mock('../../../src/main/data/databaseConnection', () => ({ + openSQLiteDatabase: mocks.openSQLiteDatabase })) -vi.mock('electron-store', () => ({ - default: class MockElectronStore { - private readonly name: string - - constructor(options: { name: string; defaults?: Record }) { - this.name = options.name - if (!mocks.stores.has(this.name)) { - mocks.stores.set(this.name, structuredClone(options.defaults ?? {})) +function fixtureOptions() { + return { + dbPath: '/tmp/deepchat-test/agent.db', + metadata: { + get: () => + mocks.stores.get('database-security')?.metadata as DatabaseSecurityMetadata | undefined, + set: (_key: 'metadata', metadata: DatabaseSecurityMetadata) => { + mocks.stores.set('database-security', { metadata }) } - } - - get(key: string) { - return mocks.stores.get(this.name)?.[key] - } - - set(key: string, value: unknown) { - const store = mocks.stores.get(this.name) ?? {} - store[key] = value - mocks.stores.set(this.name, store) + }, + crypto: { + isAvailable: async () => mocks.safeStorage.isEncryptionAvailable(), + encrypt: async (value: string) => mocks.safeStorage.encryptString(value).toString('base64'), + decrypt: async (wrapped: string) => + mocks.safeStorage.decryptString(Buffer.from(wrapped, 'base64')), + getBackend: async () => + process.platform === 'linux' ? mocks.safeStorage.getSelectedStorageBackend() : undefined } } -})) - -vi.mock('../../../src/main/data/databaseConnection', () => ({ - openSQLiteDatabase: mocks.openSQLiteDatabase -})) +} const enabledMetadata = (overrides: Record = {}) => ({ version: 1, @@ -74,7 +63,7 @@ async function listMigratableTableNames( foreignKeys: Record = {} ): Promise { const { DatabaseSecurityService } = await import('@/app/databaseSecurity') - const presenter = new DatabaseSecurityService({ dbPath: '/tmp/deepchat-test/agent.db' }) + const presenter = new DatabaseSecurityService(fixtureOptions()) const db = { prepare: vi.fn((sql: string) => { const tableName = sql.match(/foreign_key_list\("([^"]+)"\)/u)?.[1] @@ -105,8 +94,6 @@ describe('DatabaseSecurityService', () => { value.toString('utf8').replace(/^wrapped:/, '') ) mocks.safeStorage.getSelectedStorageBackend.mockReturnValue('basic_text') - mocks.app.getPath.mockReturnValue('/tmp/deepchat-test') - mocks.app.quit.mockReset() mocks.openSQLiteDatabase.mockReset() mocks.openSQLiteDatabase.mockImplementation(() => ({ prepare: vi.fn(() => ({ @@ -126,9 +113,9 @@ describe('DatabaseSecurityService', () => { }) const { DatabaseSecurityService } = await import('@/app/databaseSecurity') - const presenter = new DatabaseSecurityService({ dbPath: '/tmp/deepchat-test/agent.db' }) + const presenter = new DatabaseSecurityService(fixtureOptions()) - expect(presenter.getStatus()).toMatchObject({ + expect(await presenter.getStatus()).toMatchObject({ enabled: true, safeStorageAvailable: false, passwordStorage: 'manual', @@ -142,7 +129,7 @@ describe('DatabaseSecurityService', () => { }) const { DatabaseSecurityService } = await import('@/app/databaseSecurity') - const presenter = new DatabaseSecurityService({ dbPath: '/tmp/deepchat-test/agent.db' }) + const presenter = new DatabaseSecurityService(fixtureOptions()) const unlockProvider = vi.fn() await expect(presenter.resolveStartupPassword(unlockProvider)).resolves.toBe('secret') @@ -159,7 +146,7 @@ describe('DatabaseSecurityService', () => { }) const { DatabaseSecurityService } = await import('@/app/databaseSecurity') - const presenter = new DatabaseSecurityService({ dbPath: '/tmp/deepchat-test/agent.db' }) + const presenter = new DatabaseSecurityService(fixtureOptions()) const requests: unknown[] = [] const password = await presenter.resolveStartupPassword(async (request) => { @@ -179,9 +166,9 @@ describe('DatabaseSecurityService', () => { it('persists recovered encryption metadata without forging a migration', async () => { mocks.safeStorage.isEncryptionAvailable.mockReturnValue(false) const { DatabaseSecurityService } = await import('@/app/databaseSecurity') - const presenter = new DatabaseSecurityService({ dbPath: '/tmp/deepchat-test/agent.db' }) + const presenter = new DatabaseSecurityService(fixtureOptions()) - presenter.persistRecoveredEncryptionMetadata('recovered-secret') + await presenter.persistRecoveredEncryptionMetadata('recovered-secret') expect(mocks.stores.get('database-security')?.metadata).toMatchObject({ version: 1, @@ -202,7 +189,7 @@ describe('DatabaseSecurityService', () => { }) const { DatabaseSecurityService } = await import('@/app/databaseSecurity') - const presenter = new DatabaseSecurityService({ dbPath: '/tmp/deepchat-test/agent.db' }) + const presenter = new DatabaseSecurityService(fixtureOptions()) await expect(presenter.resolveStartupPassword(async () => 'secret')).resolves.toBe('secret') }) @@ -219,7 +206,7 @@ describe('DatabaseSecurityService', () => { }) const { DatabaseSecurityService } = await import('@/app/databaseSecurity') - const presenter = new DatabaseSecurityService({ dbPath: '/tmp/deepchat-test/agent.db' }) + const presenter = new DatabaseSecurityService(fixtureOptions()) const requests: unknown[] = [] await expect( @@ -247,14 +234,14 @@ describe('DatabaseSecurityService', () => { }) const { DatabaseSecurityService } = await import('@/app/databaseSecurity') - const presenter = new DatabaseSecurityService({ dbPath: '/tmp/deepchat-test/agent.db' }) + const presenter = new DatabaseSecurityService(fixtureOptions()) await expect(presenter.resolveStartupPassword(async () => 'secret')).rejects.toBeInstanceOf( OrphanWalDatabaseError ) }) - it('quits when startup unlock is canceled', async () => { + it('rejects when startup unlock is canceled', async () => { mocks.stores.set('database-security', { metadata: enabledMetadata({ passwordStorage: 'manual', @@ -263,20 +250,78 @@ describe('DatabaseSecurityService', () => { }) const { DatabaseSecurityService } = await import('@/app/databaseSecurity') - const presenter = new DatabaseSecurityService({ dbPath: '/tmp/deepchat-test/agent.db' }) + const presenter = new DatabaseSecurityService(fixtureOptions()) await expect(presenter.resolveStartupPassword(async () => null)).rejects.toThrow( 'Database unlock canceled' ) - expect(mocks.app.quit).toHaveBeenCalled() + }) + + it('discards a password decrypted after the owner stops', async () => { + mocks.stores.set('database-security', { metadata: enabledMetadata() }) + const options = fixtureOptions() + let finish!: (password: string) => void + options.crypto.decrypt = vi.fn( + () => + new Promise((resolve) => { + finish = resolve + }) + ) + const { DatabaseSecurityService } = await import('@/app/databaseSecurity') + const service = new DatabaseSecurityService(options) + const unlock = vi.fn() + const result = service.resolveStartupPassword(unlock) + const rejected = expect(result).rejects.toThrow('Database security operation interrupted') + await vi.waitFor(() => expect(options.crypto.decrypt).toHaveBeenCalled()) + service.stop() + finish('secret') + await rejected + expect(mocks.openSQLiteDatabase).not.toHaveBeenCalled() + expect(unlock).not.toHaveBeenCalled() + }) + + it('discards a manual password wrapped after the owner stops', async () => { + const original = enabledMetadata({ passwordStorage: 'manual', wrappedPassword: undefined }) + mocks.stores.set('database-security', { metadata: original }) + const options = fixtureOptions() + let finish!: (wrapped: string) => void + options.crypto.encrypt = vi.fn( + () => + new Promise((resolve) => { + finish = resolve + }) + ) + const { DatabaseSecurityService } = await import('@/app/databaseSecurity') + const service = new DatabaseSecurityService(options) + const result = service.resolveStartupPassword(async () => 'secret') + const rejected = expect(result).rejects.toThrow('Database security operation interrupted') + await vi.waitFor(() => expect(options.crypto.encrypt).toHaveBeenCalled()) + service.stop() + finish('late-wrapped-secret') + await rejected + expect(mocks.stores.get('database-security')?.metadata).toEqual(original) + }) + + it('propagates native wrapping failure without retrying a valid manual password', async () => { + const original = enabledMetadata({ passwordStorage: 'manual', wrappedPassword: undefined }) + mocks.stores.set('database-security', { metadata: original }) + mocks.safeStorage.encryptString.mockImplementationOnce(() => { + throw new Error('vault locked') + }) + const { DatabaseSecurityService } = await import('@/app/databaseSecurity') + const service = new DatabaseSecurityService(fixtureOptions()) + const unlock = vi.fn(async () => 'secret') + await expect(service.resolveStartupPassword(unlock)).rejects.toThrow('vault locked') + expect(unlock).toHaveBeenCalledTimes(1) + expect(mocks.stores.get('database-security')?.metadata).toEqual(original) }) it('cleans legacy provider JSON before enabling encryption', async () => { const { DatabaseSecurityService } = await import('@/app/databaseSecurity') - const presenter = new DatabaseSecurityService({ dbPath: '/tmp/deepchat-test/agent.db' }) + const presenter = new DatabaseSecurityService(fixtureOptions()) const migrateDatabase = vi - .spyOn(presenter as unknown as { migrateDatabase: () => Promise }, 'migrateDatabase') - .mockResolvedValue(undefined) + .spyOn(presenter as unknown as { migrateDatabase: () => void }, 'migrateDatabase') + .mockReturnValue(undefined) const cleanupLegacyProviderJsonForDatabaseEncryption = vi.fn(() => 1) await presenter.enableEncryption({ @@ -293,7 +338,7 @@ describe('DatabaseSecurityService', () => { it('qualifies CREATE TABLE IF NOT EXISTS for the migration target schema', async () => { const { DatabaseSecurityService } = await import('@/app/databaseSecurity') - const presenter = new DatabaseSecurityService({ dbPath: '/tmp/deepchat-test/agent.db' }) + const presenter = new DatabaseSecurityService(fixtureOptions()) expect( ( diff --git a/test/main/app/databaseSecurityNative.test.ts b/test/main/app/databaseSecurityNative.test.ts new file mode 100644 index 0000000000..b2e97bbc38 --- /dev/null +++ b/test/main/app/databaseSecurityNative.test.ts @@ -0,0 +1,240 @@ +import { afterEach, expect, it, vi } from 'vitest' +import { mkdtempSync, readFileSync, rmSync, writeFileSync, existsSync } from 'node:fs' +import { tmpdir } from 'node:os' +import { join } from 'node:path' +import { describeIfNativeSqlite } from '../nativeSqliteHarness' +import { openSQLiteDatabase } from '@/data/databaseConnection' +import { + DatabaseSecurityService, + DEFAULT_DATABASE_SECURITY_METADATA, + type DatabaseSecurityMetadata +} from '@/app/databaseSecurity' + +vi.unmock('fs') +vi.unmock('node:fs') +vi.unmock('path') +vi.unmock('node:path') + +describeIfNativeSqlite('Database security SQLCipher commit', () => { + const cleanups: Array<() => void> = [] + afterEach(() => { + for (const cleanup of cleanups.reverse()) cleanup() + cleanups.length = 0 + }) + + function fixture(password?: string) { + const directory = mkdtempSync(join(tmpdir(), 'deepchat-database-security-')) + const dbPath = join(directory, 'agent.db') + const metadataPath = join(directory, 'database-security.json') + const initial: DatabaseSecurityMetadata = password + ? { version: 1, enabled: true, cipher: 'sqlcipher', passwordStorage: 'manual' } + : { ...DEFAULT_DATABASE_SECURITY_METADATA } + writeFileSync(metadataPath, JSON.stringify(initial)) + const metadata = { + get: (_key: 'metadata') => + JSON.parse(readFileSync(metadataPath, 'utf8')) as DatabaseSecurityMetadata, + set: vi.fn((_key: 'metadata', value: DatabaseSecurityMetadata) => { + writeFileSync(metadataPath, JSON.stringify(value)) + }) + } + const crypto = { + isAvailable: vi.fn(async () => true), + encrypt: vi.fn(async (value: string) => Buffer.from(value).toString('base64')), + decrypt: vi.fn(async (wrapped: string) => Buffer.from(wrapped, 'base64').toString()), + getBackend: vi.fn(async (): Promise => undefined) + } + let db = openSQLiteDatabase(dbPath, password) + db.exec(` + CREATE TABLE agent_memory (id TEXT PRIMARY KEY, content TEXT NOT NULL); + INSERT INTO agent_memory VALUES ('claim', 'durable memory'); + CREATE TABLE deepchat_tape_entries (id TEXT PRIMARY KEY, parent_id TEXT); + INSERT INTO deepchat_tape_entries VALUES ('root', NULL), ('child', 'root'); + CREATE TABLE app_settings (key TEXT PRIMARY KEY, value_json TEXT NOT NULL); + INSERT INTO app_settings VALUES ('copyWithCotEnabled', 'false'); + `) + const database = { + getDatabasePath: () => dbPath, + checkpointAndClose: vi.fn(() => { + db.pragma('wal_checkpoint(TRUNCATE)') + db.close() + }), + close: () => { + if (db.open) db.close() + }, + reopenWithPassword: vi.fn((key?: string) => { + db = openSQLiteDatabase(dbPath, key) + }), + isOpen: () => db.open + } + const providerSettings = { cleanupLegacyProviderJsonForDatabaseEncryption: vi.fn(() => 0) } + const service = new DatabaseSecurityService({ dbPath, metadata, crypto }) + cleanups.push(() => { + service.stop() + database.close() + rmSync(directory, { recursive: true, force: true }) + }) + return { + service, + metadata, + crypto, + database, + providerSettings, + dbPath, + metadataPath, + initial, + assertData(key?: string) { + const check = openSQLiteDatabase(dbPath, key) + try { + expect(check.pragma('quick_check', { simple: true })).toBe('ok') + expect(check.prepare('SELECT * FROM agent_memory').all()).toEqual([ + { id: 'claim', content: 'durable memory' } + ]) + expect(check.prepare('SELECT * FROM deepchat_tape_entries ORDER BY id').all()).toEqual([ + { id: 'child', parent_id: 'root' }, + { id: 'root', parent_id: null } + ]) + expect(check.prepare('SELECT * FROM app_settings').get()).toEqual({ + key: 'copyWithCotEnabled', + value_json: 'false' + }) + } finally { + check.close() + } + expect(existsSync(`${dbPath}.migration-tmp`)).toBe(false) + expect(existsSync(`${dbPath}.migration-rollback`)).toBe(false) + } + } + } + + it('preserves durable rows across enable, rekey, manual unlock and disable', async () => { + const f = fixture() + expect(await f.service.enableEncryption({ password: 'first', ...f })).toMatchObject({ + enabled: true, + migrationInProgress: false + }) + f.assertData('first') + expect(() => openSQLiteDatabase(f.dbPath)).toThrow() + await expect( + f.service.changePassword({ currentPassword: 'wrong', newPassword: 'next', ...f }) + ).rejects.toThrow() + f.assertData('first') + expect( + await f.service.changePassword({ currentPassword: 'first', newPassword: 'next', ...f }) + ).toMatchObject({ enabled: true, migrationInProgress: false }) + f.assertData('next') + expect(() => openSQLiteDatabase(f.dbPath, 'first')).toThrow() + f.crypto.isAvailable.mockResolvedValue(false) + const manual = await f.service.changePassword({ + currentPassword: 'next', + newPassword: 'manual', + ...f + }) + expect(manual).toMatchObject({ + enabled: true, + passwordStorage: 'manual', + manualUnlockRequired: true + }) + expect(f.metadata.get('metadata').wrappedPassword).toBeUndefined() + await expect(f.service.resolveStartupPassword(async () => 'manual')).resolves.toBe('manual') + expect(await f.service.disableEncryption({ currentPassword: 'manual', ...f })).toMatchObject({ + enabled: false, + passwordStorage: 'none', + migrationInProgress: false + }) + f.assertData() + }) + + it('keeps the original writer and metadata when native wrapping fails', async () => { + const f = fixture() + f.crypto.encrypt.mockRejectedValueOnce(new Error('vault locked')) + await expect(f.service.enableEncryption({ password: 'next', ...f })).rejects.toThrow( + 'vault locked' + ) + expect(f.database.checkpointAndClose).not.toHaveBeenCalled() + expect(f.providerSettings.cleanupLegacyProviderJsonForDatabaseEncryption).not.toHaveBeenCalled() + expect(f.metadata.get('metadata')).toEqual(f.initial) + f.assertData() + await f.service.enableEncryption({ password: 'next', ...f }) + f.assertData('next') + }) + + it.each(['enable', 'change-password', 'disable'] as const)( + 'rolls back database and metadata together when %s metadata persistence fails', + async (direction) => { + const sourceKey = direction === 'enable' ? undefined : 'original' + const f = fixture(sourceKey) + f.metadata.set.mockImplementationOnce((_key, value) => { + writeFileSync(f.metadataPath, JSON.stringify(value)) + throw new Error('metadata write failed') + }) + const result = + direction === 'enable' + ? f.service.enableEncryption({ password: 'next', ...f }) + : direction === 'change-password' + ? f.service.changePassword({ currentPassword: 'original', newPassword: 'next', ...f }) + : f.service.disableEncryption({ currentPassword: 'original', ...f }) + await expect(result).rejects.toThrow('metadata write failed') + expect(f.database.isOpen()).toBe(true) + expect(f.metadata.get('metadata')).toEqual(f.initial) + f.assertData(sourceKey) + expect(() => openSQLiteDatabase(f.dbPath, 'next')).toThrow() + } + ) + + it('restores the original encrypted writer after target reopen fails', async () => { + const f = fixture('original') + f.database.reopenWithPassword.mockImplementationOnce(() => { + throw new Error('reopen failed') + }) + await expect( + f.service.changePassword({ currentPassword: 'original', newPassword: 'next', ...f }) + ).rejects.toThrow('reopen failed') + expect(f.database.isOpen()).toBe(true) + expect(f.metadata.get('metadata')).toEqual(f.initial) + f.assertData('original') + expect(() => openSQLiteDatabase(f.dbPath, 'next')).toThrow() + }) + + it('locks the profile through pending crypto and discards stopped results before mutation', async () => { + const f = fixture() + let finish!: (wrapped: string) => void + f.crypto.encrypt.mockImplementationOnce( + () => + new Promise((resolve) => { + finish = resolve + }) + ) + const result = f.service.enableEncryption({ password: 'next', ...f }) + const rejected = expect(result).rejects.toThrow('Database security operation interrupted') + await vi.waitFor(() => expect(f.crypto.encrypt).toHaveBeenCalled()) + await expect(f.service.enableEncryption({ password: 'other', ...f })).rejects.toThrow( + 'already in progress' + ) + await expect(f.service.persistRecoveredEncryptionMetadata('other')).rejects.toThrow( + 'already in progress' + ) + expect( + () => + new DatabaseSecurityService({ dbPath: f.dbPath, metadata: f.metadata, crypto: f.crypto }) + ).toThrow('already in progress') + f.service.stop() + finish('late-ciphertext') + await rejected + expect(f.database.checkpointAndClose).not.toHaveBeenCalled() + expect(f.metadata.get('metadata')).toEqual(f.initial) + f.assertData() + const replacement = new DatabaseSecurityService({ + dbPath: f.dbPath, + metadata: f.metadata, + crypto: f.crypto + }) + try { + expect(await replacement.getStatus()).toMatchObject({ + enabled: false, + migrationInProgress: false + }) + } finally { + replacement.stop() + } + }) +}) diff --git a/test/main/app/databaseStartup.test.ts b/test/main/app/databaseStartup.test.ts index bfd87084a9..2125b98cbf 100644 --- a/test/main/app/databaseStartup.test.ts +++ b/test/main/app/databaseStartup.test.ts @@ -1,4 +1,6 @@ import { beforeEach, describe, expect, it, vi } from 'vitest' +import type { DatabaseSecurityService } from '@/app/databaseSecurity' +import type { SplashWindow } from '@/app/splashWindow' const mocks = vi.hoisted(() => ({ appQuit: vi.fn(), @@ -58,14 +60,18 @@ describe('initializeMainDatabaseWithRecovery', () => { return { security: { getDatabasePath: () => '/tmp/deepchat-test/app_db/agent.db', - resolveStartupPassword: vi.fn(async () => overrides?.password), + resolveStartupPassword: vi.fn( + async () => overrides?.password + ), validatePassword: vi.fn(), persistRecoveredEncryptionMetadata: vi.fn(), clearEncryptionMetadata: vi.fn() }, splash: { - requestDatabaseUnlock: vi.fn(), - requestDatabaseRecovery: vi.fn(async () => recovery.shift() ?? null) + requestDatabaseUnlock: vi.fn(), + requestDatabaseRecovery: vi.fn( + async () => recovery.shift() ?? null + ) } } } @@ -82,6 +88,22 @@ describe('initializeMainDatabaseWithRecovery', () => { expect(mocks.quarantine).not.toHaveBeenCalled() }) + it('quits from the desktop unlock adapter when unlock is canceled', async () => { + const { initializeMainDatabaseWithRecovery } = await import('@/app/databaseStartup') + const ports = createPorts() + ports.splash.requestDatabaseUnlock.mockResolvedValue(null) + ports.security.resolveStartupPassword.mockImplementation(async (unlock) => { + const password = await unlock({ reason: 'manual-required', safeStorageAvailable: true }) + if (password === null) throw new Error('Database unlock canceled') + return password + }) + await expect(initializeMainDatabaseWithRecovery(ports as never)).rejects.toThrow( + 'Database unlock canceled' + ) + expect(mocks.appQuit).toHaveBeenCalledTimes(1) + expect(mocks.initialize).not.toHaveBeenCalled() + }) + it('quarantines a damaged database only after the user chooses start empty', async () => { const database = { id: 'fresh' } mocks.initialize diff --git a/test/main/app/logging.test.ts b/test/main/app/logging.test.ts index 64073e2850..0ec6cc8150 100644 --- a/test/main/app/logging.test.ts +++ b/test/main/app/logging.test.ts @@ -1,5 +1,5 @@ import { inspect } from 'node:util' -import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' +import { afterEach, describe, expect, it, vi } from 'vitest' import { originalConsole } from '@shared/logger' import { LoggingService } from '@/app/logging' import { @@ -14,32 +14,66 @@ import { } from '@/app/startupWorkloadCoordinator' describe('LoggingService', () => { - beforeEach(() => vi.useFakeTimers()) - afterEach(() => vi.useRealTimers()) - it.each([false, true])( - 'applies the %s persistence gate before publishing and scheduling restart', - (enabled) => { + 'awaits the native persistence gate before publishing %s', + async (enabled) => { const operations: string[] = [] const settings = { get: vi.fn(() => false), set: vi.fn(() => operations.push('settings')) } - const restart = vi.fn(() => operations.push('restart')) const publish = vi.fn(() => operations.push('publish')) - const setPersistence = vi.fn(() => operations.push('persistence')) - const service = new LoggingService(settings as never, restart, publish, setPersistence) - - service.setEnabled(enabled) - - expect(setPersistence).toHaveBeenCalledWith(enabled) - expect(operations).toEqual(['settings', 'persistence', 'publish']) - vi.advanceTimersByTime(999) - expect(restart).not.toHaveBeenCalled() - vi.advanceTimersByTime(1) - expect(restart).toHaveBeenCalledOnce() + let finish!: () => void + const pending = new Promise((resolve) => { + finish = resolve + }) + const host = { applyLogging: vi.fn(() => pending), openLoggingFolder: vi.fn(async () => {}) } + const service = new LoggingService(settings as never, host, publish, vi.fn()) + const changed = service.setEnabled(enabled) + expect(host.applyLogging).toHaveBeenCalledWith(enabled) + expect(operations).toEqual(['settings']) + finish() + await changed + expect(operations).toEqual(['settings', 'publish']) } ) + + it('does not acknowledge a failed native logging change or hide a folder error', async () => { + const publish = vi.fn() + const host = { + applyLogging: vi.fn(async () => { + throw new Error('native gate unavailable') + }), + openLoggingFolder: vi.fn(async () => { + throw new Error('folder unavailable') + }) + } + const service = new LoggingService({ set: vi.fn() } as never, host, publish, vi.fn()) + await expect(service.setEnabled(true)).rejects.toThrow('native gate unavailable') + expect(publish).not.toHaveBeenCalled() + await expect(service.openFolder()).rejects.toThrow('folder unavailable') + }) +}) + +it('controls legacy console debug output through an explicit host flag', async () => { + const legacy = await vi.importActual('@shared/logger') + const debug = vi.spyOn(legacy.originalConsole, 'debug').mockImplementation(() => undefined) + try { + legacy.setLegacyConsoleDebugEnabled(false) + legacy.default.debug('quiet') + expect(debug).not.toHaveBeenCalled() + legacy.setLegacyConsoleDebugEnabled(true) + legacy.default.debug('debug') + legacy.default.verbose('verbose') + legacy.default.silly('silly') + expect(debug.mock.calls).toEqual([['debug'], ['verbose'], ['silly']]) + expect(legacy.default.info).toBe(legacy.originalConsole.info) + expect(legacy.default.warn).toBe(legacy.originalConsole.warn) + expect(legacy.default.error).toBe(legacy.originalConsole.error) + } finally { + legacy.setLegacyConsoleDebugEnabled(false) + debug.mockRestore() + } }) describe('Main startup diagnostics', () => { diff --git a/test/main/app/rendererPerformanceLogService.test.ts b/test/main/app/rendererPerformanceLogService.test.ts index bad0c68d60..514db01d18 100644 --- a/test/main/app/rendererPerformanceLogService.test.ts +++ b/test/main/app/rendererPerformanceLogService.test.ts @@ -23,11 +23,7 @@ const validRecord = { describe('RendererPerformanceLogService', () => { it('does not create a diagnostics file when local logging is disabled', async () => { const fs = createFs() - const service = new RendererPerformanceLogService( - { get: vi.fn(() => false) } as never, - () => '/user-data', - fs - ) + const service = new RendererPerformanceLogService(() => false, '/user-data', fs) await expect(service.record(validRecord)).resolves.toBe(false) expect(fs.appendFile).not.toHaveBeenCalled() @@ -36,8 +32,8 @@ describe('RendererPerformanceLogService', () => { it('persists a sanitized, timestamped NDJSON record', async () => { const fs = createFs() const service = new RendererPerformanceLogService( - { get: vi.fn(() => true) } as never, - () => '/user-data', + () => true, + '/user-data', fs, () => 1234 ) @@ -54,11 +50,7 @@ describe('RendererPerformanceLogService', () => { it('rejects unknown fields before they reach the local log', async () => { const fs = createFs() - const service = new RendererPerformanceLogService( - { get: vi.fn(() => true) } as never, - () => '/user-data', - fs - ) + const service = new RendererPerformanceLogService(() => true, '/user-data', fs) await expect( service.record({ ...validRecord, sessionId: 'sensitive-session-id' }) @@ -83,8 +75,8 @@ describe('RendererPerformanceLogService', () => { writeOrder.push('second') }) const service = new RendererPerformanceLogService( - { get: vi.fn(() => true) } as never, - () => '/user-data', + () => true, + '/user-data', createFs({ appendFile }) ) @@ -99,11 +91,7 @@ describe('RendererPerformanceLogService', () => { it('rotates the bounded record file and retains only one previous generation', async () => { const fs = createFs({ stat: vi.fn().mockResolvedValue({ size: 10 * 1024 * 1024 }) }) - const service = new RendererPerformanceLogService( - { get: vi.fn(() => true) } as never, - () => '/user-data', - fs - ) + const service = new RendererPerformanceLogService(() => true, '/user-data', fs) await expect(service.record(validRecord)).resolves.toBe(true) @@ -117,8 +105,8 @@ describe('RendererPerformanceLogService', () => { it('contains write failures without rejecting the renderer route', async () => { const onWriteError = vi.fn() const service = new RendererPerformanceLogService( - { get: vi.fn(() => true) } as never, - () => '/user-data', + () => true, + '/user-data', createFs({ appendFile: vi.fn().mockRejectedValue(new Error('disk unavailable')) }), Date.now, onWriteError diff --git a/test/main/app/schedulerHost.test.ts b/test/main/app/schedulerHost.test.ts new file mode 100644 index 0000000000..d9de06338a --- /dev/null +++ b/test/main/app/schedulerHost.test.ts @@ -0,0 +1,134 @@ +import { EventEmitter } from 'node:events' +import { beforeEach, describe, expect, it, vi } from 'vitest' +import { spawnSchedulerHost } from '@/app/schedulerHost' +import { SchedulerProcessManager } from '@/scheduler/schedulerProcessManager' +import type { SchedulerCommand } from '@shared/cronJobs' + +const mocks = vi.hoisted(() => ({ fork: vi.fn() })) +vi.mock('electron', () => ({ + app: { getAppPath: () => process.cwd() }, + utilityProcess: { fork: mocks.fork } +})) + +describe('Scheduler native launch', () => { + beforeEach(() => { + mocks.fork.mockReset() + }) + + function nativeHost() { + const host = Object.assign(new EventEmitter(), { + pid: 123, + postMessage: vi.fn<(command: SchedulerCommand) => void>(), + kill: vi.fn<() => boolean>() + }) + host.kill.mockImplementation(() => { + host.emit('exit', 0) + return true + }) + mocks.fork.mockReturnValue(host) + return host + } + + function manager() { + return new SchedulerProcessManager({ + getSnapshot: () => ({ enabledJobCount: 1, nextRunAt: 100 }), + queueDueRuns: () => [], + onRunDue: vi.fn(), + spawnHost: spawnSchedulerHost + }) + } + + it('exposes command, event and lifecycle capabilities after native spawn', async () => { + const host = nativeHost() + const pending = spawnSchedulerHost(new AbortController().signal) + host.emit('spawn') + const channel = await pending + expect(channel).not.toBe(host) + expect(channel.pid).toBe(123) + expect(host.listenerCount('spawn')).toBe(0) + expect(host.listenerCount('exit')).toBe(0) + expect(host.listenerCount('error')).toBe(0) + const message = vi.fn(), + exit = vi.fn(), + error = vi.fn() + expect(channel.onMessage(message)).toBeUndefined() + expect(channel.onExit(exit)).toBeUndefined() + expect(channel.onError(error)).toBeUndefined() + host.emit('message', { type: 'READY', pid: 123, now: 100 }) + host.emit('error', 'crash', 'scheduler') + expect(message).toHaveBeenCalledWith({ type: 'READY', pid: 123, now: 100 }) + expect(error).toHaveBeenCalledWith('crash', 'scheduler') + channel.postMessage({ type: 'START', now: 100 }) + expect(host.postMessage).toHaveBeenCalledWith({ type: 'START', now: 100 }) + expect(channel.kill()).toBeUndefined() + expect(exit).toHaveBeenCalledWith(0) + }) + + it('does not fork an already canceled launch', async () => { + const abort = new AbortController() + abort.abort() + await expect(spawnSchedulerHost(abort.signal)).rejects.toMatchObject({ name: 'AbortError' }) + expect(mocks.fork).not.toHaveBeenCalled() + }) + + it('kills a pending native child when its manager stops and ignores a late spawn', async () => { + const host = nativeHost() + const owner = manager() + const pending = owner.start() + const rejected = expect(pending).rejects.toThrow('Scheduler utility spawn canceled') + await owner.stop() + await rejected + expect(host.kill).toHaveBeenCalledTimes(1) + expect(host.postMessage).not.toHaveBeenCalled() + expect(owner.getStatus()).toMatchObject({ state: 'stopped', pid: null, lastError: null }) + for (const event of ['spawn', 'exit', 'error']) expect(host.listenerCount(event)).toBe(0) + host.emit('spawn') + expect(owner.getStatus()).toMatchObject({ state: 'stopped', pid: null }) + }) + + it('cancels a signal aborted while the native fork returns', async () => { + const host = nativeHost() + const abort = new AbortController() + mocks.fork.mockImplementationOnce(() => { + abort.abort() + return host + }) + await expect(spawnSchedulerHost(abort.signal)).rejects.toThrow( + 'Scheduler utility spawn canceled' + ) + expect(host.kill).toHaveBeenCalledTimes(1) + for (const event of ['spawn', 'exit', 'error']) expect(host.listenerCount(event)).toBe(0) + }) + + it.each(['exit', 'error'] as const)( + 'rejects a native %s before spawn without leaving the child alive', + async (event) => { + const host = nativeHost() + const pending = spawnSchedulerHost(new AbortController().signal) + const rejected = expect(pending).rejects.toThrow( + event === 'exit' ? 'exited before spawn: 1' : 'process error: crash at startup' + ) + if (event === 'exit') host.emit('exit', 1) + else host.emit('error', 'crash', 'startup') + await rejected + expect(host.kill).toHaveBeenCalledTimes(1) + for (const name of ['spawn', 'exit', 'error']) expect(host.listenerCount(name)).toBe(0) + host.emit('spawn') + } + ) + + it('does not send reconciliation after stop supersedes a completed native spawn', async () => { + const host = nativeHost() + const owner = manager() + host.postMessage.mockImplementation((command) => { + if (command.type === 'START') void owner.stop() + }) + const pending = owner.start() + const rejected = expect(pending).rejects.toThrow('spawn was superseded') + host.emit('spawn') + await rejected + expect(host.postMessage.mock.calls.map(([command]) => command.type)).toEqual(['START', 'STOP']) + expect(host.kill).toHaveBeenCalledTimes(1) + expect(owner.getStatus()).toMatchObject({ state: 'stopped', pid: null }) + }) +}) diff --git a/test/main/app/settingsService.test.ts b/test/main/app/settingsService.test.ts new file mode 100644 index 0000000000..c117acda36 --- /dev/null +++ b/test/main/app/settingsService.test.ts @@ -0,0 +1,423 @@ +import { describe, expect, it, vi } from 'vitest' +import { AppSettingsService } from '@/app/settingsService' +import { DesktopSettings } from '@/desktop/settings' +import { FontSettings } from '@/desktop/fontSettings' +import { LoggingService } from '@/app/logging' +import { UpdateSettings } from '@/upgrade/settings' +import { SETTINGS_KEYS } from '@shared/contracts/routes' + +function deferred() { + let resolve!: (value: T) => void + const promise = new Promise((done) => { + resolve = done + }) + return { promise, resolve } +} + +function setup() { + const stored = new Map([['cloudSyncSecret', 'wrapped-secret']]) + const storage = { + get: (key: string) => stored.get(key), + set: vi.fn((key: string, value: unknown) => { + stored.set(key, value) + }) + } + const publishEvent = vi.fn() + let theme: 'system' | 'dark' | 'light' = 'system' + const host = { + systemLocale: 'en-US', + readTheme: vi.fn(async () => ({ + theme, + isDark: theme === 'dark' + })), + applyTheme: vi.fn(async (value: 'system' | 'dark' | 'light') => { + theme = value + return theme === 'dark' + }), + refreshLanguage: vi.fn(async (_locale: string): Promise => undefined), + refreshTheme: vi.fn(async (_isDark: boolean): Promise => undefined), + readLaunchAtLogin: vi.fn(async () => false), + setLaunchAtLogin: vi.fn(async (_enabled: boolean) => false), + applyContentProtection: vi.fn(async (_enabled: boolean): Promise => undefined), + applyFloatingButtonEnabled: vi.fn(async (_enabled: boolean): Promise => undefined) + } + let owner!: AppSettingsService + const nativeSnapshots = vi.fn() + const committed = () => owner.publishNativeSnapshot() + const desktopSettings = new DesktopSettings(storage as never, host, publishEvent, committed) + const enumerateFonts = vi.fn(async (): Promise => []) + const loggingHost = { + applyLogging: vi.fn(async (_enabled: boolean): Promise => undefined), + openLoggingFolder: vi.fn(async (): Promise => undefined) + } + let version = 0 + let active = true + owner = new AppSettingsService({ + ownerId: 'settings-owner', + updateSettings: new UpdateSettings(storage as never, '1.1.4-beta.7'), + publishNativeSnapshot: nativeSnapshots, + desktopSettings, + fonts: new FontSettings(storage as never, publishEvent, enumerateFonts), + agentDefaults: { + getAutoCompactionEnabled: () => true, + getAutoCompactionTriggerThreshold: () => 80, + getAutoCompactionRetainRecentPairs: () => 2 + } as never, + privacy: { isEnabled: () => true } as never, + traceSettings: { isEnabled: () => false } as never, + logging: new LoggingService(storage as never, loggingHost, publishEvent, committed), + ocr: { getAutomaticExtractionEnabled: () => true, getBackend: () => 'auto' } as never, + recordActivity: vi.fn(), + publishEvent, + nextVersion: () => ++version, + assertActive: () => { + if (!active) throw new Error('owner unavailable') + } + }) + return { + owner, + nativeSnapshots, + host, + loggingHost, + enumerateFonts, + stored, + storage, + publishEvent, + fence: () => { + active = false + } + } +} + +describe('AppSettingsService', () => { + it('serializes floating presentation effects before acknowledging each change', async () => { + const { owner, host, stored } = setup() + const pending = Promise.withResolvers() + host.applyFloatingButtonEnabled.mockReturnValueOnce(pending.promise) + const first = owner.setFloatingButtonEnabled(true) + await vi.waitFor(() => expect(host.applyFloatingButtonEnabled).toHaveBeenCalledOnce()) + const second = owner.setFloatingButtonEnabled(false) + await Promise.resolve() + expect(stored.get('floatingButtonEnabled')).toBe(true) + pending.resolve() + expect(await first).toBe(true) + expect(await second).toBe(false) + expect(host.applyFloatingButtonEnabled.mock.calls).toEqual([[true], [false]]) + await owner.stop() + }) + + it('does not finish stopping while native floating presentation is pending', async () => { + const { owner, host } = setup() + const pending = Promise.withResolvers() + host.applyFloatingButtonEnabled.mockReturnValueOnce(pending.promise) + const enabling = owner.setFloatingButtonEnabled(true) + await vi.waitFor(() => expect(host.applyFloatingButtonEnabled).toHaveBeenCalledOnce()) + let stopped = false + const stopping = owner.stop().then(() => { + stopped = true + }) + await Promise.resolve() + expect(stopped).toBe(false) + await expect(owner.setFloatingButtonEnabled(false)).rejects.toThrow('stopped') + pending.resolve() + await enabling + await stopping + expect(stopped).toBe(true) + }) + + it('publishes allowlisted native state at commit before ordinary settings events', async () => { + const { owner, nativeSnapshots, publishEvent, stored } = setup() + stored.set('shortcutKey', { privateToken: 'unexpected-secret' }) + stored.set('floatingButtonBounds', { + x: 1, + y: 2, + dockSide: 'left', + secret: 'unexpected-secret' + }) + await owner.update([{ key: 'notificationsEnabled', value: false }]) + const committed = nativeSnapshots.mock.calls.at(-1)![0] + expect(committed).toMatchObject({ + ownerId: 'settings-owner', + notificationsEnabled: false, + updateChannel: 'beta' + }) + expect(JSON.stringify(committed)).not.toContain('wrapped-secret') + expect(JSON.stringify(committed)).not.toContain('unexpected-secret') + expect(nativeSnapshots.mock.invocationCallOrder[0]).toBeLessThan( + publishEvent.mock.invocationCallOrder[0] + ) + await owner.setFloatingButtonBounds({ x: 20, y: 30, dockSide: 'right' }) + expect(nativeSnapshots.mock.calls.at(-1)![0].floatingButtonBounds).toEqual( + stored.get('floatingButtonBounds') + ) + expect(await owner.setUpdateChannel('stable')).toBe('stable') + expect(nativeSnapshots.mock.calls.at(-1)![0].updateChannel).toBe('stable') + await expect(owner.setFloatingButtonBounds({ x: NaN, y: 0, dockSide: 'left' })).rejects.toThrow( + 'Invalid floating bounds' + ) + await owner.stop() + await expect(owner.setFloatingButtonBounds({ x: 0, y: 0, dockSide: 'left' })).rejects.toThrow( + 'stopped' + ) + }) + + it('returns an allowlisted serializable snapshot and normalized mutation values', async () => { + const { owner, publishEvent } = setup() + const snapshot = await owner.getSnapshot() + expect(Object.keys(snapshot.values).sort()).toEqual([...SETTINGS_KEYS].sort()) + expect(JSON.stringify(snapshot)).not.toContain('wrapped-secret') + expect(structuredClone(snapshot)).toEqual(snapshot) + + const updated = await owner.update([{ key: 'fontFamily', value: ' Fixture; Font ' }]) + expect(updated).toMatchObject({ + changedKeys: ['fontFamily'], + values: { fontFamily: 'Fixture Font' } + }) + expect(updated.version).toBeGreaterThan(snapshot.version) + expect((await owner.getSnapshot(['fontFamily'])).values).toEqual(updated.values) + await owner.publishSnapshot() + expect(publishEvent).toHaveBeenLastCalledWith('settings.changed', { + changedKeys: [...SETTINGS_KEYS], + version: expect.any(Number), + values: (await owner.getSnapshot()).values + }) + }) + + it('returns the native owner previous value only after the mutation succeeds', async () => { + const { owner, stored } = setup() + expect( + await owner.applyDisplayChange({ id: 'copyWithCotEnabled', value: false }) + ).toMatchObject({ + ok: true, + id: 'copyWithCotEnabled', + previousValue: true, + value: false + }) + expect(stored.get('copyWithCotEnabled')).toBe(false) + expect(await owner.applyDisplayChange({ id: 'copyWithCotEnabled', value: true })).toMatchObject( + { + previousValue: false, + value: true + } + ) + }) + + it('rejects invalid and fenced commands before native writes', async () => { + const { owner, storage, fence } = setup() + await expect( + owner.applyDisplayChange({ id: 'fontSizeLevel', value: 5 } as never) + ).rejects.toThrow() + await expect( + owner.applyDisplayChange({ id: 'theme', value: 'light', extra: true } as never) + ).rejects.toThrow() + fence() + await expect( + owner.applyDisplayChange({ id: 'copyWithCotEnabled', value: false }) + ).rejects.toThrow('owner unavailable') + await expect(owner.update([{ key: 'fontSizeLevel', value: 2 }])).rejects.toThrow( + 'owner unavailable' + ) + await expect(owner.getSnapshot()).rejects.toThrow('owner unavailable') + await expect(owner.publishSnapshot()).rejects.toThrow('owner unavailable') + expect(storage.set).not.toHaveBeenCalled() + }) + + it('does not acknowledge or publish a failed persistent mutation', async () => { + const { owner, storage, publishEvent } = setup() + storage.set.mockImplementationOnce(() => { + throw new Error('storage unavailable') + }) + await expect( + owner.applyDisplayChange({ id: 'copyWithCotEnabled', value: false }) + ).rejects.toThrow('storage unavailable') + expect(publishEvent).not.toHaveBeenCalled() + expect((await owner.getSnapshot(['copyWithCotEnabled'])).values.copyWithCotEnabled).toBe(true) + }) + + it('orders native acknowledgements, display receipts and following snapshots together', async () => { + const { owner, host, publishEvent } = setup() + const refreshing = deferred() + host.refreshTheme.mockReturnValueOnce(refreshing.promise) + const first = owner.setTheme('dark') + await vi.waitFor(() => expect(host.refreshTheme).toHaveBeenCalledWith(true)) + const display = owner.applyDisplayChange({ id: 'theme', value: 'light' }) + const snapshot = owner.getTheme() + expect(publishEvent).not.toHaveBeenCalled() + refreshing.resolve() + expect(await first).toEqual({ theme: 'dark', isDark: true }) + expect(await display).toMatchObject({ previousValue: 'dark', value: 'light' }) + expect(await snapshot).toEqual({ theme: 'light', isDark: false }) + }) + + it('awaits normalized language refresh and recovers after a failed native command', async () => { + const { owner, host, publishEvent, stored } = setup() + const refreshing = deferred() + host.refreshLanguage.mockReturnValueOnce(refreshing.promise) + const changed = owner.setLanguage('fa') + await vi.waitFor(() => expect(host.refreshLanguage).toHaveBeenCalledWith('fa-IR')) + expect(publishEvent).not.toHaveBeenCalled() + refreshing.resolve() + expect(await changed).toEqual({ requestedLanguage: 'fa-IR', locale: 'fa-IR', direction: 'rtl' }) + publishEvent.mockClear() + host.applyTheme.mockRejectedValueOnce(new Error('native unavailable')) + await expect(owner.setTheme('dark')).rejects.toThrow('native unavailable') + expect(stored.has('appTheme')).toBe(false) + expect(publishEvent).not.toHaveBeenCalled() + expect(await owner.setTheme('light')).toEqual({ theme: 'light', isDark: false }) + }) + + it('queries login state only when selected and returns the observed OS value', async () => { + const { owner, host, stored, publishEvent } = setup() + await owner.getSnapshot(['autoScrollEnabled']) + await owner.update([{ key: 'fontSizeLevel', value: 2 }]) + expect(host.readLaunchAtLogin).not.toHaveBeenCalled() + expect((await owner.getSnapshot(['launchAtLoginEnabled'])).values).toEqual({ + launchAtLoginEnabled: false + }) + expect((await owner.update([{ key: 'launchAtLoginEnabled', value: true }])).values).toEqual({ + launchAtLoginEnabled: false + }) + expect(host.setLaunchAtLogin).toHaveBeenCalledWith(true) + expect(stored.has('launchAtLoginEnabled')).toBe(false) + expect(publishEvent).toHaveBeenLastCalledWith( + 'settings.changed', + expect.objectContaining({ values: { launchAtLoginEnabled: false } }) + ) + }) + + it('fences queued commands and drains active host work before restart', async () => { + const { owner, host, stored } = setup() + const refreshing = deferred() + host.refreshTheme.mockReturnValueOnce(refreshing.promise) + const started = owner.setTheme('dark') + await vi.waitFor(() => expect(host.refreshTheme).toHaveBeenCalled()) + const queued = owner.update([{ key: 'fontSizeLevel', value: 3 }]) + const queuedRejected = expect(queued).rejects.toThrow('Settings owner is stopped') + let drained = false + const stopping = owner.stop().then(() => { + drained = true + }) + await expect(owner.getTheme()).rejects.toThrow('Settings owner is stopped') + await expect(owner.observeSystemTheme()).rejects.toThrow('Settings owner is stopped') + expect(() => owner.start()).toThrow('still draining') + expect(drained).toBe(false) + refreshing.resolve() + await started + await queuedRejected + await stopping + expect(stored.has('fontSizeLevel')).toBe(false) + owner.start() + expect((await owner.update([{ key: 'fontSizeLevel', value: 2 }])).values).toEqual({ + fontSizeLevel: 2 + }) + }) + + it('does not release or restart an owner whose native drain timed out', async () => { + const { owner, host } = setup() + const refreshing = deferred() + host.refreshTheme.mockReturnValueOnce(refreshing.promise) + const started = owner.setTheme('dark') + await vi.waitFor(() => expect(host.refreshTheme).toHaveBeenCalled()) + vi.useFakeTimers() + try { + const stopped = expect(owner.stop()).rejects.toThrow('did not drain') + await vi.advanceTimersByTimeAsync(30_000) + await stopped + expect(() => owner.start()).toThrow('still draining') + refreshing.resolve() + await started + await owner.stop() + owner.start() + expect(await owner.getTheme()).toEqual({ theme: 'dark', isDark: true }) + } finally { + vi.useRealTimers() + } + }) + + it('bounds pending commands while a native observation is blocked', async () => { + const { owner, host } = setup() + const login = deferred() + host.readLaunchAtLogin.mockReturnValueOnce(login.promise) + const snapshot = owner.getSnapshot() + await vi.waitFor(() => expect(host.readLaunchAtLogin).toHaveBeenCalled()) + const changes = Array.from({ length: 63 }, (_, index) => + owner.update([{ key: 'fontSizeLevel', value: (index % 4) + 1 }]) + ) + await expect(owner.update([{ key: 'fontSizeLevel', value: 1 }])).rejects.toThrow( + 'queue is full' + ) + const observations = Array.from({ length: 100 }, () => owner.observeSystemTheme()) + login.resolve(false) + await snapshot + await Promise.all(changes) + await Promise.all(observations) + expect(host.readTheme).toHaveBeenCalledTimes(1) + expect((await owner.getSnapshot(['fontSizeLevel'])).values).toEqual({ fontSizeLevel: 3 }) + }) + + it('coalesces pending system events and observes a newer change after active native work', async () => { + const { owner, host, publishEvent } = setup() + const observed = deferred<{ theme: 'system'; isDark: boolean }>() + host.readTheme.mockReturnValueOnce(observed.promise) + host.readTheme.mockResolvedValue({ theme: 'system', isDark: true }) + const first = owner.observeSystemTheme() + await vi.waitFor(() => expect(host.readTheme).toHaveBeenCalledTimes(1)) + const following = Array.from({ length: 100 }, () => owner.observeSystemTheme()) + observed.resolve({ theme: 'system', isDark: false }) + await first + await Promise.all(following) + expect(host.readTheme).toHaveBeenCalledTimes(2) + const colors = publishEvent.mock.calls + .filter(([name]) => name === 'config.systemTheme.changed') + .map(([, payload]) => payload.isDark) + expect(colors).toEqual([false, true]) + await owner.setTheme('light') + publishEvent.mockClear() + await owner.observeSystemTheme() + expect(publishEvent).not.toHaveBeenCalled() + }) + + it.each(['contentProtectionEnabled', 'loggingEnabled'] as const)( + 'awaits native %s completion before its event and receipt', + async (key) => { + const { owner, host, loggingHost, publishEvent } = setup() + const effect = + key === 'contentProtectionEnabled' ? host.applyContentProtection : loggingHost.applyLogging + const finishing = deferred() + effect.mockReturnValueOnce(finishing.promise) + const changed = owner.update([{ key, value: true }]) + await vi.waitFor(() => expect(effect).toHaveBeenCalledWith(true)) + expect(publishEvent).not.toHaveBeenCalled() + finishing.resolve() + expect((await changed).values).toEqual({ [key]: true }) + expect(publishEvent).toHaveBeenCalledWith( + 'settings.changed', + expect.objectContaining({ values: { [key]: true } }) + ) + } + ) + + it('drains actual font enumeration and fences queued folder requests before stopping', async () => { + const { owner, enumerateFonts, loggingHost } = setup() + const enumerated = deferred() + enumerateFonts.mockReturnValueOnce(enumerated.promise) + const fonts = owner.listSystemFonts() + await vi.waitFor(() => expect(enumerateFonts).toHaveBeenCalledOnce()) + const folder = expect(owner.openLoggingFolder()).rejects.toThrow('Settings owner is stopped') + let drained = false + const stopping = owner.stop().then(() => { + drained = true + }) + expect(drained).toBe(false) + enumerated.resolve(['Inter Regular', 'Inter Bold', 'Menlo']) + expect(await fonts).toEqual(['Inter', 'Menlo']) + await folder + await stopping + expect(loggingHost.openLoggingFolder).not.toHaveBeenCalled() + owner.start() + expect(await owner.listSystemFonts()).toEqual(['Inter', 'Menlo']) + expect(enumerateFonts).toHaveBeenCalledOnce() + await owner.openLoggingFolder() + expect(loggingHost.openLoggingFolder).toHaveBeenCalledOnce() + }) +}) diff --git a/test/main/app/startupWorkloadCoordinator.test.ts b/test/main/app/startupWorkloadCoordinator.test.ts index 5b2b6c8f76..a84b07119e 100644 --- a/test/main/app/startupWorkloadCoordinator.test.ts +++ b/test/main/app/startupWorkloadCoordinator.test.ts @@ -279,6 +279,99 @@ describe('StartupWorkloadCoordinator', () => { expect(onFailure).not.toHaveBeenCalled() }) + it('drains actual callbacks across canceled runs without waiting for another target', async () => { + const { StartupWorkloadCoordinator } = await import('@/app/startupWorkloadCoordinator') + const coordinator = new StartupWorkloadCoordinator() + const first = createDeferred() + const next = createDeferred() + const settings = createDeferred() + const schedule = (target: 'main' | 'settings', result: Promise) => + coordinator.scheduleTask({ + id: 'owner', + target, + phase: 'background', + resource: 'io', + labelKey: 'startup.test', + run: async () => await result + }) + const original = schedule('main', first.promise) + const originalRejected = expect(original).rejects.toMatchObject({ name: 'AbortError' }) + coordinator.createRun('main') + await originalRejected + const current = schedule('main', next.promise) + const currentRejected = expect(current).rejects.toMatchObject({ name: 'AbortError' }) + const unrelated = schedule('settings', settings.promise) + + let drained = false + const drain = coordinator.cancelAndDrainTarget('main').then(() => { + drained = true + }) + await currentRejected + next.resolve() + await new Promise((resolve) => setImmediate(resolve)) + expect(drained).toBe(false) + first.reject(new Error('late callback failure')) + await drain + expect(drained).toBe(true) + settings.resolve() + await unrelated + expect(coordinator.isIdle()).toBe(true) + }) + + it('cancels queued work without executing it while an active callback drains', async () => { + const { StartupWorkloadCoordinator } = await import('@/app/startupWorkloadCoordinator') + const coordinator = new StartupWorkloadCoordinator() + const release = createDeferred() + const schedule = (id: string, run: () => Promise) => + coordinator.scheduleTask({ + id, + target: 'main', + phase: 'background', + resource: 'cpu', + labelKey: 'startup.test', + run + }) + const active = schedule('active', () => release.promise) + const runQueued = vi.fn(async () => undefined) + const queued = schedule('queued', runQueued) + const rejected = [active, queued].map((task) => + expect(task).rejects.toMatchObject({ name: 'AbortError' }) + ) + const drain = coordinator.cancelAndDrainTarget('main') + await Promise.all(rejected) + release.resolve() + await drain + expect(runQueued).not.toHaveBeenCalled() + expect(coordinator.isIdle()).toBe(true) + }) + + it('bounds drain failure and keeps an old callback available to a later drain', async () => { + vi.useFakeTimers() + const { StartupWorkloadCoordinator } = await import('@/app/startupWorkloadCoordinator') + const coordinator = new StartupWorkloadCoordinator() + const release = createDeferred() + const task = coordinator.scheduleTask({ + id: 'held', + target: 'main', + phase: 'background', + resource: 'io', + labelKey: 'startup.test', + run: () => release.promise + }) + const rejected = expect(task).rejects.toMatchObject({ name: 'AbortError' }) + const timeout = expect(coordinator.cancelAndDrainTarget('main')).rejects.toThrow('30000ms') + await rejected + await vi.advanceTimersByTimeAsync(30_000) + await timeout + expect(vi.getTimerCount()).toBe(0) + expect(coordinator.isIdle()).toBe(false) + const retry = coordinator.cancelAndDrainTarget('main') + release.resolve() + await retry + expect(vi.getTimerCount()).toBe(0) + expect(coordinator.isIdle()).toBe(true) + }) + it('does not starve interactive io work behind occupied background lanes', async () => { const { StartupWorkloadCoordinator } = await import('@/app/startupWorkloadCoordinator') const coordinator = new StartupWorkloadCoordinator() diff --git a/test/main/cli/runService.test.ts b/test/main/cli/runService.test.ts index 066fe351f4..7a30cb5acd 100644 --- a/test/main/cli/runService.test.ts +++ b/test/main/cli/runService.test.ts @@ -16,6 +16,7 @@ import type { import { DEFAULT_ORCHESTRATION_POLICY } from '@shared/orchestration/policy' import { LOCAL_CONTROL_MAX_JSON_RESPONSE_BYTES } from '@shared/contracts/localControl' import { CliRunService, type CliRunServiceOptions } from '@/cli/runService' +import { DatabaseRequestGate } from '@/app/databaseRequestGate' import { CliRequestError } from '@/cli/errors' import { TypedEventHub, type TypedEventRecord } from '@/events/typedEventHub' import type { CliRouteCaller, RouteContext } from '@/routes/routeRegistry' @@ -47,6 +48,7 @@ const baseSession: SessionWithState = { sessionKind: 'regular', parentSessionId: null, subagentMeta: null, + toolModeOverride: null, orchestrationPolicy: DEFAULT_ORCHESTRATION_POLICY, createdAt: 100, updatedAt: 101, @@ -145,6 +147,7 @@ function createHarness( storedSession?: SessionRecord | null messages?: ChatMessageRecord[] hasWaitingDescendantInteraction?: boolean + readSubscriptionSnapshot?: CliRunServiceOptions['readSubscriptionSnapshot'] } = {} ): { service: CliRunService @@ -195,6 +198,8 @@ function createHarness( projection, sessions, getPendingAssistantMessages, + readSubscriptionSnapshot: + overrides.readSubscriptionSnapshot ?? (async (read) => await read()), hasWaitingDescendantInteraction: vi.fn( () => overrides.hasWaitingDescendantInteraction ?? false ), @@ -1025,6 +1030,53 @@ describe('CliRunService', () => { expect(turn.cancelGeneration).not.toHaveBeenCalled() }) + it('drains only the initial database snapshot while the event watcher stays connected', async () => { + const gate = new DatabaseRequestGate(() => undefined) + const { service, projection } = createHarness({ + readSubscriptionSnapshot: (read) => gate.runRequest('events.subscribe', read) + }) + let release!: (session: SessionWithState) => void + vi.spyOn(projection, 'getSession').mockImplementationOnce( + () => + new Promise((resolve) => { + release = resolve + }) + ) + let ready!: () => void + const snapshotReady = new Promise((resolve) => { + ready = resolve + }) + const controller = new AbortController() + let finished = false + const result = service + .dispatchStream( + eventsSubscribeRoute.name, + { runId: 'run-1' }, + humanCaller, + controller.signal, + async (event) => { + if (event === 'runs.snapshot') ready() + } + ) + .finally(() => { + finished = true + }) + gate.beginMaintenance() + let drained = false + const drain = gate.drain().then(() => { + drained = true + }) + await Promise.resolve() + expect(drained).toBe(false) + release(baseSession) + await snapshotReady + await drain + expect(finished).toBe(false) + controller.abort() + await result + gate.resume() + }) + it('rejects renderer callers before exposing run existence', async () => { const { service } = createHarness() diff --git a/test/main/config/secretStore.test.ts b/test/main/config/secretStore.test.ts new file mode 100644 index 0000000000..93cbeba575 --- /dev/null +++ b/test/main/config/secretStore.test.ts @@ -0,0 +1,98 @@ +import { describe, expect, it, vi } from 'vitest' +import { SecretStore } from '@/config/secretStore' + +function fixture() { + const values = new Map([['credential', 'wrapped:previous']]) + const settings = { + get: (key: string) => values.get(key), + set: vi.fn((key: string, value: string) => values.set(key, value)), + delete: (key: string) => values.delete(key) + } + const crypto = { + isAvailable: vi.fn(async () => true), + encrypt: vi.fn(async (value: string) => `wrapped:${value}`), + decrypt: vi.fn(async (wrapped: string) => wrapped.slice('wrapped:'.length)) + } + return { values, settings, crypto, secrets: new SecretStore(settings as never, crypto) } +} + +describe('SecretStore lifecycle', () => { + it.each([false, true])( + 'fences opaque unwrap results across maintenance (native failure=%s)', + async (failed) => { + const f = fixture() + const pending = Promise.withResolvers() + f.crypto.decrypt.mockReturnValueOnce(pending.promise) + const result = f.secrets.unwrap('wrapped:opaque') + const rejected = expect(result).rejects.toThrow('interrupted') + f.secrets.pause() + f.secrets.resume() + if (failed) pending.reject(new Error('native unavailable')) + else pending.resolve('opaque') + await rejected + expect(f.settings.set).not.toHaveBeenCalled() + } + ) + + it('does not cache or rewrite opaque credentials after a native unwrap failure', async () => { + const f = fixture() + expect(await f.secrets.unwrap('wrapped:opaque')).toBe('opaque') + f.crypto.decrypt.mockRejectedValueOnce(new Error('native unavailable')) + await expect(f.secrets.unwrap('wrapped:opaque')).rejects.toThrow('native unavailable') + expect(f.settings.set).not.toHaveBeenCalled() + }) + it.each(['encrypt', 'decrypt'] as const)( + 'rejects a pending %s after maintenance resumes, including native failure', + async (operation) => { + for (const failed of [false, true]) { + const f = fixture() + const pending = Promise.withResolvers() + f.crypto[operation].mockImplementationOnce(() => pending.promise) + const result = + operation === 'encrypt' ? f.secrets.wrap('next') : f.secrets.get('credential') + const rejected = expect(result).rejects.toThrow('interrupted') + await vi.waitFor(() => expect(f.crypto[operation]).toHaveBeenCalledOnce()) + f.secrets.pause() + await expect(f.secrets.get('credential')).rejects.toThrow('interrupted') + expect(() => f.secrets.setWrapped('credential', 'unexpected')).toThrow('interrupted') + f.secrets.resume() + if (failed) pending.reject(new Error('Native crypto unavailable')) + else pending.resolve(operation === 'encrypt' ? 'wrapped:next' : 'previous') + await rejected + expect(f.values.get('credential')).toBe('wrapped:previous') + expect(await f.secrets.get('credential')).toBe('previous') + } + } + ) + + it('does not release a credential replaced or removed while decrypting', async () => { + const f = fixture() + const pending = Promise.withResolvers() + f.crypto.decrypt.mockReturnValueOnce(pending.promise) + const read = f.secrets.get('credential') + f.secrets.restoreWrapped('credential', undefined) + const rejected = expect(read).rejects.toThrow('credential changed') + pending.resolve('previous') + await rejected + expect(await f.secrets.get('credential')).toBe('') + }) + + it('keeps existing wrapped data when encryption is unavailable or fails', async () => { + const f = fixture() + f.crypto.isAvailable.mockResolvedValueOnce(false) + await expect(f.secrets.wrap('next')).rejects.toThrow('safeStorageUnavailable') + f.crypto.encrypt.mockRejectedValueOnce(new Error('Native encryption failed')) + await expect(f.secrets.wrap('next')).rejects.toThrow('Native encryption failed') + expect(f.settings.set).not.toHaveBeenCalled() + expect(f.values.get('credential')).toBe('wrapped:previous') + }) + + it('does not cache plaintext or rewrite credentials when native decryption fails', async () => { + const f = fixture() + expect(await f.secrets.get('credential')).toBe('previous') + f.crypto.decrypt.mockRejectedValueOnce(new Error('Native decryption unavailable')) + expect(await f.secrets.get('credential')).toBe('') + expect(await f.secrets.get('credential')).toBe('previous') + expect(f.settings.set).not.toHaveBeenCalled() + }) +}) diff --git a/test/main/config/settingsStore.test.ts b/test/main/config/settingsStore.test.ts new file mode 100644 index 0000000000..a846072b9f --- /dev/null +++ b/test/main/config/settingsStore.test.ts @@ -0,0 +1,106 @@ +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' +import { existsSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from 'node:fs' +import { tmpdir } from 'node:os' +import path from 'node:path' +import Database from 'better-sqlite3-multiple-ciphers' +import { createSettingsStore } from '@/config/settingsStore' +import { SettingsDatabase } from '@/settings/data/database' + +vi.unmock('fs') + +describe('application settings file owner', () => { + let profile: string + let db: InstanceType | undefined + const options = () => ({ + userDataDirectory: profile, + homeDirectory: path.join(profile, 'home-fact'), + currentAppVersion: '1.2.3-beta.4' + }) + const readFile = () => JSON.parse(readFileSync(path.join(profile, 'app-settings.json'), 'utf8')) + + beforeEach(() => { + profile = mkdtempSync(path.join(tmpdir(), 'deepchat-settings-owner-')) + }) + afterEach(() => { + db?.close() + db = undefined + rmSync(profile, { recursive: true, force: true }) + }) + + it('uses the legacy filename and bootstrap defaults without native directory lookup', () => { + const store = createSettingsStore(options()) + + expect(store.path).toBe(path.join(profile, 'app-settings.json')) + expect(store.get('language')).toBe('system') + expect(store.get('appVersion')).toBe('1.2.3-beta.4') + expect(store.get('skillsPath')).toBe(path.join(profile, 'home-fact', '.deepchat', 'skills')) + expect(store.get('syncFolderPath')).toBe(path.join(profile, 'sync')) + expect(store.get('privacyModeEnabled')).toBe(false) + expect(existsSync(options().homeDirectory)).toBe(false) + }) + + it('preserves existing values and extension data through dot-path mutations and reopen', () => { + writeFileSync( + path.join(profile, 'app-settings.json'), + JSON.stringify({ + appVersion: '0.9.0', + language: 'en-US', + extension: { enabled: true, retained: ['legacy'] } + }) + ) + const store = createSettingsStore(options()) + expect(store.get('appVersion')).toBe('0.9.0') + expect(store.get('language')).toBe('en-US') + store.set({ language: 'zh-CN', 'extension.nested.mode': 'custom' }) + expect(store.has('extension.nested.mode')).toBe(true) + expect(readFile().extension).toEqual({ + enabled: true, + retained: ['legacy'], + nested: { mode: 'custom' } + }) + store.delete('extension.nested.mode') + const reopened = createSettingsStore(options()) + expect(reopened.has('extension.nested.mode')).toBe(false) + expect(reopened.get('extension.retained')).toEqual(['legacy']) + expect(reopened.get('language')).toBe('zh-CN') + }) + + it('rejects corrupt legacy data without replacing it with defaults', () => { + const file = path.join(profile, 'app-settings.json') + writeFileSync(file, '{broken legacy data') + expect(() => createSettingsStore(options())).toThrow() + expect(readFileSync(file, 'utf8')).toBe('{broken legacy data') + }) + + it.each(['userDataDirectory', 'homeDirectory'] as const)('rejects a relative %s', (key) => { + expect(() => createSettingsStore({ ...options(), [key]: 'relative' })).toThrow( + 'Settings directories must be absolute' + ) + expect(existsSync(path.join(profile, 'app-settings.json'))).toBe(false) + }) + + it('retains one file adapter while portable and sensitive settings use the attached database', () => { + const store = createSettingsStore(options()) + store.set('defaultModel', { providerId: 'legacy', modelId: 'old' }) + db = new Database(':memory:') + const database = new SettingsDatabase({ getDatabase: () => db! }) + database.appSettingsTable.createTable() + store.attachDatabase(database) + expect(store.get('defaultModel')).toEqual({ providerId: 'legacy', modelId: 'old' }) + store.set('defaultModel', { providerId: 'current', modelId: 'new' }) + store.set('hooksNotifications', { hooks: [{ id: 'database-only' }] }) + store.set('language', 'en-US') + + expect(database.appSettingsTable.getAppSetting('defaultModel')).toEqual({ + providerId: 'current', + modelId: 'new' + }) + expect(database.appSettingsTable.getAppSetting('hooksNotifications')).toEqual({ + hooks: [{ id: 'database-only' }] + }) + expect(readFile().hooksNotifications).toEqual({ hooks: [] }) + expect(readFile().defaultModel).toEqual({ providerId: 'legacy', modelId: 'old' }) + expect(readFile().language).toBe('en-US') + expect(() => store.attachDatabase(database)).toThrow('Settings database is already attached') + }) +}) diff --git a/test/main/deeplink/deeplinkService.test.ts b/test/main/deeplink/deeplinkService.test.ts index 6b2c007e90..ab98ef3f31 100644 --- a/test/main/deeplink/deeplinkService.test.ts +++ b/test/main/deeplink/deeplinkService.test.ts @@ -19,12 +19,7 @@ const presenterMock = vi.hoisted(() => ({ getAllWindows: vi.fn().mockReturnValue([]), getFocusedWindow: vi.fn().mockReturnValue(null) }, - providerSettings: { - getProviderById: vi.fn() - }, - mcpService: { - isReady: vi.fn().mockReturnValue(true) - }, + providerExists: vi.fn(), semanticNotifications: { occur: vi.fn(), recover: vi.fn() @@ -42,16 +37,17 @@ describe('DeeplinkService', () => { const createProviderInstallBase64 = (payload: Record) => Buffer.from(JSON.stringify(payload)).toString('base64') - const createDeeplinkService = async () => { + const createDeeplinkService = async (mcpReady = true) => { const { createDeeplinkActions } = await import('@/deeplink/actions') const { DeeplinkService } = await import('@/deeplink') const actions = createDeeplinkActions({ window: presenterMock.windowPresenter as any, - config: presenterMock.providerSettings as any, - mcp: presenterMock.mcpService as any, + hasProvider: presenterMock.providerExists, notifications: presenterMock.semanticNotifications }) - return new DeeplinkService(actions.desktop, actions.mcp, actions.provider) + const service = new DeeplinkService(actions.desktop, actions.mcp, actions.provider) + service.observeMcpReadiness(mcpReady) + return service } beforeEach(async () => { @@ -65,21 +61,9 @@ describe('DeeplinkService', () => { presenterMock.windowPresenter.setPendingSettingsProviderInstall.mockReset() presenterMock.windowPresenter.getAllWindows.mockReturnValue([]) presenterMock.windowPresenter.getFocusedWindow.mockReturnValue(null) - presenterMock.mcpService.isReady.mockReturnValue(true) - presenterMock.providerSettings.getProviderById.mockImplementation((providerId: string) => { - if (providerId === 'openai') { - return { - id: 'openai', - name: 'OpenAI', - apiType: 'openai', - apiKey: '', - baseUrl: 'https://api.openai.com/v1', - enable: false - } - } - - return undefined - }) + presenterMock.providerExists.mockImplementation( + async (providerId: string) => providerId === 'openai' + ) }) afterEach(() => { @@ -235,20 +219,63 @@ describe('DeeplinkService', () => { } } const url = `deepchat:mcp/install?code=${Buffer.from(JSON.stringify(payload)).toString('base64')}` - presenterMock.mcpService.isReady.mockReturnValue(false) + deeplinkService.observeMcpReadiness(false) await deeplinkService.handleDeepLink(url) expect((deeplinkService as any).pendingMcpInstallUrl).toBe(url) expect(presenterMock.windowPresenter.createSettingsWindow).not.toHaveBeenCalled() - presenterMock.mcpService.isReady.mockReturnValue(true) - deeplinkService.processPendingMcpInstall() + deeplinkService.observeMcpReadiness(true) expect(handleDeepLink).toHaveBeenNthCalledWith(2, url) expect((deeplinkService as any).pendingMcpInstallUrl).toBeNull() }) + it('awaits provider existence before allowing the native settings preview', async () => { + const service = await createDeeplinkService() + const query = Promise.withResolvers() + presenterMock.providerExists.mockReturnValue(query.promise) + const payload = createProviderInstallBase64({ + id: 'openai', + baseUrl: 'https://proxy.example.com/v1', + apiKey: 'incoming-fixture' + }) + const request = service.handleDeepLink(`deepchat://provider/install?v=1&data=${payload}`) + expect(presenterMock.windowPresenter.createSettingsWindow).not.toHaveBeenCalled() + query.resolve(false) + await request + expect(presenterMock.windowPresenter.createSettingsWindow).not.toHaveBeenCalled() + expect(presenterMock.semanticNotifications.occur).toHaveBeenCalledWith({ + code: 'providerDeeplink.failed', + reason: 'provider-not-found' + }) + }) + + it('releases only the latest pending MCP preview once for an observed startup', async () => { + const { DeeplinkService } = await import('@/deeplink') + const requestInstall = vi.fn(async (_mcpConfig: string) => true) + const service = new DeeplinkService( + { requestStart: async () => true }, + { requestInstall }, + { hasProvider: async () => false, requestInstall: async () => true, reportFailure: () => {} } + ) + for (const name of ['first', 'latest']) { + const payload = Buffer.from( + JSON.stringify({ mcpServers: { [name]: { command: 'node', args: [] } } }) + ).toString('base64') + await service.handleDeepLink(`deepchat://mcp/install?code=${payload}`) + } + service.observeMcpReadiness(false) + expect(requestInstall).not.toHaveBeenCalled() + service.observeMcpReadiness(true) + await vi.waitFor(() => expect(requestInstall).toHaveBeenCalledOnce()) + expect(Object.keys(JSON.parse(requestInstall.mock.calls[0][0]).mcpServers)).toEqual(['latest']) + service.observeMcpReadiness(true) + await Promise.resolve() + expect(requestInstall).toHaveBeenCalledOnce() + }) + it('routes built-in provider imports to settings and stores the preview for replay', async () => { const deeplinkService = await createDeeplinkService() const payload = { diff --git a/test/main/desktop/configurationHost.test.ts b/test/main/desktop/configurationHost.test.ts new file mode 100644 index 0000000000..6318cdf456 --- /dev/null +++ b/test/main/desktop/configurationHost.test.ts @@ -0,0 +1,129 @@ +import { mkdtempSync, existsSync, rmSync } from 'node:fs' +import { tmpdir } from 'node:os' +import { join } from 'node:path' +import { shell } from 'electron' +import fontList from 'font-list' +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' +import { DesktopConfigurationHost } from '@/desktop/configurationHost' +import { reportNativeMainError } from '@/logging' + +vi.unmock('fs') +vi.mock('font-list', () => ({ default: { getFonts: vi.fn() } })) +vi.mock('@/logging', () => ({ reportNativeMainError: vi.fn() })) + +describe('DesktopConfigurationHost', () => { + let directory: string + const hosts: DesktopConfigurationHost[] = [] + const setup = () => { + const persistence = vi.fn() + const restart = vi.fn(async (): Promise => undefined) + const host = new DesktopConfigurationHost(directory, persistence, restart) + hosts.push(host) + return { host, persistence, restart } + } + + beforeEach(() => { + vi.clearAllMocks() + vi.useFakeTimers() + directory = mkdtempSync(join(tmpdir(), 'deepchat-desktop-configuration-')) + vi.mocked(shell.openPath).mockResolvedValue('') + }) + + afterEach(() => { + for (const host of hosts.splice(0)) host.close() + vi.useRealTimers() + rmSync(directory, { recursive: true, force: true }) + }) + + it('opens only the private profile logging directory and propagates native failures', async () => { + const { host } = setup() + await host.openLoggingFolder() + expect(existsSync(join(directory, 'logs'))).toBe(true) + expect(shell.openPath).toHaveBeenCalledWith(join(directory, 'logs')) + vi.mocked(shell.openPath).mockResolvedValueOnce('permission denied') + await expect(host.openLoggingFolder()).rejects.toThrow('permission denied') + }) + + it('delegates font enumeration to the existing native implementation', async () => { + const { host } = setup() + vi.mocked(fontList.getFonts).mockResolvedValueOnce(['Inter Regular', 'Menlo']) + await expect(host.listSystemFonts()).resolves.toEqual(['Inter Regular', 'Menlo']) + expect(fontList.getFonts).toHaveBeenCalledTimes(1) + }) + + it('does not launch a folder after close while its directory creation is pending', async () => { + const { host } = setup() + const opening = host.openLoggingFolder() + host.close() + await expect(opening).rejects.toThrow('host is closed') + expect(shell.openPath).not.toHaveBeenCalled() + }) + + it('retains one logging/content-protection restart across startup and maintenance pauses', async () => { + const { host, restart, persistence } = setup() + await host.applyLogging(true) + await vi.advanceTimersByTimeAsync(2000) + expect(restart).not.toHaveBeenCalled() + host.resume() + await vi.advanceTimersByTimeAsync(800) + await host.applyLogging(false) + host.requestRestart() + host.pause() + await vi.advanceTimersByTimeAsync(2000) + expect(restart).not.toHaveBeenCalled() + host.resume() + await vi.advanceTimersByTimeAsync(999) + expect(restart).not.toHaveBeenCalled() + await vi.advanceTimersByTimeAsync(1) + expect(restart).toHaveBeenCalledTimes(1) + expect(persistence.mock.calls).toEqual([[true], [false]]) + }) + + it('cancels a pending restart and fences native requests when closed', async () => { + const { host, restart } = setup() + host.resume() + await host.applyLogging(true) + host.close() + await vi.advanceTimersByTimeAsync(2000) + expect(restart).not.toHaveBeenCalled() + await expect(host.applyLogging(false)).rejects.toThrow('host is closed') + await expect(host.listSystemFonts()).rejects.toThrow('host is closed') + await expect(host.openLoggingFolder()).rejects.toThrow('host is closed') + expect(() => host.requestRestart()).toThrow('host is closed') + expect(() => host.resume()).toThrow('host is closed') + }) + + it('transfers a fired restart to the shutdown coordinator without waiting on itself', async () => { + const { host, restart } = setup() + let finish!: () => void + restart.mockImplementationOnce( + () => + new Promise((resolve) => { + finish = resolve + }) + ) + host.resume() + await host.applyLogging(true) + await vi.advanceTimersByTimeAsync(1000) + expect(restart).toHaveBeenCalledTimes(1) + host.close() + finish() + await Promise.resolve() + expect(restart).toHaveBeenCalledTimes(1) + }) + + it('reports failed restart authority without replaying it', async () => { + const { host, restart } = setup() + const failure = new Error('shutdown did not drain') + restart.mockRejectedValueOnce(failure) + host.resume() + await host.applyLogging(true) + await vi.advanceTimersByTimeAsync(2000) + expect(reportNativeMainError).toHaveBeenCalledWith('Application restart failed:', failure) + expect(restart).toHaveBeenCalledTimes(1) + }) + + it('requires an absolute private profile directory', () => { + expect(() => new DesktopConfigurationHost('relative', vi.fn(), vi.fn())).toThrow('absolute') + }) +}) diff --git a/test/main/desktop/configurationProjection.test.ts b/test/main/desktop/configurationProjection.test.ts new file mode 100644 index 0000000000..dbbbd7ee86 --- /dev/null +++ b/test/main/desktop/configurationProjection.test.ts @@ -0,0 +1,95 @@ +import { describe, expect, it, vi } from 'vitest' +import { DesktopConfigurationProjection } from '@/desktop/configurationProjection' +import { defaultShortcutKey } from '@/desktop/shortcutKeySettings' +import type { NativeConfigurationSnapshot } from '@shared/types/nativeConfiguration' + +const snapshot = (): NativeConfigurationSnapshot => ({ + ownerId: 'core-one', + version: 1, + language: 'en-US', + notificationsEnabled: true, + closeToQuit: false, + contentProtectionEnabled: false, + shortcutKeys: { ...defaultShortcutKey }, + floatingButtonEnabled: false, + floatingButtonBounds: null, + loggingEnabled: false, + privacyModeEnabled: true, + updateChannel: 'stable' +}) + +describe('DesktopConfigurationProjection', () => { + it('rejects old, foreign and invalid revisions without reversing committed fields', () => { + const initial = snapshot() + const view = new DesktopConfigurationProjection( + initial, + () => false, + async () => {} + ) + view.apply({ ...initial, version: 3, loggingEnabled: true }) + for (const change of [ + { version: 2 }, + { version: Number.NaN }, + { version: 4, ownerId: 'obsolete-core' } + ]) + view.apply({ ...initial, ...change, loggingEnabled: false }) + expect(view.getLoggingEnabled()).toBe(true) + expect(view.isPrivacyModeEnabled()).toBe(true) + }) + + it('does not share mutable shortcut or bounds objects with callers', () => { + const initial = { + ...snapshot(), + floatingButtonBounds: { x: 1, y: 2, dockSide: 'left' as const } + } + const view = new DesktopConfigurationProjection( + initial, + () => false, + async () => {} + ) + initial.floatingButtonBounds.x = 99 + const read = view.getFloatingButtonBounds()! + read.x = 88 + expect(view.getFloatingButtonBounds()?.x).toBe(1) + expect(view.getShortcutKeys()).not.toBe(view.getShortcutKeys()) + }) + + it('waits for acknowledged writes and drains them after admission closes', async () => { + const pending = Promise.withResolvers() + const write = vi.fn(() => pending.promise) + const view = new DesktopConfigurationProjection(snapshot(), () => true, write) + const bounds = { x: 10, y: 20, dockSide: 'right' as const } + const writing = view.setFloatingButtonBounds(bounds) + expect(view.getFloatingButtonBounds()).toBeNull() + view.stopWrites() + expect(() => view.startWrites()).toThrow('still draining') + await expect(view.setFloatingButtonBounds(bounds)).rejects.toThrow('stopped') + let drained = false + const draining = view.drainWrites().then(() => { + drained = true + }) + await Promise.resolve() + expect(drained).toBe(false) + pending.resolve() + await Promise.all([writing, draining]) + view.startWrites() + expect(await view.getCurrentThemeIsDark()).toBe(true) + }) + + it('propagates failed persistence without installing optimistic bounds or leaking work', async () => { + const view = new DesktopConfigurationProjection( + snapshot(), + () => false, + async () => { + throw new Error('storage unavailable') + } + ) + await expect(view.setFloatingButtonBounds({ x: 1, y: 2, dockSide: 'left' })).rejects.toThrow( + 'storage unavailable' + ) + expect(view.getFloatingButtonBounds()).toBeNull() + view.stopWrites() + await view.drainWrites() + expect(() => view.startWrites()).not.toThrow() + }) +}) diff --git a/test/main/desktop/floatingButton/index.test.ts b/test/main/desktop/floatingButton/index.test.ts index 579513c15c..1770c26527 100644 --- a/test/main/desktop/floatingButton/index.test.ts +++ b/test/main/desktop/floatingButton/index.test.ts @@ -79,6 +79,7 @@ const { return { electronState: { + frame: {}, workArea, eventHandlers, invokeHandlers, @@ -151,6 +152,7 @@ vi.mock('@/desktop/floatingButton/FloatingButtonWindow', () => ({ isDestroyed: () => false, webContents: { id: 1, + mainFrame: electronState.frame, send: webContentsSendMock } })) @@ -176,9 +178,9 @@ describe('FloatingButtonPresenter drag layout sync', () => { const createDesktopSettings = () => ({ getFloatingButtonEnabled: vi.fn(() => true), getFloatingButtonBounds: vi.fn(() => null), - setFloatingButtonBounds: vi.fn(), - getLanguage: vi.fn(() => 'zh-CN'), - getCurrentThemeIsDark: vi.fn(() => false) + setFloatingButtonBounds: vi.fn(async () => {}), + getLanguage: vi.fn(() => 'zh-CN' as const), + getCurrentThemeIsDark: vi.fn(async () => false) }) const createFloatingPresenter = ( @@ -207,7 +209,7 @@ describe('FloatingButtonPresenter drag layout sync', () => { throw new Error(`Missing IPC handler for ${channel}`) } - return await handler({}, payload) + return await handler({ sender: { id: 1 }, senderFrame: electronState.frame }, payload) } beforeEach(() => { @@ -228,6 +230,24 @@ describe('FloatingButtonPresenter drag layout sync', () => { vi.useRealTimers() }) + it('applies acknowledged host appearance without reentering the pending core command', async () => { + const settings = createDesktopSettings() + floatingPresenter = createFloatingPresenter(createProviderSettings(), settings) + await floatingPresenter.initialize() + settings.getLanguage.mockClear() + settings.getCurrentThemeIsDark.mockClear() + settings.getCurrentThemeIsDark.mockRejectedValue(new Error('core command is awaiting host')) + floatingPresenter.refreshLanguage('fa-IR') + await floatingPresenter.refreshTheme(true) + expect(webContentsSendMock).toHaveBeenCalledWith( + FLOATING_BUTTON_EVENTS.LANGUAGE_CHANGED, + 'fa-IR' + ) + expect(webContentsSendMock).toHaveBeenCalledWith(FLOATING_BUTTON_EVENTS.THEME_CHANGED, 'dark') + expect(settings.getLanguage).not.toHaveBeenCalled() + expect(settings.getCurrentThemeIsDark).not.toHaveBeenCalled() + }) + it('keeps the collapsed size stable when dragging interrupts collapse animation', async () => { floatingPresenter = createFloatingPresenter() await floatingPresenter.initialize() @@ -305,6 +325,23 @@ describe('FloatingButtonPresenter drag layout sync', () => { }) }) + it('rejects drag writes from another window or a nested frame', async () => { + const settings = createDesktopSettings() + floatingPresenter = createFloatingPresenter(createProviderSettings(), settings) + await floatingPresenter.initialize() + const before = { ...floatingWindowState.bounds } + for (const event of [ + { sender: { id: 999 }, senderFrame: electronState.frame }, + { sender: { id: 1 }, senderFrame: {} } + ]) { + electronState.eventHandlers.get(FLOATING_BUTTON_EVENTS.DRAG_START)!(event, { x: 100, y: 100 }) + electronState.eventHandlers.get(FLOATING_BUTTON_EVENTS.DRAG_MOVE)!(event, { x: 200, y: 200 }) + electronState.eventHandlers.get(FLOATING_BUTTON_EVENTS.DRAG_END)!(event) + } + expect(settings.setFloatingButtonBounds).not.toHaveBeenCalled() + expect(floatingWindowState.bounds).toEqual(before) + }) + it('loads all regular sessions without restricting the agent id', async () => { floatingPresenter = createFloatingPresenter() await floatingPresenter.initialize() @@ -327,6 +364,9 @@ describe('FloatingButtonPresenter drag layout sync', () => { projectDir: null, isPinned: false, isDraft: false, + sessionKind: 'regular', + orchestrationPolicy: 'explicit', + toolModeOverride: null, createdAt: 1, updatedAt: 10, status: 'idle', @@ -340,6 +380,9 @@ describe('FloatingButtonPresenter drag layout sync', () => { projectDir: null, isPinned: false, isDraft: false, + sessionKind: 'regular', + orchestrationPolicy: 'explicit', + toolModeOverride: null, createdAt: 2, updatedAt: 11, status: 'generating', diff --git a/test/main/desktop/fontSettings.test.ts b/test/main/desktop/fontSettings.test.ts index 3aaa09da71..5d67af9df5 100644 --- a/test/main/desktop/fontSettings.test.ts +++ b/test/main/desktop/fontSettings.test.ts @@ -1,10 +1,7 @@ -import fontList from 'font-list' import { beforeEach, describe, expect, it, vi } from 'vitest' import { FontSettings } from '@/desktop/fontSettings' -vi.mock('font-list', () => ({ default: { getFonts: vi.fn() } })) - -const getFontsMock = vi.mocked(fontList.getFonts) +const getFontsMock = vi.fn<() => Promise>() const createSettings = () => { const values = new Map() @@ -19,7 +16,7 @@ describe('FontSettings', () => { it('normalizes and caches system fonts', async () => { getFontsMock.mockResolvedValue(['Inter Regular', 'Inter Bold', 'Menlo']) - const fonts = new FontSettings(createSettings() as never, vi.fn()) + const fonts = new FontSettings(createSettings() as never, vi.fn(), getFontsMock) const detected = await fonts.getSystemFonts() const cached = await fonts.getSystemFonts() @@ -31,7 +28,7 @@ describe('FontSettings', () => { it('returns an empty array when font detection fails', async () => { getFontsMock.mockRejectedValue(new Error('failed to load')) - const fonts = new FontSettings(createSettings() as never, vi.fn()) + const fonts = new FontSettings(createSettings() as never, vi.fn(), getFontsMock) await expect(fonts.getSystemFonts()).resolves.toEqual([]) }) diff --git a/test/main/desktop/imageActions.test.ts b/test/main/desktop/imageActions.test.ts new file mode 100644 index 0000000000..50bf168c02 --- /dev/null +++ b/test/main/desktop/imageActions.test.ts @@ -0,0 +1,86 @@ +import { existsSync, mkdtempSync, readFileSync, rmSync, writeFileSync, mkdirSync } from 'node:fs' +import { tmpdir } from 'node:os' +import { join } from 'node:path' +import { clipboard, dialog, nativeImage, net } from 'electron' +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' +import { DesktopImageActions } from '@/desktop/imageActions' + +vi.unmock('fs') +vi.mock('electron', () => ({ + clipboard: { writeImage: vi.fn() }, + dialog: { showSaveDialog: vi.fn() }, + nativeImage: { createFromBuffer: vi.fn(), createFromDataURL: vi.fn() }, + net: { fetch: vi.fn() } +})) + +describe('DesktopImageActions', () => { + let directory: string + let images: DesktopImageActions + const bytes = Buffer.from('image fixture') + const source = `data:image/png;base64,${bytes.toString('base64')}` + + beforeEach(() => { + vi.resetAllMocks() + directory = mkdtempSync(join(tmpdir(), 'deepchat-native-images-')) + images = new DesktopImageActions(directory) + }) + + afterEach(() => { + rmSync(directory, { force: true, recursive: true }) + }) + + it('writes the original bytes only to the path granted by the save dialog', async () => { + const target = join(directory, 'chosen.png') + vi.mocked(dialog.showSaveDialog).mockResolvedValueOnce({ canceled: true, filePath: '' }) + await expect(images.saveImage({ source })).resolves.toEqual({ canceled: true }) + expect(existsSync(target)).toBe(false) + + vi.mocked(dialog.showSaveDialog).mockResolvedValueOnce({ canceled: false, filePath: target }) + await expect(images.saveImage({ source, suggestedName: 'unsafe:name' })).resolves.toEqual({ + canceled: false, + path: target + }) + expect(readFileSync(target)).toEqual(bytes) + expect(vi.mocked(dialog.showSaveDialog).mock.calls[1][0]).toMatchObject({ + defaultPath: 'unsafe_name.png' + }) + }) + + it('reads cached images inside the owned image directory and rejects path escapes', async () => { + mkdirSync(join(directory, 'images')) + writeFileSync(join(directory, 'images', 'cached image.png'), bytes) + const target = join(directory, 'selected.png') + vi.mocked(dialog.showSaveDialog).mockResolvedValueOnce({ canceled: false, filePath: target }) + await images.saveImage({ source: 'imgcache://cached%20image.png' }) + expect(readFileSync(target)).toEqual(bytes) + vi.mocked(dialog.showSaveDialog).mockClear() + + for (const source of ['imgcache://../outside.png', 'imgcache://%2e%2e/outside.png']) { + await expect(images.saveImage({ source })).rejects.toThrow('Invalid cached image path') + } + expect(dialog.showSaveDialog).not.toHaveBeenCalled() + }) + + it('propagates native download errors before opening a dialog or writing the clipboard', async () => { + vi.mocked(net.fetch).mockRejectedValueOnce(new Error('network unavailable')) + await expect(images.copyImage({ source: 'https://example.test/image.png' })).rejects.toThrow( + 'network unavailable' + ) + vi.mocked(net.fetch).mockResolvedValueOnce(new Response('denied', { status: 403 })) + await expect(images.saveImage({ source: 'https://example.test/image.png' })).rejects.toThrow( + 'Failed to download image: 403' + ) + expect(dialog.showSaveDialog).not.toHaveBeenCalled() + expect(clipboard.writeImage).not.toHaveBeenCalled() + }) + + it('does not write the clipboard when native image decoding fails', async () => { + const empty = { isEmpty: () => true } as Electron.NativeImage + vi.mocked(nativeImage.createFromBuffer).mockReturnValue(empty) + vi.mocked(nativeImage.createFromDataURL).mockReturnValue(empty) + await expect(images.copyImage({ source })).rejects.toThrow( + 'Image data cannot be copied to clipboard' + ) + expect(clipboard.writeImage).not.toHaveBeenCalled() + }) +}) diff --git a/test/main/desktop/pluginSettingsWindow.test.ts b/test/main/desktop/pluginSettingsWindow.test.ts index ba9f980d36..a7e5fc68e7 100644 --- a/test/main/desktop/pluginSettingsWindow.test.ts +++ b/test/main/desktop/pluginSettingsWindow.test.ts @@ -14,13 +14,13 @@ type FakeWindow = { on: ReturnType show: ReturnType focus: ReturnType - close: ReturnType + destroy: ReturnType loadFile: ReturnType handlers: Map webContentsHandlers: Map } -function installBrowserWindowMock(): FakeWindow[] { +function installBrowserWindowMock(loadFile: () => Promise = async () => {}): FakeWindow[] { const created: FakeWindow[] = [] vi.mocked(BrowserWindow).mockImplementation(function () { const handlers = new Map() @@ -35,8 +35,8 @@ function installBrowserWindowMock(): FakeWindow[] { on: vi.fn((event: string, cb: Handler) => handlers.set(event, cb)), show: vi.fn(), focus: vi.fn(), - close: vi.fn(), - loadFile: vi.fn().mockResolvedValue(undefined), + destroy: vi.fn(), + loadFile: vi.fn(loadFile), handlers, webContentsHandlers } @@ -49,19 +49,62 @@ function installBrowserWindowMock(): FakeWindow[] { const input = { pluginId: 'p1', title: 'P1', entry: '/plugins/p1/settings.html' } describe('PluginSettingsWindow', () => { - it('keeps the reopened window record when a stale closed event fires late', async () => { + it('waits for physical closure before acknowledging close or reopening', async () => { const created = installBrowserWindowMock() const settingsWindow = new PluginSettingsWindow() await settingsWindow.open(input) - settingsWindow.close(input.pluginId) - await settingsWindow.open(input) + let settled = false + const closing = settingsWindow.close(input.pluginId).then(() => { + settled = true + }) + const reopening = settingsWindow.open(input) + await Promise.resolve() + expect(settled).toBe(false) + expect(created).toHaveLength(1) + expect(settingsWindow.getPluginIdForWebContents(created[0].webContents.id)).toBe('p1') + created[0].handlers.get('closed')?.() + await closing + await reopening + expect(settingsWindow.getPluginIdForWebContents(created[0].webContents.id)).toBeNull() created[0].handlers.get('closed')?.() - settingsWindow.close(input.pluginId) - expect(created[1].close).toHaveBeenCalled() + const closingAgain = settingsWindow.close(input.pluginId) + expect(created[1].destroy).toHaveBeenCalled() expect(settingsWindow.getPluginIdForWebContents(created[1].webContents.id)).toBe('p1') + created[1].handlers.get('closed')?.() + await closingAgain + }) + + it('drains a failed load before propagating its error', async () => { + const created = installBrowserWindowMock(async () => { + throw new Error('Invalid settings file') + }) + const settingsWindow = new PluginSettingsWindow() + const opening = settingsWindow.open(input) + const rejected = expect(opening).rejects.toThrow('Invalid settings file') + await Promise.resolve() + expect(created[0].destroy).toHaveBeenCalled() + created[0].handlers.get('closed')?.() + await rejected + }) + + it('settles cancellation when closing a window rejects its pending load', async () => { + let rejectLoad!: (error: Error) => void + const created = installBrowserWindowMock( + () => + new Promise((_resolve, reject) => { + rejectLoad = reject + }) + ) + const settingsWindow = new PluginSettingsWindow() + const opening = settingsWindow.open(input) + const closing = settingsWindow.close(input.pluginId) + rejectLoad(new Error('ERR_FAILED (-2)')) + created[0].handlers.get('closed')?.() + await opening + await closing }) it('restricts navigation to the file entry', async () => { @@ -84,4 +127,17 @@ describe('PluginSettingsWindow', () => { expect(isAllowed('file:///plugins/other/settings.html')).toBe(false) expect(isAllowed('https://example.com/')).toBe(false) }) + + it('fences reopen requests while closing all owned windows', async () => { + const created = installBrowserWindowMock() + const windows = new PluginSettingsWindow() + await windows.open(input) + const closing = windows.close(input.pluginId) + const reopening = windows.open(input) + const rejected = expect(reopening).rejects.toThrow('windows are closed') + const shutdown = windows.closeAll() + created[0].handlers.get('closed')?.() + await Promise.all([closing, shutdown, rejected]) + expect(created).toHaveLength(1) + }) }) diff --git a/test/main/desktop/remoteAuthWindows.test.ts b/test/main/desktop/remoteAuthWindows.test.ts new file mode 100644 index 0000000000..6084339742 --- /dev/null +++ b/test/main/desktop/remoteAuthWindows.test.ts @@ -0,0 +1,92 @@ +import { EventEmitter } from 'node:events' +import { BrowserWindow } from 'electron' +import { afterEach, describe, expect, it, vi } from 'vitest' +import { DesktopRemoteAuthWindows } from '@/desktop/remoteAuthWindows' + +const input = { + id: 'feishu:one', + kind: 'feishu' as const, + url: 'https://accounts.feishu.cn/open-apis/authen/v1/authorize', + brand: 'feishu' as const, + redirectUri: 'http://127.0.0.1:9911/callback' +} + +const fixture = () => { + const events = new EventEmitter() + const webContents = Object.assign(new EventEmitter(), { setWindowOpenHandler: vi.fn() }) + const window = Object.assign(events, { + webContents, + loadURL: vi.fn(async (_url: string) => {}), + show: vi.fn(), + focus: vi.fn(), + isDestroyed: vi.fn(() => false), + destroy: vi.fn(() => { + events.emit('closed') + }) + }) + Object.assign(BrowserWindow, { + getFocusedWindow: vi.fn(() => null), + getAllWindows: vi.fn(() => []) + }) + vi.mocked(BrowserWindow).mockImplementation(function () { + return window as unknown as BrowserWindow + }) + const publish = vi.fn() + return { window, publish, host: new DesktopRemoteAuthWindows(publish) } +} + +afterEach(() => vi.restoreAllMocks()) + +describe('DesktopRemoteAuthWindows', () => { + it('preserves native isolation, brand/redirect navigation and popup denial', async () => { + const { host, window } = fixture() + await expect(host.open({ ...input, url: 'https://untrusted.invalid/' })).rejects.toThrow( + 'Invalid' + ) + await host.open(input) + expect(BrowserWindow).toHaveBeenLastCalledWith( + expect.objectContaining({ + webPreferences: { nodeIntegration: false, contextIsolation: true, webSecurity: true } + }) + ) + const preventDefault = vi.fn() + window.webContents.emit('will-navigate', { preventDefault }, 'https://untrusted.invalid/') + expect(preventDefault).toHaveBeenCalledOnce() + preventDefault.mockClear() + window.webContents.emit('will-navigate', { preventDefault }, `${input.redirectUri}?code=one`) + expect(preventDefault).not.toHaveBeenCalled() + const popup = window.webContents.setWindowOpenHandler.mock.calls[0][0] + expect(popup({ url: 'https://accounts.larksuite.com/' })).toEqual({ action: 'deny' }) + expect(window.loadURL).toHaveBeenCalledTimes(1) + expect(popup({ url: 'https://open.feishu.cn/auth' })).toEqual({ action: 'deny' }) + expect(window.loadURL).toHaveBeenLastCalledWith('https://open.feishu.cn/auth') + await host.closeAll() + }) + + it('acknowledges physical close and ignores a late navigation failure from the closed window', async () => { + const { host, window, publish } = fixture() + const loading = Promise.withResolvers() + window.loadURL.mockReturnValueOnce(loading.promise) + window.destroy.mockImplementation(() => {}) + await host.open(input) + let closed = false + const closing = host.close(input.id).then(() => { + closed = true + }) + loading.reject(Object.assign(new Error('navigation cancelled'), { code: 'ERR_FAILED' })) + await Promise.resolve() + expect(closed).toBe(false) + expect(publish).not.toHaveBeenCalled() + window.emit('closed') + await closing + expect(publish.mock.calls).toEqual([[{ id: input.id, type: 'closed' }]]) + }) + + it('reports a navigation failure while the auth window is still active', async () => { + const { host, window, publish } = fixture() + window.loadURL.mockRejectedValueOnce(new Error('connection refused')) + await host.open(input) + await vi.waitFor(() => expect(publish).toHaveBeenCalledWith({ id: input.id, type: 'error' })) + await host.closeAll() + }) +}) diff --git a/test/main/desktop/settings.test.ts b/test/main/desktop/settings.test.ts index 4b38cd56f9..a9a813232d 100644 --- a/test/main/desktop/settings.test.ts +++ b/test/main/desktop/settings.test.ts @@ -1,26 +1,23 @@ import { beforeEach, describe, expect, it, vi } from 'vitest' const publishDeepchatEventMock = vi.hoisted(() => vi.fn()) -const getLocaleMock = vi.hoisted(() => vi.fn(() => 'en-US')) - -vi.mock('electron', () => ({ - app: { - getLocale: getLocaleMock, - getLoginItemSettings: vi.fn(() => ({ openAtLogin: false })), - setLoginItemSettings: vi.fn() - } -})) - import { DesktopSettings } from '@/desktop/settings' describe('DesktopSettings', () => { beforeEach(() => { vi.clearAllMocks() - getLocaleMock.mockReturnValue('en-US') + host.systemLocale = 'en-US' }) - const effects = { - refreshLanguage: vi.fn(), + const host = { + systemLocale: 'en-US', + readTheme: vi.fn(async () => ({ theme: 'system' as const, isDark: false })), + applyTheme: vi.fn(async () => false), + readLaunchAtLogin: vi.fn(async () => false), + setLaunchAtLogin: vi.fn(async () => false), + applyContentProtection: vi.fn(async () => undefined), + applyFloatingButtonEnabled: vi.fn(async () => undefined), + refreshLanguage: vi.fn(async () => undefined), refreshTheme: vi.fn(async () => undefined) } @@ -28,8 +25,9 @@ describe('DesktopSettings', () => { const settings = { set: vi.fn() } const desktopSettings = new DesktopSettings( settings as never, - effects, - publishDeepchatEventMock + host, + publishDeepchatEventMock, + vi.fn() ) desktopSettings.setFontSizeLevel(4) @@ -49,8 +47,9 @@ describe('DesktopSettings', () => { } const desktopSettings = new DesktopSettings( settings as never, - effects, - publishDeepchatEventMock + host, + publishDeepchatEventMock, + vi.fn() ) expect(desktopSettings.getCopyWithCotEnabled()).toBe(true) @@ -70,11 +69,12 @@ describe('DesktopSettings', () => { get: vi.fn(() => 'system'), set: vi.fn() } - getLocaleMock.mockReturnValue('zh-Hant-HK') + host.systemLocale = 'zh-Hant-HK' const desktopSettings = new DesktopSettings( settings as never, - effects, - publishDeepchatEventMock + host, + publishDeepchatEventMock, + vi.fn() ) expect(desktopSettings.getLanguage()).toBe('zh-HK') @@ -84,18 +84,19 @@ describe('DesktopSettings', () => { expect(desktopSettings.getLanguage()).toBe('fr-FR') }) - it('publishes a normalized locale and direction once when changing language', () => { + it('publishes a normalized locale and direction once when changing language', async () => { const settings = { get: vi.fn(() => 'fa-IR'), set: vi.fn() } const desktopSettings = new DesktopSettings( settings as never, - effects, - publishDeepchatEventMock + host, + publishDeepchatEventMock, + vi.fn() ) - desktopSettings.setLanguage('fa') + await desktopSettings.setLanguage('fa') expect(settings.set).toHaveBeenCalledWith('language', 'fa-IR') expect(publishDeepchatEventMock).toHaveBeenCalledWith('config.language.changed', { diff --git a/test/main/desktop/window.test.ts b/test/main/desktop/window.test.ts index 3040d73f49..1b69c8da78 100644 --- a/test/main/desktop/window.test.ts +++ b/test/main/desktop/window.test.ts @@ -35,7 +35,6 @@ describe('WindowPresenter', () => { { getContentProtectionEnabled: vi.fn(() => false) } as any, - vi.fn(), vi.fn() ) @@ -80,7 +79,6 @@ describe('WindowPresenter', () => { { getContentProtectionEnabled: vi.fn(() => false) } as any, - vi.fn(), vi.fn() ) @@ -113,7 +111,6 @@ describe('WindowPresenter', () => { { getContentProtectionEnabled: vi.fn(() => false) } as any, - vi.fn(), vi.fn() ) @@ -150,7 +147,6 @@ describe('WindowPresenter', () => { { getContentProtectionEnabled: vi.fn(() => false) } as any, - vi.fn(), vi.fn() ) @@ -215,7 +211,6 @@ describe('WindowPresenter', () => { getContentProtectionEnabled: vi.fn(() => false), getCloseToQuit: vi.fn(() => false) } as any, - vi.fn(), onWindowCreated ) const tabPresenter = { @@ -310,7 +305,6 @@ describe('WindowPresenter', () => { getContentProtectionEnabled: vi.fn(() => false), getCloseToQuit: vi.fn(() => true) } as any, - vi.fn(), vi.fn() ) presenter.bindTabPresenter({ @@ -342,7 +336,6 @@ describe('WindowPresenter', () => { { getContentProtectionEnabled: vi.fn(() => false) } as any, - vi.fn(), vi.fn() ) @@ -362,7 +355,6 @@ describe('WindowPresenter', () => { { getContentProtectionEnabled: vi.fn(() => false) } as any, - vi.fn(), vi.fn() ) @@ -382,7 +374,7 @@ describe('WindowPresenter', () => { id: 'tab-1', webContents: { id: 21, isDestroyed: vi.fn(() => false), send } } - let pendingFirstLookup: ((value: unknown) => void) | null = null + let pendingFirstLookup!: (value: unknown) => void let getTabCalls = 0 const tabPresenter = { getWindowTabsData: vi.fn(async () => [{ id: 'tab-1' }]), @@ -403,7 +395,7 @@ describe('WindowPresenter', () => { const second = presenter.sendToAllWindows('test-msg', 'second') await new Promise((resolve) => setTimeout(resolve, 0)) - pendingFirstLookup?.(tab) + pendingFirstLookup(tab) await Promise.all([first, second]) // Main webContents of both broadcasts first (synchronous), then tab diff --git a/test/main/device/deviceService.test.ts b/test/main/device/deviceService.test.ts index a3ad18592c..c962dd0dc5 100644 --- a/test/main/device/deviceService.test.ts +++ b/test/main/device/deviceService.test.ts @@ -35,22 +35,6 @@ describe('DeviceService', () => { appExitMock.mockClear() }) - describe('getDefaultHeaders', () => { - it('should include User-Agent header with DeepChat/ prefix', () => { - const headers = DeviceService.getDefaultHeaders() - - expect(headers).toHaveProperty('User-Agent') - expect(headers['User-Agent']).toMatch(/^DeepChat\//) - }) - - it('should include HTTP-Referer and X-Title headers', () => { - const headers = DeviceService.getDefaultHeaders() - - expect(headers['HTTP-Referer']).toBe('https://deepchatai.cn') - expect(headers['X-Title']).toBe('DeepChat') - }) - }) - describe('restartAppWithDelay', () => { it('relaunches the process after data reset', async () => { vi.useFakeTimers() diff --git a/test/main/file/fileService.readFile.test.ts b/test/main/file/fileService.readFile.test.ts index c12436a475..c56b246ad7 100644 --- a/test/main/file/fileService.readFile.test.ts +++ b/test/main/file/fileService.readFile.test.ts @@ -3,12 +3,6 @@ import fs from 'fs/promises' import path from 'path' import { FileService } from '../../../src/main/file' -vi.mock('electron', () => ({ - app: { - getPath: vi.fn((name: string) => (name === 'userData' ? '/mock/user/data' : '/mock')) - } -})) - vi.mock('fs/promises', () => ({ default: { mkdir: vi.fn().mockResolvedValue(undefined), @@ -34,7 +28,8 @@ describe('FileService.readFile', () => { beforeEach(() => { vi.clearAllMocks() - vi.mocked(fs.realpath).mockImplementation(async (targetPath: string) => { + vi.mocked(fs.realpath).mockImplementation(async (inputPath) => { + const targetPath = inputPath.toString() if (targetPath === '/mock/user/data') { return '/mock/user/data' } @@ -50,7 +45,7 @@ describe('FileService.readFile', () => { it('reads relative files from the user data directory', async () => { vi.mocked(fs.readFile).mockResolvedValue('hello world' as never) - const presenter = new FileService(mockSettings) + const presenter = new FileService(mockSettings, '/mock/user/data') const content = await presenter.readFile('notes/today.md') @@ -62,7 +57,7 @@ describe('FileService.readFile', () => { }) it('rejects absolute paths', async () => { - const presenter = new FileService(mockSettings) + const presenter = new FileService(mockSettings, '/mock/user/data') await expect(presenter.readFile('/etc/passwd')).rejects.toThrow( 'Absolute paths are not allowed' @@ -71,7 +66,7 @@ describe('FileService.readFile', () => { }) it('rejects paths that escape the user data directory', async () => { - const presenter = new FileService(mockSettings) + const presenter = new FileService(mockSettings, '/mock/user/data') await expect(presenter.readFile('../outside.txt')).rejects.toThrow( 'File path escapes user data directory' diff --git a/test/main/file/fileService.test.ts b/test/main/file/fileService.test.ts index 54d822dc2a..17c9028608 100644 --- a/test/main/file/fileService.test.ts +++ b/test/main/file/fileService.test.ts @@ -5,12 +5,6 @@ import { FileValidationResult, IFileValidationService } from '../../../src/main/ // Mock all external dependencies const mockSettings = { get: vi.fn() } -vi.mock('electron', () => ({ - app: { - getPath: vi.fn().mockReturnValue('/mock/user/data') - } -})) - vi.mock('fs/promises', () => ({ default: { mkdir: vi.fn().mockResolvedValue(undefined), @@ -25,7 +19,8 @@ vi.mock('path', () => ({ default: { join: vi.fn((...args) => args.join('/')), extname: vi.fn(), - dirname: vi.fn() + dirname: vi.fn(), + isAbsolute: vi.fn(() => true) } })) @@ -58,7 +53,7 @@ describe('FileService Integration with FileValidationService', () => { } // Create FileService with mocked service - fileService = new FileService(mockSettings, mockFileValidationService) + fileService = new FileService(mockSettings, '/mock/user/data', mockFileValidationService) }) describe('validateFileForKnowledgeBase', () => { diff --git a/test/main/harness/admissionPlugin.test.ts b/test/main/harness/admissionPlugin.test.ts new file mode 100644 index 0000000000..17737ecfd9 --- /dev/null +++ b/test/main/harness/admissionPlugin.test.ts @@ -0,0 +1,68 @@ +import { randomUUID } from 'node:crypto' +import { load } from '@arcships/rutis/testing' +import { describe, expect, it } from 'vitest' +import type { AgentInvocationAdmissionSnapshot } from '@/agent/invocationAdmission' +import plugin from '../../../src/harness/plugins/admission' + +interface AdmissionService { + acquire(id: string, options: { ownerId: string }, signal: AbortSignal): Promise + release(id: string, reason: string, enabled: boolean): Promise + snapshot(): Promise<{ admission: AgentInvocationAdmissionSnapshot }> +} + +describe('Harness admission plugin lifecycle', () => { + it('closes pending work and releases old permits before applying a new generation', async () => { + // The SDK test kit treats signals as object references; harness:check covers their wire encoding. + const row = await load(plugin, { config: { capacity: 1, maxPending: 4 }, strict: false }) + try { + const old = row.service('harnessAdmission') + const permit = await old.acquire( + randomUUID(), + { ownerId: 'active' }, + new AbortController().signal + ) + const queued = expect( + old.acquire(randomUUID(), { ownerId: 'queued' }, new AbortController().signal) + ).rejects.toMatchObject({ name: 'AgentInvocationAdmissionAbortedError' }) + expect((await old.snapshot()).admission.pending).toBe(1) + + await row.update({ capacity: 2, maxPending: 4 }) + await queued + + expect((await old.snapshot()).admission).toMatchObject({ + closed: true, + active: 0, + pending: 0 + }) + expect(await old.release(permit, 'permit_released', false)).toBe(false) + expect( + (await row.service('harnessAdmission').snapshot()).admission + ).toMatchObject({ + capacity: 2, + closed: false, + active: 0, + pending: 0 + }) + } finally { + await row.unload() + } + }) + + it('rejects missing or already cancelled call signals without acquiring a permit', async () => { + const row = await load(plugin, { config: { capacity: 1, maxPending: 0 }, strict: false }) + try { + const service = row.service('harnessAdmission') + await expect( + service.acquire(randomUUID(), { ownerId: 'invalid' }, undefined as unknown as AbortSignal) + ).rejects.toThrow('Admission requires an AbortSignal') + await expect( + service.acquire(randomUUID(), { ownerId: 'cancelled' }, AbortSignal.abort()) + ).rejects.toMatchObject({ + name: 'AgentInvocationAdmissionAbortedError' + }) + expect((await service.snapshot()).admission).toMatchObject({ active: 0, pending: 0 }) + } finally { + await row.unload() + } + }) +}) diff --git a/test/main/harness/admissionRuntime.test.ts b/test/main/harness/admissionRuntime.test.ts new file mode 100644 index 0000000000..3ec9593468 --- /dev/null +++ b/test/main/harness/admissionRuntime.test.ts @@ -0,0 +1,235 @@ +import { spawn } from 'node:child_process' +import { tmpdir } from 'node:os' +import { createRequire } from 'node:module' +import path from 'node:path' +import { afterEach, describe, expect, it, vi } from 'vitest' +import { RutisAgentInvocationAdmission } from '@/agent/invocationAdmission' +import type { AgentInvocationAdmissionObservation } from '@/agent/invocationAdmission' +import { HarnessRuntime } from '@/harness/runtime' + +const { cpSync, mkdtempSync, rmSync } = await vi.importActual('node:fs') +const require = createRequire(import.meta.url) +const active = new Map() +const directories = new Set() +const create = async ( + capacity = 1, + maxPending = 4, + observations?: AgentInvocationAdmissionObservation[], + directory = path.resolve('out/harness') +) => { + const runtime = await HarnessRuntime.start({ + directory, + electronExecutable: require('electron'), + capacity, + maxPending, + observe: (value) => observations?.push(value) + }) + const admission = RutisAgentInvocationAdmission.create({ + runtime, + capacity, + maxPending, + diagnostics: { observe: (value) => observations?.push(value) } + }) + active.set(admission, runtime) + return admission +} + +afterEach(async () => { + for (const [admission, runtime] of active) { + await admission.close().catch(() => undefined) + await admission.flushObservations().catch(() => undefined) + await runtime.stop() + } + active.clear() + for (const directory of directories) rmSync(directory, { recursive: true, force: true }) + directories.clear() +}) + +describe('application Rutis admission runtime', () => { + it('preserves owner fairness, queue cancellation and permit accounting through the real host', async () => { + const directory = mkdtempSync(path.join(tmpdir(), 'deepchat-harness-closure-')) + directories.add(directory) + cpSync(path.resolve('out/harness'), directory, { recursive: true }) + const admission = await create(1, 4, undefined, directory) + await expect( + admission.acquire({ ownerId: 'pre-aborted', signal: AbortSignal.abort() }) + ).rejects.toMatchObject({ name: 'AgentInvocationAdmissionAbortedError' }) + const first = await admission.acquire({ ownerId: 'a' }) + const cancelled = new AbortController() + const rejection = expect( + admission.acquire({ ownerId: 'cancelled', signal: cancelled.signal }) + ).rejects.toMatchObject({ name: 'AgentInvocationAdmissionAbortedError' }) + const order: string[] = [] + const a = admission.run({ ownerId: 'a' }, async () => { + order.push('a') + }) + const b = admission.run({ ownerId: 'b' }, async () => { + order.push('b') + }) + await expect.poll(async () => (await admission.snapshot()).pending).toBe(3) + cancelled.abort() + await rejection + first.release() + first.release() + await Promise.all([a, b]) + expect(order).toEqual(['a', 'b']) + expect(await admission.snapshot()).toMatchObject({ + active: 0, + pending: 0, + granted: 3, + rejected: 2 + }) + }) + + it('preserves owner headroom and lease suspend/resume ordering with correlated diagnostics', async () => { + const observations: AgentInvocationAdmissionObservation[] = [] + const admission = await create(2, 4, observations) + const lease = admission.createLease({ + ownerId: 'a', + maxActiveForOwner: 1, + correlation: { + kind: 'live_delegation', + parentSessionId: 'parent', + delegationId: 'delegation', + turnId: 'turn' + } + }) + await lease.resume() + const next = admission.acquire({ ownerId: 'a', maxActiveForOwner: 1 }) + const other = await admission.acquire({ ownerId: 'b' }) + expect(await admission.snapshot()).toMatchObject({ active: 2, pending: 1 }) + lease.suspend() + expect(lease.state).toBe('suspended') + const permit = await next + const resume = lease.resume() + await expect.poll(async () => (await admission.snapshot()).pending).toBe(1) + permit.release() + await resume + expect(lease.state).toBe('active') + lease.suspend() + const cancelledResume = lease.resume() + lease.release() + await expect(cancelledResume).rejects.toMatchObject({ + name: 'AgentInvocationAdmissionAbortedError' + }) + other.release() + await admission.flushObservations() + expect(await admission.snapshot()).toMatchObject({ active: 0, pending: 0 }) + expect(observations).toContainEqual( + expect.objectContaining({ type: 'released', reason: 'lease_suspended', turnId: 'turn' }) + ) + const identity = admission.identity! + expect(identity.hostPid).not.toBe(process.pid) + expect(identity.runtime.pid).not.toBe(identity.hostPid) + await admission.close() + expect(observations.at(-1)).toMatchObject({ type: 'closed', active: 0, pending: 0 }) + await active.get(admission)!.stop() + expect(() => process.kill(identity.runtime.pid, 0)).toThrow() + }) + + it('isolates asynchronous diagnostic failures from admission outcomes', async () => { + const runtime = await HarnessRuntime.start({ + directory: path.resolve('out/harness'), + electronExecutable: require('electron'), + capacity: 4, + maxPending: 128, + observe: async () => { + throw new Error('Observer unavailable') + } + }) + const admission = RutisAgentInvocationAdmission.create({ + runtime, + capacity: 4, + maxPending: 128, + diagnostics: { + observe: async () => { + throw new Error('Observer unavailable') + } + } + }) + active.set(admission, runtime) + const permit = await admission.acquire({ + ownerId: 'diagnostics', + correlation: { + kind: 'live_delegation', + parentSessionId: 'parent', + delegationId: 'delegation', + turnId: 'turn' + } + }) + permit.release() + await admission.flushObservations() + expect(await admission.snapshot()).toMatchObject({ active: 0, pending: 0 }) + }) + + it.each([ + { name: 'oversized admission', header: 64 * 1024 + 1, body: Buffer.alloc(0) }, + { name: 'reserved admission bit', header: 0x40000000 + 1, body: Buffer.alloc(0) }, + { name: 'invalid binary metadata', header: 0xc0000000 + 4, body: Buffer.alloc(4) }, + { name: 'oversized memory', header: 0x80000000 + 256 * 1024 + 1, body: Buffer.alloc(0) } + ])('rejects $name framing and tears down the owned runtime', async ({ header: value, body }) => { + const directory = path.resolve('out/harness') + const child = spawn( + path.join( + directory, + `deepchat-harness-${process.platform}-${process.arch}${process.platform === 'win32' ? '.exe' : ''}` + ), + [ + require('electron'), + path.join(directory, 'node_modules', '@arcships', 'rutis-runtime'), + path.join(directory, 'admission.mjs'), + '1', + '4' + ], + { stdio: ['pipe', 'pipe', 'pipe'], windowsHide: true } + ) + child.stderr.resume() + const exited = new Promise((resolve, reject) => { + child.once('close', resolve) + child.once('error', reject) + }) + let forced = false + const timer = setTimeout(() => { + forced = true + child.kill('SIGKILL') + }, 5000) + try { + const ready = await new Promise<{ runtime: { pid: number } }>((resolve, reject) => { + let bytes = Buffer.alloc(0) + child.once('error', reject) + child.stdout.on('data', (chunk: Buffer) => { + bytes = Buffer.concat([bytes, chunk]) + if (bytes.length >= 4 && bytes.length >= 4 + bytes.readUInt32BE(0)) { + resolve(JSON.parse(bytes.subarray(4, 4 + bytes.readUInt32BE(0)).toString('utf8'))) + } + }) + child.once('close', () => reject(new Error('Host exited before ready'))) + }) + const header = Buffer.alloc(4) + header.writeUInt32BE(value) + child.stdin.write(Buffer.concat([header, body])) + expect(await exited).not.toBe(0) + expect(forced).toBe(false) + expect(() => process.kill(ready.runtime.pid, 0)).toThrow() + } finally { + clearTimeout(timer) + child.stdin.destroy() + if (child.exitCode === null) child.kill('SIGKILL') + await exited + } + }) + + it('fails closed when its runtime dies and never starts a replacement owner', async () => { + const admission = await create() + await admission.acquire({ ownerId: 'active' }) + const queued = expect(admission.acquire({ ownerId: 'queued' })).rejects.toThrow() + await expect.poll(async () => (await admission.snapshot()).pending).toBe(1) + const identity = admission.identity! + process.kill(identity.runtime.pid, 'SIGKILL') + await queued + await expect(admission.acquire({ ownerId: 'late' })).rejects.toThrow(/Rutis host/) + expect(admission.identity).toEqual(identity) + await active.get(admission)!.stop() + expect(() => process.kill(identity.hostPid, 0)).toThrow() + }) +}) diff --git a/test/main/harness/memoryVectorOwner.test.ts b/test/main/harness/memoryVectorOwner.test.ts new file mode 100644 index 0000000000..989524da99 --- /dev/null +++ b/test/main/harness/memoryVectorOwner.test.ts @@ -0,0 +1,341 @@ +import { randomUUID } from 'node:crypto' +import fs from 'node:fs' +import os from 'node:os' +import path from 'node:path' +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' +import { MemoryVectorOwner } from '../../../src/harness/memory-vector' +import { MemoryVectorStore } from '@/memory/infra/memoryVectorStore' +import { MEMORY_VECTOR_OWNER_FILE } from '@/memory/infra/memoryVectorStorePaths' +import { + decodeMemoryVector, + encodeMemoryVector, + MemoryVectorCommandSchema, + type MemoryVectorNativeCommand, + type MemoryVectorConfig +} from '@shared/harness/memory-vector' + +const actualFs = await vi.importActual('node:fs') +let directory: string +let config: MemoryVectorConfig +let owner: MemoryVectorOwner +let resource: string +type Command = MemoryVectorNativeCommand extends infer T + ? T extends MemoryVectorNativeCommand + ? Omit & { resource?: string } + : never + : never +const command = (input: Command) => + owner.command({ + resource, + ...input, + generation: config.generation, + operation: randomUUID() + }) +const open = (agentId = 'agent-a', id = resource) => + command({ + method: 'open', + resource: id, + agentId, + dimensions: 2, + embedding: { providerId: 'fixture', modelId: 'fixture' } + }) +const upsert = (vectors: number[][]) => + command({ + method: 'upsert', + upload: randomUUID(), + bytes: vectors.length * 8, + offset: 0, + memoryIds: vectors.map((_, i) => `m${i}`), + data: Buffer.concat(vectors.map((vector) => encodeMemoryVector(vector, 2))) + }) + +beforeEach(() => { + for (const method of [ + 'existsSync', + 'readdirSync', + 'mkdirSync', + 'mkdtempSync', + 'rmSync', + 'renameSync', + 'writeFileSync' + ] as const) { + vi.mocked(fs[method]).mockImplementation(actualFs[method] as never) + } + directory = fs.mkdtempSync(path.join(os.tmpdir(), 'deepchat-vector-owner-')) + config = { + generation: randomUUID(), + memoryDbDir: directory, + host: { appPath: path.resolve('.'), userDataPath: directory, isPackaged: false } + } + resource = randomUUID() + owner = new MemoryVectorOwner(config) +}) + +afterEach(async () => { + await owner.dispose() + vi.restoreAllMocks() + actualFs.rmSync(directory, { recursive: true, force: true }) +}) + +describe('native Memory vector ownership', () => { + it('orders mutations behind all native parts and aborts only the known upload', async () => { + await open() + const upload = randomUUID() + const part = { method: 'upsert' as const, upload, memoryIds: ['m0'], bytes: 8 } + await command({ ...part, offset: 0, data: Buffer.alloc(4) }) + const deleting = command({ method: 'delete', memoryIds: ['m0'] }) + let deleted = false + void deleting.then(() => { + deleted = true + }) + await new Promise((resolve) => setImmediate(resolve)) + expect(deleted).toBe(false) + await command({ method: 'abort', upload: randomUUID() }) + await expect(upsert([[1, 0]])).rejects.toThrow('busy') + await expect(command({ ...part, offset: 0, data: Buffer.alloc(4) })).rejects.toThrow('busy') + await command({ + ...part, + memoryIds: [...part.memoryIds], + offset: 4, + data: encodeMemoryVector([1], 1) + }) + await deleting + expect(await command({ method: 'list', afterId: null, limit: 10 })).toEqual([]) + await command({ ...part, offset: 0, data: Buffer.alloc(4) }) + await command({ method: 'abort', upload }) + await upsert([[1, 0]]) + await command({ ...part, offset: 0, data: Buffer.alloc(4) }) + await command({ method: 'close' }) + resource = randomUUID() + await open() + expect( + await command({ + method: 'query', + vector: encodeMemoryVector([1, 0], 2).toString('base64'), + topK: 1 + }) + ).toEqual([{ memoryId: 'm0', distance: 0 }]) + }) + + it('publishes one complete validated batch and preserves vector-only recall across close', async () => { + await open() + await expect( + command({ + method: 'upsert', + upload: randomUUID(), + bytes: 8, + offset: 0, + memoryIds: ['m0'], + data: new Uint8Array(new SharedArrayBuffer(8)) + }) + ).rejects.toThrow('shape') + await expect( + command({ + method: 'upsert', + upload: randomUUID(), + bytes: 8, + offset: 0, + memoryIds: ['m0', 'm1'], + data: encodeMemoryVector([1, 0], 2) + }) + ).rejects.toThrow('shape') + expect(await command({ method: 'list', afterId: null, limit: 512 })).toEqual([]) + const invalid = Buffer.alloc(16) + invalid.writeFloatLE(Infinity) + await expect( + command({ + method: 'upsert', + upload: randomUUID(), + bytes: 16, + offset: 0, + memoryIds: ['m0', 'm1'], + data: invalid + }) + ).rejects.toThrow('non-finite') + expect(await command({ method: 'list', afterId: null, limit: 512 })).toEqual([]) + await upsert([ + [1, 0], + [0, 1] + ]) + const query = { + method: 'query', + vector: encodeMemoryVector([1, 0], 2).toString('base64'), + topK: 2 + } as const + expect(await command(query)).toEqual([ + { memoryId: 'm0', distance: 0 }, + { memoryId: 'm1', distance: 1 } + ]) + await command({ method: 'close' }) + resource = randomUUID() + await open() + expect(await command(query)).toEqual([ + { memoryId: 'm0', distance: 0 }, + { memoryId: 'm1', distance: 1 } + ]) + expect(await command({ method: 'queryByMemoryId', memoryId: 'm0', topK: 2 })).toEqual([ + { memoryId: 'm1', distance: 1 } + ]) + await command({ method: 'delete', memoryIds: ['m0'] }) + expect(await command({ method: 'list', afterId: null, limit: 512 })).toEqual(['m1']) + await expect( + owner.command({ + generation: randomUUID(), + operation: randomUUID(), + resource, + method: 'close' + }) + ).rejects.toThrow('generation') + await expect(command({ method: 'delete', memoryIds: Array(513).fill('m1') })).rejects.toThrow() + await expect(command({ ...query, resource: randomUUID() })).rejects.toThrow('unavailable') + }) + + it('retains a late native open until revocation has closed the returned handle', async () => { + const gate = Promise.withResolvers() + const create = MemoryVectorStore.create.bind(MemoryVectorStore) + vi.spyOn(MemoryVectorStore, 'create').mockImplementationOnce(async (...args) => { + await gate.promise + return create(...args) + }) + const opening = expect(open()).rejects.toThrow('revoked') + const closing = command({ method: 'close' }) + let closed = false + void closing.then(() => { + closed = true + }) + await new Promise((resolve) => setImmediate(resolve)) + expect(closed).toBe(false) + await expect(open('agent-a', randomUUID())).rejects.toThrow('owner') + gate.resolve() + await Promise.all([opening, closing]) + resource = randomUUID() + await open() + }) + + it('supports more than eight agents while limiting active native opens to two', async () => { + const gate = Promise.withResolvers() + const create = MemoryVectorStore.create.bind(MemoryVectorStore) + let active = 0 + let peak = 0 + vi.spyOn(MemoryVectorStore, 'create').mockImplementation(async (...args) => { + active++ + peak = Math.max(active, peak) + try { + await gate.promise + return await create(...args) + } finally { + active-- + } + }) + const opens = Array.from({ length: 9 }, (_, index) => open(`agent-${index}`, randomUUID())) + const completed = Promise.all(opens) + void completed.catch(() => undefined) + try { + await expect.poll(() => active).toBe(2) + } finally { + gate.resolve() + } + await completed + expect(peak).toBe(2) + }) + + it('waits for an executing write before reset can remove files', async () => { + await open() + const gate = Promise.withResolvers() + const started = Promise.withResolvers() + const upsert = MemoryVectorStore.prototype.upsertPacked + vi.spyOn(MemoryVectorStore.prototype, 'upsertPacked').mockImplementation( + async function (records) { + started.resolve() + await gate.promise + return upsert.call(this, records) + } + ) + const commit = command({ + method: 'upsert', + upload: randomUUID(), + bytes: 8, + offset: 0, + memoryIds: ['m0'], + data: encodeMemoryVector([1, 0], 2) + }) + await started.promise + const reset = owner.command({ + method: 'reset', + generation: config.generation, + operation: randomUUID(), + agentId: 'agent-a' + }) + let removed = false + void reset.then(() => { + removed = true + }) + await new Promise((resolve) => setImmediate(resolve)) + expect(removed).toBe(false) + expect(actualFs.existsSync(path.join(directory, 'agent-a.v2.duckdb'))).toBe(true) + await expect(command({ method: 'queryByMemoryId', memoryId: 'm0', topK: 1 })).rejects.toThrow( + 'unavailable' + ) + gate.resolve() + await Promise.all([commit, reset]) + expect( + actualFs.readdirSync(directory).filter((name) => !name.startsWith(MEMORY_VECTOR_OWNER_FILE)) + ).toEqual([]) + expect(actualFs.existsSync(path.join(directory, MEMORY_VECTOR_OWNER_FILE))).toBe(true) + }) + + it('uses finite Float32 values with explicit little-endian byte order', () => { + const values = [0, -0, 1 / 3, -3.4028234663852886e38, 1.401298464324817e-45] + const bytes = encodeMemoryVector(values, values.length) + expect(decodeMemoryVector(bytes, values.length)).toEqual(values.map(Math.fround)) + expect(encodeMemoryVector([1], 1).toString('hex')).toBe('0000803f') + expect(() => encodeMemoryVector([1e39], 1)).toThrow('non-finite') + expect(() => encodeMemoryVector([NaN], 1)).toThrow('non-finite') + expect(() => decodeMemoryVector(Buffer.alloc(3), 1)).toThrow('length') + }) + + it('accepts canonical base64 and rejects malformed or oversized wire data', () => { + const accepts = (data: string) => + MemoryVectorCommandSchema.safeParse({ + method: 'query', + resource, + generation: config.generation, + operation: randomUUID(), + topK: 1, + vector: data + }).success + for (const data of ['', 'AA==', 'AAA=', 'AAAA', Buffer.alloc(65536).toString('base64')]) + expect(accepts(data)).toBe(true) + for (const data of ['AB==', 'AAB=', 'A===', 'AA=A', 'AA==\n', '____', 'A'.repeat(262144)]) + expect(accepts(data)).toBe(false) + }) + + it('accepts only bounded application upload bytes', () => { + const accepts = (data: unknown) => + MemoryVectorCommandSchema.safeParse({ + method: 'chunk', + resource, + generation: config.generation, + operation: randomUUID(), + upload: randomUUID(), + offset: 0, + data + }).success + for (const data of [Buffer.alloc(1), new Uint8Array(240 * 1024)]) + expect(accepts(data)).toBe(true) + for (const data of ['', 'AAAA', [0, 0, 0], new Uint8Array(0), Buffer.alloc(240 * 1024 + 1)]) + expect(accepts(data)).toBe(false) + expect( + MemoryVectorCommandSchema.safeParse({ + method: 'begin', + resource, + generation: config.generation, + operation: randomUUID(), + upload: randomUUID(), + memoryIds: ['m0'], + bytes: 65540, + data: Buffer.alloc(65537) + }).success + ).toBe(false) + }) +}) diff --git a/test/main/harness/memoryVectorRuntime.test.ts b/test/main/harness/memoryVectorRuntime.test.ts new file mode 100644 index 0000000000..d96657b88f --- /dev/null +++ b/test/main/harness/memoryVectorRuntime.test.ts @@ -0,0 +1,429 @@ +import { randomUUID } from 'node:crypto' +import { DuckDBInstance } from '@duckdb/node-api' +import { createRequire } from 'node:module' +import fs from 'node:fs' +import os from 'node:os' +import path from 'node:path' +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' +import { parse } from 'yaml' +import { HarnessRuntime } from '@/harness/runtime' +import { RutisAgentInvocationAdmission } from '@/harness/admission' +import { RutisMemoryVectorStores } from '@/harness/memory-vector' +import { MEMORY_VECTOR_OWNER_FILE } from '@/memory/infra/memoryVectorStorePaths' +import { + encodeMemoryVector, + MEMORY_VECTOR_CHUNK_BYTES, + MEMORY_VECTOR_INITIAL_CHUNK_BYTES, + MEMORY_VECTOR_UPLOAD_BYTES, + type MemoryVectorCommand +} from '@shared/harness/memory-vector' + +const { mkdtempSync, mkdirSync, rmSync, readdirSync, existsSync, writeFileSync, readFileSync } = + await vi.importActual('node:fs') +const require = createRequire(import.meta.url) +const builderRequire = createRequire(require.resolve('electron-builder')) +const { getFileMatchers, copyFiles } = builderRequire('app-builder-lib/out/fileMatcher.js') +const active: Array<{ runtime: HarnessRuntime; stores: RutisMemoryVectorStores; root: string }> = [] + +async function create(memoryDbDir?: string) { + const root = mkdtempSync(path.join(os.tmpdir(), 'deepchat-memory-runtime-')) + const resources = + process.platform === 'darwin' + ? path.join(root, 'DeepChat.app', 'Contents', 'Resources') + : path.join(root, 'resources') + const directory = path.join(resources, 'app.asar.unpacked', 'harness') + const config = parse(readFileSync(path.resolve('electron-builder.yml'), 'utf8')) + const matchers = getFileMatchers( + { + extraResources: config.extraResources.filter((resource: { from?: string }) => + resource.from?.startsWith('./out/harness/') + ) + }, + 'extraResources', + resources, + { + defaultSrc: path.resolve('.'), + globalOutDir: path.resolve('dist'), + customBuildOptions: {}, + macroExpander: (value: string) => value + } + ) + await copyFiles(matchers) + const { shareHarnessDuckDbNativePackage } = await import('../../../scripts/afterPack.js') + await shareHarnessDuckDbNativePackage({ + appOutDir: root, + electronPlatformName: process.platform, + arch: process.arch + }) + expect( + existsSync( + path.join( + directory, + 'node_modules', + '@duckdb', + `node-bindings-${process.platform}-${process.arch}` + ) + ) + ).toBe(false) + const runtime = await HarnessRuntime.start({ + directory, + electronExecutable: require('electron'), + capacity: 1, + maxPending: 4, + observe: () => {} + }) + const stores = new RutisMemoryVectorStores(runtime, { + memoryDbDir: memoryDbDir ?? path.join(root, 'memory'), + host: { appPath: path.resolve('.'), userDataPath: root, isPackaged: false } + }) + active.push({ runtime, stores, root }) + const admission = RutisAgentInvocationAdmission.create({ runtime, capacity: 1, maxPending: 4 }) + return { runtime, stores, root, admission } +} + +beforeEach(() => { + vi.mocked(fs.existsSync).mockImplementation(existsSync) + vi.mocked(fs.mkdirSync).mockImplementation(mkdirSync) + vi.mocked(fs.writeFileSync).mockImplementation(writeFileSync) +}) + +afterEach(async () => { + for (const { runtime, stores } of active) { + await stores.dispose() + await runtime.stop() + } + for (const { root } of active) rmSync(root, { recursive: true, force: true }) + active.length = 0 + vi.restoreAllMocks() +}) + +describe('Rutis native Memory runtime', () => { + it('publishes a valid batch larger than one internal native message part', async () => { + const { runtime, stores, root } = await create() + const dimensions = 49152 + const store = await stores.createVectorStore( + 'wide', + { providerId: 'fixture', modelId: 'fixture' }, + dimensions + ) + const records = Array.from({ length: 45 }, (_, row) => ({ + memoryId: `wide-${String(row).padStart(2, '0')}`, + embedding: Array.from({ length: dimensions }, (_, column) => + column === row ? 1 : column === dimensions - 1 ? -0.25 : 0 + ) + })) + await store.upsert(records) + expect(await store.listMemoryIds(null, 50)).toEqual(records.map((record) => record.memoryId)) + await store.close() + const instance = await DuckDBInstance.create(path.join(root, 'memory', 'wide.v2.duckdb')) + try { + const connection = await instance.connect() + try { + const result = await connection.runAndReadAll( + "SELECT embedding[45] AS anchor, embedding[49152] AS fraction, list_sum(embedding)::FLOAT AS total FROM memory_vector WHERE memory_id = 'wide-44'" + ) + expect(result.getRowObjectsJson()).toEqual([{ anchor: 1, fraction: -0.25, total: 0.75 }]) + } finally { + connection.closeSync() + } + } finally { + instance.closeSync() + } + const reopened = await stores.createVectorStore( + 'wide', + { providerId: 'fixture', modelId: 'fixture' }, + dimensions + ) + expect(await reopened.listMemoryIds(null, 50)).toHaveLength(45) + expect(runtime.memoryTransport.pending).toBe(0) + }) + + it('keeps staged uploads atomic and releases staging after abort, failure and close', async () => { + const { runtime, root } = await create() + const generation = randomUUID() + const resource = randomUUID() + await runtime.startMemory({ + generation, + memoryDbDir: path.join(root, 'memory'), + host: { appPath: path.resolve('.'), userDataPath: root, isPackaged: false } + }) + type Command = MemoryVectorCommand extends infer T + ? T extends MemoryVectorCommand + ? Omit + : never + : never + const send = (command: Command) => + runtime.requestMemory({ + ...command, + generation, + resource, + operation: randomUUID() + } as MemoryVectorCommand) + const open = () => + send({ + method: 'open', + agentId: 'agent', + dimensions: 2, + embedding: { providerId: 'fixture', modelId: 'fixture' } + }) + const begin = (upload: string, data?: Uint8Array) => + send({ method: 'begin', upload, memoryIds: ['memory'], bytes: 8, data }) + await open() + let upload = randomUUID() + await begin(upload, Buffer.alloc(4)) + await expect(send({ method: 'commit', upload })).rejects.toThrow('incomplete') + expect(await send({ method: 'list', afterId: null, limit: 10 })).toEqual([]) + await send({ method: 'abort', upload }) + upload = randomUUID() + const invalid = Buffer.alloc(8) + invalid.writeFloatLE(Infinity) + await begin(upload, invalid) + await expect(send({ method: 'commit', upload })).rejects.toThrow('non-finite') + expect(await send({ method: 'list', afterId: null, limit: 10 })).toEqual([]) + upload = randomUUID() + const chunk = Buffer.alloc(MEMORY_VECTOR_CHUNK_BYTES) + await send({ + method: 'begin', + upload, + memoryIds: ['memory'], + bytes: MEMORY_VECTOR_UPLOAD_BYTES, + data: Buffer.alloc(MEMORY_VECTOR_INITIAL_CHUNK_BYTES) + }) + let offset = MEMORY_VECTOR_INITIAL_CHUNK_BYTES + for (; offset + chunk.length < MEMORY_VECTOR_UPLOAD_BYTES; offset += chunk.length) + await send({ method: 'chunk', upload, offset, data: chunk }) + await expect(send({ method: 'commit', upload, offset, data: chunk })).rejects.toThrow('shape') + await begin(randomUUID()) + await send({ method: 'close' }) + await open() + upload = randomUUID() + await begin(upload, encodeMemoryVector([1, 0], 2)) + await send({ method: 'commit', upload }) + expect(await send({ method: 'list', afterId: null, limit: 10 })).toEqual(['memory']) + await send({ method: 'close' }) + }) + + it.each(['quarantine', 'corrupt-open', 'marker-failure'])( + 'fences native files by terminating only the vector process after %s', + async (failure) => { + const { runtime, stores, admission, root } = await create() + const identity = runtime.identity + const store = await stores.createVectorStore( + 'agent', + { providerId: 'fixture', modelId: 'fixture' }, + 2 + ) + await store.upsert([{ memoryId: 'existing', embedding: [1, 0] }]) + const worker = runtime.memoryIdentity! + const file = path.join(root, 'memory', 'agent.v2.duckdb') + if (failure === 'quarantine') { + stores.markVectorStoreQuarantined('agent') + expect(existsSync(`${file}.quarantine`)).toBe(true) + } else if (failure === 'marker-failure') { + vi.mocked(fs.writeFileSync).mockImplementationOnce(() => { + throw new Error('Quarantine intent cannot be persisted') + }) + expect(() => stores.markVectorStoreQuarantined('agent')).toThrow('cannot be persisted') + } else { + await store.close() + writeFileSync(file, 'invalid native database') + await expect( + stores.createVectorStore('agent', { providerId: 'fixture', modelId: 'fixture' }, 2) + ).rejects.toThrow() + } + await vi.waitFor(() => { + expect(runtime.memoryAvailable).toBe(false) + expect(() => process.kill(worker.pid, 0)).toThrow() + }) + expect(existsSync(`${file}.lease`)).toBe(true) + expect(existsSync(`${file}.quarantine`)).toBe(true) + const retained = readFileSync(file) + await expect(stores.resetVectorStore('agent')).rejects.toThrow() + await expect( + stores.createVectorStore('agent', { providerId: 'fixture', modelId: 'fixture' }, 2) + ).rejects.toThrow() + expect(readFileSync(file)).toEqual(retained) + await admission.run({ ownerId: 'after-native-quarantine' }, async () => {}) + expect(runtime.identity).toEqual(identity) + expect(runtime.memoryIdentity?.pid).toBe(worker.pid) + } + ) + it('rejects oversized results without abandoning the request or admission owner', async () => { + const { runtime, stores, admission } = await create() + const store = await stores.createVectorStore( + 'large-ids', + { providerId: 'fixture', modelId: 'fixture' }, + 2 + ) + for (let offset = 0; offset < 800; offset += 50) { + await store.upsert( + Array.from({ length: 50 }, (_, index) => ({ + memoryId: `${'x'.repeat(1000)}${offset + index}`, + embedding: [1, 0] + })) + ) + } + await expect(store.query([1, 0], { topK: 800 })).rejects.toMatchObject({ + name: 'MemoryVectorResponseLimitError' + }) + expect(runtime.memoryTransport.pending).toBe(0) + expect(await store.query([1, 0], { topK: 1 })).toHaveLength(1) + await admission.run({ ownerId: 'after-large-result' }, async () => {}) + }) + it('fences another file owner before quarantine recovery or reset can touch live stores', async () => { + const first = await create() + const directory = path.join(first.root, 'memory') + const store = await first.stores.createVectorStore( + 'agent', + { providerId: 'fixture', modelId: 'fixture' }, + 2 + ) + await store.upsert([{ memoryId: 'existing', embedding: [1, 0] }]) + writeFileSync(path.join(directory, 'agent.v2.duckdb.quarantine'), '') + writeFileSync(path.join(directory, '.vector-owner.v2.duckdb.quarantine'), '') + const second = await create(directory) + await expect( + second.stores.createVectorStore('agent', { providerId: 'fixture', modelId: 'fixture' }, 2) + ).rejects.toMatchObject({ name: 'MemoryVectorOwnershipUnavailableError' }) + await expect(second.stores.resetVectorStore('agent')).rejects.toThrow('ownership') + expect(await store.listMemoryIds(null, 512)).toEqual(['existing']) + expect(existsSync(path.join(directory, 'agent.v2.duckdb.quarantine'))).toBe(true) + await first.stores.dispose() + await first.runtime.stop() + const replacement = await create(directory) + const recovered = await replacement.stores.createVectorStore( + 'agent', + { providerId: 'fixture', modelId: 'fixture' }, + 2 + ) + expect(recovered.isUsable()).toBe(false) + await recovered.close() + await replacement.stores.resetVectorStore('agent') + const rebuilt = await replacement.stores.createVectorStore( + 'agent', + { providerId: 'fixture', modelId: 'fixture' }, + 2 + ) + expect(await rebuilt.listMemoryIds(null, 512)).toEqual([]) + expect(existsSync(path.join(directory, 'agent.v2.duckdb.quarantine'))).toBe(false) + expect(existsSync(path.join(directory, MEMORY_VECTOR_OWNER_FILE))).toBe(true) + }) + it('lazily owns the real native store in a separate process using the standalone closure', async () => { + const { runtime, stores, root } = await create() + const identity = runtime.identity! + expect(runtime.memoryIdentity).toBeUndefined() + await stores.resetVectorStore('unused') + expect(runtime.memoryIdentity).toBeUndefined() + const store = await stores.createVectorStore( + 'agent', + { providerId: 'fixture', modelId: 'fixture' }, + 2 + ) + const worker = runtime.memoryIdentity! + expect([process.pid, identity.hostPid, identity.runtime.pid]).not.toContain(worker.pid) + expect(worker.modules).toBe(identity.runtime.modules) + await store.upsert([ + { memoryId: 'anchor', embedding: [1, 0] }, + { memoryId: 'other', embedding: [0, 1] } + ]) + expect(await store.query([1, 0], { topK: 2 })).toEqual([ + { memoryId: 'anchor', distance: 0 }, + { memoryId: 'other', distance: 1 } + ]) + await store.deleteByMemoryIds(['anchor']) + await store.close() + const reopened = await stores.createVectorStore( + 'agent', + { providerId: 'fixture', modelId: 'fixture' }, + 2 + ) + expect(await reopened.listMemoryIds(null, 512)).toEqual(['other']) + await reopened.close() + const mismatched = await stores.createVectorStore( + 'agent', + { providerId: 'fixture', modelId: 'changed' }, + 3 + ) + expect(mismatched.isUsable()).toBe(false) + await expect(mismatched.query([1, 0, 0], { topK: 1 })).rejects.toThrow('unavailable') + await mismatched.close() + const original = await stores.createVectorStore( + 'agent', + { providerId: 'fixture', modelId: 'fixture' }, + 2 + ) + expect(await original.listMemoryIds(null, 512)).toEqual(['other']) + await original.close() + await stores.resetVectorStore('agent') + expect( + readdirSync(path.join(root, 'memory')).filter( + (name) => !name.startsWith(MEMORY_VECTOR_OWNER_FILE) + ) + ).toEqual([]) + const precision = await stores.createVectorStore( + 'precision', + { providerId: 'fixture', modelId: 'fixture' }, + 5 + ) + const values = [0, -0, 1 / 3, -3.4028234663852886e38, 1.401298464324817e-45] + await precision.upsert([{ memoryId: 'float32', embedding: values }]) + await precision.close() + const instance = await DuckDBInstance.create(path.join(root, 'memory', 'precision.v2.duckdb')) + try { + const connection = await instance.connect() + try { + const rows = await connection.runAndReadAll('SELECT embedding FROM memory_vector') + expect(rows.getRowObjectsJson()).toEqual([{ embedding: values.map(Math.fround) }]) + } finally { + connection.closeSync() + } + } finally { + instance.closeSync() + } + expect(runtime.identity).toEqual(identity) + expect(runtime.memoryIdentity).toEqual(worker) + await stores.dispose() + await runtime.stop() + expect(() => process.kill(worker.pid, 0)).toThrow() + expect(() => process.kill(identity.runtime.pid, 0)).toThrow() + }) + + it('serves admission while chunked vector batches run and isolates native worker death', async () => { + const { runtime, stores, admission, root } = await create() + const permit = await admission.acquire({ ownerId: 'parent' }) + const queued = admission.acquire({ ownerId: 'other' }) + void queued.catch(() => undefined) + await expect.poll(async () => (await admission.snapshot()).pending).toBe(1) + const store = await stores.createVectorStore( + 'agent', + { providerId: 'fixture', modelId: 'fixture' }, + 1536 + ) + expect(await admission.snapshot()).toMatchObject({ active: 1, pending: 1 }) + const identity = runtime.identity! + const worker = runtime.memoryIdentity! + const batch = Array.from({ length: 50 }, (_, row) => ({ + memoryId: randomUUID(), + embedding: Array.from({ length: 1536 }, (_, index) => (index === row ? 1 : 0)) + })) + const uploading = store.upsert(batch) + await expect.poll(async () => (await admission.snapshot()).pending).toBe(1) + permit.release() + ;(await queued).release() + await uploading + expect(await store.listMemoryIds(null, 512)).toHaveLength(50) + process.kill(worker.pid, 'SIGKILL') + await expect.poll(() => store.isUsable()).toBe(false) + expect(existsSync(path.join(root, 'memory', 'agent.v2.duckdb.lease'))).toBe(true) + expect(() => process.kill(worker.pid, 0)).toThrow() + await expect(store.query(batch[0].embedding, { topK: 1 })).rejects.toThrow() + await expect( + stores.createVectorStore('after-crash', { providerId: 'fixture', modelId: 'fixture' }, 2) + ).rejects.toThrow() + await admission.run({ ownerId: 'after-crash' }, async () => {}) + expect(await admission.snapshot()).toMatchObject({ active: 0, pending: 0 }) + expect(runtime.identity).toEqual(identity) + expect(runtime.memoryIdentity).toEqual(worker) + expect(() => process.kill(identity.runtime.pid, 0)).not.toThrow() + }) +}) diff --git a/test/main/harness/runtimeCodec.test.ts b/test/main/harness/runtimeCodec.test.ts new file mode 100644 index 0000000000..08e944a06e --- /dev/null +++ b/test/main/harness/runtimeCodec.test.ts @@ -0,0 +1,51 @@ +import { createRequire } from 'node:module' +import path from 'node:path' +import { pathToFileURL } from 'node:url' +import { describe, expect, it } from 'vitest' + +const require = createRequire(import.meta.url) +const runtimeRoot = path.dirname(require.resolve('@arcships/rutis-runtime/package.json')) +const { base64Decode } = (await import( + pathToFileURL(path.join(runtimeRoot, 'src/values.mjs')).href +)) as { base64Decode(text: string): Uint8Array } + +describe('Rutis byte value contract', () => { + it('decodes exact independent byte buffers across pooled and native-part sizes', () => { + for (const size of [0, 1, 2, 3, 63, 4095, 4096, 8192, 307200, 8 * 1024 * 1024]) { + const source = Buffer.allocUnsafe(size) + for (let index = 0; index < size; index++) source[index] = index % 256 + const encoded = source.toString('base64') + const decoded = base64Decode(encoded) + const second = base64Decode(encoded) + expect(decoded.constructor).toBe(Uint8Array) + expect(Buffer.from(decoded).equals(source)).toBe(true) + expect(decoded.byteOffset).toBe(0) + expect(decoded.buffer).toBeInstanceOf(ArrayBuffer) + expect(decoded.buffer.byteLength).toBe(size) + expect(decoded.buffer).not.toBe(second.buffer) + decoded.fill(0) + expect(Buffer.from(second).equals(source)).toBe(true) + } + }) + + it('rejects malformed padding, unused bits, whitespace and non-base64 characters', () => { + for (const encoded of [ + 'A', + 'AA', + 'AAA', + 'A===', + 'AAAA=', + 'A A=', + 'AA==\n', + 'AB==', + 'AAB=', + '____', + 'é===', + '\0AAA', + '====', + 'AA=A' + ]) { + expect(() => base64Decode(encoded)).toThrow(/expected base64/) + } + }) +}) diff --git a/test/main/hook/hookService.test.ts b/test/main/hook/hookService.test.ts index c44f8b3142..f9cdd0d829 100644 --- a/test/main/hook/hookService.test.ts +++ b/test/main/hook/hookService.test.ts @@ -215,7 +215,8 @@ const createHarness = (hooks: HookCommandItem[] = []) => { const getSession = vi.fn().mockResolvedValue(null) const service = new HookService( { getHooksNotificationsConfig, setHooksNotificationsConfig }, - { getSession } + { getSession }, + '9.8.7-hook-fixture' ) return { service, @@ -297,7 +298,8 @@ describe('HookService subscription index', () => { getHooksNotificationsConfig: () => stored, setHooksNotificationsConfig: (next) => next }, - { getSession: vi.fn().mockResolvedValue(null) } + { getSession: vi.fn().mockResolvedValue(null) }, + '9.8.7-hook-fixture' ) const snapshot = service.getConfigSnapshot() @@ -537,22 +539,132 @@ describe('HookService delivery ordering', () => { const result = await pending expect(result.error).toBe('spawn ENOENT') expect(result.stderr).toBe('Authorization: ***REDACTED***\n') + let drained = false + const stopped = service.stop().then(() => { + drained = true + }) + await flush() + expect(drained).toBe(false) + child.emit('close', null) + await stopped }) - it('kills running hook commands on stop', async () => { + it('keeps stop pending until a killed hook child actually closes', async () => { const { service } = createHarness([enabledHook('a', ['PostToolUse'])]) const child = new FakeChild() spawnMock.mockImplementationOnce(() => child) service.notify(toolEvent('session-1', 'call-1')) await flush() - await service.stop() + let drained = false + const stopped = service.stop().then(() => { + drained = true + }) + await flush() expect(child.kill).toHaveBeenCalledWith('SIGKILL') + expect(drained).toBe(false) + await expect(service.testHookCommand('a')).resolves.toMatchObject({ + success: false, + error: 'Hook commands are stopped' + }) + expect(spawnMock).toHaveBeenCalledTimes(1) + child.emit('close', null) + await stopped + expect(drained).toBe(true) + }) + + it('retains native lifetime after command diagnostics time out', async () => { + vi.useFakeTimers() + try { + const { service } = createHarness([enabledHook('a', ['SessionStart'])]) + const child = new FakeChild() + spawnMock.mockImplementationOnce(() => child) + + const command = service.testHookCommand('a') + await vi.advanceTimersByTimeAsync(30_000) + await expect(command).resolves.toMatchObject({ error: 'Command timed out' }) + let drained = false + const stopped = service.stop().then(() => { + drained = true + }) + await vi.advanceTimersByTimeAsync(0) + expect(drained).toBe(false) + child.emit('close', null) + await stopped + expect(drained).toBe(true) + } finally { + vi.useRealTimers() + } + }) + + it('rejects stop and restart while native child closure remains uncertain', async () => { + vi.useFakeTimers() + try { + const { service } = createHarness([enabledHook('a', ['SessionStart'])]) + const child = new FakeChild() + spawnMock.mockImplementationOnce(() => child) + const command = service.testHookCommand('a') + const stopped = expect(service.stop()).rejects.toThrow( + 'Hook work did not drain before shutdown' + ) + await vi.advanceTimersByTimeAsync(30_000) + await stopped + expect(() => service.start()).toThrow('Hook work must drain before restarting') + child.emit('close', null) + await command + service.start() + expect(service.isObserved('SessionStart')).toBe(true) + } finally { + vi.useRealTimers() + } + }) + + it('retains pending enrichment after a drain deadline without dispatching it later', async () => { + vi.useFakeTimers() + try { + const { service, getSession } = createHarness([enabledHook('a', ['PostToolUse'])]) + let release: (value: null) => void = () => undefined + getSession.mockReturnValueOnce( + new Promise((resolve) => { + release = resolve + }) + ) + service.notify({ + event: 'PostToolUse', + session: { sessionId: 'held' }, + tool: { callId: 'late' } + }) + await vi.advanceTimersByTimeAsync(0) + const stopped = expect(service.stop()).rejects.toThrow( + 'Hook work did not drain before shutdown' + ) + await vi.advanceTimersByTimeAsync(30_000) + await stopped + expect(() => service.start()).toThrow('Hook work must drain before restarting') + release(null) + await vi.advanceTimersByTimeAsync(0) + expect(spawnMock).not.toHaveBeenCalled() + service.start() + } finally { + vi.useRealTimers() + } }) }) describe('HookService payload projection', () => { + it('uses the supplied application version for explicit test commands', async () => { + const { service } = createHarness([enabledHook('a', ['SessionStart'])]) + + await service.testHookCommand('a') + + expect(spawnedPayloads()[0]).toMatchObject({ + payloadVersion: 1, + isTest: true, + app: { version: '9.8.7-hook-fixture', platform: process.platform } + }) + }) + it('truncates tool previews before any clone runs', async () => { const { service } = createHarness([enabledHook('a', ['PostToolUse'])]) const clone = vi.spyOn(globalThis, 'structuredClone') @@ -617,7 +729,7 @@ describe('HookService payload projection', () => { event: 'SessionEnd', time: undefined, isTest: false, - app: { version: expect.any(String), platform: process.platform }, + app: { version: '9.8.7-hook-fixture', platform: process.platform }, session: { conversationId: 'session-1', agentId: 'deepchat', diff --git a/test/main/knowledge/knowledgeService.test.ts b/test/main/knowledge/knowledgeService.test.ts index bd8175afba..3a3669ea48 100644 --- a/test/main/knowledge/knowledgeService.test.ts +++ b/test/main/knowledge/knowledgeService.test.ts @@ -157,6 +157,7 @@ describe('KnowledgeService Validation Methods', () => { knowledgeService = new KnowledgeService({ config: mockProviderSettings, storageRoot: mockDbDir, + extensionDirectory: '/mock/runtime/duckdb/extensions', files: mockFileService, dialog: mockDialogPresenter, embeddings: mockProviderRuntime, diff --git a/test/main/mcp/enterpriseIdentityManager.test.ts b/test/main/mcp/enterpriseIdentityManager.test.ts index 63f5618d4c..4a915c655a 100644 --- a/test/main/mcp/enterpriseIdentityManager.test.ts +++ b/test/main/mcp/enterpriseIdentityManager.test.ts @@ -28,7 +28,7 @@ type TestableManager = { verifyIdToken: ( token: string, profile: McpEnterpriseIdentityProfile, - metadata: typeof metadata, + discoveredMetadata: typeof metadata, expectedNonce?: string ) => Promise<{ sub?: string; exp?: number }> getValidIdentity: ( @@ -38,24 +38,29 @@ type TestableManager = { const createManager = (credential: McpEnterpriseIdentityCredential) => { const saveEnterpriseIdentity = vi.fn( - ( - _key: string, - value: Omit - ): McpEnterpriseIdentityCredential => ({ ...value, updatedAt: Date.now() }) + async (_key: string, value: Omit) => ({ + ...value, + updatedAt: Date.now() + }) ) const store = { - loadEnterpriseIdentity: vi.fn(() => credential), + loadEnterpriseIdentity: vi.fn(async () => credential), saveEnterpriseIdentity, - loadEnterpriseIdentityClientSecret: vi.fn(() => null) + loadEnterpriseIdentityClientSecret: vi.fn(async () => null) } as unknown as McpOAuthCredentialStore const settings = { getEnterpriseIdentityProfiles: vi.fn(() => [profile]) } as unknown as McpSettings - const manager = new McpEnterpriseIdentityManager(settings, store, vi.fn()) + const manager = new McpEnterpriseIdentityManager( + settings, + store, + vi.fn(), + vi.fn(async () => undefined) + ) const testable = manager as unknown as TestableManager testable.discoverMetadata = vi.fn().mockResolvedValue(metadata) - return { saveEnterpriseIdentity, testable } + return { saveEnterpriseIdentity, testable, manager, store, settings } } describe('McpEnterpriseIdentityManager refresh', () => { @@ -142,4 +147,98 @@ describe('McpEnterpriseIdentityManager refresh', () => { expect(testable.verifyIdToken).toHaveBeenCalledWith(credential.idToken, profile, metadata) expect(saveEnterpriseIdentity).not.toHaveBeenCalled() }) + + it.each(['stop', 'replace'] as const)( + 'rejects a pending identity read after %s', + async (action) => { + const credential: McpEnterpriseIdentityCredential = { + profileId: profile.id, + issuer: profile.issuer, + clientId: profile.clientId, + subject: 'user-1', + idToken: 'stored-token', + expiresAt: now + 600_000, + updatedAt: now + } + const { manager, store, settings, saveEnterpriseIdentity } = createManager(credential) + let finish!: (value: McpEnterpriseIdentityCredential) => void + let entered!: () => void + const reading = new Promise((resolve) => { + entered = resolve + }) + vi.mocked(store.loadEnterpriseIdentity).mockImplementationOnce(() => { + entered() + return new Promise((resolve) => { + finish = resolve + }) + }) + const pending = manager.getStatus(profile.id) + const rejected = expect(pending).rejects.toThrow( + action === 'stop' ? 'interrupted' : 'profile changed' + ) + await reading + if (action === 'stop') manager.stop() + else + vi.mocked(settings.getEnterpriseIdentityProfiles).mockReturnValue([ + { ...profile, clientId: 'replacement' } + ]) + finish(credential) + await rejected + expect(saveEnterpriseIdentity).not.toHaveBeenCalled() + } + ) + it.each(['another profile', 'same profile'] as const)( + 'retains edits to %s while clearing an old binding', + async (change) => { + let profiles = [profile] + let finish!: () => void + let entered!: () => void + const clearing = new Promise((resolve) => { + entered = resolve + }) + const store = { + clearEnterpriseProfileCredentials: vi.fn(() => { + entered() + return new Promise((resolve) => { + finish = resolve + }) + }) + } as unknown as McpOAuthCredentialStore + const settings = { + getEnterpriseIdentityProfiles: () => profiles, + setEnterpriseIdentityProfiles: (next: McpEnterpriseIdentityProfile[]) => { + profiles = next + } + } as unknown as McpSettings + const manager = new McpEnterpriseIdentityManager( + settings, + store, + vi.fn(), + vi.fn(async () => undefined) + ) + const pending = manager.saveProfile({ ...profile, clientId: 'replacement' }) + const result = + change === 'same profile' + ? expect(pending).rejects.toThrow('profile changed') + : expect(pending).resolves.toMatchObject({ clientId: 'replacement' }) + await clearing + await manager.saveProfile({ + ...profile, + id: change === 'same profile' ? profile.id : 'second', + label: 'Latest edit' + }) + finish() + await result + expect(manager.listProfiles()).toEqual( + expect.arrayContaining([ + expect.objectContaining({ + id: change === 'same profile' ? profile.id : 'second', + label: 'Latest edit', + clientId: profile.clientId + }) + ]) + ) + manager.stop() + } + ) }) diff --git a/test/main/mcp/mcpAppHost.test.ts b/test/main/mcp/mcpAppHost.test.ts index 3ef13a2db1..21cf6c5ab4 100644 --- a/test/main/mcp/mcpAppHost.test.ts +++ b/test/main/mcp/mcpAppHost.test.ts @@ -1,5 +1,7 @@ +import { createPluginToolPolicies } from '../../helpers/pluginToolPolicies' import { describe, expect, it, vi } from 'vitest' import { McpAppHost } from '@/mcp/apps/appHost' +import { McpAppSandboxRegistry } from '@/mcp/apps/sandboxRegistry' import type { McpAppDescriptor, Tool } from '@shared/types/mcp' const context = { webContentsId: 7, windowId: 11 } @@ -25,7 +27,7 @@ const tool: Tool = { } } -const createHarness = () => { +const createHarness = (registryOverride?: McpAppSandboxRegistry) => { let currentConfig = { serverId: descriptor.serverId, configGeneration: descriptor.configGeneration, @@ -91,6 +93,10 @@ const createHarness = () => { toolAccessSuspended: false } const registry = { + reserveCreation: vi.fn(() => 'creation-id'), + getCreationSignal: vi.fn(() => new AbortController().signal), + assertCreationCurrent: vi.fn(), + cancelCreation: vi.fn(), create: vi.fn((input: Record) => ({ ...instance, ...input })), assertOwned: vi.fn(() => instance), revoke: vi.fn(), @@ -101,7 +107,12 @@ const createHarness = () => { requestAppDecision: vi.fn().mockResolvedValue({ allowed: true }) } const validateSource = vi.fn(() => true) + const desktop = { + observeOwner: vi.fn(async (): Promise => undefined), + openExternal: vi.fn(async (): Promise => undefined) + } const host = new McpAppHost({ + toolPolicies: createPluginToolPolicies(), settings: { getMcpServers } as never, @@ -109,7 +120,8 @@ const createHarness = () => { getClient: vi.fn(() => client) } as never, permissionBroker: permissionBroker as never, - registry: registry as never, + registry: registryOverride ?? (registry as never), + desktop, ensureServerRunning: vi.fn(), getPermissionMode: vi.fn().mockResolvedValue('default'), validateSource, @@ -119,6 +131,7 @@ const createHarness = () => { return { client, host, + desktop, permissionBroker, registry, validateSource, @@ -129,6 +142,81 @@ const createHarness = () => { } describe('MCP App host', () => { + it('does not publish a view after its owner closes during resource loading', async () => { + const registry = new McpAppSandboxRegistry() + const { host, client } = createHarness(registry) + let release!: (resources: unknown[]) => void + client.readResourceContents.mockReturnValueOnce( + new Promise((resolve) => { + release = resolve + }) + ) + const pending = host.prepareView( + { + descriptor, + conversationId: 'conversation-id', + messageId: 'message-id', + blockId: 'block-id', + toolInput: {} + }, + context + ) + await vi.waitFor(() => expect(client.readResourceContents).toHaveBeenCalled()) + registry.revokeByWebContents(context.webContentsId) + release([ + { + uri: descriptor.resourceUri, + mimeType: descriptor.resourceMimeType, + text: '
Late
', + _meta: { ui: {} } + } + ]) + await expect(pending).rejects.toThrow('no longer active') + }) + + it('fences a delayed desktop observation when maintenance clears creation', async () => { + const registry = new McpAppSandboxRegistry() + const { host, desktop, client } = createHarness(registry) + let release!: () => void + desktop.observeOwner.mockReturnValueOnce( + new Promise((resolve) => { + release = resolve + }) + ) + const pending = host.prepareView( + { + descriptor, + conversationId: 'conversation-id', + messageId: 'message-id', + blockId: 'block-id', + toolInput: {} + }, + context + ) + registry.clear() + release() + await expect(pending).rejects.toThrow('no longer active') + expect(client.readResourceContents).not.toHaveBeenCalled() + }) + + it('opens links only after consent and current source validation through the desktop port', async () => { + const { host, registry, desktop, validateSource } = createHarness() + registry.requestConsent.mockResolvedValueOnce(false) + expect(await host.openLink('instance-id', 'https://example.com', context)).toBe(false) + expect(desktop.openExternal).not.toHaveBeenCalled() + expect(await host.openLink('instance-id', 'https://example.com', context)).toBe(true) + expect(desktop.openExternal).toHaveBeenCalledWith('https://example.com/', context) + desktop.openExternal.mockClear() + registry.requestConsent.mockImplementationOnce(async () => { + validateSource.mockReturnValue(false) + return true + }) + await expect(host.openLink('instance-id', 'https://example.com', context)).rejects.toThrow( + 'source no longer matches' + ) + expect(desktop.openExternal).not.toHaveBeenCalled() + }) + it('hydrates an exact saved App binding and finds metadata on later resource pages', async () => { const { client, host, registry } = createHarness() @@ -143,8 +231,12 @@ describe('MCP App host', () => { context ) - expect(client.listResourcesPage).toHaveBeenNthCalledWith(1, undefined) - expect(client.listResourcesPage).toHaveBeenNthCalledWith(2, 'second-page') + expect(client.listResourcesPage).toHaveBeenNthCalledWith(1, undefined, expect.any(AbortSignal)) + expect(client.listResourcesPage).toHaveBeenNthCalledWith( + 2, + 'second-page', + expect.any(AbortSignal) + ) expect(registry.create).toHaveBeenCalledWith( expect.objectContaining({ descriptor, diff --git a/test/main/mcp/mcpAppSandboxProtocol.test.ts b/test/main/mcp/mcpAppSandboxProtocol.test.ts index 210dc570a9..af35d32ecf 100644 --- a/test/main/mcp/mcpAppSandboxProtocol.test.ts +++ b/test/main/mcp/mcpAppSandboxProtocol.test.ts @@ -1,10 +1,131 @@ -import { describe, expect, it } from 'vitest' +import { beforeEach, describe, expect, it, vi } from 'vitest' +import { EventEmitter } from 'node:events' +import { McpAppSandboxRegistry } from '@/mcp/apps/sandboxRegistry' +import type { McpAppDescriptor } from '@shared/types/mcp' import { buildMcpAppContentSecurityPolicy, + configureMcpAppSessionPermissions, + registerMcpAppProtocol, buildMcpAppPermissionsPolicy } from '@/mcp/apps/sandboxProtocol' +const native = vi.hoisted(() => ({ + fromId: vi.fn(), + fromWebContents: vi.fn(), + handle: vi.fn(), + openExternal: vi.fn(), + session: { setPermissionRequestHandler: vi.fn(), setPermissionCheckHandler: vi.fn() } +})) +vi.mock('electron', () => ({ + protocol: { handle: native.handle }, + session: { defaultSession: native.session }, + webContents: { fromId: native.fromId }, + BrowserWindow: { fromWebContents: native.fromWebContents }, + shell: { openExternal: native.openExternal } +})) + +beforeEach(() => { + vi.clearAllMocks() + const owner = Object.assign(new EventEmitter(), { id: 7, isDestroyed: () => false }) + native.fromId.mockReturnValue(owner) + native.fromWebContents.mockReturnValue({ id: 11 }) +}) + +const descriptor: McpAppDescriptor = { + schemaVersion: 1, + serverId: 'server-id', + configGeneration: 1, + bindingHash: 'binding-hash', + serverName: 'apps-server', + toolName: 'render', + resourceUri: 'ui://render/index.html', + resourceMimeType: 'text/html;profile=mcp-app' +} + +const createInstance = ( + registry: McpAppSandboxRegistry, + validateLive: () => boolean = () => true +) => + registry.create({ + creationId: registry.reserveCreation({ webContentsId: 7, windowId: 11 }, descriptor.serverId), + context: { webContentsId: 7, windowId: 11 }, + conversationId: 'conversation-id', + messageId: 'message-id', + blockId: 'block-id', + descriptor, + toolInput: {}, + html: '
App
', + permissions: { camera: {} }, + validateLive + }) + describe('MCP App sandbox policy', () => { + it('settles a native permission callback once when its disposed caller throws', async () => { + const registry = new McpAppSandboxRegistry() + const instance = createInstance(registry) + const setRequest = vi.fn() + configureMcpAppSessionPermissions(registry, { + setPermissionRequestHandler: setRequest, + setPermissionCheckHandler: vi.fn() + } as never) + const callback = vi.fn(() => { + throw new Error('Native caller disposed') + }) + setRequest.mock.calls[0][0]( + { id: 7, getURL: () => 'file:///deepchat/index.html' }, + 'media', + callback, + { + requestingUrl: `mcp-app://${instance.instanceId}/sandbox.html`, + mediaTypes: ['audio'], + isMainFrame: false + } + ) + await new Promise((resolve) => setImmediate(resolve)) + expect(callback).toHaveBeenCalledExactlyOnceWith(false) + }) + + it('revokes pending creation and views on native owner destruction', async () => { + const owner = Object.assign(new EventEmitter(), { id: 7, isDestroyed: vi.fn(() => false) }) + native.fromId.mockReturnValue(owner) + const registry = new McpAppSandboxRegistry() + const desktop = registerMcpAppProtocol(registry) + const context = { webContentsId: 7, windowId: 11 } + const creationId = registry.reserveCreation(context, descriptor.serverId) + await desktop.observeOwner(context) + const instance = createInstance(registry) + const handler = native.handle.mock.calls.at(-1)![1] + const response = await handler(new Request(`mcp-app://${instance.instanceId}/sandbox.html`)) + expect(response.status).toBe(200) + await desktop.openExternal('https://example.com/', context) + expect(native.openExternal).toHaveBeenCalledTimes(1) + owner.isDestroyed.mockReturnValue(true) + owner.emit('destroyed') + expect(registry.getForProtocol(instance.instanceId)).toBeNull() + expect(() => registry.assertCreationCurrent(creationId)).toThrow('no longer active') + await expect(desktop.observeOwner(context)).rejects.toThrow('owner is unavailable') + await expect(desktop.openExternal('https://example.com/', context)).rejects.toThrow( + 'owner is unavailable' + ) + expect(native.openExternal).toHaveBeenCalledTimes(1) + }) + + it('refuses a delayed protocol policy after the native owner is gone', async () => { + const registry = new McpAppSandboxRegistry() + registerMcpAppProtocol(registry) + const handler = native.handle.mock.calls.at(-1)![1] + let release!: (policy: Awaited>) => void + vi.spyOn(registry, 'getProtocolPolicy').mockReturnValueOnce( + new Promise((resolve) => { + release = resolve + }) + ) + const pending = handler(new Request('mcp-app://fixture/sandbox.html')) + native.fromId.mockReturnValue(null) + release({ context: { webContentsId: 7, windowId: 11 } }) + expect((await pending).status).toBe(410) + }) + it('keeps network access deny-by-default and admits only declared origins', () => { const policy = buildMcpAppContentSecurityPolicy({ connectDomains: ['https://api.example.com'], @@ -58,4 +179,192 @@ describe('MCP App sandbox policy', () => { 'camera=(), microphone=(), geolocation=(), clipboard-write=()' ) }) + it('preserves default-session permissions while isolating App frames', async () => { + const registry = new McpAppSandboxRegistry() + const instance = createInstance(registry) + let permissionRequestHandler: + | (( + owner: { id: number; getURL(): string }, + permission: string, + callback: (allowed: boolean) => void, + details: { + requestingUrl: string + mediaTypes?: string[] + isMainFrame: boolean + } + ) => void) + | undefined + let permissionCheckHandler: + | (( + owner: { id: number; getURL(): string } | null, + permission: string, + requestingOrigin: string, + details: { securityOrigin: string; requestingUrl: string } + ) => boolean) + | undefined + const targetSession = { + setPermissionRequestHandler: vi.fn( + (handler: NonNullable) => { + permissionRequestHandler = handler + } + ), + setPermissionCheckHandler: vi.fn((handler: NonNullable) => { + permissionCheckHandler = handler + }) + } + configureMcpAppSessionPermissions(registry, targetSession as never) + + const firstPartyDecision = vi.fn() + permissionRequestHandler!( + { id: 1, getURL: () => 'file:///deepchat/index.html' }, + 'media', + firstPartyDecision, + { + requestingUrl: 'file:///deepchat/index.html', + mediaTypes: ['audio'], + isMainFrame: true + } + ) + expect(firstPartyDecision).toHaveBeenCalledWith(true) + + for (const mediaTypes of [['video'], ['audio', 'video']]) { + const firstPartyCameraDecision = vi.fn() + permissionRequestHandler!( + { id: 1, getURL: () => 'file:///deepchat/index.html' }, + 'media', + firstPartyCameraDecision, + { + requestingUrl: 'file:///deepchat/index.html', + mediaTypes, + isMainFrame: true + } + ) + expect(firstPartyCameraDecision).toHaveBeenCalledWith(true) + } + expect( + permissionCheckHandler!( + { id: 1, getURL: () => 'file:///deepchat/index.html' }, + 'notifications', + 'file:///deepchat/index.html', + { + securityOrigin: 'file:///deepchat/index.html', + requestingUrl: 'file:///deepchat/index.html' + } + ) + ).toBe(true) + + const browserDecision = vi.fn() + permissionRequestHandler!( + { id: 2, getURL: () => 'https://example.com' }, + 'notifications', + browserDecision, + { + requestingUrl: 'https://example.com', + isMainFrame: true + } + ) + expect(browserDecision).toHaveBeenCalledWith(true) + expect( + permissionCheckHandler!( + { id: 2, getURL: () => 'https://example.com' }, + 'notifications', + 'https://example.com', + { + securityOrigin: 'https://example.com', + requestingUrl: 'https://example.com' + } + ) + ).toBe(true) + + const nestedRemoteDecision = vi.fn() + permissionRequestHandler!( + { id: 1, getURL: () => 'file:///deepchat/index.html' }, + 'notifications', + nestedRemoteDecision, + { + requestingUrl: 'https://example.com', + isMainFrame: false + } + ) + expect(nestedRemoteDecision).toHaveBeenCalledWith(false) + expect( + permissionCheckHandler!( + { id: 1, getURL: () => 'file:///deepchat/index.html' }, + 'notifications', + 'https://example.com', + { + securityOrigin: 'https://example.com', + requestingUrl: 'https://example.com' + } + ) + ).toBe(false) + + const consentRequestIds: string[] = [] + registry.setConsentPublisher((_windowId, payload) => { + consentRequestIds.push(payload.request.requestId) + }) + const undeclaredMicrophoneDecision = vi.fn() + permissionRequestHandler!( + { + id: 7, + getURL: () => `mcp-app://${instance.instanceId}/sandbox.html` + }, + 'media', + undeclaredMicrophoneDecision, + { + requestingUrl: `mcp-app://${instance.instanceId}/sandbox.html`, + mediaTypes: ['audio'], + isMainFrame: false + } + ) + await vi.waitFor(() => expect(undeclaredMicrophoneDecision).toHaveBeenCalledWith(false)) + expect(consentRequestIds).toHaveLength(0) + + const appDecision = vi.fn() + permissionRequestHandler!( + { + id: 7, + getURL: () => `mcp-app://${instance.instanceId}/sandbox.html` + }, + 'media', + appDecision, + { + requestingUrl: `mcp-app://${instance.instanceId}/sandbox.html`, + mediaTypes: ['video'], + isMainFrame: false + } + ) + await vi.waitFor(() => expect(consentRequestIds).toHaveLength(1)) + expect( + registry.submitConsent(consentRequestIds[0], true, { + webContentsId: 7, + windowId: 11 + }) + ).toBe(true) + await vi.waitFor(() => expect(appDecision).toHaveBeenCalledWith(true)) + + const repeatedDecision = vi.fn() + permissionRequestHandler!( + { + id: 7, + getURL: () => `mcp-app://${instance.instanceId}/sandbox.html` + }, + 'media', + repeatedDecision, + { + requestingUrl: `mcp-app://${instance.instanceId}/sandbox.html`, + mediaTypes: ['video'], + isMainFrame: false + } + ) + await vi.waitFor(() => expect(consentRequestIds).toHaveLength(2)) + expect(repeatedDecision).not.toHaveBeenCalled() + expect( + registry.submitConsent(consentRequestIds[1], true, { + webContentsId: 7, + windowId: 11 + }) + ).toBe(true) + await vi.waitFor(() => expect(repeatedDecision).toHaveBeenCalledWith(true)) + }) }) diff --git a/test/main/mcp/mcpAppSandboxRegistry.test.ts b/test/main/mcp/mcpAppSandboxRegistry.test.ts index 84c5ea4c94..e2b54cbca6 100644 --- a/test/main/mcp/mcpAppSandboxRegistry.test.ts +++ b/test/main/mcp/mcpAppSandboxRegistry.test.ts @@ -15,9 +15,13 @@ const descriptor: McpAppDescriptor = { const createInstance = ( registry: McpAppSandboxRegistry, - validateLive: () => boolean = () => true + validateLive: () => boolean = () => true, + creationId?: string ) => registry.create({ + creationId: + creationId ?? + registry.reserveCreation({ webContentsId: 7, windowId: 11 }, descriptor.serverId), context: { webContentsId: 7, windowId: 11 }, conversationId: 'conversation-id', messageId: 'message-id', @@ -30,6 +34,74 @@ const createInstance = ( }) describe('MCP App sandbox registry', () => { + it('counts pending creation against both limits and releases canceled work', () => { + const registry = new McpAppSandboxRegistry() + const first = Array.from({ length: 32 }, () => + registry.reserveCreation({ webContentsId: 7, windowId: 11 }, descriptor.serverId) + ) + expect(() => + registry.reserveCreation({ webContentsId: 7, windowId: 11 }, descriptor.serverId) + ).toThrow('instance limit') + const instance = createInstance(registry, () => true, first.pop()!) + const second = Array.from({ length: 32 }, () => + registry.reserveCreation({ webContentsId: 8, windowId: 12 }, descriptor.serverId) + ) + expect(() => + registry.reserveCreation({ webContentsId: 9, windowId: 13 }, descriptor.serverId) + ).toThrow('instance limit') + registry.cancelCreation(second.pop()!) + const replacement = registry.reserveCreation( + { webContentsId: 9, windowId: 13 }, + descriptor.serverId + ) + registry.revokeByWebContents(7) + expect(registry.getForProtocol(instance.instanceId)).toBeNull() + for (const id of first) + expect(() => registry.assertCreationCurrent(id)).toThrow('no longer active') + expect(() => registry.assertCreationCurrent(replacement)).not.toThrow() + registry.clear() + }) + + it.each(['owner', 'server', 'maintenance'] as const)( + 'invalidates pending creation on %s revocation', + (reason) => { + const registry = new McpAppSandboxRegistry() + const id = registry.reserveCreation({ webContentsId: 7, windowId: 11 }, descriptor.serverId) + const signal = registry.getCreationSignal(id) + if (reason === 'owner') registry.revokeByWebContents(7) + else if (reason === 'server') registry.revokeByServer(descriptor.serverId) + else registry.clear() + expect(signal.aborted).toBe(true) + expect(() => createInstance(registry, () => true, id)).toThrow('no longer active') + } + ) + + it('isolates protocol policy and rejects approval revoked before native dispatch', async () => { + const registry = new McpAppSandboxRegistry() + const instance = createInstance(registry) + const policy = await registry.getProtocolPolicy(instance.instanceId) + policy!.permissions!.camera = undefined + expect(instance.permissions?.camera).toEqual({}) + let requestId = '' + registry.setConsentPublisher((_windowId, payload) => { + requestId = payload.request.requestId + }) + const context = { webContentsId: 7, windowId: 11 } + expect( + await registry.requestBrowserPermission(instance.instanceId, { ...context, windowId: 12 }, [ + 'camera' + ]) + ).toBe(false) + expect( + await registry.requestBrowserPermission(instance.instanceId, context, ['tool-call']) + ).toBe(false) + const decision = registry.requestBrowserPermission(instance.instanceId, context, ['camera']) + expect(requestId).not.toBe('') + expect(registry.submitConsent(requestId, true, context)).toBe(true) + registry.revoke(instance.instanceId) + expect(await decision).toBe(false) + }) + it('binds instances to the creating WebContents and revokes them', () => { const registry = new McpAppSandboxRegistry() const instance = createInstance(registry) @@ -86,193 +158,4 @@ describe('MCP App sandbox registry', () => { await expect(decision).resolves.toBe(false) expect(registry.getForProtocol(instance.instanceId)).toBeNull() }) - - it('preserves default-session permissions while isolating App frames', async () => { - const registry = new McpAppSandboxRegistry() - const instance = createInstance(registry) - let permissionRequestHandler: - | (( - owner: { id: number; getURL(): string }, - permission: string, - callback: (allowed: boolean) => void, - details: { - requestingUrl: string - mediaTypes?: string[] - isMainFrame: boolean - } - ) => void) - | undefined - let permissionCheckHandler: - | (( - owner: { id: number; getURL(): string } | null, - permission: string, - requestingOrigin: string, - details: { securityOrigin: string; requestingUrl: string } - ) => boolean) - | undefined - const targetSession = { - setPermissionRequestHandler: vi.fn( - (handler: NonNullable) => { - permissionRequestHandler = handler - } - ), - setPermissionCheckHandler: vi.fn((handler: NonNullable) => { - permissionCheckHandler = handler - }) - } - registry.configureDefaultSessionPermissions(targetSession as never) - - const firstPartyDecision = vi.fn() - permissionRequestHandler!( - { id: 1, getURL: () => 'file:///deepchat/index.html' }, - 'media', - firstPartyDecision, - { - requestingUrl: 'file:///deepchat/index.html', - mediaTypes: ['audio'], - isMainFrame: true - } - ) - expect(firstPartyDecision).toHaveBeenCalledWith(true) - - for (const mediaTypes of [['video'], ['audio', 'video']]) { - const firstPartyCameraDecision = vi.fn() - permissionRequestHandler!( - { id: 1, getURL: () => 'file:///deepchat/index.html' }, - 'media', - firstPartyCameraDecision, - { - requestingUrl: 'file:///deepchat/index.html', - mediaTypes, - isMainFrame: true - } - ) - expect(firstPartyCameraDecision).toHaveBeenCalledWith(true) - } - expect( - permissionCheckHandler!( - { id: 1, getURL: () => 'file:///deepchat/index.html' }, - 'notifications', - 'file:///deepchat/index.html', - { - securityOrigin: 'file:///deepchat/index.html', - requestingUrl: 'file:///deepchat/index.html' - } - ) - ).toBe(true) - - const browserDecision = vi.fn() - permissionRequestHandler!( - { id: 2, getURL: () => 'https://example.com' }, - 'notifications', - browserDecision, - { - requestingUrl: 'https://example.com', - isMainFrame: true - } - ) - expect(browserDecision).toHaveBeenCalledWith(true) - expect( - permissionCheckHandler!( - { id: 2, getURL: () => 'https://example.com' }, - 'notifications', - 'https://example.com', - { - securityOrigin: 'https://example.com', - requestingUrl: 'https://example.com' - } - ) - ).toBe(true) - - const nestedRemoteDecision = vi.fn() - permissionRequestHandler!( - { id: 1, getURL: () => 'file:///deepchat/index.html' }, - 'notifications', - nestedRemoteDecision, - { - requestingUrl: 'https://example.com', - isMainFrame: false - } - ) - expect(nestedRemoteDecision).toHaveBeenCalledWith(false) - expect( - permissionCheckHandler!( - { id: 1, getURL: () => 'file:///deepchat/index.html' }, - 'notifications', - 'https://example.com', - { - securityOrigin: 'https://example.com', - requestingUrl: 'https://example.com' - } - ) - ).toBe(false) - - const consentRequestIds: string[] = [] - registry.setConsentPublisher((_windowId, payload) => { - consentRequestIds.push(payload.request.requestId) - }) - const undeclaredMicrophoneDecision = vi.fn() - permissionRequestHandler!( - { - id: 7, - getURL: () => `mcp-app://${instance.instanceId}/sandbox.html` - }, - 'media', - undeclaredMicrophoneDecision, - { - requestingUrl: `mcp-app://${instance.instanceId}/sandbox.html`, - mediaTypes: ['audio'], - isMainFrame: false - } - ) - expect(undeclaredMicrophoneDecision).toHaveBeenCalledWith(false) - expect(consentRequestIds).toHaveLength(0) - - const appDecision = vi.fn() - permissionRequestHandler!( - { - id: 7, - getURL: () => `mcp-app://${instance.instanceId}/sandbox.html` - }, - 'media', - appDecision, - { - requestingUrl: `mcp-app://${instance.instanceId}/sandbox.html`, - mediaTypes: ['video'], - isMainFrame: false - } - ) - await vi.waitFor(() => expect(consentRequestIds).toHaveLength(1)) - expect( - registry.submitConsent(consentRequestIds[0], true, { - webContentsId: 7, - windowId: 11 - }) - ).toBe(true) - await vi.waitFor(() => expect(appDecision).toHaveBeenCalledWith(true)) - - const repeatedDecision = vi.fn() - permissionRequestHandler!( - { - id: 7, - getURL: () => `mcp-app://${instance.instanceId}/sandbox.html` - }, - 'media', - repeatedDecision, - { - requestingUrl: `mcp-app://${instance.instanceId}/sandbox.html`, - mediaTypes: ['video'], - isMainFrame: false - } - ) - await vi.waitFor(() => expect(consentRequestIds).toHaveLength(2)) - expect(repeatedDecision).not.toHaveBeenCalled() - expect( - registry.submitConsent(consentRequestIds[1], true, { - webContentsId: 7, - windowId: 11 - }) - ).toBe(true) - await vi.waitFor(() => expect(repeatedDecision).toHaveBeenCalledWith(true)) - }) }) diff --git a/test/main/mcp/mcpClient.test.ts b/test/main/mcp/mcpClient.test.ts index 6b7e89d987..fe4e5468dd 100644 --- a/test/main/mcp/mcpClient.test.ts +++ b/test/main/mcp/mcpClient.test.ts @@ -1,6 +1,5 @@ import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest' -import { McpClient } from '../../../src/main/mcp/mcpClient' -import { ToolchainService } from '../../../src/main/toolchains/service' +import { McpClient, type McpClientRuntime } from '../../../src/main/mcp/mcpClient' import { ToolchainResolutionError } from '../../../src/main/toolchains/errors' import path from 'path' import fs from 'fs' @@ -24,18 +23,6 @@ vi.mock('@/agent/shared/process/childProcessRegistry', () => ({ childProcessRegistry: childProcessRegistryMock })) -// Mock electron modules -vi.mock('electron', () => ({ - app: { - getPath: vi.fn((pathType: string) => { - if (pathType === 'home') return '/mock/home' - return '/mock/app' - }), - getAppPath: vi.fn(() => '/mock/app'), - getVersion: vi.fn(() => '1.0.0') - } -})) - // Mock fs module vi.mock('fs', () => ({ existsSync: fsExistsSyncMock, @@ -63,6 +50,10 @@ const mockGenerateCompletionStandalone = presenterMocks.generateCompletionStanda const mockGetProviderModels = presenterMocks.getProviderModels const mockGetCustomModels = presenterMocks.getCustomModels +let toolchains: McpClientRuntime['toolchains'] +let homeDirectory = '/mock/home' +let appVersion = '1.0.0' + function createMcpClient( serverName: string, serverConfig: Record, @@ -80,6 +71,9 @@ function createMcpClient( mcpOAuthManager, inMemoryServerFactory, { + homeDirectory, + appVersion, + toolchains, resolveMcpBindings, sampling: { handleSamplingRequest: mockHandleSamplingRequest, @@ -192,7 +186,7 @@ describe('McpClient Runtime Command Processing Tests', () => { vi.clearAllMocks() mockFsExistsSync.mockReset() mockFsExistsSync.mockReturnValue(false) - vi.spyOn(ToolchainService, 'getInstance').mockReturnValue({ + toolchains = { rewriteCommand: (command: string, args: string[]) => ({ command, args }), resolvedBinDirs: () => [], prependResolvedToEnv: (env: Record) => env, @@ -203,7 +197,9 @@ describe('McpClient Runtime Command Processing Tests', () => { `${kind} toolchain is not configured` ) } - } as never) + } as never + homeDirectory = '/mock/home' + appVersion = '1.0.0' mockHandleSamplingRequest.mockReset() mockCancelSamplingRequest.mockReset() @@ -239,7 +235,6 @@ describe('McpClient Runtime Command Processing Tests', () => { }) afterEach(() => { - ToolchainService.resetForTests() vi.unstubAllEnvs() vi.clearAllMocks() }) @@ -308,12 +303,12 @@ describe('McpClient Runtime Command Processing Tests', () => { process.platform === 'win32' ? path.join(uvRuntimePath, 'uvx.exe') : path.join(uvRuntimePath, 'uvx') - vi.spyOn(ToolchainService, 'getInstance').mockReturnValue({ + toolchains = { rewriteCommand: () => ({ command: expectedUvxPath, args: ['osm-mcp-server'] }), resolvedBinDirs: () => [], prependResolvedToEnv: (env: Record) => env, resolve: () => ({ rootDir: uvRuntimePath }) - } as never) + } as never const client = createMcpClient('osm-mcp-server', { type: 'stdio', @@ -411,15 +406,37 @@ describe('McpClient Runtime Command Processing Tests', () => { }) describe('Runtime Path Detection', () => { + it('uses the supplied home and application identity without a native default', async () => { + homeDirectory = '/owned/runtime/home' + appVersion = '9.8.7' + const client = createMcpClient('host-inputs', { + type: 'http', + baseUrl: 'http://127.0.0.1:12345/mcp' + }) + + expect(client.expandPath('~/server.cjs')).toBe('/owned/runtime/home/server.cjs') + await client.connect() + expect(Client).toHaveBeenCalledWith( + { name: 'DeepChat', version: '9.8.7' }, + expect.any(Object) + ) + await client.disconnect() + + homeDirectory = 'relative/home' + expect(() => createMcpClient('invalid', { type: 'stdio' })).toThrow( + 'MCP home directory must be absolute' + ) + }) + it('should expose resolved toolchain roots from the service', () => { - vi.spyOn(ToolchainService, 'getInstance').mockReturnValue({ + toolchains = { rewriteCommand: (command: string, args: string[]) => ({ command, args }), resolvedBinDirs: () => [], prependResolvedToEnv: (env: Record) => env, resolve: (kind: 'node' | 'uv') => ({ rootDir: kind === 'uv' ? '/runtime/uv' : '/runtime/node' }) - } as never) + } as never const client = createMcpClient('test', { type: 'stdio' }) @@ -435,6 +452,40 @@ describe('McpClient Runtime Command Processing Tests', () => { }) }) + it('cancels an owned resource read while an uncooperative SDK result is pending', async () => { + let release!: (value: { contents: unknown[] }) => void + const sdk = { + ...createSdkToolClient([], 'modern'), + readResource: vi.fn( + () => + new Promise<{ contents: unknown[] }>((resolve) => { + release = resolve + }) + ) + } + vi.mocked(Client).mockImplementationOnce(function Client() { + return sdk as never + }) + const client = createMcpClient('resource-owner', { + type: 'http', + baseUrl: 'http://127.0.0.1:12345/mcp' + }) + await client.connect() + const controller = new AbortController() + const reading = client.readResourceContents('ui://fixture/index.html', controller.signal) + const rejected = expect(reading).rejects.toThrow('Resource owner closed') + await vi.waitFor(() => expect(sdk.readResource).toHaveBeenCalled()) + expect(sdk.readResource).toHaveBeenCalledWith( + { uri: 'ui://fixture/index.html' }, + { signal: controller.signal } + ) + controller.abort(new Error('Resource owner closed')) + await rejected + release({ contents: [{ uri: 'ui://fixture/index.html', text: 'late' }] }) + await new Promise((resolve) => setImmediate(resolve)) + await client.disconnect() + }) + describe('Environment Variable Processing', () => { it('does not disclose host environment values to user-owned MCP servers', async () => { vi.stubEnv('DEEPCHAT_TEST_HOST_SECRET', 'host-only-secret') @@ -473,7 +524,7 @@ describe('McpClient Runtime Command Processing Tests', () => { null, undefined, undefined, - () => ({ TOKEN: value }) + async () => ({ TOKEN: value }) ) await expect(client.connect()).rejects.toThrow(/header/i) } @@ -489,9 +540,17 @@ describe('McpClient Runtime Command Processing Tests', () => { environmentVariables: ['DEEPCHAT_TEST_HOST_SECRET'], env: { TOKEN: '${DEEPCHAT_TEST_HOST_SECRET}' } } - const client = createMcpClient('reviewed', config, null, null, undefined, undefined, () => ({ - DEEPCHAT_TEST_HOST_SECRET: 'explicit-secret' - })) + const client = createMcpClient( + 'reviewed', + config, + null, + null, + undefined, + undefined, + async () => ({ + DEEPCHAT_TEST_HOST_SECRET: 'explicit-secret' + }) + ) await client.connect() expect(vi.mocked(StdioClientTransport).mock.calls.at(-1)?.[0]?.env?.TOKEN).toBe( 'explicit-secret' @@ -499,6 +558,35 @@ describe('McpClient Runtime Command Processing Tests', () => { expect(config.env.TOKEN).toBe('${DEEPCHAT_TEST_HOST_SECRET}') }) + it('does not create a transport when cancelled during credential resolution', async () => { + const bindings = Promise.withResolvers>() + const client = createMcpClient( + 'reviewed', + { + ownerPluginId: 'user.reviewed', + type: 'stdio', + command: 'node', + args: ['server.js'], + environmentVariables: ['TOKEN'], + env: { TOKEN: '${TOKEN}' } + }, + null, + null, + undefined, + undefined, + () => bindings.promise + ) + const completion = expect(client.connect({ waitForConnection: true })).rejects.toThrow( + 'cancelled' + ) + await client.disconnect() + bindings.resolve({ TOKEN: 'private-key' }) + await completion + expect(StdioClientTransport).not.toHaveBeenCalled() + expect(client.getLifecycleStatus()).toBe('stopped') + expect(client.isActive()).toBe(false) + }) + it('should set npm registry environment variables', () => { const client = createMcpClient('test', { type: 'stdio' }, 'https://registry.npmmirror.com') @@ -603,12 +691,12 @@ describe('McpClient Runtime Command Processing Tests', () => { } return env }) - vi.spyOn(ToolchainService, 'getInstance').mockReturnValue({ + toolchains = { rewriteCommand: (command: string, args: string[]) => ({ command, args }), resolvedBinDirs: () => [toolchainBin], prependResolvedToEnv, resolve: () => ({ rootDir: '/managed/node', binDir: toolchainBin }) - } as never) + } as never const client = createMcpClient('test', { type: 'stdio', diff --git a/test/main/mcp/mcpOAuthFlow.test.ts b/test/main/mcp/mcpOAuthFlow.test.ts index aba0e6ee29..5030f8d72c 100644 --- a/test/main/mcp/mcpOAuthFlow.test.ts +++ b/test/main/mcp/mcpOAuthFlow.test.ts @@ -15,14 +15,12 @@ import { McpOAuthManager } from '@/mcp/mcpOAuthManager' import { DeepChatMcpOAuthProvider } from '@/mcp/mcpOAuthProvider' import { McpOAuthCredentialStore } from '@/mcp/oauthCredentialStore' import { MCP_OAUTH_REDIRECT_PATH, MCP_OAUTH_REDIRECT_PORT } from '@/mcp/oauthConstants' - const endpoint = 'https://mcp.example/mcp' const identity = { serverId: '11111111-1111-4111-8111-111111111111', configGeneration: 1, bindingHash: 'a'.repeat(64) } - describe('MCP interactive OAuth', () => { let manager: McpOAuthManager let store: McpOAuthCredentialStore @@ -31,7 +29,6 @@ describe('MCP interactive OAuth', () => { let registrations: OAuthClientMetadata[] let tokenRequests: URLSearchParams[] let reservedServers: Server[] - beforeEach(() => { registrations = [] tokenRequests = [] @@ -40,9 +37,8 @@ describe('MCP interactive OAuth', () => { vi.mocked(safeStorage.isEncryptionAvailable).mockReturnValue(false) vi.mocked(shell.openExternal).mockResolvedValue(undefined) }) - afterEach(async () => { - manager?.logout('example', config) + await manager?.logout('example', config) await Promise.all( reservedServers .filter((server) => server.listening) @@ -50,7 +46,6 @@ describe('MCP interactive OAuth', () => { ) vi.unstubAllGlobals() }) - async function registeredCallbackUri(occupied = false): Promise { const server = createServer().listen(0, '127.0.0.1') reservedServers.push(server) @@ -61,7 +56,6 @@ describe('MCP interactive OAuth', () => { } return `http://localhost:${port}/mcp/oauth/callback/legacy-random-path` } - function setup(issuer: string, clientMetadataUrl?: string): void { config = { ...identity, @@ -114,15 +108,24 @@ describe('MCP interactive OAuth', () => { throw new Error(`Unexpected OAuth request: ${url}`) }) ) - store = new McpOAuthCredentialStore('/tmp/deepchat-oauth-flow/credentials.json') - manager = new McpOAuthManager(store, vi.fn()) + store = new McpOAuthCredentialStore({ + filePath: '/tmp/deepchat-oauth-flow/credentials.json', + crypto: { + isAvailable: async () => false, + encrypt: async () => { + throw new Error('Unexpected native encryption') + }, + decrypt: async () => { + throw new Error('Unexpected native decryption') + } + } + }) + manager = new McpOAuthManager(store, shell.openExternal, vi.fn()) } - function latestAuthorization(): URL { const calls = vi.mocked(shell.openExternal).mock.calls return new URL(calls[calls.length - 1][0]) } - function completeAuthorization( parameters: Record = { code: 'authorization-code' } ) { @@ -135,9 +138,8 @@ describe('MCP interactive OAuth', () => { } return manager.completeAuthFromCallbackUrl('example', config, callback.toString()) } - - function seedClient(redirectUris?: string[], clientId = 'legacy-client'): void { - store.saveEntry('legacy-credential', { + async function seedClient(redirectUris?: string[], clientId = 'legacy-client'): Promise { + await store.saveEntry('legacy-credential', { binding: { ...identity, endpoint, @@ -159,7 +161,6 @@ describe('MCP interactive OAuth', () => { } }) } - it.each(['https://auth.example', 'https://auth.example/'])( 'exchanges and refreshes tokens for issuer %s', async (issuer) => { @@ -167,7 +168,6 @@ describe('MCP interactive OAuth', () => { expect((await manager.startAuth('example', config)).state).toBe('authenticating') const authorization = latestAuthorization() expect((await completeAuthorization()).state).toBe('authenticated') - const verifier = tokenRequests[0].get('code_verifier')! expect(createHash('sha256').update(verifier).digest('base64url')).toBe( authorization.searchParams.get('code_challenge') @@ -192,13 +192,11 @@ describe('MCP interactive OAuth', () => { ).toBeUndefined() } ) - it('reuses the registered callback after denial with fresh state and PKCE', async () => { setup('https://auth.example') await manager.startAuth('example', config) const first = latestAuthorization() expect((await completeAuthorization({ error: 'access_denied' })).state).toBe('error') - expect((await manager.startAuth('example', config)).state).toBe('authenticating') const second = latestAuthorization() expect(new URL(second.searchParams.get('redirect_uri')!).pathname).toBe( @@ -212,21 +210,22 @@ describe('MCP interactive OAuth', () => { expect((await completeAuthorization()).state).toBe('authenticated') expect(registrations).toHaveLength(1) }) - it.each(['bound', 'legacy'])( 'preserves a %s registration with a raw stored issuer and normalized config', async (storage) => { setup('https://auth.example') const registeredUri = await registeredCallbackUri() - seedClient([registeredUri]) - store.clearEntryScope('legacy-credential', 'tokens') + await seedClient([registeredUri]) + await store.clearEntryScope('legacy-credential', 'tokens') config.authorization!.authorizationServerIssuer = 'https://auth.example/' if (storage === 'legacy') { const key = createHash('sha256').update(`example\nhttp\n${endpoint}`).digest('hex') - store.saveEntry(key, { ...store.load('legacy-credential'), binding: undefined }) - store.clearEntry('legacy-credential') + await store.saveEntry(key, { + ...(await store.load('legacy-credential')), + binding: undefined + }) + await store.clearEntry('legacy-credential') } - expect((await manager.startAuth('example', config)).state).toBe('authenticating') const authorization = latestAuthorization() expect(new URL(authorization.searchParams.get('redirect_uri')!).pathname).toBe( @@ -235,11 +234,13 @@ describe('MCP interactive OAuth', () => { expect(authorization.searchParams.get('client_id')).toBe('legacy-client') expect((await completeAuthorization()).state).toBe('authenticated') expect(registrations).toHaveLength(0) - const stored = store.findInteractiveCredential({ - ...identity, - endpoint, - authorizationServerIssuer: 'https://auth.example/' - })?.entry + const stored = ( + await store.findInteractiveCredential({ + ...identity, + endpoint, + authorizationServerIssuer: 'https://auth.example/' + }) + )?.entry expect(stored?.binding?.authorizationServerIssuer).toBe('https://auth.example/') expect(stored?.discoveryState?.authorizationServerMetadata?.issuer).toBe( 'https://auth.example' @@ -247,15 +248,13 @@ describe('MCP interactive OAuth', () => { expect(stored?.clientInformation?.issuer).toBe('https://auth.example') } ) - it.each([false, true])( 'handles a registered callback port with occupied=%s', async (occupied) => { setup('https://auth.example') const registeredUri = await registeredCallbackUri(occupied) - seedClient([registeredUri]) - store.clearEntryScope('legacy-credential', 'tokens') - + await seedClient([registeredUri]) + await store.clearEntryScope('legacy-credential', 'tokens') expect((await manager.startAuth('example', config)).state).toBe('authenticating') const authorization = latestAuthorization() const redirect = new URL(authorization.searchParams.get('redirect_uri')!) @@ -272,27 +271,29 @@ describe('MCP interactive OAuth', () => { expect((await completeAuthorization()).state).toBe('authenticated') } ) - - it.each(['tokens', 'clientInformation'])('ignores a malformed stored issuer in %s', (scope) => { - setup('https://auth.example') - store.saveEntry( - 'malformed-credential', - scope === 'tokens' - ? { tokens: { access_token: 'stale-token', issuer: 'not-a-url' } } - : { clientInformation: { client_id: 'stale-client', issuer: 'not-a-url' } } - ) - const provider = new DeepChatMcpOAuthProvider({ - store, - binding: { ...identity, endpoint }, - initialCredentialKey: 'malformed-credential', - credentialKey: (binding) => JSON.stringify(binding), - redirectUrl: 'http://localhost:1456/mcp/oauth/callback' - }) - - expect(provider.clientInformation({ issuer: 'https://auth.example' })).toBeUndefined() - expect(provider.tokens({ issuer: 'https://auth.example' })).toBeUndefined() - }) - + it.each(['tokens', 'clientInformation'])( + 'ignores a malformed stored issuer in %s', + async (scope) => { + setup('https://auth.example') + await store.saveEntry( + 'malformed-credential', + scope === 'tokens' + ? { tokens: { access_token: 'stale-token', token_type: 'Bearer', issuer: 'not-a-url' } } + : { clientInformation: { client_id: 'stale-client', issuer: 'not-a-url' } } + ) + const provider = new DeepChatMcpOAuthProvider({ + openExternal: shell.openExternal, + assertActive: () => undefined, + store, + binding: { ...identity, endpoint }, + initialCredentialKey: 'malformed-credential', + credentialKey: (binding) => JSON.stringify(binding), + redirectUrl: 'http://localhost:1456/mcp/oauth/callback' + }) + expect(await provider.clientInformation({ issuer: 'https://auth.example' })).toBeUndefined() + expect(await provider.tokens({ issuer: 'https://auth.example' })).toBeUndefined() + } + ) it.each([ { redirectUris: undefined }, { redirectUris: [] }, @@ -306,8 +307,7 @@ describe('MCP interactive OAuth', () => { 're-registers a client without a usable local callback: $redirectUris', async ({ redirectUris }) => { setup('https://auth.example') - seedClient(redirectUris) - + await seedClient(redirectUris) expect((await manager.startAuth('example', config)).state).toBe('authenticating') expect(registrations).toHaveLength(1) expect(tokenRequests).toHaveLength(0) @@ -319,20 +319,17 @@ describe('MCP interactive OAuth', () => { expect((await completeAuthorization()).state).toBe('authenticated') } ) - it('keeps an existing dynamic registration when a client metadata URL is configured', async () => { setup('https://auth.example', 'https://client.example/deepchat.json') const registeredUri = await registeredCallbackUri() - seedClient([registeredUri]) - store.clearEntryScope('legacy-credential', 'tokens') - + await seedClient([registeredUri]) + await store.clearEntryScope('legacy-credential', 'tokens') expect((await manager.startAuth('example', config)).state).toBe('authenticating') expect(latestAuthorization().searchParams.get('client_id')).toBe('legacy-client') expect(latestAuthorization().searchParams.get('redirect_uri')).toBe(registeredUri) expect((await completeAuthorization()).state).toBe('authenticated') expect(registrations).toHaveLength(0) }) - it.each([false, true])( 'uses a published callback for a URL-based client with existing=%s', async (existing) => { @@ -343,8 +340,8 @@ describe('MCP interactive OAuth', () => { } setup('https://auth.example', clientMetadataUrl) if (existing) { - seedClient(undefined, clientMetadataUrl) - store.clearEntryScope('legacy-credential', 'tokens') + await seedClient(undefined, clientMetadataUrl) + await store.clearEntryScope('legacy-credential', 'tokens') } vi.mocked(shell.openExternal).mockImplementation(async (url) => { const authorization = new URL(url) @@ -354,7 +351,6 @@ describe('MCP interactive OAuth', () => { redirect.port = new URL(publishedMetadata.redirect_uris[0]).port expect(publishedMetadata.redirect_uris).toContain(redirect.href) }) - expect((await manager.startAuth('example', config)).state).toBe('authenticating') expect((await completeAuthorization()).state).toBe('authenticated') expect(tokenRequests[0].get('redirect_uri')).toBe( @@ -363,4 +359,27 @@ describe('MCP interactive OAuth', () => { expect(registrations).toHaveLength(0) } ) + + it('rejects a delayed browser acknowledgement after logout without restoring credentials', async () => { + setup('https://auth.example') + let acknowledge!: () => void + let opened!: () => void + const opening = new Promise((resolve) => { + opened = resolve + }) + vi.mocked(shell.openExternal).mockImplementationOnce(() => { + opened() + return new Promise((resolve) => { + acknowledge = resolve + }) + }) + const pending = manager.startAuth('example', config) + const rejected = expect(pending).rejects.toThrow('interrupted') + await opening + expect((await manager.logout('example', config)).authenticated).toBe(false) + acknowledge() + await rejected + expect((await manager.getStatus('example', config)).authenticated).toBe(false) + expect(tokenRequests).toHaveLength(0) + }) }) diff --git a/test/main/mcp/mcpOAuthManager.test.ts b/test/main/mcp/mcpOAuthManager.test.ts index 0dec815fd9..4a1e51d1df 100644 --- a/test/main/mcp/mcpOAuthManager.test.ts +++ b/test/main/mcp/mcpOAuthManager.test.ts @@ -1,11 +1,9 @@ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' - const publishDeepchatEventMock = vi.hoisted(() => vi.fn()) const discoverOAuthServerInfoMock = vi.hoisted(() => vi.fn()) const authMock = vi.hoisted(() => vi.fn()) const clientCredentialsProviderMock = vi.hoisted(() => vi.fn()) const privateKeyJwtProviderMock = vi.hoisted(() => vi.fn()) - vi.mock('@modelcontextprotocol/client', async (importOriginal) => ({ ...(await importOriginal()), auth: authMock, @@ -21,77 +19,79 @@ vi.mock('@modelcontextprotocol/client', async (importOriginal) => ({ } } })) - +import type { OAuthDiscoveryState } from '@modelcontextprotocol/client' import { McpOAuthManager } from '@/mcp/mcpOAuthManager' import { McpEnterpriseIdentityManager } from '@/mcp/enterpriseIdentityManager' -import type { McpOAuthCredentialStore } from '@/mcp/oauthCredentialStore' +import type { McpOAuthCredentialEntry, McpOAuthCredentialStore } from '@/mcp/oauthCredentialStore' import type { McpSettings } from '@/mcp/settings' - const createStore = (entry: unknown): McpOAuthCredentialStore => ({ - getStorageState: vi.fn(() => 'file'), - isPersistent: vi.fn(() => true), - load: vi.fn(() => entry), - findInteractiveCredential: vi.fn(() => null), - saveEntry: vi.fn(), - clearEntry: vi.fn(), - clearEntryScope: vi.fn(), - loadClientSecret: vi.fn(() => null), - loadPrivateKey: vi.fn(() => null), - loadEnterpriseResourceSecret: vi.fn(() => null), - getCredentialRecordStatus: vi.fn(() => ({ configured: false })) + getStorageState: vi.fn(async () => 'safeStorage'), + isPersistent: vi.fn(async () => true), + load: vi.fn(async () => entry), + findInteractiveCredential: vi.fn(async () => null), + saveEntry: vi.fn(async () => undefined), + moveInteractiveEntry: vi.fn(async (_from: string, key: string) => + entry ? { key, entry: entry as McpOAuthCredentialEntry } : null + ), + stop: vi.fn(), + clearEntry: vi.fn(async () => undefined), + clearEntryScope: vi.fn(async () => undefined), + clearServerCredentials: vi.fn(async () => undefined), + loadClientSecret: vi.fn(async () => null), + loadPrivateKey: vi.fn(async () => null), + loadEnterpriseResourceSecret: vi.fn(async () => null), + getCredentialRecordStatus: vi.fn(async () => ({ configured: false })) }) as unknown as McpOAuthCredentialStore - const serverIdentity = { serverId: '11111111-1111-4111-8111-111111111111', configGeneration: 1, bindingHash: 'a'.repeat(64) } - describe('McpOAuthManager', () => { beforeEach(() => { vi.clearAllMocks() }) - afterEach(() => { vi.restoreAllMocks() }) - it('keeps authenticated credentials ahead of stale non-pending errors', async () => { const manager = new McpOAuthManager( createStore({ tokens: { - access_token: 'access-token' + access_token: 'access-token', + token_type: 'Bearer' }, discoveryState: { authorizationServerUrl: 'https://auth.example' }, updatedAt: 123 }), + vi.fn(async () => undefined), publishDeepchatEventMock ) const config = { - type: 'http', + type: 'http' as const, baseUrl: 'https://mcp.linear.app/mcp', ...serverIdentity } - - manager.handleConnectionError('linear', config, new Error('401 unauthorized')) - + await manager.handleConnectionError('linear', config, new Error('401 unauthorized')) const status = await manager.completeAuthFromCallbackUrl( 'linear', config, 'http://localhost:3333/callback?code=used&state=used' ) - expect(status.state).toBe('authenticated') expect(status.authenticated).toBe(true) expect(status.error).toBeUndefined() expect(publishDeepchatEventMock).toHaveBeenCalledTimes(1) }) - it('accepts callback input bound to the pre-discovery OAuth configuration', async () => { - const manager = new McpOAuthManager(createStore(null), publishDeepchatEventMock) + const manager = new McpOAuthManager( + createStore(null), + vi.fn(async () => undefined), + publishDeepchatEventMock + ) const initialBinding = { ...serverIdentity, endpoint: 'https://mcp.example/mcp' @@ -103,7 +103,9 @@ describe('McpOAuthManager', () => { url: 'http://localhost/callback?code=code&state=state' })) const failAuthFlow = vi.spyOn( - manager as unknown as { failAuthFlow: (...args: unknown[]) => void }, + manager as unknown as { + failAuthFlow: (...args: unknown[]) => void + }, 'failAuthFlow' ) const internals = manager as unknown as { @@ -129,49 +131,49 @@ describe('McpOAuthManager', () => { }, flowPromise: Promise.resolve() }) - await manager.completeAuthFromCallbackUrl( 'example', { - type: 'http', + type: 'http' as const, baseUrl: initialBinding.endpoint, authorization: { mode: 'interactive' }, ...serverIdentity }, 'http://localhost/callback?code=code&state=state' ) - expect(resolveCallbackUrl).toHaveBeenCalledOnce() expect(failAuthFlow).not.toHaveBeenCalled() }) - - it('classifies HTTP status shaped OAuth failures', () => { + it('classifies HTTP status shaped OAuth failures', async () => { const config = { - type: 'http', + type: 'http' as const, baseUrl: 'https://mcp.linear.app/mcp', ...serverIdentity } as const const errors = [{ status: 401 }, { httpStatus: 401 }, { response: { status: '401' } }] - for (const error of errors) { - const manager = new McpOAuthManager(createStore(null), publishDeepchatEventMock) - - expect(manager.handleConnectionError('linear', config, error)).toBe(true) - expect(manager.getStatus('linear', config).state).toBe('required') + const manager = new McpOAuthManager( + createStore(null), + vi.fn(async () => undefined), + publishDeepchatEventMock + ) + expect(await manager.handleConnectionError('linear', config, error)).toBe(true) + expect((await manager.getStatus('linear', config)).state).toBe('required') } }) - - it('ignores stale authenticated flows after a newer auth attempt starts', () => { + it('ignores stale authenticated flows after a newer auth attempt starts', async () => { const closeStaleSession = vi.fn() const closeActiveSession = vi.fn() const onAuthenticated = vi.fn() const manager = new McpOAuthManager( createStore({ tokens: { - access_token: 'access-token' + access_token: 'access-token', + token_type: 'Bearer' }, updatedAt: 123 }), + vi.fn(async () => undefined), publishDeepchatEventMock, onAuthenticated ) @@ -196,16 +198,13 @@ describe('McpOAuthManager', () => { pendingFlows: Map finishAuthenticatedFlow: (flow: unknown) => void } - managerInternals.pendingFlows.set('linear', activeFlow) - managerInternals.finishAuthenticatedFlow(staleFlow) - + await managerInternals.finishAuthenticatedFlow(staleFlow) expect(closeStaleSession).not.toHaveBeenCalled() expect(closeActiveSession).not.toHaveBeenCalled() expect(onAuthenticated).not.toHaveBeenCalled() expect(publishDeepchatEventMock).not.toHaveBeenCalled() }) - it('rejects an interactive credential when live discovery changes its issuer', async () => { discoverOAuthServerInfoMock.mockResolvedValue({ authorizationServerUrl: 'https://auth.new.example/', @@ -217,7 +216,7 @@ describe('McpOAuthManager', () => { } }) const staleEntry = { - tokens: { access_token: 'stale-token' }, + tokens: { access_token: 'stale-token', token_type: 'Bearer' }, binding: { ...serverIdentity, endpoint: 'https://mcp.example/mcp', @@ -227,15 +226,18 @@ describe('McpOAuthManager', () => { updatedAt: 123 } const store = createStore(null) - vi.mocked(store.findInteractiveCredential).mockReturnValue({ + vi.mocked(store.findInteractiveCredential).mockResolvedValue({ key: 'stale-key', entry: staleEntry }) - const manager = new McpOAuthManager(store, publishDeepchatEventMock) - + const manager = new McpOAuthManager( + store, + vi.fn(async () => undefined), + publishDeepchatEventMock + ) await expect( manager.createRuntimeProvider('example', { - type: 'http', + type: 'http' as const, baseUrl: 'https://mcp.example/mcp', authorization: { mode: 'interactive' }, ...serverIdentity @@ -243,12 +245,14 @@ describe('McpOAuthManager', () => { ).resolves.toBeUndefined() expect(store.clearEntry).toHaveBeenCalledWith('stale-key') }) - it('finalizes the persisted server binding from interactive discovery', async () => { - const discovery = { + const discovery: OAuthDiscoveryState = { authorizationServerUrl: 'https://auth.example/', authorizationServerMetadata: { - issuer: 'https://auth.example/' + issuer: 'https://auth.example/', + authorization_endpoint: 'https://auth.example/authorize', + token_endpoint: 'https://auth.example/token', + response_types_supported: ['code'] }, resourceMetadata: { resource: 'https://mcp.example/mcp' @@ -256,7 +260,7 @@ describe('McpOAuthManager', () => { } discoverOAuthServerInfoMock.mockResolvedValue(discovery) const entry = { - tokens: { access_token: 'access-token' }, + tokens: { access_token: 'access-token', token_type: 'Bearer' }, clientInformation: { client_id: 'dynamic-client' }, discoveryState: discovery, binding: { @@ -269,7 +273,7 @@ describe('McpOAuthManager', () => { updatedAt: 123 } const store = createStore(entry) - vi.mocked(store.findInteractiveCredential).mockReturnValue({ + vi.mocked(store.findInteractiveCredential).mockResolvedValue({ key: 'old-key', entry }) @@ -287,50 +291,48 @@ describe('McpOAuthManager', () => { } const settings = { getMcpServers: vi.fn(async () => ({ example: currentConfig })), - updateMcpServer: vi.fn(async (_serverName: string, update: Record) => { + finalizeOAuthBinding: vi.fn((_expected: unknown, authorization: unknown) => { currentConfig = { ...currentConfig, - ...update, + authorization, configGeneration: 2, bindingHash: 'b'.repeat(64) } as typeof currentConfig + return currentConfig }) } const bindingChanged = vi.fn() const manager = new McpOAuthManager( store, + vi.fn(async () => undefined), publishDeepchatEventMock, undefined, settings as never, bindingChanged ) - await expect(manager.createRuntimeProvider('example', currentConfig)).resolves.toBeDefined() - - expect(settings.updateMcpServer).toHaveBeenCalledWith('example', { - authorization: { + expect(settings.finalizeOAuthBinding).toHaveBeenCalledWith( + expect.objectContaining(serverIdentity), + { mode: 'interactive', authorizationServerIssuer: 'https://auth.example/', protectedResourceUrl: 'https://mcp.example/mcp', clientId: 'dynamic-client' } - }) + ) expect(bindingChanged).toHaveBeenCalledOnce() - expect(store.saveEntry).toHaveBeenCalledWith( + expect(store.moveInteractiveEntry).toHaveBeenCalledWith( + 'old-key', expect.not.stringMatching(/^old-key$/), expect.objectContaining({ - binding: expect.objectContaining({ - configGeneration: 2, - bindingHash: 'b'.repeat(64), - authorizationServerIssuer: 'https://auth.example/', - protectedResourceUrl: 'https://mcp.example/mcp', - clientId: 'dynamic-client' - }) + configGeneration: 2, + bindingHash: 'b'.repeat(64), + authorizationServerIssuer: 'https://auth.example/', + protectedResourceUrl: 'https://mcp.example/mcp', + clientId: 'dynamic-client' }) ) - expect(store.clearEntry).toHaveBeenCalledWith('old-key') }) - it('binds client credentials to the configured issuer, resource, and server', async () => { const endpoint = 'https://mcp.example/mcp' const issuer = 'https://auth.example/' @@ -354,12 +356,12 @@ describe('McpOAuthManager', () => { ...serverIdentity } const store = createStore(null) - vi.mocked(store.loadClientSecret).mockReturnValue({ + vi.mocked(store.loadClientSecret).mockResolvedValue({ secret: 'client-secret', binding, updatedAt: 1 }) - vi.mocked(store.getCredentialRecordStatus).mockReturnValue({ + vi.mocked(store.getCredentialRecordStatus).mockResolvedValue({ configured: true, updatedAt: 1 }) @@ -372,10 +374,12 @@ describe('McpOAuthManager', () => { resourceMetadata: { resource: endpoint } }) authMock.mockResolvedValue('AUTHORIZED') - const manager = new McpOAuthManager(store, publishDeepchatEventMock) - + const manager = new McpOAuthManager( + store, + vi.fn(async () => undefined), + publishDeepchatEventMock + ) const provider = await manager.createRuntimeProvider('example', config) - expect(clientCredentialsProviderMock).toHaveBeenCalledWith( expect.objectContaining({ clientId: 'machine-client', @@ -404,7 +408,6 @@ describe('McpOAuthManager', () => { new URL(endpoint) ) }) - it('preserves successful machine authentication when the server restart fails', async () => { const endpoint = 'https://mcp.example/mcp' const issuer = 'https://auth.example/' @@ -427,12 +430,12 @@ describe('McpOAuthManager', () => { ...serverIdentity } const store = createStore(null) - vi.mocked(store.loadClientSecret).mockReturnValue({ + vi.mocked(store.loadClientSecret).mockResolvedValue({ secret: 'client-secret', binding, updatedAt: 1 }) - vi.mocked(store.getCredentialRecordStatus).mockReturnValue({ + vi.mocked(store.getCredentialRecordStatus).mockResolvedValue({ configured: true, updatedAt: 1 }) @@ -446,17 +449,23 @@ describe('McpOAuthManager', () => { }) authMock.mockResolvedValue('AUTHORIZED') const onAuthenticated = vi.fn().mockRejectedValue(new Error('restart failed')) - const manager = new McpOAuthManager(store, publishDeepchatEventMock, onAuthenticated) - + const manager = new McpOAuthManager( + store, + vi.fn(async () => undefined), + publishDeepchatEventMock, + onAuthenticated + ) const status = await manager.startAuth('example', config) - - expect(onAuthenticated).toHaveBeenCalledWith('example') + expect(onAuthenticated).toHaveBeenCalledWith( + serverIdentity.serverId, + 'restart', + expect.any(Function) + ) expect(status).toMatchObject({ state: 'authenticated', authenticated: true }) }) - it('fails closed before selecting a private-key provider with incompatible discovery', async () => { const endpoint = 'https://mcp.example/mcp' const issuer = 'https://auth.example/' @@ -479,14 +488,14 @@ describe('McpOAuthManager', () => { ...serverIdentity } const store = createStore(null) - vi.mocked(store.loadPrivateKey).mockReturnValue({ + vi.mocked(store.loadPrivateKey).mockResolvedValue({ privateKey: 'private-key', algorithm: 'RS256', fingerprint: 'fingerprint', binding, updatedAt: 1 }) - vi.mocked(store.getCredentialRecordStatus).mockReturnValue({ + vi.mocked(store.getCredentialRecordStatus).mockResolvedValue({ configured: true, updatedAt: 1, fingerprint: 'fingerprint' @@ -501,14 +510,16 @@ describe('McpOAuthManager', () => { } discoverOAuthServerInfoMock.mockResolvedValue(discovery) authMock.mockResolvedValue('AUTHORIZED') - const manager = new McpOAuthManager(store, publishDeepchatEventMock) - + const manager = new McpOAuthManager( + store, + vi.fn(async () => undefined), + publishDeepchatEventMock + ) await expect(manager.createRuntimeProvider('example', config)).rejects.toThrow( 'does not support private_key_jwt' ) expect(privateKeyJwtProviderMock).not.toHaveBeenCalled() expect(authMock).not.toHaveBeenCalled() - discoverOAuthServerInfoMock.mockResolvedValue({ ...discovery, authorizationServerMetadata: { @@ -517,7 +528,6 @@ describe('McpOAuthManager', () => { } }) const provider = await manager.createRuntimeProvider('example', config) - expect(privateKeyJwtProviderMock).toHaveBeenCalledWith( expect.objectContaining({ clientId: 'machine-client', @@ -528,7 +538,6 @@ describe('McpOAuthManager', () => { provider ) }) - it('requires ID-JAG discovery before binding cross-app access credentials', async () => { const endpoint = 'https://mcp.example/mcp' const issuer = 'https://auth.example/' @@ -552,12 +561,12 @@ describe('McpOAuthManager', () => { ...serverIdentity } const store = createStore(null) - vi.mocked(store.loadEnterpriseResourceSecret).mockReturnValue({ + vi.mocked(store.loadEnterpriseResourceSecret).mockResolvedValue({ secret: 'target-secret', binding, updatedAt: 1 }) - vi.mocked(store.getCredentialRecordStatus).mockReturnValue({ + vi.mocked(store.getCredentialRecordStatus).mockResolvedValue({ configured: true, updatedAt: 1 }) @@ -578,17 +587,16 @@ describe('McpOAuthManager', () => { ) const manager = new McpOAuthManager( store, + vi.fn(async () => undefined), publishDeepchatEventMock, undefined, {} as McpSettings ) - await expect(manager.createRuntimeProvider('example', config)).rejects.toThrow( 'does not support the ID-JAG grant profile' ) expect(createCrossAppProvider).not.toHaveBeenCalled() expect(store.loadEnterpriseResourceSecret).not.toHaveBeenCalled() - discoverOAuthServerInfoMock.mockResolvedValue({ ...discovery, authorizationServerMetadata: { @@ -597,11 +605,47 @@ describe('McpOAuthManager', () => { } }) const provider = await manager.createRuntimeProvider('example', config) - expect(createCrossAppProvider).toHaveBeenCalledWith(config, 'target-secret', issuer) expect(authMock).toHaveBeenCalledWith(provider, { serverUrl: endpoint, scope: undefined }) }) + + it('rejects a delayed runtime stop after the server binding is invalidated', async () => { + const store = createStore(null) + let finish!: () => void + let entered!: () => void + const stopping = new Promise((resolve) => { + entered = resolve + }) + const effects: string[] = [] + const onRuntimeChange = vi.fn( + async (_id: string, action: 'restart' | 'stop', assertCurrent: () => void) => { + if (action === 'stop') { + entered() + await new Promise((resolve) => { + finish = resolve + }) + } + assertCurrent() + effects.push(action) + } + ) + const manager = new McpOAuthManager( + store, + vi.fn(async () => undefined), + publishDeepchatEventMock, + onRuntimeChange + ) + const binding = { ...serverIdentity, endpoint: 'https://mcp.example/mcp' } + const removing = manager.removeCredential(binding, 'client_secret') + const rejected = expect(removing).rejects.toThrow('interrupted') + await stopping + await manager.clearServerCredentials(binding.serverId) + finish() + await rejected + expect(effects).toEqual([]) + expect(store.clearEntry).toHaveBeenCalledOnce() + }) }) diff --git a/test/main/mcp/mcpService.test.ts b/test/main/mcp/mcpService.test.ts index a4f1e7beb0..47b18545f0 100644 --- a/test/main/mcp/mcpService.test.ts +++ b/test/main/mcp/mcpService.test.ts @@ -1,3 +1,5 @@ +import { createPluginToolPolicies } from '../../helpers/pluginToolPolicies' +import type { McpToolDefinitionsSnapshot, MCPServerConfig } from '@shared/types/mcp' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' const serverManagerMocks = vi.hoisted(() => ({ @@ -19,7 +21,9 @@ const serverManagerMocks = vi.hoisted(() => ({ const toolManagerMocks = vi.hoisted(() => ({ getAllToolDefinitions: vi.fn().mockResolvedValue([]), - snapshotCachedToolDefinitions: vi.fn(() => ({ state: 'uninitialized' as const })), + snapshotCachedToolDefinitions: vi.fn( + (): McpToolDefinitionsSnapshot => ({ state: 'uninitialized' }) + ), getRunningClients: vi.fn().mockResolvedValue([]), invalidateRegistry: vi.fn(), callTool: vi.fn() @@ -81,6 +85,7 @@ vi.mock('@/agent/shared/process/childProcessRegistry', () => ({ })) import { McpService } from '../../../src/main/mcp' +import { McpOAuthCredentialStore } from '@/mcp/oauthCredentialStore' import { ToolManager } from '../../../src/main/mcp/toolManager' import type { CacheImageOptions } from '../../../src/main/platform/imageCache' @@ -110,18 +115,53 @@ const createMcpService = ( providerSettings, { getCustomPrompts: vi.fn().mockResolvedValue([]) }, providerSettings, - { isEnabled: () => providerSettings.privacyModeEnabled === true }, + { + isEnabled: () => providerSettings.privacyModeEnabled === true, + setEnabled: async () => undefined + }, vi.fn() as never, {} as never, onRegistryChanged, semanticNotificationsMock, publishDeepchatEventMock, + createPluginToolPolicies(), + { + homeDirectory: '/mock/home', + appVersion: '1.0.0', + toolchains: { + rewriteCommand: (command, args) => ({ command, args }), + resolvedBinDirs: () => [], + resolve: () => { + throw new Error('Toolchain is not configured') + } + }, + getProxyUrl: async () => null + }, + { + store: new McpOAuthCredentialStore({ + filePath: '/tmp/deepchat-mcp-service/credentials.json', + crypto: { + isAvailable: async () => false, + encrypt: async () => { + throw new Error('Unexpected encryption') + }, + decrypt: async () => { + throw new Error('Unexpected decryption') + } + } + }), + openExternal: vi.fn(async () => undefined) + }, cacheImage, undefined, undefined, mcpApps ? ({ registry: mcpApps.registry, + desktop: { + observeOwner: vi.fn(async () => undefined), + openExternal: vi.fn(async () => undefined) + }, permissionBroker: {}, getPermissionMode: vi.fn(), validateSource: vi.fn(), @@ -439,12 +479,28 @@ describe('McpService', () => { it('returns a typed duplicate result without mutating settings', async () => { const providerSettings = createProviderSettings(true, false, { - existing: { type: 'stdio', command: 'node' } + existing: { + type: 'stdio', + command: 'node', + args: [], + env: {}, + descriptions: '', + icons: '', + enabled: false + } }) const presenter = createMcpService(providerSettings) await expect( - presenter.addMcpServer('existing', { type: 'stdio', command: 'node' }) + presenter.addMcpServer('existing', { + type: 'stdio', + command: 'node', + args: [], + env: {}, + descriptions: '', + icons: '', + enabled: false + }) ).resolves.toEqual({ status: 'duplicate' }) expect(providerSettings.addMcpServer).not.toHaveBeenCalled() @@ -454,7 +510,15 @@ describe('McpService', () => { it('persists a new server and returns an added result', async () => { const providerSettings = createProviderSettings(true) const presenter = createMcpService(providerSettings) - const config = { type: 'stdio', command: 'node' } as const + const config: MCPServerConfig = { + type: 'stdio', + command: 'node', + args: [], + env: {}, + descriptions: '', + icons: '', + enabled: false + } await expect(presenter.addMcpServer('new-server', config)).resolves.toEqual({ status: 'added' @@ -471,7 +535,15 @@ describe('McpService', () => { servers[name] = config }) const presenter = createMcpService(providerSettings) - const config = { type: 'stdio', command: 'node' } as const + const config: MCPServerConfig = { + type: 'stdio', + command: 'node', + args: [], + env: {}, + descriptions: '', + icons: '', + enabled: false + } await expect( Promise.all([ diff --git a/test/main/mcp/oauthCredentialStore.test.ts b/test/main/mcp/oauthCredentialStore.test.ts index fcd340f6b9..d07d6a870e 100644 --- a/test/main/mcp/oauthCredentialStore.test.ts +++ b/test/main/mcp/oauthCredentialStore.test.ts @@ -1,204 +1,292 @@ -import * as fs from 'fs' -import { beforeEach, describe, expect, it, vi } from 'vitest' -import { safeStorage } from 'electron' +import * as fs from 'node:fs' +import { tmpdir } from 'node:os' +import { join } from 'node:path' +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' import { McpOAuthCredentialStore } from '@/mcp/oauthCredentialStore' +vi.mock('node:fs', async (importOriginal) => ({ + ...(await importOriginal()) +})) + +const binding = { + serverId: '71e8637a-1889-4749-b04e-f5a79adefb06', + configGeneration: 1, + bindingHash: 'binding', + endpoint: 'https://mcp.example.com/mcp' +} + +const deferred = () => { + let resolve!: (value: T) => void + const promise = new Promise((done) => { + resolve = done + }) + return { promise, resolve } +} + +const unwrap = (wrapped: string) => Buffer.from(wrapped, 'base64').toString('utf8') + describe('McpOAuthCredentialStore', () => { - let savedContent = '' + let directory: string + let filePath: string + let crypto: { + isAvailable: ReturnType Promise>> + encrypt: ReturnType Promise>> + decrypt: ReturnType Promise>> + } + let store: McpOAuthCredentialStore beforeEach(() => { - savedContent = '' - vi.mocked(fs.existsSync).mockImplementation(() => Boolean(savedContent)) - vi.mocked(fs.readFileSync).mockImplementation(() => savedContent) - vi.mocked(fs.statSync).mockImplementation( - () => ({ size: Buffer.byteLength(savedContent, 'utf8') }) as fs.Stats - ) - vi.mocked(fs.writeFileSync).mockImplementation((_, data) => { - savedContent = String(data) - }) - vi.mocked(fs.mkdirSync).mockImplementation(() => undefined as unknown as string) - vi.mocked(safeStorage.isEncryptionAvailable).mockReturnValue(false) - vi.mocked(safeStorage.encryptString).mockImplementation((value) => - Buffer.from(`wrapped:${value.split('').reverse().join('')}`, 'utf8') - ) - vi.mocked(safeStorage.decryptString).mockImplementation((value) => - value - .toString('utf8') - .replace(/^wrapped:/, '') - .split('') - .reverse() - .join('') - ) + directory = fs.mkdtempSync(join(tmpdir(), 'deepchat-oauth-')) + filePath = join(directory, 'credentials.json') + crypto = { + isAvailable: vi.fn(async () => true), + encrypt: vi.fn(async (value: string) => Buffer.from(value).toString('base64')), + decrypt: vi.fn(async (wrapped: string) => unwrap(wrapped)) + } + store = new McpOAuthCredentialStore({ filePath, crypto }) }) - it('removes only the requested credential scope', () => { - const store = new McpOAuthCredentialStore('/tmp/deepchat-mcp-oauth/credentials.json') + afterEach(() => { + store.stop() + vi.restoreAllMocks() + fs.rmSync(directory, { recursive: true, force: true }) + }) - store.saveEntry('linear', { - tokens: { - access_token: 'access-token' - }, - clientInformation: { - client_id: 'client-id' - }, + it('removes only the requested credential scope', async () => { + await store.saveEntry('linear', { + tokens: { access_token: 'access-token', token_type: 'Bearer' }, + clientInformation: { client_id: 'client-id' }, codeVerifier: 'verifier', - discoveryState: { - authorizationServerUrl: 'https://mcp.linear.app' - } + discoveryState: { authorizationServerUrl: 'https://mcp.linear.app' } }) - - store.clearEntryScope('linear', 'tokens') - - const entry = store.load('linear') - expect(entry?.tokens).toBeUndefined() - expect(entry?.clientInformation?.client_id).toBe('client-id') - expect(entry?.codeVerifier).toBe('verifier') - expect(entry?.discoveryState?.authorizationServerUrl).toBe('https://mcp.linear.app') + await store.clearEntryScope('linear', 'tokens') + expect(await store.load('linear')).toMatchObject({ + clientInformation: { client_id: 'client-id' }, + codeVerifier: 'verifier', + discoveryState: { authorizationServerUrl: 'https://mcp.linear.app' } + }) + expect((await store.load('linear'))?.tokens).toBeUndefined() }) - it('keeps credentials memory-only when secure storage is unavailable', () => { - const store = new McpOAuthCredentialStore('/tmp/deepchat-mcp-oauth/credentials.json') - const binding = { - serverId: '71e8637a-1889-4749-b04e-f5a79adefb06', - configGeneration: 1, - bindingHash: 'binding', - endpoint: 'https://mcp.example.com/mcp' - } - - store.saveClientSecret('secret-key', 'not-plaintext-on-disk', binding) - - expect(store.loadClientSecret('secret-key')).toMatchObject({ + it('keeps credentials memory-only when secure storage is unavailable', async () => { + crypto.isAvailable.mockResolvedValue(false) + await store.saveClientSecret('secret-key', 'not-plaintext-on-disk', binding) + expect(await store.loadClientSecret('secret-key')).toMatchObject({ secret: 'not-plaintext-on-disk', binding }) - expect(fs.writeFileSync).not.toHaveBeenCalled() - expect(store.getStorageState()).toBe('memory') + expect(fs.existsSync(filePath)).toBe(false) + expect(await store.getStorageState()).toBe('memory') }) - it('persists only a safeStorage envelope when encryption is available', () => { - vi.mocked(safeStorage.isEncryptionAvailable).mockReturnValue(true) - const store = new McpOAuthCredentialStore('/tmp/deepchat-mcp-oauth/credentials.json') - const binding = { - serverId: '71e8637a-1889-4749-b04e-f5a79adefb06', - configGeneration: 1, - bindingHash: 'binding', - endpoint: 'https://mcp.example.com/mcp' - } - - store.saveClientSecret('secret-key', 'protected-value', binding) - - const envelope = JSON.parse(savedContent) - expect(envelope).toMatchObject({ version: 2, storage: 'safeStorage' }) - expect(envelope).not.toHaveProperty('entries') - expect(savedContent).not.toContain('protected-value') - expect(fs.renameSync).toHaveBeenCalledOnce() + it('persists only a safeStorage envelope and reads v2 without rewriting it', async () => { + await store.saveClientSecret('secret-key', 'protected-value', binding) + const serialized = fs.readFileSync(filePath, 'utf8') + expect(JSON.parse(serialized)).toMatchObject({ version: 2, storage: 'safeStorage' }) + expect(JSON.parse(serialized)).not.toHaveProperty('entries') + expect(serialized).not.toContain('protected-value') + const reloaded = new McpOAuthCredentialStore({ filePath, crypto }) + expect(await reloaded.loadClientSecret('secret-key')).toMatchObject({ + secret: 'protected-value' + }) + expect(fs.readFileSync(filePath, 'utf8')).toBe(serialized) + expect(crypto.encrypt).toHaveBeenCalledOnce() + reloaded.stop() }) - it('removes a stale envelope when secure storage becomes unavailable at runtime', () => { - vi.mocked(safeStorage.isEncryptionAvailable).mockReturnValue(true) - const filePath = '/tmp/deepchat-mcp-oauth/credentials.json' - const store = new McpOAuthCredentialStore(filePath) - const binding = { - serverId: '71e8637a-1889-4749-b04e-f5a79adefb06', - configGeneration: 1, - bindingHash: 'binding', - endpoint: 'https://mcp.example.com/mcp' - } - - store.saveClientSecret('secret-key', 'protected-value', binding) - vi.mocked(safeStorage.isEncryptionAvailable).mockReturnValue(false) - store.clearEntry('secret-key') - - expect(fs.unlinkSync).toHaveBeenCalledWith(filePath) - expect(store.loadClientSecret('secret-key')).toBeNull() + it('removes a stale envelope when secure storage becomes unavailable at runtime', async () => { + await store.saveClientSecret('secret-key', 'protected-value', binding) + crypto.isAvailable.mockResolvedValue(false) + await store.clearEntry('secret-key') + expect(fs.existsSync(filePath)).toBe(false) + expect(await store.loadClientSecret('secret-key')).toBeNull() }) - it('loads a legacy plaintext envelope into memory and removes the file', () => { - savedContent = JSON.stringify({ - version: 1, - storage: 'file', - entries: { - legacy: { - tokens: { access_token: 'legacy-token' }, - updatedAt: 42 - } - }, - updatedAt: 42 - }) - const store = new McpOAuthCredentialStore('/tmp/deepchat-mcp-oauth/credentials.json') - - expect(store.load('legacy')?.tokens?.access_token).toBe('legacy-token') - expect(fs.unlinkSync).toHaveBeenCalledWith('/tmp/deepchat-mcp-oauth/credentials.json') - expect(fs.writeFileSync).not.toHaveBeenCalled() + it.each([false, true])('loads a legacy envelope with secure storage=%s', async (secure) => { + crypto.isAvailable.mockResolvedValue(secure) + const entries = { legacy: { tokens: { access_token: 'legacy-token' }, updatedAt: 42 } } + fs.writeFileSync( + filePath, + JSON.stringify( + secure + ? { + version: 1, + storage: 'safeStorage', + wrapped: await crypto.encrypt(JSON.stringify(entries)), + updatedAt: 42 + } + : { version: 1, storage: 'file', entries, updatedAt: 42 } + ) + ) + expect((await store.load('legacy'))?.tokens?.access_token).toBe('legacy-token') + if (secure) expect(JSON.parse(fs.readFileSync(filePath, 'utf8')).version).toBe(2) + else expect(fs.existsSync(filePath)).toBe(false) }) - it('preserves an unreadable envelope and refuses to overwrite stored credentials', () => { - vi.mocked(safeStorage.isEncryptionAvailable).mockReturnValue(true) - vi.mocked(safeStorage.decryptString).mockImplementationOnce(() => { - throw new Error('cannot decrypt') - }) - savedContent = JSON.stringify({ + it('preserves an unreadable envelope and refuses to overwrite stored credentials', async () => { + crypto.decrypt.mockRejectedValueOnce(new Error('cannot decrypt')) + const serialized = JSON.stringify({ version: 2, storage: 'safeStorage', wrapped: 'encrypted', updatedAt: 42 }) - const store = new McpOAuthCredentialStore('/tmp/deepchat-mcp-oauth/credentials.json') - - expect(store.load('stale')).toBeNull() - expect(safeStorage.decryptString).toHaveBeenCalledOnce() - expect(fs.unlinkSync).not.toHaveBeenCalled() - expect(() => - store.saveClientSecret('replacement', 'new-secret', { - serverId: '71e8637a-1889-4749-b04e-f5a79adefb06', - configGeneration: 1, - bindingHash: 'binding', - endpoint: 'https://mcp.example.com/mcp' - }) - ).toThrow('MCP credential store is unavailable') - expect(fs.writeFileSync).not.toHaveBeenCalled() + fs.writeFileSync(filePath, serialized) + expect(await store.load('stale')).toBeNull() + await expect(store.saveClientSecret('replacement', 'new-secret', binding)).rejects.toThrow( + 'unavailable' + ) + expect(crypto.decrypt).toHaveBeenCalledOnce() + expect(fs.readFileSync(filePath, 'utf8')).toBe(serialized) }) - it('matches interactive credentials by every finalized binding field', () => { - const store = new McpOAuthCredentialStore('/tmp/deepchat-mcp-oauth/credentials.json') - const baseBinding = { - serverId: '71e8637a-1889-4749-b04e-f5a79adefb06', - configGeneration: 1, - bindingHash: 'binding', - endpoint: 'https://mcp.example.com/mcp', - protectedResourceUrl: 'https://mcp.example.com/mcp' - } - store.saveEntry('issuer-a', { - tokens: { access_token: 'token-a' }, - binding: { - ...baseBinding, - authorizationServerIssuer: 'https://auth-a.example.com/', - clientId: 'client-a' - } - }) - store.saveEntry('issuer-b', { - tokens: { access_token: 'token-b' }, - binding: { - ...baseBinding, - authorizationServerIssuer: 'https://auth-b.example.com/', - clientId: 'client-b' - } - }) - + it('matches interactive credentials by every finalized binding field', async () => { + const base = { ...binding, protectedResourceUrl: binding.endpoint } + for (const id of ['a', 'b']) + await store.saveEntry(`issuer-${id}`, { + tokens: { access_token: `token-${id}`, token_type: 'Bearer' }, + binding: { + ...base, + authorizationServerIssuer: `https://auth-${id}.example/`, + clientId: `client-${id}` + } + }) expect( - store.findInteractiveCredential({ - ...baseBinding, - authorizationServerIssuer: 'https://auth-a.example.com/', - clientId: 'client-a' - })?.key + ( + await store.findInteractiveCredential({ + ...base, + authorizationServerIssuer: 'https://auth-a.example/', + clientId: 'client-a' + }) + )?.key ).toBe('issuer-a') expect( - store.findInteractiveCredential({ - ...baseBinding, - authorizationServerIssuer: 'https://auth-a.example.com/', + await store.findInteractiveCredential({ + ...base, + authorizationServerIssuer: 'https://auth-a.example/', clientId: 'client-b' }) ).toBeNull() - expect(store.findInteractiveCredential(baseBinding)).toBeNull() + expect(await store.findInteractiveCredential(base)).toBeNull() + }) + + it('serializes partial updates and shares a pending initial decrypt', async () => { + await store.saveEntry('entry', { codeVerifier: 'initial' }) + const raw = unwrap(JSON.parse(fs.readFileSync(filePath, 'utf8')).wrapped) + const gate = deferred() + const entered = deferred() + crypto.decrypt.mockImplementationOnce(() => { + entered.resolve() + return gate.promise + }) + const reloaded = new McpOAuthCredentialStore({ filePath, crypto }) + const reads = [reloaded.load('entry'), reloaded.load('entry')] + await entered.promise + expect(crypto.decrypt).toHaveBeenCalledOnce() + gate.resolve(raw) + expect(await Promise.all(reads)).toEqual([ + expect.objectContaining({ codeVerifier: 'initial' }), + expect.objectContaining({ codeVerifier: 'initial' }) + ]) + await Promise.all([ + reloaded.saveEntry('entry', { tokens: { access_token: 'new', token_type: 'Bearer' } }), + reloaded.saveEntry('entry', { clientInformation: { client_id: 'client' } }) + ]) + expect(await reloaded.load('entry')).toMatchObject({ + codeVerifier: 'initial', + tokens: { access_token: 'new' }, + clientInformation: { client_id: 'client' } + }) + reloaded.stop() + }) + + it.each(['encrypt', 'rename'] as const)( + 'preserves RAM and disk after %s failure and recovers', + async (failure) => { + await store.saveClientSecret('key', 'original', binding) + const serialized = fs.readFileSync(filePath, 'utf8') + if (failure === 'encrypt') crypto.encrypt.mockRejectedValueOnce(new Error('native failure')) + else + vi.spyOn(fs, 'renameSync').mockImplementationOnce(() => { + throw new Error('rename failure') + }) + await expect(store.saveClientSecret('key', 'replacement', binding)).rejects.toThrow('failure') + expect((await store.loadClientSecret('key'))?.secret).toBe('original') + expect(fs.readFileSync(filePath, 'utf8')).toBe(serialized) + expect(fs.readdirSync(directory)).toEqual(['credentials.json']) + await store.saveClientSecret('key', 'recovered', binding) + expect((await store.loadClientSecret('key'))?.secret).toBe('recovered') + } + ) + + it('moves an interactive binding atomically without losing either entry on failure', async () => { + await store.saveEntry('from', { codeVerifier: 'source' }) + await store.saveEntry('to', { codeVerifier: 'target' }) + const serialized = fs.readFileSync(filePath, 'utf8') + crypto.encrypt.mockRejectedValueOnce(new Error('native failure')) + await expect(store.moveInteractiveEntry('from', 'to', binding)).rejects.toThrow( + 'native failure' + ) + expect(fs.readFileSync(filePath, 'utf8')).toBe(serialized) + expect((await store.load('from'))?.codeVerifier).toBe('source') + await store.moveInteractiveEntry('from', 'to', binding) + expect(await store.load('from')).toBeNull() + expect(await store.load('to')).toMatchObject({ + codeVerifier: 'source', + binding + }) + }) + + it.each(['encrypt', 'decrypt'] as const)( + 'rejects a delayed %s result after stop', + async (operation) => { + await store.saveEntry('entry', { codeVerifier: 'original' }) + const serialized = fs.readFileSync(filePath, 'utf8') + const gate = deferred() + const entered = deferred() + crypto[operation].mockImplementationOnce(() => { + entered.resolve() + return gate.promise + }) + const owner = + operation === 'decrypt' ? new McpOAuthCredentialStore({ filePath, crypto }) : store + const pending = + operation === 'decrypt' + ? owner.load('entry') + : owner.saveEntry('entry', { codeVerifier: 'late' }) + const result = expect(pending).rejects.toThrow('interrupted') + await entered.promise + owner.stop() + gate.resolve( + operation === 'decrypt' ? unwrap(JSON.parse(serialized).wrapped) : 'late-wrapped' + ) + await result + await expect(owner.load('entry')).rejects.toThrow('interrupted') + expect(fs.readFileSync(filePath, 'utf8')).toBe(serialized) + } + ) + + it('bounds pending writes while reserving control capacity and stops the entire queue', async () => { + const gate = deferred() + const entered = deferred() + crypto.encrypt.mockImplementationOnce(() => { + entered.resolve() + return gate.promise + }) + const normal = Array.from({ length: 24 }, (_, i) => + store.saveEntry(`key-${i}`, { codeVerifier: 'pending' }) + ) + await entered.promise + await expect(store.saveEntry('overflow', { codeVerifier: 'rejected' })).rejects.toThrow( + 'queue is full' + ) + const controls = Array.from({ length: 8 }, () => store.clearEntry('key-0')) + const result = Promise.allSettled([...normal, ...controls]) + await expect(store.clearEntry('overflow')).rejects.toThrow('queue is full') + store.stop() + gate.resolve('late') + expect((await result).every((item) => item.status === 'rejected')).toBe(true) + expect(fs.existsSync(filePath)).toBe(false) + expect(crypto.encrypt).toHaveBeenCalledOnce() }) }) diff --git a/test/main/mcp/serverManager.test.ts b/test/main/mcp/serverManager.test.ts index 5e5fd819aa..f44c21d0b7 100644 --- a/test/main/mcp/serverManager.test.ts +++ b/test/main/mcp/serverManager.test.ts @@ -1,4 +1,5 @@ import { beforeEach, describe, expect, it, vi } from 'vitest' +import axios from 'axios' const publishDeepchatEventMock = vi.hoisted(() => vi.fn()) const semanticNotificationsMock = vi.hoisted(() => ({ @@ -21,12 +22,6 @@ const clientMocks = vi.hoisted(() => ({ } })) -vi.mock('@/platform/proxy', () => ({ - proxyConfig: { - getProxyUrl: vi.fn(() => '') - } -})) - vi.mock('@/mcp/mcpClient', () => ({ McpClient: vi.fn().mockImplementation(function McpClient(_name, serverConfig) { return { @@ -42,6 +37,7 @@ vi.mock('@/mcp/mcpClient', () => ({ McpConnectionCancelledError: clientMocks.McpConnectionCancelledError })) +import type { McpOAuthManager } from '@/mcp/mcpOAuthManager' import { ServerManager } from '@/mcp/serverManager' import { McpClient, McpConnectionCancelledError } from '@/mcp/mcpClient' @@ -74,18 +70,63 @@ describe('ServerManager notifications and plugin isolation', () => { } } - function createManager(providerSettings: ReturnType) { + function createManager( + providerSettings: ReturnType, + oauth?: McpOAuthManager, + getProxyUrl: () => Promise = async () => null + ) { return new ServerManager( providerSettings as never, - { isEnabled: () => false }, + { isEnabled: () => false, setEnabled: async () => undefined }, vi.fn() as never, {} as never, vi.fn(), semanticNotificationsMock, - publishDeepchatEventMock + publishDeepchatEventMock, + getProxyUrl, + oauth ) } + it('awaits the current native proxy before each registry batch', async () => { + const settings = { + ...createProviderSettings({}), + getCustomNpmRegistry: () => null, + setNpmRegistryCache: vi.fn() + } + const proxy = Promise.withResolvers() + const getProxyUrl = vi.fn<() => Promise>() + getProxyUrl.mockReturnValueOnce(proxy.promise).mockResolvedValue(null) + const manager = createManager(settings, undefined, getProxyUrl) + const get = vi.spyOn(axios, 'get').mockResolvedValue({ status: 200 }) + try { + const pending = manager.testNpmRegistrySpeed(false) + expect(get).not.toHaveBeenCalled() + proxy.resolve('http://fixture:credential@127.0.0.1:4567') + await pending + expect(get).toHaveBeenCalledTimes(3) + for (const [, options] of get.mock.calls) { + expect(options?.proxy).toEqual({ + host: '127.0.0.1', + port: 4567, + auth: { username: 'fixture', password: 'credential' } + }) + } + get.mockClear() + await manager.testNpmRegistrySpeed(false) + expect(get).toHaveBeenCalledTimes(3) + for (const [, options] of get.mock.calls) expect(options?.proxy).toBeUndefined() + get.mockClear() + settings.setNpmRegistryCache.mockClear() + getProxyUrl.mockRejectedValueOnce(new Error('Native proxy unavailable')) + await expect(manager.testNpmRegistrySpeed(false)).rejects.toThrow('Native proxy unavailable') + expect(get).not.toHaveBeenCalled() + expect(settings.setNpmRegistryCache).not.toHaveBeenCalled() + } finally { + get.mockRestore() + } + }) + it('suppresses semantic connection occurrences for plugin-owned MCP servers', async () => { const providerSettings = createProviderSettings({ plugin: { @@ -519,4 +560,62 @@ describe('ServerManager notifications and plugin isolation', () => { expect(vi.mocked(McpClient).mock.calls[0][1]).toMatchObject({ command: 'plugin-command' }) expect(vi.mocked(McpClient).mock.calls[1][1]).toMatchObject({ command: 'regular-command' }) }) + + it.each(['startup', 'background'] as const)( + 'awaits OAuth classification for %s connection failures', + async (phase) => { + const providerSettings = createProviderSettings({ + regular: { + type: 'http', + baseUrl: 'https://mcp.example/mcp', + command: '', + args: [], + env: {} + } + }) + let classify!: (handled: boolean) => void + let entered!: () => void + const classifying = new Promise((resolve) => { + entered = resolve + }) + const handleConnectionError = vi.fn(() => { + entered() + return new Promise((resolve) => { + classify = resolve + }) + }) + const manager = createManager(providerSettings, { + handleConnectionError + } as unknown as McpOAuthManager) + const error = new Error('connect failed') + let rejectBackground!: (error: Error) => void + if (phase === 'background') { + clientMocks.getConnectionCompletion.mockReturnValue( + new Promise((_resolve, reject) => { + rejectBackground = reject + }) + ) + clientMocks.connect.mockResolvedValueOnce('soft-timeout-released') + } else clientMocks.connect.mockRejectedValueOnce(error) + const started = manager.startServer('regular') + const result = + phase === 'startup' + ? expect(started).rejects.toBe(error) + : expect(started).resolves.toBe('soft-timeout-released') + if (phase === 'background') { + await result + rejectBackground(error) + } + await classifying + expect(semanticNotificationsMock.occur).not.toHaveBeenCalled() + classify(false) + await result + await vi.waitFor(() => + expect(semanticNotificationsMock.occur).toHaveBeenCalledWith({ + code: 'mcp.connectionFailed', + serverName: 'regular' + }) + ) + } + ) }) diff --git a/test/main/mcp/settings.test.ts b/test/main/mcp/settings.test.ts index 5736425cce..1f1e19a0e4 100644 --- a/test/main/mcp/settings.test.ts +++ b/test/main/mcp/settings.test.ts @@ -1,6 +1,6 @@ -import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' +import { afterEach, describe, expect, it, vi } from 'vitest' -const mockStores = vi.hoisted(() => new Map>()) +import { createMemoryStore } from '../../helpers/memoryStore' const clone = (value: T): T => { const cloneFn = (globalThis as typeof globalThis & { structuredClone?: (value: T) => T }) @@ -13,39 +13,6 @@ const clone = (value: T): T => { return JSON.parse(JSON.stringify(value)) as T } -vi.mock('electron-store', () => ({ - default: class MockElectronStore { - private readonly data: Record - - constructor(options: { name: string; defaults?: Record }) { - if (!mockStores.has(options.name)) { - mockStores.set(options.name, clone(options.defaults ?? {})) - } - this.data = mockStores.get(options.name)! - } - - get(key: string) { - return this.data[key] - } - - set(key: string | Record, value?: any) { - if (typeof key === 'string') { - this.data[key] = value - } else { - Object.assign(this.data, key) - } - } - - delete(key: string) { - delete this.data[key] - } - - has(key: string) { - return key in this.data - } - } -})) - const originalPlatform = Object.getOwnPropertyDescriptor(process, 'platform') const setPlatform = (platform: string) => { @@ -75,10 +42,6 @@ const createKnowledgeConfig = (id: string, description = id) => ({ }) describe('McpSettings', () => { - beforeEach(() => { - mockStores.clear() - }) - afterEach(() => { vi.clearAllMocks() if (originalPlatform) { @@ -87,8 +50,8 @@ describe('McpSettings', () => { }) it('honors an empty legacy enabled set when legacy keys are present', async () => { - const { McpSettings } = await loadHelper('darwin') - const helper = new McpSettings() + const { McpSettings, createMcpSettingsDefaults } = await loadHelper('darwin') + const helper = new McpSettings(createMemoryStore(createMcpSettingsDefaults())) const mcpStore = (helper as any).mcpStore const searchConfig = { ...mcpStore.get('mcpServers').bochaSearch } @@ -105,8 +68,8 @@ describe('McpSettings', () => { }) it('retires persisted in-memory artifacts without removing external servers', async () => { - const { McpSettings } = await loadHelper('darwin') - const helper = new McpSettings() + const { McpSettings, createMcpSettingsDefaults } = await loadHelper('darwin') + const helper = new McpSettings(createMemoryStore(createMcpSettingsDefaults())) const store = (helper as any).mcpStore expect(store.get('mcpServers').Artifacts).toBeUndefined() store.set('mcpServers', { @@ -124,14 +87,16 @@ describe('McpSettings', () => { }) it('updates Router credentials through one fallback store write', async () => { - const { McpSettings } = await loadHelper('darwin') - const helper = new McpSettings() + const { McpSettings, createMcpSettingsDefaults } = await loadHelper('darwin') + const helper = new McpSettings(createMemoryStore(createMcpSettingsDefaults())) const servers = { router: { command: '', args: [], env: {}, type: 'http' as const, + descriptions: '', + icons: '', enabled: true, customHeaders: { Authorization: 'Bearer router-key' @@ -154,8 +119,8 @@ describe('McpSettings', () => { }) it("adds the disabled McDonald's MCP server with a token placeholder for existing users", async () => { - const { McpSettings } = await loadHelper('darwin') - const helper = new McpSettings() + const { McpSettings, createMcpSettingsDefaults } = await loadHelper('darwin') + const helper = new McpSettings(createMemoryStore(createMcpSettingsDefaults())) const mcpStore = (helper as any).mcpStore mcpStore.set('mcpServers', {}) @@ -173,8 +138,8 @@ describe('McpSettings', () => { }) it('adds the disabled You.com search MCP server (keyless free profile) for existing users', async () => { - const { McpSettings } = await loadHelper('darwin') - const helper = new McpSettings() + const { McpSettings, createMcpSettingsDefaults } = await loadHelper('darwin') + const helper = new McpSettings(createMemoryStore(createMcpSettingsDefaults())) const mcpStore = (helper as any).mcpStore mcpStore.set('mcpServers', {}) @@ -189,8 +154,8 @@ describe('McpSettings', () => { }) it('adds the disabled Serply search MCP server with a key placeholder for existing users', async () => { - const { McpSettings } = await loadHelper('darwin') - const helper = new McpSettings() + const { McpSettings, createMcpSettingsDefaults } = await loadHelper('darwin') + const helper = new McpSettings(createMemoryStore(createMcpSettingsDefaults())) const mcpStore = (helper as any).mcpStore mcpStore.set('mcpServers', {}) @@ -208,8 +173,8 @@ describe('McpSettings', () => { }) it('adds the disabled Webz.io news search MCP server with a token placeholder for existing users', async () => { - const { McpSettings } = await loadHelper('darwin') - const helper = new McpSettings() + const { McpSettings, createMcpSettingsDefaults } = await loadHelper('darwin') + const helper = new McpSettings(createMemoryStore(createMcpSettingsDefaults())) const mcpStore = (helper as any).mcpStore mcpStore.set('mcpServers', {}) @@ -227,8 +192,8 @@ describe('McpSettings', () => { }) it('adds the disabled SkyAccess empty leg MCP server (keyless) for existing users', async () => { - const { McpSettings } = await loadHelper('darwin') - const helper = new McpSettings() + const { McpSettings, createMcpSettingsDefaults } = await loadHelper('darwin') + const helper = new McpSettings(createMemoryStore(createMcpSettingsDefaults())) const mcpStore = (helper as any).mcpStore mcpStore.set('mcpServers', {}) @@ -243,8 +208,8 @@ describe('McpSettings', () => { }) it('adds the disabled Cohesivity backend infrastructure MCP server (keyless) for existing users', async () => { - const { McpSettings } = await loadHelper('darwin') - const helper = new McpSettings() + const { McpSettings, createMcpSettingsDefaults } = await loadHelper('darwin') + const helper = new McpSettings(createMemoryStore(createMcpSettingsDefaults())) const mcpStore = (helper as any).mcpStore mcpStore.set('mcpServers', {}) @@ -259,8 +224,8 @@ describe('McpSettings', () => { }) it('adds the disabled Keenable search MCP server (keyless) for existing users', async () => { - const { McpSettings } = await loadHelper('darwin') - const helper = new McpSettings() + const { McpSettings, createMcpSettingsDefaults } = await loadHelper('darwin') + const helper = new McpSettings(createMemoryStore(createMcpSettingsDefaults())) const mcpStore = (helper as any).mcpStore mcpStore.set('mcpServers', {}) @@ -278,8 +243,8 @@ describe('McpSettings', () => { }) it('adds the disabled EvoLink MCP server (OAuth sign-in) for existing users', async () => { - const { McpSettings } = await loadHelper('darwin') - const helper = new McpSettings() + const { McpSettings, createMcpSettingsDefaults } = await loadHelper('darwin') + const helper = new McpSettings(createMemoryStore(createMcpSettingsDefaults())) const mcpStore = (helper as any).mcpStore mcpStore.set('mcpServers', {}) @@ -295,8 +260,8 @@ describe('McpSettings', () => { }) it('adds the disabled deed.page static hosting MCP server (keyless) for existing users', async () => { - const { McpSettings } = await loadHelper('darwin') - const helper = new McpSettings() + const { McpSettings, createMcpSettingsDefaults } = await loadHelper('darwin') + const helper = new McpSettings(createMemoryStore(createMcpSettingsDefaults())) const mcpStore = (helper as any).mcpStore mcpStore.set('mcpServers', {}) @@ -312,8 +277,8 @@ describe('McpSettings', () => { }) it('does not recreate the Apple built-in server after the user removed it', async () => { - const { McpSettings } = await loadHelper('darwin') - const helper = new McpSettings() + const { McpSettings, createMcpSettingsDefaults } = await loadHelper('darwin') + const helper = new McpSettings(createMemoryStore(createMcpSettingsDefaults())) const mcpStore = (helper as any).mcpStore mcpStore.set('mcpServers', {}) @@ -325,8 +290,8 @@ describe('McpSettings', () => { }) it('removes the unpublished Computer Use demo MCP server config', async () => { - const { McpSettings } = await loadHelper('darwin') - const helper = new McpSettings() + const { McpSettings, createMcpSettingsDefaults } = await loadHelper('darwin') + const helper = new McpSettings(createMemoryStore(createMcpSettingsDefaults())) const mcpStore = (helper as any).mcpStore const legacyServer = { command: '/Applications/DeepChat Computer Use.app/Contents/MacOS/cua-driver', @@ -365,8 +330,8 @@ describe('McpSettings', () => { }) it('migrates legacy builtin knowledge configs out of MCP env', async () => { - const { McpSettings } = await loadHelper('win32') - const helper = new McpSettings() + const { McpSettings, createMcpSettingsDefaults } = await loadHelper('win32') + const helper = new McpSettings(createMemoryStore(createMcpSettingsDefaults())) const mcpStore = (helper as any).mcpStore const legacyConfig = createKnowledgeConfig('legacy-knowledge', 'Legacy config') const realConfig = createKnowledgeConfig('real-knowledge', 'Real config') @@ -387,8 +352,8 @@ describe('McpSettings', () => { }) it('keeps existing knowledge configs when legacy env has the same id', async () => { - const { McpSettings } = await loadHelper('win32') - const helper = new McpSettings() + const { McpSettings, createMcpSettingsDefaults } = await loadHelper('win32') + const helper = new McpSettings(createMemoryStore(createMcpSettingsDefaults())) const mcpStore = (helper as any).mcpStore const realConfig = createKnowledgeConfig('same-id', 'Real config') const legacyConfig = createKnowledgeConfig('same-id', 'Legacy config') @@ -409,8 +374,8 @@ describe('McpSettings', () => { }) it('persists batch imported MCP servers', async () => { - const { McpSettings } = await loadHelper('darwin') - const helper = new McpSettings() + const { McpSettings, createMcpSettingsDefaults } = await loadHelper('darwin') + const helper = new McpSettings(createMemoryStore(createMcpSettingsDefaults())) const result = await helper.batchImportMcpServers([ { @@ -435,4 +400,92 @@ describe('McpSettings', () => { }) ) }) + + it('finalizes OAuth against the current binding while retaining unrelated settings', async () => { + const { McpSettings, createMcpSettingsDefaults } = await loadHelper('darwin') + const helper = new McpSettings(createMemoryStore(createMcpSettingsDefaults())) + await helper.addMcpServer('oauth', { + type: 'http', + baseUrl: 'https://mcp.example/mcp', + command: '', + args: [], + env: {}, + descriptions: '', + icons: '', + enabled: false + }) + const initial = (await helper.getMcpServers()).oauth + const expected = { + serverId: initial.serverId!, + configGeneration: initial.configGeneration!, + bindingHash: initial.bindingHash!, + endpoint: initial.baseUrl! + } + await helper.updateMcpServer('oauth', { descriptions: 'Current description' }) + const authorization = { + mode: 'interactive' as const, + authorizationServerIssuer: 'https://auth.example/', + protectedResourceUrl: expected.endpoint, + clientId: 'client' + } + const finalized = helper.finalizeOAuthBinding(expected, authorization) + expect(finalized).toMatchObject({ + descriptions: 'Current description', + authorization, + configGeneration: expected.configGeneration + 1 + }) + expect((await helper.getMcpServers()).oauth).toEqual(finalized) + const set = vi.spyOn((helper as any).mcpStore, 'set') + expect( + helper.finalizeOAuthBinding( + { + ...expected, + configGeneration: finalized.configGeneration!, + bindingHash: finalized.bindingHash! + }, + authorization + ) + ).toEqual(finalized) + expect(set).not.toHaveBeenCalled() + }) + + it.each(['replace', 'remove', 'write failure'] as const)( + 'preserves owner state when OAuth finalization encounters %s', + async (change) => { + const { McpSettings, createMcpSettingsDefaults } = await loadHelper('darwin') + const helper = new McpSettings(createMemoryStore(createMcpSettingsDefaults())) + await helper.addMcpServer('oauth', { + type: 'http', + baseUrl: 'https://mcp.example/mcp', + command: '', + args: [], + env: {}, + descriptions: '', + icons: '', + enabled: false + }) + const initial = (await helper.getMcpServers()).oauth + const expected = { + serverId: initial.serverId!, + configGeneration: initial.configGeneration!, + bindingHash: initial.bindingHash!, + endpoint: initial.baseUrl! + } + if (change === 'replace') + await helper.updateMcpServer('oauth', { baseUrl: 'https://replacement.example/mcp' }) + if (change === 'remove') await helper.removeMcpServer('oauth') + const store = (helper as any).mcpStore + const before = clone(store.get('mcpServers')) + if (change === 'write failure') + vi.spyOn(store, 'set').mockImplementationOnce(() => { + throw new Error('write failure') + }) + expect(() => + helper.finalizeOAuthBinding(expected, { mode: 'interactive', clientId: 'discovered' }) + ).toThrow( + change === 'replace' ? 'binding changed' : change === 'remove' ? 'removed' : 'write failure' + ) + expect(store.get('mcpServers')).toEqual(before) + } + ) }) diff --git a/test/main/mcp/toolManager.test.ts b/test/main/mcp/toolManager.test.ts index 43603ad144..1a7cf5d82c 100644 --- a/test/main/mcp/toolManager.test.ts +++ b/test/main/mcp/toolManager.test.ts @@ -1,3 +1,4 @@ +import { createPluginToolPolicies } from '../../helpers/pluginToolPolicies' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' import { CUA_PLUGIN_ID } from '@shared/types/plugin' @@ -5,10 +6,9 @@ import { ToolManager, type ComputerUsePreviewObserver } from '@/mcp/toolManager' import { McpPreDispatchError } from '@/mcp/errors' import { validateAndCloneMcpTool } from '@/mcp/schemaValidation' import type { PluginRuntimeStartReason } from '@/plugin/runtimeSupervisor' -import * as toolPolicyStore from '@/plugin/toolPolicyStore' +const toolPolicies = createPluginToolPolicies() const TOOL_POLICY_PLUGIN_ID = 'com.deepchat.plugins.permission-test' -const { registerPluginToolPolicy, unregisterPluginToolPolicies } = toolPolicyStore const semanticNotifications = { occur: vi.fn(), recover: vi.fn() @@ -39,7 +39,7 @@ describe('ToolManager', () => { }) afterEach(() => { - unregisterPluginToolPolicies(TOOL_POLICY_PLUGIN_ID) + toolPolicies.unregister(TOOL_POLICY_PLUGIN_ID) warnSpy.mockRestore() }) @@ -129,6 +129,7 @@ describe('ToolManager', () => { providerSettings as never, providerSettings as never, serverManager as never, + toolPolicies, semanticNotifications, runtime.publishEvent ?? vi.fn(), { @@ -523,7 +524,7 @@ describe('ToolManager', () => { inputSchema: { type: 'object', properties: {}, required: [] } } ]) - registerPluginToolPolicy({ + toolPolicies.register({ pluginId: TOOL_POLICY_PLUGIN_ID, serverId: serverName, tools: { known_tool: 'allow' }, @@ -551,7 +552,7 @@ describe('ToolManager', () => { it('does not advertise explicitly denied plugin catalog tools', async () => { const serverName = 'closed-policy-server' - registerPluginToolPolicy({ + toolPolicies.register({ pluginId: TOOL_POLICY_PLUGIN_ID, serverId: serverName, tools: { @@ -2403,12 +2404,10 @@ describe('ToolManager', () => { it('refreshes PiP after a trusted click without exposing or awaiting the private snapshot', async () => { let snapshotPolicy: 'allow' | 'ask' = 'allow' - vi.spyOn(toolPolicyStore, 'resolvePluginToolPolicy').mockImplementation( - (_serverId, toolName) => ({ - managed: toolName === 'get_window_state', - decision: toolName === 'get_window_state' ? snapshotPolicy : null - }) - ) + vi.spyOn(toolPolicies, 'resolve').mockImplementation((_serverId, toolName) => ({ + managed: toolName === 'get_window_state', + decision: toolName === 'get_window_state' ? snapshotPolicy : null + })) const tools = [ { name: 'click', @@ -2464,6 +2463,7 @@ describe('ToolManager', () => { providerSettings as never, providerSettings as never, createServerManager([client]) as never, + toolPolicies, semanticNotifications, publishEvent, { @@ -2627,12 +2627,10 @@ describe('ToolManager', () => { }) it('blocks a private PiP snapshot when the live schema differs from the catalog', async () => { - vi.spyOn(toolPolicyStore, 'resolvePluginToolPolicy').mockImplementation( - (_serverId, toolName) => ({ - managed: toolName === 'get_window_state', - decision: toolName === 'get_window_state' ? 'allow' : null - }) - ) + vi.spyOn(toolPolicies, 'resolve').mockImplementation((_serverId, toolName) => ({ + managed: toolName === 'get_window_state', + decision: toolName === 'get_window_state' ? 'allow' : null + })) const liveTools = [ { name: 'click', diff --git a/test/main/memory/legacyV1Reader.test.ts b/test/main/memory/legacyV1Reader.test.ts index ec305ffe85..4735f4e5be 100644 --- a/test/main/memory/legacyV1Reader.test.ts +++ b/test/main/memory/legacyV1Reader.test.ts @@ -1,3 +1,4 @@ +import { nativeVectorHost } from './nativeVectorHost' import { afterEach, describe, expect, it, vi } from 'vitest' const duckDbMocks = vi.hoisted(() => ({ create: vi.fn() })) @@ -49,7 +50,7 @@ describe('LegacyV1Reader', () => { [{ provider: 'provider-a', model: 'model-a', dim: 2 }] ]) const fence = new MigrationAbandonFence() - const reader = await LegacyV1Reader.open('/tmp/legacy.duckdb', 2, fence) + const reader = await LegacyV1Reader.open('/tmp/legacy.duckdb', 2, fence, nativeVectorHost) await expect(reader.readEmbeddingIdentity(fence)).resolves.toEqual({ providerId: 'provider-a', @@ -86,7 +87,7 @@ describe('LegacyV1Reader', () => { ])('returns null for $name', async ({ responses }) => { setupReader(responses) const fence = new MigrationAbandonFence() - const reader = await LegacyV1Reader.open('/tmp/legacy.duckdb', 2, fence) + const reader = await LegacyV1Reader.open('/tmp/legacy.duckdb', 2, fence, nativeVectorHost) await expect(reader.readEmbeddingIdentity(fence)).resolves.toBeNull() }) @@ -95,7 +96,7 @@ describe('LegacyV1Reader', () => { const { connection } = setupReader([]) connection.runAndReadAll.mockRejectedValueOnce(new Error('INTERNAL metadata failure')) const fence = new MigrationAbandonFence() - const reader = await LegacyV1Reader.open('/tmp/legacy.duckdb', 2, fence) + const reader = await LegacyV1Reader.open('/tmp/legacy.duckdb', 2, fence, nativeVectorHost) await expect(reader.readEmbeddingIdentity(fence)).rejects.toThrow('INTERNAL metadata failure') expect(connection.closeSync).not.toHaveBeenCalled() @@ -113,7 +114,7 @@ describe('LegacyV1Reader', () => { const fence = new MigrationAbandonFence() const legacyPath = "C:\\AgentMemory\\O'Brien.duckdb" - const reader = await LegacyV1Reader.open(legacyPath, 2, fence) + const reader = await LegacyV1Reader.open(legacyPath, 2, fence, nativeVectorHost) await expect(reader.countRows(fence)).resolves.toBe(3) await expect(reader.readPage(null, fence)).resolves.toEqual([ { memoryId: 'm1', embedding: [0.1, 0.2] }, @@ -125,7 +126,7 @@ describe('LegacyV1Reader', () => { reader.closeBeforeFileMutation(fence) expect(duckDbMocks.create).toHaveBeenCalledWith(':memory:') - expect(vssMocks.load).toHaveBeenCalledWith(connection, legacyPath, fence) + expect(vssMocks.load).toHaveBeenCalledWith(connection, legacyPath, nativeVectorHost, fence) expect(connection.run).toHaveBeenCalledWith( "ATTACH 'C:\\\\AgentMemory\\\\O''Brien.duckdb' AS legacy (READ_ONLY);" ) @@ -143,7 +144,7 @@ describe('LegacyV1Reader', () => { [{ memory_id: 'm1', embedding: [0.1, 0.2] }] ]) const fence = new MigrationAbandonFence() - const reader = await LegacyV1Reader.open('/tmp/legacy.duckdb', 2, fence) + const reader = await LegacyV1Reader.open('/tmp/legacy.duckdb', 2, fence, nativeVectorHost) await expect(reader.readPage(null, fence)).rejects.toThrow('invalid legacy v1 embedding') await expect(reader.readPage('m1', fence)).rejects.toThrow('not strictly keyset ordered') @@ -168,7 +169,7 @@ describe('LegacyV1Reader', () => { } duckDbMocks.create.mockResolvedValue(instance) const fence = new MigrationAbandonFence() - const reader = await LegacyV1Reader.open('/tmp/legacy.duckdb', 2, fence) + const reader = await LegacyV1Reader.open('/tmp/legacy.duckdb', 2, fence, nativeVectorHost) const pending = reader.readPage(null, fence) fence.abandon() @@ -187,7 +188,7 @@ describe('LegacyV1Reader', () => { throw new Error('close failed') }) const fence = new MigrationAbandonFence() - const reader = await LegacyV1Reader.open('/tmp/legacy.duckdb', 2, fence) + const reader = await LegacyV1Reader.open('/tmp/legacy.duckdb', 2, fence, nativeVectorHost) expect(() => reader.closeBeforeFileMutation(fence)).toThrow('close failed') expect(instance.closeSync).not.toHaveBeenCalled() diff --git a/test/main/memory/memoryVectorStore.test.ts b/test/main/memory/memoryVectorStore.test.ts index 15abb11f36..c8c7d3902a 100644 --- a/test/main/memory/memoryVectorStore.test.ts +++ b/test/main/memory/memoryVectorStore.test.ts @@ -1,3 +1,4 @@ +import { nativeVectorHost } from './nativeVectorHost' import { afterEach, describe, expect, it, vi } from 'vitest' const duckDbMocks = vi.hoisted(() => ({ @@ -5,12 +6,19 @@ const duckDbMocks = vi.hoisted(() => ({ })) vi.mock('@duckdb/node-api', () => ({ + ARRAY: (type: string, size: number) => ({ type, size }), + FLOAT: 'FLOAT', + INTEGER: 'INTEGER', + VARCHAR: 'VARCHAR', DuckDBInstance: { create: duckDbMocks.create }, DuckDBConnection: class {}, + DuckDBDataChunk: { + create: () => ({ reset() {}, rowCount: 0, setColumnValues() {} }) + }, arrayValue: (values: number[]) => values })) -import logger from '@shared/logger' +import logger from 'node:console' import { MigrationAbandonFence } from '@/memory/infra/legacyV1Reader' import { loadLegacyVss } from '@/memory/infra/legacyVssLoader' import { @@ -72,6 +80,14 @@ interface ListableStore { function makeStore(onRun: (sql: string) => void = () => {}) { const calls: string[] = [] const connection = { + createAppender: vi.fn(async () => ({ + columnType: () => ({ length: 2 }), + appendDataChunk: () => { + calls.push('INSERT') + onRun('INSERT') + }, + closeSync() {} + })), run: vi.fn(async (sql: string) => { calls.push(sql.trim().split(/[\s;]/)[0].toUpperCase()) onRun(sql) @@ -88,6 +104,45 @@ const records: MemoryVectorRecord[] = [{ memoryId: 'm1', embedding: [0.1, 0.2] } const EMB = { providerId: 'p', modelId: 'm' } describe('MemoryVectorStore v2 format contract', () => { + it('stops native cleanup immediately after a fatal connection close', async () => { + const instance = { closeSync: vi.fn() } + const store = Object.assign(Object.create(MemoryVectorStore.prototype), { + connection: { + closeSync: () => { + throw new Error('INTERNAL Error: invalidated database') + } + }, + dbInstance: instance, + connectionOpen: true, + instanceOpen: true, + usable: true + }) as MemoryVectorStore + await expect(store.close()).rejects.toThrow('INTERNAL Error') + expect(instance.closeSync).not.toHaveBeenCalled() + expect(store.isUsable()).toBe(false) + }) + it('rejects a failed native close so the owner cannot acknowledge file disposal', async () => { + const connection = { + closeSync: vi.fn<() => void>(() => { + throw new Error('native connection is still open') + }) + } + const instance = { closeSync: vi.fn() } + const store = Object.assign(Object.create(MemoryVectorStore.prototype), { + connection, + dbInstance: instance, + connectionOpen: true, + instanceOpen: true, + usable: true + }) as MemoryVectorStore + await expect(store.close()).rejects.toThrow('native connection is still open') + expect(store.isUsable()).toBe(false) + expect(instance.closeSync).toHaveBeenCalledOnce() + connection.closeSync.mockImplementation(() => {}) + await store.close() + expect(connection.closeSync).toHaveBeenCalledTimes(2) + expect(instance.closeSync).toHaveBeenCalledOnce() + }) it('defines the schema and metadata consumed by native crash fixtures', () => { const plan = createMemoryVectorStoreV2FormatPlan(2, EMB) @@ -518,7 +573,7 @@ function makeVssLoadableStore( return { dbPath, connection, - loadVss: () => loadLegacyVss(connection, dbPath) + loadVss: () => loadLegacyVss(connection, dbPath, nativeVectorHost) } satisfies VssLoadableStore } @@ -600,7 +655,7 @@ describe('MemoryVectorStore v2 staged publish', () => { const { sql } = mockV2DuckDbLifecycle(paths) try { - const store = await MemoryVectorStore.create(paths, 2, EMB) + const store = await MemoryVectorStore.create(paths, 2, EMB, nativeVectorHost) expect(fs.existsSync(paths.current)).toBe(true) expect(fs.existsSync(paths.staging)).toBe(false) @@ -624,7 +679,9 @@ describe('MemoryVectorStore v2 staged publish', () => { }) try { - const failure = await MemoryVectorStore.create(paths, 2, EMB).catch((error) => error) + const failure = await MemoryVectorStore.create(paths, 2, EMB, nativeVectorHost).catch( + (error) => error + ) expect(failure).toBeInstanceOf(MemoryVectorStoreTerminalRecoveryError) expect(failure).toMatchObject({ @@ -651,7 +708,9 @@ describe('MemoryVectorStore v2 staged publish', () => { }) try { - const failure = await MemoryVectorStore.create(paths, 2, EMB).catch((error) => error) + const failure = await MemoryVectorStore.create(paths, 2, EMB, nativeVectorHost).catch( + (error) => error + ) expect(failure).toBeInstanceOf(MemoryVectorStoreTerminalRecoveryError) expect(failure).toMatchObject({ @@ -685,7 +744,7 @@ describe('MemoryVectorStore v2 staged publish', () => { mockV2DuckDbLifecycle(paths) try { - const store = await MemoryVectorStore.create(paths, 2, EMB) + const store = await MemoryVectorStore.create(paths, 2, EMB, nativeVectorHost) expect(fs.existsSync(paths.legacy)).toBe(false) expect(fs.existsSync(`${paths.legacy}.wal`)).toBe(false) expect(fs.existsSync(paths.current)).toBe(true) @@ -709,7 +768,7 @@ describe('MemoryVectorStore v2 staged publish', () => { const { legacySql } = mockV2DuckDbLifecycle(paths, { legacyRows }) try { - const store = await MemoryVectorStore.create(paths, 2, EMB) + const store = await MemoryVectorStore.create(paths, 2, EMB, nativeVectorHost) expect(store.isUsable()).toBe(true) expect(fs.existsSync(paths.current)).toBe(true) expect(fs.existsSync(paths.legacy)).toBe(false) @@ -756,7 +815,7 @@ describe('MemoryVectorStore v2 staged publish', () => { }) try { - const store = await MemoryVectorStore.create(paths, 2, EMB) + const store = await MemoryVectorStore.create(paths, 2, EMB, nativeVectorHost) expect(store.isUsable()).toBe(true) expect(fs.existsSync(paths.current)).toBe(true) @@ -780,7 +839,7 @@ describe('MemoryVectorStore v2 staged publish', () => { }) try { - const store = await MemoryVectorStore.create(paths, 2, EMB) + const store = await MemoryVectorStore.create(paths, 2, EMB, nativeVectorHost) expect(store.isUsable()).toBe(true) expect(fs.existsSync(paths.legacy)).toBe(false) @@ -801,9 +860,11 @@ describe('MemoryVectorStore v2 staged publish', () => { }) try { - await expect(MemoryVectorStore.create(paths, 2, EMB)).rejects.toMatchObject({ - name: 'MemoryVectorStoreQuarantineRequiredError' - }) + await expect(MemoryVectorStore.create(paths, 2, EMB, nativeVectorHost)).rejects.toMatchObject( + { + name: 'MemoryVectorStoreQuarantineRequiredError' + } + ) expect(fs.existsSync(paths.legacy)).toBe(true) expect(fs.existsSync(paths.current)).toBe(false) expect(connections.every((connection) => !connection.closeSync.mock.calls.length)).toBe(true) @@ -832,7 +893,7 @@ describe('MemoryVectorStore v2 staged publish', () => { }) try { - const store = await MemoryVectorStore.create(paths, 2, EMB) + const store = await MemoryVectorStore.create(paths, 2, EMB, nativeVectorHost) expect(store.isUsable()).toBe(true) expect(fs.existsSync(paths.legacy)).toBe(false) @@ -855,9 +916,11 @@ describe('MemoryVectorStore v2 staged publish', () => { }) try { - await expect(MemoryVectorStore.create(paths, 2, EMB)).rejects.toMatchObject({ - name: 'MemoryVectorStoreQuarantineRequiredError' - }) + await expect(MemoryVectorStore.create(paths, 2, EMB, nativeVectorHost)).rejects.toMatchObject( + { + name: 'MemoryVectorStoreQuarantineRequiredError' + } + ) expect(fs.existsSync(paths.legacy)).toBe(true) expect(fs.existsSync(paths.staging)).toBe(true) expect(fs.existsSync(paths.current)).toBe(false) @@ -880,9 +943,11 @@ describe('MemoryVectorStore v2 staged publish', () => { }) try { - await expect(MemoryVectorStore.create(paths, 2, EMB)).rejects.toMatchObject({ - name: 'MemoryVectorStoreQuarantineRequiredError' - }) + await expect(MemoryVectorStore.create(paths, 2, EMB, nativeVectorHost)).rejects.toMatchObject( + { + name: 'MemoryVectorStoreQuarantineRequiredError' + } + ) expect(fs.existsSync(paths.current)).toBe(false) expect(fs.existsSync(paths.staging)).toBe(true) expect(fs.existsSync(paths.legacy)).toBe(true) @@ -912,7 +977,7 @@ describe('MemoryVectorStore v2 staged publish', () => { }) try { - const pending = MemoryVectorStore.create(paths, 2, EMB) + const pending = MemoryVectorStore.create(paths, 2, EMB, nativeVectorHost) const rejection = expect(pending).rejects.toMatchObject({ name: 'MemoryVectorStoreQuarantineRequiredError' }) @@ -966,7 +1031,7 @@ describe('MemoryVectorStore v2 staged publish', () => { }) try { - const pending = MemoryVectorStore.create(paths, 2, EMB) + const pending = MemoryVectorStore.create(paths, 2, EMB, nativeVectorHost) for (let pageIndex = 0; pageIndex < pageGates.length; pageIndex += 1) { await pageStarts[pageIndex].promise await vi.advanceTimersByTimeAsync(50_000) @@ -995,7 +1060,7 @@ describe('MemoryVectorStore v2 staged publish', () => { mockV2DuckDbLifecycle(paths) try { - const store = await MemoryVectorStore.create(paths, 2, EMB) + const store = await MemoryVectorStore.create(paths, 2, EMB, nativeVectorHost) expect(fs.existsSync(paths.current)).toBe(true) expect(fs.existsSync(paths.staging)).toBe(false) expect(fs.existsSync(`${paths.staging}.wal`)).toBe(false) @@ -1017,7 +1082,7 @@ describe('MemoryVectorStore v2 staged publish', () => { }) try { - const store = await MemoryVectorStore.create(paths, 2, EMB) + const store = await MemoryVectorStore.create(paths, 2, EMB, nativeVectorHost) expect(store.isUsable()).toBe(true) expect(fs.existsSync(paths.current)).toBe(true) expect(fs.existsSync(paths.staging)).toBe(false) @@ -1049,7 +1114,7 @@ describe('MemoryVectorStore v2 staged publish', () => { }) try { - const store = await MemoryVectorStore.create(paths, 2, EMB) + const store = await MemoryVectorStore.create(paths, 2, EMB, nativeVectorHost) expect(fs.existsSync(paths.current)).toBe(true) expect(fs.existsSync(paths.quarantine)).toBe(false) expect(fs.existsSync(paths.legacy)).toBe(false) @@ -1067,17 +1132,19 @@ describe('MemoryVectorStore v2 staged publish', () => { mockV2DuckDbLifecycle(paths, { leaveStagingWal: true }) try { - await expect(MemoryVectorStore.create(paths, 2, EMB)).rejects.toMatchObject({ - name: 'MemoryVectorStoreTerminalRecoveryError', - message: expect.stringContaining('staged v2 WAL remains') - }) + await expect(MemoryVectorStore.create(paths, 2, EMB, nativeVectorHost)).rejects.toMatchObject( + { + name: 'MemoryVectorStoreTerminalRecoveryError', + message: expect.stringContaining('staged v2 WAL remains') + } + ) expect(fs.existsSync(paths.quarantine)).toBe(false) expect(fs.existsSync(paths.current)).toBe(false) MemoryVectorStore.markQuarantined(paths) duckDbMocks.create.mockReset() mockV2DuckDbLifecycle(paths) - const store = await MemoryVectorStore.create(paths, 2, EMB) + const store = await MemoryVectorStore.create(paths, 2, EMB, nativeVectorHost) expect(store.isUsable()).toBe(true) expect(fs.existsSync(paths.current)).toBe(true) expect(fs.existsSync(paths.quarantine)).toBe(false) @@ -1101,9 +1168,11 @@ describe('MemoryVectorStore v2 staged publish', () => { }) try { - await expect(MemoryVectorStore.create(paths, 2, EMB)).rejects.toMatchObject({ - name: 'MemoryVectorStoreTerminalRecoveryError' - }) + await expect(MemoryVectorStore.create(paths, 2, EMB, nativeVectorHost)).rejects.toMatchObject( + { + name: 'MemoryVectorStoreTerminalRecoveryError' + } + ) expect(fs.existsSync(paths.current)).toBe(false) expect(fs.existsSync(paths.quarantine)).toBe(true) expect(duckDbMocks.create).not.toHaveBeenCalled() @@ -1142,9 +1211,11 @@ describe('MemoryVectorStore v2 staged publish', () => { }) try { - await expect(MemoryVectorStore.create(paths, 2, EMB)).rejects.toMatchObject({ - name: 'MemoryVectorStoreTerminalRecoveryError' - }) + await expect(MemoryVectorStore.create(paths, 2, EMB, nativeVectorHost)).rejects.toMatchObject( + { + name: 'MemoryVectorStoreTerminalRecoveryError' + } + ) expect(duckDbMocks.create).not.toHaveBeenCalled() } finally { actualFs.rmSync(root, { recursive: true, force: true }) @@ -1159,7 +1230,7 @@ describe('MemoryVectorStore v2 staged publish', () => { mockV2DuckDbLifecycle(paths) try { - const store = await MemoryVectorStore.create(paths, 2, EMB) + const store = await MemoryVectorStore.create(paths, 2, EMB, nativeVectorHost) expect(fs.existsSync(`${paths.current}.wal`)).toBe(false) expect(fs.existsSync(paths.current)).toBe(true) await store.close() @@ -1184,7 +1255,7 @@ describe('MemoryVectorStore v2 staged publish', () => { }) try { - const store = await MemoryVectorStore.create(paths, 2, EMB) + const store = await MemoryVectorStore.create(paths, 2, EMB, nativeVectorHost) expect(store.isUsable()).toBe(true) expect(fs.readFileSync(paths.current, 'utf8')).toBe('v2') expect(fs.readFileSync(`${paths.current}.wal`, 'utf8')).toBe('safe-wal') @@ -1202,9 +1273,9 @@ describe('MemoryVectorStore v2 staged publish', () => { mockV2DuckDbLifecycle(paths, { failFinalOpen: true }) try { - await expect(MemoryVectorStore.create(paths, 2, EMB)).rejects.toBeInstanceOf( - MemoryVectorStorePostCommitError - ) + await expect( + MemoryVectorStore.create(paths, 2, EMB, nativeVectorHost) + ).rejects.toBeInstanceOf(MemoryVectorStorePostCommitError) expect(fs.existsSync(paths.current)).toBe(true) expect(fs.existsSync(paths.staging)).toBe(false) } finally { @@ -1222,10 +1293,12 @@ describe('MemoryVectorStore v2 staged publish', () => { }) try { - await expect(MemoryVectorStore.create(paths, 2, EMB)).rejects.toMatchObject({ - name: 'MemoryVectorStoreTerminalRecoveryError', - fatal: true - }) + await expect(MemoryVectorStore.create(paths, 2, EMB, nativeVectorHost)).rejects.toMatchObject( + { + name: 'MemoryVectorStoreTerminalRecoveryError', + fatal: true + } + ) expect(connections).toHaveLength(1) expect(connections[0].closeSync).not.toHaveBeenCalled() expect(fs.existsSync(paths.current)).toBe(true) @@ -1288,9 +1361,11 @@ describe('MemoryVectorStore v2 staged publish', () => { }) try { - await expect(MemoryVectorStore.create(paths, 2, EMB)).rejects.toMatchObject({ - name: 'MemoryVectorStorePostCommitError' - }) + await expect(MemoryVectorStore.create(paths, 2, EMB, nativeVectorHost)).rejects.toMatchObject( + { + name: 'MemoryVectorStorePostCommitError' + } + ) expect(fs.existsSync(paths.current)).toBe(true) expect(fs.existsSync(paths.staging)).toBe(false) expect(fs.existsSync(paths.legacy)).toBe(true) @@ -1307,7 +1382,9 @@ describe('MemoryVectorStore v2 staged publish', () => { mockV2DuckDbLifecycle(paths, { leaveStagingWal: true }) try { - await expect(MemoryVectorStore.create(paths, 2, EMB)).rejects.toThrow('staged v2 WAL remains') + await expect(MemoryVectorStore.create(paths, 2, EMB, nativeVectorHost)).rejects.toThrow( + 'staged v2 WAL remains' + ) expect(fs.existsSync(paths.current)).toBe(false) expect(fs.existsSync(paths.staging)).toBe(false) expect(fs.existsSync(`${paths.staging}.wal`)).toBe(false) @@ -1342,9 +1419,9 @@ describe('MemoryVectorStore v2 staged publish', () => { it('rejects invalid dimensions before interpolating them into schema SQL', async () => { const paths = createMemoryVectorStorePaths('/tmp/AgentMemory', 'agent-a') - await expect(MemoryVectorStore.create(paths, Number.NaN, EMB)).rejects.toThrow( - 'invalid vector dimensions' - ) + await expect( + MemoryVectorStore.create(paths, Number.NaN, EMB, nativeVectorHost) + ).rejects.toThrow('invalid vector dimensions') expect(duckDbMocks.create).not.toHaveBeenCalled() }) @@ -1534,10 +1611,16 @@ describe('Legacy VSS loading', () => { const secondFence = new MigrationAbandonFence() try { - const first = loadLegacyVss(firstConnection, path.join(userDataDir, 'a.duckdb'), firstFence) + const first = loadLegacyVss( + firstConnection, + path.join(userDataDir, 'a.duckdb'), + nativeVectorHost, + firstFence + ) const second = loadLegacyVss( secondConnection, path.join(userDataDir, 'b.duckdb'), + nativeVectorHost, secondFence ) await readStarted @@ -1675,7 +1758,7 @@ describe('Legacy VSS loading', () => { try { await expect( - loadLegacyVss(connection, path.join(userDataDir, 'agent.duckdb'), fence) + loadLegacyVss(connection, path.join(userDataDir, 'agent.duckdb'), nativeVectorHost, fence) ).rejects.toMatchObject({ name: 'LegacyVssUnavailableError' }) expect(connection.run).not.toHaveBeenCalled() } finally { @@ -1719,7 +1802,7 @@ describe('Legacy VSS loading', () => { }) } const fence = new MigrationAbandonFence() - const pendingLoad = loadLegacyVss(connection, '/tmp/legacy.duckdb', fence) + const pendingLoad = loadLegacyVss(connection, '/tmp/legacy.duckdb', nativeVectorHost, fence) const rejection = expect(pendingLoad).rejects.toMatchObject({ name: 'LegacyV1MigrationAbandonedError' }) @@ -1756,7 +1839,9 @@ describe('Legacy VSS loading', () => { const connection = { run: vi.fn(async () => undefined as never) } const fence = new MigrationAbandonFence() - await expect(loadLegacyVss(connection, '/tmp/legacy.duckdb', fence)).rejects.toMatchObject({ + await expect( + loadLegacyVss(connection, '/tmp/legacy.duckdb', nativeVectorHost, fence) + ).rejects.toMatchObject({ name: 'LegacyVssUnavailableError' }) expect(connection.run).not.toHaveBeenCalled() diff --git a/test/main/memory/memoryVectorStoreV2Native.test.ts b/test/main/memory/memoryVectorStoreV2Native.test.ts index a5b32302d4..09b74015c4 100644 --- a/test/main/memory/memoryVectorStoreV2Native.test.ts +++ b/test/main/memory/memoryVectorStoreV2Native.test.ts @@ -1,3 +1,4 @@ +import { nativeVectorHost } from './nativeVectorHost' import { DuckDBInstance, arrayValue } from '@duckdb/node-api' import { app } from 'electron' import { spawn } from 'node:child_process' @@ -187,6 +188,87 @@ afterEach(() => { }) describe('MemoryVectorStore v2 native integration', () => { + it('persists packed Float32 batches with offsets, reuse and atomic rejection', async () => { + const { paths } = createPaths('deepchat-vector-packed-') + const store = await MemoryVectorStore.create(paths, 2, EMBEDDING, nativeVectorHost) + const packed = (ids: string[], values: number[], dimensions = 2) => { + const bytes = Buffer.alloc(values.length * 4 + 3).subarray(3) + values.forEach((value, index) => bytes.writeFloatLE(value, index * 4)) + return { memoryIds: ids, dimensions, bytes } + } + try { + await store.upsertPacked( + packed( + Array.from({ length: 101 }, (_, index) => `row-${index}`), + Array.from({ length: 101 }, (_, index) => [index + 0.25, -index - 0.5]).flat() + ) + ) + await expect(store.upsertPacked(packed(['row-0'], [1]))).rejects.toThrow('shape') + await expect(store.upsertPacked(packed(['row-0'], [1], 1))).rejects.toThrow('dimensions') + for (const invalid of [NaN, Infinity, -Infinity]) { + await expect(store.upsertPacked(packed(['row-0'], [1, invalid]))).rejects.toThrow( + 'non-finite' + ) + } + await expect( + store.upsertPacked( + packed( + Array.from({ length: 51 }, (_, index) => + index === 0 || index === 50 ? 'row-0' : `new-${index}` + ), + Array.from({ length: 51 }, () => [1, 0]).flat() + ) + ) + ).rejects.toThrow(/constraint|duplicate key/i) + await store.upsert([{ memoryId: 'row-1', embedding: [0.25, 0.75] }]) + await store.upsertPacked(packed(['row-0'], [-0, -3.4028234663852886e38])) + await store.upsertPacked(packed(['row-2'], [1.401298464324817e-45, -0.25])) + } finally { + await store.close() + } + const { rows } = await inspectV2(paths) + expect(rows).toHaveLength(101) + const embeddingFor = (id: string) => rows.find((row) => row.memory_id === id)?.embedding + expect(embeddingFor('row-0')).toEqual([-0, -3.4028234663852886e38]) + expect(embeddingFor('row-1')).toEqual([0.25, 0.75]) + expect(embeddingFor('row-2')).toEqual([1.401298464324817e-45, -0.25]) + expect(embeddingFor('row-50')).toEqual([50.25, -50.5]) + expect(embeddingFor('row-100')).toEqual([100.25, -100.5]) + expect(rows.some((row) => String(row.memory_id).startsWith('new-'))).toBe(false) + }) + it('keeps multi-chunk upserts atomic and reuses a smaller final batch safely', async () => { + const { paths } = createPaths('deepchat-vector-append-') + const store = await MemoryVectorStore.create(paths, 2, EMBEDDING, nativeVectorHost) + try { + await store.upsert( + Array.from({ length: 101 }, (_, index) => ({ + memoryId: `row-${index}`, + embedding: [index + 1, 1] + })) + ) + await expect(store.upsert([{ memoryId: 'row-0', embedding: [1] }])).rejects.toThrow( + 'dimensions' + ) + await expect( + store.upsert( + Array.from({ length: 51 }, (_, index) => ({ + memoryId: index === 50 ? 'row-0' : index === 0 ? 'row-0' : `new-${index}`, + embedding: [1, 0] + })) + ) + ).rejects.toThrow(/constraint|duplicate key/i) + await store.upsert([{ memoryId: 'row-0', embedding: [0.25, 0.75] }]) + } finally { + await store.close() + } + const { rows } = await inspectV2(paths) + expect(rows).toHaveLength(101) + expect(rows.find((row) => row.memory_id === 'row-0')).toEqual({ + memory_id: 'row-0', + embedding: [0.25, 0.75] + }) + expect(rows.some((row) => String(row.memory_id).startsWith('new-'))).toBe(false) + }) itWithVss('preserves a genuine WAL-free HNSW v1 store without VSS on the v2 path', async () => { if (!VSS_AVAILABLE) { throw new Error(`Required bundled VSS extension is missing at ${VSS_EXTENSION}`) @@ -194,7 +276,7 @@ describe('MemoryVectorStore v2 native integration', () => { const { paths } = createPaths('deepchat-memory-native-preserve-') await createLegacyV1(paths) - const store = await MemoryVectorStore.create(paths, 2, EMBEDDING) + const store = await MemoryVectorStore.create(paths, 2, EMBEDDING, nativeVectorHost) expect(store.isUsable()).toBe(true) await expect(store.query([1, 51], { topK: 1 })).resolves.toMatchObject([{ memoryId: 'm001' }]) await store.close() @@ -209,7 +291,7 @@ describe('MemoryVectorStore v2 native integration', () => { expect(snapshot.rows[50]).toMatchObject({ memory_id: 'm051', embedding: [51, 1] }) vi.mocked(app.getAppPath).mockReturnValue(path.join(PROJECT_ROOT, 'missing-runtime-root')) - const reopened = await MemoryVectorStore.create(paths, 2, EMBEDDING) + const reopened = await MemoryVectorStore.create(paths, 2, EMBEDDING, nativeVectorHost) await expect(reopened.query([51, 1], { topK: 1 })).resolves.toMatchObject([ { memoryId: 'm051' } ]) @@ -224,7 +306,7 @@ describe('MemoryVectorStore v2 native integration', () => { await createLegacyV1(paths, 1) fs.renameSync(paths.legacy, paths.current) - const store = await MemoryVectorStore.create(paths, 2, EMBEDDING) + const store = await MemoryVectorStore.create(paths, 2, EMBEDDING, nativeVectorHost) expect(store.isUsable()).toBe(false) expect(fs.existsSync(paths.current)).toBe(true) @@ -237,7 +319,7 @@ describe('MemoryVectorStore v2 native integration', () => { fs.writeFileSync(paths.legacy, 'not-a-duckdb-database') fs.writeFileSync(`${paths.legacy}.wal`, 'not-a-duckdb-wal') - const store = await MemoryVectorStore.create(paths, 2, EMBEDDING) + const store = await MemoryVectorStore.create(paths, 2, EMBEDDING, nativeVectorHost) expect(store.isUsable()).toBe(true) await expect(store.query([1, 0], { topK: 5 })).resolves.toEqual([]) await store.close() @@ -257,7 +339,7 @@ describe('MemoryVectorStore v2 native crash recovery', () => { expect(fs.existsSync(paths.current)).toBe(true) expect(fs.existsSync(`${paths.current}.wal`)).toBe(true) - const store = await MemoryVectorStore.create(paths, 2, EMBEDDING) + const store = await MemoryVectorStore.create(paths, 2, EMBEDDING, nativeVectorHost) await expect(store.query([1, 0], { topK: 1 })).resolves.toMatchObject([ { memoryId: 'crash-row' } ]) @@ -280,7 +362,7 @@ describe('MemoryVectorStore v2 native crash recovery', () => { const { paths } = createPaths(`deepchat-memory-native-${mode}-`) await runCrashWorker(mode, paths) - const store = await MemoryVectorStore.create(paths, 2, EMBEDDING) + const store = await MemoryVectorStore.create(paths, 2, EMBEDDING, nativeVectorHost) expect(store.isUsable()).toBe(true) const matches = await store.query([1, 0], { topK: 1 }) if (mode === 'rename-after') { @@ -336,7 +418,7 @@ describe('MemoryVectorStore v2 native crash recovery', () => { 'keeps committed v2 authoritative when legacy cleanup returns EBUSY', async () => { const { root, paths } = createPaths('deepchat-memory-native-windows-cleanup-') - const published = await MemoryVectorStore.create(paths, 2, EMBEDDING) + const published = await MemoryVectorStore.create(paths, 2, EMBEDDING, nativeVectorHost) await published.upsert([{ memoryId: 'current-row', embedding: [1, 0] }]) await published.close() await createLegacyV1(paths, 1) @@ -354,7 +436,7 @@ describe('MemoryVectorStore v2 native crash recovery', () => { try { await waitForReady(child) - const reopened = await MemoryVectorStore.create(paths, 2, EMBEDDING) + const reopened = await MemoryVectorStore.create(paths, 2, EMBEDDING, nativeVectorHost) await expect(reopened.query([1, 0], { topK: 1 })).resolves.toMatchObject([ { memoryId: 'current-row' } ]) diff --git a/test/main/memory/nativeVectorHost.ts b/test/main/memory/nativeVectorHost.ts new file mode 100644 index 0000000000..59489346c0 --- /dev/null +++ b/test/main/memory/nativeVectorHost.ts @@ -0,0 +1,14 @@ +import { app } from 'electron' +import type { MemoryVectorHost } from '@/memory/infra/legacyVssLoader' + +export const nativeVectorHost: MemoryVectorHost = { + get appPath() { + return app.getAppPath() + }, + get userDataPath() { + return app.getPath('userData') + }, + get isPackaged() { + return app.isPackaged + } +} diff --git a/test/main/nowledgeMem/connections.test.ts b/test/main/nowledgeMem/connections.test.ts index addedfb7fc..3f4f5b6136 100644 --- a/test/main/nowledgeMem/connections.test.ts +++ b/test/main/nowledgeMem/connections.test.ts @@ -90,8 +90,9 @@ function setup(initial: Record = {}) { }) } const secrets = { - get: (key: string) => encrypted.get(key) ?? '', - wrap: vi.fn((value: string) => `encrypted:${value}`), + captureOperation: () => () => {}, + get: async (key: string) => encrypted.get(key) ?? '', + wrap: vi.fn(async (value: string) => `encrypted:${value}`), setWrapped: (key: string, wrapped: string) => { encrypted.set(key, wrapped.slice('encrypted:'.length)) }, @@ -136,7 +137,7 @@ describe('Nowledge connection contract', () => { expect(state.connection?.baseUrl).toBe('https://mem.example.test') expect(JSON.stringify([...data])).not.toContain('remote-key') expect(JSON.stringify(state)).not.toContain('remote-key') - expect(create().getExportConfig()).toMatchObject({ + expect(await create().getExportConfig()).toMatchObject({ baseUrl: 'https://mem.example.test', apiKey: 'remote-key' }) @@ -146,7 +147,7 @@ describe('Nowledge connection contract', () => { ownerPluginId: NOWLEDGE_PLUGIN_ID, sourceId: NOWLEDGE_PLUGIN_ID } - expect(service.getMcpBindings(config)).toEqual({ NOWLEDGE_MEM_API_KEY: 'remote-key' }) + expect(await service.getMcpBindings(config)).toEqual({ NOWLEDGE_MEM_API_KEY: 'remote-key' }) expect(requests.some((r) => r.path === '/mcp/' && r.key === 'remote-key')).toBe(true) }) @@ -183,7 +184,7 @@ describe('Nowledge connection contract', () => { credentials: saved.credentials }) expect((await service.getState()).connection?.baseUrl).toBe('https://mem.example.test') - expect(service.getExportConfig().apiKey).toBe('remote-key') + expect((await service.getExportConfig()).apiKey).toBe('remote-key') await service.save({ ...remote(), apiKey: '' }) expect(data.get('nowledgeMemPlugin')).not.toHaveProperty('connections') expect([...encrypted.values()]).toEqual(['local-key', 'remote-key']) @@ -197,7 +198,7 @@ describe('Nowledge connection contract', () => { requests = [] await expect(service.save({ ...remote(), apiKey: 'wrong-key' })).rejects.toThrow('HTTP 401') expect([...data]).toEqual(before) - expect(service.getExportConfig().apiKey).toBe('remote-key') + expect((await service.getExportConfig()).apiKey).toBe('remote-key') expect(requests).toHaveLength(1) }) @@ -222,11 +223,11 @@ describe('Nowledge connection contract', () => { const next = { ...remote('https://other.example.test'), apiKey: '' } await expect(service.save(next)).rejects.toThrow('Confirm replacing') await service.save({ ...next, replace: true }) - expect(service.getExportConfig().apiKey).toBe('') + expect((await service.getExportConfig()).apiKey).toBe('') await service.save({ ...next, replace: true, apiKey: 'other-key' }) - expect(() => service.getMcpBindings(old)).toThrow('no longer matches') + await expect(service.getMcpBindings(old)).rejects.toThrow('no longer matches') await service.save({ ...remote(), replace: true, apiKey: '' }) - expect(service.getExportConfig().apiKey).toBe('remote-key') + expect((await service.getExportConfig()).apiKey).toBe('remote-key') }) it('imports legacy export credentials only on explicit save and clears plaintext after encryption', async () => { @@ -240,7 +241,7 @@ describe('Nowledge connection contract', () => { await service.save({ ...local(), legacySource: 'export' }) expect(secrets.wrap).toHaveBeenCalledWith('legacy-key') expect(data.get('nowledgeMemConfig')).not.toHaveProperty('apiKey') - expect(service.getExportConfig().apiKey).toBe('legacy-key') + expect((await service.getExportConfig()).apiKey).toBe('legacy-key') }) it('does not lose the previous credential when persisting a rotation fails', async () => { @@ -253,10 +254,24 @@ describe('Nowledge connection contract', () => { await expect(service.save({ ...remote(), apiKey: 'replacement-key' })).rejects.toThrow( 'Disk full' ) - expect(service.getExportConfig().apiKey).toBe('remote-key') + expect((await service.getExportConfig()).apiKey).toBe('remote-key') expect([...encrypted.values()]).toEqual(['remote-key']) }) + it('keeps connection replacement and clearing excluded while native wrapping is pending', async () => { + const { service, secrets, data } = setup() + const pending = Promise.withResolvers() + secrets.wrap.mockReturnValueOnce(pending.promise) + const save = service.save({ ...local(), apiKey: 'private-key' }) + await vi.waitFor(() => expect(secrets.wrap).toHaveBeenCalledOnce()) + expect(data.has('nowledgeMemPlugin')).toBe(false) + expect(() => service.clear()).toThrow('update is in progress') + await expect(service.save(local())).rejects.toThrow('update is in progress') + pending.resolve('encrypted:private-key') + await save + expect((await service.getExportConfig()).apiKey).toBe('private-key') + }) + it('reuses unchanged keys, removes replaced keys and explicitly clears retained destinations', async () => { routeRemoteToFixture() const { service, encrypted } = setup() @@ -294,7 +309,7 @@ describe('Nowledge connection contract', () => { }) requests = [] await service.save({ ...remote(), replace: true, apiKey: '' }) - expect(service.getExportConfig().apiKey).toBe('remote-key') + expect((await service.getExportConfig()).apiKey).toBe('remote-key') expect( requests .filter((request) => request.path.startsWith('/remote-api')) diff --git a/test/main/ocr/ocrRuntimeService.test.ts b/test/main/ocr/ocrRuntimeService.test.ts index e4d86b9200..b7940eaa6d 100644 --- a/test/main/ocr/ocrRuntimeService.test.ts +++ b/test/main/ocr/ocrRuntimeService.test.ts @@ -5,6 +5,7 @@ import { OcrRuntimeService } from '@/ocr/ocrRuntimeService' function createUnsupportedService() { return new OcrRuntimeService({ + cacheKeyProvider: { loadOrCreateKey: async () => null }, appPath: '/application', isPackaged: true, nodeRuntimePath: null, @@ -47,6 +48,7 @@ describe('OcrRuntimeService', () => { } as never) const service = new OcrRuntimeService({ + cacheKeyProvider: { loadOrCreateKey: async () => null }, appPath: '/application', isPackaged: true, nodeRuntimePath: null, @@ -79,6 +81,7 @@ describe('OcrRuntimeService', () => { } as never) const service = new OcrRuntimeService({ + cacheKeyProvider: { loadOrCreateKey: async () => null }, appPath: '/application', isPackaged: true, nodeRuntimePath: null, @@ -113,6 +116,7 @@ describe('OcrRuntimeService', () => { } as never) const service = new OcrRuntimeService({ + cacheKeyProvider: { loadOrCreateKey: async () => null }, appPath: '/application', isPackaged: true, nodeRuntimePath: null, diff --git a/test/main/orchestration/liveDelegationService.test.ts b/test/main/orchestration/liveDelegationService.test.ts index baa50893dc..aae05578d0 100644 --- a/test/main/orchestration/liveDelegationService.test.ts +++ b/test/main/orchestration/liveDelegationService.test.ts @@ -1,5 +1,5 @@ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' -import { AgentInvocationAdmission } from '@/agent/invocationAdmission' +import { AgentInvocationAdmission } from '../../../src/harness/admission' import { TOOL_EXECUTION } from '@shared/types/mcp' import { LIVE_DELEGATION_MAX_ACTIVE_PER_PARENT, diff --git a/test/main/performance/memory/clearScale.perf.ts b/test/main/performance/memory/clearScale.perf.ts index 55205ac00f..c57b05d073 100644 --- a/test/main/performance/memory/clearScale.perf.ts +++ b/test/main/performance/memory/clearScale.perf.ts @@ -5,6 +5,7 @@ import { expect } from 'vitest' import { AgentMemoryTable } from '@/memory/data/tables/agentMemory' import { describeIfNativeSqlite, requireDatabase } from '../../nativeSqliteHarness' +import { assertTimingBudget } from './timing' const CLEAR_CORPUS_SIZE = 10_000 const CLEAR_BATCH_SIZE = 256 @@ -64,7 +65,7 @@ describeIfNativeSqlite('Agent Memory clear scale', () => { })}` ) expect(batchCount).toBe(Math.ceil(CLEAR_CORPUS_SIZE / CLEAR_BATCH_SIZE)) - expect(maxBatchMs).toBeLessThanOrEqual(CLEAR_MAX_BATCH_MS) + assertTimingBudget('clear-10k-max-batch', maxBatchMs, CLEAR_MAX_BATCH_MS) expect(job.removed).toBe(CLEAR_CORPUS_SIZE) expect(table.countByAgent('clear-agent')).toBe(0) expect( diff --git a/test/main/performance/memory/recallScale.perf.ts b/test/main/performance/memory/recallScale.perf.ts index 6297f65848..04ad57b13f 100644 --- a/test/main/performance/memory/recallScale.perf.ts +++ b/test/main/performance/memory/recallScale.perf.ts @@ -5,7 +5,7 @@ import { AgentMemoryTable } from '@/memory/data/tables/agentMemory' import { buildMemoryFixture } from './fixtures' import { createMemoryPerfObserver } from './performanceObserver' import { describeIfNativeSqlite, requireDatabase } from '../../nativeSqliteHarness' -import { measurePairedPerformance, reportPerformance } from './timing' +import { assertTimingBudget, measurePairedPerformance, reportPerformance } from './timing' const RECALL_MAX_10K_TO_50K_INDEXED_GROWTH = 4 const RECALL_MAX_50K_OVER_LEGACY_RATIO = 1.25 @@ -130,8 +130,12 @@ describeIfNativeSqlite('Agent Memory #28 recall scale', () => { ) // The 10k legacy median can jitter independently on shared runners. Bound indexed scaling // directly, then use the 50k pair only to catch material overhead against the legacy path. - expect(indexedGrowth).toBeLessThanOrEqual(RECALL_MAX_10K_TO_50K_INDEXED_GROWTH) - expect(largeScaleRatio).toBeLessThanOrEqual(RECALL_MAX_50K_OVER_LEGACY_RATIO) + assertTimingBudget( + 'recall-indexed-growth', + indexedGrowth, + RECALL_MAX_10K_TO_50K_INDEXED_GROWTH + ) + assertTimingBudget('recall-over-legacy', largeScaleRatio, RECALL_MAX_50K_OVER_LEGACY_RATIO) } finally { db.close() } diff --git a/test/main/performance/memory/tapeScale.perf.ts b/test/main/performance/memory/tapeScale.perf.ts index 2a101ba128..2d4110d2fc 100644 --- a/test/main/performance/memory/tapeScale.perf.ts +++ b/test/main/performance/memory/tapeScale.perf.ts @@ -6,7 +6,7 @@ import { DeepChatTapeEntriesTable } from '@/tape/infrastructure/sqlite/tapeEntry import { createMemoryPerfObserver } from './performanceObserver' import { describeIfNativeSqlite, requireDatabase } from '../../nativeSqliteHarness' -import { measurePerformance, reportPerformance } from './timing' +import { assertTimingBudget, measurePerformance, reportPerformance } from './timing' function messagePayload(sessionId: string, index: number): string { const id = `message-${index.toString().padStart(6, '0')}` @@ -124,7 +124,7 @@ describeIfNativeSqlite('Agent Memory #28 Tape scale', () => { const largest = reports.get(100_000) expect(largest).toBeDefined() - expect(largest!.range).toBeLessThanOrEqual(largest!.full * 0.2) + assertTimingBudget('tape-range-100k', largest!.range, largest!.full * 0.2) } finally { db.close() } diff --git a/test/main/performance/memory/timing.test.ts b/test/main/performance/memory/timing.test.ts new file mode 100644 index 0000000000..d039a75110 --- /dev/null +++ b/test/main/performance/memory/timing.test.ts @@ -0,0 +1,37 @@ +import { afterEach, beforeEach, expect, it, vi } from 'vitest' +import { assertTimingBudget } from './timing' + +beforeEach(() => { + vi.spyOn(console, 'info').mockImplementation(() => {}) + vi.spyOn(console, 'warn').mockImplementation(() => {}) +}) + +afterEach(() => { + vi.unstubAllEnvs() + vi.restoreAllMocks() +}) + +it.each([undefined, '0', 'true'])( + 'enforces timing budgets unless report mode is explicit (%s)', + (mode) => { + vi.stubEnv('DEEPCHAT_MEMORY_PERF_REPORT_ONLY', mode) + expect(() => assertTimingBudget('write-overhead', -1, 5)).not.toThrow() + expect(() => assertTimingBudget('write-overhead', 6.94, 5)).toThrow() + } +) + +it('reports shared-runner overruns without failing the timing budget', () => { + vi.stubEnv('DEEPCHAT_MEMORY_PERF_REPORT_ONLY', '1') + expect(() => assertTimingBudget('write-overhead', 6.94, 5)).not.toThrow() + expect(console.warn).toHaveBeenCalledWith(expect.stringContaining('memory-perf-budget-exceeded')) +}) + +it('rejects invalid measurements and budgets in both modes', () => { + for (const mode of [undefined, '1']) { + vi.stubEnv('DEEPCHAT_MEMORY_PERF_REPORT_ONLY', mode) + for (const invalid of [NaN, Infinity, -Infinity]) { + expect(() => assertTimingBudget('write-overhead', invalid, 5)).toThrow() + expect(() => assertTimingBudget('write-overhead', 1, invalid)).toThrow() + } + } +}) diff --git a/test/main/performance/memory/timing.ts b/test/main/performance/memory/timing.ts index 6d0df10e10..14f048b133 100644 --- a/test/main/performance/memory/timing.ts +++ b/test/main/performance/memory/timing.ts @@ -1,4 +1,5 @@ import { performance } from 'node:perf_hooks' +import { expect } from 'vitest' import { summarizeDurations } from './performanceObserver' @@ -80,3 +81,17 @@ export function measurePairedPerformance( export function reportPerformance(report: PerformanceReport): void { console.info(`[memory-perf] ${JSON.stringify(report)}`) } + +export function assertTimingBudget(scenario: string, actual: number, maximum: number): void { + expect(Number.isFinite(actual), `${scenario}: measured timing must be finite`).toBe(true) + expect(Number.isFinite(maximum), `${scenario}: timing budget must be finite`).toBe(true) + const reportOnly = process.env.DEEPCHAT_MEMORY_PERF_REPORT_ONLY === '1' + const exceeded = actual > maximum + const report = { scenario, actual, maximum, exceeded, reportOnly } + console.info(`[memory-perf-budget] ${JSON.stringify(report)}`) + if (reportOnly) { + if (exceeded) console.warn(`[memory-perf-budget-exceeded] ${JSON.stringify(report)}`) + return + } + expect(actual, scenario).toBeLessThanOrEqual(maximum) +} diff --git a/test/main/performance/memory/vectorTransportScale.perf.ts b/test/main/performance/memory/vectorTransportScale.perf.ts new file mode 100644 index 0000000000..227083bab5 --- /dev/null +++ b/test/main/performance/memory/vectorTransportScale.perf.ts @@ -0,0 +1,164 @@ +import { createRequire } from 'node:module' +import fs from 'node:fs' +import os from 'node:os' +import path from 'node:path' +import { afterEach, beforeEach, expect, it, vi } from 'vitest' +import { HarnessRuntime } from '@/harness/runtime' +import { RutisMemoryVectorStores } from '@/harness/memory-vector' +import { MemoryVectorStore, createMemoryVectorStorePaths } from '@/memory/infra/memoryVectorStore' +import type { IMemoryVectorStore } from '@/memory/ports' +import { assertTimingBudget } from './timing' + +const actualFs = await vi.importActual('node:fs') +const require = createRequire(import.meta.url) +const DIMENSIONS = 1536 +const embedding = { providerId: 'fixture', modelId: 'fixture' } +const percentile = (values: number[], fraction: number) => + [...values].sort((a, b) => a - b)[Math.ceil(values.length * fraction) - 1] +const mean = (values: number[]) => values.reduce((sum, value) => sum + value, 0) / values.length +const timed = async (task: () => Promise) => { + const start = performance.now() + await task() + return performance.now() - start +} +let directory: string +let runtime: HarnessRuntime | undefined +let stores: RutisMemoryVectorStores | undefined +let native: IMemoryVectorStore | undefined + +beforeEach(() => { + for (const method of [ + 'existsSync', + 'readdirSync', + 'mkdirSync', + 'mkdtempSync', + 'rmSync', + 'renameSync', + 'writeFileSync' + ] as const) { + vi.mocked(fs[method]).mockImplementation(actualFs[method] as never) + } + directory = fs.mkdtempSync(path.join(os.tmpdir(), 'deepchat-vector-transport-perf-')) +}) + +afterEach(async () => { + await native?.close() + await stores?.dispose() + await runtime?.stop() + native = undefined + stores = undefined + runtime = undefined + actualFs.rmSync(directory, { recursive: true, force: true }) +}) + +it.each([1000, 10000, 50000])( + 'bounds actual vector transport overhead at %i rows', + async (rows) => { + const host = { appPath: path.resolve('.'), userDataPath: directory, isPackaged: false } + const firstOpens: number[] = [] + let remote!: IMemoryVectorStore + for (let sample = 0; sample < 5; sample++) { + runtime = await HarnessRuntime.start({ + directory: path.resolve('out/harness'), + electronExecutable: require('electron'), + capacity: 1, + maxPending: 4, + observe: () => {} + }) + stores = new RutisMemoryVectorStores(runtime, { + memoryDbDir: path.join(directory, `remote-${sample}`), + host + }) + const openedAt = performance.now() + remote = await stores.createVectorStore('agent', embedding, DIMENSIONS) + firstOpens.push(performance.now() - openedAt) + if (sample < 4) { + await remote.close() + await stores.dispose() + await runtime.stop() + } + } + const runningRuntime = runtime! + native = await MemoryVectorStore.create( + createMemoryVectorStorePaths(path.join(directory, 'native'), 'agent'), + DIMENSIONS, + embedding, + host + ) + const baseline = native + const nativeWrites: number[] = [] + const remoteWrites: number[] = [] + for (let offset = 0; offset < rows; offset += 50) { + const records = Array.from({ length: Math.min(50, rows - offset) }, (_, index) => ({ + memoryId: `memory-${String(offset + index).padStart(8, '0')}`, + embedding: Array.from({ length: DIMENSIONS }, (_, component) => + component === (offset + index) % DIMENSIONS ? 1 : 0 + ) + })) + const pair = [() => baseline.upsert(records), () => remote.upsert(records)] + const times: number[] = [] + for (const index of offset % 100 === 0 ? [0, 1] : [1, 0]) + times[index] = await timed(pair[index]) + nativeWrites.push(times[0]) + remoteWrites.push(times[1]) + } + const vector = Array.from({ length: DIMENSIONS }, (_, index) => (index === 0 ? 1 : 0)) + const query = (store: IMemoryVectorStore) => store.query(vector, { topK: 20 }) + await query(baseline) + await query(remote) + const traffic = runningRuntime.memoryTransport + const nativeQueries: number[] = [] + const remoteQueries: number[] = [] + for (let sample = 0; sample < 30; sample++) { + for (const index of sample % 2 ? [1, 0] : [0, 1]) { + const target = index === 0 ? nativeQueries : remoteQueries + target.push(await timed(() => query(index === 0 ? baseline : remote))) + } + } + const nativeQueryP95 = percentile(nativeQueries, 0.95) + const remoteQueryP95 = percentile(remoteQueries, 0.95) + const nativeWriteMean = mean(nativeWrites) + const remoteWriteMean = mean(remoteWrites) + const report = { + rows, + dimensions: DIMENSIONS, + firstOpens, + firstOpenMedianMs: percentile(firstOpens, 0.5), + firstOpenP95Ms: percentile(firstOpens, 0.95), + nativeQueryP95, + remoteQueryP95, + nativeWriteMean, + remoteWriteMean, + queryTrafficBytes: + runningRuntime.memoryTransport.sentBytes + + runningRuntime.memoryTransport.receivedBytes - + traffic.sentBytes - + traffic.receivedBytes, + pending: runningRuntime.memoryTransport.pending, + peakPending: runningRuntime.memoryTransport.peakPending, + nativeNode: process.versions.node, + remoteNode: runningRuntime.memoryIdentity?.node, + nativeModules: process.versions.modules, + remoteModules: runningRuntime.memoryIdentity?.modules + } + process.stdout.write(`[memory-vector-transport] ${JSON.stringify(report)}\n`) + expect(report.nativeNode, 'Use pnpm test:main:memory-perf for the Electron runtime').toBe( + report.remoteNode + ) + expect(report.nativeModules).toBe(report.remoteModules) + expect(report.pending).toBe(0) + assertTimingBudget( + `vector-query-overhead-${rows}`, + remoteQueryP95 - nativeQueryP95, + Math.max(5, nativeQueryP95 * 0.2) + ) + assertTimingBudget( + `vector-write-overhead-${rows}`, + remoteWriteMean - nativeWriteMean, + Math.max(5, nativeWriteMean * 0.25) + ) + assertTimingBudget(`vector-first-open-median-${rows}`, report.firstOpenMedianMs, 500) + assertTimingBudget(`vector-first-open-p95-${rows}`, report.firstOpenP95Ms, 1000) + }, + 120_000 +) diff --git a/test/main/platform/imageCache.test.ts b/test/main/platform/imageCache.test.ts index 3c20e356c0..acd23aa96a 100644 --- a/test/main/platform/imageCache.test.ts +++ b/test/main/platform/imageCache.test.ts @@ -10,14 +10,9 @@ vi.unmock('node:fs/promises') vi.unmock('path') vi.unmock('node:path') -const electronMock = vi.hoisted(() => ({ userDataPath: '' })) +const profile = { userDataPath: '' } const axiosMock = vi.hoisted(() => vi.fn()) -vi.mock('electron', () => ({ - app: { - getPath: vi.fn(() => electronMock.userDataPath) - } -})) vi.mock('axios', () => ({ default: axiosMock })) import { cacheImage, resolveCachedImageDataUrl } from '@/platform/imageCache' @@ -29,9 +24,10 @@ describe('imageCache', () => { beforeEach(async () => { axiosMock.mockReset() vi.spyOn(console, 'error').mockImplementation(() => {}) - electronMock.userDataPath = await fs.mkdtemp(path.join(os.tmpdir(), 'deepchat-image-cache-')) - tempDirectories.push(electronMock.userDataPath) - await fs.mkdir(path.join(electronMock.userDataPath, 'images')) + profile.userDataPath = await fs.mkdtemp(path.join(os.tmpdir(), 'deepchat-image-cache-')) + vi.stubEnv('DEEPCHAT_USER_DATA_DIR', profile.userDataPath) + tempDirectories.push(profile.userDataPath) + await fs.mkdir(path.join(profile.userDataPath, 'images')) }) afterEach(async () => { @@ -41,6 +37,18 @@ describe('imageCache', () => { .map((directory) => fs.rm(directory, { recursive: true, force: true })) ) vi.mocked(console.error).mockRestore() + vi.unstubAllEnvs() + }) + + it('requires an absolute bootstrap profile before accessing cached files', async () => { + vi.stubEnv('DEEPCHAT_USER_DATA_DIR', undefined) + await expect(resolveCachedImageDataUrl('imgcache://fixture.png')).rejects.toThrow( + 'absolute bootstrap profile' + ) + vi.stubEnv('DEEPCHAT_USER_DATA_DIR', 'relative-profile') + await expect(cacheImage('data:image/png;base64,AA==')).rejects.toThrow( + 'absolute bootstrap profile' + ) }) it('preserves distinct valid images whose base64 differs only by case', async () => { @@ -112,7 +120,7 @@ describe('imageCache', () => { ) await expect(cacheImage(sourceUrl, { allowPrivateNetwork: false })).resolves.toBe(sourceUrl) - await expect(fs.readdir(path.join(electronMock.userDataPath, 'images'))).resolves.toEqual([]) + await expect(fs.readdir(path.join(profile.userDataPath, 'images'))).resolves.toEqual([]) }) it.each(['http', 'HTTP'])( @@ -138,9 +146,7 @@ describe('imageCache', () => { }) ) await expect( - fs.readFile( - path.join(electronMock.userDataPath, 'images', cached.slice('imgcache://'.length)) - ) + fs.readFile(path.join(profile.userDataPath, 'images', cached.slice('imgcache://'.length))) ).resolves.toEqual(Buffer.from('0000001866747970617669660000000061766966', 'hex')) } ) @@ -154,7 +160,7 @@ describe('imageCache', () => { }) await expect(cacheImage(sourceUrl, { allowPrivateNetwork: true })).resolves.toBe(sourceUrl) - await expect(fs.readdir(path.join(electronMock.userDataPath, 'images'))).resolves.toEqual([]) + await expect(fs.readdir(path.join(profile.userDataPath, 'images'))).resolves.toEqual([]) }) it('does not cache HTTP responses above the image size limit', async () => { @@ -166,7 +172,7 @@ describe('imageCache', () => { }) await expect(cacheImage(sourceUrl, { allowPrivateNetwork: true })).resolves.toBe(sourceUrl) - await expect(fs.readdir(path.join(electronMock.userDataPath, 'images'))).resolves.toEqual([]) + await expect(fs.readdir(path.join(profile.userDataPath, 'images'))).resolves.toEqual([]) }) it('propagates caller cancellation to the active HTTP request', async () => { @@ -196,14 +202,12 @@ describe('imageCache', () => { expect(cached).toMatch(/^imgcache:\/\/.+\.png$/) await expect( - fs.readFile( - path.join(electronMock.userDataPath, 'images', cached.slice('imgcache://'.length)) - ) + fs.readFile(path.join(profile.userDataPath, 'images', cached.slice('imgcache://'.length))) ).resolves.toEqual(Buffer.from('image')) }) it('resolves a cached image to a MIME-correct data URL', async () => { - await fs.writeFile(path.join(electronMock.userDataPath, 'images', 'generated.png'), 'image') + await fs.writeFile(path.join(profile.userDataPath, 'images', 'generated.png'), 'image') await expect(resolveCachedImageDataUrl('imgcache://generated.png')).resolves.toBe( 'data:image/png;base64,aW1hZ2U=' @@ -211,7 +215,7 @@ describe('imageCache', () => { }) it('resolves cached images with an uppercase scheme', async () => { - await fs.writeFile(path.join(electronMock.userDataPath, 'images', 'generated.png'), 'image') + await fs.writeFile(path.join(profile.userDataPath, 'images', 'generated.png'), 'image') await expect(resolveCachedImageDataUrl('IMGCACHE://generated.png')).resolves.toBe( 'data:image/png;base64,aW1hZ2U=' @@ -225,13 +229,9 @@ describe('imageCache', () => { }) it('rejects symbolic links that escape the image cache root', async () => { - const outsidePath = path.join(electronMock.userDataPath, 'outside.png') + const outsidePath = path.join(profile.userDataPath, 'outside.png') await fs.writeFile(outsidePath, 'image') - await fs.symlink( - outsidePath, - path.join(electronMock.userDataPath, 'images', 'outside.png'), - 'file' - ) + await fs.symlink(outsidePath, path.join(profile.userDataPath, 'images', 'outside.png'), 'file') await expect(resolveCachedImageDataUrl('imgcache://outside.png')).rejects.toThrow( 'Cached image reference is not a regular file' @@ -246,7 +246,7 @@ describe('imageCache', () => { it('rejects cached images above the MCP image input limit', async () => { await fs.writeFile( - path.join(electronMock.userDataPath, 'images', 'oversized.png'), + path.join(profile.userDataPath, 'images', 'oversized.png'), Buffer.alloc(8 * 1024 * 1024 + 1) ) @@ -256,7 +256,7 @@ describe('imageCache', () => { }) it('rejects unsupported cached image types', async () => { - await fs.writeFile(path.join(electronMock.userDataPath, 'images', 'generated.txt'), 'image') + await fs.writeFile(path.join(profile.userDataPath, 'images', 'generated.txt'), 'image') await expect(resolveCachedImageDataUrl('imgcache://generated.txt')).rejects.toThrow( 'Unsupported cached image type' diff --git a/test/main/plugin/pluginRoutes.test.ts b/test/main/plugin/pluginRoutes.test.ts index a6e481ad03..7dd3969028 100644 --- a/test/main/plugin/pluginRoutes.test.ts +++ b/test/main/plugin/pluginRoutes.test.ts @@ -20,8 +20,8 @@ function setup(ownerPluginId: string | null) { } const settingsWindow: PluginSettingsWindowPort = { open: async () => {}, - close: () => {}, - closeAll: () => {}, + close: async () => {}, + closeAll: async () => {}, getPluginIdForWebContents: () => ownerPluginId } const routes = createPluginRoutes(pluginService as unknown as PluginServicePort, settingsWindow) diff --git a/test/main/plugin/pluginService.test.ts b/test/main/plugin/pluginService.test.ts index fe6ac0aa0f..9dcc188aeb 100644 --- a/test/main/plugin/pluginService.test.ts +++ b/test/main/plugin/pluginService.test.ts @@ -1,3 +1,4 @@ +import { createPluginToolPolicies } from '../../helpers/pluginToolPolicies' import { createHash } from 'node:crypto' import fs from 'node:fs' import { chmod, mkdir, mkdtemp, readFile, rm, writeFile } from 'node:fs/promises' @@ -7,8 +8,8 @@ import { app, BrowserWindow, shell } from 'electron' import { zipSync } from 'fflate' import { afterEach, describe, expect, it, vi } from 'vitest' -vi.mock('electron-store', () => ({ - default: class MockElectronStore { +vi.mock('conf', () => ({ + default: class MockConf { private data: Record constructor(options?: { defaults?: Record }) { @@ -104,12 +105,21 @@ const createPluginService = async ( registerPluginSkill: vi.fn().mockResolvedValue(undefined), unregisterPluginSkillsByOwner: vi.fn().mockResolvedValue(undefined) } + const toolPolicies = createPluginToolPolicies() const presenter = new PluginService({ + workingDirectory: process.cwd(), + profileDirectory: app.getPath('userData'), + homeDirectory: app.getPath('home'), + appVersion: app.getVersion(), + openExternal: (url: string) => shell.openExternal(url), + openPath: (filePath: string) => shell.openPath(filePath), + hookEnvironment: () => ({}), + toolPolicies, platform, arch: options.arch, appPath: options.appPath ?? process.cwd(), - isPackaged: options.isPackaged, - resourcesPath: options.resourcesPath, + isPackaged: options.isPackaged ?? false, + resourcesPath: options.resourcesPath ? path.resolve(options.resourcesPath) : '', nowledgeMem: options.nowledgeMem, mcpSettings, mcpService, @@ -119,6 +129,7 @@ const createPluginService = async ( } as any) return Object.assign(presenter, { __mocks: { + toolPolicies, mcpServers, mcpSettings, mcpService, @@ -1132,11 +1143,12 @@ describe('PluginService', () => { await writeFile(workspaceManifestPath, `${JSON.stringify(manifest, null, 2)}\n`) const presenter = await createPluginService('darwin', fixture.appPath) - const { getPluginToolPolicy } = await import('@/plugin/toolPolicyStore') const enabled = await presenter.enablePlugin(fixture.pluginId) expect(enabled.ok).toBe(true) - expect(getPluginToolPolicy('fixture-tools', 'fixture_tool')).toBe('ask') + expect(presenter.__mocks.toolPolicies.resolve('fixture-tools', 'fixture_tool').decision).toBe( + 'ask' + ) const rejectedManifest = { ...manifest, @@ -1159,7 +1171,9 @@ describe('PluginService', () => { expect((presenter as any).store.get('resources')).toEqual([]) expect((presenter as any).store.get('runtimes')).toEqual([]) expect(servers['fixture-tools']).toBeUndefined() - expect(getPluginToolPolicy('fixture-tools', 'fixture_tool')).toBeNull() + expect( + presenter.__mocks.toolPolicies.resolve('fixture-tools', 'fixture_tool').decision + ).toBeNull() }) it('loads official packages only from resources roots in packaged mode', async () => { @@ -1607,8 +1621,6 @@ describe('PluginService', () => { it('preserves an explicit legacy CUA disable in installation intent before cleanup', async () => { const presenter = await createPluginService('darwin') - const { getPluginToolPolicy, registerPluginToolPolicy } = - await import('@/plugin/toolPolicyStore') const now = Date.now() ;(presenter as any).store.set('installations', [ { @@ -1632,7 +1644,7 @@ describe('PluginService', () => { sourceId: 'com.deepchat.plugins.cua', ownerPluginId: 'com.deepchat.plugins.cua' } - registerPluginToolPolicy({ + presenter.__mocks.toolPolicies.register({ pluginId: 'com.deepchat.plugins.cua', serverId: 'cua-driver', tools: { click: 'ask' }, @@ -1646,7 +1658,7 @@ describe('PluginService', () => { enabled: false }) expect(presenter.__mocks.mcpSettings.removeMcpServer).toHaveBeenCalledWith('cua-driver') - expect(getPluginToolPolicy('cua-driver', 'click')).toBeNull() + expect(presenter.__mocks.toolPolicies.resolve('cua-driver', 'click').decision).toBeNull() }) it('does not reinterpret the supervised CUA record as a legacy disable signal', async () => { @@ -1705,7 +1717,7 @@ describe('PluginService', () => { const activatePluginImplementation = (presenter as any).activatePlugin.bind(presenter) const activatePlugin = vi .spyOn(presenter as any, 'activatePlugin') - .mockImplementation(async (pluginId: string) => { + .mockImplementation(async (pluginId) => { if (pluginId === 'com.deepchat.plugins.cua') { return } diff --git a/test/main/plugin/runtimeSupervisor.test.ts b/test/main/plugin/runtimeSupervisor.test.ts index 556cd294f4..511a33a2e3 100644 --- a/test/main/plugin/runtimeSupervisor.test.ts +++ b/test/main/plugin/runtimeSupervisor.test.ts @@ -1042,4 +1042,108 @@ describe('PluginRuntimeSupervisor', () => { normalStop.resolve() await disable }) + it.each(['launch-check', 'adapter-start', 'process-start'] as const)( + 'cleans a canceled authentication restart during %s', + async (stage) => { + const supervisor = new PluginRuntimeSupervisor() + const { port, running, active } = createProcessPort() + const entered = deferred() + const finish = deferred() + const safety = createSafetyStore() + const guard = { + verify: vi.fn(async () => { + if (stage === 'launch-check') { + entered.resolve() + await finish.promise + } + return runtimeFingerprint('a') + }) + } + const adapter = { + start: vi.fn(async () => { + if (stage === 'adapter-start') { + entered.resolve() + await finish.promise + } + }), + stop: vi.fn(async () => undefined) + } + if (stage === 'process-start') + vi.mocked(port.start).mockImplementation(async (name) => { + active.add(name) + entered.resolve() + await finish.promise + running.add(name) + }) + supervisor.attachProcessPort(port) + supervisor.attachSafetyStore(safety.store) + register(supervisor, 'fixture', 'eager', adapter, guard) + let current = true + const pending = supervisor.restartIfRunning('fixture', 'authentication', () => { + if (!current) throw new Error('authentication interrupted') + }) + const rejected = expect(pending).rejects.toThrow('authentication interrupted') + await entered.promise + current = false + finish.resolve() + await rejected + expect(running.size).toBe(0) + expect(active.size).toBe(0) + expect(safety.values.size).toBe(0) + if (stage !== 'process-start') expect(port.start).not.toHaveBeenCalled() + } + ) + + it('does not restart a plugin when authentication is canceled during its stop', async () => { + const supervisor = new PluginRuntimeSupervisor() + const { port } = createProcessPort() + supervisor.attachProcessPort(port) + register(supervisor, 'fixture') + await supervisor.ensureRunning('fixture', 'external') + const entered = deferred() + const finish = deferred() + vi.mocked(port.stop).mockImplementationOnce(async () => { + entered.resolve() + await finish.promise + }) + let current = true + const pending = supervisor.restartIfRunning('fixture', 'authentication', () => { + if (!current) throw new Error('authentication interrupted') + }) + const rejected = expect(pending).rejects.toThrow('authentication interrupted') + await entered.promise + current = false + finish.resolve() + await rejected + expect(port.start).toHaveBeenCalledOnce() + }) + + it('rejects a superseded stop waiting for another plugin start without stopping its process', async () => { + const supervisor = new PluginRuntimeSupervisor() + const { port, running, active } = createProcessPort() + const entered = deferred() + const finish = deferred() + vi.mocked(port.start).mockImplementation(async (name) => { + active.add(name) + entered.resolve() + await finish.promise + running.add(name) + }) + supervisor.attachProcessPort(port) + register(supervisor, 'fixture') + const started = supervisor.ensureRunning('fixture', 'external') + await entered.promise + let current = true + const stopped = supervisor.requestExternalStop('fixture', () => { + if (!current) throw new Error('authentication interrupted') + }) + const rejected = expect(stopped).rejects.toThrow('authentication interrupted') + current = false + finish.resolve() + await started + await rejected + expect(running.has('fixture')).toBe(true) + expect(port.stop).not.toHaveBeenCalled() + await supervisor.requestExternalStop('fixture') + }) }) diff --git a/test/main/plugin/toolPolicyStore.test.ts b/test/main/plugin/toolPolicyStore.test.ts new file mode 100644 index 0000000000..d214009757 --- /dev/null +++ b/test/main/plugin/toolPolicyStore.test.ts @@ -0,0 +1,63 @@ +import { describe, expect, it } from 'vitest' +import { PluginToolPolicyStore, type StoredToolPolicy } from '@/plugin/toolPolicyStore' +import { createPluginToolPolicies } from '../../helpers/pluginToolPolicies' + +const policy: StoredToolPolicy = { + pluginId: 'fixture-owner', + serverId: 'fixture-server', + tools: { allowed: 'allow', prompted: 'ask', blocked: 'deny' }, + enabled: true +} + +describe('PluginToolPolicyStore', () => { + it('preserves decisions and closes undeclared or ambiguous owned tools', () => { + const owner = createPluginToolPolicies() + expect(owner.resolve('fixture-server', 'allowed')).toEqual({ managed: false, decision: null }) + owner.register(policy) + for (const [tool, decision] of Object.entries(policy.tools)) + expect(owner.resolve(policy.serverId, tool)).toEqual({ managed: true, decision }) + expect(owner.resolve(policy.serverId, 'undeclared')).toEqual({ managed: true, decision: null }) + expect(owner.deniedTools(policy.serverId)).toEqual(['blocked']) + owner.register({ ...policy, pluginId: 'another-owner' }) + expect(owner.resolve(policy.serverId, 'allowed')).toEqual({ managed: true, decision: null }) + expect(owner.deniedTools(policy.serverId)).toEqual([]) + owner.register({ ...policy, pluginId: 'another-owner', enabled: false }) + expect(owner.resolve(policy.serverId, 'allowed').decision).toBe('allow') + }) + + it('replaces one owner/server pair and removes only the requested owner', () => { + const owner = createPluginToolPolicies() + owner.register(policy) + owner.register({ ...policy, serverId: 'another-server' }) + owner.register({ ...policy, pluginId: 'another-owner', serverId: 'unrelated-server' }) + owner.register({ ...policy, tools: { allowed: 'deny' } }) + expect(owner.resolve(policy.serverId, 'allowed').decision).toBe('deny') + owner.unregister(policy.pluginId) + expect(owner.resolve(policy.serverId, 'allowed').managed).toBe(false) + expect(owner.resolve('another-server', 'allowed').managed).toBe(false) + expect(owner.resolve('unrelated-server', 'allowed').decision).toBe('allow') + }) + + it('keeps disabled policies unmanaged and isolates separate profile owners', () => { + const owner = createPluginToolPolicies() + owner.register({ ...policy, enabled: false }) + expect(owner.resolve(policy.serverId, 'blocked')).toEqual({ managed: false, decision: null }) + owner.register(policy) + expect(createPluginToolPolicies().resolve(policy.serverId, 'blocked').managed).toBe(false) + }) + + it('does not acknowledge failed persistence or retain an independent decision cache', () => { + let policies = [policy] + const owner = new PluginToolPolicyStore({ + get: () => structuredClone(policies), + set: () => { + throw new Error('Policy persistence failed') + } + }) + expect(() => owner.register({ ...policy, tools: { allowed: 'deny' } })).toThrow('persistence') + expect(() => owner.unregister(policy.pluginId)).toThrow('persistence') + expect(owner.resolve(policy.serverId, 'allowed').decision).toBe('allow') + policies = [{ ...policy, tools: { allowed: 'ask' } }] + expect(owner.resolve(policy.serverId, 'allowed').decision).toBe('ask') + }) +}) diff --git a/test/main/plugin/userPluginHookLifecycle.test.ts b/test/main/plugin/userPluginHookLifecycle.test.ts new file mode 100644 index 0000000000..34c80aadda --- /dev/null +++ b/test/main/plugin/userPluginHookLifecycle.test.ts @@ -0,0 +1,84 @@ +import { EventEmitter } from 'node:events' +import { PassThrough } from 'node:stream' +import { spawn } from 'node:child_process' +import { afterEach, expect, it, vi } from 'vitest' +import { terminateProcessTree } from '@/agent/shared/process/processTree' +import { UserPluginHooks } from '@/plugin/userPluginHooks' +import type { DeepChatTapeEntryRow, TapeAnchorAppendInput } from '@/tape/domain/entry' + +vi.mock('node:child_process', () => ({ spawn: vi.fn() })) +vi.mock('@/agent/shared/process/processTree', () => ({ terminateProcessTree: vi.fn() })) + +afterEach(() => vi.restoreAllMocks()) + +it.each([false, true])( + 'keeps Tape owned until actual child closure when termination rejects=%s', + async (terminationFails) => { + const child = Object.assign(new EventEmitter(), { + stdin: new PassThrough(), + stdout: new PassThrough(), + stderr: new PassThrough() + }) + vi.mocked(spawn).mockReturnValue(child as unknown as ReturnType) + if (terminationFails) + vi.mocked(terminateProcessTree).mockRejectedValue(new Error('Kill failed')) + else vi.mocked(terminateProcessTree).mockResolvedValue(true) + const rows: DeepChatTapeEntryRow[] = [] + const host = new UserPluginHooks({ + getTapeIncarnationId: () => 'incarnation', + getBySession: () => rows, + appendAnchor: (input: TapeAnchorAppendInput) => { + const row: DeepChatTapeEntryRow = { + session_id: input.sessionId, + entry_id: rows.length + 1, + kind: 'anchor', + name: input.name, + source_type: 'runtime_event', + source_id: input.source?.id ?? null, + source_seq: input.source?.seq ?? null, + provenance_key: input.provenanceKey ?? null, + payload_json: JSON.stringify({ state: input.state }), + meta_json: '{}', + created_at: 1 + } + rows.push(row) + return row + } + }) + host.register({ + pluginId: 'user.closure', + digest: 'a'.repeat(64), + root: '/plugin', + data: '/plugin/data', + hooks: [{ id: 'input', event: 'UserPromptSubmit', command: 'fixture', timeout: 5 }] + }) + const accepted = host.accept({ + sessionId: 's', + messageId: 'm', + prompt: 'test', + model: 'test', + cwd: null + }) + await vi.waitFor(() => expect(spawn).toHaveBeenCalled()) + let released = false + const stopping = host.stop().then(() => { + released = true + }) + try { + await vi.waitFor(() => expect(terminateProcessTree).toHaveBeenCalled()) + await Promise.resolve() + expect(released).toBe(false) + expect(() => host.start()).toThrow('must drain') + child.emit('close', null, 'SIGKILL') + await Promise.all([accepted, stopping]) + expect(host.diagnostics('user.closure')).toMatchObject([{ status: 'failed' }]) + expect(() => host.beginRun('s')).toThrow('stopped') + host.start() + expect(() => host.beginRun('s')).not.toThrow() + host.endRun('s') + } finally { + child.emit('close', null, 'SIGKILL') + await host.stop() + } + } +) diff --git a/test/main/plugin/userPluginLifecycle.test.ts b/test/main/plugin/userPluginLifecycle.test.ts index 587248ee65..4834f27c6d 100644 --- a/test/main/plugin/userPluginLifecycle.test.ts +++ b/test/main/plugin/userPluginLifecycle.test.ts @@ -6,12 +6,12 @@ import { unzipSync, zipSync } from 'fflate' import { afterEach, expect, it, vi } from 'vitest' import { UserPlugins, type UserPluginRecord, type UserPluginStore } from '@/plugin/userPlugins' import { UserPluginHooks } from '@/plugin/userPluginHooks' -import { McpSettings } from '@/mcp/settings' +import { McpSettings, createMcpSettingsDefaults } from '@/mcp/settings' import { mcpVariableBindingScope } from '@/mcp/environmentBindings' import { SecretStore } from '@/config/secretStore' -import { safeStorage } from 'electron' import type { TapeAnchorAppendInput, DeepChatTapeEntryRow } from '@/tape/domain/entry' import { USER_PLUGIN_INSTALL_DIRECTORY } from '@shared/pluginPaths' +import { createMemoryStore } from '../../helpers/memoryStore' vi.unmock('fs') vi.unmock('node:fs') @@ -90,13 +90,19 @@ function fixture() { appendAnchor: (input: TapeAnchorAppendInput) => DeepChatTapeEntryRow }) const wrappedSecrets = new Map() - vi.spyOn(safeStorage, 'isEncryptionAvailable').mockReturnValue(true) - const secrets = new SecretStore({ - get: (key: string) => wrappedSecrets.get(key), - set: (key: string, value: string) => wrappedSecrets.set(key, value), - delete: (key: string) => wrappedSecrets.delete(key) - } as never) - const mcpSettings = new McpSettings(secrets) + const secrets = new SecretStore( + { + get: (key: string) => wrappedSecrets.get(key), + set: (key: string, value: string) => wrappedSecrets.set(key, value), + delete: (key: string) => wrappedSecrets.delete(key) + } as never, + { + isAvailable: async () => true, + encrypt: async (value) => Buffer.from(value).toString('base64'), + decrypt: async (wrapped) => Buffer.from(wrapped, 'base64').toString() + } + ) + const mcpSettings = new McpSettings(createMemoryStore(createMcpSettingsDefaults()), secrets) const skills = new Map() const supervisor = { registerServer: vi.fn(), @@ -213,12 +219,12 @@ it.each([ ok: false, error: 'Invalid MCP variable binding' }) - expect(f.mcpSettings.getMcpVariableBindings(first)).toEqual({}) + expect(await f.mcpSettings.getMcpVariableBindings(first)).toEqual({}) // The fixture mocks safeStorage and connections; this checks storage boundaries, not OS encryption. const token = randomUUID() expect((await f.service.configureMcp(id, key, { [variable]: token })).ok).toBe(true) - expect(f.mcpSettings.getMcpVariableBindings(first)).toEqual({ [variable]: token }) + expect(await f.mcpSettings.getMcpVariableBindings(first)).toEqual({ [variable]: token }) expect(JSON.stringify(f.store.read())).not.toContain(token) expect(JSON.stringify(await f.service.get(id))).not.toContain(token) expect(JSON.stringify(await f.mcpSettings.getMcpServers())).not.toContain(token) @@ -241,7 +247,7 @@ it.each([ const current = (await f.mcpSettings.getMcpServers())[key] expect(current.serverId).toBe(first.serverId) expect(current.customHeaders).toEqual({ Authorization: 'Bearer ${' + variable + '}' }) - expect(f.mcpSettings.getMcpVariableBindings(current)).toEqual({ [variable]: token }) + expect(await f.mcpSettings.getMcpVariableBindings(current)).toEqual({ [variable]: token }) const secretKey = `mcpVariableBindings.${current.serverId}` const savedSecret = f.wrappedSecrets.get(secretKey) @@ -274,10 +280,10 @@ it.each([ expect(mcpVariableBindingScope({ ...updated, env: current.env })).toBe( mcpVariableBindingScope(current) ) - expect(f.mcpSettings.getMcpVariableBindings(updated)).toEqual({}) + expect(await f.mcpSettings.getMcpVariableBindings(updated)).toEqual({}) expect((await updatedService.get(id)).userPlugin?.setup[key]).toEqual([variable]) expect((await updatedService.configureMcp(id, key, { [variable]: token })).ok).toBe(true) - expect(f.mcpSettings.getMcpVariableBindings(updated)).toEqual({ [variable]: token }) + expect(await f.mcpSettings.getMcpVariableBindings(updated)).toEqual({ [variable]: token }) expect((await updatedService.get(id)).userPlugin?.setup[key]).toEqual([]) expect((await updatedService.uninstall(id)).ok).toBe(true) expect(await f.mcpSettings.getMcpServers()).toEqual(unrelated) @@ -321,7 +327,7 @@ it('installs disabled, preserves host MCP identities across enable cycles, and r const current = (await f.mcpSettings.getMcpServers())[key] expect(current.serverId).toBe(first.serverId) expect(current.customHeaders).toEqual({ Authorization: 'Bearer ${EXAMPLE_PLUGIN_TOKEN}' }) - expect(f.mcpSettings.getMcpVariableBindings(current)).toEqual({ + expect(await f.mcpSettings.getMcpVariableBindings(current)).toEqual({ EXAMPLE_PLUGIN_TOKEN: 'private-token' }) expect(JSON.stringify(f.mcpSettings.getMigrationSnapshot())).not.toContain('private-token') @@ -329,7 +335,7 @@ it('installs disabled, preserves host MCP identities across enable cycles, and r expect( (await f.service.configureMcp(id, key, { EXAMPLE_PLUGIN_TOKEN: 'rotated-token' })).ok ).toBe(true) - expect(f.mcpSettings.getMcpVariableBindings(current)).toEqual({ + expect(await f.mcpSettings.getMcpVariableBindings(current)).toEqual({ EXAMPLE_PLUGIN_TOKEN: 'rotated-token' }) const unrelated = Object.entries(await f.mcpSettings.getMcpServers()).find( @@ -382,7 +388,9 @@ it('blocks active-turn updates and rolls failed publication back with the previo customHeaders: { Authorization: 'Bearer ${EXAMPLE_PLUGIN_TOKEN}' } }) expect( - f.mcpSettings.getMcpVariableBindings((await f.mcpSettings.getMcpServers())[`${id}.remote`]) + await f.mcpSettings.getMcpVariableBindings( + (await f.mcpSettings.getMcpServers())[`${id}.remote`] + ) ).toEqual({ EXAMPLE_PLUGIN_TOKEN: 'kept-secret' }) expect(f.store.pending()).toBeNull() const success = await f.service.install({ @@ -422,7 +430,9 @@ it('restores an interrupted update and lets a concurrent disable cancel publicat customHeaders: { Authorization: 'Bearer ${EXAMPLE_PLUGIN_TOKEN}' } }) expect( - f.mcpSettings.getMcpVariableBindings((await f.mcpSettings.getMcpServers())[`${id}.remote`]) + await f.mcpSettings.getMcpVariableBindings( + (await f.mcpSettings.getMcpServers())[`${id}.remote`] + ) ).toEqual({ EXAMPLE_PLUGIN_TOKEN: 'recovered-secret' }) f.manifest('https://new.example/mcp') const update = await recovered.inspect({ kind: 'directory', path: f.source }, randomUUID()) @@ -488,7 +498,7 @@ it.each(['publication', 'cleanup', 'rollback cleanup'])( expect(f.skills.size).toBe(0) const restored = (await f.mcpSettings.getMcpServers())[`${id}.remote`] expect(restored).toMatchObject({ enabled: false, baseUrl: 'https://old.example/mcp' }) - expect(f.mcpSettings.getMcpVariableBindings(restored)).toEqual({ + expect(await f.mcpSettings.getMcpVariableBindings(restored)).toEqual({ EXAMPLE_PLUGIN_TOKEN: 'rollback-secret' }) failing.mockReset() @@ -559,7 +569,7 @@ it('installs Sem disabled and retains its explicit repository binding through en env: { SEM_REPO: '${SEM_REPO}', SEM_NO_NETWORK: '1', SEM_NO_TELEMETRY: '1' }, environmentVariables: ['SEM_REPO'] }) - expect(f.mcpSettings.getMcpVariableBindings(config)).toEqual({ SEM_REPO: repository }) + expect(await f.mcpSettings.getMcpVariableBindings(config)).toEqual({ SEM_REPO: repository }) expect((await f.service.disable(id)).ok).toBe(true) expect((await f.mcpSettings.getMcpServers())[key].enabled).toBe(false) expect((await f.service.uninstall(id)).ok).toBe(true) @@ -622,7 +632,7 @@ it('installs the anonymous Parallel ZIP without changing existing MCP settings', }, environmentVariables: [] }) - expect(f.mcpSettings.getMcpVariableBindings(enabled[key])).toEqual({}) + expect(await f.mcpSettings.getMcpVariableBindings(enabled[key])).toEqual({}) for (const [name, config] of Object.entries(existing)) expect(enabled[name]).toEqual(config) expect((await f.service.disable(id)).ok).toBe(true) expect((await f.mcpSettings.getMcpServers())[key].enabled).toBe(false) diff --git a/test/main/plugin/userPlugins.test.ts b/test/main/plugin/userPlugins.test.ts index 5011d43d5f..4ac24cfb8a 100644 --- a/test/main/plugin/userPlugins.test.ts +++ b/test/main/plugin/userPlugins.test.ts @@ -219,6 +219,65 @@ describe('portable plugin package contract', () => { }) describe('reviewed context hook execution', () => { + it('keeps Tape owned after a drain deadline and fences queued work before resuming', async () => { + const root = directory() + write( + root, + 'hook.cjs', + `console.log(JSON.stringify({hookSpecificOutput:{hookEventName:'UserPromptSubmit',additionalContext:'ready'}}))` + ) + const history = tape() + const host = new UserPluginHooks(history) + let release!: () => void + let entered!: () => void + const gate = new Promise((resolve) => { + release = resolve + }) + const admitted = new Promise((resolve) => { + entered = resolve + }) + host.register({ + pluginId: 'user.drain', + digest: 'a'.repeat(64), + root, + data: root, + hooks: [commandHook('UserPromptSubmit')], + verify: async () => { + entered() + await gate + } + }) + const input = { sessionId: 's', messageId: 'first', prompt: 'First', model: 'test', cwd: root } + const active = host.accept(input) + await admitted + const queued = host.accept({ ...input, messageId: 'queued' }) + vi.useFakeTimers() + const stopping = host.stop() + const timedOut = expect(stopping).rejects.toThrow('did not drain') + try { + expect(() => host.start()).toThrow('must drain') + expect(() => host.beginRun('s')).toThrow('stopped') + await expect(host.accept(input)).rejects.toThrow('stopped') + await expect(host.retry('user.drain', 'unknown')).rejects.toThrow('stopped') + await vi.advanceTimersByTimeAsync(30_000) + await timedOut + expect(() => host.start()).toThrow('must drain') + release() + await Promise.all([active, queued]) + vi.useRealTimers() + expect(host.diagnostics('user.drain').map((entry) => entry.status)).toEqual(['failed']) + const rows = history.rows.length + host.start() + await host.accept({ ...input, messageId: 'resumed' }) + expect(history.rows.length).toBeGreaterThan(rows) + expect(host.getContext('s', 'resumed').map((entry) => entry.content)).toEqual(['ready']) + } finally { + release() + vi.useRealTimers() + await host.stop() + } + }) + it('reuses only the matching prompt and restarts hooks after the Tape is cleared', async () => { const root = fixture() write( diff --git a/test/main/project/projectService.test.ts b/test/main/project/projectService.test.ts index 5d4e1fd8c4..8bc7a580cc 100644 --- a/test/main/project/projectService.test.ts +++ b/test/main/project/projectService.test.ts @@ -1,33 +1,9 @@ import { beforeEach, describe, expect, it, vi } from 'vitest' -const { getPathMock, openPathMock, existsSyncMock, mkdirSyncMock, statSyncMock } = vi.hoisted( - () => ({ - getPathMock: vi.fn((name: string) => { - if (name === 'temp') { - return '/system/temp' - } - if (name === 'userData') { - return '/mock/userData' - } - if (name === 'appData') { - return '/mock/appData' - } - return `/mock/${name}` - }), - openPathMock: vi.fn(), - existsSyncMock: vi.fn(), - mkdirSyncMock: vi.fn(), - statSyncMock: vi.fn() - }) -) - -vi.mock('electron', () => ({ - app: { - getPath: getPathMock - }, - shell: { - openPath: openPathMock - } +const { existsSyncMock, mkdirSyncMock, statSyncMock } = vi.hoisted(() => ({ + existsSyncMock: vi.fn(), + mkdirSyncMock: vi.fn(), + statSyncMock: vi.fn() })) vi.mock('fs', () => ({ @@ -38,7 +14,7 @@ vi.mock('fs', () => ({ } })) -import { ProjectService } from '@/project' +import { ProjectService, type ProjectHost } from '@/project' function createMockSqlitePresenter() { return { @@ -70,10 +46,16 @@ function createMockSqlitePresenter() { } as any } -function createMockDeviceService() { +function createMockHost() { return { - selectDirectory: vi.fn().mockResolvedValue({ canceled: true, filePaths: [] }) - } as any + tempDirectory: '/system/temp', + userDataDirectory: '/mock/userData', + appDataDirectory: '/mock/appData', + documentsDirectory: '/mock/documents', + homeDirectory: '/mock/home', + selectDirectory: vi.fn().mockResolvedValue({ canceled: true, filePaths: [] }), + openPath: vi.fn().mockResolvedValue('') + } satisfies ProjectHost } function createMockSettingsStore(defaultProjectPath: string | null = null) { @@ -86,7 +68,7 @@ function createMockSettingsStore(defaultProjectPath: string | null = null) { describe('ProjectService', () => { let sqlitePresenter: ReturnType - let deviceService: ReturnType + let host: ReturnType let presenter: ProjectService beforeEach(() => { @@ -95,16 +77,66 @@ describe('ProjectService', () => { mkdirSyncMock.mockReturnValue(undefined) statSyncMock.mockReturnValue({ isDirectory: () => true }) sqlitePresenter = createMockSqlitePresenter() - deviceService = createMockDeviceService() + host = createMockHost() presenter = new ProjectService( sqlitePresenter, sqlitePresenter, - deviceService, + host, createMockSettingsStore(), vi.fn() ) }) + it.each([ + 'tempDirectory', + 'userDataDirectory', + 'appDataDirectory', + 'documentsDirectory', + 'homeDirectory' + ] as const)( + 'rejects a relative %s instead of resolving it against the working directory', + (key) => { + expect( + () => + new ProjectService( + sqlitePresenter, + sqlitePresenter, + { ...host, [key]: 'relative-directory' }, + createMockSettingsStore(), + vi.fn() + ) + ).toThrow('Project host directories must be absolute') + expect(mkdirSyncMock).not.toHaveBeenCalled() + } + ) + + it('uses the profile workspace when Documents and Home are unavailable', async () => { + const service = new ProjectService( + sqlitePresenter, + sqlitePresenter, + { ...host, documentsDirectory: null, homeDirectory: null }, + createMockSettingsStore(), + vi.fn() + ) + + await expect(service.ensureDefaultWorkspace()).resolves.toBe( + '/mock/userData/workspaces/DeepChat' + ) + expect(mkdirSyncMock).toHaveBeenCalledExactlyOnceWith('/mock/userData/workspaces/DeepChat', { + recursive: true + }) + }) + + it('keeps captured workspace roots stable across snapshots', async () => { + host.documentsDirectory = '/changed/documents' + host.homeDirectory = '/changed/home' + host.userDataDirectory = '/changed/userData' + + const snapshot = await presenter.getSnapshot() + expect(snapshot.defaultChatWorkspacePath).toBe('/mock/documents/DeepChat') + expect(presenter.ensureChatWorkspace().path).toBe('/mock/documents/DeepChat') + }) + it('lazily prepares Chats without changing a custom default workspace', () => { const directories = new Set() statSyncMock.mockImplementation((path) => { @@ -117,7 +149,7 @@ describe('ProjectService', () => { const service = new ProjectService( sqlitePresenter, sqlitePresenter, - deviceService, + host, settings, vi.fn(), publish @@ -154,13 +186,7 @@ describe('ProjectService', () => { }) mkdirSyncMock.mockImplementation((path) => directories.add(path)) const settings = createMockSettingsStore(configuredPath) - const service = new ProjectService( - sqlitePresenter, - sqlitePresenter, - deviceService, - settings, - vi.fn() - ) + const service = new ProjectService(sqlitePresenter, sqlitePresenter, host, settings, vi.fn()) expect(service.getDefaultChatWorkspacePath()).toBeNull() expect(service.ensureChatWorkspace().path).toBe(configuredPath) @@ -186,7 +212,7 @@ describe('ProjectService', () => { const service = new ProjectService( sqlitePresenter, sqlitePresenter, - deviceService, + host, settings, publishDefault ) @@ -226,13 +252,7 @@ describe('ProjectService', () => { updated_at: 40 } ]) - presenter = new ProjectService( - sqlitePresenter, - sqlitePresenter, - deviceService, - settingsStore, - vi.fn() - ) + presenter = new ProjectService(sqlitePresenter, sqlitePresenter, host, settingsStore, vi.fn()) const initial = await presenter.getSnapshot() await presenter.restoreEnvironment('/work/archived') @@ -254,7 +274,7 @@ describe('ProjectService', () => { const first = new ProjectService( sqlitePresenter, sqlitePresenter, - deviceService, + host, settingsStore, vi.fn() ) @@ -265,7 +285,7 @@ describe('ProjectService', () => { const reconstructed = new ProjectService( sqlitePresenter, sqlitePresenter, - deviceService, + host, settingsStore, vi.fn() ) @@ -281,7 +301,7 @@ describe('ProjectService', () => { const reconstructed = new ProjectService( sqlitePresenter, sqlitePresenter, - deviceService, + host, settingsStore, vi.fn() ) @@ -294,7 +314,7 @@ describe('ProjectService', () => { presenter = new ProjectService( sqlitePresenter, sqlitePresenter, - deviceService, + host, createMockSettingsStore(), publishDefaultProjectPathChanged ) @@ -310,7 +330,7 @@ describe('ProjectService', () => { presenter = new ProjectService( sqlitePresenter, sqlitePresenter, - deviceService, + host, createMockSettingsStore(), vi.fn(), publishEnvironmentsChanged @@ -327,13 +347,7 @@ describe('ProjectService', () => { describe('ensureDefaultWorkspace', () => { it('creates and registers the Documents default workspace for first-run users', async () => { const settingsStore = createMockSettingsStore() - presenter = new ProjectService( - sqlitePresenter, - sqlitePresenter, - deviceService, - settingsStore, - vi.fn() - ) + presenter = new ProjectService(sqlitePresenter, sqlitePresenter, host, settingsStore, vi.fn()) await expect(presenter.ensureDefaultWorkspace()).resolves.toBe('/mock/documents/DeepChat') @@ -353,13 +367,7 @@ describe('ProjectService', () => { it('recreates and registers the built-in workspace when it is already the default', async () => { const settingsStore = createMockSettingsStore('/mock/documents/DeepChat') - presenter = new ProjectService( - sqlitePresenter, - sqlitePresenter, - deviceService, - settingsStore, - vi.fn() - ) + presenter = new ProjectService(sqlitePresenter, sqlitePresenter, host, settingsStore, vi.fn()) await expect(presenter.ensureDefaultWorkspace()).resolves.toBe('/mock/documents/DeepChat') @@ -376,13 +384,7 @@ describe('ProjectService', () => { it('does not migrate users with a custom default project path', async () => { const settingsStore = createMockSettingsStore('/work/custom') - presenter = new ProjectService( - sqlitePresenter, - sqlitePresenter, - deviceService, - settingsStore, - vi.fn() - ) + presenter = new ProjectService(sqlitePresenter, sqlitePresenter, host, settingsStore, vi.fn()) await expect(presenter.ensureDefaultWorkspace()).resolves.toBeNull() @@ -395,13 +397,7 @@ describe('ProjectService', () => { sqlitePresenter.newProjectsTable.getAll.mockReturnValue([ { path: '/work/app', name: 'app', icon: null, last_accessed_at: 1000 } ]) - presenter = new ProjectService( - sqlitePresenter, - sqlitePresenter, - deviceService, - settingsStore, - vi.fn() - ) + presenter = new ProjectService(sqlitePresenter, sqlitePresenter, host, settingsStore, vi.fn()) await expect(presenter.ensureDefaultWorkspace()).resolves.toBeNull() @@ -421,13 +417,7 @@ describe('ProjectService', () => { updated_at: 1000 } ]) - presenter = new ProjectService( - sqlitePresenter, - sqlitePresenter, - deviceService, - settingsStore, - vi.fn() - ) + presenter = new ProjectService(sqlitePresenter, sqlitePresenter, host, settingsStore, vi.fn()) await expect(presenter.ensureDefaultWorkspace()).resolves.toBeNull() @@ -443,13 +433,7 @@ describe('ProjectService', () => { throw new Error('documents denied') } }) - presenter = new ProjectService( - sqlitePresenter, - sqlitePresenter, - deviceService, - settingsStore, - vi.fn() - ) + presenter = new ProjectService(sqlitePresenter, sqlitePresenter, host, settingsStore, vi.fn()) try { await expect(presenter.ensureDefaultWorkspace()).resolves.toBe('/mock/home/DeepChat') @@ -783,15 +767,15 @@ describe('ProjectService', () => { describe('openDirectory', () => { it('opens the directory with the system shell', async () => { - openPathMock.mockResolvedValue('') + host.openPath.mockResolvedValue('') await presenter.openDirectory('/work/hello-world') - expect(openPathMock).toHaveBeenCalledWith('/work/hello-world') + expect(host.openPath).toHaveBeenCalledWith('/work/hello-world') }) it('throws when the shell reports an error', async () => { - openPathMock.mockResolvedValue('failed to open') + host.openPath.mockResolvedValue('failed to open') await expect(presenter.openDirectory('/work/hello-world')).rejects.toThrow('failed to open') }) @@ -809,8 +793,18 @@ describe('ProjectService', () => { }) describe('selectDirectory', () => { + it('does not mutate projects or the version when native selection fails', async () => { + host.selectDirectory.mockRejectedValue(new Error('native dialog unavailable')) + + await expect(presenter.selectDirectory()).rejects.toThrow('native dialog unavailable') + + expect(sqlitePresenter.getDatabase).not.toHaveBeenCalled() + expect(sqlitePresenter.newProjectsTable.upsert).not.toHaveBeenCalled() + expect(presenter.getSnapshotVersion()).toBe(0) + }) + it('returns null when user cancels', async () => { - deviceService.selectDirectory.mockResolvedValue({ canceled: true, filePaths: [] }) + host.selectDirectory.mockResolvedValue({ canceled: true, filePaths: [] }) const result = await presenter.selectDirectory() @@ -818,7 +812,7 @@ describe('ProjectService', () => { }) it('returns null when no path selected', async () => { - deviceService.selectDirectory.mockResolvedValue({ canceled: false, filePaths: [] }) + host.selectDirectory.mockResolvedValue({ canceled: false, filePaths: [] }) const result = await presenter.selectDirectory() @@ -826,7 +820,7 @@ describe('ProjectService', () => { }) it('registers a new directory at the top of the active order', async () => { - deviceService.selectDirectory.mockResolvedValue({ + host.selectDirectory.mockResolvedValue({ canceled: false, filePaths: ['/Users/test/my-project'] }) @@ -846,7 +840,7 @@ describe('ProjectService', () => { }) it('keeps the persisted order when selecting an already active directory', async () => { - deviceService.selectDirectory.mockResolvedValue({ + host.selectDirectory.mockResolvedValue({ canceled: false, filePaths: ['/work/existing'] }) @@ -859,7 +853,7 @@ describe('ProjectService', () => { }) it('reactivates an archived directory at the top of the active order', async () => { - deviceService.selectDirectory.mockResolvedValue({ + host.selectDirectory.mockResolvedValue({ canceled: false, filePaths: ['/work/archived'] }) @@ -872,7 +866,7 @@ describe('ProjectService', () => { }) it('keeps concurrent selections on distinct snapshot versions', async () => { - deviceService.selectDirectory + host.selectDirectory .mockResolvedValueOnce({ canceled: false, filePaths: ['/work/first'] }) .mockResolvedValueOnce({ canceled: false, filePaths: ['/work/second'] }) diff --git a/test/main/provider/aiSdkProviderFactory.test.ts b/test/main/provider/aiSdkProviderFactory.test.ts index 9459188f6c..a43decc3a0 100644 --- a/test/main/provider/aiSdkProviderFactory.test.ts +++ b/test/main/provider/aiSdkProviderFactory.test.ts @@ -2,6 +2,7 @@ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' import { generateImage, generateText, streamText } from 'ai' const codexAuthState = vi.hoisted(() => ({ + captureOperation: () => () => undefined, getBackendAuth: vi.fn(), forceRefreshBackendAuth: vi.fn() })) diff --git a/test/main/provider/aihubmixProvider.test.ts b/test/main/provider/aihubmixProvider.test.ts index 51555881c7..12230b1345 100644 --- a/test/main/provider/aihubmixProvider.test.ts +++ b/test/main/provider/aihubmixProvider.test.ts @@ -1,3 +1,4 @@ +import { providerTestEnvironment } from '../../helpers/providerEnvironment' import type { ProviderSettingsPort } from '@/provider/settings' import { beforeEach, describe, expect, it, vi } from 'vitest' import type { LLM_PROVIDER, ModelConfig } from '@shared/types/provider' @@ -62,7 +63,11 @@ describe('AihubmixProvider AI SDK runtime headers', () => { }) it('preserves the DeepChat APP-Code header in AI SDK mode', async () => { - const provider = new AiSdkProvider(createProvider(), createProviderSettings()) + const provider = new AiSdkProvider( + createProvider(), + createProviderSettings(), + providerTestEnvironment + ) ;(provider as any).isInitialized = true for await (const _event of provider.coreStream( @@ -92,7 +97,11 @@ describe('AihubmixProvider AI SDK runtime headers', () => { }) it('treats Seedance models as video generation even when metadata is still chat', async () => { - const provider = new AiSdkProvider(createProvider(), createProviderSettings()) + const provider = new AiSdkProvider( + createProvider(), + createProviderSettings(), + providerTestEnvironment + ) ;(provider as any).isInitialized = true const modelConfig = { diff --git a/test/main/provider/anthropicProvider.test.ts b/test/main/provider/anthropicProvider.test.ts index 60e1c24c0a..08effc1bb7 100644 --- a/test/main/provider/anthropicProvider.test.ts +++ b/test/main/provider/anthropicProvider.test.ts @@ -1,3 +1,4 @@ +import { providerTestEnvironment } from '../../helpers/providerEnvironment' import type { ProviderSettingsPort } from '@/provider/settings' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' import type { LLM_PROVIDER } from '@shared/types/provider' @@ -98,7 +99,8 @@ describe('AiSdkProvider anthropic', () => { createProvider({ apiKey: '' }), - createProviderSettings() + createProviderSettings(), + providerTestEnvironment ) await expect(provider.check()).resolves.toEqual({ @@ -114,7 +116,8 @@ describe('AiSdkProvider anthropic', () => { createProvider({ apiKey: '' }), - createProviderSettings() + createProviderSettings(), + providerTestEnvironment ) ;(provider as any).isInitialized = true @@ -135,7 +138,11 @@ describe('AiSdkProvider anthropic', () => { }) it('passes system prompts through the AI SDK text path', async () => { - const provider = new AiSdkProvider(createProvider(), createProviderSettings()) + const provider = new AiSdkProvider( + createProvider(), + createProviderSettings(), + providerTestEnvironment + ) ;(provider as any).isInitialized = true const signal = new AbortController().signal @@ -161,7 +168,11 @@ describe('AiSdkProvider anthropic', () => { }) it('preserves the legacy positional system prompt argument', async () => { - const provider = new AiSdkProvider(createProvider(), createProviderSettings()) + const provider = new AiSdkProvider( + createProvider(), + createProviderSettings(), + providerTestEnvironment + ) ;(provider as any).isInitialized = true await provider.generateText('hi', 'claude-sonnet-4-5-20250929', 0.2, 32, 'Legacy system prompt') @@ -182,7 +193,11 @@ describe('AiSdkProvider anthropic', () => { }) it('reads model identities without duplicating catalog capability state', async () => { - const provider = new AiSdkProvider(createProvider(), createProviderSettings()) + const provider = new AiSdkProvider( + createProvider(), + createProviderSettings(), + providerTestEnvironment + ) const models = await (provider as any).fetchProviderModels() expect(models).toEqual([ @@ -211,7 +226,8 @@ describe('AiSdkProvider anthropic', () => { name: 'Custom Anthropic', custom: true }), - createProviderSettings() + createProviderSettings(), + providerTestEnvironment ) const models = await provider.fetchModels() @@ -251,7 +267,8 @@ describe('AiSdkProvider anthropic', () => { name: 'Custom Anthropic', custom: true }), - createProviderSettings() + createProviderSettings(), + providerTestEnvironment ) await expect(provider.refreshModels()).rejects.toThrow('Invalid API key') diff --git a/test/main/provider/apimartProvider.test.ts b/test/main/provider/apimartProvider.test.ts index 9fb6b31cf9..0a0c439dba 100644 --- a/test/main/provider/apimartProvider.test.ts +++ b/test/main/provider/apimartProvider.test.ts @@ -1,3 +1,4 @@ +import { providerTestEnvironment } from '../../helpers/providerEnvironment' import type { ProviderSettingsPort } from '@/provider/settings' import { ApiEndpointType, ModelType } from '@shared/model' import type { LLM_PROVIDER, ModelConfig } from '@shared/types/provider' @@ -93,6 +94,8 @@ const createProviderSettings = (): ProviderSettingsPort => const createProviderInstance = (providerSettings = createProviderSettings()) => new ApimartProvider(createProvider(), providerSettings, { + allowInsecureTls: providerTestEnvironment.allowInsecureTls, + defaultHeaders: providerTestEnvironment.defaultHeaders, getLanguage: vi.fn().mockReturnValue('en-US') }) @@ -149,7 +152,11 @@ describe('ApimartProvider', () => { const manager = new ProviderInstanceManager({ providerSettings: createProviderSettings(), - locale: { getLanguage: () => 'en-US' }, + locale: { + allowInsecureTls: providerTestEnvironment.allowInsecureTls, + defaultHeaders: providerTestEnvironment.defaultHeaders, + getLanguage: () => 'en-US' + }, agentSettings: { getAcpEnabled: vi.fn().mockReturnValue(false), getAcpAgents: vi.fn().mockReturnValue([]) diff --git a/test/main/provider/auth/openaiCodex.test.ts b/test/main/provider/auth/openaiCodex.test.ts index 788e019c35..b8aa678ead 100644 --- a/test/main/provider/auth/openaiCodex.test.ts +++ b/test/main/provider/auth/openaiCodex.test.ts @@ -6,11 +6,15 @@ import { OpenAICodexAuth } from '@/provider/auth/openaiCodex' import { OpenAICodexCredentialStore } from '@/provider/auth/openaiCodex/credentialStore' import { createOpenAICodexPkcePair } from '@/provider/auth/openaiCodex/pkce' import { extractProviderFailureMetadata } from '@/provider/providerFailure' +const crypto = { + isAvailable: async () => false, + encrypt: async (value: string) => Buffer.from(value).toString('base64'), + decrypt: async (wrapped: string) => Buffer.from(wrapped, 'base64').toString('utf8') +} const { startOAuthLoopbackCallbackSessionMock } = vi.hoisted(() => ({ startOAuthLoopbackCallbackSessionMock: vi.fn() })) - vi.mock('@/provider/auth/oauthLoopbackCallback', async (importOriginal) => { const actual = await importOriginal() return { @@ -18,14 +22,17 @@ vi.mock('@/provider/auth/oauthLoopbackCallback', async (importOriginal) => { startOAuthLoopbackCallbackSession: startOAuthLoopbackCallbackSessionMock } }) - describe('OpenAI Codex auth', () => { let tempDir: string let files: Map let fdPaths: Map - beforeEach(() => { files = new Map() + vi.mocked(fs.statSync).mockImplementation((file) => { + const raw = files.get(String(file)) + if (raw === undefined) throw Object.assign(new Error('ENOENT'), { code: 'ENOENT' }) + return { size: Buffer.byteLength(raw, 'utf8') } as fs.Stats + }) fdPaths = new Map() let nextFd = 1 tempDir = `/tmp/deepchat-codex-auth-${Date.now()}` @@ -72,7 +79,6 @@ describe('OpenAI Codex auth', () => { vi.mocked(shell.openExternal).mockClear() delete process.env.DEEPCHAT_OPENAI_CODEX_DISABLED }) - afterEach(() => { vi.useRealTimers() vi.unstubAllGlobals() @@ -80,36 +86,30 @@ describe('OpenAI Codex auth', () => { delete process.env.OPENAI_CODEX_REDIRECT_PORT delete process.env.OPENAI_CODEX_REDIRECT_URI }) - it('creates URL-safe PKCE verifier and challenge values', () => { const pair = createOpenAICodexPkcePair() - expect(pair.codeVerifier).toMatch(/^[A-Za-z0-9_-]+$/) expect(pair.codeChallenge).toMatch(/^[A-Za-z0-9_-]+$/) expect(pair.codeVerifier).not.toBe(pair.codeChallenge) }) - it('falls back when the redirect port env value is not a TCP port', async () => { vi.resetModules() process.env.OPENAI_CODEX_REDIRECT_PORT = '1455.5' const decimalPortConstants = await import('@/provider/auth/openaiCodex/constants') expect(decimalPortConstants.OPENAI_CODEX_REDIRECT_PORT).toBe(1455) - vi.resetModules() process.env.OPENAI_CODEX_REDIRECT_PORT = '70000' const outOfRangePortConstants = await import('@/provider/auth/openaiCodex/constants') expect(outOfRangePortConstants.OPENAI_CODEX_REDIRECT_PORT).toBe(1455) - vi.resetModules() process.env.OPENAI_CODEX_REDIRECT_PORT = '65535' const validPortConstants = await import('@/provider/auth/openaiCodex/constants') expect(validPortConstants.OPENAI_CODEX_REDIRECT_PORT).toBe(65535) }) - - it('stores Codex credentials outside provider records', () => { + it('stores Codex credentials outside provider records', async () => { const credentialPath = path.join(tempDir, 'credentials.json') - const store = new OpenAICodexCredentialStore(credentialPath) - store.save({ + const store = new OpenAICodexCredentialStore({ filePath: credentialPath, crypto }) + await store.save({ accessToken: 'access-token', refreshToken: 'refresh-token', tokenType: 'Bearer', @@ -118,7 +118,6 @@ describe('OpenAI Codex auth', () => { accountLabel: 'user@example.com', updatedAt: Date.now() }) - expect(fs.mkdirSync).toHaveBeenCalledWith(path.dirname(credentialPath), { recursive: true, mode: 0o700 @@ -128,14 +127,16 @@ describe('OpenAI Codex auth', () => { expect(fs.openSync).toHaveBeenCalledWith(temporaryPath, 'w', 0o600) expect(fs.fsyncSync).toHaveBeenCalled() expect(fs.renameSync).toHaveBeenCalledWith(temporaryPath, credentialPath) - expect(store.load()?.accessToken).toBe('access-token') - store.clear() - expect(store.load()).toBeNull() + expect((await store.load())?.accessToken).toBe('access-token') + await store.clear() + expect(await store.load()).toBeNull() }) - it('returns full backend auth while keeping status account IDs masked', async () => { - const store = new OpenAICodexCredentialStore(path.join(tempDir, 'credentials.json')) - store.save({ + const store = new OpenAICodexCredentialStore({ + filePath: path.join(tempDir, 'credentials.json'), + crypto + }) + await store.save({ accessToken: 'access-token', refreshToken: 'refresh-token', tokenType: 'Bearer', @@ -144,28 +145,27 @@ describe('OpenAI Codex auth', () => { accountLabel: 'user@example.com', updatedAt: Date.now() }) - - const auth = new OpenAICodexAuth(store, vi.fn()) + const auth = new OpenAICodexAuth(store, vi.fn(), shell.openExternal) const backendAuth = await auth.getBackendAuth() - const status = auth.getStatus() - + const status = await auth.getStatus() expect(backendAuth).toEqual({ accessToken: 'access-token', accountId: 'account-123456789' }) expect(status.accountId).toBe('acco...6789') }) - it('refreshes expired access tokens with single-flight coordination', async () => { - const store = new OpenAICodexCredentialStore(path.join(tempDir, 'credentials.json')) - store.save({ + const store = new OpenAICodexCredentialStore({ + filePath: path.join(tempDir, 'credentials.json'), + crypto + }) + await store.save({ accessToken: 'old-token', refreshToken: 'refresh-token', tokenType: 'Bearer', expiresAt: Date.now() - 1000, updatedAt: Date.now() }) - const fetchMock = vi.fn().mockResolvedValue( new Response( JSON.stringify({ @@ -183,22 +183,22 @@ describe('OpenAI Codex auth', () => { ) ) vi.stubGlobal('fetch', fetchMock) - - const auth = new OpenAICodexAuth(store, vi.fn()) + const auth = new OpenAICodexAuth(store, vi.fn(), shell.openExternal) const [first, second] = await Promise.all([auth.getAccessToken(), auth.getAccessToken()]) - expect(first).toBe('new-token') expect(second).toBe('new-token') expect(fetchMock).toHaveBeenCalledTimes(1) expect(fetchMock.mock.calls[0][1]?.signal).toBeInstanceOf(AbortSignal) - expect(store.load()?.refreshToken).toBe('new-refresh-token') + expect((await store.load())?.refreshToken).toBe('new-refresh-token') }) - it.each([1, 100])( 'requires sign-in after a rejected refresh token with %i message repeats', async (messageRepeats) => { - const store = new OpenAICodexCredentialStore(path.join(tempDir, 'credentials.json')) - store.save({ + const store = new OpenAICodexCredentialStore({ + filePath: path.join(tempDir, 'credentials.json'), + crypto + }) + await store.save({ accessToken: 'expired-token', refreshToken: 'rejected-refresh-token', tokenType: 'Bearer', @@ -217,20 +217,21 @@ describe('OpenAI Codex auth', () => { ) ) vi.stubGlobal('fetch', fetchMock) - const auth = new OpenAICodexAuth(store, vi.fn()) - + const auth = new OpenAICodexAuth(store, vi.fn(), shell.openExternal) await expect(auth.getBackendAuth()).rejects.toMatchObject({ message: 'OpenAI Codex sign-in has expired. Sign in again.', failure: { statusCode: 400, code: 'openai_codex_sign_in_required', retryable: false } }) expect(fetchMock).toHaveBeenCalledOnce() - expect(store.load()?.refreshToken).toBe('rejected-refresh-token') + expect((await store.load())?.refreshToken).toBe('rejected-refresh-token') } ) - it('limits OAuth diagnostic messages after parsing the complete error response', async () => { - const store = new OpenAICodexCredentialStore(path.join(tempDir, 'credentials.json')) - store.save({ + const store = new OpenAICodexCredentialStore({ + filePath: path.join(tempDir, 'credentials.json'), + crypto + }) + await store.save({ accessToken: 'expired-token', refreshToken: 'refresh-token', tokenType: 'Bearer', @@ -241,14 +242,12 @@ describe('OpenAI Codex auth', () => { 'fetch', vi.fn().mockResolvedValue(new Response('x'.repeat(2000), { status: 500 })) ) - const auth = new OpenAICodexAuth(store, vi.fn()) - + const auth = new OpenAICodexAuth(store, vi.fn(), shell.openExternal) const failure = await auth.getBackendAuth().catch((error) => error) expect(failure).toBeInstanceOf(Error) expect(failure.message).toHaveLength(1000) expect(failure.failure).toEqual({ statusCode: 500 }) }) - it('opens browser login externally and completes from a pasted callback URL', async () => { startOAuthLoopbackCallbackSessionMock.mockImplementationOnce( async (options: { expectedState: string; path: string }) => { @@ -256,11 +255,12 @@ describe('OpenAI Codex auth', () => { const redirectUri = `http://localhost:43123${callbackPath}` let resolveCallback!: (value: { code: string }) => void let rejectCallback!: (error: Error) => void - const callbackPromise = new Promise<{ code: string }>((resolve, reject) => { + const callbackPromise = new Promise<{ + code: string + }>((resolve, reject) => { resolveCallback = resolve rejectCallback = reject }) - return { redirectUri, waitForCallback: vi.fn(() => callbackPromise), @@ -273,7 +273,6 @@ describe('OpenAI Codex auth', () => { rejectCallback(error) return { kind: 'failure' as const, error, url: callbackUrl.toString() } } - const result = { kind: 'success' as const, code, @@ -287,8 +286,10 @@ describe('OpenAI Codex auth', () => { } } ) - - const store = new OpenAICodexCredentialStore(path.join(tempDir, 'browser.json')) + const store = new OpenAICodexCredentialStore({ + filePath: path.join(tempDir, 'browser.json'), + crypto + }) const fetchMock = vi.fn().mockResolvedValue( new Response( JSON.stringify({ @@ -306,64 +307,51 @@ describe('OpenAI Codex auth', () => { ) ) vi.stubGlobal('fetch', fetchMock) - - const auth = new OpenAICodexAuth(store, vi.fn()) - + const auth = new OpenAICodexAuth(store, vi.fn(), shell.openExternal) const status = await auth.startBrowserLogin() const authUrl = new URL(vi.mocked(shell.openExternal).mock.calls[0][0]) const redirectUri = authUrl.searchParams.get('redirect_uri')! const state = authUrl.searchParams.get('state')! - expect(status.state).toBe('pending-browser') - expect(store.load()).toBeNull() + expect(await store.load()).toBeNull() expect(shell.openExternal).toHaveBeenCalledWith( expect.stringContaining('https://auth.openai.com/oauth/authorize') ) - const callbackUrl = new URL(redirectUri) callbackUrl.searchParams.set('code', 'browser-code') callbackUrl.searchParams.set('state', state) await auth.completeBrowserLoginFromCallbackUrl(callbackUrl.toString()) - - await vi.waitFor(() => expect(store.load()?.accessToken).toBe('browser-token')) - expect(auth.getStatus().state).toBe('authenticated') + await vi.waitFor(async () => expect((await store.load())?.accessToken).toBe('browser-token')) + expect((await auth.getStatus()).state).toBe('authenticated') }) - it('honors the environment kill switch', async () => { process.env.DEEPCHAT_OPENAI_CODEX_DISABLED = 'true' const auth = new OpenAICodexAuth( - new OpenAICodexCredentialStore(path.join(tempDir, 'credentials.json')), - vi.fn() + new OpenAICodexCredentialStore({ filePath: path.join(tempDir, 'credentials.json'), crypto }), + vi.fn(), + shell.openExternal ) - - expect(auth.getStatus().state).toBe('disabled') + expect((await auth.getStatus()).state).toBe('disabled') await expect(auth.getAccessToken()).rejects.toThrow('disabled') }) - it('prefers the credential-store load error over a stale login error', async () => { const credentialPath = path.join(tempDir, 'credentials.json') - const store = new OpenAICodexCredentialStore(credentialPath) - const auth = new OpenAICodexAuth(store, vi.fn()) - + const store = new OpenAICodexCredentialStore({ filePath: credentialPath, crypto }) + const auth = new OpenAICodexAuth(store, vi.fn(), shell.openExternal) await auth.completeBrowserLoginFromCallbackUrl('https://example.com/callback') - files.set(credentialPath, '{broken') - const status = auth.getStatus() - + const status = await auth.getStatus() expect(status.state).toBe('error') expect(status.error).toContain('not valid JSON') }) - it.each(['getBackendAuth', 'forceRefreshBackendAuth'] as const)( 'keeps credential-store load errors separate from sign-in errors in %s', async (method) => { vi.spyOn(console, 'warn').mockImplementation(() => {}) const credentialPath = path.join(tempDir, 'credentials.json') - const store = new OpenAICodexCredentialStore(credentialPath) - const auth = new OpenAICodexAuth(store, vi.fn()) - + const store = new OpenAICodexCredentialStore({ filePath: credentialPath, crypto }) + const auth = new OpenAICodexAuth(store, vi.fn(), shell.openExternal) files.set(credentialPath, '{broken') - const failure = await auth[method]().catch((error) => error) expect(failure).toBeInstanceOf(Error) expect(failure.message).toMatch(/not valid JSON/) @@ -373,4 +361,66 @@ describe('OpenAI Codex auth', () => { expect(files.get(credentialPath)).toBe('{broken') } ) + it('keeps a newly signed-in account after an older refresh resolves late', async () => { + const store = new OpenAICodexCredentialStore({ + filePath: path.join(tempDir, 'account.json'), + crypto + }) + await store.save({ + accessToken: 'old-account', + refreshToken: 'old-refresh', + tokenType: 'Bearer', + expiresAt: 0, + updatedAt: 42 + }) + let refreshEntered!: () => void + let finishRefresh!: (response: Response) => void + const entered = new Promise((resolve) => { + refreshEntered = resolve + }) + let finishCallback!: (value: { code: string }) => void + const callback = new Promise<{ code: string }>((resolve) => { + finishCallback = resolve + }) + startOAuthLoopbackCallbackSessionMock.mockResolvedValueOnce({ + redirectUri: 'http://localhost:43123/auth/callback', + waitForCallback: () => callback, + resolveCallbackUrl: () => { + finishCallback({ code: 'new-account-code' }) + return { kind: 'success', code: 'new-account-code' } + }, + close: vi.fn() + }) + vi.stubGlobal( + 'fetch', + vi.fn(async (_input, init) => { + if (new URLSearchParams(String(init?.body)).get('grant_type') === 'refresh_token') { + refreshEntered() + return new Promise((resolve) => { + finishRefresh = resolve + }) + } + return Response.json({ + access_token: 'new-account', + refresh_token: 'new-refresh', + token_type: 'Bearer', + expires_in: 86400 + }) + }) + ) + const auth = new OpenAICodexAuth(store, vi.fn(), shell.openExternal) + const refreshing = auth.forceRefreshAccessToken() + const rejected = expect(refreshing).rejects.toMatchObject({ name: 'AbortError' }) + await entered + await auth.startBrowserLogin() + await auth.completeBrowserLoginFromCallbackUrl( + 'http://localhost:43123/auth/callback?code=new-account-code' + ) + expect((await store.load())?.accessToken).toBe('new-account') + finishRefresh(Response.json({ access_token: 'late-old-account', expires_in: 86400 })) + await rejected + expect((await store.load())?.accessToken).toBe('new-account') + expect((await auth.getStatus()).authenticated).toBe(true) + auth.stop() + }) }) diff --git a/test/main/provider/auth/providerOAuthCredentials.test.ts b/test/main/provider/auth/providerOAuthCredentials.test.ts new file mode 100644 index 0000000000..1b0e676a92 --- /dev/null +++ b/test/main/provider/auth/providerOAuthCredentials.test.ts @@ -0,0 +1,334 @@ +import * as fs from 'node:fs' +import { join } from 'node:path' +import { tmpdir } from 'node:os' +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' +import type { CredentialCryptoPort } from '@/config/secretStore' +import { OpenAICodexCredentialStore } from '@/provider/auth/openaiCodex/credentialStore' +import { XaiGrokCredentialStore } from '@/provider/auth/xaiGrok/credentialStore' +import { OpenAICodexAuth } from '@/provider/auth/openaiCodex' +import { XaiGrokAuth } from '@/provider/auth/xaiGrok' + +vi.mock('node:fs', async (importOriginal) => ({ + ...(await importOriginal()) +})) + +const deferred = () => { + let resolve!: (value: T) => void + const promise = new Promise((done) => { + resolve = done + }) + return { promise, resolve } +} + +const providers = [ + { + name: 'Codex', + create: (options: { filePath: string; crypto: CredentialCryptoPort }) => { + const store = new OpenAICodexCredentialStore(options) + return { + store, + auth: new OpenAICodexAuth( + store, + vi.fn(), + vi.fn(async () => undefined) + ) + } + } + }, + { + name: 'Grok', + create: (options: { filePath: string; crypto: CredentialCryptoPort }) => { + const store = new XaiGrokCredentialStore(options) + return { + store, + auth: new XaiGrokAuth( + store, + vi.fn(), + vi.fn(async () => undefined) + ) + } + } + } +] +const tokens = (accessToken = 'original') => ({ + accessToken, + refreshToken: 'fixture-refresh', + tokenType: 'Bearer', + expiresAt: 0, + updatedAt: 42 +}) + +for (const provider of providers) + describe(`${provider.name} private credential ownership`, () => { + let directory: string + let filePath: string + let crypto: { + isAvailable: ReturnType Promise>> + encrypt: ReturnType Promise>> + decrypt: ReturnType Promise>> + } + let owner: ReturnType + + beforeEach(() => { + directory = fs.mkdtempSync(join(tmpdir(), 'deepchat-provider-oauth-')) + filePath = join(directory, 'credentials.json') + crypto = { + isAvailable: vi.fn(async () => true), + encrypt: vi.fn(async (value: string) => Buffer.from(value).toString('base64')), + decrypt: vi.fn(async (wrapped: string) => Buffer.from(wrapped, 'base64').toString('utf8')) + } + owner = provider.create({ filePath, crypto }) + }) + + afterEach(() => { + owner.auth.stop() + vi.unstubAllGlobals() + vi.restoreAllMocks() + fs.rmSync(directory, { recursive: true, force: true }) + }) + + it('distinguishes a missing file from an unreadable credential', async () => { + const warn = vi.spyOn(console, 'warn').mockImplementation(() => undefined) + expect(await owner.store.load()).toBeNull() + expect(owner.store.getLoadError()).toBeNull() + expect(warn).not.toHaveBeenCalled() + await owner.store.save(tokens()) + const before = fs.readFileSync(filePath, 'utf8') + crypto.decrypt.mockRejectedValue(new Error('keyring locked')) + expect(await owner.store.load()).toBeNull() + expect(owner.store.getLoadError()).toContain('decryption failed') + expect(fs.readFileSync(filePath, 'utf8')).toBe(before) + await owner.store.save(tokens('replacement')) + expect(fs.existsSync(`${filePath}.corrupt`)).toBe(false) + crypto.decrypt.mockImplementation(async (wrapped) => + Buffer.from(wrapped, 'base64').toString('utf8') + ) + expect((await owner.store.load())?.accessToken).toBe('replacement') + expect(owner.store.getLoadError()).toBeNull() + }) + + it('rejects oversized payloads before native wrapping', async () => { + await owner.store.save(tokens()) + const before = fs.readFileSync(filePath, 'utf8') + crypto.encrypt.mockClear() + await expect(owner.store.save(tokens('x'.repeat(8 * 1024 * 1024)))).rejects.toThrow( + 'oversized' + ) + expect(crypto.encrypt).not.toHaveBeenCalled() + expect(fs.readFileSync(filePath, 'utf8')).toBe(before) + }) + + it('keeps encrypted reads byte-identical and preserves the file fallback policy', async () => { + await owner.store.save(tokens()) + const before = fs.readFileSync(filePath, 'utf8') + expect(await owner.store.load()).toMatchObject(tokens()) + expect(fs.readFileSync(filePath, 'utf8')).toBe(before) + expect(before).not.toContain('fixture-refresh') + expect(fs.statSync(filePath).mode & 0o777).toBe(0o600) + crypto.isAvailable.mockResolvedValue(false) + await owner.store.save(tokens('file-fallback')) + expect(fs.readdirSync(directory)).toEqual(['credentials.json']) + expect(JSON.parse(fs.readFileSync(filePath, 'utf8'))).toMatchObject({ + version: 1, + storage: 'file', + tokens: { accessToken: 'file-fallback' } + }) + }) + + it.each(['encrypt', 'fsync', 'rename'] as const)( + 'preserves the previous file after %s failure and recovers', + async (failure) => { + await owner.store.save(tokens()) + const before = fs.readFileSync(filePath, 'utf8') + if (failure === 'encrypt') crypto.encrypt.mockRejectedValueOnce(new Error('native failure')) + if (failure === 'fsync') + vi.spyOn(fs, 'fsyncSync').mockImplementationOnce(() => { + throw new Error('flush failure') + }) + if (failure === 'rename') + vi.spyOn(fs, 'renameSync').mockImplementationOnce(() => { + throw new Error('rename failure') + }) + await expect(owner.store.save(tokens('replacement'))).rejects.toThrow('failure') + expect(fs.readFileSync(filePath, 'utf8')).toBe(before) + expect(fs.readdirSync(directory)).toEqual(['credentials.json']) + expect((await owner.store.load())?.accessToken).toBe('original') + await owner.store.save(tokens('recovered')) + expect((await owner.store.load())?.accessToken).toBe('recovered') + } + ) + + it('backs up corrupt contents and removes all private artifacts through clear', async () => { + fs.writeFileSync(filePath, '{broken') + expect(await owner.store.load()).toBeNull() + expect(owner.store.getLoadError()).toContain('not valid JSON') + await owner.store.save(tokens()) + expect(owner.store.getLoadError()).toBeNull() + expect(fs.readFileSync(`${filePath}.corrupt`, 'utf8')).toBe('{broken') + fs.writeFileSync(`${filePath}.tmp-stale`, 'stale') + fs.writeFileSync(`${filePath}.tmp`, 'legacy') + fs.writeFileSync(join(directory, 'unrelated.txt'), 'unrelated') + await owner.store.clear() + expect(fs.readdirSync(directory)).toEqual(['unrelated.txt']) + }) + + it('coalesces pending decrypts and rejects both results after durable removal', async () => { + await owner.store.save(tokens()) + const raw = Buffer.from( + JSON.parse(fs.readFileSync(filePath, 'utf8')).wrapped, + 'base64' + ).toString('utf8') + const entered = deferred() + const gate = deferred() + crypto.decrypt.mockImplementationOnce(() => { + entered.resolve() + return gate.promise + }) + const reads = [owner.store.load(), owner.store.load()] + const results = Promise.allSettled(reads) + await entered.promise + expect(crypto.decrypt).toHaveBeenCalledOnce() + await owner.store.clear() + gate.resolve(raw) + expect((await results).every((item) => item.status === 'rejected')).toBe(true) + expect(await owner.store.load()).toBeNull() + expect(fs.existsSync(filePath)).toBe(false) + }) + + it('serializes save/clear/save without exposing a superseded file', async () => { + await Promise.all([ + owner.store.save(tokens('first')), + owner.store.clear(), + owner.store.save(tokens('last')) + ]) + expect((await owner.store.load())?.accessToken).toBe('last') + const reopened = provider.create({ filePath, crypto }) + expect((await reopened.store.load())?.accessToken).toBe('last') + reopened.auth.stop() + }) + + it('reserves control capacity and stops pending native writes and queued mutations', async () => { + const entered = deferred() + const gate = deferred() + crypto.encrypt.mockImplementationOnce(() => { + entered.resolve() + return gate.promise + }) + const normal = Array.from({ length: 24 }, () => owner.store.save(tokens())) + await entered.promise + await expect(owner.store.save(tokens('overflow'))).rejects.toThrow('queue is full') + const control = Array.from({ length: 8 }, () => owner.store.clear()) + const results = Promise.allSettled([...normal, ...control]) + await expect(owner.store.clear()).rejects.toThrow('queue is full') + owner.auth.stop() + gate.resolve('late') + expect((await results).every((item) => item.status === 'rejected')).toBe(true) + expect(fs.existsSync(filePath)).toBe(false) + expect(crypto.encrypt).toHaveBeenCalledOnce() + }) + + it('still removes known private artifacts when directory enumeration fails', async () => { + await owner.store.save(tokens()) + fs.writeFileSync(`${filePath}.corrupt`, 'backup') + fs.writeFileSync(`${filePath}.tmp`, 'temporary') + vi.spyOn(fs, 'readdirSync').mockImplementationOnce(() => { + throw new Error('directory denied') + }) + await expect(owner.store.clear()).rejects.toThrow('cleanup failed') + expect(fs.readdirSync(directory)).toEqual([]) + }) + + it('does not acknowledge logout while credential deletion fails', async () => { + await owner.store.save(tokens()) + fs.writeFileSync(`${filePath}.corrupt`, 'backup') + fs.writeFileSync(`${filePath}.tmp`, 'temporary') + const remove = fs.rmSync + vi.spyOn(fs, 'rmSync').mockImplementation((path, options) => { + if (String(path) === filePath) throw new Error('denied') + return remove(path, options) + }) + await expect(owner.auth.logout()).rejects.toThrow('cleanup failed') + expect((await owner.auth.getStatus()).authenticated).toBe(true) + expect(fs.existsSync(filePath)).toBe(true) + expect(fs.readdirSync(directory)).toEqual(['credentials.json']) + }) + + it('waits for a late refresh wrap before logout removes the final file', async () => { + await owner.store.save(tokens()) + const entered = deferred() + const gate = deferred() + crypto.encrypt.mockImplementationOnce(() => { + entered.resolve() + return gate.promise + }) + vi.stubGlobal( + 'fetch', + vi.fn(async (input) => + String(input).includes('openid-configuration') + ? Response.json({ + device_authorization_endpoint: 'https://auth.x.ai/device', + token_endpoint: 'https://auth.x.ai/token', + revocation_endpoint: 'https://auth.x.ai/revoke' + }) + : Response.json({ access_token: 'refreshed', expires_in: 86400 }) + ) + ) + const refreshing = owner.auth.forceRefreshAccessToken() + const rejected = expect(refreshing).rejects.toMatchObject({ name: 'AbortError' }) + await entered.promise + const loggedOut = owner.auth.logout() + gate.resolve(Buffer.from(JSON.stringify(tokens('refreshed'))).toString('base64')) + await rejected + expect((await loggedOut).authenticated).toBe(false) + expect(fs.existsSync(filePath)).toBe(false) + }) + + it('aborts a refresh response body on stop without changing credentials', async () => { + await owner.store.save(tokens()) + const before = fs.readFileSync(filePath, 'utf8') + const entered = deferred() + vi.stubGlobal( + 'fetch', + vi.fn(async (input) => { + if (String(input).includes('openid-configuration')) + return Response.json({ + device_authorization_endpoint: 'https://auth.x.ai/device', + token_endpoint: 'https://auth.x.ai/token' + }) + entered.resolve() + return new Response(new ReadableStream()) + }) + ) + const pending = owner.auth.forceRefreshAccessToken() + const rejected = expect(pending).rejects.toMatchObject({ name: 'AbortError' }) + await entered.promise + owner.auth.stop() + await rejected + expect(fs.readFileSync(filePath, 'utf8')).toBe(before) + }) + + it.each(['declared', 'streamed'] as const)( + 'rejects oversized %s auth data before a credential write', + async (size) => { + await owner.store.save(tokens()) + const before = fs.readFileSync(filePath, 'utf8') + vi.stubGlobal( + 'fetch', + vi.fn(async (input) => + String(input).includes('openid-configuration') + ? Response.json({ + device_authorization_endpoint: 'https://auth.x.ai/device', + token_endpoint: 'https://auth.x.ai/token' + }) + : size === 'declared' + ? new Response('oversized', { + headers: { 'content-length': String(8 * 1024 * 1024 + 1) } + }) + : new Response(new Uint8Array(8 * 1024 * 1024 + 1)) + ) + ) + await expect(owner.auth.forceRefreshAccessToken()).rejects.toThrow('size limit') + expect(fs.readFileSync(filePath, 'utf8')).toBe(before) + } + ) + }) diff --git a/test/main/provider/auth/xaiGrok.test.ts b/test/main/provider/auth/xaiGrok.test.ts index bcf080b1fd..b3c674b942 100644 --- a/test/main/provider/auth/xaiGrok.test.ts +++ b/test/main/provider/auth/xaiGrok.test.ts @@ -10,6 +10,11 @@ import { isTrustedXaiOAuthEndpoint } from '@/provider/auth/xaiGrok/constants' import { createXaiGrokFetch, shouldUseXaiGrokOAuthFetch } from '@/provider/xaiGrokAuthAdapter' +const crypto = { + isAvailable: async () => false, + encrypt: async (value: string) => Buffer.from(value).toString('base64'), + decrypt: async (wrapped: string) => Buffer.from(wrapped, 'base64').toString('utf8') +} function jsonResponse(value: unknown, init?: ResponseInit): Response { return new Response(JSON.stringify(value), { @@ -18,14 +23,17 @@ function jsonResponse(value: unknown, init?: ResponseInit): Response { ...init }) } - describe('xAI Grok OAuth', () => { let tempDir: string let files: Map let fdPaths: Map - beforeEach(() => { files = new Map() + vi.mocked(fs.statSync).mockImplementation((file) => { + const raw = files.get(String(file)) + if (raw === undefined) throw Object.assign(new Error('ENOENT'), { code: 'ENOENT' }) + return { size: Buffer.byteLength(raw, 'utf8') } as fs.Stats + }) fdPaths = new Map() let nextFd = 1 tempDir = `/tmp/deepchat-xai-grok-auth-${Date.now()}` @@ -73,7 +81,6 @@ describe('xAI Grok OAuth', () => { delete process.env.XAI_GROK_ACCESS_TOKEN resetGlobalXaiGrokAuthForTests() }) - afterEach(() => { vi.useRealTimers() vi.unstubAllGlobals() @@ -81,7 +88,6 @@ describe('xAI Grok OAuth', () => { delete process.env.XAI_GROK_ACCESS_TOKEN resetGlobalXaiGrokAuthForTests() }) - it('accepts only trusted xAI OAuth endpoints', () => { expect(isTrustedXaiOAuthEndpoint('https://auth.x.ai/oauth2/token')).toBe(true) expect(isTrustedXaiOAuthEndpoint('https://accounts.x.ai/oauth2/token')).toBe(true) @@ -91,7 +97,6 @@ describe('xAI Grok OAuth', () => { expect(isTrustedXaiApiEndpoint('https://api.x.ai/v1/chat/completions')).toBe(true) expect(isTrustedXaiApiEndpoint('https://api.x.ai.evil.test/v1')).toBe(false) }) - it('enables OAuth injection only for the built-in Grok provider on xAI endpoints', () => { const provider = { id: 'grok', @@ -101,7 +106,6 @@ describe('xAI Grok OAuth', () => { baseUrl: 'https://api.x.ai/v1', enable: true } - expect(shouldUseXaiGrokOAuthFetch(provider)).toBe(true) expect( shouldUseXaiGrokOAuthFetch({ @@ -116,7 +120,6 @@ describe('xAI Grok OAuth', () => { }) ).toBe(false) }) - it('refuses to send credentials when a wrapped request targets an untrusted endpoint', async () => { const underlyingFetch = vi.fn() const fetcher = createXaiGrokFetch( @@ -131,27 +134,24 @@ describe('xAI Grok OAuth', () => { {}, underlyingFetch ) - await expect(fetcher('https://attacker.example.com/v1/models')).rejects.toThrow( 'untrusted API endpoint' ) expect(underlyingFetch).not.toHaveBeenCalled() }) - - it('stores Grok OAuth credentials outside provider records', () => { + it('stores Grok OAuth credentials outside provider records', async () => { const credentialPath = path.join(tempDir, 'credentials.json') - const store = new XaiGrokCredentialStore(credentialPath) - store.save({ + const store = new XaiGrokCredentialStore({ filePath: credentialPath, crypto }) + await store.save({ accessToken: 'access-token', refreshToken: 'refresh-token', tokenType: 'Bearer', - expiresAt: Date.now() + 3600_000, + expiresAt: Date.now() + 3600000, accountId: 'account-id', accountLabel: 'user@example.com', tokenEndpoint: 'https://auth.x.ai/oauth2/token', updatedAt: Date.now() }) - expect(fs.mkdirSync).toHaveBeenCalledWith(path.dirname(credentialPath), { recursive: true, mode: 0o700 @@ -161,18 +161,15 @@ describe('xAI Grok OAuth', () => { expect(fs.openSync).toHaveBeenCalledWith(temporaryPath, 'w', 0o600) expect(fs.fsyncSync).toHaveBeenCalled() expect(fs.renameSync).toHaveBeenCalledWith(temporaryPath, credentialPath) - - const loaded = store.load() + const loaded = await store.load() expect(loaded?.accessToken).toBe('access-token') expect(loaded?.refreshToken).toBe('refresh-token') expect(loaded?.accountLabel).toBe('user@example.com') }) - it('completes device-code login and exposes authenticated status', async () => { const credentialPath = path.join(tempDir, 'credentials.json') - const store = new XaiGrokCredentialStore(credentialPath) - const auth = new XaiGrokAuth(store, vi.fn()) - + const store = new XaiGrokCredentialStore({ filePath: credentialPath, crypto }) + const auth = new XaiGrokAuth(store, vi.fn(), shell.openExternal) const fetchImpl = vi.fn(async (input, init) => { const url = String(input) if (url.includes('.well-known/openid-configuration')) { @@ -212,27 +209,23 @@ describe('xAI Grok OAuth', () => { throw new Error(`Unexpected fetch: ${url}`) }) vi.stubGlobal('fetch', fetchImpl) - const pending = await auth.startDeviceLogin() expect(pending.state).toBe('pending-device') expect(pending.userCode).toBe('ABCD-EFGH') expect(shell.openExternal).toHaveBeenCalled() - // Wait for background poll to finish - await vi.waitFor(() => { - expect(auth.getStatus().authenticated).toBe(true) + await vi.waitFor(async () => { + expect((await auth.getStatus()).authenticated).toBe(true) }) - - const status = auth.getStatus() + const status = await auth.getStatus() expect(status.state).toBe('authenticated') expect(status.accountLabel).toBe('grok@example.com') expect(await auth.ensureAccessToken()).toBe('access-1') }) - it('refreshes near-expiry access tokens', async () => { const credentialPath = path.join(tempDir, 'credentials.json') - const store = new XaiGrokCredentialStore(credentialPath) - store.save({ + const store = new XaiGrokCredentialStore({ filePath: credentialPath, crypto }) + await store.save({ accessToken: 'access-old', refreshToken: 'refresh-1', tokenType: 'Bearer', @@ -240,8 +233,7 @@ describe('xAI Grok OAuth', () => { tokenEndpoint: 'https://auth.x.ai/oauth2/token', updatedAt: Date.now() }) - const auth = new XaiGrokAuth(store, vi.fn()) - + const auth = new XaiGrokAuth(store, vi.fn(), shell.openExternal) const fetchImpl = vi.fn(async (input, init) => { const url = String(input) expect(url).toBe('https://auth.x.ai/oauth2/token') @@ -253,62 +245,47 @@ describe('xAI Grok OAuth', () => { }) }) vi.stubGlobal('fetch', fetchImpl) - const token = await auth.ensureAccessToken() expect(token).toBe('access-new') - expect(store.load()?.accessToken).toBe('access-new') + expect((await store.load())?.accessToken).toBe('access-new') }) - it('coordinates concurrent forced token refreshes', async () => { const credentialPath = path.join(tempDir, 'credentials.json') - const store = new XaiGrokCredentialStore(credentialPath) - store.save({ + const store = new XaiGrokCredentialStore({ filePath: credentialPath, crypto }) + await store.save({ accessToken: 'access-old', refreshToken: 'refresh-1', tokenType: 'Bearer', - expiresAt: Date.now() + 3600_000, + expiresAt: Date.now() + 3600000, tokenEndpoint: 'https://auth.x.ai/oauth2/token', updatedAt: Date.now() }) - const auth = new XaiGrokAuth(store, vi.fn()) + const auth = new XaiGrokAuth(store, vi.fn(), shell.openExternal) const fetchImpl = vi.fn(async () => jsonResponse({ access_token: 'access-new', expires_in: 3600 }) ) vi.stubGlobal('fetch', fetchImpl) - await expect( Promise.all([auth.forceRefreshAccessToken(), auth.forceRefreshAccessToken()]) ).resolves.toEqual(['access-new', 'access-new']) expect(fetchImpl).toHaveBeenCalledTimes(1) }) - - it('does not expose an expired access token to synchronous request paths', () => { - const store = new XaiGrokCredentialStore(path.join(tempDir, 'credentials.json')) - store.save({ - accessToken: 'access-expired', - refreshToken: 'refresh-1', - tokenType: 'Bearer', - expiresAt: Date.now() - 1000, - tokenEndpoint: 'https://auth.x.ai/oauth2/token', - updatedAt: Date.now() - }) - - expect(new XaiGrokAuth(store, vi.fn()).peekAccessToken()).toBeNull() - }) - - it('reports disabled state when kill switch is set', () => { + it('reports disabled state when kill switch is set', async () => { process.env.DEEPCHAT_XAI_GROK_OAUTH_DISABLED = '1' - const auth = new XaiGrokAuth(new XaiGrokCredentialStore(path.join(tempDir, 'c.json')), vi.fn()) - expect(auth.getStatus()).toMatchObject({ + const auth = new XaiGrokAuth( + new XaiGrokCredentialStore({ filePath: path.join(tempDir, 'c.json'), crypto }), + vi.fn(), + shell.openExternal + ) + expect(await auth.getStatus()).toMatchObject({ state: 'disabled', authenticated: false }) }) - it('prefers the credential-store load error over a stale login error', async () => { const credentialPath = path.join(tempDir, 'credentials.json') - const store = new XaiGrokCredentialStore(credentialPath) - store.save({ + const store = new XaiGrokCredentialStore({ filePath: credentialPath, crypto }) + await store.save({ accessToken: 'access-old', refreshToken: 'refresh-1', tokenType: 'Bearer', @@ -316,32 +293,83 @@ describe('xAI Grok OAuth', () => { tokenEndpoint: 'https://auth.x.ai/oauth2/token', updatedAt: Date.now() }) - const auth = new XaiGrokAuth(store, vi.fn()) + const auth = new XaiGrokAuth(store, vi.fn(), shell.openExternal) vi.stubGlobal( 'fetch', vi.fn(async () => { throw new Error('network down') }) ) - await expect(auth.ensureAccessToken()).rejects.toThrow('network down') - files.set(credentialPath, '{broken') - const status = auth.getStatus() - + const status = await auth.getStatus() expect(status.state).toBe('error') expect(status.error).toContain('not valid JSON') }) - it('rejects access token requests with the credential-store load error', async () => { vi.spyOn(console, 'warn').mockImplementation(() => {}) const credentialPath = path.join(tempDir, 'credentials.json') - const store = new XaiGrokCredentialStore(credentialPath) - const auth = new XaiGrokAuth(store, vi.fn()) - + const store = new XaiGrokCredentialStore({ filePath: credentialPath, crypto }) + const auth = new XaiGrokAuth(store, vi.fn(), shell.openExternal) files.set(credentialPath, '{broken') - await expect(auth.getAccessToken()).rejects.toThrow(/not valid JSON/) await expect(auth.forceRefreshAccessToken()).rejects.toThrow(/not valid JSON/) }) + it('rejects late discovery without canceling the replacement device flow', async () => { + const store = new XaiGrokCredentialStore({ + filePath: path.join(tempDir, 'discovery.json'), + crypto + }) + const auth = new XaiGrokAuth(store, vi.fn(), shell.openExternal) + let finishDiscovery!: (response: Response) => void + let finishPoll!: (response: Response) => void + let discoveryEntered!: () => void + const entered = new Promise((resolve) => { + discoveryEntered = resolve + }) + const discovery = { + device_authorization_endpoint: 'https://auth.x.ai/device', + token_endpoint: 'https://auth.x.ai/token' + } + let discoveries = 0 + vi.stubGlobal( + 'fetch', + vi.fn(async (input) => { + if (String(input).includes('openid-configuration')) { + if (++discoveries === 1) { + discoveryEntered() + return new Promise((resolve) => { + finishDiscovery = resolve + }) + } + return Response.json(discovery) + } + if (String(input).endsWith('/device')) + return Response.json({ + device_code: 'current-code', + user_code: 'CURRENT', + verification_uri: 'https://auth.x.ai/verify', + expires_in: 600, + interval: 5 + }) + return new Promise((resolve) => { + finishPoll = resolve + }) + }) + ) + const first = auth.startDeviceLogin() + const rejected = expect(first).rejects.toMatchObject({ name: 'AbortError' }) + await entered + const current = await auth.startDeviceLogin() + expect(current.userCode).toBe('CURRENT') + finishDiscovery(Response.json(discovery)) + await rejected + expect((await auth.getStatus()).userCode).toBe('CURRENT') + expect(shell.openExternal).toHaveBeenCalledOnce() + const canceled = auth.cancelLogin() + finishPoll(Response.json({ access_token: 'late-device-token', expires_in: 86400 })) + await canceled + expect(await store.load()).toBeNull() + auth.stop() + }) }) diff --git a/test/main/provider/awsBedrockProvider.test.ts b/test/main/provider/awsBedrockProvider.test.ts index 5fe02e1f93..d626615500 100644 --- a/test/main/provider/awsBedrockProvider.test.ts +++ b/test/main/provider/awsBedrockProvider.test.ts @@ -1,3 +1,4 @@ +import { providerTestEnvironment } from '../../helpers/providerEnvironment' import type { ProviderSettingsPort } from '@/provider/settings' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' import type { AWS_BEDROCK_PROVIDER } from '@shared/types/provider' @@ -125,7 +126,8 @@ describe('AiSdkProvider aws-bedrock', () => { createProvider({ credential: undefined }), - createProviderSettings() + createProviderSettings(), + providerTestEnvironment ) await expect(provider.check()).resolves.toEqual({ isOk: true, errorMsg: null }) @@ -144,7 +146,11 @@ describe('AiSdkProvider aws-bedrock', () => { ] }) - const provider = new AiSdkProvider(createProvider(), createProviderSettings()) + const provider = new AiSdkProvider( + createProvider(), + createProviderSettings(), + providerTestEnvironment + ) const models = await provider.fetchModels() expect(models).toEqual([ @@ -163,7 +169,11 @@ describe('AiSdkProvider aws-bedrock', () => { it('falls back to the provider DB snapshot when the Bedrock catalog lookup fails', async () => { mockBedrockSend.mockRejectedValue(new Error('catalog unavailable')) - const provider = new AiSdkProvider(createProvider(), createProviderSettings()) + const provider = new AiSdkProvider( + createProvider(), + createProviderSettings(), + providerTestEnvironment + ) const models = await provider.fetchModels() expect(models).toEqual([ @@ -185,7 +195,11 @@ describe('AiSdkProvider aws-bedrock', () => { ] }) - const provider = new AiSdkProvider(createProvider(), createProviderSettings()) + const provider = new AiSdkProvider( + createProvider(), + createProviderSettings(), + providerTestEnvironment + ) ;(provider as any).isInitialized = true await expect(provider.check()).resolves.toEqual({ diff --git a/test/main/provider/backgroundModelSync.test.ts b/test/main/provider/backgroundModelSync.test.ts index 849a464320..20df33a378 100644 --- a/test/main/provider/backgroundModelSync.test.ts +++ b/test/main/provider/backgroundModelSync.test.ts @@ -1,3 +1,4 @@ +import { providerTestEnvironment } from '../../helpers/providerEnvironment' import type { ProviderSettingsPort } from '@/provider/settings' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' import type { LLM_PROVIDER } from '@shared/types/provider' @@ -115,11 +116,16 @@ const createProviderRuntime = (providerSettings: ProviderSettingsPort) => { mockSqlitePresenter as never, { newEnvironmentsTable: { listPathsForSession: () => [], syncPath: vi.fn() } - } as never + } as never, + '/home/tester' ) return new ProviderRuntime( providerSettings, - { getLanguage: vi.fn().mockReturnValue('en-US') }, + { + allowInsecureTls: providerTestEnvironment.allowInsecureTls, + defaultHeaders: providerTestEnvironment.defaultHeaders, + getLanguage: vi.fn().mockReturnValue('en-US') + }, {} as never, {} as never, new AcpRuntimeOwner(() => { diff --git a/test/main/provider/baseProvider.test.ts b/test/main/provider/baseProvider.test.ts index 3671e98b81..2270b89f54 100644 --- a/test/main/provider/baseProvider.test.ts +++ b/test/main/provider/baseProvider.test.ts @@ -1,3 +1,4 @@ +import { providerTestEnvironment } from '../../helpers/providerEnvironment' import type { ProviderSettingsPort } from '@/provider/settings' import { describe, expect, it, vi } from 'vitest' import type { LLM_PROVIDER, MODEL_META, ModelConfig } from '@shared/types/provider' @@ -9,7 +10,8 @@ import { BaseLLMProvider } from '../../../src/main/provider/baseProvider' class TestProvider extends BaseLLMProvider { constructor( providerSettings: ProviderSettingsPort, - private readonly modelFetcher: () => Promise = async () => [] + private readonly modelFetcher: () => Promise = async () => [], + environment = providerTestEnvironment ) { super( { @@ -21,7 +23,8 @@ class TestProvider extends BaseLLMProvider { apiVersion: '', models: [] } as unknown as LLM_PROVIDER, - providerSettings + providerSettings, + environment ) } @@ -93,6 +96,7 @@ class TestProvider extends BaseLLMProvider { describe('BaseLLMProvider tool XML conversion', () => { const providerSettings = { + defaultHeaders: providerTestEnvironment.defaultHeaders, getProviderModels: vi.fn().mockReturnValue([]), getCustomModels: vi.fn().mockReturnValue([]), getLanguage: vi.fn().mockReturnValue('zh-CN'), @@ -230,7 +234,7 @@ describe('BaseLLMProvider tool XML conversion', () => { const error = new Error('model endpoint returned 404') const models = [{ id: 'model-1', providerId: 'test-provider' }] as MODEL_META[] const fetchModels = vi.fn().mockRejectedValueOnce(error).mockResolvedValue(models) - const provider = new TestProvider(providerSettings, fetchModels) + const provider = new TestProvider(providerSettings, fetchModels, providerTestEnvironment) await expect( Promise.allSettled([provider.fetchModels(), provider.fetchModels({ suppressErrors: false })]) @@ -252,14 +256,18 @@ describe('BaseLLMProvider tool XML conversion', () => { throw persistenceError }) } as unknown as ProviderSettingsPort - const provider = new TestProvider(failingProviderSettings, async () => [ - { - id: 'model-1', - name: 'Model 1', - providerId: 'test-provider', - group: 'default' - } as MODEL_META - ]) + const provider = new TestProvider( + failingProviderSettings, + async () => [ + { + id: 'model-1', + name: 'Model 1', + providerId: 'test-provider', + group: 'default' + } as MODEL_META + ], + providerTestEnvironment + ) await expect(provider.fetchModels()).rejects.toThrow('model persistence failed') }) @@ -271,7 +279,7 @@ describe('BaseLLMProvider tool XML conversion', () => { .fn() .mockReturnValueOnce(new Promise((resolve) => (resolveFirst = resolve))) .mockReturnValueOnce(new Promise((resolve) => (resolveSecond = resolve))) - const provider = new TestProvider(providerSettings, fetchModels) + const provider = new TestProvider(providerSettings, fetchModels, providerTestEnvironment) const first = provider.fetchModels() provider.updateConfig({ ...provider.getProviderSnapshot(), apiKey: 'updated-key' }) @@ -295,7 +303,7 @@ describe('BaseLLMProvider tool XML conversion', () => { .fn() .mockReturnValueOnce(new Promise((resolve) => (resolveFirst = resolve))) .mockResolvedValue(models) - const provider = new TestProvider(providerSettings, fetchModels) + const provider = new TestProvider(providerSettings, fetchModels, providerTestEnvironment) const first = provider.fetchModels() provider.updateConfig({ ...provider.getProviderSnapshot(), apiKey: 'updated-key' }) @@ -322,7 +330,7 @@ describe('BaseLLMProvider tool XML conversion', () => { } ] const fetchModels = vi.fn().mockResolvedValue(models) - const provider = new TestProvider(providerSettings, fetchModels) + const provider = new TestProvider(providerSettings, fetchModels, providerTestEnvironment) const [first, second] = await Promise.all([provider.fetchModels(), provider.fetchModels()]) const expected = [{ ...models[0], providerId: 'test-provider' }] diff --git a/test/main/provider/basicApiKeyProviders.test.ts b/test/main/provider/basicApiKeyProviders.test.ts index 053b7fecba..93c5584a71 100644 --- a/test/main/provider/basicApiKeyProviders.test.ts +++ b/test/main/provider/basicApiKeyProviders.test.ts @@ -1,6 +1,8 @@ +import { providerTestEnvironment } from '../../helpers/providerEnvironment' import type { ProviderSettingsPort } from '@/provider/settings' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' import type { LLM_PROVIDER } from '@shared/types/provider' +import { ModelType } from '@shared/model' import { DEFAULT_PROVIDERS } from '../../../src/main/provider/defaults' import { AiSdkProvider } from '../../../src/main/provider/providers/aiSdkProvider' import { resolveAiSdkProviderDefinition } from '../../../src/main/provider/providerRegistry' @@ -98,7 +100,7 @@ describe('basic API-key provider registrations', () => { id: 'fireworks-ai', models: [{ id: modelId, display_name: 'GPT OSS 120B' }] }) - const provider = new AiSdkProvider(defaults, createProviderSettings()) + const provider = new AiSdkProvider(defaults, createProviderSettings(), providerTestEnvironment) expect(await provider.fetchModels({ suppressErrors: false })).toEqual([ { id: modelId, @@ -153,7 +155,7 @@ describe('basic API-key provider registrations', () => { }) ) global.fetch = fetchMock - const provider = new AiSdkProvider(config, createProviderSettings()) + const provider = new AiSdkProvider(config, createProviderSettings(), providerTestEnvironment) expect(await provider.check()).toEqual({ isOk: true, errorMsg: null }) expect(fetchMock).toHaveBeenCalledTimes(1) const [url, init] = fetchMock.mock.calls[0] @@ -265,13 +267,18 @@ describe('basic API-key provider registrations', () => { }) ) global.fetch = fetchMock - const missingToken = new AiSdkProvider(defaults, createProviderSettings()) + const missingToken = new AiSdkProvider( + defaults, + createProviderSettings(), + providerTestEnvironment + ) fetchMock.mockResolvedValueOnce(new Response('Unauthorized', { status: 401 })) expect(await missingToken.check()).toMatchObject({ isOk: false }) const provider = new AiSdkProvider( { ...defaults, apiKey: 'astrlink-test-token', baseUrl: 'http://127.0.0.1:28419/v1' }, - createProviderSettings() + createProviderSettings(), + providerTestEnvironment ) await expect(provider.fetchModels({ suppressErrors: false })).resolves.toEqual([ expect.objectContaining({ @@ -318,7 +325,7 @@ describe('basic API-key provider registrations', () => { ) global.fetch = fetchMock as typeof fetch - const provider = new AiSdkProvider(defaults, createProviderSettings()) + const provider = new AiSdkProvider(defaults, createProviderSettings(), providerTestEnvironment) expect(resolveAiSdkProviderDefinition(defaults)).toMatchObject({ runtimeKind: 'openai-compatible', modelSource: 'openai', @@ -363,7 +370,7 @@ describe('basic API-key provider registrations', () => { global.fetch = fetchMock as unknown as typeof fetch const config = { ...defaults, apiKey: 'test-key' } - const provider = new AiSdkProvider(config, createProviderSettings()) + const provider = new AiSdkProvider(config, createProviderSettings(), providerTestEnvironment) expect(resolveAiSdkProviderDefinition(config)).toMatchObject({ runtimeKind: 'openai-compatible', modelSource: 'openai', @@ -434,7 +441,7 @@ describe('basic API-key provider registrations', () => { global.fetch = fetchMock as unknown as typeof fetch const config = { ...defaults, apiKey: 'test-key' } - const provider = new AiSdkProvider(config, createProviderSettings()) + const provider = new AiSdkProvider(config, createProviderSettings(), providerTestEnvironment) expect(resolveAiSdkProviderDefinition(config)).toMatchObject({ runtimeKind: 'openai-compatible', modelSource: 'requesty', @@ -548,14 +555,18 @@ describe('basic API-key provider registrations', () => { ) global.fetch = fetchMock as unknown as typeof fetch - const provider = new AiSdkProvider({ ...defaults }, createProviderSettings()) + const provider = new AiSdkProvider( + { ...defaults }, + createProviderSettings(), + providerTestEnvironment + ) expect(resolveAiSdkProviderDefinition(defaults)).toMatchObject({ runtimeKind: 'openai-compatible', modelSource: 'litellm', checkStrategy: 'fetch-models', embeddingStrategy: 'openai' }) - expect(resolveAiSdkProviderDefinition(defaults).credentialStrategy).toBeUndefined() + expect(resolveAiSdkProviderDefinition(defaults)!.credentialStrategy).toBeUndefined() await expect(provider.fetchModels({ suppressErrors: false })).resolves.toEqual([ expect.objectContaining({ @@ -610,7 +621,11 @@ describe('basic API-key provider registrations', () => { if (reversed) deployments.reverse() global.fetch = vi.fn().mockImplementation(async () => Response.json({ data: deployments })) - const provider = new AiSdkProvider({ ...defaults }, createProviderSettings()) + const provider = new AiSdkProvider( + { ...defaults }, + createProviderSettings(), + providerTestEnvironment + ) await expect(provider.fetchModels({ suppressErrors: false })).resolves.toEqual([ expect.objectContaining({ id: 'pool', @@ -635,7 +650,8 @@ describe('basic API-key provider registrations', () => { const provider = new AiSdkProvider( { ...defaults, apiKey: 'sk-virtual' }, - createProviderSettings() + createProviderSettings(), + providerTestEnvironment ) await expect(provider.getKeyStatus()).resolves.toEqual({ @@ -660,11 +676,19 @@ describe('basic API-key provider registrations', () => { ) global.fetch = fetchMock as unknown as typeof fetch - const keyless = new AiSdkProvider({ ...defaults }, createProviderSettings()) + const keyless = new AiSdkProvider( + { ...defaults }, + createProviderSettings(), + providerTestEnvironment + ) await expect(keyless.getKeyStatus()).resolves.toBeNull() expect(fetchMock).not.toHaveBeenCalled() - const master = new AiSdkProvider({ ...defaults, apiKey: 'sk-master' }, createProviderSettings()) + const master = new AiSdkProvider( + { ...defaults, apiKey: 'sk-master' }, + createProviderSettings(), + providerTestEnvironment + ) await expect(master.getKeyStatus()).resolves.toBeNull() }) @@ -682,7 +706,8 @@ describe('basic API-key provider registrations', () => { ) const provider = new AiSdkProvider( { ...defaults, apiKey: 'sk-virtual' }, - createProviderSettings() + createProviderSettings(), + providerTestEnvironment ) const result = expect(provider.getKeyStatus()).rejects.toMatchObject({ name: 'AbortError', @@ -727,7 +752,8 @@ describe('basic API-key provider registrations', () => { const provider = new AiSdkProvider( { ...defaults, apiKey: 'sk-virtual' }, - createProviderSettings() + createProviderSettings(), + providerTestEnvironment ) await expect(provider.fetchModels({ suppressErrors: false })).resolves.toEqual([ @@ -755,7 +781,8 @@ describe('basic API-key provider registrations', () => { const provider = new AiSdkProvider( { ...defaults, apiKey: 'sk-virtual' }, - createProviderSettings() + createProviderSettings(), + providerTestEnvironment ) await expect(provider.fetchModels({ suppressErrors: false })).rejects.toThrow( @@ -789,7 +816,7 @@ describe('basic API-key provider registrations', () => { global.fetch = fetchMock as unknown as typeof fetch const config = { ...defaults, apiKey: 'test-key' } - const provider = new AiSdkProvider(config, createProviderSettings()) + const provider = new AiSdkProvider(config, createProviderSettings(), providerTestEnvironment) expect(resolveAiSdkProviderDefinition(config)).toMatchObject({ runtimeKind: 'openai-compatible', modelSource: 'demonroute', @@ -843,7 +870,7 @@ describe('basic API-key provider registrations', () => { global.fetch = fetchMock as unknown as typeof fetch const config = { ...defaults, apiKey: 'test-key' } - const provider = new AiSdkProvider(config, createProviderSettings()) + const provider = new AiSdkProvider(config, createProviderSettings(), providerTestEnvironment) expect(resolveAiSdkProviderDefinition(config)).toMatchObject({ runtimeKind: 'openai-compatible', modelSource: 'openai', @@ -987,7 +1014,7 @@ describe('basic API-key provider registrations', () => { }) ) global.fetch = fetchMock - const provider = new AiSdkProvider(defaults, createProviderSettings()) + const provider = new AiSdkProvider(defaults, createProviderSettings(), providerTestEnvironment) expect(await provider.fetchModels({ suppressErrors: false })).toEqual([ { @@ -1038,7 +1065,8 @@ describe('basic API-key provider registrations', () => { global.fetch = fetchMock const provider = new AiSdkProvider( { ...defaults, apiKey: 'test-key' }, - createProviderSettings() + createProviderSettings(), + providerTestEnvironment ) expect(await provider.check()).toEqual({ @@ -1102,7 +1130,7 @@ describe('basic API-key provider registrations', () => { global.fetch = fetchMock as unknown as typeof fetch const config = { ...defaults, apiKey: 'test-key' } - const provider = new AiSdkProvider(config, createProviderSettings()) + const provider = new AiSdkProvider(config, createProviderSettings(), providerTestEnvironment) expect(resolveAiSdkProviderDefinition(config)).toMatchObject({ runtimeKind: 'openai-compatible', modelSource: 'openai', @@ -1160,7 +1188,8 @@ describe('basic API-key provider registrations', () => { name: 'AMD GPU Cloud', baseUrl: 'https://developer.amd.com.cn/radeon/api/v1' }), - createProviderSettings() + createProviderSettings(), + providerTestEnvironment ) const models = await provider.fetchModels() @@ -1230,7 +1259,8 @@ describe('basic API-key provider registrations', () => { name: 'OrcaRouter', baseUrl: 'https://api.orcarouter.ai/v1' }), - createProviderSettings() + createProviderSettings(), + providerTestEnvironment ) const models = await provider.fetchModels() @@ -1283,7 +1313,8 @@ describe('basic API-key provider registrations', () => { name: 'Synthorai', baseUrl: 'https://synthorai.io/v1' }), - createProviderSettings() + createProviderSettings(), + providerTestEnvironment ) const models = await provider.fetchModels() @@ -1322,7 +1353,8 @@ describe('basic API-key provider registrations', () => { name: 'Modelsell', baseUrl: 'https://modelsell.com/v1' }), - createProviderSettings() + createProviderSettings(), + providerTestEnvironment ) const models = await provider.fetchModels() @@ -1367,7 +1399,8 @@ describe('basic API-key provider registrations', () => { name: 'OpenRouter', baseUrl: 'https://openrouter.ai/api/v1' }), - createProviderSettings() + createProviderSettings(), + providerTestEnvironment ) const models = await provider.fetchModels() @@ -1417,7 +1450,8 @@ describe('basic API-key provider registrations', () => { name: providerId, baseUrl: `https://${providerId}.example/v1` }), - createProviderSettings() + createProviderSettings(), + providerTestEnvironment ) const models = await provider.fetchModels() @@ -1454,7 +1488,8 @@ describe('basic API-key provider registrations', () => { name: 'GreenPT', baseUrl: 'https://api.greenpt.ai/v1' }), - createProviderSettings() + createProviderSettings(), + providerTestEnvironment ) const models = await provider.fetchModels() @@ -1531,7 +1566,8 @@ describe('basic API-key provider registrations', () => { name: 'OpenCode Go', baseUrl: 'https://opencode.ai/zen/go/v1' }), - createProviderSettings() + createProviderSettings(), + providerTestEnvironment ) const models = await provider.fetchModels() @@ -1596,7 +1632,11 @@ describe('basic API-key provider registrations', () => { ] }) - const provider = new AiSdkProvider(createProvider({}), createProviderSettings()) + const provider = new AiSdkProvider( + createProvider({}), + createProviderSettings(), + providerTestEnvironment + ) const models = await provider.fetchModels() expect(mockGetProvider).toHaveBeenCalledWith('nvidia') @@ -1641,7 +1681,8 @@ describe('basic API-key provider registrations', () => { name: 'StepFun Token Plan', baseUrl: 'https://api.stepfun.com/step_plan/v1' }), - createProviderSettings() + createProviderSettings(), + providerTestEnvironment ) const models = await provider.fetchModels() @@ -1664,7 +1705,8 @@ describe('basic API-key provider registrations', () => { name: 'StepFun Token Plan', baseUrl: 'https://api.stepfun.com/step_plan/v1' }), - createProviderSettings() + createProviderSettings(), + providerTestEnvironment ) ;(provider as any).isInitialized = true @@ -1701,7 +1743,7 @@ describe('basic API-key provider registrations', () => { credentialStrategy: 'api-key', checkModelId: 'deepseek-ai/DeepSeek-V4.1-Flash' }) - const provider = new AiSdkProvider(config, createProviderSettings()) + const provider = new AiSdkProvider(config, createProviderSettings(), providerTestEnvironment) ;(provider as any).isInitialized = true await expect(provider.check()).resolves.toEqual({ isOk: true, errorMsg: null }) @@ -1735,7 +1777,7 @@ describe('basic API-key provider registrations', () => { embeddingStrategy: 'none', checkModelId: 'deepseek-v4.1-flash' }) - const provider = new AiSdkProvider(config, createProviderSettings()) + const provider = new AiSdkProvider(config, createProviderSettings(), providerTestEnvironment) ;(provider as any).isInitialized = true await expect(provider.check()).resolves.toEqual({ isOk: true, errorMsg: null }) @@ -1782,7 +1824,7 @@ describe('basic API-key provider registrations', () => { }) ) global.fetch = fetchMock - const provider = new AiSdkProvider(defaults, createProviderSettings()) + const provider = new AiSdkProvider(defaults, createProviderSettings(), providerTestEnvironment) const models = await provider.fetchModels({ suppressErrors: false }) expect(models.map(({ id }) => id)).toEqual([ @@ -1837,7 +1879,7 @@ describe('basic API-key provider registrations', () => { }) ) global.fetch = fetchMock - const provider = new AiSdkProvider(defaults, createProviderSettings()) + const provider = new AiSdkProvider(defaults, createProviderSettings(), providerTestEnvironment) expect(await provider.fetchModels({ suppressErrors: false })).toEqual([ { @@ -1868,7 +1910,8 @@ describe('basic API-key provider registrations', () => { name: 'OpenCode Go', baseUrl: 'https://opencode.ai/zen/go/v1' }), - createProviderSettings() + createProviderSettings(), + providerTestEnvironment ) ;(provider as any).isInitialized = true @@ -1901,7 +1944,8 @@ describe('basic API-key provider registrations', () => { name: 'OpenCode Go', baseUrl: 'https://opencode.ai/zen/go/v1' }), - providerSettings + providerSettings, + providerTestEnvironment ) ;(provider as any).isInitialized = true const resolveRouteDecision = vi.spyOn(provider as any, 'resolveRouteDecision') @@ -1931,7 +1975,13 @@ describe('basic API-key provider registrations', () => { endpointType: 'image-generation' }) vi.mocked(imageProviderSettings.getModelConfig).mockReturnValue({ - endpointType: 'image-generation' + endpointType: 'image-generation', + maxTokens: 4096, + contextLength: 32000, + vision: false, + functionCall: false, + reasoning: false, + type: ModelType.Chat }) const imageProvider = new AiSdkProvider( createProvider({ @@ -1940,9 +1990,14 @@ describe('basic API-key provider registrations', () => { apiType: 'new-api', baseUrl: 'https://new-api.example.com' }), - imageProviderSettings + imageProviderSettings, + providerTestEnvironment + ) + const compatibleProvider = new AiSdkProvider( + createProvider({}), + createProviderSettings(), + providerTestEnvironment ) - const compatibleProvider = new AiSdkProvider(createProvider({}), createProviderSettings()) ;(imageProvider as any).isInitialized = false ;(compatibleProvider as any).isInitialized = false @@ -1968,7 +2023,8 @@ describe('basic API-key provider registrations', () => { name: 'OpenCode Go', baseUrl: 'https://opencode.ai/zen/go/v1' }), - createProviderSettings() + createProviderSettings(), + providerTestEnvironment ) ;(provider as any).isInitialized = true @@ -2000,7 +2056,8 @@ describe('basic API-key provider registrations', () => { apiType: 'anthropic', baseUrl: 'https://api.minimax.io/anthropic/v1' }), - createProviderSettings() + createProviderSettings(), + providerTestEnvironment ) ;(provider as any).isInitialized = true diff --git a/test/main/provider/doubaoProvider.test.ts b/test/main/provider/doubaoProvider.test.ts index cf8d5cb9fd..2c815b69c9 100644 --- a/test/main/provider/doubaoProvider.test.ts +++ b/test/main/provider/doubaoProvider.test.ts @@ -1,3 +1,4 @@ +import { providerTestEnvironment } from '../../helpers/providerEnvironment' import type { ProviderSettingsPort } from '@/provider/settings' import { beforeEach, describe, expect, it, vi } from 'vitest' import type { LLM_PROVIDER } from '@shared/types/provider' @@ -88,7 +89,11 @@ describe('AiSdkProvider doubao', () => { ] }) - const provider = new AiSdkProvider(createProvider(), createProviderSettings()) + const provider = new AiSdkProvider( + createProvider(), + createProviderSettings(), + providerTestEnvironment + ) const models = await provider.fetchModels() expect(models).toEqual([ diff --git a/test/main/provider/embeddingResponse.test.ts b/test/main/provider/embeddingResponse.test.ts new file mode 100644 index 0000000000..c909e3234f --- /dev/null +++ b/test/main/provider/embeddingResponse.test.ts @@ -0,0 +1,117 @@ +import { describe, expect, it } from 'vitest' +import { createAzure } from '@ai-sdk/azure' +import { createGoogle } from '@ai-sdk/google' +import { createVertex } from '@ai-sdk/google-vertex' +import { createVertex as createVertexEdge } from '@ai-sdk/google-vertex/edge' +import { createOpenAI } from '@ai-sdk/openai' +import { createOpenAICompatible } from '@ai-sdk/openai-compatible' +import type { EmbeddingModelV4 } from '@ai-sdk/provider' + +const openaiBody = (vector: unknown) => ({ data: [{ embedding: vector }] }) +const googleBody = (vector: unknown) => ({ embedding: { values: vector } }) +const googleBatchBody = (vector: unknown) => ({ + embeddings: [{ values: vector }, { values: vector }] +}) +const vertexBody = (vector: unknown) => ({ + predictions: [{ embeddings: { values: vector, statistics: { token_count: 1 } } }] +}) + +const adapters: { + name: string + create: (fetch: typeof globalThis.fetch) => EmbeddingModelV4 + body: (vector: unknown) => unknown + vectors: (body: any) => number[][] + values?: string[] +}[] = [ + { + name: 'OpenAI', + create: (fetch) => createOpenAI({ apiKey: 'fixture', fetch }).embedding('fixture'), + body: openaiBody, + vectors: (body) => body.data.map((item: any) => item.embedding) + }, + { + name: 'OpenAI compatible', + create: (fetch) => + createOpenAICompatible({ + name: 'fixture', + baseURL: 'https://embedding.example/v1', + fetch + }).embeddingModel('fixture'), + body: openaiBody, + vectors: (body) => body.data.map((item: any) => item.embedding) + }, + { + name: 'Azure OpenAI internal model', + create: (fetch) => + createAzure({ resourceName: 'fixture', apiKey: 'fixture', fetch }).embedding('fixture'), + body: openaiBody, + vectors: (body) => body.data.map((item: any) => item.embedding) + }, + { + name: 'Google single', + create: (fetch) => createGoogle({ apiKey: 'fixture', fetch }).embeddingModel('fixture'), + body: googleBody, + vectors: (body) => [body.embedding.values] + }, + { + name: 'Google batch', + create: (fetch) => createGoogle({ apiKey: 'fixture', fetch }).embeddingModel('fixture'), + body: googleBatchBody, + vectors: (body) => body.embeddings.map((item: any) => item.values), + values: ['first', 'second'] + }, + ...[createVertex, createVertexEdge].flatMap((create, index) => [ + { + name: `Vertex ${index === 0 ? 'Node' : 'edge'} predict`, + create: (fetch: typeof globalThis.fetch) => + create({ apiKey: 'fixture', fetch }).embeddingModel('text-embedding-005'), + body: vertexBody, + vectors: (body: any) => body.predictions.map((item: any) => item.embeddings.values) + }, + { + name: `Vertex ${index === 0 ? 'Node' : 'edge'} embedContent`, + create: (fetch: typeof globalThis.fetch) => + create({ apiKey: 'fixture', fetch }).embeddingModel('gemini-embedding-2'), + body: googleBody, + vectors: (body: any) => [body.embedding.values] + } + ]) +] + +describe.each(adapters)('$name embedding response contract', (adapter) => { + function embed(vector: unknown) { + const body = JSON.stringify(adapter.body(vector)) + .replaceAll('"negative-zero"', '-0') + .replaceAll('"overflow"', '1e309') + const model = adapter.create( + async () => new Response(body, { headers: { 'content-type': 'application/json' } }) + ) + return model.doEmbed({ values: adapter.values ?? ['fixture'] }) + } + + it('preserves finite numeric values and separates parsed vectors from the raw response', async () => { + const vector = [0.25, -0.75, 0, -0, Math.fround(1e-40), 3.4e38, Number.MAX_VALUE] + const result = await embed( + vector.map((value) => (Object.is(value, -0) ? 'negative-zero' : value)) + ) + const rawVectors = adapter.vectors(result.response?.body) + expect(result.embeddings).toEqual(rawVectors.map(() => vector)) + for (const [index, embedding] of result.embeddings.entries()) { + expect(embedding).not.toBe(rawVectors[index]) + expect(Object.is(embedding[3], -0)).toBe(true) + embedding[0] = 7 + expect(rawVectors[index][0]).toBe(0.25) + } + }) + + it('preserves empty numeric arrays', async () => { + const result = await embed([]) + expect(result.embeddings).toEqual(adapter.vectors(result.response?.body).map(() => [])) + }) + + it('rejects nonnumeric, nonfinite and nonarray vectors before returning embeddings', async () => { + for (const vector of [null, {}, 1, 'vector', [null], ['0.25'], [[1]], [true], ['overflow']]) { + await expect(embed(vector)).rejects.toThrow() + } + }) +}) diff --git a/test/main/provider/geminiProvider.test.ts b/test/main/provider/geminiProvider.test.ts index ec1e211a62..ceca128ac9 100644 --- a/test/main/provider/geminiProvider.test.ts +++ b/test/main/provider/geminiProvider.test.ts @@ -1,3 +1,4 @@ +import { providerTestEnvironment } from '../../helpers/providerEnvironment' import type { ProviderSettingsPort } from '@/provider/settings' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' import type { LLM_PROVIDER } from '@shared/types/provider' @@ -108,7 +109,8 @@ describe('AiSdkProvider gemini', () => { custom: true, baseUrl: 'https://generativelanguage.googleapis.com/v1' }), - createProviderSettings() + createProviderSettings(), + providerTestEnvironment ) const models = await provider.fetchModels() @@ -148,7 +150,8 @@ describe('AiSdkProvider gemini', () => { name: 'Custom Gemini', custom: true }), - createProviderSettings() + createProviderSettings(), + providerTestEnvironment ) await expect(provider.refreshModels()).rejects.toThrow('API key not valid') diff --git a/test/main/provider/githubCopilotDeviceFlow.test.ts b/test/main/provider/githubCopilotDeviceFlow.test.ts index 35e194af51..6beb2c99d5 100644 --- a/test/main/provider/githubCopilotDeviceFlow.test.ts +++ b/test/main/provider/githubCopilotDeviceFlow.test.ts @@ -2,9 +2,9 @@ import { afterEach, describe, expect, it, vi } from 'vitest' import { disposeGlobalGitHubCopilotDeviceFlow, - getGitHubCopilotToken, getGlobalGitHubCopilotDeviceFlow } from '@/provider/auth/githubCopilotDeviceFlow' +import { getGitHubCopilotToken } from '@/provider/auth/githubCopilotToken' import { extractProviderFailureMetadata } from '@/provider/providerFailure' vi.mock('electron', () => ({ diff --git a/test/main/provider/githubCopilotOAuthService.test.ts b/test/main/provider/githubCopilotOAuthService.test.ts index de0d55168f..f0ff9baa03 100644 --- a/test/main/provider/githubCopilotOAuthService.test.ts +++ b/test/main/provider/githubCopilotOAuthService.test.ts @@ -1,13 +1,13 @@ import { afterEach, describe, expect, it, vi } from 'vitest' import { OAuthService } from '@/provider/auth' -import type { LLM_PROVIDER } from '@shared/types/provider' +import type { GitHubCopilotSignInTarget } from '@shared/types/oauth' const mocks = vi.hoisted(() => ({ startDeviceFlow: vi.fn(), startLogin: vi.fn(), - exchangeCodeForToken: vi.fn() + exchangeCodeForToken: vi.fn(), + stop: vi.fn() })) - vi.mock('@/provider/auth/githubCopilotDeviceFlow', async (importOriginal) => ({ ...(await importOriginal()), getGlobalGitHubCopilotDeviceFlow: () => ({ startDeviceFlow: mocks.startDeviceFlow }) @@ -18,120 +18,165 @@ vi.mock('@/provider/auth/githubCopilotOAuth', () => ({ exchangeCodeForToken: mocks.exchangeCodeForToken }) })) -vi.mock('@/provider/auth/openaiCodex', () => ({ - initializeGlobalOpenAICodexAuth: vi.fn() -})) -vi.mock('@/provider/auth/xaiGrok', () => ({ - initializeGlobalXaiGrokAuth: vi.fn() -})) -describe('GitHub Copilot login validation', () => { +const accepted = () => Response.json({ token: 'copilot-session', expires_at: 2_000_000_000 }) +const setup = () => { + const target: GitHubCopilotSignInTarget = { + providerId: 'github-copilot', + clientId: 'test-client', + configurationId: 'opaque-configuration-identity' + } + const owner = { + getGitHubCopilotSignInTarget: vi.fn(async () => target), + commitGitHubCopilotCredential: vi.fn(async () => {}), + invalidateGitHubCopilotSignIns: vi.fn(async () => {}) + } + mocks.startDeviceFlow.mockResolvedValue('new-oauth-token') + mocks.startLogin.mockResolvedValue('auth-code') + mocks.exchangeCodeForToken.mockResolvedValue('new-oauth-token') + const signedOut = async () => ({ + state: 'signed-out' as const, + authenticated: false, + storage: 'none' as const + }) + const accounts = { + getOpenAICodexStatus: vi.fn(signedOut), + startOpenAICodexBrowserLogin: vi.fn(signedOut), + completeOpenAICodexBrowserLoginFromUrl: vi.fn(async (_url: string) => signedOut()), + cancelOpenAICodexLogin: vi.fn(signedOut), + logoutOpenAICodex: vi.fn(signedOut), + getXaiGrokStatus: vi.fn(signedOut), + startXaiGrokDeviceLogin: vi.fn(signedOut), + cancelXaiGrokLogin: vi.fn(signedOut), + logoutXaiGrok: vi.fn(signedOut), + stop: mocks.stop + } + const service = new OAuthService(owner, accounts) + return { target, owner, service, accounts } +} + +describe('GitHub Copilot login owner commands', () => { afterEach(() => { vi.unstubAllGlobals() vi.resetAllMocks() }) - const setup = () => { - const provider: LLM_PROVIDER = { - id: 'github-copilot', - name: 'GitHub Copilot', - apiType: 'github-copilot', - apiKey: 'saved-oauth-token', - baseUrl: 'https://api.githubcopilot.com', - enable: true + it.each([false, true])( + 'awaits account stop and revokes Copilot targets when owner fails=%s', + async (fails) => { + const { owner, service, accounts } = setup() + const stopped = Promise.withResolvers() + accounts.stop.mockReturnValue(stopped.promise) + let acknowledged = false + const stopping = service.stop().then(() => { + acknowledged = true + }) + const result = fails + ? expect(stopping).rejects.toThrow('Account stop failed') + : expect(stopping).resolves.toBeUndefined() + await Promise.resolve() + expect(acknowledged).toBe(false) + expect(owner.invalidateGitHubCopilotSignIns).toHaveBeenCalledOnce() + if (fails) stopped.reject(new Error('Account stop failed')) + else stopped.resolve() + await result + await expect(service.startGitHubCopilotDeviceFlowLogin('github-copilot')).rejects.toThrow( + 'stopped' + ) + expect(mocks.startDeviceFlow).not.toHaveBeenCalled() } - mocks.startDeviceFlow.mockResolvedValue('new-oauth-token') - mocks.startLogin.mockResolvedValue('auth-code') - mocks.exchangeCodeForToken.mockResolvedValue('new-oauth-token') - const setProviderById = vi.fn() - const getProviderById = vi.fn((_providerId: string): LLM_PROVIDER | undefined => ({ - ...provider - })) - const service = new OAuthService({ getProviderById, setProviderById }, vi.fn()) - return { provider, service, setProviderById, getProviderById } - } + ) for (const method of ['startGitHubCopilotDeviceFlowLogin', 'startGitHubCopilotLogin'] as const) { - it(`${method} saves credentials only after Copilot accepts them`, async () => { - const { provider, service, setProviderById } = setup() + it(`${method} validates Copilot access before submitting the owner mutation`, async () => { + const { target, owner, service } = setup() const fetchMock = vi.fn(async (_url: string) => { - expect(setProviderById).not.toHaveBeenCalled() - return Response.json({ token: 'copilot-session', expires_at: 2_000_000_000 }) + expect(owner.commitGitHubCopilotCredential).not.toHaveBeenCalled() + return accepted() }) vi.stubGlobal('fetch', fetchMock) - - await expect(service[method](provider.id)).resolves.toBe(true) - - expect(fetchMock).toHaveBeenCalledOnce() + await expect(service[method](target.providerId)).resolves.toBe(true) + expect(owner.getGitHubCopilotSignInTarget).toHaveBeenCalledWith(target.providerId) expect(fetchMock.mock.calls[0][0]).toBe('https://api.github.com/copilot_internal/v2/token') - expect(setProviderById).toHaveBeenCalledWith(provider.id, { - ...provider, - apiKey: 'new-oauth-token' - }) - expect(provider.apiKey).toBe('saved-oauth-token') + expect(owner.commitGitHubCopilotCredential).toHaveBeenCalledWith(target, 'new-oauth-token') }) - it(`${method} surfaces Copilot rejection without replacing saved credentials`, async () => { - const { provider, service, setProviderById } = setup() - const fetchMock = vi.fn().mockResolvedValue( - Response.json( - { error_details: { message: 'Copilot access denied', code: 'not_authorized' } }, - { - status: 403, - statusText: 'Forbidden', - headers: { 'x-github-request-id': 'ABCD:1234' } - } - ) - ) - vi.stubGlobal('fetch', fetchMock) - - await expect(service[method](provider.id)).rejects.toThrow( - 'GitHub Copilot token exchange failed: 403 Forbidden - Copilot access denied; code=not_authorized; request_id=ABCD:1234' + it(`${method} waits for actual credential acknowledgement and propagates persistence failure`, async () => { + const { target, owner, service } = setup() + const writing = Promise.withResolvers() + const entered = Promise.withResolvers() + owner.commitGitHubCopilotCredential.mockImplementation(async () => { + entered.resolve() + await writing.promise + }) + vi.stubGlobal( + 'fetch', + vi.fn(async () => accepted()) ) - expect(fetchMock).toHaveBeenCalledOnce() - expect(setProviderById).not.toHaveBeenCalled() - expect(provider.apiKey).toBe('saved-oauth-token') + let completed = false + const login = service[method](target.providerId).then(() => { + completed = true + }) + const rejected = expect(login).rejects.toThrow('persistence failed') + await entered.promise + expect(completed).toBe(false) + writing.reject(new Error('persistence failed')) + await rejected }) - it.each(['credentials', 'client', 'protocol', 'removal'] as const)( - `${method} rejects stale authentication after a provider change: %s`, - async (change) => { - const { provider, service, setProviderById, getProviderById } = setup() - vi.stubGlobal( - 'fetch', - vi.fn(async () => { - if (change === 'credentials') provider.apiKey = 'newer-oauth-token' - if (change === 'client') provider.copilotClientId = 'new-client' - if (change === 'protocol') provider.apiType = 'openai' - if (change === 'removal') getProviderById.mockReturnValue(undefined) - return Response.json({ token: 'copilot-session', expires_at: 2_000_000_000 }) - }) + it(`${method} preserves saved credentials when Copilot refuses access`, async () => { + const { target, owner, service } = setup() + vi.stubGlobal( + 'fetch', + vi.fn(async () => + Response.json( + { error_details: { message: 'Copilot access denied', code: 'not_authorized' } }, + { + status: 403, + statusText: 'Forbidden', + headers: { 'x-github-request-id': 'ABCD:1234' } + } + ) ) + ) + await expect(service[method](target.providerId)).rejects.toThrow('Copilot access denied') + expect(owner.commitGitHubCopilotCredential).not.toHaveBeenCalled() + }) - await expect(service[method](provider.id)).rejects.toThrow( - 'GitHub Copilot configuration changed during sign-in' - ) - expect(setProviderById).not.toHaveBeenCalled() - } - ) + it(`${method} cannot open a login after a pending owner query is stopped`, async () => { + const { target, owner, service } = setup() + const reading = Promise.withResolvers() + owner.getGitHubCopilotSignInTarget.mockReturnValue(reading.promise) + const login = service[method](target.providerId) + const rejected = expect(login).rejects.toThrow('stopped') + await service.stop() + reading.resolve(target) + await rejected + expect(owner.invalidateGitHubCopilotSignIns).toHaveBeenCalledOnce() + expect(mocks.startDeviceFlow).not.toHaveBeenCalled() + expect(mocks.startLogin).not.toHaveBeenCalled() + expect(owner.commitGitHubCopilotCredential).not.toHaveBeenCalled() + }) - it(`${method} preserves unrelated settings changed during authentication`, async () => { - const { provider, service, setProviderById } = setup() + it(`${method} aborts token validation and rejects a late transport result after stop`, async () => { + const { target, owner, service } = setup() + const response = Promise.withResolvers() + const entered = Promise.withResolvers() vi.stubGlobal( 'fetch', - vi.fn(async () => { - provider.name = 'Renamed Copilot' - provider.enable = false - provider.customHeaders = { 'X-Custom': 'current' } - return Response.json({ token: 'copilot-session', expires_at: 2_000_000_000 }) + vi.fn(async (_url, init: RequestInit) => { + entered.resolve(init.signal!) + return await response.promise }) ) - - await expect(service[method](provider.id)).resolves.toBe(true) - expect(setProviderById).toHaveBeenCalledWith(provider.id, { - ...provider, - apiKey: 'new-oauth-token' - }) + const login = service[method](target.providerId) + const rejected = expect(login).rejects.toThrow('stopped') + const signal = await entered.promise + await service.stop() + expect(signal.aborted).toBe(true) + response.resolve(accepted()) + await rejected + expect(owner.commitGitHubCopilotCredential).not.toHaveBeenCalled() }) } }) diff --git a/test/main/provider/githubCopilotProvider.test.ts b/test/main/provider/githubCopilotProvider.test.ts index 8b575b2853..0eb89d9d4f 100644 --- a/test/main/provider/githubCopilotProvider.test.ts +++ b/test/main/provider/githubCopilotProvider.test.ts @@ -3,12 +3,10 @@ import { afterEach, describe, expect, it, vi } from 'vitest' import { GithubCopilotProvider } from '../../../src/main/provider/providers/githubCopilotProvider' import { extractProviderFailureMetadata } from '@/provider/providerFailure' -import { getGitHubCopilotToken } from '../../../src/main/provider/auth/githubCopilotDeviceFlow' +import { getGitHubCopilotToken } from '../../../src/main/provider/auth/githubCopilotToken' -vi.mock('../../../src/main/provider/auth/githubCopilotDeviceFlow', async (importOriginal) => ({ - ...(await importOriginal< - typeof import('../../../src/main/provider/auth/githubCopilotDeviceFlow') - >()), +vi.mock('../../../src/main/provider/auth/githubCopilotToken', async (importOriginal) => ({ + ...(await importOriginal()), getGitHubCopilotToken: vi.fn() })) diff --git a/test/main/provider/jevProvider.test.ts b/test/main/provider/jevProvider.test.ts index 6ffc53fa10..8a375369b2 100644 --- a/test/main/provider/jevProvider.test.ts +++ b/test/main/provider/jevProvider.test.ts @@ -1,3 +1,4 @@ +import { providerTestEnvironment } from '../../helpers/providerEnvironment' import type { ProviderSettingsPort } from '@/provider/settings' import { ModelType } from '@shared/model' import type { LLM_PROVIDER } from '@shared/types/provider' @@ -67,6 +68,8 @@ const createProviderSettings = (): ProviderSettingsPort => const createProviderInstance = (overrides?: Partial) => new JevProvider(createProvider(overrides), createProviderSettings(), { + allowInsecureTls: providerTestEnvironment.allowInsecureTls, + defaultHeaders: providerTestEnvironment.defaultHeaders, getLanguage: vi.fn().mockReturnValue('en-US') }) @@ -183,6 +186,8 @@ describe('JevProvider', () => { createProvider({ models: bundled }), createProviderSettings(), { + allowInsecureTls: providerTestEnvironment.allowInsecureTls, + defaultHeaders: providerTestEnvironment.defaultHeaders, getLanguage: vi.fn().mockReturnValue('en-US') } ) diff --git a/test/main/provider/kimiForCodingProvider.test.ts b/test/main/provider/kimiForCodingProvider.test.ts index 9a68f30eb2..3265e8b526 100644 --- a/test/main/provider/kimiForCodingProvider.test.ts +++ b/test/main/provider/kimiForCodingProvider.test.ts @@ -1,3 +1,4 @@ +import { providerTestEnvironment } from '../../helpers/providerEnvironment' import type { ProviderSettingsPort } from '@/provider/settings' import { beforeEach, describe, expect, it, vi } from 'vitest' import type { LLM_PROVIDER } from '@shared/types/provider' @@ -137,7 +138,11 @@ describe('AiSdkProvider kimi-for-coding', () => { ] }) - const provider = new AiSdkProvider(createProvider(), createProviderSettings()) + const provider = new AiSdkProvider( + createProvider(), + createProviderSettings(), + providerTestEnvironment + ) const models = await provider.fetchModels() expect(mockGetProvider).toHaveBeenCalledWith('kimi-for-coding') @@ -154,7 +159,11 @@ describe('AiSdkProvider kimi-for-coding', () => { }) it('verifies Kimi For Coding with a small generate-text request', async () => { - const provider = new AiSdkProvider(createProvider(), createProviderSettings()) + const provider = new AiSdkProvider( + createProvider(), + createProviderSettings(), + providerTestEnvironment + ) ;(provider as any).isInitialized = true await expect(provider.check()).resolves.toEqual({ diff --git a/test/main/provider/mistralProvider.test.ts b/test/main/provider/mistralProvider.test.ts index 56b29e17ed..92b2e3a7b9 100644 --- a/test/main/provider/mistralProvider.test.ts +++ b/test/main/provider/mistralProvider.test.ts @@ -1,3 +1,4 @@ +import { providerTestEnvironment } from '../../helpers/providerEnvironment' import type { ProviderSettingsPort } from '@/provider/settings' import { beforeEach, describe, expect, it, vi } from 'vitest' import type { LLM_PROVIDER } from '@shared/types/provider' @@ -128,7 +129,11 @@ describe('AiSdkProvider mistral', () => { ] }) - const provider = new AiSdkProvider(createProvider(), createProviderSettings()) + const provider = new AiSdkProvider( + createProvider(), + createProviderSettings(), + providerTestEnvironment + ) const models = await provider.fetchModels() expect(models).toEqual([ @@ -160,7 +165,8 @@ describe('AiSdkProvider mistral', () => { apiType: 'mistral', custom: true }), - createProviderSettings() + createProviderSettings(), + providerTestEnvironment ) const models = await provider.fetchModels() @@ -178,7 +184,8 @@ describe('AiSdkProvider mistral', () => { createProvider({ apiKey: '' }), - createProviderSettings() + createProviderSettings(), + providerTestEnvironment ) await expect(provider.check()).resolves.toEqual({ @@ -189,7 +196,11 @@ describe('AiSdkProvider mistral', () => { }) it('verifies Mistral with a small generate-text request', async () => { - const provider = new AiSdkProvider(createProvider(), createProviderSettings()) + const provider = new AiSdkProvider( + createProvider(), + createProviderSettings(), + providerTestEnvironment + ) ;(provider as any).isInitialized = true await expect(provider.check()).resolves.toEqual({ diff --git a/test/main/provider/modelConfig.test.ts b/test/main/provider/modelConfig.test.ts index 5fd717f6ac..bfb93fd2e2 100644 --- a/test/main/provider/modelConfig.test.ts +++ b/test/main/provider/modelConfig.test.ts @@ -6,84 +6,23 @@ import type { ModelConfig } from '@shared/types/provider' import { providerDbLoader } from '../../../src/main/provider/providerDbLoader' import { modelCapabilities } from '../../../src/main/provider/modelCapabilities' -// Mock electron-store with in-memory storage -const mockStores = new Map>() +import { createMemoryStore } from '../../helpers/memoryStore' const rebuildModelCapabilities = () => { const capabilities = modelCapabilities as unknown as { rebuildIndexFromDb: () => void } capabilities.rebuildIndexFromDb() } -vi.mock('electron-store', () => { - return { - default: class MockElectronStore { - private storePath: string - private data: Record - - constructor(options: { name: string }) { - this.storePath = options.name - if (!mockStores.has(this.storePath)) { - mockStores.set(this.storePath, {}) - } - this.data = mockStores.get(this.storePath)! - } - - get(key: string) { - return this.data[key] - } - - set(key: string, value: any) { - this.data[key] = value - } - - delete(key: string) { - delete this.data[key] - } - - has(key: string) { - return key in this.data - } - - clear() { - Object.keys(this.data).forEach((key) => delete this.data[key]) - } - - get store() { - return { ...this.data } - } - - get path() { - return `/mock/path/${this.storePath}.json` - } - } - } -}) - describe('ModelConfigHelper', () => { let modelConfigHelper: ModelConfigHelper - let originalStoreData: Map> + let modelStore: ReturnType beforeEach(() => { - // Save original store state for restoration - originalStoreData = new Map() - mockStores.forEach((value, key) => { - originalStoreData.set(key, { ...value }) - }) - - // Clear stores for clean test state - mockStores.clear() - - // Initialize test instances - modelConfigHelper = new ModelConfigHelper() + modelStore = createMemoryStore() + modelConfigHelper = new ModelConfigHelper(modelStore) }) afterEach(() => { - // Restore original store state - mockStores.clear() - originalStoreData.forEach((value, key) => { - mockStores.set(key, value) - }) - vi.restoreAllMocks() rebuildModelCapabilities() }) @@ -414,7 +353,7 @@ describe('ModelConfigHelper', () => { const helperAny = modelConfigHelper as any const userKey = helperAny.generateCacheKey(providerId, userManagedModelId) - const refreshedHelper = new ModelConfigHelper() + const refreshedHelper = new ModelConfigHelper(modelStore) expect(refreshedHelper.hasUserConfig(userManagedModelId, providerId)).toBe(true) expect(refreshedHelper.getModelConfig(userManagedModelId, providerId).maxTokens).toBe( @@ -528,7 +467,10 @@ describe('ModelConfigHelper', () => { const defaults = modelConfigHelper.getModelConfig('qwen3.8-max', 'demo') expect(defaults.reasoningEffort).toBeUndefined() expect(defaults.thinkingBudget).toBeUndefined() - modelConfigHelper.setModelConfig('qwen3.8-max', 'demo', { thinkingBudget: 8192 }) + modelConfigHelper.setModelConfig('qwen3.8-max', 'demo', { + ...defaults, + thinkingBudget: 8192 + }) const budget = modelConfigHelper.getModelConfig('qwen3.8-max', 'demo') expect(budget.thinkingBudget).toBe(8192) expect(budget.reasoningEffort).toBeUndefined() diff --git a/test/main/provider/newApiProvider.test.ts b/test/main/provider/newApiProvider.test.ts index 35415efe05..b00405a0ce 100644 --- a/test/main/provider/newApiProvider.test.ts +++ b/test/main/provider/newApiProvider.test.ts @@ -1,3 +1,4 @@ +import { providerTestEnvironment } from '../../helpers/providerEnvironment' import type { ProviderSettingsPort } from '@/provider/settings' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' import type { LLM_PROVIDER, ModelConfig } from '@shared/types/provider' @@ -120,7 +121,8 @@ describe('NewApiProvider capability routing', () => { 'gpt-4o': { endpointType: 'openai-response' } - }) + }), + providerTestEnvironment ) const routeDecision = (provider as any).resolveRouteDecision('gpt-4o') const runtimeProvider = (provider as any).getRuntimeProvider(routeDecision) as LLM_PROVIDER @@ -137,7 +139,8 @@ describe('NewApiProvider capability routing', () => { 'gemini-model': { endpointType: 'gemini' } - }) + }), + providerTestEnvironment ) const routeDecision = (provider as any).resolveRouteDecision('gemini-model') const runtimeProvider = (provider as any).getRuntimeProvider(routeDecision) as LLM_PROVIDER @@ -156,7 +159,8 @@ describe('NewApiProvider capability routing', () => { 'gemini-model': { endpointType: 'gemini' } - }) + }), + providerTestEnvironment ) ;(provider as any).isInitialized = true @@ -196,7 +200,8 @@ describe('NewApiProvider capability routing', () => { 'claude-model': { endpointType: 'anthropic' } - }) + }), + providerTestEnvironment ) const routeDecision = (provider as any).resolveRouteDecision('claude-model') const runtimeProvider = (provider as any).getRuntimeProvider(routeDecision) as LLM_PROVIDER @@ -233,7 +238,8 @@ describe('NewApiProvider capability routing', () => { } ] } - ) + ), + providerTestEnvironment ) const routeDecision = (provider as any).resolveRouteDecision('claude-opus-4-7') const runtimeProvider = (provider as any).getRuntimeProvider(routeDecision) as LLM_PROVIDER @@ -270,7 +276,7 @@ describe('NewApiProvider capability routing', () => { type: ModelType.Chat, ownedBy: undefined }) - const provider = new AiSdkProvider(createProvider(), providerSettings) + const provider = new AiSdkProvider(createProvider(), providerSettings, providerTestEnvironment) const routeDecision = (provider as any).resolveRouteDecision('cached-model') @@ -350,7 +356,7 @@ describe('NewApiProvider capability routing', () => { vi.stubGlobal('fetch', fetchMock) const providerSettings = createProviderSettings() - const provider = new AiSdkProvider(createProvider(), providerSettings) + const provider = new AiSdkProvider(createProvider(), providerSettings, providerTestEnvironment) const models = await (provider as any).fetchProviderModels() @@ -402,7 +408,7 @@ describe('NewApiProvider capability routing', () => { ) const providerSettings = createProviderSettings() - const provider = new AiSdkProvider(createProvider(), providerSettings) + const provider = new AiSdkProvider(createProvider(), providerSettings, providerTestEnvironment) const models = await (provider as any).fetchProviderModels() expect(models[0]).toMatchObject({ @@ -440,7 +446,7 @@ describe('NewApiProvider capability routing', () => { ) const providerSettings = createProviderSettings() - const provider = new AiSdkProvider(createProvider(), providerSettings) + const provider = new AiSdkProvider(createProvider(), providerSettings, providerTestEnvironment) const models = await (provider as any).fetchProviderModels() expect(models[0]).toMatchObject({ @@ -484,7 +490,8 @@ describe('NewApiProvider capability routing', () => { } ] } - ) + ), + providerTestEnvironment ) const routeDecision = (provider as any).resolveRouteDecision('qwen3.7-max') const runtimeProvider = (provider as any).getRuntimeProvider(routeDecision) as LLM_PROVIDER @@ -549,7 +556,7 @@ describe('NewApiProvider capability routing', () => { endpointType: 'openai' } }) - const provider = new AiSdkProvider(createProvider(), providerSettings) + const provider = new AiSdkProvider(createProvider(), providerSettings, providerTestEnvironment) const getStoredModel = vi.spyOn(provider as any, 'getStoredModel') const resolveCapabilityIdentity = vi.spyOn(provider as any, 'resolveCapabilityIdentity') @@ -603,7 +610,7 @@ describe('NewApiProvider capability routing', () => { ) const providerSettings = createProviderSettings() - const provider = new AiSdkProvider(createProvider(), providerSettings) + const provider = new AiSdkProvider(createProvider(), providerSettings, providerTestEnvironment) const models = await (provider as any).fetchProviderModels() expect(models[0]).toMatchObject({ @@ -621,7 +628,8 @@ describe('NewApiProvider capability routing', () => { { 'new-api': models } - ) + ), + providerTestEnvironment ) const routeDecision = (runtimeProvider as any).resolveRouteDecision('gpt-5.5') const selectedProvider = (runtimeProvider as any).getRuntimeProvider( @@ -657,7 +665,8 @@ describe('NewApiProvider capability routing', () => { } ] } - ) + ), + providerTestEnvironment ) const routeDecision = (provider as any).resolveRouteDecision('gpt-5.5') const runtimeProvider = (provider as any).getRuntimeProvider(routeDecision) as LLM_PROVIDER @@ -687,7 +696,11 @@ describe('NewApiProvider capability routing', () => { }) ) - const provider = new AiSdkProvider(createProvider(), createProviderSettings()) + const provider = new AiSdkProvider( + createProvider(), + createProviderSettings(), + providerTestEnvironment + ) const models = await (provider as any).fetchProviderModels() expect(models[0]).toMatchObject({ @@ -704,7 +717,8 @@ describe('NewApiProvider capability routing', () => { { 'new-api': models } - ) + ), + providerTestEnvironment ) const routeDecision = (runtimeProvider as any).resolveRouteDecision('gpt-4.1') @@ -739,7 +753,11 @@ describe('NewApiProvider capability routing', () => { }) ) - const provider = new AiSdkProvider(createProvider(), createProviderSettings()) + const provider = new AiSdkProvider( + createProvider(), + createProviderSettings(), + providerTestEnvironment + ) const models = await (provider as any).fetchProviderModels() expect(models[0]).toMatchObject({ @@ -775,7 +793,11 @@ describe('NewApiProvider capability routing', () => { }) ) - const provider = new AiSdkProvider(createProvider(), createProviderSettings()) + const provider = new AiSdkProvider( + createProvider(), + createProviderSettings(), + providerTestEnvironment + ) const models = await (provider as any).fetchProviderModels() expect(models[0]).toMatchObject({ @@ -806,7 +828,11 @@ describe('NewApiProvider capability routing', () => { }) ) - const provider = new AiSdkProvider(createProvider(), createProviderSettings()) + const provider = new AiSdkProvider( + createProvider(), + createProviderSettings(), + providerTestEnvironment + ) const models = await (provider as any).fetchProviderModels() expect(models[0]).toMatchObject({ @@ -843,7 +869,11 @@ describe('NewApiProvider capability routing', () => { }) ) - const provider = new AiSdkProvider(createProvider(), createProviderSettings()) + const provider = new AiSdkProvider( + createProvider(), + createProviderSettings(), + providerTestEnvironment + ) const models = await (provider as any).fetchProviderModels() expect(models).toHaveLength(2) @@ -874,7 +904,11 @@ describe('NewApiProvider capability routing', () => { }) ) - const provider = new AiSdkProvider(createProvider(), createProviderSettings()) + const provider = new AiSdkProvider( + createProvider(), + createProviderSettings(), + providerTestEnvironment + ) const models = await (provider as any).fetchProviderModels() expect(models[0]).toMatchObject({ @@ -913,7 +947,11 @@ describe('NewApiProvider capability routing', () => { }) ) - const provider = new AiSdkProvider(createProvider(), createProviderSettings()) + const provider = new AiSdkProvider( + createProvider(), + createProviderSettings(), + providerTestEnvironment + ) const models = await (provider as any).fetchProviderModels() expect(models).toHaveLength(2) @@ -943,7 +981,7 @@ describe('NewApiProvider capability routing', () => { ) const providerSettings = createProviderSettings() - const provider = new AiSdkProvider(createProvider(), providerSettings) + const provider = new AiSdkProvider(createProvider(), providerSettings, providerTestEnvironment) const models = await (provider as any).fetchProviderModels() expect(models[0]).toMatchObject({ @@ -975,7 +1013,8 @@ describe('NewApiProvider capability routing', () => { } ] } - ) + ), + providerTestEnvironment ) const routeDecision = (provider as any).resolveRouteDecision('gpt-5.4') const runtimeProvider = (provider as any).getRuntimeProvider(routeDecision) as LLM_PROVIDER @@ -993,7 +1032,11 @@ describe('NewApiProvider capability routing', () => { apiType: 'openai', baseUrl: 'https://zenmux.ai/api' }) - const provider = new AiSdkProvider(zenmuxProvider, createProviderSettings()) + const provider = new AiSdkProvider( + zenmuxProvider, + createProviderSettings(), + providerTestEnvironment + ) const routeDecision = (provider as any).resolveRouteDecision('anthropic/claude-sonnet-4.5') const runtimeProvider = (provider as any).getRuntimeProvider(routeDecision) as LLM_PROVIDER const runtimeContext = (provider as any).buildRuntimeContext( @@ -1018,7 +1061,8 @@ describe('NewApiProvider capability routing', () => { apiType: 'anthropic', baseUrl: 'https://proxy.example.com/anthropic' }), - createProviderSettings() + createProviderSettings(), + providerTestEnvironment ) const routeDecision = (provider as any).resolveRouteDecision('claude-opus-4-7') const runtimeProvider = (provider as any).getRuntimeProvider(routeDecision) as LLM_PROVIDER @@ -1039,7 +1083,8 @@ describe('NewApiProvider capability routing', () => { apiType: 'anthropic', baseUrl: 'https://api.minimaxi.com/anthropic' }), - createProviderSettings() + createProviderSettings(), + providerTestEnvironment ) const routeDecision = (provider as any).resolveRouteDecision('MiniMax-M2.5') const runtimeProvider = (provider as any).getRuntimeProvider(routeDecision) as LLM_PROVIDER @@ -1060,7 +1105,7 @@ describe('NewApiProvider capability routing', () => { type: ModelType.Chat } }) - const provider = new AiSdkProvider(createProvider(), providerSettings) + const provider = new AiSdkProvider(createProvider(), providerSettings, providerTestEnvironment) ;(provider as any).isInitialized = true const result = await provider.completions( @@ -1080,7 +1125,7 @@ describe('NewApiProvider capability routing', () => { it('preserves the collect-stream image fallback without rereading model config', async () => { const providerSettings = createProviderSettings() - const provider = new AiSdkProvider(createProvider(), providerSettings) + const provider = new AiSdkProvider(createProvider(), providerSettings, providerTestEnvironment) ;(provider as any).isInitialized = true await provider.collectStreamResponse( diff --git a/test/main/provider/ollamaProvider.test.ts b/test/main/provider/ollamaProvider.test.ts index bc1c082db0..34a7405f39 100644 --- a/test/main/provider/ollamaProvider.test.ts +++ b/test/main/provider/ollamaProvider.test.ts @@ -1,3 +1,4 @@ +import { providerTestEnvironment } from '../../helpers/providerEnvironment' import type { ProviderSettingsPort } from '@/provider/settings' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' import { ModelType } from '../../../src/shared/model' @@ -36,18 +37,6 @@ vi.mock('@shared/logger', () => ({ } })) -vi.mock('@electron-toolkit/utils', () => ({ - is: { - dev: false - } -})) - -vi.mock('../../../src/main/device', () => ({ - DeviceService: { - getDefaultHeaders: () => ({}) - } -})) - const createModel = ( name: string, options?: { @@ -136,7 +125,8 @@ describe('OllamaProvider.fetchModels', () => { apiKey: 'test-key', baseUrl: 'http://localhost:11434/api' }, - providerSettings + providerSettings, + providerTestEnvironment ) const runtimeContext = (ollamaProvider as any).getAiSdkRuntimeContext('local-custom-model') @@ -165,7 +155,8 @@ describe('OllamaProvider.fetchModels', () => { ...provider, customHeaders: { 'X-Tenant-ID': 'team-a' } }, - providerSettings + providerSettings, + providerTestEnvironment ) const options = mockOllamaConstructorOptions.at(-1) as { @@ -178,7 +169,7 @@ describe('OllamaProvider.fetchModels', () => { }) it('merges local and running models, keeps running-only models, and preserves capabilities', async () => { - const ollamaProvider = new OllamaProvider(provider, providerSettings) + const ollamaProvider = new OllamaProvider(provider, providerSettings, providerTestEnvironment) vi.mocked(providerSettings.getProviderModels).mockClear() vi.spyOn(ollamaProvider, 'listModels').mockResolvedValue([ @@ -252,7 +243,7 @@ describe('OllamaProvider.fetchModels', () => { }) it('does not promote catalog fallback capabilities into provider facts', async () => { - const ollamaProvider = new OllamaProvider(provider, providerSettings) + const ollamaProvider = new OllamaProvider(provider, providerSettings, providerTestEnvironment) vi.spyOn(ollamaProvider, 'listModels').mockRejectedValue(new Error('ollama unavailable')) vi.spyOn(ollamaProvider, 'listRunningModels').mockResolvedValue([]) vi.mocked(providerSettings.getDbProviderModels).mockReturnValue([ @@ -286,7 +277,7 @@ describe('OllamaProvider.fetchModels', () => { }) it('uses ollama list output as the local model source when the SDK list is empty', async () => { - const ollamaProvider = new OllamaProvider(provider, providerSettings) + const ollamaProvider = new OllamaProvider(provider, providerSettings, providerTestEnvironment) ;(ollamaProvider as any).ollama = { list: vi.fn(async () => ({ models: [] })), show: vi.fn(async () => { @@ -325,7 +316,7 @@ describe('OllamaProvider.fetchModels', () => { }) it('preserves list model info when the show response is sparse', async () => { - const ollamaProvider = new OllamaProvider(provider, providerSettings) + const ollamaProvider = new OllamaProvider(provider, providerSettings, providerTestEnvironment) ;(ollamaProvider as any).ollama = { list: vi.fn(async () => ({ models: [createModel('qwen3:8b', { family: 'qwen', contextLength: 32768 })] @@ -348,7 +339,7 @@ describe('OllamaProvider.fetchModels', () => { }) it('keeps the running context separate from theoretical model metadata', async () => { - const ollamaProvider = new OllamaProvider(provider, providerSettings) + const ollamaProvider = new OllamaProvider(provider, providerSettings, providerTestEnvironment) let runtimeContextLength: unknown = 8192 const ps = vi.fn(async () => ({ models: [ @@ -397,7 +388,7 @@ describe('OllamaProvider.fetchModels', () => { }) it('distinguishes a stopped model from an unavailable runtime query', async () => { - const ollamaProvider = new OllamaProvider(provider, providerSettings) + const ollamaProvider = new OllamaProvider(provider, providerSettings, providerTestEnvironment) mockOllamaPs .mockResolvedValueOnce({ models: [] }) .mockRejectedValueOnce(new Error('ps unavailable')) @@ -410,7 +401,7 @@ describe('OllamaProvider.fetchModels', () => { }) it('diagnoses a running model from Ollama versions without runtime context metadata', async () => { - const ollamaProvider = new OllamaProvider(provider, providerSettings) + const ollamaProvider = new OllamaProvider(provider, providerSettings, providerTestEnvironment) mockOllamaPs.mockResolvedValue({ models: [{ name: 'qwen3:8b' }] }) @@ -421,7 +412,7 @@ describe('OllamaProvider.fetchModels', () => { }) it('matches the implicit latest tag in either model-name direction', async () => { - const ollamaProvider = new OllamaProvider(provider, providerSettings) + const ollamaProvider = new OllamaProvider(provider, providerSettings, providerTestEnvironment) mockOllamaPs .mockResolvedValueOnce({ models: [{ name: 'qwen3', context_length: 8192 }] @@ -441,7 +432,7 @@ describe('OllamaProvider.fetchModels', () => { it('bounds a stalled runtime context query without loading the model', async () => { vi.useFakeTimers() try { - const ollamaProvider = new OllamaProvider(provider, providerSettings) + const ollamaProvider = new OllamaProvider(provider, providerSettings, providerTestEnvironment) let transportSignal: AbortSignal | undefined const transportFetch = vi.fn( (_input: string | URL | Request, init?: RequestInit) => @@ -475,7 +466,7 @@ describe('OllamaProvider.fetchModels', () => { }) it('propagates cancellation of a stalled runtime context query', async () => { - const ollamaProvider = new OllamaProvider(provider, providerSettings) + const ollamaProvider = new OllamaProvider(provider, providerSettings, providerTestEnvironment) let transportSignal: AbortSignal | undefined const transportFetch = vi.fn( (_input: string | URL | Request, init?: RequestInit) => @@ -506,8 +497,9 @@ describe('OllamaProvider.fetchModels', () => { expect(transportSignal?.aborted).toBe(true) }) - it('confirms pull success against the ollama list model set', async () => { - const ollamaProvider = new OllamaProvider(provider, providerSettings) + it('pulls securely under the host policy and verifies the installed model', async () => { + process.env.DEEPCHAT_ALLOW_INSECURE_TLS = '1' + const ollamaProvider = new OllamaProvider(provider, providerSettings, providerTestEnvironment) ;(ollamaProvider as any).ollama = { pull: vi.fn(async () => ({ async *[Symbol.asyncIterator]() { @@ -541,9 +533,11 @@ describe('OllamaProvider.fetchModels', () => { ) }) - it('only enables insecure pulls behind the explicit TLS debug flag', async () => { - process.env.DEEPCHAT_ALLOW_INSECURE_TLS = '1' - const ollamaProvider = new OllamaProvider(provider, providerSettings) + it('enables insecure pulls only when the host TLS policy allows them', async () => { + const ollamaProvider = new OllamaProvider(provider, providerSettings, { + ...providerTestEnvironment, + allowInsecureTls: true + }) ;(ollamaProvider as any).ollama = { pull: vi.fn(async () => ({ async *[Symbol.asyncIterator]() { @@ -567,7 +561,7 @@ describe('OllamaProvider.fetchModels', () => { }) it('treats latest tags from ollama list as a successful untagged pull', async () => { - const ollamaProvider = new OllamaProvider(provider, providerSettings) + const ollamaProvider = new OllamaProvider(provider, providerSettings, providerTestEnvironment) ;(ollamaProvider as any).ollama = { pull: vi.fn(async () => ({ async *[Symbol.asyncIterator]() { diff --git a/test/main/provider/openAICompatibleProvider.test.ts b/test/main/provider/openAICompatibleProvider.test.ts index 41ae80da27..3645652084 100644 --- a/test/main/provider/openAICompatibleProvider.test.ts +++ b/test/main/provider/openAICompatibleProvider.test.ts @@ -1,6 +1,9 @@ +import { providerTestEnvironment } from '../../helpers/providerEnvironment' import type { ProviderSettingsPort } from '@/provider/settings' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' import type { LLM_PROVIDER, ModelConfig } from '@shared/types/provider' +import type { LLMCoreStreamEvent } from '@shared/types/core/llm-events' +import { ModelType } from '@shared/model' import { AiSdkProvider, normalizeExtractedImageText @@ -21,6 +24,15 @@ const { mockRunAiSdkGenerateText: vi.fn() })) +const grokAuth = vi.hoisted(() => ({ + captureOperation: () => () => undefined, + ensureAccessToken: vi.fn<() => Promise>() +})) + +vi.mock('../../../src/main/provider/auth/xaiGrok', () => ({ + getGlobalXaiGrokAuth: () => grokAuth +})) + vi.mock('electron', () => ({ app: { getName: vi.fn(() => 'DeepChat'), @@ -72,6 +84,12 @@ const createProviderSettings = (): ProviderSettingsPort => getModelStatus: vi.fn().mockReturnValue(true) }) as unknown as ProviderSettingsPort +const locale = { + allowInsecureTls: providerTestEnvironment.allowInsecureTls, + defaultHeaders: providerTestEnvironment.defaultHeaders, + getLanguage: () => 'en-US' +} + describe('AiSdkProvider openai-compatible', () => { beforeEach(() => { vi.clearAllMocks() @@ -92,7 +110,7 @@ describe('AiSdkProvider openai-compatible', () => { it.each(['text-embedding-3-small', 'text-embedding-ada-002', 'text-embedding-3-large'])( 'honors cancellation before returning hard-coded dimensions for %s', async (modelId) => { - const provider = new AiSdkProvider(createProvider(), createProviderSettings()) + const provider = new AiSdkProvider(createProvider(), createProviderSettings(), locale) const controller = new AbortController() controller.abort() @@ -113,7 +131,11 @@ describe('AiSdkProvider openai-compatible', () => { }) vi.stubGlobal('fetch', fetchMock) - const provider = new AiSdkProvider(createProvider({ enable: true }), createProviderSettings()) + const provider = new AiSdkProvider( + createProvider({ enable: true }), + createProviderSettings(), + locale + ) const results = await Promise.all(Array.from({ length: 8 }, () => provider.fetchModels())) expect(fetchMock).toHaveBeenCalledTimes(1) @@ -158,7 +180,7 @@ describe('AiSdkProvider openai-compatible', () => { }) vi.stubGlobal('fetch', fetchMock) - const provider = new AiSdkProvider(createProvider(), createProviderSettings()) + const provider = new AiSdkProvider(createProvider(), createProviderSettings(), locale) await provider.requestProviderJson('https://mock.example.com/v1/models', { method: 'GET', headers @@ -170,8 +192,31 @@ describe('AiSdkProvider openai-compatible', () => { expect(requestHeaders.get('x-tenant-id')).toBe('team-a') }) + it('resolves current Grok OAuth credentials for each direct catalog request', async () => { + grokAuth.ensureAccessToken + .mockResolvedValueOnce('first-oauth-token') + .mockResolvedValueOnce('current-oauth-token') + const fetchMock = vi + .fn() + .mockImplementation(async () => Response.json({ data: [] })) + vi.stubGlobal('fetch', fetchMock) + const provider = new AiSdkProvider( + createProvider({ id: 'grok', baseUrl: 'https://api.x.ai/v1' }), + createProviderSettings(), + locale + ) + + await provider.requestProviderJson('https://api.x.ai/v1/models') + await provider.requestProviderJson('https://api.x.ai/v1/models') + + expect(grokAuth.ensureAccessToken).toHaveBeenCalledTimes(2) + expect( + fetchMock.mock.calls.map(([, options]) => new Headers(options?.headers).get('Authorization')) + ).toEqual(['Bearer first-oauth-token', 'Bearer current-oauth-token']) + }) + it('forwards streaming requests to the AI SDK runtime', async () => { - const provider = new AiSdkProvider(createProvider(), createProviderSettings()) + const provider = new AiSdkProvider(createProvider(), createProviderSettings(), locale) ;(provider as any).isInitialized = true const modelConfig: ModelConfig = { @@ -180,11 +225,11 @@ describe('AiSdkProvider openai-compatible', () => { vision: false, functionCall: true, reasoning: false, - type: 'chat' + type: ModelType.Chat } const signal = new AbortController().signal - const events = [] + const events: LLMCoreStreamEvent[] = [] for await (const event of provider.coreStream( [{ role: 'user', content: 'hello' }], 'gpt-4o', @@ -220,7 +265,7 @@ describe('AiSdkProvider openai-compatible', () => { }) vi.stubGlobal('fetch', fetchMock) - const provider = new AiSdkProvider(createProvider(), createProviderSettings()) + const provider = new AiSdkProvider(createProvider(), createProviderSettings(), locale) ;(provider as any).isInitialized = true const result = await provider.transcribeAudio( @@ -262,7 +307,7 @@ describe('AiSdkProvider openai-compatible', () => { }) ) - const provider = new AiSdkProvider(createProvider(), createProviderSettings()) + const provider = new AiSdkProvider(createProvider(), createProviderSettings(), locale) ;(provider as any).isInitialized = true await expect( @@ -271,7 +316,7 @@ describe('AiSdkProvider openai-compatible', () => { }) it('uses image generation for OpenAI-compatible models declared by type', async () => { - const provider = new AiSdkProvider(createProvider(), createProviderSettings()) + const provider = new AiSdkProvider(createProvider(), createProviderSettings(), locale) ;(provider as any).isInitialized = true const modelConfig = { @@ -318,7 +363,8 @@ describe('AiSdkProvider openai-compatible', () => { apiType: 'openai-completions', baseUrl: 'https://example.openai.azure.com/openai/deployments/deepchat-prod' }), - createProviderSettings() + createProviderSettings(), + locale ) ;(provider as any).isInitialized = true diff --git a/test/main/provider/openAIResponsesProvider.test.ts b/test/main/provider/openAIResponsesProvider.test.ts index 5f92fbbbb9..6ccadef751 100644 --- a/test/main/provider/openAIResponsesProvider.test.ts +++ b/test/main/provider/openAIResponsesProvider.test.ts @@ -1,3 +1,4 @@ +import { providerTestEnvironment } from '../../helpers/providerEnvironment' import type { ProviderSettingsPort } from '@/provider/settings' import { beforeEach, describe, expect, it, vi } from 'vitest' import type { LLM_PROVIDER, ModelConfig } from '@shared/types/provider' @@ -69,7 +70,11 @@ describe('OpenAIResponsesProvider', () => { }) it('uses the responses runtime for official OpenAI providers', async () => { - const provider = new AiSdkProvider(createProvider(), createProviderSettings()) + const provider = new AiSdkProvider( + createProvider(), + createProviderSettings(), + providerTestEnvironment + ) ;(provider as any).isInitialized = true for await (const _event of provider.coreStream( @@ -109,7 +114,8 @@ describe('OpenAIResponsesProvider', () => { name: 'Azure OpenAI', baseUrl: 'https://example.openai.azure.com/openai' }), - createProviderSettings() + createProviderSettings(), + providerTestEnvironment ) ;(provider as any).isInitialized = true @@ -160,7 +166,8 @@ describe('OpenAIResponsesProvider', () => { apiType: 'deepseek', baseUrl: 'https://api.deepseek.com/v1' }), - createProviderSettings() + createProviderSettings(), + providerTestEnvironment ) ;(provider as any).isInitialized = true @@ -200,7 +207,8 @@ describe('OpenAIResponsesProvider', () => { apiType: 'deepseek', baseUrl: 'https://api.deepseek.com/v1' }), - createProviderSettings() + createProviderSettings(), + providerTestEnvironment ) ;(provider as any).isInitialized = true @@ -241,7 +249,8 @@ describe('OpenAIResponsesProvider', () => { apiType: 'deepseek', baseUrl: 'https://api.deepseek.com/v1' }), - createProviderSettings() + createProviderSettings(), + providerTestEnvironment ) ;(provider as any).isInitialized = true @@ -286,7 +295,11 @@ describe('OpenAIResponsesProvider', () => { }) vi.stubGlobal('fetch', fetchMock) - const provider = new AiSdkProvider(createProvider(), createProviderSettings()) + const provider = new AiSdkProvider( + createProvider(), + createProviderSettings(), + providerTestEnvironment + ) ;(provider as any).isInitialized = true const text = await provider.transcribeAudio('gpt-4o-mini-transcribe', 'AQID', 'audio/wav') @@ -313,7 +326,11 @@ describe('OpenAIResponsesProvider', () => { }) ) - const provider = new AiSdkProvider(createProvider(), createProviderSettings()) + const provider = new AiSdkProvider( + createProvider(), + createProviderSettings(), + providerTestEnvironment + ) ;(provider as any).isInitialized = true await expect( diff --git a/test/main/provider/openaiCodexAdapter.test.ts b/test/main/provider/openaiCodexAdapter.test.ts index dfeafb76e0..fb907119dc 100644 --- a/test/main/provider/openaiCodexAdapter.test.ts +++ b/test/main/provider/openaiCodexAdapter.test.ts @@ -1,6 +1,7 @@ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' const authState = vi.hoisted(() => ({ + captureOperation: () => () => undefined, getAccessToken: vi.fn(), forceRefreshAccessToken: vi.fn(), getBackendAuth: vi.fn(), @@ -235,4 +236,37 @@ describe('OpenAI Codex adapter', () => { code: 'openai_codex_bad_request' }) }) + it.each(['request abort', 'auth replacement'] as const)( + 'does not dispatch a token resolved after %s', + async (change) => { + const { createOpenAICodexFetch } = await import('@/provider/openaiCodexAdapter') + let finish!: (value: { accessToken: string }) => void + authState.getBackendAuth.mockReturnValue( + new Promise((resolve) => { + finish = resolve + }) + ) + let current = true + const capture = vi.spyOn(authState, 'captureOperation').mockImplementation(() => () => { + if (!current) throw new DOMException('Auth changed', 'AbortError') + return undefined + }) + try { + const controller = new AbortController() + const fetch = vi.fn() + const pending = createOpenAICodexFetch({}, fetch)( + 'https://chatgpt.com/backend-api/codex/responses', + { signal: controller.signal } + ) + const rejected = expect(pending).rejects.toMatchObject({ name: 'AbortError' }) + if (change === 'request abort') controller.abort() + else current = false + finish({ accessToken: 'late-token' }) + await rejected + expect(fetch).not.toHaveBeenCalled() + } finally { + capture.mockRestore() + } + } + ) }) diff --git a/test/main/provider/openaiCodexCredentialStore.test.ts b/test/main/provider/openaiCodexCredentialStore.test.ts deleted file mode 100644 index b71f867d38..0000000000 --- a/test/main/provider/openaiCodexCredentialStore.test.ts +++ /dev/null @@ -1,203 +0,0 @@ -import * as fs from 'fs' -import { beforeEach, describe, expect, it, vi } from 'vitest' -import { safeStorage } from 'electron' -import { - OpenAICodexCredentialStore, - type OpenAICodexTokenSet -} from '@/provider/auth/openaiCodex/credentialStore' - -const filePath = '/tmp/deepchat-openai-codex/credentials.json' - -const tokens: OpenAICodexTokenSet = { - accessToken: 'access-token', - refreshToken: 'refresh-token', - tokenType: 'Bearer', - expiresAt: Date.now() + 3_600_000, - updatedAt: Date.now() -} - -function fileEnvelope(value: OpenAICodexTokenSet): string { - return JSON.stringify({ version: 1, storage: 'file', tokens: value, updatedAt: 1 }) -} - -describe('OpenAICodexCredentialStore', () => { - let savedContent: string | null = null - - beforeEach(() => { - savedContent = null - vi.mocked(fs.readFileSync).mockImplementation(() => { - if (savedContent === null) { - throw Object.assign(new Error('ENOENT: no such file or directory'), { code: 'ENOENT' }) - } - return savedContent - }) - vi.mocked(fs.writeFileSync).mockImplementation((_, data) => { - savedContent = String(data) - }) - vi.mocked(fs.mkdirSync).mockImplementation(() => undefined as unknown as string) - vi.mocked(fs.renameSync).mockImplementation(() => {}) - vi.mocked(fs.readdirSync).mockImplementation(() => []) - vi.mocked(safeStorage.isEncryptionAvailable).mockReturnValue(false) - }) - - it('returns null without an error when the credential file is missing', () => { - const warn = vi.spyOn(console, 'warn').mockImplementation(() => {}) - const store = new OpenAICodexCredentialStore(filePath) - - expect(store.load()).toBeNull() - expect(store.getLoadError()).toBeNull() - expect(warn).not.toHaveBeenCalled() - }) - - it('reports corrupted JSON instead of treating it as signed out', () => { - const warn = vi.spyOn(console, 'warn').mockImplementation(() => {}) - savedContent = '{broken' - const store = new OpenAICodexCredentialStore(filePath) - - expect(store.load()).toBeNull() - expect(store.getLoadError()).toContain('not valid JSON') - expect(warn).toHaveBeenCalled() - }) - - it('reports decryption failures instead of treating them as signed out', () => { - vi.spyOn(console, 'warn').mockImplementation(() => {}) - vi.mocked(safeStorage.decryptString).mockImplementationOnce(() => { - throw new Error('keyring locked') - }) - savedContent = JSON.stringify({ - version: 1, - storage: 'safeStorage', - wrapped: Buffer.from('ciphertext').toString('base64'), - updatedAt: 1 - }) - const store = new OpenAICodexCredentialStore(filePath) - - expect(store.load()).toBeNull() - expect(store.getLoadError()).toContain('decryption failed') - }) - - it('returns tokens and clears the load error for a healthy envelope', () => { - savedContent = fileEnvelope(tokens) - const store = new OpenAICodexCredentialStore(filePath) - - expect(store.load()?.accessToken).toBe('access-token') - expect(store.getLoadError()).toBeNull() - }) - - it('writes through a temporary file and renames it into place', () => { - const store = new OpenAICodexCredentialStore(filePath) - - store.save(tokens) - - const temporaryPath = String(vi.mocked(fs.openSync).mock.calls[0][0]) - expect(temporaryPath).toMatch(/^\/tmp\/deepchat-openai-codex\/credentials\.json\.tmp-/) - expect(fs.openSync).toHaveBeenCalledWith(temporaryPath, 'w', 0o600) - expect(fs.fsyncSync).toHaveBeenCalled() - expect(fs.renameSync).toHaveBeenCalledWith(temporaryPath, filePath) - expect(fs.rmSync).toHaveBeenCalledWith(temporaryPath, { force: true }) - expect(store.load()?.accessToken).toBe('access-token') - }) - - it('removes the temporary file when the rename fails', () => { - vi.spyOn(console, 'warn').mockImplementation(() => {}) - vi.mocked(fs.renameSync).mockImplementation(() => { - throw new Error('EPERM: operation not permitted') - }) - const store = new OpenAICodexCredentialStore(filePath) - - expect(() => store.save(tokens)).toThrow('EPERM') - const temporaryPath = String(vi.mocked(fs.openSync).mock.calls[0][0]) - expect(fs.rmSync).toHaveBeenCalledWith(temporaryPath, { force: true }) - }) - - it('backs up a corrupted file before overwriting it', () => { - vi.spyOn(console, 'warn').mockImplementation(() => {}) - savedContent = '{broken' - let backupSnapshot: string | null = null - vi.mocked(fs.copyFileSync).mockImplementation(() => { - backupSnapshot = savedContent - }) - const store = new OpenAICodexCredentialStore(filePath) - - store.save(tokens) - - expect(fs.copyFileSync).toHaveBeenCalledWith(filePath, `${filePath}.corrupt`) - expect(fs.renameSync).not.toHaveBeenCalledWith(filePath, `${filePath}.corrupt`) - expect(backupSnapshot).toBe('{broken') - expect(store.getLoadError()).toBeNull() - }) - - it('does not back up an undecryptable file before overwriting it', () => { - vi.spyOn(console, 'warn').mockImplementation(() => {}) - vi.mocked(safeStorage.decryptString).mockImplementation(() => { - throw new Error('keyring locked') - }) - savedContent = JSON.stringify({ - version: 1, - storage: 'safeStorage', - wrapped: Buffer.from('ciphertext').toString('base64'), - updatedAt: 1 - }) - const store = new OpenAICodexCredentialStore(filePath) - - store.save(tokens) - - expect(fs.copyFileSync).not.toHaveBeenCalled() - }) - - it('does not back up a healthy file before overwriting it', () => { - savedContent = fileEnvelope(tokens) - const store = new OpenAICodexCredentialStore(filePath) - - store.save({ ...tokens, accessToken: 'new-access-token' }) - - expect(fs.copyFileSync).not.toHaveBeenCalled() - expect(store.load()?.accessToken).toBe('new-access-token') - }) - - it('clear removes the credential file together with its backup and temp file', () => { - const store = new OpenAICodexCredentialStore(filePath) - - store.clear() - - expect(fs.rmSync).toHaveBeenCalledWith(filePath, { force: true }) - expect(fs.rmSync).toHaveBeenCalledWith(`${filePath}.corrupt`, { force: true }) - expect(fs.rmSync).toHaveBeenCalledWith(`${filePath}.tmp`, { force: true }) - }) - - it('clear still attempts the backup and temp files when the main removal fails', () => { - vi.spyOn(console, 'warn').mockImplementation(() => {}) - vi.mocked(fs.rmSync).mockImplementation((target) => { - if (String(target) === filePath) { - throw new Error('EISDIR: illegal operation on a directory') - } - }) - const store = new OpenAICodexCredentialStore(filePath) - - store.clear() - - expect(fs.rmSync).toHaveBeenCalledWith(`${filePath}.corrupt`, { force: true }) - expect(fs.rmSync).toHaveBeenCalledWith(`${filePath}.tmp`, { force: true }) - }) - - it('clear also removes randomized temporary credential files', () => { - vi.mocked(fs.readdirSync).mockImplementation( - () => - [ - 'credentials.json.tmp-1234-aabbccddeeff', - 'credentials.json.tmp-5678-001122334455', - 'unrelated.txt' - ] as unknown as fs.Dirent>[] - ) - const store = new OpenAICodexCredentialStore(filePath) - - store.clear() - - expect(fs.rmSync).toHaveBeenCalledWith(`${filePath}.tmp-1234-aabbccddeeff`, { force: true }) - expect(fs.rmSync).toHaveBeenCalledWith(`${filePath}.tmp-5678-001122334455`, { force: true }) - expect(fs.rmSync).not.toHaveBeenCalledWith( - expect.stringContaining('unrelated'), - expect.anything() - ) - }) -}) diff --git a/test/main/provider/openaiCodexProvider.test.ts b/test/main/provider/openaiCodexProvider.test.ts index f525b8a592..5e1e3cc31f 100644 --- a/test/main/provider/openaiCodexProvider.test.ts +++ b/test/main/provider/openaiCodexProvider.test.ts @@ -1,3 +1,4 @@ +import { providerTestEnvironment } from '../../helpers/providerEnvironment' import path from 'path' import { describe, expect, it, vi } from 'vitest' @@ -208,7 +209,11 @@ describe('OpenAI Codex provider registration', () => { } ] } as any) - const aiSdkProvider = new AiSdkProvider(provider, providerSettings as any) + const aiSdkProvider = new AiSdkProvider( + provider, + providerSettings as any, + providerTestEnvironment + ) const models = await aiSdkProvider.fetchModels() providerDbSpy.mockRestore() diff --git a/test/main/provider/providerDbLoader.test.ts b/test/main/provider/providerDbLoader.test.ts index 7e096b3555..007b70981e 100644 --- a/test/main/provider/providerDbLoader.test.ts +++ b/test/main/provider/providerDbLoader.test.ts @@ -3,10 +3,6 @@ import * as os from 'node:os' import * as path from 'node:path' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' -const state = vi.hoisted(() => ({ - getPath: vi.fn(), - getAppPath: vi.fn() -})) const DEFAULT_PROVIDER_DB_URL = 'https://raw.githubusercontent.com/ThinkInAIXYZ/PublicProviderConf/refs/heads/dev/dist/all.json' @@ -19,21 +15,21 @@ vi.mock('fs', async () => { } }) -vi.mock('electron', () => ({ - app: { - getPath: state.getPath, - getAppPath: state.getAppPath - } -})) - describe('ProviderDbLoader', () => { let tempRoot: string let appRoot: string let userDataRoot: string - const importLoader = async () => { + const importLoaderFactory = async () => { const mod = await import('../../../src/main/provider/providerDbLoader') - return mod.ProviderDbLoader + return () => { + const loader = new mod.ProviderDbLoader() + loader.configure({ + userDataDirectory: userDataRoot, + builtInCatalogPath: path.join(appRoot, 'resources', 'model-db', 'providers.json') + }) + return loader + } } const getCacheDir = () => path.join(userDataRoot, 'provider-db') @@ -88,11 +84,6 @@ describe('ProviderDbLoader', () => { fs.mkdirSync(appRoot, { recursive: true }) fs.mkdirSync(userDataRoot, { recursive: true }) - state.getPath.mockImplementation((name: string) => { - if (name === 'userData') return userDataRoot - return userDataRoot - }) - state.getAppPath.mockReturnValue(appRoot) vi.unstubAllGlobals() delete process.env.PROVIDER_DB_TTL_HOURS delete process.env.PROVIDER_DB_URL @@ -106,14 +97,123 @@ describe('ProviderDbLoader', () => { fs.rmSync(tempRoot, { recursive: true, force: true }) }) - it('resolves DEEPCHAT_E2E_USER_DATA_DIR as provider-db base directory', async () => { + it('keeps imports inert until explicit profile bootstrap and rejects profile replacement', async () => { + const { ProviderDbLoader } = await import('../../../src/main/provider/providerDbLoader') + const loader = new ProviderDbLoader() + expect(loader.getDb()).toBeNull() + expect(fs.existsSync(getCacheDir())).toBe(false) + await expect(loader.refreshIfNeeded(true)).rejects.toThrow('paths are required') + loader.configure({ + userDataDirectory: userDataRoot, + builtInCatalogPath: path.join(appRoot, 'resources', 'model-db', 'providers.json') + }) + expect(() => + loader.configure({ + userDataDirectory: path.join(tempRoot, 'another-profile'), + builtInCatalogPath: path.join(appRoot, 'resources', 'model-db', 'providers.json') + }) + ).toThrow('another profile') + }) + + it('drains a stopped refresh without accepting late response headers', async () => { + writeBuiltInDb(createAggregate(['builtin'])) + let release!: (response: Response) => void + let signal: AbortSignal | undefined + vi.stubGlobal( + 'fetch', + vi.fn((_url, options) => { + signal = options.signal + return new Promise((resolve) => { + release = resolve + }) + }) + ) + const createLoader = await importLoaderFactory() + const loader = createLoader() + expect(loader.getProvider('builtin')).toBeDefined() + const changed = vi.fn() + loader.subscribeCatalogChanges(changed) + const refresh = loader.refreshIfNeeded(true) + loader.stop() + let drained = false + const drain = loader.drain().then(() => { + drained = true + }) + await Promise.resolve() + expect(signal?.aborted).toBe(true) + expect(drained).toBe(false) + release(new Response(JSON.stringify(createAggregate(['late'])))) + expect((await refresh).status).toBe('skipped') + await drain + expect(changed).not.toHaveBeenCalled() + expect(loader.getProvider('late')).toBeUndefined() + expect(fs.existsSync(getCacheFile())).toBe(false) + expect(fs.existsSync(getMetaFile())).toBe(false) + expect((await loader.refreshIfNeeded(true)).status).toBe('skipped') + expect(fetch).toHaveBeenCalledOnce() + }) + + it.each(['shutdown', 'task cancellation'] as const)( + 'rejects a late body after %s without changing existing cache or metadata', + async (reason) => { + writeCachedDb(createAggregate(['cached'])) + const meta = { sourceUrl: DEFAULT_PROVIDER_DB_URL, lastUpdated: 1, ttlHours: 4 } + writeMeta(meta) + const originalMeta = fs.readFileSync(getMetaFile(), 'utf8') + let bodyStarted!: () => void + const started = new Promise((resolve) => { + bodyStarted = resolve + }) + let release!: (value: string) => void + const body = new Promise((resolve) => { + release = resolve + }) + vi.stubGlobal( + 'fetch', + vi.fn(async () => ({ + ok: true, + status: 200, + headers: new Headers({ etag: 'late' }), + body: null, + text: () => { + bodyStarted() + return body + } + })) + ) + const createLoader = await importLoaderFactory() + const loader = createLoader() + const owner = new AbortController() + const refresh = loader.refreshIfNeeded(true, { signal: owner.signal }) + await started + if (reason === 'shutdown') loader.stop() + else owner.abort() + release(JSON.stringify(createAggregate(['late']))) + expect((await refresh).status).toBe('skipped') + await loader.drain() + expect(JSON.parse(fs.readFileSync(getCacheFile(), 'utf8'))).toEqual( + createAggregate(['cached']) + ) + expect(fs.readFileSync(getMetaFile(), 'utf8')).toBe(originalMeta) + if (reason === 'task cancellation') { + vi.stubGlobal( + 'fetch', + vi.fn(async () => new Response(JSON.stringify(createAggregate(['fresh'])))) + ) + expect((await loader.refreshIfNeeded(true)).status).toBe('updated') + expect(loader.getProvider('fresh')).toBeDefined() + } + } + ) + + it('uses the explicit profile instead of the ambient E2E directory', async () => { const oldDir = process.env.DEEPCHAT_E2E_USER_DATA_DIR const e2eUserDataRoot = path.join(tempRoot, 'e2e-user-data') process.env.DEEPCHAT_E2E_USER_DATA_DIR = e2eUserDataRoot - const ProviderDbLoader = await importLoader() - new ProviderDbLoader() - expect(fs.existsSync(path.join(e2eUserDataRoot, 'provider-db'))).toBe(true) - expect(fs.existsSync(getCacheDir())).toBe(false) + const createLoader = await importLoaderFactory() + createLoader() + expect(fs.existsSync(path.join(e2eUserDataRoot, 'provider-db'))).toBe(false) + expect(fs.existsSync(getCacheDir())).toBe(true) if (oldDir === undefined) { delete process.env.DEEPCHAT_E2E_USER_DATA_DIR } else { @@ -121,7 +221,7 @@ describe('ProviderDbLoader', () => { } }) - it('initializes from cache and still triggers a startup refresh when cache is fresh', async () => { + it('loads cache without detaching work and permits an explicit automatic startup refresh', async () => { writeBuiltInDb(createAggregate(['builtin'])) writeCachedDb(createAggregate(['openai'])) const now = Date.now() @@ -142,14 +242,16 @@ describe('ProviderDbLoader', () => { }) vi.stubGlobal('fetch', fetchMock) - const ProviderDbLoader = await importLoader() - const loader = new ProviderDbLoader() + const createLoader = await importLoaderFactory() + const loader = createLoader() const catalogChanged = vi.fn() loader.subscribeCatalogChanges(catalogChanged) await loader.initialize() expect(loader.getDb()?.providers).toHaveProperty('openai') + expect(fetchMock).not.toHaveBeenCalled() + await loader.refreshIfNeeded(true, { automatic: true }) expect(fetchMock).toHaveBeenCalledTimes(1) expect(catalogChanged).toHaveBeenCalledWith({ reason: 'loaded', @@ -164,13 +266,14 @@ describe('ProviderDbLoader', () => { const fetchMock = vi.fn() vi.stubGlobal('fetch', fetchMock) - const ProviderDbLoader = await importLoader() - const loader = new ProviderDbLoader() + const createLoader = await importLoaderFactory() + const loader = createLoader() loader.setPrivacyModeResolver(() => true) await loader.initialize() expect(loader.getDb()?.providers).toHaveProperty('openai') + await loader.refreshIfNeeded(true, { automatic: true }) expect(fetchMock).not.toHaveBeenCalled() }) @@ -187,8 +290,8 @@ describe('ProviderDbLoader', () => { const fetchMock = vi.fn() vi.stubGlobal('fetch', fetchMock) - const ProviderDbLoader = await importLoader() - const loader = new ProviderDbLoader() + const createLoader = await importLoaderFactory() + const loader = createLoader() const result = await loader.refreshIfNeeded(false) @@ -233,8 +336,8 @@ describe('ProviderDbLoader', () => { ) .mockResolvedValueOnce(new Response(null, { status: 304 })) vi.stubGlobal('fetch', fetchMock) - const ProviderDbLoader = await importLoader() - const loader = new ProviderDbLoader() + const createLoader = await importLoaderFactory() + const loader = createLoader() expect((await loader.refreshIfNeeded()).status).toBe('updated') expect(fetchMock.mock.calls[0][1].headers).not.toHaveProperty('If-None-Match') expect( @@ -243,8 +346,7 @@ describe('ProviderDbLoader', () => { expect((await loader.refreshIfNeeded(true)).status).toBe('not-modified') expect(fetchMock.mock.calls[1][1].headers['If-None-Match']).toBe('"same"') expect( - new ProviderDbLoader().getModel('zhipuai', 'glm-5.3')?.extra_capabilities?.reasoning - ?.effort_options + createLoader().getModel('zhipuai', 'glm-5.3')?.extra_capabilities?.reasoning?.effort_options ).toEqual(['low', 'high', 'max']) } ) @@ -269,8 +371,8 @@ describe('ProviderDbLoader', () => { }) vi.stubGlobal('fetch', fetchMock) - const ProviderDbLoader = await importLoader() - const loader = new ProviderDbLoader() + const createLoader = await importLoaderFactory() + const loader = createLoader() const result = await loader.refreshIfNeeded(true) @@ -301,8 +403,8 @@ describe('ProviderDbLoader', () => { }) vi.stubGlobal('fetch', fetchMock) - const ProviderDbLoader = await importLoader() - const loader = new ProviderDbLoader() + const createLoader = await importLoaderFactory() + const loader = createLoader() const catalogChanged = vi.fn() loader.subscribeCatalogChanges(catalogChanged) @@ -332,8 +434,8 @@ describe('ProviderDbLoader', () => { }) vi.stubGlobal('fetch', fetchMock) - const ProviderDbLoader = await importLoader() - const loader = new ProviderDbLoader() + const createLoader = await importLoaderFactory() + const loader = createLoader() await loader.refreshIfNeeded(true) @@ -354,8 +456,8 @@ describe('ProviderDbLoader', () => { }) vi.stubGlobal('fetch', fetchMock) - const ProviderDbLoader = await importLoader() - const loader = new ProviderDbLoader() + const createLoader = await importLoaderFactory() + const loader = createLoader() loader.setPrivacyModeResolver(() => true) const result = await loader.refreshIfNeeded(true) @@ -378,8 +480,8 @@ describe('ProviderDbLoader', () => { vi.stubGlobal('fetch', vi.fn().mockRejectedValue(new Error('network down'))) - const ProviderDbLoader = await importLoader() - const loader = new ProviderDbLoader() + const createLoader = await importLoaderFactory() + const loader = createLoader() const result = await loader.refreshIfNeeded(true) diff --git a/test/main/provider/providerDbModelConfig.test.ts b/test/main/provider/providerDbModelConfig.test.ts index 4ac32c5f72..b6c54066aa 100644 --- a/test/main/provider/providerDbModelConfig.test.ts +++ b/test/main/provider/providerDbModelConfig.test.ts @@ -1,44 +1,9 @@ import { describe, it, expect, beforeEach, vi } from 'vitest' -// Mock electron-store with in-memory storage to persist user configs across helper instances -const state = vi.hoisted(() => ({ - mockStores: new Map>(), - mockDb: null as any -})) -vi.mock('electron-store', () => { - return { - default: class MockElectronStore { - private storePath: string - private data: Record - constructor(options: { name: string }) { - this.storePath = options.name - if (!state.mockStores.has(this.storePath)) state.mockStores.set(this.storePath, {}) - this.data = state.mockStores.get(this.storePath)! - } - get(key: string) { - return this.data[key] - } - set(key: string, value: any) { - this.data[key] = value - } - delete(key: string) { - delete this.data[key] - } - has(key: string) { - return key in this.data - } - clear() { - Object.keys(this.data).forEach((k) => delete this.data[k]) - } - get store() { - return { ...this.data } - } - get path() { - return `/mock/${this.storePath}.json` - } - } - } -}) +import { createMemoryStore } from '../../helpers/memoryStore' + +const state = vi.hoisted(() => ({ mockDb: null as any })) +let modelStore: ReturnType // Mock providerDbLoader with a mutable in-memory aggregate vi.mock('../../../src/main/provider/providerDbLoader', () => { @@ -58,8 +23,7 @@ import { resolveCapabilityIdentity } from '../../../src/main/provider/capability describe('Provider DB strict matching and user overrides', () => { beforeEach(() => { - // Reset stores and mock DB before each test - state.mockStores.clear() + modelStore = createMemoryStore() state.mockDb = { providers: { openai: { @@ -285,7 +249,7 @@ describe('Provider DB strict matching and user overrides', () => { }) it('returns provider DB config on strict provider+model match', () => { - const helper = new ModelConfigHelper() + const helper = new ModelConfigHelper(modelStore) const cfg = helper.getModelConfig('test-model', 'test-provider') expect(cfg.maxTokens).toBe(2000) expect(cfg.contextLength).toBe(10000) @@ -309,7 +273,7 @@ describe('Provider DB strict matching and user overrides', () => { reasoning: { supported: false } }) ;(modelCapabilities as any).rebuildIndexFromDb() - const helper = new ModelConfigHelper() + const helper = new ModelConfigHelper(modelStore) for (const prefix of ['codex', 'cursor', 'custom-source']) { const modelId = `${prefix}/gpt-5.6-sol` @@ -346,7 +310,7 @@ describe('Provider DB strict matching and user overrides', () => { }) it('resolves OpenAI Codex models through the OpenAI catalog identity', () => { - const helper = new ModelConfigHelper() + const helper = new ModelConfigHelper(modelStore) const config = helper.getModelConfig('gpt-5.6-sol', 'openai-codex') @@ -358,7 +322,7 @@ describe('Provider DB strict matching and user overrides', () => { }) it('resolves the OpenAI Codex image model through the OpenAI catalog identity', () => { - const helper = new ModelConfigHelper() + const helper = new ModelConfigHelper(modelStore) const config = helper.getModelConfig('gpt-image-2', 'openai-codex') @@ -375,7 +339,7 @@ describe('Provider DB strict matching and user overrides', () => { it.each(['gpt-image-2.5-sunburst', 'gpt-image-2.5-flare'])( 'routes Codex image model %s without catalog metadata and preserves user settings', (modelId) => { - const helper = new ModelConfigHelper() + const helper = new ModelConfigHelper(modelStore) expect(helper.getModelConfig(modelId, 'openai-codex')).toMatchObject({ type: ModelType.ImageGeneration, apiEndpoint: ApiEndpointType.Image, @@ -403,7 +367,7 @@ describe('Provider DB strict matching and user overrides', () => { ) it('applies partial fallbacks when limit fields are missing', () => { - const helper = new ModelConfigHelper() + const helper = new ModelConfigHelper(modelStore) const cfg1 = helper.getModelConfig('partial-limit', 'test-provider') expect(cfg1.contextLength).toBe(16000) expect(cfg1.maxTokens).toBe(4096) @@ -421,7 +385,7 @@ describe('Provider DB strict matching and user overrides', () => { }) it('caps provider-derived maxTokens defaults at 32000', () => { - const helper = new ModelConfigHelper() + const helper = new ModelConfigHelper(modelStore) const cfg = helper.getModelConfig('large-output', 'test-provider') expect(cfg.contextLength).toBe(200000) @@ -429,7 +393,7 @@ describe('Provider DB strict matching and user overrides', () => { }) it('preserves explicit tool_call=false from provider DB', () => { - const helper = new ModelConfigHelper() + const helper = new ModelConfigHelper(modelStore) const cfg = helper.getModelConfig('tool-call-disabled', 'test-provider') expect(cfg.contextLength).toBe(16000) expect(cfg.maxTokens).toBe(4096) @@ -437,7 +401,7 @@ describe('Provider DB strict matching and user overrides', () => { }) it('falls back to safe defaults when providerId is not provided', () => { - const helper = new ModelConfigHelper() + const helper = new ModelConfigHelper(modelStore) const cfg = helper.getModelConfig('test-model') expect(cfg.contextLength).toBe(16000) expect(cfg.maxTokens).toBe(4096) @@ -446,7 +410,7 @@ describe('Provider DB strict matching and user overrides', () => { }) it('uses capability identity instead of provider iteration order for proxy defaults', () => { - const helper = new ModelConfigHelper() + const helper = new ModelConfigHelper(modelStore) const proxyConfig = helper.getModelConfig('kimi-k3', 'new-api') const directConfig = helper.getModelConfig('kimi-k3', 'moonshot') @@ -468,7 +432,7 @@ describe('Provider DB strict matching and user overrides', () => { }) it('does not inherit globally unique defaults for custom models under a known provider', () => { - const helper = new ModelConfigHelper() + const helper = new ModelConfigHelper(modelStore) const knownProviderConfig = helper.getModelConfig('foreign-only', 'test-provider') const proxyConfig = helper.getModelConfig('foreign-only', 'new-api') @@ -485,7 +449,7 @@ describe('Provider DB strict matching and user overrides', () => { }) it('preserves user ownership when reading route-only configuration', () => { - const helper = new ModelConfigHelper() + const helper = new ModelConfigHelper(modelStore) const helperInternals = helper as any const cacheKey = helperInternals.generateCacheKey('new-api', 'custom-route-model') @@ -521,7 +485,7 @@ describe('Provider DB strict matching and user overrides', () => { }) it('keeps an explicit capability provider override authoritative for proxy defaults', () => { - const helper = new ModelConfigHelper() + const helper = new ModelConfigHelper(modelStore) const config = helper.getModelConfig('kimi-k3', 'new-api', 'capability-team') @@ -532,7 +496,7 @@ describe('Provider DB strict matching and user overrides', () => { }) it('uses safe defaults instead of selecting an ambiguous global model match', () => { - const helper = new ModelConfigHelper() + const helper = new ModelConfigHelper(modelStore) const cfg = helper.getModelConfig('shared-model', 'new-api') @@ -565,7 +529,7 @@ describe('Provider DB strict matching and user overrides', () => { ...facts, supportedEndpointTypes: [...facts.supportedEndpointTypes] }) - const helper = new ModelConfigHelper() + const helper = new ModelConfigHelper(modelStore) expect(resolveConfig(helper)).toMatchObject({ contextLength: 1_050_000, @@ -586,7 +550,7 @@ describe('Provider DB strict matching and user overrides', () => { maxTokens: 32_000 }) - const restartedHelper = new ModelConfigHelper() + const restartedHelper = new ModelConfigHelper(modelStore) expect(resolveConfig(restartedHelper)).toMatchObject({ contextLength: 1_050_000, maxTokens: 32_000 @@ -615,7 +579,7 @@ describe('Provider DB strict matching and user overrides', () => { ownedBy: 'openai', endpointType: 'openai' }) - const helper = new ModelConfigHelper() + const helper = new ModelConfigHelper(modelStore) const config = helper.getModelConfig(modelId, providerId, undefined, identity, { id: modelId, name: 'Opaque Renderer', @@ -640,7 +604,7 @@ describe('Provider DB strict matching and user overrides', () => { ownedBy: 'openai', endpointType: 'openai' }) - const helper = new ModelConfigHelper() + const helper = new ModelConfigHelper(modelStore) const config = helper.getModelConfig(modelId, providerId, undefined, identity, { id: modelId, name: 'Opaque Renderer', @@ -658,7 +622,7 @@ describe('Provider DB strict matching and user overrides', () => { }) it('prefers user config over provider DB and persists across restart', () => { - const helper1 = new ModelConfigHelper() + const helper1 = new ModelConfigHelper(modelStore) const userCfg = { maxTokens: 64000, contextLength: 128000, @@ -673,18 +637,18 @@ describe('Provider DB strict matching and user overrides', () => { expect(read1).toMatchObject({ ...userCfg, isUserDefined: true }) // Simulate app restart: new helper instance, same version - const helper2 = new ModelConfigHelper() + const helper2 = new ModelConfigHelper(modelStore) const read2 = helper2.getModelConfig('test-model', 'test-provider') expect(read2).toMatchObject({ ...userCfg, isUserDefined: true }) // Simulate version bump: non-user entries would be cleared, user entries remain - const helper3 = new ModelConfigHelper() + const helper3 = new ModelConfigHelper(modelStore) const read3 = helper3.getModelConfig('test-model', 'test-provider') expect(read3).toMatchObject({ ...userCfg, isUserDefined: true }) }) it('rejects provider-derived imports while preserving user values', () => { - const helper = new ModelConfigHelper() + const helper = new ModelConfigHelper(modelStore) const helperAny = helper as any const providerCacheKey = helperAny.generateCacheKey('test-provider', 'large-output') @@ -729,7 +693,7 @@ describe('Provider DB strict matching and user overrides', () => { }) it('matches DB with case-insensitive provider/model IDs for provider data (strictly lowercase in DB)', () => { - const helper = new ModelConfigHelper() + const helper = new ModelConfigHelper(modelStore) const cfg = helper.getModelConfig('TEST-MODEL', 'TEST-PROVIDER') // DB lookup lowercases internally expect(cfg.contextLength).toBe(10000) @@ -737,7 +701,7 @@ describe('Provider DB strict matching and user overrides', () => { }) it('matches mixed-case provider DB model IDs case-insensitively', () => { - const helper = new ModelConfigHelper() + const helper = new ModelConfigHelper(modelStore) const cfg = helper.getModelConfig('minimax-m2.5', 'minimax') @@ -748,7 +712,7 @@ describe('Provider DB strict matching and user overrides', () => { }) it('applies MiniMax-M3 provider defaults when the provider DB cache is stale', () => { - const helper = new ModelConfigHelper() + const helper = new ModelConfigHelper(modelStore) const cfg = helper.getModelConfig('minimax-m3', 'minimax') @@ -761,7 +725,7 @@ describe('Provider DB strict matching and user overrides', () => { }) it('keeps MiniMax-M3 context floor after provider facts merge', () => { - const helper = new ModelConfigHelper() + const helper = new ModelConfigHelper(modelStore) const cfg = helper.getModelConfig('minimax-m3', 'minimax', undefined, undefined, { id: 'minimax-m3', name: 'MiniMax M3', @@ -781,7 +745,7 @@ describe('Provider DB strict matching and user overrides', () => { }) it('prefers portrait defaults over legacy reasoning defaults', () => { - const helper = new ModelConfigHelper() + const helper = new ModelConfigHelper(modelStore) const cfg = helper.getModelConfig('claude-portrait', 'test-provider') @@ -791,7 +755,7 @@ describe('Provider DB strict matching and user overrides', () => { }) it('preserves provider portrait sentinel budgets', () => { - const helper = new ModelConfigHelper() + const helper = new ModelConfigHelper(modelStore) const cfg = helper.getModelConfig('gemini-budget', 'test-provider') @@ -800,7 +764,7 @@ describe('Provider DB strict matching and user overrides', () => { }) it('keeps none as the provider default effort without enabling reasoning', () => { - const helper = new ModelConfigHelper() + const helper = new ModelConfigHelper(modelStore) const cfg = helper.getModelConfig('gpt-5.2', 'test-provider') @@ -810,7 +774,7 @@ describe('Provider DB strict matching and user overrides', () => { }) it('forces Moonshot Kimi defaults to the thinking-enabled temperature when reasoning defaults on', () => { - const helper = new ModelConfigHelper() + const helper = new ModelConfigHelper(modelStore) const cfg = helper.getModelConfig('moonshotai/kimi-k2.6', 'moonshot') @@ -819,7 +783,7 @@ describe('Provider DB strict matching and user overrides', () => { }) it('forces Moonshot Kimi :thinking variants to keep reasoning on and temperature at 1.0', () => { - const helper = new ModelConfigHelper() + const helper = new ModelConfigHelper(modelStore) const cfg = helper.getModelConfig('moonshotai/kimi-k2.6:thinking', 'moonshot') @@ -828,7 +792,7 @@ describe('Provider DB strict matching and user overrides', () => { }) it('merges provider facts without persisting derived configuration', () => { - const helper = new ModelConfigHelper() + const helper = new ModelConfigHelper(modelStore) const cfg = helper.getModelConfig('claude-portrait', 'test-provider', undefined, undefined, { id: 'claude-portrait', diff --git a/test/main/provider/providerHeaders.test.ts b/test/main/provider/providerHeaders.test.ts index 88eb569049..3fe7e76e41 100644 --- a/test/main/provider/providerHeaders.test.ts +++ b/test/main/provider/providerHeaders.test.ts @@ -7,11 +7,25 @@ import { } from '@shared/providerCustomHeaders' import type { LLM_PROVIDER } from '@shared/types/provider' import { + buildDefaultProviderHeaders, buildProviderTraceHeaders, fetchWithProviderHeaders, MASKED_PROVIDER_CUSTOM_HEADER_VALUE } from '@/provider/providerHeaders' +describe('provider application metadata', () => { + it('uses the supplied application version and keeps header snapshots independent', () => { + const headers = buildDefaultProviderHeaders('1.2.3') + expect(headers).toEqual({ + 'HTTP-Referer': 'https://deepchatai.cn', + 'X-Title': 'DeepChat', + 'User-Agent': 'DeepChat/1.2.3' + }) + headers['X-Title'] = 'Changed' + expect(buildDefaultProviderHeaders('2.0.0')['X-Title']).toBe('DeepChat') + }) +}) + const createProvider = (customHeaders?: ProviderCustomHeaders): LLM_PROVIDER => ({ id: 'gateway', name: 'Gateway', @@ -322,15 +336,17 @@ describe('fetchWithProviderHeaders', () => { controller.close() } }) - const request = new Request('https://gateway.example.com/v1/chat/completions', { + const requestInit: RequestInit & { duplex: 'half' } = { method: 'POST', body, duplex: 'half' - }) + } + const request = new Request('https://gateway.example.com/v1/chat/completions', requestInit) await fetchWithProviderHeaders(provider, request, undefined, fetchImpl) - expect(fetchImpl.mock.calls[1]?.[1]?.duplex).toBe('half') + const redirected = fetchImpl.mock.calls[1]?.[1] as RequestInit & { duplex?: string } + expect(redirected.duplex).toBe('half') }) it('strips custom and credential headers on cross-origin redirects', async () => { diff --git a/test/main/provider/providerInstanceManager.acpLifetime.test.ts b/test/main/provider/providerInstanceManager.acpLifetime.test.ts index 8983e61ea9..65e4c4f25c 100644 --- a/test/main/provider/providerInstanceManager.acpLifetime.test.ts +++ b/test/main/provider/providerInstanceManager.acpLifetime.test.ts @@ -1,3 +1,4 @@ +import { providerTestEnvironment } from '../../helpers/providerEnvironment' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' import type { LLM_PROVIDER } from '@shared/types/provider' import type { AcpClientRuntime } from '@/agent/acp/client' @@ -73,7 +74,11 @@ describe('ProviderInstanceManager ACP lifetime', () => { providerSettings: { getProviders: () => [...providers.values()] } as never, - locale: { getLanguage: () => 'en-US' }, + locale: { + allowInsecureTls: providerTestEnvironment.allowInsecureTls, + defaultHeaders: providerTestEnvironment.defaultHeaders, + getLanguage: () => 'en-US' + }, activeStreams: new Map(), rateLimitManager: { syncProviders: vi.fn(), @@ -122,7 +127,11 @@ describe('ProviderInstanceManager ACP lifetime', () => { providerSettings: { getProviders: () => [...providers.values()] } as never, - locale: { getLanguage: () => 'en-US' }, + locale: { + allowInsecureTls: providerTestEnvironment.allowInsecureTls, + defaultHeaders: providerTestEnvironment.defaultHeaders, + getLanguage: () => 'en-US' + }, activeStreams: new Map(), rateLimitManager: { syncProviders: vi.fn(), @@ -158,7 +167,11 @@ describe('ProviderInstanceManager ACP lifetime', () => { providerSettings: { getProviders: () => [...providers.values()] } as never, - locale: { getLanguage: () => 'en-US' }, + locale: { + allowInsecureTls: providerTestEnvironment.allowInsecureTls, + defaultHeaders: providerTestEnvironment.defaultHeaders, + getLanguage: () => 'en-US' + }, activeStreams: new Map([['stream', { providerId: 'acp', abortController } as never]]), rateLimitManager: { syncProviders: vi.fn(), @@ -238,7 +251,11 @@ describe('ProviderInstanceManager ACP lifetime', () => { ) const manager = new ProviderInstanceManager({ providerSettings: providerSettings as never, - locale: { getLanguage: () => 'en-US' }, + locale: { + allowInsecureTls: providerTestEnvironment.allowInsecureTls, + defaultHeaders: providerTestEnvironment.defaultHeaders, + getLanguage: () => 'en-US' + }, activeStreams: new Map(), rateLimitManager, getCurrentProviderId: () => null, diff --git a/test/main/provider/providerModelHelper.test.ts b/test/main/provider/providerModelHelper.test.ts index 36c0242602..df9ec48560 100644 --- a/test/main/provider/providerModelHelper.test.ts +++ b/test/main/provider/providerModelHelper.test.ts @@ -1,68 +1,32 @@ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' -import type { ModelConfig } from '@shared/types/provider' +import type { MODEL_META, ModelConfig } from '@shared/types/provider' import { ApiEndpointType, ModelType } from '../../../src/shared/model' +import { createMemoryStore } from '../../helpers/memoryStore' -const storeStates = vi.hoisted( - () => - new Map< - string, - { - data: Record - get: ReturnType - set: ReturnType - clear: ReturnType - } - >() -) - +const storeStates = new Map>() const publishDeepchatEventMock = vi.hoisted(() => vi.fn()) -vi.mock('electron-store', () => ({ - default: class MockElectronStore { - private readonly state: { - data: Record - get: ReturnType - set: ReturnType - clear: ReturnType - } - - constructor(options: { name: string; defaults?: Record }) { - const existing = storeStates.get(options.name) - if (existing) { - this.state = existing - return - } - - const data = structuredClone(options.defaults ?? {}) - const state = { - data, - get: vi.fn((key: string) => data[key]), - set: vi.fn((key: string, value: unknown) => { - data[key] = value - }), - clear: vi.fn(() => { - Object.keys(data).forEach((key) => { - delete data[key] - }) - }) - } - storeStates.set(options.name, state) - this.state = state - } - - get(key: string) { - return this.state.get(key) - } - - set(key: string, value: unknown) { - this.state.set(key, value) - } - - clear() { - this.state.clear() - } +function createModelStoreData() { + const store = createMemoryStore<{ models: MODEL_META[]; custom_models: MODEL_META[] }>({ + models: [], + custom_models: [] + }) + return { + ...store, + get store() { + return store.store + }, + get: vi.fn(store.get) as typeof store.get & ReturnType, + set: vi.fn(store.set) as typeof store.set & ReturnType, + clear: vi.fn(store.clear) } -})) +} + +function createModelStore(providerId: string) { + const key = `models_${encodeURIComponent(providerId).replace(/\*/g, '%2A')}` + if (!storeStates.has(key)) storeStates.set(key, createModelStoreData()) + return storeStates.get(key)! +} vi.mock('electron', () => ({ app: { @@ -88,6 +52,7 @@ const createBaseModel = (providerId: string, modelId: string) => ({ id: modelId, name: modelId, providerId, + group: 'default', contextLength: 32000, maxTokens: 8000, isCustom: false, @@ -139,7 +104,7 @@ describe('ProviderModelHelper cache', () => { it('reuses provider model snapshots within the ttl window', async () => { const { ProviderModelHelper } = await import('../../../src/main/provider/providerModelHelper') const helper = new ProviderModelHelper({ - userDataPath: 'C:/mock-user-data', + createStore: createModelStore, setModelStatus: vi.fn(), deleteModelStatus: vi.fn(), publishEvent: publishDeepchatEventMock @@ -163,7 +128,7 @@ describe('ProviderModelHelper cache', () => { it('invalidates cached provider models after setProviderModels writes', async () => { const { ProviderModelHelper } = await import('../../../src/main/provider/providerModelHelper') const helper = new ProviderModelHelper({ - userDataPath: 'C:/mock-user-data', + createStore: createModelStore, setModelStatus: vi.fn(), deleteModelStatus: vi.fn(), publishEvent: publishDeepchatEventMock @@ -191,7 +156,7 @@ describe('ProviderModelHelper cache', () => { it('invalidates cached provider models after custom model writes', async () => { const { ProviderModelHelper } = await import('../../../src/main/provider/providerModelHelper') const helper = new ProviderModelHelper({ - userDataPath: 'C:/mock-user-data', + createStore: createModelStore, setModelStatus: vi.fn(), deleteModelStatus: vi.fn(), publishEvent: publishDeepchatEventMock @@ -218,7 +183,7 @@ describe('ProviderModelHelper cache', () => { it('removes stale catalog projections in memory without writing from the read path', async () => { const { ProviderModelHelper } = await import('../../../src/main/provider/providerModelHelper') const helper = new ProviderModelHelper({ - userDataPath: 'C:/mock-user-data', + createStore: createModelStore, setModelStatus: vi.fn(), deleteModelStatus: vi.fn(), publishEvent: publishDeepchatEventMock @@ -260,7 +225,7 @@ describe('ProviderModelHelper cache', () => { it('returns cached NewAPI route facts without deriving selectable endpoints', async () => { const { ProviderModelHelper } = await import('../../../src/main/provider/providerModelHelper') const helper = new ProviderModelHelper({ - userDataPath: 'C:/mock-user-data', + createStore: createModelStore, setModelStatus: vi.fn(), deleteModelStatus: vi.fn(), publishEvent: publishDeepchatEventMock @@ -293,7 +258,7 @@ describe('ProviderModelHelper cache', () => { it('does not materialize missing type fields in the raw cache', async () => { const { ProviderModelHelper } = await import('../../../src/main/provider/providerModelHelper') const helper = new ProviderModelHelper({ - userDataPath: 'C:/mock-user-data', + createStore: createModelStore, setModelStatus: vi.fn(), deleteModelStatus: vi.fn(), publishEvent: publishDeepchatEventMock @@ -326,7 +291,7 @@ describe('ProviderModelHelper cache', () => { it('drops selectable endpoints because they are an effective projection', async () => { const { ProviderModelHelper } = await import('../../../src/main/provider/providerModelHelper') const helper = new ProviderModelHelper({ - userDataPath: 'C:/mock-user-data', + createStore: createModelStore, setModelStatus: vi.fn(), deleteModelStatus: vi.fn(), publishEvent: publishDeepchatEventMock @@ -359,7 +324,7 @@ describe('ProviderModelHelper cache', () => { it('does not project effective types into cached provider facts', async () => { const { ProviderModelHelper } = await import('../../../src/main/provider/providerModelHelper') const helper = new ProviderModelHelper({ - userDataPath: 'C:/mock-user-data', + createStore: createModelStore, setModelStatus: vi.fn(), deleteModelStatus: vi.fn(), publishEvent: publishDeepchatEventMock @@ -398,7 +363,7 @@ describe('ProviderModelHelper cache', () => { it('keeps cached media endpoint metadata sparse', async () => { const { ProviderModelHelper } = await import('../../../src/main/provider/providerModelHelper') const helper = new ProviderModelHelper({ - userDataPath: 'C:/mock-user-data', + createStore: createModelStore, setModelStatus: vi.fn(), deleteModelStatus: vi.fn(), publishEvent: publishDeepchatEventMock @@ -426,7 +391,7 @@ describe('ProviderModelHelper cache', () => { it('does not derive media type from a sparse cached model id', async () => { const { ProviderModelHelper } = await import('../../../src/main/provider/providerModelHelper') const helper = new ProviderModelHelper({ - userDataPath: 'C:/mock-user-data', + createStore: createModelStore, setModelStatus: vi.fn(), deleteModelStatus: vi.fn(), publishEvent: publishDeepchatEventMock @@ -458,7 +423,7 @@ describe('ProviderModelHelper cache', () => { it('does not mix legacy user config into cached provider facts', async () => { const { ProviderModelHelper } = await import('../../../src/main/provider/providerModelHelper') const helper = new ProviderModelHelper({ - userDataPath: 'C:/mock-user-data', + createStore: createModelStore, setModelStatus: vi.fn(), deleteModelStatus: vi.fn(), publishEvent: publishDeepchatEventMock @@ -486,7 +451,7 @@ describe('ProviderModelHelper cache', () => { it('does not mix explicit user type into cached provider facts', async () => { const { ProviderModelHelper } = await import('../../../src/main/provider/providerModelHelper') const helper = new ProviderModelHelper({ - userDataPath: 'C:/mock-user-data', + createStore: createModelStore, setModelStatus: vi.fn(), deleteModelStatus: vi.fn(), publishEvent: publishDeepchatEventMock @@ -516,31 +481,31 @@ describe('ProviderModelHelper cache', () => { it('uses targeted model reads for route metadata when the store supports them', async () => { const { ProviderModelHelper } = await import('../../../src/main/provider/providerModelHelper') + const listModels = vi.fn() + const getProviderModel = vi.fn( + (source: 'provider' | 'custom', modelId: string): MODEL_META | undefined => + source === 'provider' && modelId === 'kimi-k3' + ? { + ...createBaseModel('new-api', modelId), + supportedEndpointTypes: ['openai', 'anthropic'] + } + : undefined + ) const helper = new ProviderModelHelper({ - userDataPath: 'C:/mock-user-data', setModelStatus: vi.fn(), deleteModelStatus: vi.fn(), - publishEvent: publishDeepchatEventMock + publishEvent: publishDeepchatEventMock, + createStore: () => ({ + store: { models: [], custom_models: [] }, + get(_key: string, defaultValue?: TValue): TValue | undefined { + listModels() + return defaultValue + }, + set: vi.fn(), + delete: vi.fn(), + getProviderModel + }) }) - const listModels = vi.fn() - const getProviderModel = vi.fn((source: 'provider' | 'custom', modelId: string) => - source === 'provider' && modelId === 'kimi-k3' - ? { - ...createBaseModel('new-api', modelId), - supportedEndpointTypes: ['openai', 'anthropic'] - } - : undefined - ) - helper.setStoreFactory(() => ({ - store: { models: [], custom_models: [] }, - get(_key: string, defaultValue?: TValue): TValue | undefined { - listModels() - return defaultValue - }, - set: vi.fn(), - delete: vi.fn(), - getProviderModel - })) expect(helper.getProviderModelRouteMetadata('new-api', 'kimi-k3')).toEqual({ endpointType: undefined, @@ -566,7 +531,7 @@ describe('ProviderModelHelper cache', () => { it('keeps stored non-New API model type authoritative in route metadata', async () => { const { ProviderModelHelper } = await import('../../../src/main/provider/providerModelHelper') const helper = new ProviderModelHelper({ - userDataPath: 'C:/mock-user-data', + createStore: createModelStore, setModelStatus: vi.fn(), deleteModelStatus: vi.fn(), publishEvent: publishDeepchatEventMock @@ -606,7 +571,7 @@ describe('ProviderModelHelper cache', () => { it('applies explicit user route intent after provider route facts', async () => { const { ProviderModelHelper } = await import('../../../src/main/provider/providerModelHelper') const helper = new ProviderModelHelper({ - userDataPath: 'C:/mock-user-data', + createStore: createModelStore, setModelStatus: vi.fn(), deleteModelStatus: vi.fn(), publishEvent: publishDeepchatEventMock @@ -640,13 +605,7 @@ describe('ProviderModelHelper cache', () => { it('does not synthesize a chat type for sparse route facts', async () => { const { ProviderModelHelper } = await import('../../../src/main/provider/providerModelHelper') - const helper = new ProviderModelHelper({ - userDataPath: 'C:/mock-user-data', - setModelStatus: vi.fn(), - deleteModelStatus: vi.fn(), - publishEvent: publishDeepchatEventMock - }) - const providerModel = { + const providerModel: MODEL_META = { id: 'aggregated-model', name: 'Aggregated Model', group: 'default', @@ -654,17 +613,22 @@ describe('ProviderModelHelper cache', () => { isCustom: false, endpointType: undefined, ownedBy: undefined, - supportedEndpointTypes: ['openai', 'anthropic'] as const + supportedEndpointTypes: ['openai', 'anthropic'] } - helper.setStoreFactory(() => ({ - store: { models: [providerModel], custom_models: [] }, - get(key: string, defaultValue?: TValue): TValue | undefined { - if (key === 'models') return [providerModel] as TValue - return defaultValue - }, - set: vi.fn(), - delete: vi.fn() - })) + const helper = new ProviderModelHelper({ + setModelStatus: vi.fn(), + deleteModelStatus: vi.fn(), + publishEvent: publishDeepchatEventMock, + createStore: () => ({ + store: { models: [providerModel], custom_models: [] }, + get(key: string, defaultValue?: TValue): TValue | undefined { + if (key === 'models') return [providerModel] as TValue + return defaultValue + }, + set: vi.fn(), + delete: vi.fn() + }) + }) expect(helper.getProviderModels('new-api')[0]).toMatchObject({ endpointType: undefined, @@ -680,12 +644,6 @@ describe('ProviderModelHelper cache', () => { it('checks targeted provider and custom rows after a fresh-cache miss', async () => { const { ProviderModelHelper } = await import('../../../src/main/provider/providerModelHelper') - const helper = new ProviderModelHelper({ - userDataPath: 'C:/mock-user-data', - setModelStatus: vi.fn(), - deleteModelStatus: vi.fn(), - publishEvent: publishDeepchatEventMock - }) const providerModel = createBaseModel('new-api', 'provider-model') const customModel = { ...createBaseModel('new-api', 'custom-model'), @@ -695,17 +653,22 @@ describe('ProviderModelHelper cache', () => { const getProviderModel = vi.fn((source: 'provider' | 'custom', modelId: string) => source === 'custom' && modelId === customModel.id ? customModel : undefined ) - helper.setStoreFactory(() => ({ - store: { models: [providerModel], custom_models: [customModel] }, - get(key: string, defaultValue?: TValue): TValue | undefined { - if (key === 'models') return [providerModel] as TValue - if (key === 'custom_models') return [customModel] as TValue - return defaultValue - }, - set: vi.fn(), - delete: vi.fn(), - getProviderModel - })) + const helper = new ProviderModelHelper({ + setModelStatus: vi.fn(), + deleteModelStatus: vi.fn(), + publishEvent: publishDeepchatEventMock, + createStore: () => ({ + store: { models: [providerModel], custom_models: [customModel] }, + get(key: string, defaultValue?: TValue): TValue | undefined { + if (key === 'models') return [providerModel] as TValue + if (key === 'custom_models') return [customModel] as TValue + return defaultValue + }, + set: vi.fn(), + delete: vi.fn(), + getProviderModel + }) + }) helper.getProviderModels('new-api') expect(helper.getProviderModelRouteMetadata('new-api', customModel.id)).toMatchObject({ @@ -718,12 +681,6 @@ describe('ProviderModelHelper cache', () => { it('finds a provider row inserted after a provider-list snapshot was cached', async () => { const { ProviderModelHelper } = await import('../../../src/main/provider/providerModelHelper') - const helper = new ProviderModelHelper({ - userDataPath: 'C:/mock-user-data', - setModelStatus: vi.fn(), - deleteModelStatus: vi.fn(), - publishEvent: publishDeepchatEventMock - }) const cachedModel = createBaseModel('new-api', 'cached-model') const insertedModel = { ...createBaseModel('new-api', 'inserted-model'), @@ -732,16 +689,21 @@ describe('ProviderModelHelper cache', () => { const getProviderModel = vi.fn((source: 'provider' | 'custom', modelId: string) => source === 'provider' && modelId === insertedModel.id ? insertedModel : undefined ) - helper.setStoreFactory(() => ({ - store: { models: [cachedModel], custom_models: [] }, - get(key: string, defaultValue?: TValue): TValue | undefined { - if (key === 'models') return [cachedModel] as TValue - return defaultValue - }, - set: vi.fn(), - delete: vi.fn(), - getProviderModel - })) + const helper = new ProviderModelHelper({ + setModelStatus: vi.fn(), + deleteModelStatus: vi.fn(), + publishEvent: publishDeepchatEventMock, + createStore: () => ({ + store: { models: [cachedModel], custom_models: [] }, + get(key: string, defaultValue?: TValue): TValue | undefined { + if (key === 'models') return [cachedModel] as TValue + return defaultValue + }, + set: vi.fn(), + delete: vi.fn(), + getProviderModel + }) + }) helper.getProviderModels('new-api') @@ -758,7 +720,7 @@ describe('ProviderModelHelper cache', () => { it('clears persisted provider models and custom models for a removed provider', async () => { const { ProviderModelHelper } = await import('../../../src/main/provider/providerModelHelper') const helper = new ProviderModelHelper({ - userDataPath: 'C:/mock-user-data', + createStore: createModelStore, setModelStatus: vi.fn(), deleteModelStatus: vi.fn(), publishEvent: publishDeepchatEventMock @@ -782,7 +744,7 @@ describe('ProviderModelHelper cache', () => { it('encodes invalid provider id characters before creating store files', async () => { const { ProviderModelHelper } = await import('../../../src/main/provider/providerModelHelper') const helper = new ProviderModelHelper({ - userDataPath: 'C:/mock-user-data', + createStore: createModelStore, setModelStatus: vi.fn(), deleteModelStatus: vi.fn(), publishEvent: publishDeepchatEventMock @@ -831,12 +793,12 @@ describe('ProviderSettings effective model projection', () => { }, publishEvent: publishDeepchatEventMock }) as InstanceType - const presenterWithHelper = presenter as InstanceType & { + const presenterWithHelper = presenter as unknown as { providerModelHelper: InstanceType } presenterWithHelper.providerModelHelper = new ProviderModelHelper({ - userDataPath: 'C:/mock-user-data', + createStore: createModelStore, setModelStatus: vi.fn(), deleteModelStatus: vi.fn(), publishEvent: publishDeepchatEventMock @@ -893,12 +855,12 @@ describe('ProviderSettings effective model projection', () => { }, publishEvent: publishDeepchatEventMock }) as InstanceType - const presenterWithHelper = presenter as InstanceType & { + const presenterWithHelper = presenter as unknown as { providerModelHelper: InstanceType } presenterWithHelper.providerModelHelper = new ProviderModelHelper({ - userDataPath: 'C:/mock-user-data', + createStore: createModelStore, setModelStatus: vi.fn(), deleteModelStatus: vi.fn(), publishEvent: publishDeepchatEventMock diff --git a/test/main/provider/providerRuntime.test.ts b/test/main/provider/providerRuntime.test.ts index c651737dc1..a39bdd5cf3 100644 --- a/test/main/provider/providerRuntime.test.ts +++ b/test/main/provider/providerRuntime.test.ts @@ -1,3 +1,4 @@ +import { providerTestEnvironment } from '../../helpers/providerEnvironment' import { describe, it, expect, beforeEach, vi, beforeAll, afterEach } from 'vitest' import { ProviderRuntime } from '../../../src/main/provider/index' import { ProviderSettings } from '../../../src/main/provider/settings' @@ -116,11 +117,16 @@ describe('ProviderRuntime Integration Tests', () => { mockSqlitePresenter as never, { newEnvironmentsTable: { listPathsForSession: () => [], syncPath: vi.fn() } - } as never + } as never, + '/home/tester' ) return new ProviderRuntime( providerSettings, - { getLanguage: vi.fn().mockReturnValue('en-US') }, + { + allowInsecureTls: providerTestEnvironment.allowInsecureTls, + defaultHeaders: providerTestEnvironment.defaultHeaders, + getLanguage: vi.fn().mockReturnValue('en-US') + }, {} as never, {} as never, new AcpRuntimeOwner(() => { @@ -223,10 +229,115 @@ describe('ProviderRuntime Integration Tests', () => { vi.unstubAllGlobals() }) + describe('Copilot credential settlement', () => { + const setupCopilot = () => { + const provider: LLM_PROVIDER = { + ...mockProvider, + id: 'github-copilot', + apiType: 'github-copilot', + apiKey: 'saved-oauth-token', + copilotClientId: 'client-one', + enable: false + } + mockProviderSettings.getProviderById = vi.fn((id) => + id === provider.id ? { ...provider } : undefined + ) + mockProviderSettings.getProviders = vi.fn(() => [{ ...provider }]) + mockProviderSettings.setProviderById = vi.fn((_id, next) => Object.assign(provider, next)) + return provider + } + + it('returns a secret-free sign-in target and preserves current unrelated settings on commit', async () => { + const provider = setupCopilot() + const target = await providerRuntime.getGitHubCopilotSignInTarget(provider.id) + expect(Object.keys(target).sort()).toEqual(['clientId', 'configurationId', 'providerId']) + expect(JSON.stringify(target)).not.toContain(provider.apiKey) + provider.name = 'Renamed Copilot' + provider.customHeaders = { 'X-Custom': 'current' } + provider.copilotClientId = ' client-one ' + await providerRuntime.commitGitHubCopilotCredential(target, 'new-oauth-token') + expect(mockProviderSettings.setProviderById).toHaveBeenCalledWith(provider.id, { + ...provider, + name: 'Renamed Copilot', + apiKey: 'new-oauth-token', + customHeaders: { 'X-Custom': 'current' } + }) + }) + + it.each(['credentials', 'client', 'protocol', 'removal'] as const)( + 'rejects a stale sign-in target after a provider change: %s', + async (change) => { + const provider = setupCopilot() + const target = await providerRuntime.getGitHubCopilotSignInTarget(provider.id) + if (change === 'credentials') provider.apiKey = 'newer-token' + if (change === 'client') provider.copilotClientId = 'different-client' + if (change === 'protocol') provider.apiType = 'openai-compatible' + if (change === 'removal') + vi.mocked(mockProviderSettings.getProviderById).mockReturnValue(undefined) + await expect( + providerRuntime.commitGitHubCopilotCredential(target, 'new-oauth-token') + ).rejects.toThrow('configuration changed') + expect(mockProviderSettings.setProviderById).not.toHaveBeenCalled() + } + ) + + it('settles concurrent sign-ins against the committed identity without overwriting the winner', async () => { + const provider = setupCopilot() + const target = await providerRuntime.getGitHubCopilotSignInTarget(provider.id) + const results = await Promise.allSettled([ + providerRuntime.commitGitHubCopilotCredential(target, 'first-token'), + providerRuntime.commitGitHubCopilotCredential(target, 'second-token') + ]) + expect(results.map((result) => result.status)).toEqual(['fulfilled', 'rejected']) + expect(provider.apiKey).toBe('first-token') + expect(mockProviderSettings.setProviderById).toHaveBeenCalledOnce() + }) + + it('invalidates outstanding sign-ins across maintenance and rejects work after shutdown', async () => { + const provider = setupCopilot() + const target = await providerRuntime.getGitHubCopilotSignInTarget(provider.id) + await providerRuntime.invalidateGitHubCopilotSignIns() + await expect( + providerRuntime.commitGitHubCopilotCredential(target, 'new-token') + ).rejects.toThrow('configuration changed') + const fresh = await providerRuntime.getGitHubCopilotSignInTarget(provider.id) + await providerRuntime.shutdown() + await expect( + providerRuntime.commitGitHubCopilotCredential(fresh, 'new-token') + ).rejects.toThrow('stopped') + await expect(providerRuntime.getGitHubCopilotSignInTarget(provider.id)).rejects.toThrow( + 'stopped' + ) + expect(mockProviderSettings.setProviderById).not.toHaveBeenCalled() + }) + + it('does not accept a target issued by another runtime or a malformed token', async () => { + const provider = setupCopilot() + const other = createProviderRuntime(mockProviderSettings) + try { + const foreign = await other.getGitHubCopilotSignInTarget(provider.id) + await expect( + providerRuntime.commitGitHubCopilotCredential(foreign, 'new-token') + ).rejects.toThrow('configuration changed') + const target = await providerRuntime.getGitHubCopilotSignInTarget(provider.id) + await expect( + providerRuntime.commitGitHubCopilotCredential(target, 'token\nheader') + ).rejects.toThrow('Invalid') + expect(mockProviderSettings.setProviderById).not.toHaveBeenCalled() + } finally { + await other.shutdown() + } + }) + }) + it('instantiates every built-in profile without an extra special-provider allowlist', () => { const manager = new ProviderInstanceManager({ providerSettings: mockProviderSettings, - locale: { getLanguage: () => 'en-US' }, + locale: { + allowInsecureTls: providerTestEnvironment.allowInsecureTls, + defaultHeaders: providerTestEnvironment.defaultHeaders, + getLanguage: () => 'en-US' + }, agentSettings: { getAcpEnabled: () => false, getAcpAgents: () => [] }, activeStreams: new Map(), rateLimitManager: { cleanupProviderRateLimit: vi.fn(), syncProviders: vi.fn() } as never, diff --git a/test/main/provider/workersAiProvider.test.ts b/test/main/provider/workersAiProvider.test.ts index 565c1834ce..63315bf089 100644 --- a/test/main/provider/workersAiProvider.test.ts +++ b/test/main/provider/workersAiProvider.test.ts @@ -1,3 +1,4 @@ +import { providerTestEnvironment } from '../../helpers/providerEnvironment' import type { ProviderSettingsPort } from '@/provider/settings' import { ModelType } from '@shared/model' import type { LLM_PROVIDER } from '@shared/types/provider' @@ -75,6 +76,8 @@ const createProviderSettings = (): ProviderSettingsPort => const createProviderInstance = (overrides?: Partial) => new WorkersAiProvider(createProvider(overrides), createProviderSettings(), { + allowInsecureTls: providerTestEnvironment.allowInsecureTls, + defaultHeaders: providerTestEnvironment.defaultHeaders, getLanguage: vi.fn().mockReturnValue('en-US') }) @@ -549,7 +552,11 @@ describe('WorkersAiProvider', () => { const chatOnly = new AiSdkProvider( createProvider({ apiType: 'openai-completions' }), createProviderSettings(), - { getLanguage: vi.fn().mockReturnValue('en-US') } + { + allowInsecureTls: providerTestEnvironment.allowInsecureTls, + defaultHeaders: providerTestEnvironment.defaultHeaders, + getLanguage: vi.fn().mockReturnValue('en-US') + } ) expect(supportsJevJudgment(chatOnly)).toBe(false) diff --git a/test/main/provider/xaiGrokAuthAdapter.test.ts b/test/main/provider/xaiGrokAuthAdapter.test.ts new file mode 100644 index 0000000000..2c322dfa6c --- /dev/null +++ b/test/main/provider/xaiGrokAuthAdapter.test.ts @@ -0,0 +1,110 @@ +import { beforeEach, describe, expect, it, vi } from 'vitest' +import type { LLM_PROVIDER } from '@shared/types/provider' +import { createXaiGrokFetch } from '@/provider/xaiGrokAuthAdapter' + +const auth = vi.hoisted(() => ({ + captureOperation: vi.fn<() => () => void>(), + ensureAccessToken: vi.fn<() => Promise>(), + forceRefreshAccessToken: vi.fn<() => Promise>() +})) +vi.mock('@/provider/auth/xaiGrok', () => ({ getGlobalXaiGrokAuth: () => auth })) +const provider: LLM_PROVIDER = { + id: 'grok', + name: 'Grok', + apiType: 'grok', + apiKey: 'fixture-api-key', + baseUrl: 'https://api.x.ai/v1', + enable: true +} + +describe('Grok per-request credentials', () => { + beforeEach(() => { + vi.resetAllMocks() + auth.captureOperation.mockReturnValue(() => undefined) + auth.ensureAccessToken.mockResolvedValue('oauth-token') + auth.forceRefreshAccessToken.mockResolvedValue('refreshed-token') + }) + + it('prefers OAuth, retries once on 401 and overrides stale headers with the refreshed token', async () => { + const fetch = vi + .fn() + .mockResolvedValueOnce(new Response(null, { status: 401 })) + .mockResolvedValueOnce(Response.json({ ok: true })) + await createXaiGrokFetch( + provider, + { Authorization: 'stale-default' }, + fetch + )('https://api.x.ai/v1/models', { headers: { Authorization: 'stale-request' } }) + expect(fetch).toHaveBeenCalledTimes(2) + expect(new Headers(fetch.mock.calls[0][1]?.headers).get('Authorization')).toBe( + 'Bearer oauth-token' + ) + expect(new Headers(fetch.mock.calls[1][1]?.headers).get('Authorization')).toBe( + 'Bearer refreshed-token' + ) + expect(auth.forceRefreshAccessToken).toHaveBeenCalledOnce() + }) + + it('retains API-key fallback for an ordinary refresh failure', async () => { + auth.ensureAccessToken.mockRejectedValue(new Error('refresh failed')) + const fetch = vi.fn().mockResolvedValue(Response.json({ ok: true })) + await createXaiGrokFetch(provider, {}, fetch)('https://api.x.ai/v1/models') + expect(new Headers(fetch.mock.calls[0][1]?.headers).get('Authorization')).toBe( + 'Bearer fixture-api-key' + ) + }) + + it.each(['request abort', 'auth replacement'] as const)( + 'does not turn %s into API-key fallback', + async (change) => { + let finish!: (value: string) => void + auth.ensureAccessToken.mockReturnValue( + new Promise((resolve) => { + finish = resolve + }) + ) + let current = true + auth.captureOperation.mockReturnValue(() => { + if (!current) throw new DOMException('Auth changed', 'AbortError') + }) + const controller = new AbortController() + const fetch = vi.fn() + const pending = createXaiGrokFetch( + provider, + {}, + fetch + )('https://api.x.ai/v1/models', { signal: controller.signal }) + const rejected = expect(pending).rejects.toMatchObject({ name: 'AbortError' }) + if (change === 'request abort') controller.abort() + else current = false + finish('late-token') + await rejected + expect(fetch).not.toHaveBeenCalled() + } + ) + + it('rejects an interrupted auth owner before falling back to an API key', async () => { + auth.ensureAccessToken.mockRejectedValue(new DOMException('Stopped', 'AbortError')) + const fetch = vi.fn() + await expect( + createXaiGrokFetch(provider, {}, fetch)('https://api.x.ai/v1/models') + ).rejects.toMatchObject({ name: 'AbortError' }) + expect(fetch).not.toHaveBeenCalled() + }) + + it('does not refresh or retry after auth is revoked with a 401 response pending', async () => { + let current = true + auth.captureOperation.mockReturnValue(() => { + if (!current) throw new DOMException('Auth changed', 'AbortError') + }) + const fetch = vi.fn().mockImplementationOnce(async () => { + current = false + return new Response(null, { status: 401 }) + }) + await expect( + createXaiGrokFetch(provider, {}, fetch)('https://api.x.ai/v1/models') + ).rejects.toMatchObject({ name: 'AbortError' }) + expect(fetch).toHaveBeenCalledOnce() + expect(auth.forceRefreshAccessToken).not.toHaveBeenCalled() + }) +}) diff --git a/test/main/provider/xaiGrokCredentialStore.test.ts b/test/main/provider/xaiGrokCredentialStore.test.ts deleted file mode 100644 index a0b96b6e13..0000000000 --- a/test/main/provider/xaiGrokCredentialStore.test.ts +++ /dev/null @@ -1,203 +0,0 @@ -import * as fs from 'fs' -import { beforeEach, describe, expect, it, vi } from 'vitest' -import { safeStorage } from 'electron' -import { - XaiGrokCredentialStore, - type XaiGrokTokenSet -} from '@/provider/auth/xaiGrok/credentialStore' - -const filePath = '/tmp/deepchat-xai-grok/credentials.json' - -const tokens: XaiGrokTokenSet = { - accessToken: 'access-token', - refreshToken: 'refresh-token', - tokenType: 'Bearer', - expiresAt: Date.now() + 3_600_000, - updatedAt: Date.now() -} - -function fileEnvelope(value: XaiGrokTokenSet): string { - return JSON.stringify({ version: 1, storage: 'file', tokens: value, updatedAt: 1 }) -} - -describe('XaiGrokCredentialStore', () => { - let savedContent: string | null = null - - beforeEach(() => { - savedContent = null - vi.mocked(fs.readFileSync).mockImplementation(() => { - if (savedContent === null) { - throw Object.assign(new Error('ENOENT: no such file or directory'), { code: 'ENOENT' }) - } - return savedContent - }) - vi.mocked(fs.writeFileSync).mockImplementation((_, data) => { - savedContent = String(data) - }) - vi.mocked(fs.mkdirSync).mockImplementation(() => undefined as unknown as string) - vi.mocked(fs.renameSync).mockImplementation(() => {}) - vi.mocked(fs.readdirSync).mockImplementation(() => []) - vi.mocked(safeStorage.isEncryptionAvailable).mockReturnValue(false) - }) - - it('returns null without an error when the credential file is missing', () => { - const warn = vi.spyOn(console, 'warn').mockImplementation(() => {}) - const store = new XaiGrokCredentialStore(filePath) - - expect(store.load()).toBeNull() - expect(store.getLoadError()).toBeNull() - expect(warn).not.toHaveBeenCalled() - }) - - it('reports corrupted JSON instead of treating it as signed out', () => { - const warn = vi.spyOn(console, 'warn').mockImplementation(() => {}) - savedContent = '{broken' - const store = new XaiGrokCredentialStore(filePath) - - expect(store.load()).toBeNull() - expect(store.getLoadError()).toContain('not valid JSON') - expect(warn).toHaveBeenCalled() - }) - - it('reports decryption failures instead of treating them as signed out', () => { - vi.spyOn(console, 'warn').mockImplementation(() => {}) - vi.mocked(safeStorage.decryptString).mockImplementationOnce(() => { - throw new Error('keyring locked') - }) - savedContent = JSON.stringify({ - version: 1, - storage: 'safeStorage', - wrapped: Buffer.from('ciphertext').toString('base64'), - updatedAt: 1 - }) - const store = new XaiGrokCredentialStore(filePath) - - expect(store.load()).toBeNull() - expect(store.getLoadError()).toContain('decryption failed') - }) - - it('returns tokens and clears the load error for a healthy envelope', () => { - savedContent = fileEnvelope(tokens) - const store = new XaiGrokCredentialStore(filePath) - - expect(store.load()?.accessToken).toBe('access-token') - expect(store.getLoadError()).toBeNull() - }) - - it('writes through a temporary file and renames it into place', () => { - const store = new XaiGrokCredentialStore(filePath) - - store.save(tokens) - - const temporaryPath = String(vi.mocked(fs.openSync).mock.calls[0][0]) - expect(temporaryPath).toMatch(/^\/tmp\/deepchat-xai-grok\/credentials\.json\.tmp-/) - expect(fs.openSync).toHaveBeenCalledWith(temporaryPath, 'w', 0o600) - expect(fs.fsyncSync).toHaveBeenCalled() - expect(fs.renameSync).toHaveBeenCalledWith(temporaryPath, filePath) - expect(fs.rmSync).toHaveBeenCalledWith(temporaryPath, { force: true }) - expect(store.load()?.accessToken).toBe('access-token') - }) - - it('removes the temporary file when the rename fails', () => { - vi.spyOn(console, 'warn').mockImplementation(() => {}) - vi.mocked(fs.renameSync).mockImplementation(() => { - throw new Error('EPERM: operation not permitted') - }) - const store = new XaiGrokCredentialStore(filePath) - - expect(() => store.save(tokens)).toThrow('EPERM') - const temporaryPath = String(vi.mocked(fs.openSync).mock.calls[0][0]) - expect(fs.rmSync).toHaveBeenCalledWith(temporaryPath, { force: true }) - }) - - it('backs up a corrupted file before overwriting it', () => { - vi.spyOn(console, 'warn').mockImplementation(() => {}) - savedContent = '{broken' - let backupSnapshot: string | null = null - vi.mocked(fs.copyFileSync).mockImplementation(() => { - backupSnapshot = savedContent - }) - const store = new XaiGrokCredentialStore(filePath) - - store.save(tokens) - - expect(fs.copyFileSync).toHaveBeenCalledWith(filePath, `${filePath}.corrupt`) - expect(fs.renameSync).not.toHaveBeenCalledWith(filePath, `${filePath}.corrupt`) - expect(backupSnapshot).toBe('{broken') - expect(store.getLoadError()).toBeNull() - }) - - it('does not back up an undecryptable file before overwriting it', () => { - vi.spyOn(console, 'warn').mockImplementation(() => {}) - vi.mocked(safeStorage.decryptString).mockImplementation(() => { - throw new Error('keyring locked') - }) - savedContent = JSON.stringify({ - version: 1, - storage: 'safeStorage', - wrapped: Buffer.from('ciphertext').toString('base64'), - updatedAt: 1 - }) - const store = new XaiGrokCredentialStore(filePath) - - store.save(tokens) - - expect(fs.copyFileSync).not.toHaveBeenCalled() - }) - - it('does not back up a healthy file before overwriting it', () => { - savedContent = fileEnvelope(tokens) - const store = new XaiGrokCredentialStore(filePath) - - store.save({ ...tokens, accessToken: 'new-access-token' }) - - expect(fs.copyFileSync).not.toHaveBeenCalled() - expect(store.load()?.accessToken).toBe('new-access-token') - }) - - it('clear removes the credential file together with its backup and temp file', () => { - const store = new XaiGrokCredentialStore(filePath) - - store.clear() - - expect(fs.rmSync).toHaveBeenCalledWith(filePath, { force: true }) - expect(fs.rmSync).toHaveBeenCalledWith(`${filePath}.corrupt`, { force: true }) - expect(fs.rmSync).toHaveBeenCalledWith(`${filePath}.tmp`, { force: true }) - }) - - it('clear still attempts the backup and temp files when the main removal fails', () => { - vi.spyOn(console, 'warn').mockImplementation(() => {}) - vi.mocked(fs.rmSync).mockImplementation((target) => { - if (String(target) === filePath) { - throw new Error('EISDIR: illegal operation on a directory') - } - }) - const store = new XaiGrokCredentialStore(filePath) - - store.clear() - - expect(fs.rmSync).toHaveBeenCalledWith(`${filePath}.corrupt`, { force: true }) - expect(fs.rmSync).toHaveBeenCalledWith(`${filePath}.tmp`, { force: true }) - }) - - it('clear also removes randomized temporary credential files', () => { - vi.mocked(fs.readdirSync).mockImplementation( - () => - [ - 'credentials.json.tmp-1234-aabbccddeeff', - 'credentials.json.tmp-5678-001122334455', - 'unrelated.txt' - ] as unknown as fs.Dirent>[] - ) - const store = new XaiGrokCredentialStore(filePath) - - store.clear() - - expect(fs.rmSync).toHaveBeenCalledWith(`${filePath}.tmp-1234-aabbccddeeff`, { force: true }) - expect(fs.rmSync).toHaveBeenCalledWith(`${filePath}.tmp-5678-001122334455`, { force: true }) - expect(fs.rmSync).not.toHaveBeenCalledWith( - expect.stringContaining('unrelated'), - expect.anything() - ) - }) -}) diff --git a/test/main/provider/zenmuxProvider.test.ts b/test/main/provider/zenmuxProvider.test.ts index 78ff16ed07..186867e283 100644 --- a/test/main/provider/zenmuxProvider.test.ts +++ b/test/main/provider/zenmuxProvider.test.ts @@ -1,3 +1,4 @@ +import { providerTestEnvironment } from '../../helpers/providerEnvironment' import type { ProviderSettingsPort } from '@/provider/settings' import { beforeEach, describe, expect, it, vi } from 'vitest' import type { LLM_PROVIDER } from '@shared/types/provider' @@ -53,7 +54,11 @@ describe('AiSdkProvider zenmux', () => { }) it('routes anthropic models through the cache-aware OpenAI-compatible runtime', async () => { - const provider = new AiSdkProvider(createProvider(), createProviderSettings()) + const provider = new AiSdkProvider( + createProvider(), + createProviderSettings(), + providerTestEnvironment + ) const routeDecision = (provider as any).resolveRouteDecision('anthropic/claude-sonnet-4-5') const runtimeProvider = (provider as any).getRuntimeProvider(routeDecision) as LLM_PROVIDER @@ -63,7 +68,11 @@ describe('AiSdkProvider zenmux', () => { }) it('routes non-anthropic models through the openai-compatible runtime', async () => { - const provider = new AiSdkProvider(createProvider(), createProviderSettings()) + const provider = new AiSdkProvider( + createProvider(), + createProviderSettings(), + providerTestEnvironment + ) const routeDecision = (provider as any).resolveRouteDecision('moonshotai/kimi-k2.5') expect(routeDecision.providerKind).toBe('openai-compatible') @@ -77,7 +86,11 @@ describe('AiSdkProvider zenmux', () => { }) }) vi.stubGlobal('fetch', fetchMock) - const provider = new AiSdkProvider(createProvider(), createProviderSettings()) + const provider = new AiSdkProvider( + createProvider(), + createProviderSettings(), + providerTestEnvironment + ) const models = await provider.fetchModels() @@ -91,7 +104,11 @@ describe('AiSdkProvider zenmux', () => { }) it('fails fast for embeddings on anthropic models', async () => { - const provider = new AiSdkProvider(createProvider(), createProviderSettings()) + const provider = new AiSdkProvider( + createProvider(), + createProviderSettings(), + providerTestEnvironment + ) await expect(provider.getEmbeddings('anthropic/claude-sonnet-4-5', ['hello'])).rejects.toThrow( 'Embeddings not supported for Anthropic models: anthropic/claude-sonnet-4-5' @@ -99,7 +116,11 @@ describe('AiSdkProvider zenmux', () => { }) it('fails fast for embedding dimensions on anthropic models', async () => { - const provider = new AiSdkProvider(createProvider(), createProviderSettings()) + const provider = new AiSdkProvider( + createProvider(), + createProviderSettings(), + providerTestEnvironment + ) await expect(provider.getDimensions('anthropic/claude-sonnet-4-5')).rejects.toThrow( 'Embeddings not supported for Anthropic models: anthropic/claude-sonnet-4-5' diff --git a/test/main/remote/channelRequestTimeouts.test.ts b/test/main/remote/channelRequestTimeouts.test.ts index 7ee92ba884..d58b8a8b1c 100644 --- a/test/main/remote/channelRequestTimeouts.test.ts +++ b/test/main/remote/channelRequestTimeouts.test.ts @@ -1,6 +1,7 @@ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' import { DiscordClient } from '@/remote/channels/discord/discordClient' import { QQBotClient } from '@/remote/channels/qqbot/qqbotClient' +import { WeixinIlinkClient } from '@/remote/channels/weixinIlink/weixinIlinkClient' const jsonResponse = (body: unknown, status = 200) => new Response(JSON.stringify(body), { @@ -25,6 +26,40 @@ describe('remote channel request timeouts', () => { vi.unstubAllGlobals() }) + it('cancels an actual Weixin login poll and retires its QR session', async () => { + const controller = new AbortController() + fetchMock.mockResolvedValueOnce( + jsonResponse({ qrcode: 'qr', qrcode_img_content: 'https://liteapp.weixin.qq.com/login' }) + ) + const session = await WeixinIlinkClient.startLogin({ + sessionKey: 'cancel-poll', + signal: controller.signal + }) + const entered = Promise.withResolvers() + fetchMock.mockImplementationOnce( + (_url, init: RequestInit) => + new Promise((_resolve, reject) => { + init.signal!.addEventListener('abort', () => reject(init.signal!.reason), { once: true }) + entered.resolve() + }) + ) + const waiting = WeixinIlinkClient.waitForLogin({ + sessionKey: session.sessionKey, + signal: controller.signal + }) + const rejected = expect(waiting).rejects.toThrow() + await entered.promise + controller.abort() + await rejected + await expect( + WeixinIlinkClient.waitForLogin({ sessionKey: session.sessionKey }) + ).resolves.toMatchObject({ + connected: false, + messageKey: 'settings.remote.weixinIlink.loginSessionExpired' + }) + expect(fetchMock).toHaveBeenCalledTimes(2) + }) + it('arms a timeout on Discord API requests without swallowing the caller signal', async () => { fetchMock.mockResolvedValue(jsonResponse({ id: '123' })) const client = new DiscordClient({ botToken: 'token' }) diff --git a/test/main/remote/remoteConversationRunner.test.ts b/test/main/remote/remoteConversationRunner.test.ts index bcd76f67d1..f7ef7f4995 100644 --- a/test/main/remote/remoteConversationRunner.test.ts +++ b/test/main/remote/remoteConversationRunner.test.ts @@ -3,7 +3,6 @@ import crypto from 'node:crypto' import fs from 'node:fs/promises' import os from 'node:os' import path from 'node:path' -import { app } from 'electron' import { RemoteConversationRunner } from '@/remote/conversation/runner' import type { RemoteSessionAssignmentPort, @@ -24,6 +23,8 @@ const createSession = (overrides: Partial = {}): SessionWithSt isPinned: false, isDraft: false, sessionKind: 'regular', + orchestrationPolicy: 'explicit', + toolModeOverride: null, createdAt: 1, updatedAt: 1, status: 'idle', @@ -88,7 +89,7 @@ const createRemoteSessionPorts = ( const createCatalog = (overrides: Partial = {}): RemoteCatalogPort => ({ getAgentType: vi.fn(async (agentId: string) => (agentId === 'acp-agent' ? 'acp' : 'deepchat')), - listAgents: vi.fn(async () => [ + listAgents: vi.fn(async () => [ { agentId: 'deepchat', agentName: 'DeepChat', @@ -111,18 +112,20 @@ const createWorkspace = ( throw new Error('unused') }) ): RemoteWorkspacePort => ({ - getDefaultProjectPath: vi.fn(() => defaultProjectPath), + getDefaultProjectPath: vi.fn(async () => defaultProjectPath), prepareFile }) +let profileDirectory = '/mock/path' + const createRunner = ( - deps: ConstructorParameters[0], + deps: Omit[0], 'profileDirectory'>, bindingStore: ConstructorParameters[1] ) => - new RemoteConversationRunner(deps, { - getActiveEvent: vi.fn().mockReturnValue(null), - ...bindingStore - } as ConstructorParameters[1]) + new RemoteConversationRunner({ profileDirectory, ...deps }, { + ...bindingStore, + getActiveEvent: bindingStore.getActiveEvent ?? vi.fn().mockReturnValue(null) + } as unknown as ConstructorParameters[1]) const encryptAes128Ecb = (content: Buffer, key: Buffer): Buffer => { const cipher = crypto.createCipheriv('aes-128-ecb', key, null) @@ -132,7 +135,7 @@ const encryptAes128Ecb = (content: Buffer, key: Buffer): Buffer => { describe('RemoteConversationRunner', () => { afterEach(() => { vi.unstubAllGlobals() - vi.mocked(app.getPath).mockImplementation(() => '/mock/path') + profileDirectory = '/mock/path' }) it('cancels an active generation through the Session turn port', async () => { @@ -259,6 +262,7 @@ describe('RemoteConversationRunner', () => { path: path.join(workspace, '.deepchat/remote-assets/telegram/hash/message/note.txt'), mimeType: 'text/plain', content: 'hello file', + token: 1, metadata: { fileName: 'note.txt', fileSize: 10, @@ -276,7 +280,7 @@ describe('RemoteConversationRunner', () => { } }) const fileService = { - prepareFile: vi.fn(async (filePath: string, mimeType: string) => ({ + prepareFile: vi.fn(async (filePath: string, mimeType = 'text/plain') => ({ ...preparedFile, path: filePath, mimeType @@ -351,11 +355,12 @@ describe('RemoteConversationRunner', () => { turn: { sendMessage }, projection: { getSession: vi.fn().mockResolvedValue(session) } }) - const prepareFile = vi.fn(async (filePath: string, mimeType: string) => ({ + const prepareFile = vi.fn(async (filePath: string, mimeType = 'text/plain') => ({ name: 'scan.png', path: filePath, mimeType, content: '', + token: 1, metadata: { fileName: 'scan.png', fileSize: 3, @@ -415,11 +420,12 @@ describe('RemoteConversationRunner', () => { } }) const fileService = { - prepareFile: vi.fn(async (filePath: string, mimeType: string) => ({ + prepareFile: vi.fn(async (filePath: string, mimeType = 'text/plain') => ({ name: path.basename(filePath), path: filePath, mimeType, content: '', + token: 1, metadata: { fileName: path.basename(filePath), fileSize: 0, @@ -501,6 +507,7 @@ describe('RemoteConversationRunner', () => { path: path.join(workspace, '.deepchat/remote-assets/telegram/hash/message/note.txt'), mimeType: 'text/plain', content: 'hello file', + token: 1, metadata: { fileName: 'note.txt', fileSize: 10, @@ -518,7 +525,7 @@ describe('RemoteConversationRunner', () => { } }) const fileService = { - prepareFile: vi.fn(async (filePath: string, mimeType: string) => ({ + prepareFile: vi.fn(async (filePath: string, mimeType = 'text/plain') => ({ ...preparedFile, path: filePath, mimeType @@ -669,6 +676,7 @@ describe('RemoteConversationRunner', () => { path: path.join(workspace, '.deepchat/remote-assets/weixin-ilink/hash/message/image-1.png'), mimeType: 'image/png', content: '', + token: 1, metadata: { fileName: 'image-1.png', fileSize: plainContent.length, @@ -686,7 +694,7 @@ describe('RemoteConversationRunner', () => { } }) const fileService = { - prepareFile: vi.fn(async (filePath: string, mimeType: string) => ({ + prepareFile: vi.fn(async (filePath: string, mimeType = 'text/plain') => ({ ...preparedFile, path: filePath, mimeType @@ -766,9 +774,7 @@ describe('RemoteConversationRunner', () => { const toolOutputImage = Buffer.from('tool output image') await fs.writeFile(path.join(cacheDir, 'generated.png'), cachedImage) await fs.writeFile(path.join(cacheDir, 'screenshot.png'), screenshotImage) - vi.mocked(app.getPath).mockImplementation((name: string) => - name === 'userData' ? userData : '/mock/path' - ) + profileDirectory = userData const assistantMessage = { id: 'assistant-images', @@ -927,9 +933,7 @@ describe('RemoteConversationRunner', () => { it('persists generated remote images in user data when no workspace is available', async () => { const userData = await fs.mkdtemp(path.join(os.tmpdir(), 'deepchat-user-data-')) const image = Buffer.from('generated image without workspace') - vi.mocked(app.getPath).mockImplementation((name: string) => - name === 'userData' ? userData : '/mock/path' - ) + profileDirectory = userData const assistantMessage = { id: 'assistant-images-no-workspace', diff --git a/test/main/remote/remoteService.test.ts b/test/main/remote/remoteService.test.ts index d6d5dda727..409a4d9187 100644 --- a/test/main/remote/remoteService.test.ts +++ b/test/main/remote/remoteService.test.ts @@ -1,5 +1,4 @@ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' -import { BrowserWindow } from 'electron' import * as http from 'node:http' import * as net from 'node:net' import type { TelegramPollerStatusSnapshot } from '@/remote/types' @@ -148,9 +147,13 @@ const createProviderSettings = () => { ]) return { - get: vi.fn((key: string) => store.get(key)), - set: vi.fn((key: string, value: unknown) => { - store.set(key, value) + get(key: string, fallback?: T): T | undefined { + const value = store.get(key) + return value === undefined ? fallback : (value as T) + }, + set: vi.fn((key: string | Record, value?: unknown) => { + if (typeof key === 'string') store.set(key, value) + else for (const [name, entry] of Object.entries(key)) store.set(name, entry) }), getAgentType: vi.fn(async (agentId: string) => (agentId === 'acp-agent' ? 'acp' : 'deepchat')), listAgents: vi.fn().mockResolvedValue([ @@ -183,7 +186,7 @@ const createCatalog = ( }) const createWorkspace = (): RemoteWorkspacePort => ({ - getDefaultProjectPath: vi.fn(() => null), + getDefaultProjectPath: vi.fn(async () => null), prepareFile: vi.fn(async () => { throw new Error('unused') }) @@ -195,8 +198,12 @@ const createNotifications = (): RemoteNotificationPort & { showNotification: vi.fn().mockResolvedValue('remote-delivery-error:feishu') }) +const authWindows = { open: vi.fn(async () => {}), close: vi.fn(async () => {}) } + const createRemoteService = (settings: TestSettings, overrides: Partial = {}) => new RemoteService({ + profileDirectory: '/mock/path', + authWindows, settings, catalog: createCatalog(settings), workspace: createWorkspace(), @@ -209,16 +216,119 @@ describe('RemoteService', () => { pollerInstances.length = 0 telegramClientInstances.length = 0 pollerStartImplementation = async () => {} - Object.assign(BrowserWindow, { - getFocusedWindow: vi.fn(() => null), - getAllWindows: vi.fn(() => []) - }) + authWindows.open.mockClear() + authWindows.close.mockClear() }) afterEach(() => { vi.restoreAllMocks() }) + it('drains and compensates a Feishu window that opens after authorization is stopped', async () => { + const settings = createProviderSettings() + const port = await getFreeLoopbackPort() + const entered = Promise.withResolvers() + const opening = Promise.withResolvers() + const windows = { + open: vi.fn(async () => { + entered.resolve() + await opening.promise + }), + close: vi.fn(async () => {}) + } + const service = createRemoteService(settings, { authWindows: windows }) + const starting = service.startFeishuAuth({ + appId: 'test-app', + appSecret: 'test-secret', + redirectUri: `http://127.0.0.1:${port}/callback` + }) + const rejected = expect(starting).rejects.toThrow() + await entered.promise + const socket = net.connect(port, '127.0.0.1') + const socketClosed = new Promise((resolve) => socket.once('close', () => resolve())) + socket.on('error', () => {}) + await new Promise((resolve) => socket.once('connect', resolve)) + socket.write('GET /callback HTTP/1.1\r\n') + let stopped = false + const stopping = service.destroy().then(() => { + stopped = true + }) + await Promise.resolve() + expect(stopped).toBe(false) + opening.resolve() + await Promise.all([stopping, rejected, socketClosed]) + expect(windows.close).toHaveBeenCalledWith(expect.stringMatching(/^feishu:/)) + const server = net.createServer() + await new Promise((resolve, reject) => { + server.once('error', reject) + server.listen(port, '127.0.0.1', resolve) + }) + await new Promise((resolve) => server.close(() => resolve())) + await expect(service.startFeishuAuth()).rejects.toThrow() + }) + + it('fences a confirmed Weixin login whose request ignores cancellation until after stop', async () => { + const settings = createProviderSettings() + const entered = Promise.withResolvers() + const result = + Promise.withResolvers>>() + vi.spyOn(WeixinIlinkClient, 'waitForLogin').mockImplementation(async () => { + entered.resolve() + return await result.promise + }) + const service = createRemoteService(settings) + const waiting = service.waitForWeixinIlinkLogin({ sessionKey: 'late-login' }) + const rejected = expect(waiting).rejects.toThrow() + await entered.promise + let stopped = false + const stopping = service.destroy().then(() => { + stopped = true + }) + await Promise.resolve() + expect(stopped).toBe(false) + result.resolve({ + connected: true, + accountId: 'late-account', + ownerUserId: 'late-owner', + botToken: 'secret' + }) + await Promise.all([stopping, rejected]) + expect(service.buildWeixinIlinkSettingsSnapshot().accounts).toEqual([]) + }) + + it('drains a late Feishu registration start without publishing a new auth session', async () => { + const entered = Promise.withResolvers() + const response = Promise.withResolvers() + let requestSignal: AbortSignal | undefined + vi.spyOn(globalThis, 'fetch').mockImplementation(async (_url, init) => { + requestSignal = init?.signal ?? undefined + entered.resolve() + return await response.promise + }) + const service = createRemoteService(createProviderSettings()) + const starting = service.startFeishuInstall() + const rejected = expect(starting).rejects.toThrow() + await entered.promise + let stopped = false + const stopping = service.destroy().then(() => { + stopped = true + }) + await Promise.resolve() + expect(requestSignal?.aborted).toBe(true) + expect(stopped).toBe(false) + response.resolve( + Response.json({ + device_code: 'late-device', + verification_uri_complete: 'https://open.feishu.cn/install', + user_code: 'LATE', + expires_in: 300, + interval: 1 + }) + ) + await Promise.all([stopping, rejected]) + await expect(service.startFeishuInstall()).rejects.toThrow() + }) + it('notifies once for a Feishu delivery failure and throttles later failures', async () => { const notifications = createNotifications() const presenter = createRemoteService(createProviderSettings(), { notifications }) @@ -308,11 +418,8 @@ describe('RemoteService', () => { it('reports starting while the poller startup is still in flight', async () => { const providerSettings = createProviderSettings() - let resolveStart: (() => void) | null = null - pollerStartImplementation = () => - new Promise((resolve) => { - resolveStart = resolve - }) + const starting = Promise.withResolvers() + pollerStartImplementation = () => starting.promise const presenter = createRemoteService(providerSettings) @@ -326,7 +433,7 @@ describe('RemoteService', () => { ) }) - resolveStart?.() + starting.resolve() await initializePromise }) @@ -704,14 +811,12 @@ describe('RemoteService', () => { const callbackPromise = requestUrl(`${redirectUri}?code=auth-code&state=${state}`) await tokenRequestStarted - await presenter.cancelFeishuAuth(session.sessionKey) - await expect(waitPromise).resolves.toEqual( - expect.objectContaining({ - authorized: false, - openId: null, - messageKey: 'settings.remote.feishu.authCancelled' - }) - ) + let cancelled = false + const cancelling = presenter.cancelFeishuAuth(session.sessionKey).then(() => { + cancelled = true + }) + await Promise.resolve() + expect(cancelled).toBe(false) resolveToken( new Response( @@ -725,6 +830,12 @@ describe('RemoteService', () => { ) ) await callbackPromise + await cancelling + await expect(waitPromise).resolves.toMatchObject({ + authorized: false, + openId: null, + messageKey: 'settings.remote.feishu.authCancelled' + }) await expect(presenter.getChannelPairingSnapshot('feishu')).resolves.toEqual( expect.objectContaining({ @@ -936,7 +1047,8 @@ describe('RemoteService', () => { const saved = await presenter.saveTelegramSettings({ botToken: 'test-bot-token', remoteEnabled: true, - defaultAgentId: 'deepchat-alt' + defaultAgentId: 'deepchat-alt', + defaultWorkdir: '' }) expect(saved.defaultAgentId).toBe('deepchat') @@ -1027,7 +1139,8 @@ describe('RemoteService', () => { const saved = await presenter.saveTelegramSettings({ botToken: 'test-bot-token', remoteEnabled: true, - defaultAgentId: 'claude-code-acp' + defaultAgentId: 'claude-code-acp', + defaultWorkdir: '' }) expect(saved.defaultAgentId).toBe('deepchat') @@ -1241,9 +1354,12 @@ describe('RemoteService', () => { messageKey: 'settings.remote.weixinIlink.loginWindowOpened', message: undefined }) - expect(BrowserWindow).toHaveBeenCalledTimes(1) - expect(vi.mocked(BrowserWindow).mock.results[0]?.value.loadURL).toHaveBeenCalledWith( - 'https://liteapp.weixin.qq.com/mock-login' + expect(authWindows.open).toHaveBeenCalledTimes(1) + expect(authWindows.open).toHaveBeenCalledWith( + expect.objectContaining({ + kind: 'weixin-ilink', + url: 'https://liteapp.weixin.qq.com/mock-login' + }) ) await expect( diff --git a/test/main/routes/databaseRequestOwnership.test.ts b/test/main/routes/databaseRequestOwnership.test.ts new file mode 100644 index 0000000000..8ea00b67de --- /dev/null +++ b/test/main/routes/databaseRequestOwnership.test.ts @@ -0,0 +1,83 @@ +import { describe, expect, it, vi } from 'vitest' +import { DatabaseRequestGate } from '@/app/databaseRequestGate' +import { StartupWorkloadCoordinator } from '@/app/startupWorkloadCoordinator' +import { createRouteDispatcher, dispatchDeepchatRoute } from '@/routes' +import { createRendererRouteContext, createRouteMap } from '@/routes/routeRegistry' + +const deferred = () => { + let resolve!: (value: T) => void + const promise = new Promise((done) => { + resolve = done + }) + return { promise, resolve } +} + +function createRuntime(handler: () => Promise) { + const gate = new DatabaseRequestGate(() => undefined) + const coordinator = new StartupWorkloadCoordinator() + const dispatcher = createRouteDispatcher({ + appDatabaseMaintenance: gate, + routeMaps: [createRouteMap([['models.getProviderCatalog', handler]])], + settingsWindow: { getSettingsWindowId: () => 99 }, + startupWorkloadCoordinator: coordinator + }) + const dispatch = () => + dispatchDeepchatRoute( + dispatcher, + 'models.getProviderCatalog', + { providerId: 'fixture' }, + createRendererRouteContext(42, 99) + ) + return { gate, coordinator, dispatch } +} + +describe('database requests scheduled as startup work', () => { + it('rechecks admission before queued work actually executes', async () => { + const handler = vi.fn(async () => ({ models: [] })) + const { gate, coordinator, dispatch } = createRuntime(handler) + const release = deferred() + const blockers = [0, 1].map((index) => + coordinator.scheduleTask({ + id: `blocker-${index}`, + target: 'settings', + phase: 'deferred', + resource: 'io', + labelKey: 'startup.test', + run: () => release.promise + }) + ) + const rejected = expect(dispatch()).rejects.toThrow('maintenance is maintenance') + gate.beginMaintenance() + const drain = gate.drain() + release.resolve() + await Promise.all(blockers) + await rejected + await drain + expect(handler).not.toHaveBeenCalled() + gate.resume() + }) + + it('drains the running handler after cancellation settles its scheduled reply', async () => { + const entered = deferred() + const release = deferred<{ models: never[] }>() + const { gate, coordinator, dispatch } = createRuntime(async () => { + entered.resolve() + return await release.promise + }) + const pending = dispatch() + const rejected = expect(pending).rejects.toMatchObject({ name: 'AbortError' }) + await entered.promise + gate.beginMaintenance() + coordinator.cancelTarget('settings') + await rejected + let drained = false + const drain = gate.drain().then(() => { + drained = true + }) + await Promise.resolve() + expect(drained).toBe(false) + release.resolve({ models: [] }) + await drain + gate.resume() + }) +}) diff --git a/test/main/routes/dispatcher.test.ts b/test/main/routes/dispatcher.test.ts index 627eebc3d4..8cdbcd3195 100644 --- a/test/main/routes/dispatcher.test.ts +++ b/test/main/routes/dispatcher.test.ts @@ -1,3 +1,4 @@ +import { AppSettingsService } from '@/app/settingsService' import type { ProviderSettingsPort } from '@/provider/settings' import type { FileServicePort } from '@shared/types/file' import type { SkillServicePort } from '@shared/types/skill' @@ -875,6 +876,10 @@ function createRuntime() { } const appDatabaseMaintenance = { assertRouteAllowed: vi.fn(), + async runRequest(routeName: string, run: () => Promise): Promise { + this.assertRouteAllowed(routeName) + return await run() + }, enableDatabaseEncryption: vi.fn().mockResolvedValue(enabledDatabaseSecurityStatus), changeDatabasePassword: vi.fn().mockResolvedValue(enabledDatabaseSecurityStatus), disableDatabaseEncryption: vi.fn().mockResolvedValue({ @@ -893,7 +898,20 @@ function createRuntime() { }) } const startupWorkloadCoordinator = { - scheduleTask: vi.fn(async (task: { run: () => Promise }) => await task.run()), + scheduleTask: vi.fn( + async (task: { + run: (context: { + signal: AbortSignal + reportProgress(progress: number): void + yield(): Promise + }) => Promise + }) => + await task.run({ + signal: new AbortController().signal, + reportProgress: () => undefined, + yield: async () => undefined + }) + ), getRunId: vi.fn(() => 'startup:test'), replayTarget: vi.fn() } @@ -980,7 +998,11 @@ function createRuntime() { } const applyProxyMode = vi.fn() const applyCustomProxyUrl = vi.fn() + const applyContentProtection = vi.fn() const desktopSettings = { + getLanguage: vi.fn(() => 'en-US'), + getCloseToQuit: vi.fn(() => false), + getFloatingButtonBounds: vi.fn(() => null), getCopyWithCotEnabled: vi.fn(() => settings.copyWithCotEnabled), setCopyWithCotEnabled: vi.fn((enabled: boolean) => { settings.copyWithCotEnabled = enabled @@ -1004,10 +1026,12 @@ function createRuntime() { getContentProtectionEnabled: vi.fn(() => settings.contentProtectionEnabled), setContentProtectionEnabled: vi.fn((value: boolean) => { settings.contentProtectionEnabled = value + applyContentProtection(value) }), getFloatingButtonEnabled: vi.fn(() => settings.floatingButtonEnabled), - setFloatingButtonEnabled: vi.fn((value: boolean) => { + setFloatingButtonEnabled: vi.fn(async (value: boolean) => { settings.floatingButtonEnabled = value + await setFloatingButtonEnabled(value) }), getShortcutKeys: vi.fn(() => ({})), setShortcutKeys: vi.fn(), @@ -1024,7 +1048,6 @@ function createRuntime() { }), getSystemFonts: vi.fn().mockResolvedValue(['Inter', 'JetBrains Mono']) } - const applyContentProtection = vi.fn() const setFloatingButtonEnabled = vi.fn() const loggingService = { getEnabled: vi.fn(() => settings.loggingEnabled), @@ -1598,6 +1621,7 @@ function createRuntime() { }) const assertSessionActiveSkillsMutable = vi.fn().mockResolvedValue(undefined) const skillRoutes = createSkillRoutes({ + tempDirectory: '/tmp/deepchat-test', skillService, skillSyncService, skillSettings, @@ -1620,6 +1644,25 @@ function createRuntime() { getTapeInspection: () => tapeInspection, getAuditEntries: () => (sqlitePresenter as any).agentMemoryAuditTable }) + let settingsSnapshotRevision = 0 + const appSettingsService = new AppSettingsService({ + ownerId: 'fixture-owner', + updateSettings: updateSettings as never, + publishNativeSnapshot: vi.fn(), + agentDefaults: agentDefaults as never, + privacy: privacySettings as never, + traceSettings: traceSettings as never, + desktopSettings: desktopSettings as never, + fonts: fontSettings as never, + logging: loggingService as never, + ocr: ocrSettings, + publishEvent: publishDeepchatEvent, + recordActivity: (input) => { + void sqlitePresenter.recordSettingsActivity(input) + }, + nextVersion: () => ++settingsSnapshotRevision, + assertActive: () => {} + }) const desktopRoutes = createDesktopRoutes({ ownsDraftSession: sessionLifecyclePort.ownsDraftSession, windowPresenter, @@ -1629,13 +1672,21 @@ function createRuntime() { desktopSessionBinding, tabPresenter, dialogService: dialogService as unknown as DialogServicePort, - settings: desktopSettings as never, - setFloatingButtonEnabled, + settings: appSettingsService, + appearance: { + getLanguage: () => appSettingsService.getLanguage(), + setLanguage: (language) => appSettingsService.setLanguage(language), + getTheme: () => appSettingsService.getTheme(), + setTheme: (theme) => appSettingsService.setTheme(theme) + }, recordActivity: (input) => { void sqlitePresenter.recordSettingsActivity(input) } }) - const fileRoutes = createFileRoutes(fileService) + const fileRoutes = createFileRoutes(fileService, { + saveImage: vi.fn().mockResolvedValue({ canceled: true }), + copyImage: vi.fn().mockResolvedValue({ copied: true }) + }) const knowledgeSettings = { getKnowledgeConfigs: vi.fn(() => knowledgeConfigs), setKnowledgeConfigs: vi.fn((configs: typeof knowledgeConfigs) => { @@ -1749,7 +1800,7 @@ function createRuntime() { const exporterRoutes = createExporterRoutes(exporter) const upgradeRoutes = createUpgradeRoutes({ upgrade: {} as never, - settings: updateSettings as never + settings: appSettingsService }) const syncRoutes = createSyncRoutes({ sync: syncService, @@ -1773,19 +1824,11 @@ function createRuntime() { } as never }) const appSettingsRoutes = createAppSettingsRoutes({ + appSettings: appSettingsService, settings: { get: (key) => providerSettings.getSetting(key), set: (key, value) => providerSettings.setSetting(key, value) }, - agentDefaults: agentDefaults as never, - privacy: privacySettings as never, - traceSettings: traceSettings as never, - updateSettings: updateSettings as never, - desktopSettings: desktopSettings as never, - fonts: fontSettings as never, - applyContentProtection, - logging: loggingService as never, - ocr: ocrSettings, commandShell, publishEvent: publishDeepchatEvent, recordActivity: (input) => { diff --git a/test/main/scheduler/runSessionStarter.test.ts b/test/main/scheduler/runSessionStarter.test.ts index 263cf100cf..32560eed13 100644 --- a/test/main/scheduler/runSessionStarter.test.ts +++ b/test/main/scheduler/runSessionStarter.test.ts @@ -16,7 +16,7 @@ const createPorts = () => { cancelGeneration: vi.fn(async () => undefined) } const agentCatalog: CronJobAgentCatalogPort = { - getAgentType: vi.fn(async () => 'deepchat') + getAgentType: vi.fn(async () => 'deepchat' as const) } return { lifecycle, turn, agentCatalog } diff --git a/test/main/scheduler/schedulerService.test.ts b/test/main/scheduler/schedulerService.test.ts index 7946717133..4dac243263 100644 --- a/test/main/scheduler/schedulerService.test.ts +++ b/test/main/scheduler/schedulerService.test.ts @@ -1,11 +1,43 @@ import { EventEmitter } from 'node:events' -import os from 'node:os' -import path from 'node:path' import { describe, expect, it, vi } from 'vitest' -import type { CronJob, CronJobRun, CronJobsSchedulerStatus } from '@shared/cronJobs' +import type { + CronJob, + CronJobRun, + CronJobsSchedulerStatus, + SchedulerCommand +} from '@shared/cronJobs' import { SessionRuntimeEvents } from '@/session/runtimeEvents' +import type { SchedulerHost } from '@/scheduler/schedulerProcessManager' + +function schedulerHost( + host: EventEmitter & { + pid: number + postMessage(command: SchedulerCommand): void + kill(): void + } +): SchedulerHost { + return { + get pid() { + return host.pid + }, + postMessage: (command) => { + host.postMessage(command) + }, + kill: () => { + host.kill() + }, + onMessage: (listener) => { + host.on('message', listener) + }, + onExit: (listener) => { + host.on('exit', listener) + }, + onError: (listener) => { + host.on('error', listener) + } + } +} -const actualFs = await vi.importActual('node:fs') const sqliteModule = await import('better-sqlite3-multiple-ciphers').catch(() => null) const cronJobsTableModule = sqliteModule ? await import('@/scheduler/data/tables/cronJobs').catch(() => null) @@ -829,7 +861,7 @@ describeIfSqlite('Cron Jobs persistence and service', () => { const service = new SchedulerServiceCtor({ ...createRequiredSchedulerDeps(), database: sqlitePresenter as never, - schedulerManager: schedulerManager as never + createSchedulerManager: () => schedulerManager as never }) await expect( @@ -883,7 +915,7 @@ describeIfSqlite('Cron Jobs persistence and service', () => { const service = new SchedulerServiceCtor({ ...createRequiredSchedulerDeps(), database: sqlitePresenter as never, - schedulerManager: schedulerManager as never, + createSchedulerManager: () => schedulerManager as never, agentSettings: agentSettings as never }) @@ -962,7 +994,7 @@ describeIfSqlite('Cron Jobs persistence and service', () => { const service = new SchedulerServiceCtor({ ...createRequiredSchedulerDeps(), database: sqlitePresenter as never, - schedulerManager: schedulerManager as never, + createSchedulerManager: () => schedulerManager as never, deliveryRouter: deliveryRouter as never, runSessionStarter: runSessionStarter as never }) @@ -1037,7 +1069,7 @@ describeIfSqlite('Cron Jobs persistence and service', () => { const service = new SchedulerServiceCtor({ ...createRequiredSchedulerDeps(), database: sqlitePresenter as never, - schedulerManager: schedulerManager as never + createSchedulerManager: () => schedulerManager as never }) service.start() @@ -1053,6 +1085,62 @@ describeIfSqlite('Cron Jobs persistence and service', () => { } }) + it.each([false, true])( + 'fences resume reconciliation after stop, including a restarted service (%s)', + async (restart) => { + const { db, sqlitePresenter } = createHarness() + const status = baseStatus() + const schedulerManager = { + reconcile: vi.fn().mockResolvedValue(status), + stop: vi.fn().mockResolvedValue(status), + getStatus: vi.fn(() => status) + } + const deps = createRequiredSchedulerDeps() + const service = new SchedulerServiceCtor({ + ...deps, + database: sqlitePresenter as never, + createSchedulerManager: () => schedulerManager as never + }) + try { + await service.handleSystemResume() + expect(schedulerManager.reconcile).not.toHaveBeenCalled() + const { job } = await service.upsert({ + name: 'Resume lifecycle', + enabled: true, + cronExpr: '0 0 1 1 *', + timezone: 'UTC', + agentId: 'agent-1', + taskPrompt: 'Summarize issues' + }) + service.start() + await vi.waitFor(() => expect(schedulerManager.reconcile).toHaveBeenCalledWith('startup')) + schedulerManager.reconcile.mockClear() + deps.agentSettings.listAgents.mockClear() + const pending = + Promise.withResolvers>>() + deps.agentSettings.listAgents.mockReturnValueOnce(pending.promise) + const resume = service.handleSystemResume() + await vi.waitFor(() => expect(deps.agentSettings.listAgents).toHaveBeenCalledOnce()) + await service.stop() + if (restart) { + service.start() + await vi.waitFor(() => expect(schedulerManager.reconcile).toHaveBeenCalledWith('startup')) + } + pending.resolve([{ id: 'agent-1', name: 'Test agent', type: 'deepchat', enabled: false }]) + await resume + const repository = new CronJobsRepositoryCtor(sqlitePresenter as never) + expect(repository.getJob(job.id)).toEqual(job) + expect(schedulerManager.reconcile).not.toHaveBeenCalledWith('system-resume') + await service.handleSystemResume() + if (restart) expect(schedulerManager.reconcile).toHaveBeenCalledWith('system-resume') + else expect(schedulerManager.reconcile).not.toHaveBeenCalledWith('system-resume') + } finally { + await service.destroy() + db.close() + } + } + ) + it('creates a fresh session for manual runs when the executor is wired', async () => { const { db, sqlitePresenter } = createHarness() try { @@ -1077,7 +1165,7 @@ describeIfSqlite('Cron Jobs persistence and service', () => { const service = new SchedulerServiceCtor({ ...createRequiredSchedulerDeps(sessionEvents), database: sqlitePresenter as never, - schedulerManager: schedulerManager as never, + createSchedulerManager: () => schedulerManager as never, runSessionStarter: runSessionStarter as never }) @@ -1160,7 +1248,7 @@ describeIfSqlite('Cron Jobs persistence and service', () => { const service = new SchedulerServiceCtor({ ...createRequiredSchedulerDeps(), database: sqlitePresenter as never, - schedulerManager: schedulerManager as never, + createSchedulerManager: () => schedulerManager as never, runSessionStarter: runSessionStarter as never }) @@ -1348,7 +1436,7 @@ describeIfSqlite('Cron Jobs persistence and service', () => { const service = new SchedulerServiceCtor({ ...createRequiredSchedulerDeps(sessionEvents), database: sqlitePresenter as never, - schedulerManager: schedulerManager as never, + createSchedulerManager: () => schedulerManager as never, runSessionStarter: runSessionStarter as never }) @@ -1417,7 +1505,7 @@ describeIfSqlite('Cron Jobs persistence and service', () => { const service = new SchedulerServiceCtor({ ...createRequiredSchedulerDeps(), database: sqlitePresenter as never, - schedulerManager: schedulerManager as never + createSchedulerManager: () => schedulerManager as never }) const stored = sqlitePresenter.cronJobsTable.upsert({ name: 'Legacy indicator', @@ -1440,54 +1528,262 @@ describeIfSqlite('Cron Jobs persistence and service', () => { } }) - it('queues each due scheduled run once and advances next_run_at in the utility host', () => { - const tempDir = actualFs.mkdtempSync(path.join(os.tmpdir(), 'deepchat-cron-jobs-')) - const dbPath = path.join(tempDir, 'agent.db') - const db = new DatabaseCtor(dbPath) - const events: unknown[] = [] - + it('queues each due scheduled run once and advances its head at the Store owner', () => { + const { db, sqlitePresenter } = createHarness() try { - const cronJobsTable = new CronJobsTableCtor(db) - const cronJobRunsTable = new CronJobRunsTableCtor(db) - cronJobsTable.createTable() - cronJobRunsTable.createTable() - const dueAt = Date.now() - 1_000 - const job = cronJobsTable.upsert({ + const repository = new CronJobsRepositoryCtor(sqlitePresenter as never) + const now = Date.now() + const job = repository.upsertJob({ name: 'Due job', enabled: true, cronExpr: '0 9 * * *', timezone: 'UTC', agentId: 'agent-1', - nextRunAt: dueAt, - taskPrompt: 'Summarize issues', - now: 1 + nextRunAt: now - 1_000, + taskPrompt: 'Summarize issues' }) + expect(repository.queueDueRuns(now)).toEqual([ + expect.objectContaining({ jobId: job.id, scheduledAt: now - 1_000, reason: 'scheduled' }) + ]) + expect(repository.queueDueRuns(now)).toEqual([]) + expect(repository.getJob(job.id)!.nextRunAt).toBeGreaterThan(now) + expect(repository.listRunsByJob(job.id)).toHaveLength(1) + } finally { + db.close() + } + }) + + it('rolls back every queued run and head when a due batch cannot advance', () => { + const { db, sqlitePresenter } = createHarness() + try { + const repository = new CronJobsRepositoryCtor(sqlitePresenter as never) + const now = Date.now() + const jobs = [0, 1].map((index) => + repository.upsertJob({ + id: 'atomic-' + index, + name: 'Atomic due job', + enabled: true, + cronExpr: '* * * * *', + timezone: 'UTC', + agentId: 'agent-1', + nextRunAt: now - 1_000, + taskPrompt: 'Summarize issues' + }) + ) + db.exec( + "CREATE TRIGGER reject_schedule BEFORE UPDATE ON cron_jobs WHEN OLD.id = 'atomic-1' BEGIN SELECT RAISE(ABORT, 'forced schedule failure'); END" + ) + expect(() => repository.queueDueRuns(now)).toThrow('forced schedule failure') + for (const job of jobs) { + expect(repository.listRunsByJob(job.id)).toEqual([]) + expect(repository.getJob(job.id)!.nextRunAt).toBe(now - 1_000) + } + } finally { + db.close() + } + }) - const host = new CronJobsSchedulerUtilityHostCtor({ - dbPath, - postMessage: (message) => events.push(message) + it('preserves catch-up limits and skipped misfires at the Store owner', () => { + const { db, sqlitePresenter } = createHarness() + try { + const repository = new CronJobsRepositoryCtor(sqlitePresenter as never) + const now = Date.parse('2026-07-03T10:00:00.000Z') + const due = now - 180_000 + const common = { + enabled: true, + cronExpr: '* * * * *', + timezone: 'UTC', + agentId: 'agent-1', + nextRunAt: due, + taskPrompt: 'Summarize issues' + } + const skipped = repository.upsertJob({ ...common, name: 'Skip', misfirePolicy: 'skip' }) + const catchup = repository.upsertJob({ + ...common, + name: 'Catch up', + misfirePolicy: 'run_once', + maxCatchUpRuns: 2 }) + expect( + repository.queueDueRuns(now).map((run) => ({ jobId: run.jobId, at: run.scheduledAt })) + ).toEqual([ + { jobId: catchup.id, at: due }, + { jobId: catchup.id, at: due + 60_000 } + ]) + expect(repository.listRunsByJob(skipped.id)).toEqual([]) + expect(repository.queueDueRuns(now)).toEqual([]) + } finally { + db.close() + } + }) + + it('limits one durable due scan to 100 jobs without dropping the remainder', () => { + const { db, sqlitePresenter } = createHarness() + try { + const repository = new CronJobsRepositoryCtor(sqlitePresenter as never) + const now = Date.now() + for (let index = 0; index < 101; index++) + repository.upsertJob({ + name: 'Bounded due job', + enabled: true, + cronExpr: '* * * * *', + timezone: 'UTC', + agentId: 'agent-1', + nextRunAt: now - 1_000, + taskPrompt: 'Summarize issues' + }) + const first = repository.queueDueRuns(now) + const second = repository.queueDueRuns(now) + expect(first).toHaveLength(100) + expect(second).toHaveLength(1) + expect(new Set([...first, ...second].map((run) => run.jobId)).size).toBe(101) + } finally { + db.close() + } + }) + + it('bounds timer scans, coalesces reconciliation and ignores stale replies', () => { + vi.useFakeTimers() + const messages: { type: string; requestId?: number }[] = [] + const host = new CronJobsSchedulerUtilityHostCtor({ + postMessage: (message) => messages.push(message) + }) + const scans = () => messages.filter((message) => message.type === 'SCAN_DUE') + try { host.start() host.reconcile() + host.reconcile() + expect(scans()).toHaveLength(1) + const result = { + type: 'SCAN_RESULT' as const, + requestId: 1, + enabledJobCount: 1, + nextRunAt: Date.now() + 10, + now: Date.now() + } + host.applyScanResult({ ...result, requestId: 99 }) + expect(scans()).toHaveLength(1) + host.applyScanResult(result) + expect(scans().map((message) => message.requestId)).toEqual([1, 2]) + host.applyScanResult(result) + host.applyScanResult({ ...result, requestId: 2 }) + vi.advanceTimersByTime(10) + expect(scans().map((message) => message.requestId)).toEqual([1, 2, 3]) + host.shutdown() + host.applyScanResult({ ...result, requestId: 3 }) + vi.advanceTimersByTime(30_000) + expect(scans()).toHaveLength(3) + } finally { host.shutdown() + vi.useRealTimers() + } + }) - expect(events.filter((event) => (event as { type?: string }).type === 'RUN_DUE')).toEqual([ - expect.objectContaining({ - jobId: job.id, - scheduledAt: dueAt, - reason: 'scheduled' - }) - ]) - expect(cronJobsTable.get(job.id)?.next_run_at).toEqual(expect.any(Number)) - expect(db.prepare('SELECT COUNT(*) AS count FROM cron_job_runs').get()).toEqual({ - count: 1 + it('fences a timer whose Store acknowledgement never arrives', () => { + vi.useFakeTimers() + const postMessage = vi.fn() + const host = new CronJobsSchedulerUtilityHostCtor({ postMessage }) + try { + host.start() + vi.advanceTimersByTime(30_000) + expect(postMessage).toHaveBeenCalledWith( + expect.objectContaining({ type: 'ERROR', fatal: true }) + ) + const count = postMessage.mock.calls.length + host.reconcile() + vi.advanceTimersByTime(30_000) + expect(postMessage).toHaveBeenCalledTimes(count) + } finally { + host.shutdown() + vi.useRealTimers() + } + }) + + it('backs off a failed Store scan even when its error message is empty', () => { + vi.useFakeTimers() + const postMessage = vi.fn() + const host = new CronJobsSchedulerUtilityHostCtor({ postMessage }) + try { + host.start() + host.applyScanResult({ + type: 'SCAN_RESULT', + requestId: 1, + enabledJobCount: 1, + nextRunAt: Date.now() - 1, + error: '', + now: Date.now() }) + vi.advanceTimersByTime(29_999) + expect( + postMessage.mock.calls.filter(([message]) => message.type === 'SCAN_DUE') + ).toHaveLength(1) + vi.advanceTimersByTime(1) + expect( + postMessage.mock.calls.filter(([message]) => message.type === 'SCAN_DUE') + ).toHaveLength(2) } finally { - db.close() - actualFs.rmSync(tempDir, { recursive: true, force: true }) + host.shutdown() + vi.useRealTimers() } }) + it('dispatches committed runs before a lost timer reply and rejects replay or stale requests', async () => { + const host = Object.assign(new EventEmitter(), { + pid: 123, + kill: vi.fn(), + postMessage: vi.fn((message: { type: string }) => { + if (message.type === 'SCAN_RESULT') throw new Error('Timer reply lost') + }) + }) + const queueDueRuns = vi.fn(() => [ + { jobId: 'job-1', runId: 'run-1', scheduledAt: 100, reason: 'scheduled' as const } + ]) + const onRunDue = vi.fn() + const manager = new SchedulerProcessManagerCtor({ + getSnapshot: () => ({ enabledJobCount: 1, nextRunAt: 100 }), + queueDueRuns, + onRunDue, + spawnHost: vi.fn(async () => schedulerHost(host)) + }) + await manager.reconcile() + for (const requestId of [NaN, 0, '1']) + host.emit('message', { type: 'SCAN_DUE', requestId, now: Date.now() }) + expect(queueDueRuns).not.toHaveBeenCalled() + host.emit('message', { type: 'SCAN_DUE', requestId: 1, now: Date.now() }) + expect(onRunDue).toHaveBeenCalledWith(queueDueRuns.mock.results[0].value[0]) + expect(host.kill).toHaveBeenCalled() + host.emit('message', { type: 'SCAN_DUE', requestId: 1, now: Date.now() }) + await manager.stop() + host.emit('message', { type: 'SCAN_DUE', requestId: 2, now: Date.now() }) + expect(queueDueRuns).toHaveBeenCalledTimes(1) + expect(onRunDue).toHaveBeenCalledTimes(1) + }) + + it('kills a pending spawn superseded by shutdown without reviving scheduler state', async () => { + const host = Object.assign(new EventEmitter(), { + pid: 123, + kill: vi.fn(), + postMessage: vi.fn() + }) + let resolveHost!: (value: typeof host) => void + const pendingHost = new Promise((resolve) => { + resolveHost = resolve + }) + const manager = new SchedulerProcessManagerCtor({ + getSnapshot: () => ({ enabledJobCount: 1, nextRunAt: 100 }), + queueDueRuns: () => [], + onRunDue: vi.fn(), + spawnHost: () => pendingHost.then(schedulerHost) + }) + const starting = manager.reconcile() + await manager.stop() + resolveHost(host) + await expect(starting).rejects.toThrow('spawn was superseded') + expect(host.kill).toHaveBeenCalledOnce() + expect(host.postMessage).not.toHaveBeenCalled() + expect(manager.getStatus()).toMatchObject({ state: 'stopped', pid: null }) + }) + it('starts the scheduler only for enabled jobs and stops after idle heartbeat', async () => { vi.useFakeTimers() try { @@ -1512,13 +1808,13 @@ describeIfSqlite('Cron Jobs persistence and service', () => { nextRunAt: null as number | null } const host = new FakeHost() - const spawnHost = vi.fn(async () => host) + const spawnHost = vi.fn(async () => schedulerHost(host)) const manager = new SchedulerProcessManagerCtor({ - dbPath: ':memory:', getSnapshot: () => snapshot, + queueDueRuns: () => [], onRunDue: vi.fn(), idleShutdownMs: 10, - spawnHost: spawnHost as never + spawnHost }) expect(await manager.reconcile('initial')).toEqual( @@ -1594,13 +1890,13 @@ describeIfSqlite('Cron Jobs persistence and service', () => { let spawnCount = 0 const spawnHost = vi.fn(async () => { spawnCount += 1 - return spawnCount === 1 ? firstHost : secondHost + return schedulerHost(spawnCount === 1 ? firstHost : secondHost) }) const manager = new SchedulerProcessManagerCtor({ - dbPath: ':memory:', getSnapshot: () => snapshot, + queueDueRuns: () => [], onRunDue: vi.fn(), - spawnHost: spawnHost as never + spawnHost }) await manager.reconcile('initial') @@ -1620,12 +1916,12 @@ describeIfSqlite('Cron Jobs persistence and service', () => { it('records a utility spawn failure in scheduler status', async () => { const manager = new SchedulerProcessManagerCtor({ - dbPath: ':memory:', getSnapshot: () => ({ enabledJobCount: 1, nextRunAt: 100 }), + queueDueRuns: () => [], onRunDue: vi.fn(), spawnHost: vi.fn(async () => { throw new Error('Failed to spawn scheduler host.') - }) as never + }) }) await expect(manager.reconcile('spawn-failure')).rejects.toThrow( @@ -1661,10 +1957,10 @@ describeIfSqlite('Cron Jobs persistence and service', () => { } const host = new FakeHost() const manager = new SchedulerProcessManagerCtor({ - dbPath: ':memory:', getSnapshot: () => snapshot, + queueDueRuns: () => [], onRunDue: vi.fn(), - spawnHost: vi.fn(async () => host) as never + spawnHost: vi.fn(async () => schedulerHost(host)) }) await manager.reconcile('enabled') diff --git a/test/main/scripts/afterPack.test.ts b/test/main/scripts/afterPack.test.ts index 00de867421..b7de6d747f 100644 --- a/test/main/scripts/afterPack.test.ts +++ b/test/main/scripts/afterPack.test.ts @@ -11,7 +11,7 @@ vi.mock('node:fs', async () => { }) const loadAfterPack = async () => { - return (await import('../../../scripts/afterPack.js')).default as (context: { + const afterPack = (await import('../../../scripts/afterPack.js')).default as (context: { targets: Array<{ name: string }> appOutDir: string electronPlatformName: string @@ -23,6 +23,30 @@ const loadAfterPack = async () => { } } }) => Promise + return async (context: Parameters[0]) => { + const resources = + context.electronPlatformName === 'darwin' + ? path.join( + context.appOutDir, + `${context.packager?.appInfo?.productFilename ?? 'DeepChat'}.app`, + 'Contents', + 'Resources' + ) + : path.join(context.appOutDir, 'resources') + const catalogDirectory = path.join(resources, 'app.asar.unpacked', 'resources', 'model-db') + await mkdir(catalogDirectory, { recursive: true }) + await writeFile( + path.join(catalogDirectory, 'providers.json'), + JSON.stringify({ providers: { fixture: { id: 'fixture', models: [{ id: 'fixture' }] } } }) + ) + const registryDirectory = path.join(resources, 'app.asar.unpacked', 'resources', 'acp-registry') + await mkdir(registryDirectory, { recursive: true }) + await writeFile( + path.join(registryDirectory, 'registry.json'), + JSON.stringify({ version: 'fixture', agents: [{ id: 'fixture' }] }) + ) + await afterPack(context) + } } const loadPackageLightOcrAssets = async () => { @@ -409,7 +433,51 @@ describe('afterPack', () => { await rm(tmpDir, { recursive: true, force: true }) }) - it('keeps non-Linux packages unchanged', async () => { + it.each(['darwin', 'win32', 'linux'])( + 'requires a readable unpacked Provider catalog for %s', + async (electronPlatformName) => { + const { validateProviderCatalog } = await import('../../../scripts/afterPack.js') + const context = { appOutDir: tmpDir, electronPlatformName } + await expect(validateProviderCatalog(context)).rejects.toThrow() + const resources = electronPlatformName === 'darwin' + ? path.join(tmpDir, 'DeepChat.app', 'Contents', 'Resources') + : path.join(tmpDir, 'resources') + const directory = path.join(resources, 'app.asar.unpacked', 'resources', 'model-db') + await mkdir(directory, { recursive: true }) + const catalog = path.join(directory, 'providers.json') + await writeFile(catalog, JSON.stringify({ providers: { fixture: { id: 'fixture' } } })) + await expect(validateProviderCatalog(context)).resolves.toBeUndefined() + await writeFile(catalog, JSON.stringify({ providers: {} })) + await expect(validateProviderCatalog(context)).rejects.toThrow('empty or invalid') + } + ) + + it.each(['darwin', 'win32', 'linux'])( + 'requires readable unpacked ACP registry and icon assets for %s', + async (electronPlatformName) => { + const { validateAcpRegistry } = await import('../../../scripts/afterPack.js') + const context = { appOutDir: tmpDir, electronPlatformName } + await expect(validateAcpRegistry(context)).rejects.toThrow() + const resources = + electronPlatformName === 'darwin' + ? path.join(tmpDir, 'DeepChat.app', 'Contents', 'Resources') + : path.join(tmpDir, 'resources') + const directory = path.join(resources, 'app.asar.unpacked', 'resources', 'acp-registry') + await mkdir(path.join(directory, 'icons'), { recursive: true }) + const file = path.join(directory, 'registry.json') + const icon = 'https://cdn.agentclientprotocol.com/registry/v1/latest/fixture.svg' + await writeFile(file, JSON.stringify({ version: '1', agents: [{ id: 'fixture', icon }] })) + await expect(validateAcpRegistry(context)).rejects.toThrow() + await writeFile(path.join(directory, 'icons', 'fixture.svg'), '') + await expect(validateAcpRegistry(context)).resolves.toBeUndefined() + await writeFile(file, JSON.stringify({ version: '1', agents: [{ id: '../escape', icon }] })) + await expect(validateAcpRegistry(context)).rejects.toThrow('invalid agent ID') + await writeFile(file, JSON.stringify({ version: '1', agents: [] })) + await expect(validateAcpRegistry(context)).rejects.toThrow('empty or invalid') + } + ) + + it('keeps non-Linux launchers unchanged', async () => { const afterPack = await loadAfterPack() const launcherPath = path.join(tmpDir, 'DeepChat') await writeFile(launcherPath, 'launcher') diff --git a/test/main/scripts/packageContract.test.ts b/test/main/scripts/packageContract.test.ts index aa11b9acf5..63cb0cff36 100644 --- a/test/main/scripts/packageContract.test.ts +++ b/test/main/scripts/packageContract.test.ts @@ -92,6 +92,15 @@ describe('CI package contract', () => { } ] }) + for (const harnessPath of [ + 'rust-toolchain.toml', 'scripts/build-harness.mjs', 'crates/deepchat-harness/src/main.rs', + 'src/harness/plugins/admission.ts', 'src/shared/harness/admission.ts', + 'scripts/smoke-harness-memory.mjs', 'src/main/harness/runtime.ts' + ]) { + expect(classifyPackageImpact([harnessPath])).toMatchObject({ + required: true, windows: true, linux: true, macos: true + }) + } expect(classifyPackageImpact(['.github/workflows/_package-windows.yml'])).toMatchObject({ required: true, windows: true, diff --git a/test/main/scripts/packageWorkflow.test.ts b/test/main/scripts/packageWorkflow.test.ts index f12a8ffd9a..74fb1db3ba 100644 --- a/test/main/scripts/packageWorkflow.test.ts +++ b/test/main/scripts/packageWorkflow.test.ts @@ -161,6 +161,20 @@ const runBashStep = (script: string, env: NodeJS.ProcessEnv) => }) describe('native package reusable workflows', () => { + it('executes the packaged Memory worker on each native runner', () => { + for (const definition of Object.values(reusableWorkflows)) { + const workflow = readWorkflow(definition.name) + const step = getStep(workflow, 'Verify packaged Memory runtime') + expect(step.if).toBeUndefined() + expect(step.run).toContain('pnpm run smoke:harness:memory --') + expect(step.run).toContain('--resources-path "') + expect(step.run).toContain('--executable "') + expect(workflow.jobs.package.steps.indexOf(step)).toBeGreaterThan( + workflow.jobs.package.steps.indexOf(getStep(workflow, 'Verify packaged DuckDB VSS')) + ) + } + }) + it('owns the fixed runner mapping and a shared immutable input contract', () => { for (const definition of Object.values(reusableWorkflows)) { const workflow = readWorkflow(definition.name) diff --git a/test/main/scripts/prcheckWorkflow.test.ts b/test/main/scripts/prcheckWorkflow.test.ts index f4285d761a..5f78520657 100644 --- a/test/main/scripts/prcheckWorkflow.test.ts +++ b/test/main/scripts/prcheckWorkflow.test.ts @@ -150,6 +150,9 @@ describe('PR Check workflow contracts', () => { ]) expect(getRunCommands(workflow.jobs['test-main'])).toEqual([ 'pnpm install --frozen-lockfile', + 'cargo fmt --check --manifest-path crates/deepchat-harness/Cargo.toml\n' + + 'cargo clippy --locked --manifest-path crates/deepchat-harness/Cargo.toml --all-targets -- -D warnings\n' + + 'cargo test --locked --manifest-path crates/deepchat-harness/Cargo.toml\n', 'pnpm run test:main' ]) expect(getRunCommands(workflow.jobs['test-renderer'])).toEqual([ @@ -178,13 +181,14 @@ describe('PR Check workflow contracts', () => { const orderedStepNames = [ 'Install dependencies', 'Install and verify DuckDB VSS', + 'Build Rutis harness for native integration', 'Validate portable memory behavior', 'Smoke native SQLite', 'Validate native Tape storage', 'Validate encrypted OCR artifact storage', 'Validate native memory storage', 'Validate memory retrieval quality', - 'Validate memory performance bounds', + 'Validate memory workload bounds and report timings', 'Upload memory retrieval report' ] const indexes = orderedStepNames.map((name) => @@ -207,6 +211,7 @@ describe('PR Check workflow contracts', () => { expect(getStep(nativeJob, 'Validate portable memory behavior').run).toBe( 'pnpm run test:memory' ) + expect(getStep(nativeJob, 'Build Rutis harness for native integration').run).toBe('pnpm run harness:build') // better-sqlite3-multiple-ciphers 13+ ships N-API prebuilds; the Node-ABI // rebuild step is gone and must not come back. expect( @@ -239,12 +244,15 @@ describe('PR Check workflow contracts', () => { expect(getStep(nativeJob, 'Validate memory retrieval quality').env).toEqual({ DEEPCHAT_REQUIRE_NATIVE_SQLITE: '1' }) - expect(getStep(nativeJob, 'Validate memory performance bounds').run).toBe( + expect(getStep(nativeJob, 'Validate memory workload bounds and report timings').run).toBe( 'pnpm run test:main:memory-perf' ) - expect(getStep(nativeJob, 'Validate memory performance bounds').env).toEqual({ - DEEPCHAT_REQUIRE_NATIVE_SQLITE: '1' + expect(getStep(nativeJob, 'Validate memory workload bounds and report timings').env).toEqual({ + DEEPCHAT_REQUIRE_NATIVE_SQLITE: '1', + DEEPCHAT_MEMORY_PERF_REPORT_ONLY: '1' }) + expect(nativeJob).not.toHaveProperty('continue-on-error') + for (const step of nativeJob.steps ?? []) expect(step).not.toHaveProperty('continue-on-error') expect(getStep(nativeJob, 'Upload memory retrieval report')).toMatchObject({ if: 'always()', with: { diff --git a/test/main/scripts/testEntrypoints.test.ts b/test/main/scripts/testEntrypoints.test.ts index b15727b2d0..68c20e0e7c 100644 --- a/test/main/scripts/testEntrypoints.test.ts +++ b/test/main/scripts/testEntrypoints.test.ts @@ -16,11 +16,12 @@ const windowsArm64Workflow = fs.readFileSync( describe('test entrypoint contracts', () => { it('keeps complete test suites one-shot and watch mode explicit', () => { expect(packageJson.scripts).toMatchObject({ - test: 'vitest run', - 'test:main': 'vitest run --config vitest.config.ts test/main', + test: 'pnpm run harness:build && vitest run', + 'test:main': 'pnpm run harness:build && vitest run --config vitest.config.ts test/main', 'test:renderer': 'vitest run --config vitest.config.renderer.ts test/renderer', - 'test:coverage': 'vitest run --coverage', - 'test:watch': 'vitest --watch' + 'test:main:memory-perf': 'pnpm run harness:build && cross-env ELECTRON_RUN_AS_NODE=1 electron node_modules/vitest/vitest.mjs --config vitest.config.memory-perf.ts --run', + 'test:coverage': 'pnpm run harness:build && vitest run --coverage', + 'test:watch': 'pnpm run harness:build && vitest --watch' }) }) diff --git a/test/main/session/data/tapeLifecycle.test.ts b/test/main/session/data/tapeLifecycle.test.ts index 87a3493837..5b29a3e11c 100644 --- a/test/main/session/data/tapeLifecycle.test.ts +++ b/test/main/session/data/tapeLifecycle.test.ts @@ -10,7 +10,6 @@ import { SqliteTapeLifecycleAdapter, vi } from './tapeTestHarness' -import { SessionTranscriptMutations } from '@/session/transcriptMutations' function createHarness() { const calls: string[] = [] @@ -269,73 +268,6 @@ describe('SessionTape lifecycle administration', () => { } }) - itIfSqlite( - 'rolls transcript cleanup back with a failed Tape reset on one connection', - async () => { - const db = new DatabaseCtor(':memory:') - try { - db.exec(` - CREATE TABLE clear_pending (session_id TEXT NOT NULL); - CREATE TABLE clear_transcript (session_id TEXT NOT NULL); - INSERT INTO clear_pending (session_id) VALUES ('s1'); - INSERT INTO clear_transcript (session_id) VALUES ('s1'); - `) - const entryStore = new DeepChatTapeEntriesTable(db) - const searchProjection = new DeepChatTapeSearchProjectionTable(db) - entryStore.createTable() - searchProjection.createTable() - entryStore.ensureBootstrapAnchor('s1') - entryStore.appendEvent({ - sessionId: 's1', - name: 'old/generation', - data: { marker: 'old generation' } - }) - const tape = new SessionTape({ - deepchatTapeEntriesTable: entryStore, - tapeLifecycle: new SqliteTapeLifecycleAdapter(db), - deepchatTapeSearchProjectionTable: searchProjection - } as any) - vi.spyOn(searchProjection, 'deleteBySession').mockImplementationOnce(() => { - throw new Error('search cleanup failed') - }) - const runtime = { - prepareClearMessages: vi.fn().mockResolvedValue(undefined), - finishClearMessages: vi.fn() - } - const mutations = new SessionTranscriptMutations({ - pendingInputs: { - deleteBySession: () => - db.prepare('DELETE FROM clear_pending WHERE session_id = ?').run('s1') - }, - transcript: { - deleteBySession: () => - db.prepare('DELETE FROM clear_transcript WHERE session_id = ?').run('s1') - }, - settings: { resetTape: () => tape.resetSessionTape('s1') }, - runtime, - runInTransaction: (operation) => db.transaction(operation)() - } as any) - - await expect(mutations.clearMessages('s1')).rejects.toThrow('search cleanup failed') - - expect(db.prepare('SELECT COUNT(*) AS count FROM clear_pending').get()).toEqual({ - count: 1 - }) - expect(db.prepare('SELECT COUNT(*) AS count FROM clear_transcript').get()).toEqual({ - count: 1 - }) - expect(entryStore.getBySession('s1').map((entry) => entry.name)).toEqual([ - 'session/start', - 'old/generation' - ]) - expect(runtime.finishClearMessages).not.toHaveBeenCalled() - } finally { - vi.restoreAllMocks() - db.close() - } - } - ) - itIfSqlite('drops corrupt FTS state instead of blocking a Tape generation reset', () => { const db = new DatabaseCtor(':memory:') try { diff --git a/test/main/session/data/tapeTestHarness.ts b/test/main/session/data/tapeTestHarness.ts index 48b478c9cf..949949fb6d 100644 --- a/test/main/session/data/tapeTestHarness.ts +++ b/test/main/session/data/tapeTestHarness.ts @@ -4,11 +4,7 @@ import { buildContext } from '@/agent/deepchat/runtime/contextBuilder' import { toAppSessionId } from '@/agent/shared/agentSessionIds' import { SessionTape } from '@/tape/application/sessionTape' import { buildEffectiveTapeView, searchEffectiveTapeRows } from '@/tape/domain/effectiveView' -import { - buildRequestRefs, - createTapeViewManifest, - type TapeViewManifestBuildInput -} from '@/tape/domain/viewManifest' +import { buildRequestRefs, createTapeViewManifest } from '@/tape/domain/viewManifest' import { appendMessageRecordToTape, appendMessageReplacementToTape, diff --git a/test/main/session/data/transcriptAtomicity.test.ts b/test/main/session/data/transcriptAtomicity.test.ts index 8762192c53..07da9c2713 100644 --- a/test/main/session/data/transcriptAtomicity.test.ts +++ b/test/main/session/data/transcriptAtomicity.test.ts @@ -1,17 +1,22 @@ -import { describe, expect, it } from 'vitest' +import { describe, expect, it, vi } from 'vitest' import type { AssistantMessageBlock } from '@shared/types/agent-interface' +import { SessionTranscriptMutations } from '@/session/transcriptMutations' const sqliteModule = await import('better-sqlite3-multiple-ciphers').catch(() => null) const mainDatabaseModule = sqliteModule ? await import('@/data/mainDatabase') : null const sessionDatabaseModule = sqliteModule ? await import('@/session/data/database') : null const sessionTapeModule = sqliteModule ? await import('@/tape/application/sessionTape') : null const transcriptModule = sqliteModule ? await import('@/session/data/transcript') : null +const sessionDataModule = sqliteModule ? await import('@/session/data') : null +const memoryDatabaseModule = sqliteModule ? await import('@/memory/data/database') : null const Database = sqliteModule?.default const MainDatabaseCtor = mainDatabaseModule?.MainDatabase! const SessionDatabaseCtor = sessionDatabaseModule?.SessionDatabase! const SessionTapeCtor = sessionTapeModule?.SessionTape! const SessionTranscriptCtor = transcriptModule?.SessionTranscript! +const createSessionData = sessionDataModule?.createSessionData! +const MemoryDatabaseCtor = memoryDatabaseModule?.MemoryDatabase! let sqliteAvailable = false if (Database) { @@ -39,6 +44,60 @@ const blocks: AssistantMessageBlock[] = [ * roll back with it instead of committing a message the Tape never saw. */ describeIfSqlite('SessionTranscript keeps transcript and Tape writes atomic', () => { + it.each([false, true])( + 'clears transcript, queue and projections together or preserves all data (%s)', + async (failReset) => { + const connection = new MainDatabaseCtor(':memory:') + try { + const projection = new MemoryDatabaseCtor(connection).ingestionProjectionTable + const data = createSessionData(connection, () => projection, { + publishPendingInputsChanged: vi.fn(), + publishMessagesChanged: vi.fn() + }) + data.transcript.createUserMessage('s1', 1, userContent) + data.pendingInputs.queuePendingInput('s1', { text: 'queued' }) + const messages = data.transcript.getMessages('s1') + const incarnation = data.tapeStore.getTapeIncarnationId('s1') + const head = data.tapeStore.getProjectionHead('s1') + const runtime = { + prepareClearMessages: vi.fn().mockResolvedValue(undefined), + finishClearMessages: vi.fn() + } + const mutations = new SessionTranscriptMutations({ + transcript: data.transcript, + clearTranscript: data.clearTranscript, + runtime: runtime as never + }) + if (failReset) { + connection.getDatabase().exec(` + CREATE TRIGGER reject_tape_reset BEFORE DELETE ON deepchat_tape_entries + BEGIN SELECT RAISE(ABORT, 'Tape reset rejected'); END; + `) + await expect(mutations.clearMessages('s1')).rejects.toThrow('Tape reset rejected') + expect(data.transcript.getMessages('s1')).toEqual(messages) + expect(data.pendingInputs.listPendingInputs('s1')).toHaveLength(1) + expect(data.tapeStore.getTapeIncarnationId('s1')).toBe(incarnation) + expect(data.tapeStore.getProjectionHead('s1')).toEqual(head) + expect(runtime.finishClearMessages).not.toHaveBeenCalled() + } else { + await mutations.clearMessages('s1') + expect(data.transcript.getMessages('s1')).toEqual([]) + expect(data.pendingInputs.listPendingInputs('s1')).toEqual([]) + expect(data.tapeStore.getTapeIncarnationId('s1')).not.toBe(incarnation) + expect(runtime.finishClearMessages).toHaveBeenCalledOnce() + } + expect( + connection + .getDatabase() + .prepare('SELECT count(*) AS count FROM deepchat_memory_ingestion_projection') + .get() + ).toEqual({ count: failReset ? 1 : 0 }) + } finally { + connection.close() + } + } + ) + function createTranscript() { const connection = new MainDatabaseCtor(':memory:') const database = new SessionDatabaseCtor(connection) @@ -61,6 +120,7 @@ describeIfSqlite('SessionTranscript keeps transcript and Tape writes atomic', () connection, database, transcript, + tapeFacts, setTapeFailing: (value: boolean) => { failTape = value } @@ -84,6 +144,39 @@ describeIfSqlite('SessionTranscript keeps transcript and Tape writes atomic', () } }) + it('rolls retry truncation back when a later Tape retraction fails', () => { + const { connection, database, transcript, tapeFacts } = createTranscript() + try { + const keptId = transcript.createUserMessage('s1', 1, userContent) + transcript.createUserMessage('s1', 2, { ...userContent, text: 'second' }) + transcript.createUserMessage('s1', 3, { ...userContent, text: 'third' }) + const messages = transcript.getMessages('s1') + const facts = database.deepchatTapeEntriesTable.getBySession('s1') + const appendRetraction = tapeFacts.appendMessageRetraction + let retractions = 0 + const fail = vi.spyOn(tapeFacts, 'appendMessageRetraction').mockImplementation((...args) => { + if (++retractions === 2) throw new Error('Later retraction failed') + return appendRetraction(...args) + }) + const runtime = { invalidateTranscriptFrom: vi.fn() } + const mutations = new SessionTranscriptMutations({ + transcript, + runtime: runtime as never, + clearTranscript: vi.fn() + }) + expect(() => mutations.commitRetryMessage('s1', 2)).toThrow('Later retraction failed') + expect(transcript.getMessages('s1')).toEqual(messages) + expect(database.deepchatTapeEntriesTable.getBySession('s1')).toEqual(facts) + expect(runtime.invalidateTranscriptFrom).not.toHaveBeenCalled() + fail.mockRestore() + mutations.commitRetryMessage('s1', 2) + expect(transcript.getMessages('s1').map((message) => message.id)).toEqual([keptId]) + expect(runtime.invalidateTranscriptFrom).toHaveBeenCalledWith('s1', 2) + } finally { + connection.close() + } + }) + it('keeps the assistant message pending when its terminal Tape fact fails', () => { const { connection, database, transcript, setTapeFailing } = createTranscript() try { diff --git a/test/main/session/runtimeIntegration.test.ts b/test/main/session/runtimeIntegration.test.ts index 3c9aab4573..d1c249e547 100644 --- a/test/main/session/runtimeIntegration.test.ts +++ b/test/main/session/runtimeIntegration.test.ts @@ -1042,10 +1042,8 @@ function createTranscriptMutations( ) { return new SessionTranscriptMutations({ transcript: sessionData.transcript, - settings: sessionData.settings, - pendingInputs: sessionData.pendingInputs, runtime, - runInTransaction: (operation) => sessionData.database.getDatabase().transaction(operation)() + clearTranscript: sessionData.clearTranscript }) } diff --git a/test/main/session/transcriptMutations.test.ts b/test/main/session/transcriptMutations.test.ts index b1cedb3d8f..86f2a2b6a0 100644 --- a/test/main/session/transcriptMutations.test.ts +++ b/test/main/session/transcriptMutations.test.ts @@ -71,79 +71,30 @@ describe('SessionTranscriptMutations', () => { }) }) - it('rolls pending inputs and transcript deletion back when Tape reset fails', async () => { - const state = { pendingInputs: 1, transcriptMessages: 2, tapeEntries: 3 } + it('does not finish runtime cleanup when the durable clear command fails', async () => { const runtime = { prepareClearMessages: vi.fn().mockResolvedValue(undefined), finishClearMessages: vi.fn() } - const mutations = new SessionTranscriptMutations({ - pendingInputs: { - deleteBySession: vi.fn(() => { - state.pendingInputs = 0 - }) - }, - transcript: { - deleteBySession: vi.fn(() => { - state.transcriptMessages = 0 - }) - }, - settings: { - resetTape: vi.fn(() => { - state.tapeEntries = 0 - throw new Error('Tape reset failed') - }) - }, - runtime, - runInTransaction: (operation) => { - const snapshot = { ...state } - try { - return operation() - } catch (error) { - Object.assign(state, snapshot) - throw error - } - } - } as any) - + const clearTranscript = vi.fn(() => { + throw new Error('Tape reset failed') + }) + const mutations = new SessionTranscriptMutations({ runtime, clearTranscript } as never) await expect(mutations.clearMessages('s1')).rejects.toThrow('Tape reset failed') - - expect(state).toEqual({ pendingInputs: 1, transcriptMessages: 2, tapeEntries: 3 }) - expect(runtime.prepareClearMessages).toHaveBeenCalledWith('s1') + expect(clearTranscript).toHaveBeenCalledWith('s1') expect(runtime.finishClearMessages).not.toHaveBeenCalled() }) - it('finishes runtime cleanup only after the shared transaction commits', async () => { - const calls: string[] = [] - const mutations = new SessionTranscriptMutations({ - pendingInputs: { deleteBySession: vi.fn(() => calls.push('pending')) }, - transcript: { deleteBySession: vi.fn(() => calls.push('transcript')) }, - settings: { resetTape: vi.fn(() => calls.push('tape')) }, - runtime: { - prepareClearMessages: vi.fn(async () => { - calls.push('prepare') - }), - finishClearMessages: vi.fn(() => calls.push('finish')) - }, - runInTransaction: (operation) => { - calls.push('transaction:start') - const result = operation() - calls.push('transaction:commit') - return result - } - } as any) - - await mutations.clearMessages('s1') - - expect(calls).toEqual([ - 'prepare', - 'transaction:start', - 'pending', - 'transcript', - 'tape', - 'transaction:commit', - 'finish' - ]) + it('does not clear durable data when runtime preparation fails', async () => { + const clearTranscript = vi.fn() + const runtime = { + prepareClearMessages: vi.fn().mockRejectedValue(new Error('Run did not drain')), + finishClearMessages: vi.fn() + } + const mutations = new SessionTranscriptMutations({ runtime, clearTranscript } as never) + await expect(mutations.clearMessages('s1')).rejects.toThrow('Run did not drain') + expect(clearTranscript).not.toHaveBeenCalled() + expect(runtime.finishClearMessages).not.toHaveBeenCalled() }) it('invalidates retry projections only after transcript deletion commits', () => { @@ -157,18 +108,12 @@ describe('SessionTranscriptMutations', () => { calls.push('delete') }) }, - runtime, - runInTransaction: (operation) => { - calls.push('transaction:start') - const result = operation() - calls.push('transaction:commit') - return result - } + runtime } as any) mutations.commitRetryMessage('s1', 7) - expect(calls).toEqual(['transaction:start', 'delete', 'transaction:commit', 'invalidate']) + expect(calls).toEqual(['delete', 'invalidate']) }) it('does not invalidate retry projections when transcript deletion rolls back', () => { @@ -179,8 +124,7 @@ describe('SessionTranscriptMutations', () => { throw new Error('delete failed') }) }, - runtime, - runInTransaction: (operation) => operation() + runtime } as any) expect(() => mutations.commitRetryMessage('s1', 7)).toThrow('delete failed') diff --git a/test/main/settings/appSettingsDbStore.test.ts b/test/main/settings/appSettingsDbStore.test.ts index f732e6559d..21b0f11ae3 100644 --- a/test/main/settings/appSettingsDbStore.test.ts +++ b/test/main/settings/appSettingsDbStore.test.ts @@ -96,7 +96,7 @@ describe('settings DB-backed stores', () => { expect(store.has('mcpServers')).toBe(true) }) - it('reads migrated ACP fields from sqlite and keeps agent-owned legacy fields', () => { + it('reads ACP settings from sqlite and an isolated read-only legacy snapshot', () => { const legacy = createLegacyStore({ enabled: true, sharedMcpSelections: ['legacy-server'], @@ -106,13 +106,23 @@ describe('settings DB-backed stores', () => { agentSettings: { enabled: false, version: '4' }, agentSelections: ['sqlite-server'] }) - const store = new AcpDbStore(legacy, () => tables) + const store = new AcpDbStore(legacy.store, () => tables) + legacy.set('manualAgents', [{ id: 'replaced-agent' }]) expect(store.store.enabled).toBe(false) expect(store.store.sharedMcpSelections).toEqual(['sqlite-server']) expect(store.store.manualAgents).toEqual([{ id: 'legacy-agent' }]) expect(store.get('enabled', false)).toBe(false) expect(store.get('sharedMcpSelections', [])).toEqual(['sqlite-server']) + const manualAgents = store.store.manualAgents as Array<{ id: string }> + manualAgents[0].id = 'mutated-agent' + expect(store.get('manualAgents')).toEqual([{ id: 'legacy-agent' }]) + expect(() => store.set('manualAgents', [])).toThrow('Legacy ACP settings are read-only') + expect(() => store.delete('manualAgents')).toThrow('Legacy ACP settings are read-only') + expect(() => store.set({ enabled: true, manualAgents: [] })).toThrow( + 'Legacy ACP settings are read-only' + ) + expect(store.get('enabled')).toBe(false) }) it('keeps provider keys opaque in the app settings store', () => { @@ -181,6 +191,9 @@ function createAppSettingsTable( getMcpSetting: vi.fn((key: string) => mcpSettings[key]), listAgentSettings: vi.fn(() => agentSettings), getAgentSetting: vi.fn((key: string) => agentSettings[key]), + setAgentSetting: vi.fn((key: string, value: unknown) => { + agentSettings[key] = value + }), getAgentMcpSelections: vi.fn(() => overrides.agentSelections ?? []), listAppSettings: vi.fn(() => appSettings), getAppSetting: vi.fn((key: string) => appSettings[key]) diff --git a/test/main/skill/agentSkillImportService.test.ts b/test/main/skill/agentSkillImportService.test.ts index c2a8dcd633..bb12cb8253 100644 --- a/test/main/skill/agentSkillImportService.test.ts +++ b/test/main/skill/agentSkillImportService.test.ts @@ -4,7 +4,7 @@ import path from 'node:path' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' import { SKILL_NAME_MAX_LENGTH, type SkillInstallOptions } from '@shared/types/skill' import type { UnifiedSkillItem } from '@shared/types/skillManagement' -import type { CanonicalSkill, ScanResult } from '@shared/types/skillSync' +import type { CanonicalSkill, ImportPreview, ScanResult } from '@shared/types/skillSync' import { AgentSkillImportService, type AgentSkillImportServiceDependencies @@ -16,14 +16,6 @@ vi.unmock('node:fs') vi.unmock('fs/promises') vi.unmock('node:fs/promises') -const electronState = vi.hoisted(() => ({ tempPath: '/tmp' })) - -vi.mock('electron', () => ({ - app: { - getPath: vi.fn(() => electronState.tempPath) - } -})) - const createExternalScan = (skills: ScanResult['skills']): ScanResult => ({ toolId: 'codex', toolName: 'Codex', @@ -42,8 +34,10 @@ describe('AgentSkillImportService', () => { let tempRoot: string let allSkills: UnifiedSkillItem[] let scans: ScanResult[] - let externalPreviews: Array<{ skill: CanonicalSkill; warnings: string[] }> - let installImportedSkill: ReturnType + let externalPreviews: ImportPreview[] + let installImportedSkill: ReturnType< + typeof vi.fn + > let dependencies: AgentSkillImportServiceDependencies let service: AgentSkillImportService @@ -60,6 +54,7 @@ describe('AgentSkillImportService', () => { 'utf-8' ) allSkills.push({ + agentId: 'deepchat', name: skill.name, description: skill.description, path: path.join(skillRoot, 'SKILL.md'), @@ -87,20 +82,29 @@ describe('AgentSkillImportService', () => { })) ) ] - externalPreviews = skills.map((skill) => ({ skill, warnings: [] })) + externalPreviews = skills.map((skill) => ({ + skill, + warnings: [], + source: { + name: skill.name, + path: `/external/skills/${skill.name}`, + format: 'codex', + lastModified: new Date() + } + })) } beforeEach(async () => { tempRoot = await mkdtemp(path.join(os.tmpdir(), 'deepchat-agent-import-test-')) - electronState.tempPath = tempRoot await mkdir(path.join(tempRoot, 'allSkills'), { recursive: true }) allSkills = [] scans = [] externalPreviews = [] installImportedSkill = vi - .fn() + .fn() .mockResolvedValue({ success: true, skillName: 'installed-skill' }) dependencies = { + tempDirectory: tempRoot, skills: { getAllSkills: vi.fn(async () => allSkills), installImportedSkill diff --git a/test/main/skill/settings.test.ts b/test/main/skill/settings.test.ts index e042f8a473..a927b1c441 100644 --- a/test/main/skill/settings.test.ts +++ b/test/main/skill/settings.test.ts @@ -1,5 +1,4 @@ import { beforeEach, describe, expect, it, vi } from 'vitest' -import { app } from 'electron' import { SkillSettings } from '@/skill/settings' describe('SkillSettings', () => { @@ -12,11 +11,10 @@ describe('SkillSettings', () => { beforeEach(() => { values.clear() vi.clearAllMocks() - vi.mocked(app.getPath).mockReturnValue('/home/tester') }) it('returns the Skill defaults', () => { - const settings = new SkillSettings(store as never) + const settings = new SkillSettings(store as never, '/home/tester') expect(settings.isEnabled()).toBe(true) expect(settings.isDraftSuggestionsEnabled()).toBe(false) @@ -24,10 +22,11 @@ describe('SkillSettings', () => { }) it('reads and writes Skill-owned settings', () => { - const settings = new SkillSettings(store as never) + const settings = new SkillSettings(store as never, '/home/tester') const managementState = { - version: 2 as const, - agents: { deepchat: { skills: {} } } + version: 3 as const, + skills: {}, + agents: { deepchat: { bindings: {} } } } const scanCache = { timestamp: '2026-07-16T00:00:00.000Z', tools: [] } @@ -41,7 +40,7 @@ describe('SkillSettings', () => { }) it('freezes legacy Agent migration targets once while preserving v1 state', () => { - const settings = new SkillSettings(store as never) + const settings = new SkillSettings(store as never, '/home/tester') values.set('skills.managementState', { version: 1, skills: {}, diff --git a/test/main/skill/skillExecutionService.test.ts b/test/main/skill/skillExecutionService.test.ts index 5a379d4d59..4ae7947d25 100644 --- a/test/main/skill/skillExecutionService.test.ts +++ b/test/main/skill/skillExecutionService.test.ts @@ -42,7 +42,7 @@ vi.mock('@/skill/skillExecutionPackageTree', async (importOriginal) => { }) import { spawn } from 'child_process' -import { backgroundExecSessionManager } from '@/agent/shared/process/backgroundExecSessionManager' +import { createBackgroundExecFixture } from '../tool/agentTools/agentToolDependencies' import { terminateProcessTree } from '@/agent/shared/process/processTree' import { materializeSkillExecutionPackageTree } from '@/skill/skillExecutionPackageTree' @@ -53,6 +53,8 @@ class MockWritableStream extends EventEmitter { } describe('SkillExecutionService', () => { + let backgroundExecSessionManager: ReturnType + let service: SkillExecutionService let resolveConversationWorkdir: ReturnType let authority: ResolvedSkillExecutionAuthority @@ -61,6 +63,7 @@ describe('SkillExecutionService', () => { const originalPlatform = Object.getOwnPropertyDescriptor(process, 'platform') beforeEach(() => { + backgroundExecSessionManager = createBackgroundExecFixture() vi.clearAllMocks() vi.mocked(spawn).mockReset() vi.mocked(terminateProcessTree).mockReset() @@ -148,6 +151,7 @@ describe('SkillExecutionService', () => { resolveConversationWorkdir = vi.fn().mockResolvedValue('/workspace/session') service = new SkillExecutionService({ + backgroundExec: backgroundExecSessionManager, resolveConversationWorkdir }) }) diff --git a/test/main/skill/skillService.test.ts b/test/main/skill/skillService.test.ts index e716733dc6..80b3f929d4 100644 --- a/test/main/skill/skillService.test.ts +++ b/test/main/skill/skillService.test.ts @@ -1,7 +1,6 @@ import { describe, it, expect, beforeEach, vi, Mock, afterEach } from 'vitest' import type { SkillSettingsPort } from '@/skill/settings' import type { SkillMetadata } from '../../../src/shared/types/skill' -import { app } from 'electron' const DEFAULT_SKILLS_DIR = '/mock/home/.deepchat/skills' @@ -32,21 +31,6 @@ const skillArchiveMock = vi.hoisted(() => ({ })) // Mock external dependencies -vi.mock('electron', () => ({ - app: { - getPath: vi.fn().mockImplementation((name: string) => { - if (name === 'home') return '/mock/home' - if (name === 'temp') return '/mock/temp' - return '/mock/' + name - }), - getAppPath: vi.fn().mockReturnValue('/mock/app'), - isPackaged: false - }, - shell: { - openPath: vi.fn().mockResolvedValue('') - } -})) - vi.mock('fs', () => { const fsMock = { existsSync: vi.fn(), @@ -198,7 +182,7 @@ import matter from 'gray-matter' import { execFile } from 'node:child_process' import { randomUUID } from 'node:crypto' import logger from '@shared/logger' -import { SKILL_CONFIG, SkillService } from '../../../src/main/skill/index' +import { SKILL_CONFIG, SkillService, type SkillHostPort } from '../../../src/main/skill/index' import type { IFileWatcherService, WatchBatchListener, @@ -335,6 +319,7 @@ function createFakeWatcherService() { describe('SkillService', () => { let skillService: SkillService + let skillHost: SkillHostPort let mockProviderSettings: SkillSettingsPort let fakeWatcherService: ReturnType let configSettings: Map @@ -345,6 +330,13 @@ describe('SkillService', () => { } beforeEach(() => { + skillHost = { + homeDirectory: '/mock/home', + tempDirectory: '/mock/temp', + userDataDirectory: '/mock/userData', + builtinSkillsDirectories: ['/mock/app/resources/skills'], + openSkillsDirectory: vi.fn(async () => undefined) + } vi.clearAllMocks() ;(fs.renameSync as Mock).mockReset() ;(fs.copyFileSync as Mock).mockReset() @@ -444,7 +436,8 @@ describe('SkillService', () => { mockProviderSettings, skillSessionStatePort as any, fakeWatcherService.service, - publishDeepchatEventMock + publishDeepchatEventMock, + skillHost ) ;(skillService as any).skillsDir = DEFAULT_SKILLS_DIR ;(skillService as any).sidecarDir = `${DEFAULT_SKILLS_DIR}/.deepchat-meta` @@ -466,7 +459,8 @@ describe('SkillService', () => { mockProviderSettings, skillSessionStatePort as any, fakeWatcherService.service, - publishDeepchatEventMock + publishDeepchatEventMock, + skillHost ) expect(mockProviderSettings.getPath).toHaveBeenCalled() await expect(presenter.getSkillsDir()).resolves.toBe('/custom/skills/path') @@ -480,7 +474,8 @@ describe('SkillService', () => { mockProviderSettings, skillSessionStatePort as any, fakeWatcherService.service, - publishDeepchatEventMock + publishDeepchatEventMock, + skillHost ) expect(fs.mkdirSync).toHaveBeenCalledWith(expect.any(String), { recursive: true }) presenter.destroy() @@ -494,7 +489,8 @@ describe('SkillService', () => { mockProviderSettings, skillSessionStatePort as any, fakeWatcherService.service, - publishDeepchatEventMock + publishDeepchatEventMock, + skillHost ) expect(fs.mkdirSync).toHaveBeenCalledWith(expect.not.stringContaining('.deepchat-meta'), { @@ -508,17 +504,13 @@ describe('SkillService', () => { it('should repair malformed .deepchat path segments', async () => { ;(mockProviderSettings.getPath as Mock).mockReturnValue('/mock/home.deepchat/skills') - ;(app.getPath as Mock).mockImplementation((name: string) => { - if (name === 'home') return '/mock/home' - if (name === 'temp') return '/mock/temp' - return '/mock/' + name - }) const presenter = new SkillService( mockProviderSettings, skillSessionStatePort as any, fakeWatcherService.service, - publishDeepchatEventMock + publishDeepchatEventMock, + skillHost ) await expect(presenter.getSkillsDir()).resolves.toBe('/mock/home/.deepchat/skills') presenter.destroy() @@ -526,17 +518,13 @@ describe('SkillService', () => { it('should repair stale POSIX default skills paths from another user profile', async () => { ;(mockProviderSettings.getPath as Mock).mockReturnValue('/Users/legacy-user/.deepchat/skills') - ;(app.getPath as Mock).mockImplementation((name: string) => { - if (name === 'home') return '/mock/home' - if (name === 'temp') return '/mock/temp' - return '/mock/' + name - }) const presenter = new SkillService( mockProviderSettings, skillSessionStatePort as any, fakeWatcherService.service, - publishDeepchatEventMock + publishDeepchatEventMock, + skillHost ) await expect(presenter.getSkillsDir()).resolves.toBe('/mock/home/.deepchat/skills') presenter.destroy() @@ -546,17 +534,13 @@ describe('SkillService', () => { ;(mockProviderSettings.getPath as Mock).mockReturnValue( 'C:\\Users\\legacy-user\\.deepchat\\skills\\nested' ) - ;(app.getPath as Mock).mockImplementation((name: string) => { - if (name === 'home') return '/mock/home' - if (name === 'temp') return '/mock/temp' - return '/mock/' + name - }) const presenter = new SkillService( mockProviderSettings, skillSessionStatePort as any, fakeWatcherService.service, - publishDeepchatEventMock + publishDeepchatEventMock, + skillHost ) await expect(presenter.getSkillsDir()).resolves.toBe('/mock/home/.deepchat/skills/nested') presenter.destroy() @@ -571,6 +555,48 @@ describe('SkillService', () => { }) }) + it.each(['resolve', 'reject'] as const)( + 'drains a pending native directory %s before shutdown', + async (outcome) => { + let resolve!: () => void + let reject!: (error: Error) => void + const native = new Promise((complete, fail) => { + resolve = complete + reject = fail + }) + vi.mocked(skillHost.openSkillsDirectory).mockReturnValueOnce(native) + const opening = skillService.openSkillsFolderForAgent('deepchat') + const checked = + outcome === 'reject' + ? expect(opening).rejects.toThrow('native unavailable') + : expect(opening).resolves.toBeUndefined() + await vi.waitFor(() => + expect(skillHost.openSkillsDirectory).toHaveBeenCalledWith(DEFAULT_SKILLS_DIR) + ) + + let stopped = false + const shutdown = skillService.destroy().then(() => { + stopped = true + }) + await Promise.resolve() + expect(stopped).toBe(false) + await expect(skillService.openSkillsFolderForAgent('deepchat')).rejects.toThrow( + 'shutting down' + ) + expect(skillHost.openSkillsDirectory).toHaveBeenCalledOnce() + if (outcome === 'reject') reject(new Error('native unavailable')) + else resolve() + await checked + await shutdown + expect(stopped).toBe(true) + } + ) + + it('rejects an unsafe Agent scope before opening a native directory', async () => { + await expect(skillService.openSkillsFolderForAgent('../escape')).rejects.toThrow() + expect(skillHost.openSkillsDirectory).not.toHaveBeenCalled() + }) + describe('initialize', () => { it('keeps migration authoritative and retries startup after a migration failure', async () => { const error = new Error('Symbolic links are not allowed in Skill snapshots') @@ -1102,7 +1128,8 @@ describe('SkillService', () => { mockProviderSettings, skillSessionStatePort as any, fakeWatcherService.service, - publishDeepchatEventMock + publishDeepchatEventMock, + skillHost ) ;(rehydratedPresenter as any).skillsDir = DEFAULT_SKILLS_DIR ;(rehydratedPresenter as any).sidecarDir = `${DEFAULT_SKILLS_DIR}/.deepchat-meta` @@ -3577,7 +3604,8 @@ describe('SkillService', () => { mockProviderSettings, skillSessionStatePort as any, fakeWatcherService.service, - publishDeepchatEventMock + publishDeepchatEventMock, + skillHost ) ;(rehydratedPresenter as any).skillsDir = DEFAULT_SKILLS_DIR ;(rehydratedPresenter as any).sidecarDir = `${DEFAULT_SKILLS_DIR}/.deepchat-meta` diff --git a/test/main/skill/skillServiceSharedSkills.test.ts b/test/main/skill/skillServiceSharedSkills.test.ts index 3aa3c511e0..0800ce124c 100644 --- a/test/main/skill/skillServiceSharedSkills.test.ts +++ b/test/main/skill/skillServiceSharedSkills.test.ts @@ -1,7 +1,6 @@ import fs from 'node:fs' import os from 'node:os' import path from 'node:path' -import { app } from 'electron' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' import { SkillService, type SkillAgentScopePort } from '@/skill' import type { SkillSettingsPort } from '@/skill/settings' @@ -37,8 +36,6 @@ describe('SkillService shared Skills', () => { let activeSkills: Map let stateWriteFailuresRemaining: number let service: SkillService - let getPathSpy: ReturnType - let getAppPathSpy: ReturnType const watcherService = { watch: vi.fn(async () => ({ close: vi.fn(async () => undefined) })), @@ -100,7 +97,20 @@ describe('SkillService shared Skills', () => { sessions.find((session) => session.id === sessionId)?.projectDir ?? null, listSessions: async () => structuredClone(sessions) } - return new SkillService(settings, sessionState, watcherService, vi.fn(), agentScope) + return new SkillService( + settings, + sessionState, + watcherService, + vi.fn(), + { + homeDirectory: temporaryRoot, + tempDirectory: path.join(temporaryRoot, 'temp'), + userDataDirectory: temporaryRoot, + builtinSkillsDirectories: [path.join(temporaryRoot, 'resources', 'skills')], + openSkillsDirectory: vi.fn(async () => undefined) + }, + agentScope + ) } const migrate = async () => { @@ -116,19 +126,11 @@ describe('SkillService shared Skills', () => { sessions = [] activeSkills = new Map() stateWriteFailuresRemaining = 0 - getPathSpy = vi.spyOn(app, 'getPath').mockImplementation((name: string) => { - if (name === 'home') return temporaryRoot - if (name === 'temp') return path.join(temporaryRoot, 'temp') - return temporaryRoot - }) - getAppPathSpy = vi.spyOn(app, 'getAppPath').mockReturnValue(temporaryRoot) service = createService() }) afterEach(async () => { await service.destroy() - getPathSpy.mockRestore() - getAppPathSpy.mockRestore() fs.rmSync(temporaryRoot, { recursive: true, force: true }) vi.restoreAllMocks() }) diff --git a/test/main/sync/backupConsistency.test.ts b/test/main/sync/backupConsistency.test.ts index a88fd82b0b..a14fb5be56 100644 --- a/test/main/sync/backupConsistency.test.ts +++ b/test/main/sync/backupConsistency.test.ts @@ -23,7 +23,6 @@ Object.assign(fsModule, realFs) ).promises const fs = realFs -const { app } = await import('electron') const { SyncService } = await import('../../../src/main/sync') let userDataDir: string @@ -32,17 +31,12 @@ let dbPath: string let writerDb: Database.Database | null = null let sidecarConnections: Database.Database[] = [] let postCheckpointImages: Buffer[] = [] -let getPathSpy: ReturnType beforeEach(() => { userDataDir = fs.mkdtempSync(path.join(osActual.tmpdir(), 'deepchat-user-')) syncDir = fs.mkdtempSync(path.join(osActual.tmpdir(), 'deepchat-sync-')) dbPath = path.join(userDataDir, 'app_db', 'agent.db') postCheckpointImages = [] - getPathSpy = vi.spyOn(app, 'getPath').mockImplementation((type: string) => { - if (type === 'userData') return userDataDir - return osActual.tmpdir() - }) fs.mkdirSync(path.dirname(dbPath), { recursive: true }) fs.writeFileSync(path.join(userDataDir, 'app-settings.json'), JSON.stringify({ theme: 'dark' })) }) @@ -57,7 +51,6 @@ afterEach(() => { sidecarConnections = [] writerDb?.close() writerDb = null - getPathSpy.mockRestore() fs.rmSync(userDataDir, { recursive: true, force: true }) fs.rmSync(syncDir, { recursive: true, force: true }) }) @@ -115,7 +108,12 @@ function buildService( } } as never, {} as never, - vi.fn() as never + vi.fn() as never, + { + profileDirectory: userDataDir, + temporaryDirectory: osActual.tmpdir(), + openPath: async () => '' + } ) } diff --git a/test/main/sync/peer.test.ts b/test/main/sync/peer.test.ts index 698d4d5793..4cc6d1d142 100644 --- a/test/main/sync/peer.test.ts +++ b/test/main/sync/peer.test.ts @@ -9,7 +9,7 @@ vi.unmock('fs') vi.unmock('node:fs') import { SyncHostService } from '@/sync/host' -import { SyncPeerService } from '@/sync/peer' +import { SyncPeerService, type SyncPeerDeps } from '@/sync/peer' import { createSyncPeerRoutes } from '@/sync/peer/routes' import { SyncHostSnapshotSource } from '@/sync/host/snapshot' import { SYNC_HOST_PREPARE_PATH } from '@shared/contracts/syncHost' @@ -29,18 +29,20 @@ describe('tunnel sync transfer boundary', () => { const key = randomBytes(32) const replicaId = randomUUID() - function createPeer(): SyncPeerService { + function createPeer( + crypto: Partial> = {} + ): SyncPeerService { return new SyncPeerService({ directory: path.join(root, 'peer'), replicaId: () => replicaId, fetch: (input, init) => requestFetch(input, init), - protectToken: (token) => { + protectToken: async (token) => { const iv = randomBytes(12) const cipher = createCipheriv('aes-256-gcm', key, iv) const ciphertext = Buffer.concat([cipher.update(token, 'utf8'), cipher.final()]) return Buffer.concat([iv, cipher.getAuthTag(), ciphertext]).toString('base64') }, - revealToken: (wrapped) => { + revealToken: async (wrapped) => { const data = Buffer.from(wrapped, 'base64') const cipher = createDecipheriv('aes-256-gcm', key, data.subarray(0, 12)) cipher.setAuthTag(data.subarray(12, 28)) @@ -50,7 +52,8 @@ describe('tunnel sync transfer boundary', () => { importSnapshot: async (file) => { imported.push(await readFile(file)) return { success: true, message: 'sync.success.importComplete' } - } + }, + ...crypto }) } @@ -123,6 +126,145 @@ describe('tunnel sync transfer boundary', () => { await rm(root, { recursive: true, force: true }) }) + it('rejects immediate pairing cancellation before requesting native crypto', async () => { + const protectToken = vi.fn(async () => 'opaque') + peer = createPeer({ protectToken }) + const code = host.createPairingCode()! + const pairing = peer.pair({ + hostUrl: 'https://sync.example.test', + hostId: code.hostId, + code: code.code, + deviceName: 'Device' + }) + const rejected = expect(pairing).rejects.toThrow() + await peer.cancel() + await rejected + expect(protectToken).not.toHaveBeenCalled() + expect(host.getPairingCode()?.code).toBe(code.code) + }) + + it.each(['availability', 'token'] as const)( + 'preserves saved pairing when cancelled during %s wrapping', + async (stage) => { + await pair() + const before = await readFile(path.join(root, 'peer', 'pairing.json'), 'utf8') + await peer.stop() + const entered = Promise.withResolvers() + const pending = Promise.withResolvers() + peer = createPeer({ + protectToken: async (value) => { + if (stage === 'availability' || value !== 'availability-check') { + entered.resolve() + return await pending.promise + } + return 'wrapped-check' + } + }) + requests = [] + const code = host.createPairingCode()! + const pairing = peer.pair({ + hostUrl: 'https://sync.example.test', + hostId: code.hostId, + code: code.code, + deviceName: 'Replacement' + }) + const rejected = expect(pairing).rejects.toThrow() + await entered.promise + const stopping = stage === 'token' ? peer.stop() : undefined + if (stage === 'availability') await peer.cancel() + pending.resolve('wrapped-replacement') + await rejected + await stopping + expect(await readFile(path.join(root, 'peer', 'pairing.json'), 'utf8')).toBe(before) + if (stage === 'availability') { + expect(requests).toEqual([]) + expect(host.getPairingCode()?.code).toBe(code.code) + } + } + ) + + it.each(['forget', 'stop', 'pair'] as const)( + 'does not release a pending connection credential after %s', + async (operation) => { + const port = Number(new URL(hostOrigin).port) + await host.setEnabled(true, { port, consent: true, bidirectional: true }) + const code = host.createPairingCode()! + await peer.pair({ + hostUrl: 'https://sync.example.test', + hostId: code.hostId, + code: code.code, + deviceName: 'Device', + bidirectional: true + }) + await peer.stop() + const entered = Promise.withResolvers() + const pending = Promise.withResolvers() + peer = createPeer({ + revealToken: async () => { + entered.resolve() + return await pending.promise + } + }) + const reading = peer.connection() + const rejected = expect(reading).rejects.toThrow('credentialsUnavailable') + await entered.promise + if (operation === 'pair') { + const code = host.createPairingCode()! + await peer.pair({ + hostUrl: 'https://sync.example.test', + hostId: code.hostId, + code: code.code, + deviceName: 'Replacement' + }) + } else await peer[operation]() + pending.resolve('stale-credential') + await rejected + } + ) + + it('does not consume a pairing code when native token protection is unavailable', async () => { + peer = createPeer({ + protectToken: async () => { + throw new Error('sync.error.safeStorageUnavailable') + } + }) + const code = host.createPairingCode()! + await expect( + peer.pair({ + hostUrl: 'https://sync.example.test', + hostId: code.hostId, + code: code.code, + deviceName: 'Device' + }) + ).rejects.toThrow('safeStorageUnavailable') + expect(requests).toEqual([]) + expect(host.getPairingCode()?.code).toBe(code.code) + expect((await peer.getStatus()).paired).toBe(false) + }) + + it('does not authenticate or import after cancelling a pending transfer unwrap', async () => { + await publish() + await pair() + await peer.stop() + const entered = Promise.withResolvers() + const pending = Promise.withResolvers() + peer = createPeer({ + revealToken: async () => { + entered.resolve() + return await pending.promise + } + }) + requests = [] + await peer.pull('increment') + await entered.promise + await peer.cancel() + pending.resolve('cancelled-credential') + await settled() + expect(requests.every((request) => request.path.endsWith('/handshake'))).toBe(true) + expect(imported).toEqual([]) + expect((await peer.getStatus()).phase).toBe('cancelled') + }) + it('rejects non-renderer callers on every peer control route', async () => { const context = { caller: { diff --git a/test/main/sync/settings.test.ts b/test/main/sync/settings.test.ts index 6b7c25d100..fce932efdc 100644 --- a/test/main/sync/settings.test.ts +++ b/test/main/sync/settings.test.ts @@ -2,11 +2,8 @@ import { beforeEach, describe, expect, it, vi } from 'vitest' const publishDeepchatEvent = vi.hoisted(() => vi.fn()) -vi.mock('electron', () => ({ - app: { getPath: vi.fn(() => '/home/test') } -})) - import { SyncSettings } from '@/sync/settings' +import { SecretStore } from '@/config/secretStore' function createSettings(initial: Record = {}) { const values = new Map(Object.entries(initial)) @@ -21,10 +18,28 @@ function createSettings(initial: Record = {}) { describe('SyncSettings', () => { beforeEach(() => vi.clearAllMocks()) + it('uses the supplied home root until an explicit sync folder is selected', () => { + const settings = createSettings() + const service = new SyncSettings( + settings as never, + {} as never, + publishDeepchatEvent, + '/home/test' + ) + expect(service.getFolderPath()).toMatch(/[/\\]home[/\\]test[/\\]DeepchatSync$/) + service.setFolderPath('/selected/sync') + expect(service.getFolderPath()).toBe('/selected/sync') + }) + it('owns local sync settings and publishes their current state', () => { const settings = createSettings({ syncFolderPath: '/sync' }) const secrets = { get: vi.fn(() => ''), isAvailable: vi.fn(() => true) } - const syncSettings = new SyncSettings(settings as never, secrets as never, publishDeepchatEvent) + const syncSettings = new SyncSettings( + settings as never, + secrets as never, + publishDeepchatEvent, + '/home/test' + ) syncSettings.setEnabled(true) @@ -36,24 +51,108 @@ describe('SyncSettings', () => { }) }) - it('restores the previous wrapped secret when writing cloud settings fails', () => { + it('restores the previous wrapped secret when writing cloud settings fails', async () => { const settings = createSettings() settings.set.mockImplementationOnce(() => { throw new Error('write failed') }) const secrets = { + captureOperation: () => () => {}, getWrapped: vi.fn(() => 'old-wrapped'), - wrap: vi.fn(() => 'new-wrapped'), + wrap: vi.fn(async () => 'new-wrapped'), setWrapped: vi.fn(), restoreWrapped: vi.fn(), get: vi.fn(() => 'secret'), isAvailable: vi.fn(() => true) } - const syncSettings = new SyncSettings(settings as never, secrets as never, publishDeepchatEvent) + const syncSettings = new SyncSettings( + settings as never, + secrets as never, + publishDeepchatEvent, + '/home/test' + ) - expect(() => syncSettings.setCloudConfig({ secretAccessKey: 'new-secret' })).toThrow( + await expect(syncSettings.setCloudConfig({ secretAccessKey: 'new-secret' })).rejects.toThrow( 'write failed' ) expect(secrets.restoreWrapped).toHaveBeenCalledWith('cloudSyncSecret', 'old-wrapped') }) + + it('serializes cloud updates across native encryption without losing unrelated fields', async () => { + const settings = createSettings() + const pending = Promise.withResolvers() + const encrypt = vi.fn(() => pending.promise) + const secrets = new SecretStore(settings as never, { + isAvailable: async () => true, + encrypt, + decrypt: async (wrapped) => wrapped.slice('wrapped:'.length) + }) + const service = new SyncSettings(settings as never, secrets, publishDeepchatEvent, '/home/test') + const first = service.setCloudConfig({ + endpoint: 'https://cloud.example', + accessKeyId: 'access', + secretAccessKey: 'key' + }) + const second = service.setCloudConfig({ bucket: 'backups' }) + await vi.waitFor(() => expect(encrypt).toHaveBeenCalledOnce()) + expect(settings.values.size).toBe(0) + pending.resolve('wrapped:key') + await first + expect(await second).toMatchObject({ + endpoint: 'https://cloud.example', + bucket: 'backups', + hasSecret: true + }) + expect(await service.getResolvedCloudConfig()).toMatchObject({ + endpoint: 'https://cloud.example', + bucket: 'backups', + accessKeyId: 'access', + secretAccessKey: 'key' + }) + expect(settings.values.get('cloudSyncSecret')).toBe('wrapped:key') + }) + + it('fences both pending and queued cloud writes when maintenance changes the profile', async () => { + const settings = createSettings() + const pending = Promise.withResolvers() + const encrypt = vi.fn(() => pending.promise) + const secrets = new SecretStore(settings as never, { + isAvailable: async () => true, + encrypt, + decrypt: async () => '' + }) + const service = new SyncSettings(settings as never, secrets, publishDeepchatEvent, '/home/test') + const first = expect(service.setCloudConfig({ secretAccessKey: 'key' })).rejects.toThrow( + 'interrupted' + ) + const second = expect(service.setCloudConfig({ bucket: 'stale' })).rejects.toThrow( + 'interrupted' + ) + await vi.waitFor(() => expect(encrypt).toHaveBeenCalledOnce()) + secrets.pause() + secrets.resume() + pending.resolve('wrapped:key') + await Promise.all([first, second]) + expect(settings.values.size).toBe(0) + expect(await service.setCloudConfig({ bucket: 'current' })).toMatchObject({ bucket: 'current' }) + }) + + it('rechecks the owner immediately before publishing an already wrapped secret', async () => { + const settings = createSettings() + const secrets = new SecretStore(settings as never, { + isAvailable: async () => true, + encrypt: async () => 'wrapped:key', + decrypt: async () => '' + }) + const wrap = secrets.wrap.bind(secrets) + vi.spyOn(secrets, 'wrap').mockImplementation(async (value) => { + const wrapped = await wrap(value) + secrets.pause() + secrets.resume() + return wrapped + }) + const service = new SyncSettings(settings as never, secrets, publishDeepchatEvent, '/home/test') + await expect(service.setCloudConfig({ secretAccessKey: 'key' })).rejects.toThrow('interrupted') + expect(settings.values.size).toBe(0) + }) }) diff --git a/test/main/sync/syncService.test.ts b/test/main/sync/syncService.test.ts index 6a55f127db..27371fd781 100644 --- a/test/main/sync/syncService.test.ts +++ b/test/main/sync/syncService.test.ts @@ -313,7 +313,6 @@ Object.assign(fsMock, realFs) const fs = realFs const path = await vi.importActual('path') -const { app } = await import('electron') const { SyncService } = await import('../../../src/main/sync') const { ImportMode } = await import('../../../src/main/sync') const publishDeepchatEvent = vi.fn() @@ -348,7 +347,7 @@ describe('SyncService backup import', () => { importLegacyChatDb: ReturnType } let dbPragma: ReturnType - let getPathSpy: ReturnType + let openPath: ReturnType beforeEach(() => { configImportMocks.importLegacyConfig.mockClear() @@ -364,15 +363,7 @@ describe('SyncService backup import', () => { tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'deepchat-temp-')) syncDir = fs.mkdtempSync(path.join(os.tmpdir(), 'deepchat-sync-')) - getPathSpy = vi.spyOn(app, 'getPath').mockImplementation((type: string) => { - if (type === 'userData') { - return userDataDir - } - if (type === 'temp') { - return tempDir - } - return os.tmpdir() - }) + openPath = vi.fn(async () => '') dbPragma = vi.fn() sqlitePresenter = { @@ -435,7 +426,8 @@ describe('SyncService backup import', () => { return { listProviders: vi.fn(() => []) } } } as never, - publishDeepchatEvent + publishDeepchatEvent, + { profileDirectory: userDataDir, temporaryDirectory: tempDir, openPath } ) }) @@ -445,12 +437,34 @@ describe('SyncService backup import', () => { ) => service.importFromSync(backupFileName, importMode, importDatabase) afterEach(() => { - getPathSpy.mockRestore() removeDir(syncDir) removeDir(tempDir) removeDir(userDataDir) }) + it('waits for the selected native folder operation before acknowledging success', async () => { + const native = Promise.withResolvers() + openPath.mockReturnValueOnce(native.promise) + removeDir(syncDir) + let completed = false + const opening = service.openSyncFolder().then(() => { + completed = true + }) + await vi.waitFor(() => expect(openPath).toHaveBeenCalledWith(syncDir)) + expect(fs.existsSync(syncDir)).toBe(true) + expect(completed).toBe(false) + native.resolve('') + await opening + expect(completed).toBe(true) + }) + + it('propagates native folder launch failures', async () => { + openPath.mockResolvedValueOnce('folder permission denied') + await expect(service.openSyncFolder()).rejects.toThrow('folder permission denied') + openPath.mockRejectedValueOnce(new Error('native host unavailable')) + await expect(service.openSyncFolder()).rejects.toThrow('native host unavailable') + }) + it('backs up migrated config through agent.db and keeps app-settings lightweight', async () => { createLocalState(userDataDir, { conversations: [{ id: 'conv-1', title: 'Local conversation' }], diff --git a/test/main/sync/tunnel.test.ts b/test/main/sync/tunnel.test.ts index a5acb236c2..bb216481aa 100644 --- a/test/main/sync/tunnel.test.ts +++ b/test/main/sync/tunnel.test.ts @@ -1,6 +1,7 @@ import { mkdtemp, mkdir, writeFile, readFile, rm } from 'node:fs/promises' import path from 'node:path' import os from 'node:os' +import { createServer } from 'node:net' import { afterEach, describe, expect, it, vi } from 'vitest' vi.unmock('fs') @@ -12,7 +13,9 @@ import { SyncHostService } from '@/sync/host' const roots: string[] = [] const tunnels: SyncTunnel[] = [] +const hosts: SyncHostService[] = [] afterEach(async () => { + for (const host of hosts.splice(0)) await host.stop() for (const tunnel of tunnels.splice(0)) await tunnel.stop() for (const root of roots.splice(0)) await rm(root, { recursive: true, force: true }) }) @@ -22,7 +25,130 @@ async function profile() { return root } +async function availablePort() { + const probe = createServer() + await new Promise((resolve) => probe.listen(0, '127.0.0.1', resolve)) + const port = (probe.address() as { port: number }).port + await new Promise((resolve, reject) => + probe.close((error) => (error ? reject(error) : resolve())) + ) + return port +} + describe('sync connector lifecycle', () => { + it.each(['protect', 'reveal'] as const)( + 'does not launch or enable after stop supersedes a pending %s', + async (operation) => { + const root = await profile() + const entered = Promise.withResolvers() + const pending = Promise.withResolvers() + const resolveBinary = vi.fn(() => '/unreachable-connector') + const blocked = async () => { + entered.resolve() + return await pending.promise + } + const host = new SyncHostService({ + getUserDataPath: () => root, + getFolderPath: () => root, + getAppVersion: () => 'test', + createBackup: async () => null, + resolveCloudflared: resolveBinary, + protectToken: operation === 'protect' ? blocked : async () => 'opaque-token', + revealToken: operation === 'reveal' ? blocked : async () => 'fixture-token' + }) + hosts.push(host) + const enabling = host.setEnabled(true, { + port: await availablePort(), + consent: true, + tunnel: { mode: 'named', publicUrl: 'https://sync.example.test', token: 'fixture-token' } + }) + const rejected = expect(enabling).rejects.toThrow('busy') + await entered.promise + const stopping = host.stop() + pending.resolve('opaque-result') + await rejected + await stopping + expect(resolveBinary).not.toHaveBeenCalled() + expect(await host.getStatus()).toMatchObject({ enabled: false, running: false }) + } + ) + + it('does not persist a token when native protection fails', async () => { + const root = await profile() + const host = new SyncHostService({ + getUserDataPath: () => root, + getFolderPath: () => root, + getAppVersion: () => 'test', + createBackup: async () => null, + protectToken: async () => { + throw new Error('sync.error.safeStorageUnavailable') + } + }) + hosts.push(host) + await expect( + host.setEnabled(true, { + port: await availablePort(), + consent: true, + tunnel: { mode: 'named', publicUrl: 'https://sync.example.test', token: 'fixture-token' } + }) + ).rejects.toThrow('safeStorageUnavailable') + expect(await host.getStatus()).toMatchObject({ enabled: false, running: false }) + const state = await readFile(path.join(root, 'sync-host', 'host-state.json'), 'utf8') + expect(JSON.parse(state).wrappedTunnelToken).toBeNull() + expect(state).not.toContain('fixture-token') + }) + + it.skipIf(process.platform === 'win32')( + 'starts and restarts a named connector through async token ports', + async () => { + const root = await profile() + const executable = path.join(root, 'cloudflared') + const observedPath = path.join(root, 'observed.json') + await writeFile( + executable, + `#!${process.execPath}\n` + + `require('fs').writeFileSync(${JSON.stringify(observedPath)}, JSON.stringify({pid:process.pid,token:process.env.TUNNEL_TOKEN}));\n` + + `console.error('Registered tunnel connection connIndex=0'); setInterval(() => {}, 1000)\n`, + { mode: 0o755 } + ) + const revealToken = vi.fn(async (wrapped: string) => + Buffer.from(wrapped, 'base64').toString('utf8') + ) + const host = new SyncHostService({ + getUserDataPath: () => root, + getFolderPath: () => root, + getAppVersion: () => 'test', + createBackup: async () => null, + resolveCloudflared: () => executable, + protectToken: async (token) => Buffer.from(token).toString('base64'), + revealToken + }) + hosts.push(host) + await host.setEnabled(true, { + port: await availablePort(), + consent: true, + tunnel: { + mode: 'named', + publicUrl: 'https://sync.example.test', + token: 'synthetic-host-secret' + } + }) + await vi.waitFor(async () => expect((await host.getStatus()).tunnel.phase).toBe('connected')) + const observed = JSON.parse(await readFile(observedPath, 'utf8')) + expect(observed.token).toBe('synthetic-host-secret') + const statePath = path.join(root, 'sync-host', 'host-state.json') + const before = JSON.parse(await readFile(statePath, 'utf8')) + expect(JSON.stringify(before)).not.toContain('synthetic-host-secret') + await host.stop() + expect(() => process.kill(observed.pid, 0)).toThrow() + await host.startIfEnabled() + await vi.waitFor(async () => expect((await host.getStatus()).tunnel.phase).toBe('connected')) + expect(revealToken).toHaveBeenCalledTimes(2) + expect(JSON.parse(await readFile(statePath, 'utf8')).wrappedTunnelToken).toBe( + before.wrappedTunnelToken + ) + } + ) it.skipIf(process.platform === 'win32')( 'keeps the token out of arguments and launch records, and stops its child', async () => { diff --git a/test/main/tool/agentTools/agentBashHandler.test.ts b/test/main/tool/agentTools/agentBashHandler.test.ts index 81c2bb51f9..2a48533725 100644 --- a/test/main/tool/agentTools/agentBashHandler.test.ts +++ b/test/main/tool/agentTools/agentBashHandler.test.ts @@ -3,7 +3,7 @@ import { spawn } from 'child_process' import fs from 'fs' import path from 'path' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' -import { backgroundExecSessionManager } from '@/agent/shared/process/backgroundExecSessionManager' +import { createBackgroundExecFixture } from './agentToolDependencies' import * as shellEnvironment from '@/agent/shared/process/shellEnvHelper' import { AgentBashHandler, @@ -55,10 +55,13 @@ function createProgrammaticCommandEnvironment(order?: string[]): AgentCommandEnv } describe('AgentBashHandler', () => { + let backgroundExecSessionManager: ReturnType + const workspaceRoot = process.cwd() const externalRoot = path.dirname(workspaceRoot) beforeEach(() => { + backgroundExecSessionManager = createBackgroundExecFixture() vi.mocked(fs.existsSync).mockReturnValue(true) vi.mocked(fs.statSync).mockReturnValue({ isDirectory: () => true } as fs.Stats) }) @@ -72,7 +75,11 @@ describe('AgentBashHandler', () => { PATH: '/shell/bin', NPM_CONFIG_REGISTRY: 'https://registry.example.test' }) - const handler = new AgentBashHandler([workspaceRoot], createPermissionService()) + const handler = new AgentBashHandler( + [workspaceRoot], + createPermissionService(), + backgroundExecSessionManager + ) const command = 'find . -type f -name "*.ts" -o -name "*.vue" | grep "^./src"' const runShellProcess = vi .spyOn(handler as never, 'runShellProcess' as never) @@ -113,7 +120,12 @@ describe('AgentBashHandler', () => { prependPath: ['/bundled/cli'] })) } - const handler = new AgentBashHandler([workspaceRoot], permissionService, commandEnvironment) + const handler = new AgentBashHandler( + [workspaceRoot], + permissionService, + backgroundExecSessionManager, + commandEnvironment + ) const prepareCommand = vi.spyOn(handler as never, 'prepareCommand' as never).mockResolvedValue({ command: 'deepchat model invoke --prompt hello', env: { DEEPCHAT_CLI_AGENT_TOKEN: 'scoped-token' } @@ -167,6 +179,7 @@ describe('AgentBashHandler', () => { const handler = new AgentBashHandler( [workspaceRoot], createPermissionService(), + backgroundExecSessionManager, commandEnvironment ) const prepareCommand = vi.spyOn(handler as never, 'prepareCommand' as never).mockResolvedValue({ @@ -223,6 +236,7 @@ describe('AgentBashHandler', () => { const handler = new AgentBashHandler( [workspaceRoot], createPermissionService(), + backgroundExecSessionManager, commandEnvironment ) const command = 'deepchat tool search --query calendar --limit 4' @@ -277,6 +291,7 @@ describe('AgentBashHandler', () => { const handler = new AgentBashHandler( [workspaceRoot], createPermissionService(), + backgroundExecSessionManager, commandEnvironment ) vi.spyOn(handler as never, 'prepareCommand' as never).mockResolvedValue({ @@ -333,7 +348,11 @@ describe('AgentBashHandler', () => { options: { stdin: '{}', programmatic: true } } ])('rejects owned stdin for $name before shell execution', async ({ args, options }) => { - const handler = new AgentBashHandler([workspaceRoot], createPermissionService()) + const handler = new AgentBashHandler( + [workspaceRoot], + createPermissionService(), + backgroundExecSessionManager + ) const prepareCommand = vi.spyOn(handler as never, 'prepareCommand' as never) await expect( @@ -352,6 +371,7 @@ describe('AgentBashHandler', () => { const handler = new AgentBashHandler( [workspaceRoot], new CommandPermissionService(), + backgroundExecSessionManager, commandEnvironment ) @@ -370,7 +390,11 @@ describe('AgentBashHandler', () => { it('executes approved commands in the background', async () => { const originalCommand = 'find . -type f -name "*.ts" -o -name "*.vue"' const order: string[] = [] - const handler = new AgentBashHandler([workspaceRoot], createPermissionService()) + const handler = new AgentBashHandler( + [workspaceRoot], + createPermissionService(), + backgroundExecSessionManager + ) vi.spyOn(handler as never, 'prepareCommand' as never).mockResolvedValue({ command: originalCommand, @@ -421,7 +445,11 @@ describe('AgentBashHandler', () => { it('allows an external cwd when explicitly enabled', async () => { const externalCwd = externalRoot - const handler = new AgentBashHandler([workspaceRoot], createPermissionService()) + const handler = new AgentBashHandler( + [workspaceRoot], + createPermissionService(), + backgroundExecSessionManager + ) vi.spyOn(handler as never, 'prepareCommand' as never).mockResolvedValue({ command: 'pwd', @@ -460,7 +488,11 @@ describe('AgentBashHandler', () => { it('rejects an external cwd when external access is not enabled', async () => { const externalCwd = externalRoot - const handler = new AgentBashHandler([workspaceRoot], createPermissionService()) + const handler = new AgentBashHandler( + [workspaceRoot], + createPermissionService(), + backgroundExecSessionManager + ) const runShellProcess = vi.spyOn(handler as never, 'runShellProcess' as never) await expect( @@ -479,7 +511,11 @@ describe('AgentBashHandler', () => { it('does not commit dispatch when the resolved cwd is unusable', async () => { vi.mocked(fs.existsSync).mockReturnValue(false) - const handler = new AgentBashHandler([workspaceRoot], createPermissionService()) + const handler = new AgentBashHandler( + [workspaceRoot], + createPermissionService(), + backgroundExecSessionManager + ) const beforeExecute = vi.fn() const runShellProcess = vi.spyOn(handler as never, 'runShellProcess' as never) @@ -498,7 +534,11 @@ describe('AgentBashHandler', () => { }) it('commits the prepared command before starting the shell process', async () => { - const handler = new AgentBashHandler([workspaceRoot], createPermissionService()) + const handler = new AgentBashHandler( + [workspaceRoot], + createPermissionService(), + backgroundExecSessionManager + ) const order: string[] = [] vi.spyOn(handler as never, 'prepareCommand' as never).mockResolvedValue({ command: 'find . -name "*.ts"', @@ -528,7 +568,11 @@ describe('AgentBashHandler', () => { }) it('returns a running session when foreground exec exceeds yieldMs', async () => { - const handler = new AgentBashHandler([workspaceRoot], createPermissionService()) + const handler = new AgentBashHandler( + [workspaceRoot], + createPermissionService(), + backgroundExecSessionManager + ) vi.spyOn(handler as never, 'prepareCommand' as never).mockResolvedValue({ command: 'bun run dev caps gpt-4o', @@ -576,6 +620,7 @@ describe('AgentBashHandler', () => { const handler = new AgentBashHandler( [workspaceRoot], createPermissionService(), + backgroundExecSessionManager, commandEnvironment ) vi.spyOn(handler as never, 'prepareCommand' as never).mockResolvedValue({ @@ -631,6 +676,7 @@ describe('AgentBashHandler', () => { const handler = new AgentBashHandler( [workspaceRoot], createPermissionService(), + backgroundExecSessionManager, commandEnvironment ) vi.spyOn(handler as never, 'prepareCommand' as never).mockResolvedValue({ @@ -670,6 +716,7 @@ describe('AgentBashHandler', () => { const handler = new AgentBashHandler( [workspaceRoot], createPermissionService(), + backgroundExecSessionManager, commandEnvironment ) vi.spyOn(handler as never, 'prepareCommand' as never).mockResolvedValue({ @@ -733,6 +780,7 @@ describe('AgentBashHandler', () => { const handler = new AgentBashHandler( [workspaceRoot], createPermissionService(), + backgroundExecSessionManager, createProgrammaticCommandEnvironment() ) vi.spyOn(handler as never, 'prepareCommand' as never).mockResolvedValue({ @@ -766,7 +814,11 @@ describe('AgentBashHandler', () => { }) it('cleans up completed foreground sessions that finish inside the yield window', async () => { - const handler = new AgentBashHandler([workspaceRoot], createPermissionService()) + const handler = new AgentBashHandler( + [workspaceRoot], + createPermissionService(), + backgroundExecSessionManager + ) vi.spyOn(handler as never, 'prepareCommand' as never).mockResolvedValue({ command: 'pnpm test --help', @@ -808,7 +860,11 @@ describe('AgentBashHandler', () => { }) it('keeps completed foreground sessions when output was offloaded', async () => { - const handler = new AgentBashHandler([workspaceRoot], createPermissionService()) + const handler = new AgentBashHandler( + [workspaceRoot], + createPermissionService(), + backgroundExecSessionManager + ) vi.spyOn(handler as never, 'prepareCommand' as never).mockResolvedValue({ command: 'pnpm test --reporter=json', @@ -871,7 +927,11 @@ describe('AgentBashHandler', () => { pid = 123 } - const handler = new AgentBashHandler([workspaceRoot], createPermissionService()) + const handler = new AgentBashHandler( + [workspaceRoot], + createPermissionService(), + backgroundExecSessionManager + ) const child = new MockChild() vi.mocked(spawn).mockReturnValue(child as never) vi.spyOn(handler as never, 'createOutputFilePath' as never).mockReturnValue('/tmp/exec.log') diff --git a/test/main/tool/agentTools/agentBashHandlerEncoding.test.ts b/test/main/tool/agentTools/agentBashHandlerEncoding.test.ts index 495f05bdc1..a8aa4a8b4b 100644 --- a/test/main/tool/agentTools/agentBashHandlerEncoding.test.ts +++ b/test/main/tool/agentTools/agentBashHandlerEncoding.test.ts @@ -1,3 +1,4 @@ +import { createBackgroundExecFixture } from './agentToolDependencies' import { EventEmitter } from 'events' import { spawn } from 'child_process' import fs from 'fs' @@ -71,7 +72,11 @@ describe('AgentBashHandler output encoding', () => { isDirectory: () => true } as fs.Stats) - const handler = new AgentBashHandler(['/workspace'], new CommandPermissionService()) + const handler = new AgentBashHandler( + ['/workspace'], + new CommandPermissionService(), + createBackgroundExecFixture() + ) const resultPromise = ( handler as unknown as { runDetachedShellProcess: ( diff --git a/test/main/tool/agentTools/agentImageGenerationTool.test.ts b/test/main/tool/agentTools/agentImageGenerationTool.test.ts index 8f991c3650..fc17660d88 100644 --- a/test/main/tool/agentTools/agentImageGenerationTool.test.ts +++ b/test/main/tool/agentTools/agentImageGenerationTool.test.ts @@ -1,22 +1,10 @@ import { beforeEach, describe, expect, it, vi } from 'vitest' -import os from 'os' import { AgentToolManager } from '@/tool/agentTools/agentToolManager' import { IMAGE_GENERATE_TOOL_NAME } from '@/tool/agentTools/agentImageGenerationTool' import { ApiEndpointType, ModelType } from '@shared/model' import { createAgentToolDependencies } from './agentToolDependencies' import { CommandPermissionService } from '@/tool/permission' -vi.mock('electron', () => ({ - app: { - getPath: () => os.tmpdir() - }, - nativeImage: { - createFromPath: () => ({ - getSize: () => ({ width: 128, height: 96 }) - }) - } -})) - describe('Agent image generation tool', () => { let providerSettings: any let generateImageStandalone: ReturnType diff --git a/test/main/tool/agentTools/agentTapeTools.test.ts b/test/main/tool/agentTools/agentTapeTools.test.ts index d55cbe9515..a00b680db9 100644 --- a/test/main/tool/agentTools/agentTapeTools.test.ts +++ b/test/main/tool/agentTools/agentTapeTools.test.ts @@ -5,17 +5,6 @@ import { createAgentToolDependencies } from './agentToolDependencies' import { CommandPermissionService } from '@/tool/permission' import { resolveDeepChatSubagentCapability } from '@shared/lib/deepchatSubagents' -vi.mock('electron', () => ({ - app: { - getPath: () => '/tmp/deepchat-test' - }, - nativeImage: { - createFromPath: () => ({ - getSize: () => ({ width: 1, height: 1 }) - }) - } -})) - const buildRuntimePort = (overrides: Record = {}) => createAgentToolDependencies({ resolveConversationWorkdir: vi.fn().mockResolvedValue('/workspace'), diff --git a/test/main/tool/agentTools/agentToolDependencies.ts b/test/main/tool/agentTools/agentToolDependencies.ts index 3d5a751ae3..9bf2eba9c2 100644 --- a/test/main/tool/agentTools/agentToolDependencies.ts +++ b/test/main/tool/agentTools/agentToolDependencies.ts @@ -1,10 +1,19 @@ import { vi } from 'vitest' +import os from 'node:os' +import path from 'node:path' import type { AgentToolDependencies } from '@/tool/runtimePorts' -import { AgentInvocationAdmission } from '@/agent/invocationAdmission' +import { AgentInvocationAdmission } from '../../../../src/harness/admission' +import { BackgroundExecService } from '@/agent/shared/process/backgroundExecSessionManager' + +export const createBackgroundExecFixture = () => + new BackgroundExecService(async () => { + throw new Error('Background helper launch must be supplied by the test') + }) export const createAgentToolDependencies = ( overrides: Record = {} ): AgentToolDependencies => ({ + backgroundExec: overrides.backgroundExec ?? createBackgroundExecFixture(), agentInvocationAdmission: overrides.agentInvocationAdmission ?? new AgentInvocationAdmission(), sessions: { resolveConversationWorkdir: @@ -108,10 +117,14 @@ export const createAgentToolDependencies = ( generateCompletionStandalone: vi.fn(), generateImageStandalone: vi.fn() } as any), - desktop: overrides.desktop ?? { + desktop: { + tempDirectory: path.join(os.tmpdir(), 'deepchat-electron-temp'), + profileTempDirectory: path.join(os.tmpdir(), 'deepchat-electron-user-data', 'temp'), + readImageSize: overrides.readImageSize ?? vi.fn(async () => ({ width: 128, height: 96 })), createSettingsWindow: vi.fn(), sendToWindow: vi.fn().mockReturnValue(true), - sendSettingsNavigation: vi.fn().mockReturnValue(true) + sendSettingsNavigation: vi.fn().mockReturnValue(true), + ...overrides.desktop }, permissions: { getApprovedFilePaths: overrides.getApprovedFilePaths ?? vi.fn().mockReturnValue([]), diff --git a/test/main/tool/agentTools/agentToolManagerFffSearch.test.ts b/test/main/tool/agentTools/agentToolManagerFffSearch.test.ts index 4105abb3c7..7756a7d613 100644 --- a/test/main/tool/agentTools/agentToolManagerFffSearch.test.ts +++ b/test/main/tool/agentTools/agentToolManagerFffSearch.test.ts @@ -33,19 +33,6 @@ vi.mock('fs', async (importOriginal) => { } }) -vi.mock('electron', () => ({ - app: { - getAppPath: () => '/mock/app', - getPath: () => '/tmp', - isPackaged: false - }, - nativeImage: { - createFromPath: vi.fn(() => ({ - getSize: () => ({ width: 0, height: 0 }) - })) - } -})) - function buildRuntimePort() { return createAgentToolDependencies({ resolveConversationWorkdir: vi.fn().mockResolvedValue(null), diff --git a/test/main/tool/agentTools/agentToolManagerRead.test.ts b/test/main/tool/agentTools/agentToolManagerRead.test.ts index 6671ff22f6..ca4c03cbb9 100644 --- a/test/main/tool/agentTools/agentToolManagerRead.test.ts +++ b/test/main/tool/agentTools/agentToolManagerRead.test.ts @@ -6,7 +6,7 @@ import path from 'path' import { AgentToolManager } from '@/tool/agentTools/agentToolManager' import { POSIX_COMMAND_SHELL } from '../../../helpers/commandShell' import { AgentBashHandler } from '@/tool/agentTools/agentBashHandler' -import { backgroundExecSessionManager } from '@/agent/shared/process/backgroundExecSessionManager' +import { createBackgroundExecFixture } from './agentToolDependencies' import * as sessionVisionResolverModule from '@/agent/vision/sessionVisionResolver' import { createAgentToolDependencies } from './agentToolDependencies' import { CommandPermissionService } from '@/tool/permission' @@ -22,29 +22,9 @@ vi.mock('fs', async (importOriginal) => { } }) -vi.mock('electron', () => ({ - app: { - getPath: (name: string) => { - if (name === 'temp') { - return path.join(os.tmpdir(), 'deepchat-electron-temp') - } - if (name === 'home') { - return path.join(os.tmpdir(), 'deepchat-electron-home') - } - if (name === 'userData') { - return path.join(os.tmpdir(), 'deepchat-electron-user-data') - } - return os.tmpdir() - } - }, - nativeImage: { - createFromPath: () => ({ - getSize: () => ({ width: 128, height: 96 }) - }) - } -})) - describe('AgentToolManager read routing', () => { + let backgroundExecSessionManager: ReturnType + let workspaceDir: string let providerSettings: any let manager: AgentToolManager @@ -60,10 +40,13 @@ describe('AgentToolManager read routing', () => { let resolveConversationWorkdir: ReturnType let resolveConversationSessionInfo: ReturnType let settingsGet: ReturnType + let readImageSize: ReturnType + let cacheImage: ReturnType let callToolWithoutCommandShell: AgentToolManager['callTool'] let preCheckWithoutCommandShell: AgentToolManager['preCheckToolPermission'] beforeEach(async () => { + backgroundExecSessionManager = createBackgroundExecFixture() vi.clearAllMocks() workspaceDir = await fs.mkdtemp(path.join(os.tmpdir(), 'deepchat-read-')) fileService = { @@ -92,6 +75,8 @@ describe('AgentToolManager read routing', () => { resolveDeepChatAgentConfig: vi.fn().mockResolvedValue({}) } settingsGet = vi.fn() + readImageSize = vi.fn(async () => ({ width: 128, height: 96 })) + cacheImage = vi.fn(async (data: string) => data) manager = new AgentToolManager({ skillSettings: { isEnabled: () => false } as any, settings: { get: settingsGet }, @@ -100,6 +85,9 @@ describe('AgentToolManager read routing', () => { providerSettings, agentSettings: providerSettings, dependencies: createAgentToolDependencies({ + backgroundExec: backgroundExecSessionManager, + readImageSize, + cacheImage, resolveConversationWorkdir, resolveConversationSessionInfo, skillService: { @@ -1280,6 +1268,105 @@ describe('AgentToolManager read routing', () => { ) }) + it('uses only supplied runtime roots and preserves the default workspace', async () => { + const base = await fs.mkdtemp(path.join(os.tmpdir(), 'deepchat-host-roots-')) + const temporary = path.join(base, 'native-temp') + const profileTemporary = path.join(base, 'profile-temp') + const defaultWorkspace = path.join(temporary, 'deepchat-agent', 'workspaces') + try { + await fs.mkdir(defaultWorkspace, { recursive: true }) + await fs.mkdir(profileTemporary, { recursive: true }) + await fs.writeFile(path.join(defaultWorkspace, 'workspace.txt'), 'DEFAULT_WORKSPACE') + await fs.writeFile(path.join(profileTemporary, 'profile.txt'), 'PROFILE_TEMPORARY') + await fs.writeFile(path.join(base, 'denied.txt'), 'UNRELATED_FILE') + fileService.getMimeType.mockResolvedValue('text/plain') + const build = (tempDirectory = temporary) => + new AgentToolManager({ + agentWorkspacePath: null, + settings: { get: settingsGet }, + providerSettings, + agentSettings: providerSettings, + skillSettings: { isEnabled: () => false } as any, + desktopSettings: { applyDisplayChange: vi.fn() }, + commandPermissionHandler: new CommandPermissionService(), + dependencies: createAgentToolDependencies({ + backgroundExec: backgroundExecSessionManager, + fileService, + resolveConversationWorkdir: vi.fn(async () => null), + skillService: { + getSkillsDir: vi.fn(async () => path.join(base, 'skills')), + getActiveSkills: vi.fn(async () => []), + getActiveSkillsAllowedTools: vi.fn(async () => []) + }, + desktop: { tempDirectory, profileTempDirectory: profileTemporary } + }) + }) + const isolated = build() + isolated.syncContext({ chatMode: 'agent', agentWorkspacePath: null }) + const options = { commandShell: POSIX_COMMAND_SHELL, allowExternalFileAccess: false } + await expect( + isolated.callTool('read', { path: 'workspace.txt' }, 'host-session', options) + ).resolves.toMatchObject({ content: expect.stringContaining('DEFAULT_WORKSPACE') }) + await expect( + isolated.callTool( + 'read', + { path: path.join(profileTemporary, 'profile.txt') }, + 'host-session', + options + ) + ).resolves.toMatchObject({ content: expect.stringContaining('PROFILE_TEMPORARY') }) + await expect( + isolated.callTool('read', { path: path.join(base, 'denied.txt') }, 'host-session', options) + ).resolves.toMatchObject({ + rawData: { + requiresPermission: true, + permissionRequest: { permissionType: 'read' } + } + }) + expect(() => build('relative')).toThrow('host directories must be absolute') + } finally { + await fs.rm(base, { recursive: true, force: true }) + } + }) + + it('retains unknown metadata when the supplied image probe fails', async () => { + const filePath = path.join(workspaceDir, 'image-probe-error.png') + await fs.writeFile(filePath, Buffer.from([0, 1, 2, 3])) + fileService.getMimeType.mockResolvedValue('image/png') + readImageSize.mockRejectedValue(new Error('Image decoder unavailable')) + providerSettings.resolveDeepChatAgentConfig.mockResolvedValue({}) + const result = await manager.callTool('read', { path: filePath }, 'conv1') + expect(result.content).toContain('resolution: unknown') + expect(providerRuntime.generateCompletionStandalone).not.toHaveBeenCalled() + }) + + it('fences a late image size after cancellation before cache or Provider work', async () => { + const filePath = path.join(workspaceDir, 'image-probe-abort.png') + await fs.writeFile(filePath, Buffer.from([0, 1, 2, 3])) + fileService.getMimeType.mockResolvedValue('image/png') + const resolvedPath = await fs.realpath(filePath) + let finish!: (size: { width: number; height: number }) => void + readImageSize.mockImplementation( + () => + new Promise((resolve) => { + finish = resolve + }) + ) + const controller = new AbortController() + const execution = manager.callTool('read', { path: filePath }, 'conv1', { + signal: controller.signal + }) + const rejected = expect(execution).rejects.toMatchObject({ name: 'AbortError' }) + await vi.waitFor(() => + expect(readImageSize).toHaveBeenCalledWith(resolvedPath, controller.signal) + ) + controller.abort() + finish({ width: 128, height: 96 }) + await rejected + expect(cacheImage).not.toHaveBeenCalled() + expect(providerRuntime.generateCompletionStandalone).not.toHaveBeenCalled() + }) + it('falls back to image metadata when neither the current model nor the agent can analyze images', async () => { const filePath = path.join(workspaceDir, 'image-no-vision.png') await fs.writeFile(filePath, Buffer.from([9, 8, 7, 6])) diff --git a/test/main/tool/agentTools/agentToolManagerSettings.test.ts b/test/main/tool/agentTools/agentToolManagerSettings.test.ts index 889c4ac8f0..55120371f4 100644 --- a/test/main/tool/agentTools/agentToolManagerSettings.test.ts +++ b/test/main/tool/agentTools/agentToolManagerSettings.test.ts @@ -45,13 +45,6 @@ function makeSkillResolution(name: string, content: string, agentId = 'agent-a') } } -vi.mock('electron', () => ({ - app: { - getPath: () => '/tmp', - getAppPath: () => '/mock/app' - } -})) - describe('AgentToolManager DeepChat settings tool gating', () => { const providerSettings = {} as any const skillService = { @@ -85,8 +78,13 @@ describe('AgentToolManager DeepChat settings tool gating', () => { settings: { get: vi.fn() }, commandPermissionHandler: new CommandPermissionService(), desktopSettings: { - getCopyWithCotEnabled: vi.fn(() => true), - setCopyWithCotEnabled: vi.fn() + applyDisplayChange: vi.fn(async (change) => ({ + ok: true, + id: change.id, + value: change.value, + previousValue: true, + appliedAt: 1 + })) } as any, agentWorkspacePath: null, providerSettings, diff --git a/test/main/tool/agentTools/agentToolManagerSkillAccess.test.ts b/test/main/tool/agentTools/agentToolManagerSkillAccess.test.ts index 504d19309c..1f2f812a99 100644 --- a/test/main/tool/agentTools/agentToolManagerSkillAccess.test.ts +++ b/test/main/tool/agentTools/agentToolManagerSkillAccess.test.ts @@ -17,25 +17,6 @@ vi.mock('fs', async (importOriginal) => { } }) -vi.mock('electron', () => ({ - app: { - getPath: (name: string) => { - if (name === 'temp') { - return path.join(os.tmpdir(), 'deepchat-electron-temp') - } - if (name === 'home') { - return path.join(os.tmpdir(), 'deepchat-electron-home') - } - return os.tmpdir() - } - }, - nativeImage: { - createFromPath: () => ({ - getSize: () => ({ width: 128, height: 96 }) - }) - } -})) - describe('AgentToolManager skill file access', () => { const electronHome = path.join(os.tmpdir(), 'deepchat-electron-home') const agentId = `agent-a-${process.pid}` diff --git a/test/main/tool/agentTools/agentToolManagerYoBrowser.test.ts b/test/main/tool/agentTools/agentToolManagerYoBrowser.test.ts index 3bd372c8c8..827bc14e7f 100644 --- a/test/main/tool/agentTools/agentToolManagerYoBrowser.test.ts +++ b/test/main/tool/agentTools/agentToolManagerYoBrowser.test.ts @@ -1,21 +1,9 @@ import { beforeEach, describe, expect, it, vi } from 'vitest' -import os from 'os' import { AgentToolManager } from '@/tool/agentTools/agentToolManager' import { YoBrowserUnavailableError, buildYoBrowserUnavailablePayload } from '@/tool/browser/errors' import { createAgentToolDependencies } from './agentToolDependencies' import { CommandPermissionService } from '@/tool/permission' -vi.mock('electron', () => ({ - app: { - getPath: () => os.tmpdir() - }, - nativeImage: { - createFromPath: () => ({ - getSize: () => ({ width: 128, height: 96 }) - }) - } -})) - describe('AgentToolManager YoBrowser routing', () => { let manager: AgentToolManager let yoBrowserCallTool: ReturnType diff --git a/test/main/tool/agentTools/chatSettingsTools.test.ts b/test/main/tool/agentTools/chatSettingsTools.test.ts index 458b09cf45..f82e287d08 100644 --- a/test/main/tool/agentTools/chatSettingsTools.test.ts +++ b/test/main/tool/agentTools/chatSettingsTools.test.ts @@ -7,19 +7,7 @@ import { } from '@/tool/agentTools/chatSettingsTools' describe('ChatSettingsToolHandler', () => { - const providerSettings = { - getSetting: vi.fn(), - setSetting: vi.fn(), - setLanguage: vi.fn(), - setTheme: vi.fn() - } as any - - const desktopSettings = { - getCopyWithCotEnabled: vi.fn(), - getTheme: vi.fn(), - setCopyWithCotEnabled: vi.fn(), - setTheme: vi.fn() - } as any + const desktopSettings = { applyDisplayChange: vi.fn() } const skillSettings = { isEnabled: vi.fn() @@ -36,7 +24,6 @@ describe('ChatSettingsToolHandler', () => { const buildHandler = () => new ChatSettingsToolHandler({ - providerSettings, desktopSettings, skillSettings, skillService, @@ -45,10 +32,13 @@ describe('ChatSettingsToolHandler', () => { beforeEach(() => { vi.clearAllMocks() - desktopSettings.getCopyWithCotEnabled.mockReturnValue(true) - desktopSettings.getTheme.mockReturnValue('dark') - providerSettings.getSetting.mockReturnValue('chat') - providerSettings.setTheme.mockResolvedValue(false) + desktopSettings.applyDisplayChange.mockImplementation(async (change) => ({ + ok: true, + id: change.id, + value: change.value, + previousValue: change.id === 'copyWithCotEnabled' ? true : 'dark', + appliedAt: 1 + })) skillSettings.isEnabled.mockReturnValue(true) skillService.getActiveSkills.mockResolvedValue([CHAT_SETTINGS_SKILL_NAME]) windowPresenter.createSettingsWindow.mockResolvedValue(1) @@ -64,7 +54,7 @@ describe('ChatSettingsToolHandler', () => { if (!result.ok) { expect(result.errorCode).toBe('skill_inactive') } - expect(desktopSettings.setCopyWithCotEnabled).not.toHaveBeenCalled() + expect(desktopSettings.applyDisplayChange).not.toHaveBeenCalled() }) it('rejects invalid toggle payloads', async () => { @@ -75,14 +65,17 @@ describe('ChatSettingsToolHandler', () => { if (!result.ok) { expect(result.errorCode).toBe('invalid_request') } - expect(desktopSettings.setCopyWithCotEnabled).not.toHaveBeenCalled() + expect(desktopSettings.applyDisplayChange).not.toHaveBeenCalled() }) it('applies copyWithCotEnabled toggle', async () => { const handler = buildHandler() const result = await handler.toggle({ setting: 'copyWithCotEnabled', enabled: false }, 'conv-1') - expect(desktopSettings.setCopyWithCotEnabled).toHaveBeenCalledWith(false) + expect(desktopSettings.applyDisplayChange).toHaveBeenCalledWith({ + id: 'copyWithCotEnabled', + value: false + }) expect(result.ok).toBe(true) if (result.ok) { expect(result.previousValue).toBe(true) @@ -95,10 +88,43 @@ describe('ChatSettingsToolHandler', () => { const result = await handler.setTheme({ theme: 'light' }, 'conv-1', [CHAT_SETTINGS_SKILL_NAME]) expect(result.ok).toBe(true) - expect(desktopSettings.setTheme).toHaveBeenCalledWith('light') + expect(desktopSettings.applyDisplayChange).toHaveBeenCalledWith({ id: 'theme', value: 'light' }) expect(skillService.getActiveSkills).not.toHaveBeenCalled() }) + it('waits for the native owner and returns its applied receipt', async () => { + const receipt = { + ok: true as const, + id: 'theme' as const, + value: 'light' as const, + previousValue: 'system' as const, + appliedAt: 123 + } + let acknowledge!: (value: typeof receipt) => void + desktopSettings.applyDisplayChange.mockReturnValueOnce( + new Promise((resolve) => { + acknowledge = resolve + }) + ) + const result = buildHandler().setTheme({ theme: 'light' }, 'conv-1', [CHAT_SETTINGS_SKILL_NAME]) + let settled = false + void result.then(() => { + settled = true + }) + await Promise.resolve() + expect(settled).toBe(false) + acknowledge(receipt) + expect(await result).toEqual(receipt) + }) + + it('reports an asynchronous native mutation failure', async () => { + desktopSettings.applyDisplayChange.mockRejectedValueOnce(new Error('native owner stopped')) + expect(await buildHandler().setTheme({ theme: 'light' }, 'conv-1')).toMatchObject({ + ok: false, + errorCode: 'apply_failed' + }) + }) + it('propagates dispatch commit failure without changing settings', async () => { const handler = buildHandler() const journalError = new Error('journal unavailable') @@ -111,7 +137,7 @@ describe('ChatSettingsToolHandler', () => { ).rejects.toBe(journalError) expect(beforeMutation).toHaveBeenCalledWith({ theme: 'light' }) - expect(desktopSettings.setTheme).not.toHaveBeenCalled() + expect(desktopSettings.applyDisplayChange).not.toHaveBeenCalled() }) it('opens settings and navigates to section', async () => { diff --git a/test/main/tool/codeMode/runCodeRuntimeManager.test.ts b/test/main/tool/codeMode/runCodeRuntimeManager.test.ts index 0cdd2ee89f..ccd23e0c7a 100644 --- a/test/main/tool/codeMode/runCodeRuntimeManager.test.ts +++ b/test/main/tool/codeMode/runCodeRuntimeManager.test.ts @@ -14,6 +14,7 @@ import { class FakeUtilityProcess extends EventEmitter { readonly pid = 42 + readonly getRssBytes = vi.fn<(signal: AbortSignal) => Promise>(async () => null) readonly messages: RunCodeParentMessage[] = [] readonly kill = vi.fn(() => true) @@ -79,7 +80,7 @@ const createManager = ( host: FakeUtilityProcess, executeNested: RunCodeRuntimeManagerOptions['executeNested'] = vi.fn(async () => ({ content: 'nested result', - rawData: { content: 'nested result' } + rawData: { toolCallId: 'fixture-nested-call', content: 'nested result' } })) ) => new RunCodeRuntimeManager({ @@ -91,6 +92,196 @@ const createManager = ( }) describe('RunCodeRuntimeManager', () => { + const deferred = () => { + let resolve!: (value: T) => void + const promise = new Promise((settle) => { + resolve = settle + }) + return { promise, resolve } + } + const codeInput = () => ({ + sessionId: 'session-1', + toolCallId: 'call-1', + frontend: 'function' as const, + source: 'return true', + executionCatalog: [] as MCPToolDefinition[], + outerDispatch: outerDispatch(), + options: {} + }) + + it('reserves a session during asynchronous startup before a second dispatch can commit', async () => { + const ready = deferred() + const spawnHost = vi.fn(() => ready.promise) + const manager = new RunCodeRuntimeManager({ spawnHost, executeNested: vi.fn() }) + const first = manager.execute(codeInput()) + await vi.waitFor(() => expect(spawnHost).toHaveBeenCalledOnce()) + await expect(manager.execute({ ...codeInput(), toolCallId: 'second' })).rejects.toThrow( + 'already has a code cell starting' + ) + const host = new FakeUtilityProcess(true) + ready.resolve(host) + await vi.waitFor(() => expect(host.listenerCount('message')).toBe(1)) + host.becomeReady() + await expect(first).resolves.toMatchObject({ content: expect.stringContaining('from console') }) + expect(spawnHost).toHaveBeenCalledOnce() + await manager.shutdown() + }) + + it('keeps shutdown pending for an uncancelable physical spawn and never starts its late cell', async () => { + const ready = deferred() + const spawnHost = vi.fn(() => ready.promise) + const manager = new RunCodeRuntimeManager({ spawnHost, executeNested: vi.fn() }) + const rejected = expect(manager.execute(codeInput())).rejects.toMatchObject({ + name: 'AbortError' + }) + await vi.waitFor(() => expect(spawnHost).toHaveBeenCalledOnce()) + let stopped = false + const stop = manager.shutdown().then(() => { + stopped = true + }) + await rejected + expect(stopped).toBe(false) + await expect(manager.execute(codeInput())).rejects.toThrow('shutting down') + const host = new FakeUtilityProcess(false) + ready.resolve(host) + await stop + expect(host.kill).toHaveBeenCalledOnce() + expect(host.messages).toEqual([]) + }) + + it.each(['caller', 'session'])( + 'retains the startup lease after %s cancellation until actual settlement', + async (kind) => { + const ready = deferred() + const next = new FakeUtilityProcess(true) + const spawnHost = vi + .fn() + .mockImplementationOnce(() => ready.promise) + .mockImplementationOnce(async () => { + setTimeout(() => next.becomeReady(), 0) + return next + }) + const manager = new RunCodeRuntimeManager({ spawnHost, executeNested: vi.fn() }) + const caller = new AbortController() + const rejected = expect( + manager.execute({ ...codeInput(), options: { signal: caller.signal } }) + ).rejects.toThrow(kind === 'caller' ? 'aborted' : 'session canceled') + await vi.waitFor(() => expect(spawnHost).toHaveBeenCalledOnce()) + if (kind === 'caller') caller.abort() + else manager.cancelSession('session-1', 'session canceled') + await rejected + await expect(manager.execute(codeInput())).rejects.toThrow('already has a code cell starting') + const old = new FakeUtilityProcess(false) + ready.resolve(old) + await vi.waitFor(() => expect(old.kill).toHaveBeenCalledOnce()) + await expect(manager.execute(codeInput())).resolves.toHaveProperty('content') + expect(old.messages).toEqual([]) + expect(spawnHost).toHaveBeenCalledTimes(2) + await manager.shutdown() + } + ) + + it('drains an uncancelable nested handler after the cell has exited without accepting its late result', async () => { + const host = new FakeUtilityProcess(false) + const entered = deferred(), + release = deferred() + let nestedSignal: AbortSignal | undefined + const manager = createManager(host, async (input) => { + nestedSignal = input.options.signal + entered.resolve() + await release.promise + return { + content: 'late result', + rawData: { toolCallId: 'fixture-nested-call', content: 'late result' } + } + }) + const rejected = expect( + manager.execute({ ...codeInput(), executionCatalog: [tool('exec')] }) + ).rejects.toThrow('shut down') + await vi.waitFor(() => expect(host.messages[0]?.type).toBe('START')) + const start = host.messages[0] as Extract + host.emit('message', { + type: 'NESTED_CALL', + version: RUN_CODE_PROTOCOL_VERSION, + cellId: start.cellId, + callId: 'nested', + bindingId: start.bindings[0].id, + arguments: {} + }) + await entered.promise + let stopped = false + const stop = manager.shutdown().then(() => { + stopped = true + }) + await rejected + expect(nestedSignal?.aborted).toBe(true) + expect(stopped).toBe(false) + release.resolve() + await stop + expect(host.messages.some((message) => message.type === 'NESTED_RESULT')).toBe(false) + }) + + it('coalesces RSS reads and drains a held sample without acting on its late value', async () => { + vi.useFakeTimers() + try { + const host = new FakeUtilityProcess(false), + sample = deferred() + host.getRssBytes.mockReturnValue(sample.promise) + const manager = createManager(host) + const rejected = expect(manager.execute(codeInput())).rejects.toThrow('shut down') + await vi.advanceTimersByTimeAsync(3_000) + expect(host.getRssBytes).toHaveBeenCalledOnce() + let stopped = false + const stop = manager.shutdown().then(() => { + stopped = true + }) + await rejected + expect(host.getRssBytes.mock.calls[0][0].aborted).toBe(true) + expect(stopped).toBe(false) + sample.resolve(513 * 1024 * 1024) + await stop + expect(host.messages.filter((message) => message.type === 'STOP')).toHaveLength(1) + } finally { + vi.useRealTimers() + } + }) + + it('enforces the existing hard RSS limit through the injected sampling capability', async () => { + vi.useFakeTimers() + try { + const host = new FakeUtilityProcess(false) + host.getRssBytes.mockResolvedValue(513 * 1024 * 1024) + const manager = createManager(host) + const rejected = expect(manager.execute(codeInput())).rejects.toThrow('512 MiB RSS limit') + await vi.advanceTimersByTimeAsync(1_001) + await rejected + await manager.shutdown() + } finally { + vi.useRealTimers() + } + }) + + it('keeps the five-second readiness deadline and releases a silent helper', async () => { + vi.useFakeTimers() + try { + const host = new FakeUtilityProcess(false) + const manager = new RunCodeRuntimeManager({ + spawnHost: async () => host, + executeNested: vi.fn() + }) + const rejected = expect(manager.execute(codeInput())).rejects.toThrow('within 5 seconds') + await vi.advanceTimersByTimeAsync(4_999) + expect(host.kill).not.toHaveBeenCalled() + await vi.advanceTimersByTimeAsync(1) + await rejected + expect(host.kill).toHaveBeenCalledOnce() + expect(host.messages).toEqual([]) + await manager.shutdown() + } finally { + vi.useRealTimers() + } + }) + it('rejects partial execution-journal capability wiring before starting a cell', async () => { const host = new FakeUtilityProcess(false) const manager = createManager(host) @@ -236,8 +427,9 @@ describe('RunCodeRuntimeManager', () => { const spawning = new Promise((resolve) => { resolveHost = resolve }) + const spawnHost = vi.fn(() => spawning) const manager = new RunCodeRuntimeManager({ - spawnHost: () => spawning, + spawnHost, executeNested: vi.fn() }) const execution = manager.execute({ @@ -250,6 +442,7 @@ describe('RunCodeRuntimeManager', () => { options: { signal: controller.signal } }) const cancellation = expect(execution).rejects.toMatchObject({ name: 'AbortError' }) + await vi.waitFor(() => expect(spawnHost).toHaveBeenCalledOnce()) if (stage !== 'spawn') { resolveHost(host) await vi.waitFor(() => expect(host.listenerCount('message')).toBe(1)) @@ -345,10 +538,10 @@ describe('RunCodeRuntimeManager', () => { const manager = createManager( host, vi.fn(async () => ({ - content: [{ type: 'text', text: 'rendered fallback' }], + content: [{ type: 'text' as const, text: 'rendered fallback' }], rawData: { toolCallId: 'nested-1', - content: [{ type: 'text', text: 'rendered fallback' }], + content: [{ type: 'text' as const, text: 'rendered fallback' }], structuredContent: { answer: 42 } } })) @@ -409,7 +602,7 @@ describe('RunCodeRuntimeManager', () => { host, vi.fn(async () => ({ content: 'nested failure', - rawData: { content: 'nested failure', isError: true } + rawData: { toolCallId: 'fixture-nested-call', content: 'nested failure', isError: true } })) ) const execution = manager.execute({ @@ -545,7 +738,7 @@ describe('RunCodeRuntimeManager', () => { normalizedArguments: input.arguments as Record, target: { serverName: 'test', originalName: input.definition.function.name } }) - return { content: 'done', rawData: { content: 'done' } } + return { content: 'done', rawData: { toolCallId: 'fixture-nested-call', content: 'done' } } }) const manager = createManager(host, executeNested) const yielded = await manager.execute({ @@ -616,7 +809,7 @@ describe('RunCodeRuntimeManager', () => { target: { serverName: 'test', originalName: input.definition.function.name } }) await nestedPending - return { content: 'done', rawData: { content: 'done' } } + return { content: 'done', rawData: { toolCallId: 'fixture-nested-call', content: 'done' } } }) const manager = createManager(host, executeNested) const execution = manager.execute({ @@ -678,18 +871,21 @@ describe('RunCodeRuntimeManager', () => { .mockResolvedValueOnce({ content: 'permission required', rawData: { + toolCallId: 'fixture-nested-call', content: 'permission required', requiresPermission: true, permissionRequest: { + serverName: 'agent-filesystem', + description: 'Approve fixture command', toolName: 'exec', - permissionType: 'command', + permissionType: 'command' as const, command: 'git status --short' } } }) .mockResolvedValueOnce({ content: 'clean', - rawData: { content: 'clean' } + rawData: { toolCallId: 'fixture-nested-call', content: 'clean' } }) const manager = createManager(host, executeNested) const input = { @@ -720,7 +916,7 @@ describe('RunCodeRuntimeManager', () => { }) await expect(firstExecution).resolves.toMatchObject({ - rawData: { requiresPermission: true } + rawData: { toolCallId: 'fixture-nested-call', requiresPermission: true } }) const retriedExecution = manager.execute({ @@ -758,18 +954,21 @@ describe('RunCodeRuntimeManager', () => { .mockResolvedValueOnce({ content: 'permission required', rawData: { + toolCallId: 'fixture-nested-call', content: 'permission required', requiresPermission: true, permissionRequest: { + serverName: 'agent-filesystem', + description: 'Approve fixture command', toolName: 'exec', - permissionType: 'command', + permissionType: 'command' as const, command: 'git status --short' } } }) .mockResolvedValueOnce({ content: 'nested failure', - rawData: { content: 'nested failure', isError: true } + rawData: { toolCallId: 'fixture-nested-call', content: 'nested failure', isError: true } }) const manager = createManager(host, executeNested) const input = { @@ -799,7 +998,7 @@ describe('RunCodeRuntimeManager', () => { arguments: { command: 'git status --short' } }) await expect(firstExecution).resolves.toMatchObject({ - rawData: { requiresPermission: true } + rawData: { toolCallId: 'fixture-nested-call', requiresPermission: true } }) const retriedExecution = manager.execute({ @@ -837,9 +1036,12 @@ describe('RunCodeRuntimeManager', () => { const executeNested = vi.fn(async () => ({ content: 'permission required', rawData: { + toolCallId: 'fixture-nested-call', content: 'permission required', requiresPermission: true, permissionRequest: { + serverName: 'agent-filesystem', + description: 'Approve fixture command', toolName: 'exec', permissionType: 'command' as const, command: 'git status --short' @@ -872,7 +1074,7 @@ describe('RunCodeRuntimeManager', () => { arguments: { command: 'git status --short' } }) await expect(execution).resolves.toMatchObject({ - rawData: { requiresPermission: true } + rawData: { toolCallId: 'fixture-nested-call', requiresPermission: true } }) const heartbeat = setInterval(() => { @@ -911,7 +1113,10 @@ describe('RunCodeRuntimeManager', () => { await new Promise((resolve) => { finishNested = resolve }) - return { content: 'late result', rawData: { content: 'late result' } } + return { + content: 'late result', + rawData: { toolCallId: 'fixture-nested-call', content: 'late result' } + } }) const manager = createManager(host, executeNested) const execution = manager.execute({ diff --git a/test/main/tool/toolService.test.ts b/test/main/tool/toolService.test.ts index df2bb17261..d85fc900ce 100644 --- a/test/main/tool/toolService.test.ts +++ b/test/main/tool/toolService.test.ts @@ -1,3 +1,4 @@ +import { createPluginToolPolicies } from '../../helpers/pluginToolPolicies' import { EventEmitter } from 'node:events' import { describe, expect, it, vi } from 'vitest' import { TOOL_EXECUTION, type MCPToolDefinition } from '@shared/types/mcp' @@ -61,36 +62,7 @@ import { createToolSurfaceCanaryRunEvidenceRecorder } from '@/agent/deepchat/runtime/toolSurfaceCanaryDiagnostics' -vi.mock('electron', async () => { - const { join } = await import('node:path') - const { tmpdir } = await import('node:os') - const { rmSync } = await import('node:fs') - // Isolate the mocked userData per worker process and clean it up on exit so - // parallel workers never share persistent electron-store state. - const userDataDir = join(tmpdir(), `deepchat-vitest-userdata-toolservice-${process.pid}`) - process.on('exit', () => { - try { - rmSync(userDataDir, { recursive: true, force: true }) - } catch { - // best-effort cleanup - } - }) - const electronModuleMock = { - app: { - getName: () => 'DeepChat', - getVersion: () => '0.0.0-test', - getPath: (type: string) => (type === 'userData' ? userDataDir : '/mock/path') - }, - ipcMain: { - on: () => {}, - handle: () => {} - }, - shell: { - openPath: async () => '' - } - } - return { ...electronModuleMock, default: electronModuleMock } -}) +const pluginToolPolicies = createPluginToolPolicies() const buildToolDefinition = (name: string, serverName: string): MCPToolDefinition => ({ execution: TOOL_EXECUTION.write, @@ -120,6 +92,10 @@ const buildToolDefinition = (name: string, serverName: string): MCPToolDefinitio } }) +const spawnCodeModeHost = async () => { + throw new Error('Code Mode launch must be supplied by the test') +} + const buildAgentToolRuntimeMock = (overrides: Record = {}) => createAgentToolDependencies({ resolveConversationSessionInfo: vi.fn(async (sessionId: string) => ({ @@ -297,6 +273,8 @@ const cronJobRunFixture = { describe('ToolService', () => { it('carries only the active frozen Programmatic capability to native exec', async () => { const toolService = new ToolService({ + spawnCodeModeHost, + pluginToolPolicies, skillSettings: { isEnabled: () => false } as any, mcpService: { getAllToolDefinitions: vi.fn().mockResolvedValue([]), @@ -477,6 +455,8 @@ describe('ToolService', () => { resolveAuthority(sessionId) ) const toolService = new ToolService({ + spawnCodeModeHost, + pluginToolPolicies, skillSettings: { isEnabled: () => false } as any, mcpService: { getAllToolDefinitions, @@ -777,6 +757,8 @@ describe('ToolService', () => { }) } as any const toolService = new ToolService({ + spawnCodeModeHost, + pluginToolPolicies, skillSettings: { isEnabled: () => false } as any, mcpService, agentSettings: { resolveDeepChatAgentConfig: vi.fn(async () => ({})) } as any, @@ -840,6 +822,8 @@ describe('ToolService', () => { }) })! const toolService = new ToolService({ + spawnCodeModeHost, + pluginToolPolicies, skillSettings: { isEnabled: () => false } as any, mcpService: { getAllToolDefinitions: vi.fn(), callTool: vi.fn() } as any, agentSettings: { resolveDeepChatAgentConfig: vi.fn(async () => ({})) } as any, @@ -902,6 +886,8 @@ describe('ToolService', () => { beforeToolExecution: vi.fn() } const toolService = new ToolService({ + spawnCodeModeHost, + pluginToolPolicies, skillSettings: { isEnabled: () => false } as any, mcpService, agentSettings: { resolveDeepChatAgentConfig: vi.fn(async () => ({})) } as any, @@ -960,6 +946,8 @@ describe('ToolService', () => { it('rejects guessed inactive tools before source or target resolution', async () => { const active = buildToolSurfaceExecutionContext() const toolService = new ToolService({ + spawnCodeModeHost, + pluginToolPolicies, skillSettings: { isEnabled: () => false } as any, mcpService: { getAllToolDefinitions: vi.fn(), callTool: vi.fn() } as any, agentSettings: { resolveDeepChatAgentConfig: vi.fn(async () => ({})) } as any, @@ -1033,6 +1021,8 @@ describe('ToolService', () => { }) } as any toolService = new ToolService({ + spawnCodeModeHost, + pluginToolPolicies, skillSettings: { isEnabled: () => false } as any, mcpService, agentSettings: { resolveDeepChatAgentConfig: vi.fn(async () => ({})) } as any, @@ -1095,6 +1085,8 @@ describe('ToolService', () => { }) } as any const toolService = new ToolService({ + spawnCodeModeHost, + pluginToolPolicies, skillSettings: { isEnabled: () => false } as any, mcpService, agentSettings: { resolveDeepChatAgentConfig: vi.fn(async () => ({})) } as any, @@ -1143,6 +1135,8 @@ describe('ToolService', () => { beforeToolExecution: vi.fn() } const toolService = new ToolService({ + spawnCodeModeHost, + pluginToolPolicies, skillSettings: { isEnabled: () => false } as any, mcpService: { getAllToolDefinitions: vi.fn().mockResolvedValue([]), @@ -1233,6 +1227,8 @@ describe('ToolService', () => { const commitDispatch = vi.fn() const registerOutcomeProjection = vi.fn() const toolService = new ToolService({ + spawnCodeModeHost, + pluginToolPolicies, skillSettings: { isEnabled: () => false } as any, mcpService: { getAllToolDefinitions: vi.fn().mockResolvedValue([]), @@ -1286,6 +1282,8 @@ describe('ToolService', () => { ])('$toolName execution timeout', ({ providerId, toolName }) => { const createService = () => { const service = new ToolService({ + spawnCodeModeHost, + pluginToolPolicies, skillSettings: { isEnabled: () => false } as any, mcpService: { getAllToolDefinitions: vi.fn().mockResolvedValue([]) } as any, agentSettings: { resolveDeepChatAgentConfig: vi.fn(async () => ({})) } as any, @@ -1370,6 +1368,8 @@ describe('ToolService', () => { async (mode) => { const mcpService = { getAllToolDefinitions: vi.fn().mockResolvedValue([]) } const toolService = new ToolService({ + spawnCodeModeHost, + pluginToolPolicies, skillSettings: { isEnabled: () => false } as any, mcpService: mcpService as any, agentSettings: { resolveDeepChatAgentConfig: vi.fn(async () => ({})) } as any, @@ -1420,6 +1420,8 @@ describe('ToolService', () => { it('projects one execution catalog into Agent, Code, and Minimal modes', async () => { const toolService = new ToolService({ + spawnCodeModeHost, + pluginToolPolicies, skillSettings: { isEnabled: () => false } as any, mcpService: { getAllToolDefinitions: vi.fn().mockResolvedValue([]) } as any, agentSettings: { resolveDeepChatAgentConfig: vi.fn(async () => ({})) } as any, @@ -1654,6 +1656,8 @@ describe('ToolService', () => { it('fails Code Mode before provider I/O when normalized tool names collide', () => { const toolService = new ToolService({ + spawnCodeModeHost, + pluginToolPolicies, skillSettings: { isEnabled: () => false } as any, mcpService: { getAllToolDefinitions: vi.fn().mockResolvedValue([]) } as any, agentSettings: { resolveDeepChatAgentConfig: vi.fn(async () => ({})) } as any, @@ -1714,6 +1718,19 @@ describe('ToolService', () => { callTool: vi.fn(async () => ({ content: 'remote result', rawData: {} })) } as any const toolService = new ToolService({ + pluginToolPolicies, + spawnCodeModeHost: async () => { + setTimeout( + () => + host.emit('message', { + type: 'READY', + version: RUN_CODE_PROTOCOL_VERSION, + pid: host.pid + }), + 0 + ) + return host + }, skillSettings: { isEnabled: () => false } as any, mcpService, agentSettings: { resolveDeepChatAgentConfig: vi.fn(async () => ({})) } as any, @@ -1742,6 +1759,7 @@ describe('ToolService', () => { const nestedResults: RunCodeParentMessage[] = [] const host = Object.assign(new EventEmitter(), { pid: 42, + getRssBytes: async () => null, kill: vi.fn(() => true), postMessage(message: RunCodeParentMessage) { if (message.type === 'START') { @@ -1775,20 +1793,6 @@ describe('ToolService', () => { } } }) - const runtime = (toolService as any).runCodeRuntime - runtime.managerOptions.spawnHost = async () => { - setTimeout( - () => - host.emit('message', { - type: 'READY', - version: RUN_CODE_PROTOCOL_VERSION, - pid: host.pid - }), - 0 - ) - return host - } - try { await toolService.callTool( { @@ -1848,6 +1852,8 @@ describe('ToolService', () => { })) } as any const toolService = new ToolService({ + spawnCodeModeHost, + pluginToolPolicies, skillSettings: { isEnabled: () => false } as any, mcpService, agentSettings: { resolveDeepChatAgentConfig: vi.fn(async () => ({})) } as any, @@ -1914,6 +1920,8 @@ describe('ToolService', () => { }) } as any const toolService = new ToolService({ + spawnCodeModeHost, + pluginToolPolicies, skillSettings: { isEnabled: () => false } as any, mcpService, agentSettings: { resolveDeepChatAgentConfig: vi.fn(async () => ({})) } as any, @@ -1988,6 +1996,8 @@ describe('ToolService', () => { callTool: vi.fn() } as any const toolService = new ToolService({ + spawnCodeModeHost, + pluginToolPolicies, skillSettings: { isEnabled: () => false } as any, mcpService, agentSettings: { resolveDeepChatAgentConfig: vi.fn(async () => ({})) } as any, @@ -2035,6 +2045,8 @@ describe('ToolService', () => { } })) const toolService = new ToolService({ + spawnCodeModeHost, + pluginToolPolicies, skillSettings: { isEnabled: () => false } as any, mcpService: { getAllToolDefinitions: vi.fn().mockResolvedValue([]) } as any, agentSettings: { resolveDeepChatAgentConfig: vi.fn(async () => ({})) } as any, @@ -2105,6 +2117,8 @@ describe('ToolService', () => { } }) const toolService = new ToolService({ + spawnCodeModeHost, + pluginToolPolicies, skillSettings: { isEnabled: () => false } as any, mcpService: { getAllToolDefinitions: vi.fn().mockResolvedValue([]) } as any, agentSettings: { resolveDeepChatAgentConfig: vi.fn(async () => ({})) } as any, @@ -2174,6 +2188,8 @@ describe('ToolService', () => { }) } as any const toolService = new ToolService({ + spawnCodeModeHost, + pluginToolPolicies, skillSettings: { isEnabled: () => false } as any, mcpService, agentSettings: { resolveDeepChatAgentConfig: vi.fn(async () => ({})) } as any, @@ -2262,6 +2278,8 @@ describe('ToolService', () => { } const toolService = new ToolService({ + spawnCodeModeHost, + pluginToolPolicies, skillSettings: { isEnabled: () => false } as any, mcpService, agentSettings: { resolveDeepChatAgentConfig: vi.fn(async () => ({})) } as any, @@ -2327,6 +2345,8 @@ describe('ToolService', () => { } })) const toolService = new ToolService({ + spawnCodeModeHost, + pluginToolPolicies, skillSettings: { isEnabled: () => false } as any, mcpService, agentSettings: { resolveDeepChatAgentConfig: vi.fn(async () => ({})) } as any, @@ -2451,6 +2471,8 @@ describe('ToolService', () => { it('keeps every Tape capability name reserved against same-name MCP tools', async () => { const tapeToolNames = new Set(Object.values(TAPE_TOOL_NAMES)) const toolService = new ToolService({ + spawnCodeModeHost, + pluginToolPolicies, mcpService: { getAllToolDefinitions: vi .fn() @@ -2478,6 +2500,8 @@ describe('ToolService', () => { it('keeps Skill capabilities reserved, enabled, and fail-closed against MCP shadowing', async () => { const skillNames = new Set(SKILL_AGENT_TOOL_NAMES) const toolService = new ToolService({ + spawnCodeModeHost, + pluginToolPolicies, mcpService: { getAllToolDefinitions: vi .fn() @@ -2528,6 +2552,8 @@ describe('ToolService', () => { it('propagates Agent catalog failures only for fail-closed resolutions', async () => { const toolService = new ToolService({ + spawnCodeModeHost, + pluginToolPolicies, mcpService: { getAllToolDefinitions: vi.fn().mockResolvedValue([]) } as any, @@ -2567,6 +2593,8 @@ describe('ToolService', () => { } const toolService = new ToolService({ + spawnCodeModeHost, + pluginToolPolicies, skillSettings: { isEnabled: () => false } as any, mcpService, agentSettings: { resolveDeepChatAgentConfig: vi.fn(async () => ({})) } as any, @@ -2609,6 +2637,8 @@ describe('ToolService', () => { callTool: vi.fn() } as any const toolService = new ToolService({ + spawnCodeModeHost, + pluginToolPolicies, skillSettings: { isEnabled: () => false } as any, mcpService, agentSettings: { resolveDeepChatAgentConfig: vi.fn(async () => ({})) } as any, @@ -2684,6 +2714,8 @@ describe('ToolService', () => { }) const toolService = new ToolService({ + spawnCodeModeHost, + pluginToolPolicies, skillSettings: { isEnabled: () => false } as any, mcpService, agentSettings: { resolveDeepChatAgentConfig: vi.fn(async () => ({})) } as any, @@ -2758,6 +2790,8 @@ describe('ToolService', () => { const runtimePort = buildAgentToolRuntimeMock() const toolService = new ToolService({ + spawnCodeModeHost, + pluginToolPolicies, skillSettings: { isEnabled: () => false } as any, mcpService, agentSettings: { resolveDeepChatAgentConfig: vi.fn(async () => ({})) } as any, @@ -2800,6 +2834,8 @@ describe('ToolService', () => { callTool: vi.fn() } as any const toolService = new ToolService({ + spawnCodeModeHost, + pluginToolPolicies, skillSettings: { isEnabled: () => false } as any, mcpService, agentSettings: { resolveDeepChatAgentConfig: vi.fn(async () => ({})) } as any, @@ -2904,6 +2940,8 @@ describe('ToolService', () => { const privateError = new Error('private-agent-availability-error') const warnSpy = vi.spyOn(console, 'warn').mockImplementation(() => undefined) const toolService = new ToolService({ + spawnCodeModeHost, + pluginToolPolicies, skillSettings: { isEnabled: () => false } as any, mcpService: { getAllToolDefinitions: vi.fn(), @@ -2943,6 +2981,8 @@ describe('ToolService', () => { it('stops a snapshot universe before Agent availability work when aborted', async () => { const resolveConversationSessionInfo = vi.fn() const toolService = new ToolService({ + spawnCodeModeHost, + pluginToolPolicies, skillSettings: { isEnabled: () => false } as any, mcpService: { getAllToolDefinitions: vi.fn(), @@ -2970,6 +3010,8 @@ describe('ToolService', () => { it('stops a snapshot universe during Agent availability work when aborted', async () => { const resolveConversationSessionInfo = vi.fn(() => new Promise(() => undefined)) const toolService = new ToolService({ + spawnCodeModeHost, + pluginToolPolicies, skillSettings: { isEnabled: () => false } as any, mcpService: { getAllToolDefinitions: vi.fn(), @@ -3020,6 +3062,8 @@ describe('ToolService', () => { it('keeps Subagent orchestration outside disabled catalog controls', async () => { const toolService = new ToolService({ + spawnCodeModeHost, + pluginToolPolicies, mcpService: { getAllToolDefinitions: vi.fn().mockResolvedValue([]) } as any, skillSettings: { isEnabled: () => false } as any, agentSettings: { resolveDeepChatAgentConfig: vi.fn(async () => ({})) } as any, @@ -3066,6 +3110,8 @@ describe('ToolService', () => { it('reserves live delegation names and ignores generic disabled-tool state', async () => { const toolService = new ToolService({ + spawnCodeModeHost, + pluginToolPolicies, mcpService: { getAllToolDefinitions: vi .fn() @@ -3135,6 +3181,8 @@ describe('ToolService', () => { const permissionBroker = new ToolPermissionBroker() const liveDelegationConsent = new LiveDelegationConsentAuthority() const toolService = new ToolService({ + spawnCodeModeHost, + pluginToolPolicies, mcpService: { getAllToolDefinitions: vi.fn().mockResolvedValue([]) } as any, skillSettings: { isEnabled: () => false } as any, agentSettings: { resolveDeepChatAgentConfig: vi.fn(async () => ({})) } as any, @@ -3266,6 +3314,8 @@ describe('ToolService', () => { }) } const toolService = new ToolService({ + spawnCodeModeHost, + pluginToolPolicies, mcpService: mcpService as any, skillSettings: { isEnabled: () => false } as any, agentSettings: { @@ -3329,6 +3379,8 @@ describe('ToolService', () => { beforeToolExecution: vi.fn() } const toolService = new ToolService({ + spawnCodeModeHost, + pluginToolPolicies, mcpService: mcpService as any, skillSettings: { isEnabled: () => false } as any, agentSettings: { resolveDeepChatAgentConfig: vi.fn(async () => ({})) } as any, @@ -3366,6 +3418,8 @@ describe('ToolService', () => { it('rejects malformed live-delegation results at the model-facing boundary', async () => { const toolService = new ToolService({ + spawnCodeModeHost, + pluginToolPolicies, mcpService: { getAllToolDefinitions: vi.fn().mockResolvedValue([]) } as any, skillSettings: { isEnabled: () => false } as any, agentSettings: { resolveDeepChatAgentConfig: vi.fn(async () => ({})) } as any, @@ -3417,6 +3471,8 @@ describe('ToolService', () => { it('keeps the recall pair in the runtime catalog despite stale disabled values', async () => { const toolService = new ToolService({ + spawnCodeModeHost, + pluginToolPolicies, mcpService: { getAllToolDefinitions: vi.fn().mockResolvedValue([]) } as any, @@ -3462,6 +3518,8 @@ describe('ToolService', () => { callTool: vi.fn().mockResolvedValue({ content: 'mcp-result' }) } as any const toolService = new ToolService({ + spawnCodeModeHost, + pluginToolPolicies, mcpService, skillSettings: { isEnabled: () => false } as any, agentSettings: { resolveDeepChatAgentConfig: vi.fn(async () => ({})) } as any, @@ -3547,6 +3605,8 @@ describe('ToolService', () => { it('does not fall back to another conversation mapping when a tool is unavailable', async () => { const toolService = new ToolService({ + spawnCodeModeHost, + pluginToolPolicies, mcpService: { getAllToolDefinitions: vi.fn().mockResolvedValue([]) } as any, @@ -3612,6 +3672,8 @@ describe('ToolService', () => { it('keeps a draft-origin mapping available for the first persisted turn', async () => { const toolService = new ToolService({ + spawnCodeModeHost, + pluginToolPolicies, mcpService: { getAllToolDefinitions: vi.fn().mockResolvedValue([]) } as any, @@ -3653,6 +3715,8 @@ describe('ToolService', () => { it('exposes cronjob only when runtime ports are available and the tool is enabled', async () => { const toolService = new ToolService({ + spawnCodeModeHost, + pluginToolPolicies, skillSettings: { isEnabled: () => false } as any, mcpService: { getAllToolDefinitions: vi.fn().mockResolvedValue([]) @@ -3840,6 +3904,8 @@ describe('ToolService', () => { it('requires approval for cronjob write actions', async () => { const upsertCronJob = vi.fn() const toolService = new ToolService({ + spawnCodeModeHost, + pluginToolPolicies, skillSettings: { isEnabled: () => false } as any, mcpService: { getAllToolDefinitions: vi.fn().mockResolvedValue([]), @@ -3894,6 +3960,8 @@ describe('ToolService', () => { } const toolService = new ToolService({ + spawnCodeModeHost, + pluginToolPolicies, skillSettings: { isEnabled: () => false } as any, mcpService, agentSettings: { resolveDeepChatAgentConfig: vi.fn(async () => ({})) } as any, @@ -3927,6 +3995,8 @@ describe('ToolService', () => { callTool: vi.fn() } as any const toolService = new ToolService({ + spawnCodeModeHost, + pluginToolPolicies, skillSettings: { isEnabled: () => false } as any, mcpService, agentSettings: { resolveDeepChatAgentConfig: vi.fn(async () => ({})) } as any, @@ -3968,6 +4038,47 @@ describe('ToolService', () => { expect(mcpService.callTool).not.toHaveBeenCalled() }) + it('observes current plugin decisions and preserves ask under full access', async () => { + const policies = createPluginToolPolicies() + const policy = { + pluginId: 'tool-service-policy', + serverId: 'server-a', + tools: { mcp_only: 'allow' as const }, + enabled: true + } + policies.register(policy) + const mcpService = { + getAllToolDefinitions: vi.fn(async () => [buildToolDefinition('mcp_only', 'server-a')]), + callTool: vi.fn() + } as any + const service = new ToolService({ + spawnCodeModeHost, + pluginToolPolicies: policies, + mcpService, + skillSettings: { isEnabled: () => false } as any, + agentSettings: { resolveDeepChatAgentConfig: vi.fn(async () => ({})) } as any, + providerSettings: { getModelConfig: vi.fn() } as any, + settings: { get: vi.fn() }, + commandPermissionHandler: new CommandPermissionService(), + agentTools: buildAgentToolRuntimeMock() + }) + await service.getAllToolDefinitions({ chatMode: 'agent', conversationId: 'policy-session' }) + const request = { + id: 'current-policy', + type: 'function' as const, + function: { name: 'mcp_only', arguments: '{}' }, + conversationId: 'policy-session' + } + expect(await service.preCheckToolPermission(request, { permissionMode: 'default' })).toBeNull() + policies.register({ ...policy, tools: { mcp_only: 'ask' } }) + await expect( + service.preCheckToolPermission(request, { permissionMode: 'full_access' }) + ).resolves.toMatchObject({ needsPermission: true }) + const result = await service.callTool(request, { permissionMode: 'full_access' }) + expect(result.rawData.requiresPermission).toBe(true) + expect(mcpService.callTool).not.toHaveBeenCalled() + }) + it('rejects an unstable MCP target during pre-check and execution', async () => { const definition = buildToolDefinition('mcp_only', 'server-a') definition.server.id = undefined @@ -3976,6 +4087,8 @@ describe('ToolService', () => { callTool: vi.fn() } as any const toolService = new ToolService({ + spawnCodeModeHost, + pluginToolPolicies, skillSettings: { isEnabled: () => false } as any, mcpService, agentSettings: { resolveDeepChatAgentConfig: vi.fn(async () => ({})) } as any, @@ -4023,6 +4136,8 @@ describe('ToolService', () => { callTool: vi.fn() } as any const toolService = new ToolService({ + spawnCodeModeHost, + pluginToolPolicies, skillSettings: { isEnabled: () => false } as any, mcpService, agentSettings: { resolveDeepChatAgentConfig: vi.fn(async () => ({})) } as any, @@ -4087,6 +4202,8 @@ describe('ToolService', () => { } const toolService = new ToolService({ + spawnCodeModeHost, + pluginToolPolicies, skillSettings: { isEnabled: () => false } as any, mcpService, agentSettings: { resolveDeepChatAgentConfig: vi.fn(async () => ({})) } as any, @@ -4140,6 +4257,8 @@ describe('ToolService', () => { } const toolService = new ToolService({ + spawnCodeModeHost, + pluginToolPolicies, skillSettings: { isEnabled: () => false } as any, mcpService, agentSettings: { resolveDeepChatAgentConfig: vi.fn(async () => ({})) } as any, @@ -4200,6 +4319,8 @@ describe('ToolService', () => { } const toolService = new ToolService({ + spawnCodeModeHost, + pluginToolPolicies, skillSettings: { isEnabled: () => false } as any, mcpService, agentSettings: { resolveDeepChatAgentConfig: vi.fn(async () => ({})) } as any, @@ -4260,6 +4381,8 @@ describe('ToolService', () => { } const toolService = new ToolService({ + spawnCodeModeHost, + pluginToolPolicies, skillSettings: { isEnabled: () => false } as any, mcpService, agentSettings: { resolveDeepChatAgentConfig: vi.fn(async () => ({})) } as any, @@ -4303,6 +4426,8 @@ describe('ToolService', () => { } const toolService = new ToolService({ + spawnCodeModeHost, + pluginToolPolicies, skillSettings: { isEnabled: () => false } as any, mcpService, agentSettings: { resolveDeepChatAgentConfig: vi.fn(async () => ({})) } as any, @@ -4347,6 +4472,8 @@ describe('ToolService', () => { const runtimePort = buildAgentToolRuntimeMock() const toolService = new ToolService({ + spawnCodeModeHost, + pluginToolPolicies, skillSettings: { isEnabled: () => false } as any, mcpService, agentSettings: { resolveDeepChatAgentConfig: vi.fn(async () => ({})) } as any, @@ -4440,6 +4567,8 @@ describe('ToolService', () => { } const toolService = new ToolService({ + spawnCodeModeHost, + pluginToolPolicies, skillSettings: { isEnabled: () => false } as any, mcpService, agentSettings: { resolveDeepChatAgentConfig: vi.fn(async () => ({})) } as any, diff --git a/test/memory-test-scope.json b/test/memory-test-scope.json index 9052157dbe..1770682c51 100644 --- a/test/memory-test-scope.json +++ b/test/memory-test-scope.json @@ -53,9 +53,13 @@ "test/main/app/memoryProviderBindings.test.ts", "test/main/tool/agentTools/agentMemoryTools.test.ts", "test/main/routes/memoryDto.test.ts", - "test/main/scripts/memoryTestScope.test.ts" + "test/main/scripts/memoryTestScope.test.ts", + "test/main/performance/memory/timing.test.ts" ], "native": [ + "test/main/app/databaseSecurityNative.test.ts", + "test/main/harness/memoryVectorOwner.test.ts", + "test/main/harness/memoryVectorRuntime.test.ts", "test/main/sync/replicaNative.test.ts", "test/main/memory/agentMemoryAuditRetention.test.ts", "test/main/memory/agentMemoryDirectiveTable.test.ts", @@ -75,6 +79,7 @@ ], "eval": ["test/main/memory/memoryRetrieval.eval.test.ts"], "perf": [ + "test/main/performance/memory/vectorTransportScale.perf.ts", "test/main/performance/memory/clearScale.perf.ts", "test/main/performance/memory/maintenanceScale.perf.ts", "test/main/performance/memory/messageHistoryTraceScale.perf.ts", diff --git a/test/renderer/api/clients.test.ts b/test/renderer/api/clients.test.ts index 94d4f7cf44..65e9dd18e2 100644 --- a/test/renderer/api/clients.test.ts +++ b/test/renderer/api/clients.test.ts @@ -1315,6 +1315,21 @@ describe('renderer api clients', () => { expect(bridge.on).toHaveBeenCalledWith('settings.commandShell.changed', expect.any(Function)) }) + it('preserves settings receipts and rejects invalid revisions without poisoning later values', async () => { + const bridge = createBridge() + const client = createSettingsClient(bridge) + const receipt = { version: 2, changedKeys: ['fontSizeLevel'], values: { fontSizeLevel: 3 } } + vi.mocked(bridge.invoke).mockResolvedValue(receipt as never) + expect(await client.getSnapshot()).toBe(receipt) + expect(await client.update([{ key: 'fontSizeLevel', value: 3 }])).toBe(receipt) + expect(() => + client.acceptSnapshot({ version: Infinity, values: { fontSizeLevel: 0 } }) + ).toThrow() + expect(client.acceptSnapshot(receipt)).toEqual(receipt.values) + expect(client.acceptSnapshot({ version: 1, values: { fontSizeLevel: 0 } })).toEqual({}) + expect(client.acceptSnapshot(receipt)).toEqual(receipt.values) + }) + it('sends a cloneable history cursor from reactive message state', async () => { const bridge = createBridge() const cursor = reactive({ orderSeq: 101, id: 'message-101' }) diff --git a/test/renderer/components/OcrSettings.test.ts b/test/renderer/components/OcrSettings.test.ts index c32b78b3fe..47a34dd587 100644 --- a/test/renderer/components/OcrSettings.test.ts +++ b/test/renderer/components/OcrSettings.test.ts @@ -2,6 +2,7 @@ import { describe, expect, it, vi } from 'vitest' import { defineComponent, inject, provide, ref } from 'vue' import { flushPromises, mount } from '@vue/test-utils' import type { OcrRuntimeStatus } from '../../../src/shared/contracts/routes/ocr.routes' +import type { SettingsSnapshotValues } from '@shared/contracts/routes' const AVAILABLE_STATUS: OcrRuntimeStatus = { platform: 'darwin', @@ -46,10 +47,18 @@ async function setup( getSnapshot: settingsError ? vi.fn().mockRejectedValue(new Error('settings unavailable')) : vi.fn().mockResolvedValue({ - ocrAutoExtractForNonVisionModels: true, - ocrBackend: 'auto' + version: 1, + values: { ocrAutoExtractForNonVisionModels: true, ocrBackend: 'auto' } }), - update: vi.fn().mockResolvedValue({ values: {} }) + acceptSnapshot: vi.fn((snapshot) => snapshot.values), + onChanged: vi.fn((_listener: (payload: { values: Partial }) => void) => + vi.fn() + ), + update: vi.fn(async (changes) => ({ + version: 2, + changedKeys: changes.map((change) => change.key), + values: Object.fromEntries(changes.map((change) => [change.key, change.value])) + })) } const ocrClient = { getRuntimeStatus: @@ -69,7 +78,13 @@ async function setup( const pausePolling = vi.fn() const documentVisibility = ref('visible') const windowFocused = ref(true) - const useIntervalFn = vi.fn(() => ({ resume: resumePolling, pause: pausePolling })) + const useIntervalFn = vi.fn( + ( + _callback: () => Promise, + _intervalMs: number, + _options: { immediate: boolean; immediateCallback: boolean } + ) => ({ resume: resumePolling, pause: pausePolling }) + ) const notifyRenderer = vi.fn(() => true) vi.doMock('@api/SettingsClient', () => ({ createSettingsClient: () => settingsClient })) @@ -306,6 +321,44 @@ describe('OcrSettings', () => { consoleError.mockRestore() }) + it('receives settings changes and releases its listener on unmount', async () => { + const { wrapper, settingsClient } = await setup() + const listener = settingsClient.onChanged.mock.calls[0][0] + listener({ values: { ocrAutoExtractForNonVisionModels: false, ocrBackend: 'cpu' } }) + await flushPromises() + expect( + wrapper.get('[data-testid="ocr-auto-extract-switch"]').attributes('data-model-value') + ).toBe('false') + await openAdvanced(wrapper) + const select = wrapper.findComponent({ name: 'Select' }) + expect(select.props('modelValue')).toBe('cpu') + wrapper.unmount() + expect(settingsClient.onChanged.mock.results[0].value).toHaveBeenCalledOnce() + }) + + it.each(['resolve', 'reject'] as const)( + 'ignores a late settings %s after unmount', + async (outcome) => { + const { wrapper, settingsClient, notifyRenderer } = await setup() + const pending = deferred>>() + settingsClient.update.mockReturnValueOnce(pending.promise) + await wrapper.get('[data-testid="ocr-auto-extract-switch"]').trigger('click') + notifyRenderer.mockClear() + wrapper.unmount() + if (outcome === 'resolve') { + pending.resolve({ + version: 2, + changedKeys: ['ocrAutoExtractForNonVisionModels'], + values: { ocrAutoExtractForNonVisionModels: false } + }) + } else { + pending.reject(new Error('owner stopped')) + } + await flushPromises() + expect(notifyRenderer).not.toHaveBeenCalled() + } + ) + it('shows unsupported targets explicitly and prevents cache initialization', async () => { const { wrapper, ocrClient } = await setup({ platform: 'linux', @@ -498,7 +551,7 @@ describe('OcrSettings', () => { expect(wrapper.get('[data-testid="ocr-status-stale"]').text()).toContain( 'settings.ocr.statusLoadFailed' ) - expect(wrapper.get('[data-testid="ocr-retry-status"]').exists()).toBe(true) + expect(wrapper.find('[data-testid="ocr-retry-status"]').exists()).toBe(true) await openAdvanced(wrapper) expect(wrapper.get('[data-testid="ocr-clear-cache"]').attributes('disabled')).toBeDefined() expect(wrapper.findAll('[data-testid="ocr-status-stale"]')).toHaveLength(1) @@ -512,7 +565,7 @@ describe('OcrSettings', () => { await pollStatus() await flushPromises() - expect(wrapper.get('[data-testid="ocr-status-stale"]').exists()).toBe(true) + expect(wrapper.find('[data-testid="ocr-status-stale"]').exists()).toBe(true) expect(wrapper.findAll('[data-testid="ocr-status-stale"]')).toHaveLength(1) }) diff --git a/test/renderer/stores/uiSettingsStore.test.ts b/test/renderer/stores/uiSettingsStore.test.ts index 4878d7a15e..2d05a70f8d 100644 --- a/test/renderer/stores/uiSettingsStore.test.ts +++ b/test/renderer/stores/uiSettingsStore.test.ts @@ -11,7 +11,7 @@ describe('uiSettingsStore', () => { const mountStoreHost = async () => { const { createPinia, setActivePinia } = await vi.importActual('pinia') const { useUiSettingsStore } = await import('../../../src/renderer/src/stores/uiSettingsStore') - let store: ReturnType | null = null + let store!: ReturnType const pinia = createPinia() setActivePinia(pinia) @@ -194,7 +194,7 @@ describe('uiSettingsStore', () => { throw new Error(`Unexpected route in test: ${routeName}`) }) - window.deepchat.invoke = invoke + Object.assign(window.deepchat, { invoke }) const { store } = await mountStoreHost() @@ -204,6 +204,67 @@ describe('uiSettingsStore', () => { expect(store.privacyModeEnabled).toBe(false) }) + it('keeps newer event values while hydrating unrelated fields from a delayed snapshot', async () => { + let resolveSnapshot!: (value: { + version: number + values: Partial + }) => void + invoke.mockImplementationOnce( + () => + new Promise((resolve) => { + resolveSnapshot = resolve + }) + ) + const { store } = await mountStoreHost() + const listener = on.mock.calls[0][1] as (payload: { + version: number + changedKeys: string[] + values: Partial + }) => void + + listener({ version: 3, changedKeys: ['fontSizeLevel'], values: { fontSizeLevel: 4 } }) + resolveSnapshot({ version: 1, values: { fontSizeLevel: 0, fontFamily: 'Inter' } }) + await flushPromises() + expect(store.fontSizeLevel).toBe(4) + expect(store.fontFamily).toBe('Inter') + + listener({ + version: 2, + changedKeys: ['fontSizeLevel', 'notificationsEnabled'], + values: { fontSizeLevel: 1, notificationsEnabled: false } + }) + expect(store.fontSizeLevel).toBe(4) + expect(store.notificationsEnabled).toBe(false) + }) + + it('ignores a delayed mutation receipt after a newer acknowledgement', async () => { + const { store } = await mountStoreHost() + await flushPromises() + const pending: Array<(value: unknown) => void> = [] + invoke.mockImplementation( + () => + new Promise((resolve) => { + pending.push(resolve) + }) + ) + + const first = store.setLaunchAtLoginEnabled(true) + const second = store.setLaunchAtLoginEnabled(false) + pending[1]({ + version: 3, + changedKeys: ['launchAtLoginEnabled'], + values: { launchAtLoginEnabled: false } + }) + await second + pending[0]({ + version: 2, + changedKeys: ['launchAtLoginEnabled'], + values: { launchAtLoginEnabled: true } + }) + await first + expect(store.launchAtLoginEnabled).toBe(false) + }) + it('waits for the initial snapshot before applying an update result', async () => { let resolveSnapshot!: (value: { version: number @@ -235,7 +296,7 @@ describe('uiSettingsStore', () => { throw new Error(`Unexpected route in test: ${routeName}`) }) - window.deepchat.invoke = invoke + Object.assign(window.deepchat, { invoke }) const { store } = await mountStoreHost() const loadPromise = store.loadSettings() diff --git a/tsconfig.node.json b/tsconfig.node.json index e6a7f5ceb4..e3e6732d4e 100644 --- a/tsconfig.node.json +++ b/tsconfig.node.json @@ -3,6 +3,7 @@ "include": [ "electron.vite.config.*", "src/cli/**/*", + "src/harness/**/*", "src/main/**/*", "src/preload/**/*", "src/shared/**/*"